diff --git a/im_test/README.md b/im_test/README.md new file mode 100644 index 00000000000..7b87eb1b0bb --- /dev/null +++ b/im_test/README.md @@ -0,0 +1,18 @@ +# Prebid User ID Module (IM-UID System) の動作確認サーバー + +## セットアップ + +プロジェクトルートで以下を実行 + +```sh +npm install +npm run serve --nolint # このディレクトリのファイルでLintエラーになるため +``` + +## 起動 + +上記 `セットアップ` にて `build/dev/prebid.js` を開発ビルド後、プロジェクトルートで以下を実行 + +```sh +node im_test/server.js +``` diff --git a/im_test/public/frame.html b/im_test/public/frame.html new file mode 100644 index 00000000000..44120211d4f --- /dev/null +++ b/im_test/public/frame.html @@ -0,0 +1,12 @@ + + + + + + Document + + +

Frame Page

+ + + diff --git a/im_test/public/index.html b/im_test/public/index.html new file mode 100644 index 00000000000..3c13a4f3f80 --- /dev/null +++ b/im_test/public/index.html @@ -0,0 +1,12 @@ + + + + + + Test Top Page + + + + + + diff --git a/im_test/public/prebid.js b/im_test/public/prebid.js new file mode 100644 index 00000000000..bbcb0efb12a --- /dev/null +++ b/im_test/public/prebid.js @@ -0,0 +1,217679 @@ +/* prebid.js v9.45.0-pre +Updated: 2025-06-05 +Modules: All available modules for this version. */ + +if (!window.pbjs || !window.pbjs.libLoaded) { + (function(){ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/dlv/index.js": +/*!***********************************!*\ + !*** ./node_modules/dlv/index.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ dlv) +/* harmony export */ }); +function dlv(obj, key, def, p, undef) { + key = key.split ? key.split('.') : key; + for (p = 0; p < key.length; p++) { + obj = obj ? obj[key[p]] : undef; + } + return obj === undef ? def : obj; +} + + +/***/ }), + +/***/ "./node_modules/fun-hooks/no-eval/index.js": +/*!*************************************************!*\ + !*** ./node_modules/fun-hooks/no-eval/index.js ***! + \*************************************************/ +/***/ ((module) => { + +/* +* @license MIT +* Fun Hooks v0.9.10 +* (c) @snapwich +*/ +create.SYNC = 1; +create.ASYNC = 2; +create.QUEUE = 4; + +var packageName = "fun-hooks"; + +function hasProxy() { + return !!(typeof Proxy === "function" && Proxy.revocable); +} + +var defaults = Object.freeze({ + useProxy: true, + ready: 0 +}); + +var hookableMap = new WeakMap(); + +// detect incorrectly implemented reduce and if found use polyfill +// https://github.com/prebid/Prebid.js/issues/3576 +// polyfill from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce +var reduce = + [1] + .reduce(function(a, b, c) { + return [a, b, c]; + }, 2) + .toString() === "2,1,0" + ? Array.prototype.reduce + : function(callback, initial) { + var o = Object(this); + var len = o.length >>> 0; + var k = 0; + var value; + if (initial) { + value = initial; + } else { + while (k < len && !(k in o)) { + k++; + } + value = o[k++]; + } + while (k < len) { + if (k in o) { + value = callback(value, o[k], k, o); + } + k++; + } + return value; + }; + +function rest(args, skip) { + return Array.prototype.slice.call(args, skip); +} + +var assign = + Object.assign || + function assign(target) { + return reduce.call( + rest(arguments, 1), + function(target, obj) { + if (obj) { + Object.keys(obj).forEach(function(prop) { + target[prop] = obj[prop]; + }); + } + return target; + }, + target + ); + }; + +function runAll(queue) { + var queued; + // eslint-disable-next-line no-cond-assign + while ((queued = queue.shift())) { + queued(); + } +} + +function create(config) { + var hooks = {}; + var postReady = []; + + config = assign({}, defaults, config); + + function dispatch(arg1, arg2) { + if (typeof arg1 === "function") { + return hookFn.call(null, "sync", arg1, arg2); + } else if (typeof arg1 === "string" && typeof arg2 === "function") { + return hookFn.apply(null, arguments); + } else if (typeof arg1 === "object") { + return hookObj.apply(null, arguments); + } + } + + var ready; + if (config.ready) { + dispatch.ready = function() { + ready = true; + runAll(postReady); + }; + } else { + ready = true; + } + + function hookObj(obj, props, objName) { + var walk = true; + if (typeof props === "undefined") { + props = Object.getOwnPropertyNames(obj); + walk = false; + } + var objHooks = {}; + var doNotHook = ["constructor"]; + do { + props = props.filter(function(prop) { + return ( + typeof obj[prop] === "function" && + !(doNotHook.indexOf(prop) !== -1) && + !prop.match(/^_/) + ); + }); + props.forEach(function(prop) { + var parts = prop.split(":"); + var name = parts[0]; + var type = parts[1] || "sync"; + if (!objHooks[name]) { + var fn = obj[name]; + objHooks[name] = obj[name] = hookFn( + type, + fn, + objName ? [objName, name] : undefined + ); + } + }); + obj = Object.getPrototypeOf(obj); + } while (walk && obj); + return objHooks; + } + + /** + * Navigates a string path to return a hookable function. If not found, creates a placeholder for hooks. + * @param {(Array | string)} path + */ + function get(path) { + var parts = Array.isArray(path) ? path : path.split("."); + return reduce.call( + parts, + function(memo, part, i) { + var item = memo[part]; + var installed = false; + if (item) { + return item; + } else if (i === parts.length - 1) { + if (!ready) { + postReady.push(function() { + if (!installed) { + // eslint-disable-next-line no-console + console.warn( + packageName + + ": referenced '" + + path + + "' but it was never created" + ); + } + }); + } + return (memo[part] = newHookable(function(fn) { + memo[part] = fn; + installed = true; + })); + } + return (memo[part] = {}); + }, + hooks + ); + } + + function newHookable(onInstall) { + var before = []; + var after = []; + var generateTrap = function() {}; + + var api = { + before: function(hook, priority) { + return add.call(this, before, "before", hook, priority); + }, + after: function(hook, priority) { + return add.call(this, after, "after", hook, priority); + }, + getHooks: function(match) { + var hooks = before.concat(after); + if (typeof match === "object") { + hooks = hooks.filter(function(entry) { + return Object.keys(match).every(function(prop) { + return entry[prop] === match[prop]; + }); + }); + } + try { + assign(hooks, { + remove: function() { + hooks.forEach(function(entry) { + entry.remove(); + }); + return this; + } + }); + } catch (e) { + console.error( + "error adding `remove` to array, did you modify Array.prototype?" + ); + } + return hooks; + }, + removeAll: function() { + return this.getHooks().remove(); + } + }; + + var meta = { + install: function(type, fn, generate) { + this.type = type; + generateTrap = generate; + generate(before, after); + onInstall && onInstall(fn); + } + }; + + // store meta data related to hookable. use `api.after` since `api` reference is not available on our proxy. + hookableMap.set(api.after, meta); + + return api; + + function add(store, type, hook, priority) { + var entry = { + hook: hook, + type: type, + priority: priority || 10, + remove: function() { + var index = store.indexOf(entry); + if (index !== -1) { + store.splice(index, 1); + generateTrap(before, after); + } + } + }; + store.push(entry); + store.sort(function(a, b) { + return b.priority - a.priority; + }); + generateTrap(before, after); + return this; + } + } + + function hookFn(type, fn, name) { + // check if function has already been wrapped + var meta = fn.after && hookableMap.get(fn.after); + if (meta) { + if (meta.type !== type) { + throw packageName + ": recreated hookable with different type"; + } else { + return fn; + } + } + + var hookable = name ? get(name) : newHookable(); + + var trap; + var hookedFn; + var handlers = { + get: function(target, prop) { + return hookable[prop] || Reflect.get.apply(Reflect, arguments); + } + }; + + if (!ready) { + postReady.push(setTrap); + } + + if (config.useProxy && hasProxy()) { + hookedFn = new Proxy(fn, handlers); + } else { + hookedFn = function() { + return handlers.apply + ? handlers.apply(fn, this, rest(arguments)) + : fn.apply(this, arguments); + }; + assign(hookedFn, hookable); + } + + hookableMap.get(hookedFn.after).install(type, hookedFn, generateTrap); + + return hookedFn; + + // eslint-disable-next-line no-redeclare + function generateTrap(before, after) { + var order = []; + var targetIndex; + if (before.length || after.length) { + before.forEach(addToOrder); + // placeholder for target function wrapper + targetIndex = order.push(undefined) - 1; + after.forEach(addToOrder); + trap = function(target, thisArg, args) { + var curr = 0; + var result; + var callback = + type === "async" && + typeof args[args.length - 1] === "function" && + args.pop(); + function bail(value) { + if (type === "sync") { + result = value; + } else if (callback) { + callback.apply(null, arguments); + } + } + function next(value) { + if (order[curr]) { + var args = rest(arguments); + next.bail = bail; + args.unshift(next); + return order[curr++].apply(thisArg, args); + } + if (type === "sync") { + result = value; + } else if (callback) { + callback.apply(null, arguments); + } + } + order[targetIndex] = function() { + var args = rest(arguments, 1); + if (type === "async" && callback) { + delete next.bail; + args.push(next); + } + var result = target.apply(thisArg, args); + if (type === "sync") { + next(result); + } + }; + next.apply(null, args); + return result; + }; + } else { + trap = undefined; + } + setTrap(); + + function addToOrder(entry) { + order.push(entry.hook); + } + } + + function setTrap() { + if ( + ready || + (type === "sync" && !(config.ready & create.SYNC)) || + (type === "async" && !(config.ready & create.ASYNC)) + ) { + handlers.apply = trap; + } else if (type === "sync" || !(config.ready & create.QUEUE)) { + handlers.apply = function() { + throw packageName + ": hooked function not ready"; + }; + } else { + handlers.apply = function() { + var args = arguments; + postReady.push(function() { + hookedFn.apply(args[1], args[2]); + }); + }; + } + } + } + + dispatch.get = get; + return dispatch; +} + +/* global module */ +module.exports = create; + + +/***/ }), + +/***/ "./node_modules/dset/dist/index.mjs": +/*!******************************************!*\ + !*** ./node_modules/dset/dist/index.mjs ***! + \******************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ dset: () => (/* binding */ dset) +/* harmony export */ }); +function dset(obj, keys, val) { + keys.split && (keys=keys.split('.')); + var i=0, l=keys.length, t=obj, x, k; + while (i < l) { + k = ''+keys[i++]; + if (k === '__proto__' || k === 'constructor' || k === 'prototype') break; + t = t[k] = (i === l) ? val : (typeof(x=t[k])===typeof(keys)) ? x : (keys[i]*0 !== 0 || !!~(''+keys[i]).indexOf('.')) ? {} : []; + } +} + + +/***/ }), + +/***/ "./node_modules/klona/json/index.mjs": +/*!*******************************************!*\ + !*** ./node_modules/klona/json/index.mjs ***! + \*******************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ klona: () => (/* binding */ klona) +/* harmony export */ }); +function klona(val) { + var k, out, tmp; + + if (Array.isArray(val)) { + out = Array(k=val.length); + while (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp; + return out; + } + + if (Object.prototype.toString.call(val) === '[object Object]') { + out = {}; // null + for (k in val) { + if (k === '__proto__') { + Object.defineProperty(out, k, { + value: klona(val[k]), + configurable: true, + enumerable: true, + writable: true, + }); + } else { + out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp; + } + } + return out; + } + + return val; +} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var chunkIds = deferred[i][0]; +/******/ var fn = deferred[i][1]; +/******/ var priority = deferred[i][2]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "prebid-core": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ var runtime = data[2]; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["pbjsChunk"] = self["pbjsChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_require__("./src/prebid.js"))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["chunk-core"],{ + +/***/ "./src/Renderer.js": +/*!*************************!*\ + !*** ./src/Renderer.js ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Renderer: () => (/* binding */ Renderer), +/* harmony export */ executeRenderer: () => (/* binding */ executeRenderer), +/* harmony export */ isRendererRequired: () => (/* binding */ isRendererRequired) +/* harmony export */ }); +/* harmony import */ var _adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./adloader.js */ "./src/adloader.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./activities/modules.js */ "./src/activities/modules.js"); + + + + + +const pbjsInstance = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(); +const moduleCode = 'outstream'; + +/** + * @typedef {object} Renderer + * + * A Renderer stores some functions which are used to render a particular Bid. + * These are used in Outstream Video Bids, returned on the Bid by the adapter, and will + * be used to render that bid unless the Publisher overrides them. + */ + +function Renderer(options) { + const { + url, + config, + id, + callback, + loaded, + adUnitCode, + renderNow + } = options; + this.url = url; + this.config = config; + this.handlers = {}; + this.id = id; + this.renderNow = renderNow; + this.adUnitCode = adUnitCode; + + // a renderer may push to the command queue to delay rendering until the + // render function is loaded by loadExternalScript, at which point the the command + // queue will be processed + this.loaded = loaded; + this.cmd = []; + this.push = func => { + if (typeof func !== 'function') { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Commands given to Renderer.push must be wrapped in a function'); + return; + } + this.loaded ? func.call() : this.cmd.push(func); + }; + + // bidders may override this with the `callback` property given to `install` + this.callback = callback || (() => { + this.loaded = true; + this.process(); + }); + + // use a function, not an arrow, in order to be able to pass "arguments" through + this.render = function () { + const renderArgs = arguments; + const runRender = () => { + if (this._render) { + this._render.apply(this, renderArgs); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`No render function was provided, please use .setRender on the renderer`); + } + }; + if (isRendererPreferredFromAdUnit(adUnitCode)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`External Js not loaded by Renderer since renderer url and callback is already defined on adUnit ${adUnitCode}`); + runRender(); + } else if (renderNow) { + runRender(); + } else { + // we expect to load a renderer url once only so cache the request to load script + this.cmd.unshift(runRender); // should render run first ? + (0,_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(url, _activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_PREBID, moduleCode, this.callback, this.documentContext); + } + }.bind(this); // bind the function to this object to avoid 'this' errors +} +Renderer.install = function (_ref) { + let { + url, + config, + id, + callback, + loaded, + adUnitCode, + renderNow + } = _ref; + return new Renderer({ + url, + config, + id, + callback, + loaded, + adUnitCode, + renderNow + }); +}; +Renderer.prototype.getConfig = function () { + return this.config; +}; +Renderer.prototype.setRender = function (fn) { + this._render = fn; +}; +Renderer.prototype.setEventHandlers = function (handlers) { + this.handlers = handlers; +}; +Renderer.prototype.handleVideoEvent = function (_ref2) { + let { + id, + eventName + } = _ref2; + if (typeof this.handlers[eventName] === 'function') { + this.handlers[eventName](); + } + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(`Prebid Renderer event for id ${id} type ${eventName}`); +}; + +/* + * Calls functions that were pushed to the command queue before the + * renderer was loaded by `loadExternalScript` + */ +Renderer.prototype.process = function () { + while (this.cmd.length > 0) { + try { + this.cmd.shift().call(); + } catch (error) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Error processing Renderer command on ad unit '${this.adUnitCode}':`, error); + } + } +}; + +/** + * Checks whether creative rendering should be done by Renderer or not. + * @param {Object} renderer Renderer object installed by adapter + * @returns {Boolean} + */ +function isRendererRequired(renderer) { + return !!(renderer && (renderer.url || renderer.renderNow)); +} + +/** + * Render the bid returned by the adapter + * @param {Object} renderer Renderer object installed by adapter + * @param {Object} bid Bid response + * @param {Document} doc context document of bid + */ +function executeRenderer(renderer, bid, doc) { + let docContext = null; + if (renderer.config && renderer.config.documentResolver) { + docContext = renderer.config.documentResolver(bid, document, doc); // a user provided callback, which should return a Document, and expect the parameters; bid, sourceDocument, renderDocument + } + if (!docContext) { + docContext = document; + } + renderer.documentContext = docContext; + renderer.render(bid, renderer.documentContext); +} +function isRendererPreferredFromAdUnit(adUnitCode) { + const adUnits = pbjsInstance.adUnits; + const adUnit = (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(adUnits, adUnit => { + return adUnit.code === adUnitCode; + }); + if (!adUnit) { + return false; + } + + // renderer defined at adUnit level + const adUnitRenderer = adUnit?.renderer; + const hasValidAdUnitRenderer = !!(adUnitRenderer && adUnitRenderer.url && adUnitRenderer.render); + + // renderer defined at adUnit.mediaTypes level + const mediaTypeRenderer = adUnit?.mediaTypes?.video?.renderer; + const hasValidMediaTypeRenderer = !!(mediaTypeRenderer && mediaTypeRenderer.url && mediaTypeRenderer.render); + return !!(hasValidAdUnitRenderer && !(adUnitRenderer.backupOnly === true) || hasValidMediaTypeRenderer && !(mediaTypeRenderer.backupOnly === true)); +} + +/***/ }), + +/***/ "./src/activities/activities.js": +/*!**************************************!*\ + !*** ./src/activities/activities.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ACTIVITY_ACCESS_DEVICE: () => (/* binding */ ACTIVITY_ACCESS_DEVICE), +/* harmony export */ ACTIVITY_ENRICH_EIDS: () => (/* binding */ ACTIVITY_ENRICH_EIDS), +/* harmony export */ ACTIVITY_ENRICH_UFPD: () => (/* binding */ ACTIVITY_ENRICH_UFPD), +/* harmony export */ ACTIVITY_FETCH_BIDS: () => (/* binding */ ACTIVITY_FETCH_BIDS), +/* harmony export */ ACTIVITY_REPORT_ANALYTICS: () => (/* binding */ ACTIVITY_REPORT_ANALYTICS), +/* harmony export */ ACTIVITY_SYNC_USER: () => (/* binding */ ACTIVITY_SYNC_USER), +/* harmony export */ ACTIVITY_TRANSMIT_EIDS: () => (/* binding */ ACTIVITY_TRANSMIT_EIDS), +/* harmony export */ ACTIVITY_TRANSMIT_PRECISE_GEO: () => (/* binding */ ACTIVITY_TRANSMIT_PRECISE_GEO), +/* harmony export */ ACTIVITY_TRANSMIT_TID: () => (/* binding */ ACTIVITY_TRANSMIT_TID), +/* harmony export */ ACTIVITY_TRANSMIT_UFPD: () => (/* binding */ ACTIVITY_TRANSMIT_UFPD), +/* harmony export */ LOAD_EXTERNAL_SCRIPT: () => (/* binding */ LOAD_EXTERNAL_SCRIPT) +/* harmony export */ }); +/** + * Activity (that are relevant for privacy) definitions + * + * ref. https://docs.google.com/document/d/1dRxFUFmhh2jGanzGZvfkK_6jtHPpHXWD7Qsi6KEugeE + * & https://github.com/prebid/Prebid.js/issues/9546 + */ + +/** + * accessDevice: some component wants to read or write to localStorage or cookies. + */ +const ACTIVITY_ACCESS_DEVICE = 'accessDevice'; +/** + * syncUser: A bid adapter wants to run a user sync. + */ +const ACTIVITY_SYNC_USER = 'syncUser'; +/** + * enrichUfpd: some component wants to add user first-party data to bid requests. + */ +const ACTIVITY_ENRICH_UFPD = 'enrichUfpd'; +/** + * enrichEids: some component wants to add user IDs to bid requests. + */ +const ACTIVITY_ENRICH_EIDS = 'enrichEids'; +/** + * fetchBid: a bidder wants to bid. + */ +const ACTIVITY_FETCH_BIDS = 'fetchBids'; + +/** + * reportAnalytics: some component wants to phone home with analytics data. + */ +const ACTIVITY_REPORT_ANALYTICS = 'reportAnalytics'; + +/** + * some component wants access to (and send along) user IDs + */ +const ACTIVITY_TRANSMIT_EIDS = 'transmitEids'; + +/** + * transmitUfpd: some component wants access to (and send along) user FPD + */ +const ACTIVITY_TRANSMIT_UFPD = 'transmitUfpd'; + +/** + * transmitPreciseGeo: some component wants access to (and send along) geolocation info + */ +const ACTIVITY_TRANSMIT_PRECISE_GEO = 'transmitPreciseGeo'; + +/** + * transmit TID: some component wants access ot (and send along) transaction IDs + */ +const ACTIVITY_TRANSMIT_TID = 'transmitTid'; + +/** + * loadExternalScript: adLoader.js is allowed to load external script + */ +const LOAD_EXTERNAL_SCRIPT = 'loadExternalScript'; + +/***/ }), + +/***/ "./src/activities/activityParams.js": +/*!******************************************!*\ + !*** ./src/activities/activityParams.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ activityParams: () => (/* binding */ activityParams) +/* harmony export */ }); +/* harmony import */ var _adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _params_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./params.js */ "./src/activities/params.js"); + + + +/** + * Utility function for building common activity parameters - broken out to its own + * file to avoid circular imports. + */ +const activityParams = (0,_params_js__WEBPACK_IMPORTED_MODULE_0__.activityParamsBuilder)(alias => _adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].resolveAlias(alias)); + +/***/ }), + +/***/ "./src/activities/modules.js": +/*!***********************************!*\ + !*** ./src/activities/modules.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ MODULE_TYPE_ANALYTICS: () => (/* binding */ MODULE_TYPE_ANALYTICS), +/* harmony export */ MODULE_TYPE_BIDDER: () => (/* binding */ MODULE_TYPE_BIDDER), +/* harmony export */ MODULE_TYPE_PREBID: () => (/* binding */ MODULE_TYPE_PREBID), +/* harmony export */ MODULE_TYPE_RTD: () => (/* binding */ MODULE_TYPE_RTD), +/* harmony export */ MODULE_TYPE_UID: () => (/* binding */ MODULE_TYPE_UID) +/* harmony export */ }); +const MODULE_TYPE_PREBID = 'prebid'; +const MODULE_TYPE_BIDDER = 'bidder'; +const MODULE_TYPE_UID = 'userId'; +const MODULE_TYPE_RTD = 'rtd'; +const MODULE_TYPE_ANALYTICS = 'analytics'; + +/***/ }), + +/***/ "./src/activities/params.js": +/*!**********************************!*\ + !*** ./src/activities/params.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ACTIVITY_PARAM_ADAPTER_CODE: () => (/* binding */ ACTIVITY_PARAM_ADAPTER_CODE), +/* harmony export */ ACTIVITY_PARAM_ANL_CONFIG: () => (/* binding */ ACTIVITY_PARAM_ANL_CONFIG), +/* harmony export */ ACTIVITY_PARAM_COMPONENT: () => (/* binding */ ACTIVITY_PARAM_COMPONENT), +/* harmony export */ ACTIVITY_PARAM_COMPONENT_NAME: () => (/* binding */ ACTIVITY_PARAM_COMPONENT_NAME), +/* harmony export */ ACTIVITY_PARAM_COMPONENT_TYPE: () => (/* binding */ ACTIVITY_PARAM_COMPONENT_TYPE), +/* harmony export */ ACTIVITY_PARAM_S2S_NAME: () => (/* binding */ ACTIVITY_PARAM_S2S_NAME), +/* harmony export */ ACTIVITY_PARAM_STORAGE_TYPE: () => (/* binding */ ACTIVITY_PARAM_STORAGE_TYPE), +/* harmony export */ ACTIVITY_PARAM_SYNC_TYPE: () => (/* binding */ ACTIVITY_PARAM_SYNC_TYPE), +/* harmony export */ ACTIVITY_PARAM_SYNC_URL: () => (/* binding */ ACTIVITY_PARAM_SYNC_URL), +/* harmony export */ activityParamsBuilder: () => (/* binding */ activityParamsBuilder), +/* harmony export */ buildActivityParams: () => (/* binding */ buildActivityParams) +/* harmony export */ }); +/* harmony import */ var _modules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../hook.js */ "./src/hook.js"); + + + +/** + * Component ID - who is trying to perform the activity? + * Relevant for all activities. + */ +const ACTIVITY_PARAM_COMPONENT = 'component'; +const ACTIVITY_PARAM_COMPONENT_TYPE = ACTIVITY_PARAM_COMPONENT + 'Type'; +const ACTIVITY_PARAM_COMPONENT_NAME = ACTIVITY_PARAM_COMPONENT + 'Name'; + +/** + * Code of the bid adapter that `componentName` is an alias of. + * May be the same as the component name. + * + * relevant for all activities, but only when componentType is 'bidder'. + */ +const ACTIVITY_PARAM_ADAPTER_CODE = 'adapterCode'; + +/** + * Storage type - either 'html5' or 'cookie'. + * Relevant for: accessDevice + */ +const ACTIVITY_PARAM_STORAGE_TYPE = 'storageType'; + +/** + * s2sConfig[].configName, used to identify a particular s2s instance + * relevant for: fetchBids, but only when component is 'prebid.pbsBidAdapter' + */ +const ACTIVITY_PARAM_S2S_NAME = 'configName'; +/** + * user sync type - 'iframe' or 'pixel' + * relevant for: syncUser + */ +const ACTIVITY_PARAM_SYNC_TYPE = 'syncType'; +/** + * user sync URL + * relevant for: syncUser + */ +const ACTIVITY_PARAM_SYNC_URL = 'syncUrl'; +/** + * Configuration options for analytics adapter - the argument passed to `enableAnalytics`. + * Relevant for: reportAnalytics + * @private + * @constant + * @type {string} + */ +const ACTIVITY_PARAM_ANL_CONFIG = '_config'; +function activityParamsBuilder(resolveAlias) { + return function activityParams(moduleType, moduleName, params) { + const defaults = { + [ACTIVITY_PARAM_COMPONENT_TYPE]: moduleType, + [ACTIVITY_PARAM_COMPONENT_NAME]: moduleName, + [ACTIVITY_PARAM_COMPONENT]: `${moduleType}.${moduleName}` + }; + if (moduleType === _modules_js__WEBPACK_IMPORTED_MODULE_0__.MODULE_TYPE_BIDDER) { + defaults[ACTIVITY_PARAM_ADAPTER_CODE] = resolveAlias(moduleName); + } + return buildActivityParams(Object.assign(defaults, params)); + }; +} +const buildActivityParams = (0,_hook_js__WEBPACK_IMPORTED_MODULE_1__.hook)('sync', params => params); + +/***/ }), + +/***/ "./src/activities/redactor.js": +/*!************************************!*\ + !*** ./src/activities/redactor.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ORTB_EIDS_PATHS: () => (/* binding */ ORTB_EIDS_PATHS), +/* harmony export */ ORTB_UFPD_PATHS: () => (/* binding */ ORTB_UFPD_PATHS), +/* harmony export */ appliesWhenActivityDenied: () => (/* binding */ appliesWhenActivityDenied), +/* harmony export */ isData: () => (/* binding */ isData), +/* harmony export */ objectTransformer: () => (/* binding */ objectTransformer), +/* harmony export */ ortb2TransmitRules: () => (/* binding */ ortb2TransmitRules), +/* harmony export */ redactor: () => (/* binding */ redactor), +/* harmony export */ sessionedApplies: () => (/* binding */ sessionedApplies) +/* harmony export */ }); +/* unused harmony exports ORTB_GEO_PATHS, ORTB_IPV4_PATHS, ORTB_IPV6_PATHS, redactRule, redactorFactory */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); +/* harmony import */ var _rules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _activities_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _utils_ipUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/ipUtils.js */ "./src/utils/ipUtils.js"); + + + + + +const ORTB_UFPD_PATHS = ['data', 'ext.data', 'yob', 'gender', 'keywords', 'kwarray', 'id', 'buyeruid', 'customdata'].map(f => `user.${f}`).concat('device.ext.cdep'); +const ORTB_EIDS_PATHS = ['user.eids', 'user.ext.eids']; +const ORTB_GEO_PATHS = ['user.geo.lat', 'user.geo.lon', 'device.geo.lat', 'device.geo.lon']; +const ORTB_IPV4_PATHS = ['device.ip']; +const ORTB_IPV6_PATHS = ['device.ipv6']; + +/** + * @typedef TransformationRuleDef + * @property {name} + * @property {Array[string]} paths dot-separated list of paths that this rule applies to. + * @property {function(*): boolean} applies a predicate that should return true if this rule applies + * (and the transformation defined herein should be applied). The arguments are those passed to the transformation function. + * @property {name} a name for the rule; used to debounce calls to `applies` (and avoid excessive logging): + * if a rule with the same name was already found to apply (or not), this one will (or won't) as well. + */ + +/** + * @typedef RedactRuleDef A rule that removes, or replaces, values from an object (modifications are done in-place). + * @augments TransformationRuleDef + * @property {function(*): *} get? substitution functions for values that should be redacted; + * takes in the original (unredacted) value as an input, and returns a substitute to use in the redacted + * version. If it returns undefined, or this option is omitted, protected paths will be removed + * from the redacted object. + */ + +/** + * @param {RedactRuleDef} ruleDef + * @return {TransformationRule} + */ +function redactRule(ruleDef) { + return Object.assign({ + get() {}, + run(root, path, object, property, applies) { + const val = object && object[property]; + if (isData(val) && applies()) { + const repl = this.get(val); + if (repl === undefined) { + delete object[property]; + } else { + object[property] = repl; + } + } + } + }, ruleDef); +} + +/** + * @typedef TransformationRule + * @augments TransformationRuleDef + * @property {function} run rule logic - see `redactRule` for an example. + */ + +/** + * @typedef {Function} TransformationFunction + * @param object object to transform + * @param ...args arguments to pass down to rule's `apply` methods. + */ + +/** + * Return a transformation function that will apply the given rules to an object. + * + * @param {Array[TransformationRule]} rules + * @return {TransformationFunction} + */ +function objectTransformer(rules) { + rules.forEach(rule => { + rule.paths = rule.paths.map(path => { + const parts = path.split('.'); + const tail = parts.pop(); + return [parts.length > 0 ? parts.join('.') : null, tail]; + }); + }); + return function applyTransform(session, obj) { + const result = []; + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + const applies = sessionedApplies(session, ...args); + rules.forEach(rule => { + if (session[rule.name] === false) return; + for (const [head, tail] of rule.paths) { + const parent = head == null ? obj : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(obj, head); + result.push(rule.run(obj, head, parent, tail, applies.bind(null, rule))); + if (session[rule.name] === false) return; + } + }); + return result.filter(el => el != null); + }; +} +function sessionedApplies(session) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + return function applies(rule) { + if (!session.hasOwnProperty(rule.name)) { + session[rule.name] = !!rule.applies(...args); + } + return session[rule.name]; + }; +} +function isData(val) { + return val != null && (typeof val !== 'object' || Object.keys(val).length > 0); +} +function appliesWhenActivityDenied(activity) { + let isAllowed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _rules_js__WEBPACK_IMPORTED_MODULE_1__.isActivityAllowed; + return function applies(params) { + return !isAllowed(activity, params); + }; +} +function bidRequestTransmitRules() { + let isAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _rules_js__WEBPACK_IMPORTED_MODULE_1__.isActivityAllowed; + return [{ + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_EIDS, + paths: ['userId', 'userIdAsEids'], + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_EIDS, isAllowed) + }, { + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_TID, + paths: ['ortb2Imp.ext.tid'], + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_TID, isAllowed) + }].map(redactRule); +} +function ortb2TransmitRules() { + let isAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _rules_js__WEBPACK_IMPORTED_MODULE_1__.isActivityAllowed; + return [{ + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_UFPD, + paths: ORTB_UFPD_PATHS, + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_UFPD, isAllowed) + }, { + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_EIDS, + paths: ORTB_EIDS_PATHS, + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_EIDS, isAllowed) + }, { + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, + paths: ORTB_GEO_PATHS, + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, isAllowed), + get(val) { + return Math.round((val + Number.EPSILON) * 100) / 100; + } + }, { + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, + paths: ORTB_IPV4_PATHS, + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, isAllowed), + get(val) { + return (0,_utils_ipUtils_js__WEBPACK_IMPORTED_MODULE_3__.scrubIPv4)(val); + } + }, { + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, + paths: ORTB_IPV6_PATHS, + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, isAllowed), + get(val) { + return (0,_utils_ipUtils_js__WEBPACK_IMPORTED_MODULE_3__.scrubIPv6)(val); + } + }, { + name: _activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_TID, + paths: ['source.tid'], + applies: appliesWhenActivityDenied(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_TID, isAllowed) + }].map(redactRule); +} +function redactorFactory() { + let isAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _rules_js__WEBPACK_IMPORTED_MODULE_1__.isActivityAllowed; + const redactOrtb2 = objectTransformer(ortb2TransmitRules(isAllowed)); + const redactBidRequest = objectTransformer(bidRequestTransmitRules(isAllowed)); + return function redactor(params) { + const session = {}; + return { + ortb2(obj) { + redactOrtb2(session, obj, params); + return obj; + }, + bidRequest(obj) { + redactBidRequest(session, obj, params); + return obj; + } + }; + }; +} + +/** + * Returns an object that can redact other privacy-sensitive objects according + * to activity rules. + * + * @param {{}} params activity parameters to use for activity checks + * @return {{ortb2: function({}): {}, bidRequest: function({}): {}}} methods + * that can redact disallowed data from ORTB2 and/or bid request objects. + */ +const redactor = redactorFactory(); + +// by default, TIDs are off since version 8 +(0,_rules_js__WEBPACK_IMPORTED_MODULE_1__.registerActivityControl)(_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_TID, 'enableTIDs config', () => { + if (!_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('enableTIDs')) { + return { + allow: false, + reason: 'TIDs are disabled' + }; + } +}); + +/***/ }), + +/***/ "./src/activities/rules.js": +/*!*********************************!*\ + !*** ./src/activities/rules.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ isActivityAllowed: () => (/* binding */ isActivityAllowed), +/* harmony export */ registerActivityControl: () => (/* binding */ registerActivityControl) +/* harmony export */ }); +/* unused harmony export ruleRegistry */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); +/* harmony import */ var _params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./params.js */ "./src/activities/params.js"); + + +function ruleRegistry() { + let logger = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)('Activity control:'); + const registry = {}; + function getRules(activity) { + return registry[activity] = registry[activity] || []; + } + function runRule(activity, name, rule, params) { + let res; + try { + res = rule(params); + } catch (e) { + logger.logError(`Exception in rule ${name} for '${activity}'`, e); + res = { + allow: false, + reason: e + }; + } + return res && Object.assign({ + activity, + name, + component: params[_params_js__WEBPACK_IMPORTED_MODULE_1__.ACTIVITY_PARAM_COMPONENT] + }, res); + } + const dupes = {}; + const DEDUPE_INTERVAL = 1000; + function logResult(_ref) { + let { + activity, + name, + allow, + reason, + component + } = _ref; + const msg = `${name} ${allow ? 'allowed' : 'denied'} '${activity}' for '${component}'${reason ? ':' : ''}`; + const deduping = dupes.hasOwnProperty(msg); + if (deduping) { + clearTimeout(dupes[msg]); + } + dupes[msg] = setTimeout(() => delete dupes[msg], DEDUPE_INTERVAL); + if (!deduping) { + const parts = [msg]; + reason && parts.push(reason); + (allow ? logger.logInfo : logger.logWarn).apply(logger, parts); + } + } + return [ + /** + * Register an activity control rule. + * + * @param {string} activity - Activity name, as defined in `activities.js`. + * @param {string} ruleName - A name for this rule, used for logging. + * @param {function(Object): {allow: boolean, reason?: string}} rule - Rule definition function. Takes in activity + * parameters as a single map; MAY return an object {allow, reason}, where allow is true/false, + * and reason is an optional message used for logging. + * + * {allow: true} will allow this activity AS LONG AS no other rules with the same or higher priority return {allow: false}; + * {allow: false} will deny this activity AS LONG AS no other rules with higher priority return {allow: true}; + * Returning null/undefined has no effect - the decision is left to other rules. + * If no rule returns an allow value, the default is to allow the activity. + * + * @param {number} [priority=10] - Rule priority; lower number means higher priority. + * @returns {function(): void} - A function that unregisters the rule when called. + */ + function registerActivityControl(activity, ruleName, rule) { + let priority = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10; + const rules = getRules(activity); + const pos = rules.findIndex(_ref2 => { + let [itemPriority] = _ref2; + return priority < itemPriority; + }); + const entry = [priority, ruleName, rule]; + rules.splice(pos < 0 ? rules.length : pos, 0, entry); + return function () { + const idx = rules.indexOf(entry); + if (idx >= 0) rules.splice(idx, 1); + }; + }, + /** + * Test whether an activity is allowed. + * + * @param {string} activity activity name + * @param {{}} params activity parameters; should be generated through the `activityParams` utility. + * @return {boolean} true for allow, false for deny. + */ + function isActivityAllowed(activity, params) { + let lastPriority, foundAllow; + for (const [priority, name, rule] of getRules(activity)) { + if (lastPriority !== priority && foundAllow) break; + lastPriority = priority; + const ruleResult = runRule(activity, name, rule, params); + if (ruleResult) { + if (!ruleResult.allow) { + logResult(ruleResult); + return false; + } else { + foundAllow = ruleResult; + } + } + } + foundAllow && logResult(foundAllow); + return true; + }]; +} +const [registerActivityControl, isActivityAllowed] = ruleRegistry(); + +/***/ }), + +/***/ "./src/adRendering.js": +/*!****************************!*\ + !*** ./src/adRendering.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ deferRendering: () => (/* binding */ deferRendering), +/* harmony export */ doRender: () => (/* binding */ doRender), +/* harmony export */ getBidToRender: () => (/* binding */ getBidToRender), +/* harmony export */ getRenderingData: () => (/* binding */ getRenderingData), +/* harmony export */ handleCreativeEvent: () => (/* binding */ handleCreativeEvent), +/* harmony export */ handleNativeMessage: () => (/* binding */ handleNativeMessage), +/* harmony export */ handleRender: () => (/* binding */ handleRender), +/* harmony export */ insertLocatorFrame: () => (/* binding */ insertLocatorFrame), +/* harmony export */ markBidAsRendered: () => (/* binding */ markBidAsRendered), +/* harmony export */ markWinner: () => (/* binding */ markWinner), +/* harmony export */ markWinningBid: () => (/* binding */ markWinningBid), +/* harmony export */ renderAdDirect: () => (/* binding */ renderAdDirect), +/* harmony export */ renderIfDeferred: () => (/* binding */ renderIfDeferred) +/* harmony export */ }); +/* unused harmony exports emitAdRenderFail, emitAdRenderSucceeded */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./events.js */ "./src/events.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _Renderer_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _creativeRenderers_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./creativeRenderers.js */ "./src/creativeRenderers.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./native.js */ "./src/native.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _targeting_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./targeting.js */ "./src/targeting.js"); +/* harmony import */ var _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventTrackers.js */ "./src/eventTrackers.js"); + + + + + + + + + + + + + + + +const { + AD_RENDER_FAILED, + AD_RENDER_SUCCEEDED, + STALE_RENDER, + BID_WON, + EXPIRED_RENDER +} = _constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const { + EXCEPTION +} = _constants_js__WEBPACK_IMPORTED_MODULE_0__.AD_RENDER_FAILED_REASON; +const getBidToRender = (0,_hook_js__WEBPACK_IMPORTED_MODULE_1__.hook)('sync', function (adId) { + let forRender = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _utils_promise_js__WEBPACK_IMPORTED_MODULE_2__.PbPromise.resolve(); + return override.then(bid => bid ?? _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__.auctionManager.findBidByAdId(adId)).catch(() => {}); +}); +const markWinningBid = (0,_hook_js__WEBPACK_IMPORTED_MODULE_1__.hook)('sync', function (bid) { + ((0,_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.parseEventTrackers)(bid.eventtrackers)[_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.EVENT_TYPE_WIN]?.[_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.TRACKER_METHOD_IMG] || []).forEach(url => (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(url)); + _events_js__WEBPACK_IMPORTED_MODULE_6__.emit(BID_WON, bid); + _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__.auctionManager.addWinningBid(bid); +}); + +/** + * Emit the AD_RENDER_FAILED event. + * + * @param {Object} data + * @param data.reason one of the values in AD_RENDER_FAILED_REASON + * @param data.message failure description + * @param [data.bid] bid response object that failed to render + * @param [data.id] adId that failed to render + */ +function emitAdRenderFail(_ref) { + let { + reason, + message, + bid, + id + } = _ref; + const data = { + reason, + message + }; + if (bid) { + data.bid = bid; + data.adId = bid.adId; + } + if (id) data.adId = id; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`Error rendering ad (id: ${id}): ${message}`); + _events_js__WEBPACK_IMPORTED_MODULE_6__.emit(AD_RENDER_FAILED, data); +} + +/** + * Emit the AD_RENDER_SUCCEEDED event. + * (Note: Invocation of this function indicates that the render function did not generate an error, it does not guarantee that tracking for this event has occurred yet.) + * @param {Object} data + * @param data.doc document object that was used to `.write` the ad. Should be `null` if unavailable (e.g. for documents in + * a cross-origin frame). + * @param [data.bid] bid response object for the ad that was rendered + * @param [data.id] adId that was rendered. + */ +function emitAdRenderSucceeded(_ref2) { + let { + doc, + bid, + id + } = _ref2; + const data = { + doc + }; + if (bid) data.bid = bid; + if (id) data.adId = id; + _adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].callAdRenderSucceededBidder(bid.adapterCode || bid.bidder, bid); + _events_js__WEBPACK_IMPORTED_MODULE_6__.emit(AD_RENDER_SUCCEEDED, data); +} +function handleCreativeEvent(data, bidResponse) { + switch (data.event) { + case _constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AD_RENDER_FAILED: + emitAdRenderFail({ + bid: bidResponse, + id: bidResponse.adId, + reason: data.info.reason, + message: data.info.message + }); + break; + case _constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AD_RENDER_SUCCEEDED: + emitAdRenderSucceeded({ + doc: null, + bid: bidResponse, + id: bidResponse.adId + }); + break; + default: + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`Received event request for unsupported event: '${data.event}' (adId: '${bidResponse.adId}')`); + } +} +function handleNativeMessage(data, bidResponse, _ref3) { + let { + resizeFn, + fireTrackers = _native_js__WEBPACK_IMPORTED_MODULE_8__.fireNativeTrackers + } = _ref3; + switch (data.action) { + case 'resizeNativeHeight': + resizeFn(data.width, data.height); + break; + default: + fireTrackers(data, bidResponse); + } +} +const HANDLERS = { + [_constants_js__WEBPACK_IMPORTED_MODULE_0__.MESSAGES.EVENT]: handleCreativeEvent +}; +if (true) { + HANDLERS[_constants_js__WEBPACK_IMPORTED_MODULE_0__.MESSAGES.NATIVE] = handleNativeMessage; +} +function creativeMessageHandler(deps) { + return function (type, data, bidResponse) { + if (HANDLERS.hasOwnProperty(type)) { + HANDLERS[type](data, bidResponse, deps); + } + }; +} +const getRenderingData = (0,_hook_js__WEBPACK_IMPORTED_MODULE_1__.hook)('sync', function (bidResponse, options) { + const { + ad, + adUrl, + cpm, + originalCpm, + width, + height, + instl + } = bidResponse; + const repl = { + AUCTION_PRICE: originalCpm || cpm, + CLICKTHROUGH: options?.clickUrl || '' + }; + return { + ad: (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.replaceMacros)(ad, repl), + adUrl: (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.replaceMacros)(adUrl, repl), + width, + height, + instl + }; +}); +const doRender = (0,_hook_js__WEBPACK_IMPORTED_MODULE_1__.hook)('sync', function (_ref4) { + let { + renderFn, + resizeFn, + bidResponse, + options, + doc, + isMainDocument = doc === document && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.inIframe)() + } = _ref4; + const videoBid = true && bidResponse.mediaType === _mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.VIDEO; + if (isMainDocument || videoBid) { + emitAdRenderFail({ + reason: _constants_js__WEBPACK_IMPORTED_MODULE_0__.AD_RENDER_FAILED_REASON.PREVENT_WRITING_ON_MAIN_DOCUMENT, + message: videoBid ? 'Cannot render video ad without a renderer' : `renderAd was prevented from writing to the main document.`, + bid: bidResponse, + id: bidResponse.adId + }); + return; + } + const data = getRenderingData(bidResponse, options); + renderFn(Object.assign({ + adId: bidResponse.adId + }, data)); + const { + width, + height + } = data; + if ((width ?? height) != null) { + resizeFn(width, height); + } +}); +doRender.before(function (next, args) { + // run renderers from a high priority hook to allow the video module to insert itself between this and "normal" rendering. + const { + bidResponse, + doc + } = args; + if ((0,_Renderer_js__WEBPACK_IMPORTED_MODULE_10__.isRendererRequired)(bidResponse.renderer)) { + (0,_Renderer_js__WEBPACK_IMPORTED_MODULE_10__.executeRenderer)(bidResponse.renderer, bidResponse, doc); + emitAdRenderSucceeded({ + doc, + bid: bidResponse, + id: bidResponse.adId + }); + next.bail(); + } else { + next(args); + } +}, 100); +function handleRender(_ref5) { + let { + renderFn, + resizeFn, + adId, + options, + bidResponse, + doc + } = _ref5; + deferRendering(bidResponse, () => { + if (bidResponse == null) { + emitAdRenderFail({ + reason: _constants_js__WEBPACK_IMPORTED_MODULE_0__.AD_RENDER_FAILED_REASON.CANNOT_FIND_AD, + message: `Cannot find ad '${adId}'`, + id: adId + }); + return; + } + if (bidResponse.status === _constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.RENDERED) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)(`Ad id ${adId} has been rendered before`); + _events_js__WEBPACK_IMPORTED_MODULE_6__.emit(STALE_RENDER, bidResponse); + if (_config_js__WEBPACK_IMPORTED_MODULE_11__.config.getConfig('auctionOptions')?.suppressStaleRender) { + return; + } + } + if (!_targeting_js__WEBPACK_IMPORTED_MODULE_12__.filters.isBidNotExpired(bidResponse)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)(`Ad id ${adId} has been expired`); + _events_js__WEBPACK_IMPORTED_MODULE_6__.emit(EXPIRED_RENDER, bidResponse); + if (_config_js__WEBPACK_IMPORTED_MODULE_11__.config.getConfig('auctionOptions')?.suppressExpiredRender) { + return; + } + } + try { + doRender({ + renderFn, + resizeFn, + bidResponse, + options, + doc + }); + } catch (e) { + emitAdRenderFail({ + reason: _constants_js__WEBPACK_IMPORTED_MODULE_0__.AD_RENDER_FAILED_REASON.EXCEPTION, + message: e.message, + id: adId, + bid: bidResponse + }); + } + }); +} +function markBidAsRendered(bidResponse) { + const metrics = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_13__.useMetrics)(bidResponse.metrics); + metrics.checkpoint('bidRender'); + metrics.timeBetween('bidWon', 'bidRender', 'render.deferred'); + metrics.timeBetween('auctionEnd', 'bidRender', 'render.pending'); + metrics.timeBetween('requestBids', 'bidRender', 'render.e2e'); + bidResponse.status = _constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.RENDERED; +} +const DEFERRED_RENDER = new WeakMap(); +const WINNERS = new WeakSet(); +function deferRendering(bidResponse, renderFn) { + if (bidResponse == null) { + // if the bid is missing, let renderFn deal with it now + renderFn(); + return; + } + DEFERRED_RENDER.set(bidResponse, renderFn); + if (!bidResponse.deferRendering) { + renderIfDeferred(bidResponse); + } + markWinner(bidResponse); +} +function markWinner(bidResponse) { + if (!WINNERS.has(bidResponse)) { + WINNERS.add(bidResponse); + markWinningBid(bidResponse); + } +} +function renderIfDeferred(bidResponse) { + const renderFn = DEFERRED_RENDER.get(bidResponse); + if (renderFn) { + renderFn(); + markBidAsRendered(bidResponse); + DEFERRED_RENDER.delete(bidResponse); + } +} +function renderAdDirect(doc, adId, options) { + let bid; + function fail(reason, message) { + emitAdRenderFail(Object.assign({ + id: adId, + bid + }, { + reason, + message + })); + } + function resizeFn(width, height) { + const frame = doc.defaultView?.frameElement; + if (frame) { + if (width) { + frame.width = width; + frame.style.width && (frame.style.width = `${width}px`); + } + if (height) { + frame.height = height; + frame.style.height && (frame.style.height = `${height}px`); + } + } + } + const messageHandler = creativeMessageHandler({ + resizeFn + }); + function renderFn(adData) { + if (adData.ad) { + doc.write(adData.ad); + doc.close(); + emitAdRenderSucceeded({ + doc, + bid, + id: bid.adId + }); + } else { + (0,_creativeRenderers_js__WEBPACK_IMPORTED_MODULE_14__.getCreativeRenderer)(bid).then(render => render(adData, { + sendMessage: (type, data) => messageHandler(type, data, bid), + mkFrame: _utils_js__WEBPACK_IMPORTED_MODULE_5__.createIframe + }, doc.defaultView)).then(() => emitAdRenderSucceeded({ + doc, + bid, + id: bid.adId + }), e => { + fail(e?.reason || _constants_js__WEBPACK_IMPORTED_MODULE_0__.AD_RENDER_FAILED_REASON.EXCEPTION, e?.message); + e?.stack && (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(e); + }); + } + // TODO: this is almost certainly the wrong way to do this + const creativeComment = document.createComment(`Creative ${bid.creativeId} served by ${bid.bidder} Prebid.js Header Bidding`); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.insertElement)(creativeComment, doc, 'html'); + } + try { + if (!adId || !doc) { + fail(_constants_js__WEBPACK_IMPORTED_MODULE_0__.AD_RENDER_FAILED_REASON.MISSING_DOC_OR_ADID, `missing ${adId ? 'doc' : 'adId'}`); + } else { + getBidToRender(adId).then(bidResponse => { + bid = bidResponse; + handleRender({ + renderFn, + resizeFn, + adId, + options: { + clickUrl: options?.clickThrough + }, + bidResponse, + doc + }); + }); + } + } catch (e) { + fail(EXCEPTION, e.message); + } +} + +/** + * Insert an invisible, named iframe that can be used by creatives to locate the window Prebid is running in + * (by looking for one that has `.frames[PB_LOCATOR]` defined). + * This is necessary because in some situations creatives may be rendered inside nested iframes - Prebid is not necessarily + * in the immediate parent window. + */ +function insertLocatorFrame() { + if (!window.frames[_constants_js__WEBPACK_IMPORTED_MODULE_0__.PB_LOCATOR]) { + if (!document.body) { + window.requestAnimationFrame(insertLocatorFrame); + } else { + const frame = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.createInvisibleIframe)(); + frame.name = _constants_js__WEBPACK_IMPORTED_MODULE_0__.PB_LOCATOR; + document.body.appendChild(frame); + } + } +} + +/***/ }), + +/***/ "./src/adServerManager.js": +/*!********************************!*\ + !*** ./src/adServerManager.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ registerVideoSupport: () => (/* binding */ registerVideoSupport) +/* harmony export */ }); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); + + +const prebid = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(); + +/** + * This file defines the plugin points in prebid-core for AdServer-specific functionality. + * + * Its main job is to expose functions for AdServer modules to append functionality to the Prebid public API. + * For a given Ad Server with name "adServerName", these functions will only change the API in the + * $$PREBID_GLOBAL$$.adServers[adServerName] namespace. + */ + +/** + * @typedef {Object} CachedVideoBid + * + * @property {string} videoCacheId The ID which can be used to retrieve this video from prebid-server. + * This is the same ID given to the callback in the videoCache's store function. + */ + +/** + * @function VideoAdUrlBuilder + * + * @param {CachedVideoBid} bid The winning Bid which the ad server should show, assuming it beats out + * the competition. + * + * @param {Object} options Options required by the Ad Server to make a valid AdServer URL. + * This object will have different properties depending on the specific ad server supported. + * For more information, see the docs inside the ad server module you're supporting. + * + * @return {string} A URL which can be passed into the Video player to play an ad. + */ + +/** + * @typedef {Object} VideoSupport + * + * @property {VideoAdUrlBuilder} buildVideoAdUrl + */ + +/** + * Enable video support for the Ad Server. + * + * @property {string} name The identifying name for this adserver. + * @property {VideoSupport} videoSupport An object with the functions needed to support video in Prebid. + */ +function registerVideoSupport(name, videoSupport) { + prebid.adServers = prebid.adServers || {}; + prebid.adServers[name] = prebid.adServers[name] || {}; + Object.keys(videoSupport).forEach(key => { + if (prebid.adServers[name][key]) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Attempting to add an already registered function property ${key} for AdServer ${name}.`); + return; + } + prebid.adServers[name][key] = videoSupport[key]; + }); +} + +/***/ }), + +/***/ "./src/adUnits.js": +/*!************************!*\ + !*** ./src/adUnits.js ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getAuctionsCounter: () => (/* binding */ getAuctionsCounter), +/* harmony export */ getBidderRequestsCounter: () => (/* binding */ getBidderRequestsCounter), +/* harmony export */ getBidderWinsCounter: () => (/* binding */ getBidderWinsCounter), +/* harmony export */ getRequestsCounter: () => (/* binding */ getRequestsCounter), +/* harmony export */ incrementAuctionsCounter: () => (/* binding */ incrementAuctionsCounter), +/* harmony export */ incrementBidderRequestsCounter: () => (/* binding */ incrementBidderRequestsCounter), +/* harmony export */ incrementBidderWinsCounter: () => (/* binding */ incrementBidderWinsCounter), +/* harmony export */ incrementRequestsCounter: () => (/* binding */ incrementRequestsCounter) +/* harmony export */ }); +/* unused harmony export reset */ +let adUnits = {}; +function reset() { + adUnits = {}; +} +function ensureAdUnit(adunit, bidderCode) { + let adUnit = adUnits[adunit] = adUnits[adunit] || { + bidders: {} + }; + if (bidderCode) { + return adUnit.bidders[bidderCode] = adUnit.bidders[bidderCode] || {}; + } + return adUnit; +} +function incrementAdUnitCount(adunit, counter, bidderCode) { + let adUnit = ensureAdUnit(adunit, bidderCode); + adUnit[counter] = (adUnit[counter] || 0) + 1; + return adUnit[counter]; +} + +/** + * Increments and returns current Adunit counter + * @param {string} adunit id + * @returns {number} current adunit count + */ +function incrementRequestsCounter(adunit) { + return incrementAdUnitCount(adunit, 'requestsCounter'); +} + +/** + * Increments and returns current Adunit requests counter for a bidder + * @param {string} adunit id + * @param {string} bidderCode code + * @returns {number} current adunit bidder requests count + */ +function incrementBidderRequestsCounter(adunit, bidderCode) { + return incrementAdUnitCount(adunit, 'requestsCounter', bidderCode); +} + +/** + * Increments and returns current Adunit wins counter for a bidder + * @param {string} adunit id + * @param {string} bidderCode code + * @returns {number} current adunit bidder requests count + */ +function incrementBidderWinsCounter(adunit, bidderCode) { + return incrementAdUnitCount(adunit, 'winsCounter', bidderCode); +} + +/** + * Increments and returns current Adunit auctions counter + * @param {string} adunit id + * @returns {number} current adunit auctions count + */ +function incrementAuctionsCounter(adunit) { + return incrementAdUnitCount(adunit, 'auctionsCounter'); +} + +/** + * Returns current Adunit counter + * @param {string} adunit id + * @returns {number} current adunit count + */ +function getRequestsCounter(adunit) { + return adUnits?.[adunit]?.requestsCounter || 0; +} + +/** + * Returns current Adunit requests counter for a specific bidder code + * @param {string} adunit id + * @param {string} bidder code + * @returns {number} current adunit bidder requests count + */ +function getBidderRequestsCounter(adunit, bidder) { + return adUnits?.[adunit]?.bidders?.[bidder]?.requestsCounter || 0; +} + +/** + * Returns current Adunit requests counter for a specific bidder code + * @param {string} adunit id + * @param {string} bidder code + * @returns {number} current adunit bidder requests count + */ +function getBidderWinsCounter(adunit, bidder) { + return adUnits?.[adunit]?.bidders?.[bidder]?.winsCounter || 0; +} + +/** + * Returns current Adunit auctions counter + * @param {string} adunit id + * @returns {number} current adunit auctions count + */ +function getAuctionsCounter(adunit) { + return adUnits?.[adunit]?.auctionsCounter || 0; +} + +/***/ }), + +/***/ "./src/adapter.js": +/*!************************!*\ + !*** ./src/adapter.js ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Adapter) +/* harmony export */ }); +function Adapter(code) { + var bidderCode = code; + function setBidderCode(code) { + bidderCode = code; + } + function getBidderCode() { + return bidderCode; + } + function callBids() {} + return { + callBids: callBids, + setBidderCode: setBidderCode, + getBidderCode: getBidderCode + }; +} + +/***/ }), + +/***/ "./src/adapterManager.js": +/*!*******************************!*\ + !*** ./src/adapterManager.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PARTITIONS: () => (/* binding */ PARTITIONS), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), +/* harmony export */ filterBidsForAdUnit: () => (/* binding */ filterBidsForAdUnit), +/* harmony export */ getS2SBidderSet: () => (/* binding */ getS2SBidderSet), +/* harmony export */ partitionBidders: () => (/* binding */ partitionBidders), +/* harmony export */ s2sActivityParams: () => (/* binding */ s2sActivityParams), +/* harmony export */ setupAdUnitMediaTypes: () => (/* binding */ setupAdUnitMediaTypes) +/* harmony export */ }); +/* unused harmony exports PBS_ADAPTER_NAME, dep, _filterBidsForAdUnit, _partitionBidders */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./native.js */ "./src/native.js"); +/* harmony import */ var _adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _ajax_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ajax.js */ "./src/ajax.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _adUnits_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./adUnits.js */ "./src/adUnits.js"); +/* harmony import */ var _refererDetection_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _consentHandler_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./consentHandler.js */ "./src/consentHandler.js"); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./events.js */ "./src/events.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _activities_rules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _activities_activities_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _activities_params_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./activities/params.js */ "./src/activities/params.js"); +/* harmony import */ var _activities_redactor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activities/redactor.js */ "./src/activities/redactor.js"); +/* harmony import */ var _eventTrackers_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./eventTrackers.js */ "./src/eventTrackers.js"); +/** @module adaptermanger */ + + + + + + + + + + + + + + + + + + + + + + +const PBS_ADAPTER_NAME = 'pbsBidAdapter'; +const PARTITIONS = { + CLIENT: 'client', + SERVER: 'server' +}; +const dep = { + isAllowed: _activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.isActivityAllowed, + redact: _activities_redactor_js__WEBPACK_IMPORTED_MODULE_1__.redactor +}; +let adapterManager = {}; +let _bidderRegistry = adapterManager.bidderRegistry = {}; +let _aliasRegistry = adapterManager.aliasRegistry = {}; +let _s2sConfigs = []; +_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('s2sConfig', config => { + if (config && config.s2sConfig) { + _s2sConfigs = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(config.s2sConfig) ? config.s2sConfig : [config.s2sConfig]; + } +}); +var _analyticsRegistry = {}; +const activityParams = (0,_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.activityParamsBuilder)(alias => adapterManager.resolveAlias(alias)); +function getConfigName(s2sConfig) { + // According to our docs, "module" bid (stored impressions) + // have params.configName referring to s2sConfig.name, + // but for a long while this was checking against s2sConfig.configName. + // Keep allowing s2sConfig.configName to avoid the breaking change + return s2sConfig.configName ?? s2sConfig.name; +} +function s2sActivityParams(s2sConfig) { + return activityParams(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_PREBID, PBS_ADAPTER_NAME, { + [_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_S2S_NAME]: getConfigName(s2sConfig) + }); +} + +/** + * @typedef {object} LabelDescriptor + * @property {boolean} labelAll describes whether or not this object expects all labels to match, or any label to match + * @property {Array} labels the labels listed on the bidder or adUnit + * @property {Array} activeLabels the labels specified as being active by requestBids + */ + +function getBids(_ref) { + let { + bidderCode, + auctionId, + bidderRequestId, + adUnits, + src, + metrics + } = _ref; + return adUnits.reduce((result, adUnit) => { + const bids = adUnit.bids.filter(bid => bid.bidder === bidderCode); + if (bidderCode == null && bids.length === 0 && adUnit.s2sBid != null) { + bids.push({ + bidder: null + }); + } + result.push(bids.reduce((bids, bid) => { + bid = Object.assign({}, bid, { + ortb2Imp: (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, adUnit.ortb2Imp, bid.ortb2Imp) + }, (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getDefinedParams)(adUnit, ['nativeParams', 'nativeOrtbRequest', 'mediaType', 'renderer'])); + const mediaTypes = bid.mediaTypes == null ? adUnit.mediaTypes : bid.mediaTypes; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.isValidMediaTypes)(mediaTypes)) { + bid = Object.assign({}, bid, { + mediaTypes + }); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`mediaTypes is not correctly configured for adunit ${adUnit.code}`); + } + if (src === 'client') { + (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.incrementBidderRequestsCounter)(adUnit.code, bidderCode); + } + bids.push(Object.assign({}, bid, { + adUnitCode: adUnit.code, + transactionId: adUnit.transactionId, + adUnitId: adUnit.adUnitId, + sizes: mediaTypes?.banner?.sizes || mediaTypes?.video?.playerSize || [], + bidId: bid.bid_id || (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifierStr)(), + bidderRequestId, + auctionId, + src, + metrics, + auctionsCount: (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.getAuctionsCounter)(adUnit.code), + bidRequestsCount: (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.getRequestsCounter)(adUnit.code), + bidderRequestsCount: (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.getBidderRequestsCounter)(adUnit.code, bid.bidder), + bidderWinsCount: (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.getBidderWinsCounter)(adUnit.code, bid.bidder), + deferBilling: !!adUnit.deferBilling + })); + return bids; + }, [])); + return result; + }, []).reduce(_utils_js__WEBPACK_IMPORTED_MODULE_3__.flatten, []).filter(val => val !== ''); +} +const hookedGetBids = (0,_hook_js__WEBPACK_IMPORTED_MODULE_7__.hook)('sync', getBids, 'getBids'); + +/** + * Filter an adUnit's bids for building client and/or server requests + * + * @param bids an array of bids as defined in an adUnit + * @param s2sConfig null if the adUnit is being routed to a client adapter; otherwise the s2s adapter's config + * @returns the subset of `bids` that are pertinent for the given `s2sConfig` + */ +function _filterBidsForAdUnit(bids, s2sConfig) { + let { + getS2SBidders = getS2SBidderSet + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (s2sConfig == null) { + return bids; + } else { + const serverBidders = getS2SBidders(s2sConfig); + return bids.filter(bid => { + if (!serverBidders.has(bid.bidder)) return false; + if (bid.s2sConfigName == null) return true; + const configName = getConfigName(s2sConfig); + const allowedS2SConfigs = Array.isArray(bid.s2sConfigName) ? bid.s2sConfigName : [bid.s2sConfigName]; + return allowedS2SConfigs.includes(configName); + }); + } +} +const filterBidsForAdUnit = (0,_hook_js__WEBPACK_IMPORTED_MODULE_7__.hook)('sync', _filterBidsForAdUnit, 'filterBidsForAdUnit'); +function getAdUnitCopyForPrebidServer(adUnits, s2sConfig) { + let adUnitsCopy = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(adUnits); + let hasModuleBids = false; + adUnitsCopy.forEach(adUnit => { + // filter out client side bids + const s2sBids = adUnit.bids.filter(b => b.module === PBS_ADAPTER_NAME && b.params?.configName === getConfigName(s2sConfig)); + if (s2sBids.length === 1) { + adUnit.s2sBid = s2sBids[0]; + hasModuleBids = true; + adUnit.ortb2Imp = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, adUnit.s2sBid.ortb2Imp, adUnit.ortb2Imp); + } else if (s2sBids.length > 1) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Multiple "module" bids for the same s2s configuration; all will be ignored', s2sBids); + } + adUnit.bids = filterBidsForAdUnit(adUnit.bids, s2sConfig).map(bid => { + bid.bid_id = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifierStr)(); + return bid; + }); + }); + + // don't send empty requests + adUnitsCopy = adUnitsCopy.filter(adUnit => { + return adUnit.bids.length !== 0 || adUnit.s2sBid != null; + }); + return { + adUnits: adUnitsCopy, + hasModuleBids + }; +} +function getAdUnitCopyForClientAdapters(adUnits) { + let adUnitsClientCopy = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(adUnits); + adUnitsClientCopy.forEach(adUnit => { + adUnit.bids = filterBidsForAdUnit(adUnit.bids, null); + }); + + // don't send empty requests + adUnitsClientCopy = adUnitsClientCopy.filter(adUnit => { + return adUnit.bids.length !== 0; + }); + return adUnitsClientCopy; +} + +/** + * Filter and/or modify media types for ad units based on the given labels. + * + * This should return adUnits that are active for the given labels, modified to have their `mediaTypes` + * conform to size mapping configuration. If different bids for the same adUnit should use different `mediaTypes`, + * they should be exposed under `adUnit.bids[].mediaTypes`. + */ +const setupAdUnitMediaTypes = (0,_hook_js__WEBPACK_IMPORTED_MODULE_7__.hook)('sync', (adUnits, labels) => { + return adUnits; +}, 'setupAdUnitMediaTypes'); + +/** + * @param {{}|Array<{}>} s2sConfigs + * @returns {Set} a set of all the bidder codes that should be routed through the S2S adapter(s) + * as defined in `s2sConfigs` + */ +function getS2SBidderSet(s2sConfigs) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(s2sConfigs)) s2sConfigs = [s2sConfigs]; + // `null` represents the "no bid bidder" - when an ad unit is meant only for S2S adapters, like stored impressions + const serverBidders = new Set([null]); + s2sConfigs.filter(s2s => s2s && s2s.enabled).flatMap(s2s => s2s.bidders).forEach(bidder => serverBidders.add(bidder)); + return serverBidders; +} + +/** + * @param {Array} adUnits - The ad units to be processed. + * @param {Object} s2sConfigs - The server-to-server configurations. + * @returns {Object} - An object containing arrays of bidder codes for client and server. + * @returns {Object} return.client - Array of bidder codes that should be routed to client adapters. + * @returns {Object} return.server - Array of bidder codes that should be routed to server adapters. + */ +function _partitionBidders(adUnits, s2sConfigs) { + let { + getS2SBidders = getS2SBidderSet + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const serverBidders = getS2SBidders(s2sConfigs); + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidderCodes)(adUnits).reduce((memo, bidder) => { + const partition = serverBidders.has(bidder) ? PARTITIONS.SERVER : PARTITIONS.CLIENT; + memo[partition].push(bidder); + return memo; + }, { + [PARTITIONS.CLIENT]: [], + [PARTITIONS.SERVER]: [] + }); +} +const partitionBidders = (0,_hook_js__WEBPACK_IMPORTED_MODULE_7__.hook)('sync', _partitionBidders, 'partitionBidders'); +adapterManager.makeBidRequests = (0,_hook_js__WEBPACK_IMPORTED_MODULE_7__.hook)('sync', function (adUnits, auctionStart, auctionId, cbTimeout, labels) { + let ortb2Fragments = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + let auctionMetrics = arguments.length > 6 ? arguments[6] : undefined; + auctionMetrics = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_8__.useMetrics)(auctionMetrics); + /** + * emit and pass adunits for external modification + * @see {@link https://github.com/prebid/Prebid.js/issues/4149|Issue} + */ + _events_js__WEBPACK_IMPORTED_MODULE_9__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_10__.EVENTS.BEFORE_REQUEST_BIDS, adUnits); + if (true) { + (0,_native_js__WEBPACK_IMPORTED_MODULE_11__.decorateAdUnitsWithNativeParams)(adUnits); + } + adUnits.map(adUnit => adUnit.code).filter(_utils_js__WEBPACK_IMPORTED_MODULE_3__.uniques).forEach(_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.incrementAuctionsCounter); + adUnits.forEach(au => { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(au.mediaTypes)) { + au.mediaTypes = {}; + } + // filter out bidders that cannot participate in the auction + au.bids = au.bids.filter(bid => !bid.bidder || dep.isAllowed(_activities_activities_js__WEBPACK_IMPORTED_MODULE_12__.ACTIVITY_FETCH_BIDS, activityParams(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER, bid.bidder))); + (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.incrementRequestsCounter)(au.code); + }); + adUnits = setupAdUnitMediaTypes(adUnits, labels); + let { + [PARTITIONS.CLIENT]: clientBidders, + [PARTITIONS.SERVER]: serverBidders + } = partitionBidders(adUnits, _s2sConfigs); + if (_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('bidderSequence') === _config_js__WEBPACK_IMPORTED_MODULE_2__.RANDOM) { + clientBidders = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.shuffle)(clientBidders); + } + const refererInfo = (0,_refererDetection_js__WEBPACK_IMPORTED_MODULE_13__.getRefererInfo)(); + let bidRequests = []; + const ortb2 = ortb2Fragments.global || {}; + const bidderOrtb2 = ortb2Fragments.bidder || {}; + function addOrtb2(bidderRequest, s2sActivityParams) { + const redact = dep.redact(s2sActivityParams != null ? s2sActivityParams : activityParams(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER, bidderRequest.bidderCode)); + const fpd = Object.freeze(redact.ortb2((0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({ + source: { + tid: auctionId + } + }, ortb2, bidderOrtb2[bidderRequest.bidderCode]))); + bidderRequest.ortb2 = fpd; + bidderRequest.bids = bidderRequest.bids.map(bid => { + bid.ortb2 = fpd; + return redact.bidRequest(bid); + }); + return bidderRequest; + } + _s2sConfigs.forEach(s2sConfig => { + const s2sParams = s2sActivityParams(s2sConfig); + if (s2sConfig && s2sConfig.enabled && dep.isAllowed(_activities_activities_js__WEBPACK_IMPORTED_MODULE_12__.ACTIVITY_FETCH_BIDS, s2sParams)) { + let { + adUnits: adUnitsS2SCopy, + hasModuleBids + } = getAdUnitCopyForPrebidServer(adUnits, s2sConfig); + + // uniquePbsTid is so we know which server to send which bids to during the callBids function + let uniquePbsTid = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(); + (serverBidders.length === 0 && hasModuleBids ? [null] : serverBidders).forEach(bidderCode => { + const bidderRequestId = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifierStr)(); + const metrics = auctionMetrics.fork(); + const bidderRequest = addOrtb2({ + bidderCode, + auctionId, + bidderRequestId, + uniquePbsTid, + bids: hookedGetBids({ + bidderCode, + auctionId, + bidderRequestId, + 'adUnits': (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(adUnitsS2SCopy), + src: _constants_js__WEBPACK_IMPORTED_MODULE_10__.S2S.SRC, + metrics + }), + auctionStart: auctionStart, + timeout: s2sConfig.timeout, + src: _constants_js__WEBPACK_IMPORTED_MODULE_10__.S2S.SRC, + refererInfo, + metrics + }, s2sParams); + if (bidderRequest.bids.length !== 0) { + bidRequests.push(bidderRequest); + } + }); + + // update the s2sAdUnits object and remove all bids that didn't pass sizeConfig/label checks from getBids() + // this is to keep consistency and only allow bids/adunits that passed the checks to go to pbs + adUnitsS2SCopy.forEach(adUnitCopy => { + let validBids = adUnitCopy.bids.filter(adUnitBid => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.find)(bidRequests, request => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.find)(request.bids, reqBid => reqBid.bidId === adUnitBid.bid_id))); + adUnitCopy.bids = validBids; + }); + bidRequests.forEach(request => { + if (request.adUnitsS2SCopy === undefined) { + request.adUnitsS2SCopy = adUnitsS2SCopy.filter(au => au.bids.length > 0 || au.s2sBid != null); + } + }); + } + }); + + // client adapters + let adUnitsClientCopy = getAdUnitCopyForClientAdapters(adUnits); + clientBidders.forEach(bidderCode => { + const bidderRequestId = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getUniqueIdentifierStr)(); + const metrics = auctionMetrics.fork(); + const bidderRequest = addOrtb2({ + bidderCode, + auctionId, + bidderRequestId, + bids: hookedGetBids({ + bidderCode, + auctionId, + bidderRequestId, + 'adUnits': (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(adUnitsClientCopy), + labels, + src: 'client', + metrics + }), + auctionStart: auctionStart, + timeout: cbTimeout, + refererInfo, + metrics + }); + const adapter = _bidderRegistry[bidderCode]; + if (!adapter) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Trying to make a request for bidder that does not exist: ${bidderCode}`); + } + if (adapter && bidderRequest.bids && bidderRequest.bids.length !== 0) { + bidRequests.push(bidderRequest); + } + }); + bidRequests.forEach(bidRequest => { + if (_consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.gdprDataHandler.getConsentData()) { + bidRequest['gdprConsent'] = _consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.gdprDataHandler.getConsentData(); + } + if (_consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.uspDataHandler.getConsentData()) { + bidRequest['uspConsent'] = _consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.uspDataHandler.getConsentData(); + } + if (_consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.gppDataHandler.getConsentData()) { + bidRequest['gppConsent'] = _consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.gppDataHandler.getConsentData(); + } + }); + return bidRequests; +}, 'makeBidRequests'); +adapterManager.callBids = function (adUnits, bidRequests, addBidResponse, doneCb, requestCallbacks, requestBidsTimeout, onTimelyResponse) { + let ortb2Fragments = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; + if (!bidRequests.length) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('callBids executed with no bidRequests. Were they filtered by labels or sizing?'); + return; + } + let [clientBidderRequests, serverBidderRequests] = bidRequests.reduce((partitions, bidRequest) => { + partitions[Number(typeof bidRequest.src !== 'undefined' && bidRequest.src === _constants_js__WEBPACK_IMPORTED_MODULE_10__.S2S.SRC)].push(bidRequest); + return partitions; + }, [[], []]); + var uniqueServerBidRequests = []; + serverBidderRequests.forEach(serverBidRequest => { + var index = -1; + for (var i = 0; i < uniqueServerBidRequests.length; ++i) { + if (serverBidRequest.uniquePbsTid === uniqueServerBidRequests[i].uniquePbsTid) { + index = i; + break; + } + } + if (index <= -1) { + uniqueServerBidRequests.push(serverBidRequest); + } + }); + let counter = 0; + _s2sConfigs.forEach(s2sConfig => { + if (s2sConfig && uniqueServerBidRequests[counter] && getS2SBidderSet(s2sConfig).has(uniqueServerBidRequests[counter].bidderCode)) { + // s2s should get the same client side timeout as other client side requests. + const s2sAjax = (0,_ajax_js__WEBPACK_IMPORTED_MODULE_16__.ajaxBuilder)(requestBidsTimeout, requestCallbacks ? { + request: requestCallbacks.request.bind(null, 's2s'), + done: requestCallbacks.done + } : undefined); + let adaptersServerSide = s2sConfig.bidders; + const s2sAdapter = _bidderRegistry[s2sConfig.adapter]; + let uniquePbsTid = uniqueServerBidRequests[counter].uniquePbsTid; + let adUnitsS2SCopy = uniqueServerBidRequests[counter].adUnitsS2SCopy; + let uniqueServerRequests = serverBidderRequests.filter(serverBidRequest => serverBidRequest.uniquePbsTid === uniquePbsTid); + if (s2sAdapter) { + let s2sBidRequest = { + 'ad_units': adUnitsS2SCopy, + s2sConfig, + ortb2Fragments, + requestBidsTimeout + }; + if (s2sBidRequest.ad_units.length) { + let doneCbs = uniqueServerRequests.map(bidRequest => { + bidRequest.start = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.timestamp)(); + return function (timedOut) { + if (!timedOut) { + onTimelyResponse(bidRequest.bidderRequestId); + } + doneCb.apply(bidRequest, arguments); + }; + }); + const bidders = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidderCodes)(s2sBidRequest.ad_units).filter(bidder => adaptersServerSide.includes(bidder)); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`CALLING S2S HEADER BIDDERS ==== ${bidders.length > 0 ? bidders.join(', ') : 'No bidder specified, using "ortb2Imp" definition(s) only'}`); + + // fire BID_REQUESTED event for each s2s bidRequest + uniqueServerRequests.forEach(bidRequest => { + // add the new sourceTid + _events_js__WEBPACK_IMPORTED_MODULE_9__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_10__.EVENTS.BID_REQUESTED, { + ...bidRequest, + tid: bidRequest.auctionId + }); + }); + + // make bid requests + s2sAdapter.callBids(s2sBidRequest, serverBidderRequests, addBidResponse, timedOut => doneCbs.forEach(done => done(timedOut)), s2sAjax); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('missing ' + s2sConfig.adapter); + } + counter++; + } + }); + + // handle client adapter requests + clientBidderRequests.forEach(bidderRequest => { + bidderRequest.start = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.timestamp)(); + // TODO : Do we check for bid in pool from here and skip calling adapter again ? + const adapter = _bidderRegistry[bidderRequest.bidderCode]; + _config_js__WEBPACK_IMPORTED_MODULE_2__.config.runWithBidder(bidderRequest.bidderCode, () => { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`CALLING BIDDER`); + _events_js__WEBPACK_IMPORTED_MODULE_9__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_10__.EVENTS.BID_REQUESTED, bidderRequest); + }); + let ajax = (0,_ajax_js__WEBPACK_IMPORTED_MODULE_16__.ajaxBuilder)(requestBidsTimeout, requestCallbacks ? { + request: requestCallbacks.request.bind(null, bidderRequest.bidderCode), + done: requestCallbacks.done + } : undefined); + const adapterDone = doneCb.bind(bidderRequest); + try { + _config_js__WEBPACK_IMPORTED_MODULE_2__.config.runWithBidder(bidderRequest.bidderCode, adapter.callBids.bind(adapter, bidderRequest, addBidResponse, adapterDone, ajax, () => onTimelyResponse(bidderRequest.bidderRequestId), _config_js__WEBPACK_IMPORTED_MODULE_2__.config.callbackWithBidder(bidderRequest.bidderCode))); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${bidderRequest.bidderCode} Bid Adapter emitted an uncaught error when parsing their bidRequest`, { + e, + bidRequest: bidderRequest + }); + adapterDone(); + } + }); +}; +function getSupportedMediaTypes(bidderCode) { + let supportedMediaTypes = []; + if ( true && (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.includes)(adapterManager.videoAdapters, bidderCode)) supportedMediaTypes.push('video'); + if ( true && (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.includes)(_native_js__WEBPACK_IMPORTED_MODULE_11__.nativeAdapters, bidderCode)) supportedMediaTypes.push('native'); + return supportedMediaTypes; +} +adapterManager.videoAdapters = []; // added by adapterLoader for now + +adapterManager.registerBidAdapter = function (bidAdapter, bidderCode) { + let { + supportedMediaTypes = [] + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (bidAdapter && bidderCode) { + if (typeof bidAdapter.callBids === 'function') { + _bidderRegistry[bidderCode] = bidAdapter; + _consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.GDPR_GVLIDS.register(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER, bidderCode, bidAdapter.getSpec?.().gvlid); + if ( true && (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.includes)(supportedMediaTypes, 'video')) { + adapterManager.videoAdapters.push(bidderCode); + } + if ( true && (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.includes)(supportedMediaTypes, 'native')) { + _native_js__WEBPACK_IMPORTED_MODULE_11__.nativeAdapters.push(bidderCode); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Bidder adaptor error for bidder code: ' + bidderCode + 'bidder must implement a callBids() function'); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('bidAdapter or bidderCode not specified'); + } +}; +adapterManager.aliasBidAdapter = function (bidderCode, alias, options) { + let existingAlias = _bidderRegistry[alias]; + if (typeof existingAlias === 'undefined') { + let bidAdapter = _bidderRegistry[bidderCode]; + if (typeof bidAdapter === 'undefined') { + // check if alias is part of s2sConfig and allow them to register if so (as base bidder may be s2s-only) + const nonS2SAlias = []; + _s2sConfigs.forEach(s2sConfig => { + if (s2sConfig.bidders && s2sConfig.bidders.length) { + const s2sBidders = s2sConfig && s2sConfig.bidders; + if (!(s2sConfig && (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_14__.includes)(s2sBidders, alias))) { + nonS2SAlias.push(bidderCode); + } else { + _aliasRegistry[alias] = bidderCode; + } + } + }); + nonS2SAlias.forEach(bidderCode => { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('bidderCode "' + bidderCode + '" is not an existing bidder.', 'adapterManager.aliasBidAdapter'); + }); + } else { + try { + let newAdapter; + let supportedMediaTypes = getSupportedMediaTypes(bidderCode); + // Have kept old code to support backward compatibilitiy. + // Remove this if loop when all adapters are supporting bidderFactory. i.e When Prebid.js is 1.0 + if (bidAdapter.constructor.prototype != Object.prototype) { + newAdapter = new bidAdapter.constructor(); + newAdapter.setBidderCode(alias); + } else { + const { + useBaseGvlid = false + } = options || {}; + let spec = bidAdapter.getSpec(); + const gvlid = useBaseGvlid ? spec.gvlid : options?.gvlid; + if (gvlid == null && spec.gvlid != null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Alias '${alias}' will NOT re-use the GVL ID of the original adapter ('${spec.code}', gvlid: ${spec.gvlid}). Functionality that requires TCF consent may not work as expected.`); + } + let skipPbsAliasing = options && options.skipPbsAliasing; + newAdapter = (0,_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_17__.newBidder)(Object.assign({}, spec, { + code: alias, + gvlid, + skipPbsAliasing + })); + _aliasRegistry[alias] = bidderCode; + } + adapterManager.registerBidAdapter(newAdapter, alias, { + supportedMediaTypes + }); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(bidderCode + ' bidder does not currently support aliasing.', 'adapterManager.aliasBidAdapter'); + } + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)('alias name "' + alias + '" has been already specified.'); + } +}; +adapterManager.resolveAlias = function (alias) { + let code = alias; + let visited; + while (_aliasRegistry[code] && (!visited || !visited.has(code))) { + code = _aliasRegistry[code]; + (visited = visited || new Set()).add(code); + } + return code; +}; +adapterManager.registerAnalyticsAdapter = function (_ref2) { + let { + adapter, + code, + gvlid + } = _ref2; + if (adapter && code) { + if (typeof adapter.enableAnalytics === 'function') { + adapter.code = code; + _analyticsRegistry[code] = { + adapter, + gvlid + }; + _consentHandler_js__WEBPACK_IMPORTED_MODULE_15__.GDPR_GVLIDS.register(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_ANALYTICS, code, gvlid); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Prebid Error: Analytics adaptor error for analytics "${code}" + analytics adapter must implement an enableAnalytics() function`); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Prebid Error: analyticsAdapter or analyticsCode not specified'); + } +}; +adapterManager.enableAnalytics = function (config) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(config)) { + config = [config]; + } + config.forEach(adapterConfig => { + const entry = _analyticsRegistry[adapterConfig.provider]; + if (entry && entry.adapter) { + if (dep.isAllowed(_activities_activities_js__WEBPACK_IMPORTED_MODULE_12__.ACTIVITY_REPORT_ANALYTICS, activityParams(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_ANALYTICS, adapterConfig.provider, { + [_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_ANL_CONFIG]: adapterConfig + }))) { + entry.adapter.enableAnalytics(adapterConfig); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Prebid Error: no analytics adapter found in registry for '${adapterConfig.provider}'.`); + } + }); +}; +adapterManager.getBidAdapter = function (bidder) { + return _bidderRegistry[bidder]; +}; +adapterManager.getAnalyticsAdapter = function (code) { + return _analyticsRegistry[code]; +}; +function getBidderMethod(bidder, method) { + const adapter = _bidderRegistry[bidder]; + const spec = adapter?.getSpec && adapter.getSpec(); + if (spec && spec[method] && typeof spec[method] === 'function') { + return [spec, spec[method]]; + } +} +function invokeBidderMethod(bidder, method, spec, fn) { + try { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`Invoking ${bidder}.${method}`); + for (var _len = arguments.length, params = new Array(_len > 4 ? _len - 4 : 0), _key = 4; _key < _len; _key++) { + params[_key - 4] = arguments[_key]; + } + _config_js__WEBPACK_IMPORTED_MODULE_2__.config.runWithBidder(bidder, fn.bind(spec, ...params)); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Error calling ${method} of ${bidder}`); + } +} +function tryCallBidderMethod(bidder, method, param) { + if (param?.source !== _constants_js__WEBPACK_IMPORTED_MODULE_10__.S2S.SRC) { + const target = getBidderMethod(bidder, method); + if (target != null) { + invokeBidderMethod(bidder, method, ...target, param); + } + } +} +adapterManager.callTimedOutBidders = function (adUnits, timedOutBidders, cbTimeout) { + timedOutBidders = timedOutBidders.map(timedOutBidder => { + // Adding user configured params & timeout to timeout event data + timedOutBidder.params = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getUserConfiguredParams)(adUnits, timedOutBidder.adUnitCode, timedOutBidder.bidder); + timedOutBidder.timeout = cbTimeout; + return timedOutBidder; + }); + timedOutBidders = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.groupBy)(timedOutBidders, 'bidder'); + Object.keys(timedOutBidders).forEach(bidder => { + tryCallBidderMethod(bidder, 'onTimeout', timedOutBidders[bidder]); + }); +}; +adapterManager.callBidWonBidder = function (bidder, bid, adUnits) { + // Adding user configured params to bidWon event data + bid.params = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getUserConfiguredParams)(adUnits, bid.adUnitCode, bid.bidder); + (0,_adUnits_js__WEBPACK_IMPORTED_MODULE_6__.incrementBidderWinsCounter)(bid.adUnitCode, bid.bidder); + tryCallBidderMethod(bidder, 'onBidWon', bid); +}; +adapterManager.triggerBilling = (() => { + const BILLED = new WeakSet(); + return bid => { + if (!BILLED.has(bid)) { + BILLED.add(bid); + ((0,_eventTrackers_js__WEBPACK_IMPORTED_MODULE_18__.parseEventTrackers)(bid.eventtrackers)[_eventTrackers_js__WEBPACK_IMPORTED_MODULE_18__.EVENT_TYPE_IMPRESSION]?.[_eventTrackers_js__WEBPACK_IMPORTED_MODULE_18__.TRACKER_METHOD_IMG] || []).forEach(url => _utils_js__WEBPACK_IMPORTED_MODULE_3__.internal.triggerPixel(url)); + tryCallBidderMethod(bid.bidder, 'onBidBillable', bid); + } + }; +})(); +adapterManager.callSetTargetingBidder = function (bidder, bid) { + tryCallBidderMethod(bidder, 'onSetTargeting', bid); +}; +adapterManager.callBidViewableBidder = function (bidder, bid) { + tryCallBidderMethod(bidder, 'onBidViewable', bid); +}; +adapterManager.callBidderError = function (bidder, error, bidderRequest) { + const param = { + error, + bidderRequest + }; + tryCallBidderMethod(bidder, 'onBidderError', param); +}; +adapterManager.callAdRenderSucceededBidder = function (bidder, bid) { + tryCallBidderMethod(bidder, 'onAdRenderSucceeded', bid); +}; +function resolveAlias(alias) { + const seen = new Set(); + while (_aliasRegistry.hasOwnProperty(alias) && !seen.has(alias)) { + seen.add(alias); + alias = _aliasRegistry[alias]; + } + return alias; +} +/** + * Ask every adapter to delete PII. + * See https://github.com/prebid/Prebid.js/issues/9081 + */ +adapterManager.callDataDeletionRequest = (0,_hook_js__WEBPACK_IMPORTED_MODULE_7__.hook)('sync', function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + const method = 'onDataDeletionRequest'; + Object.keys(_bidderRegistry).filter(bidder => !_aliasRegistry.hasOwnProperty(bidder)).forEach(bidder => { + const target = getBidderMethod(bidder, method); + if (target != null) { + const bidderRequests = _auctionManager_js__WEBPACK_IMPORTED_MODULE_19__.auctionManager.getBidsRequested().filter(br => resolveAlias(br.bidderCode) === bidder); + invokeBidderMethod(bidder, method, ...target, bidderRequests, ...args); + } + }); + Object.entries(_analyticsRegistry).forEach(_ref3 => { + let [name, entry] = _ref3; + const fn = entry?.adapter?.[method]; + if (typeof fn === 'function') { + try { + fn.apply(entry.adapter, args); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`error calling ${method} of ${name}`, e); + } + } + }); +}); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (adapterManager); + +/***/ }), + +/***/ "./src/adapters/bidderFactory.js": +/*!***************************************!*\ + !*** ./src/adapters/bidderFactory.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ adapterMetrics: () => (/* binding */ adapterMetrics), +/* harmony export */ addPaapiConfig: () => (/* binding */ addPaapiConfig), +/* harmony export */ guardTids: () => (/* binding */ guardTids), +/* harmony export */ isValid: () => (/* binding */ isValid), +/* harmony export */ newBidder: () => (/* binding */ newBidder), +/* harmony export */ registerBidder: () => (/* binding */ registerBidder) +/* harmony export */ }); +/* unused harmony exports processBidderRequests, registerSyncInner */ +/* harmony import */ var _adapter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../adapter.js */ "./src/adapter.js"); +/* harmony import */ var _adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); +/* harmony import */ var _bidfactory_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../bidfactory.js */ "./src/bidfactory.js"); +/* harmony import */ var _userSync_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../userSync.js */ "./src/userSync.js"); +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../native.js */ "./src/native.js"); +/* harmony import */ var _video_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../video.js */ "./src/video.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants.js */ "./src/constants.js"); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../events.js */ "./src/events.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../hook.js */ "./src/hook.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _bidderSettings_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _activities_rules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _activities_activityParams_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _activities_activities_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../activities/activities.js */ "./src/activities/activities.js"); + + + + + + + + + + + + + + + + + + + + +/** + * @typedef {import('../mediaTypes.js').MediaType} MediaType + * @typedef {import('../Renderer.js').Renderer} Renderer + */ + +/** + * This file aims to support Adapters during the Prebid 0.x -> 1.x transition. + * + * Prebid 1.x and Prebid 0.x will be in separate branches--perhaps for a long time. + * This function defines an API for adapter construction which is compatible with both versions. + * Adapters which use it can maintain their code in master, and only this file will need to change + * in the 1.x branch. + * + * Typical usage looks something like: + * + * const adapter = registerBidder({ + * code: 'myBidderCode', + * aliases: ['alias1', 'alias2'], + * supportedMediaTypes: ['video', 'native'], + * isBidRequestValid: function(paramsObject) { return true/false }, + * buildRequests: function(bidRequests, bidderRequest) { return some ServerRequest(s) }, + * interpretResponse: function(oneServerResponse) { return some Bids, or throw an error. } + * }); + * + * @see BidderSpec for the full API and more thorough descriptions. + * + */ + +/** + * @typedef {object} BidderSpec An object containing the adapter-specific functions needed to + * make a Bidder. + * + * @property {string} code A code which will be used to uniquely identify this bidder. This should be the same + * one as is used in the call to registerBidAdapter + * @property {string[]} [aliases] A list of aliases which should also resolve to this bidder. + * @property {MediaType[]} [supportedMediaTypes] A list of Media Types which the adapter supports. + * @property {function(object): boolean} isBidRequestValid Determines whether or not the given bid has all the params + * needed to make a valid request. + * @property {function(BidRequest[], bidderRequest): ServerRequest|ServerRequest[]} buildRequests Build the request to the Server + * which requests Bids for the given array of Requests. Each BidRequest in the argument array is guaranteed to have + * passed the isBidRequestValid() test. + * @property {function(ServerResponse, BidRequest): Bid[]} interpretResponse Given a successful response from the Server, + * interpret it and return the Bid objects. This function will be run inside a try/catch. + * If it throws any errors, your bids will be discarded. + * @property {function(SyncOptions, ServerResponse[]): UserSync[]} [getUserSyncs] Given an array of all the responses + * from the server, determine which user syncs should occur. The argument array will contain every element + * which has been sent through to interpretResponse. The order of syncs in this array matters. The most + * important ones should come first, since publishers may limit how many are dropped on their page. + * @property {function(object): object} transformBidParams Updates bid params before creating bid request + }} + */ + +/** + * @typedef {object} BidRequest + * + * @property {string} bidId A string which uniquely identifies this BidRequest in the current Auction. + * @property {object} params Any bidder-specific params which the publisher used in their bid request. + */ + +/** + * @typedef {object} BidderAuctionResponse An object encapsulating an adapter response for current Auction + * + * @property {Array} bids? Contextual bids returned by this adapter, if any + * @property {Array<{bidId: String, config: {}}>} paapiAuctionConfigs? Array of paapi auction configs, each scoped to a particular bidId + */ + +/** + * @typedef {object} ServerRequest + * + * @property {('GET'|'POST')} method The type of request which this is. + * @property {string} url The endpoint for the request. For example, "//bids.example.com". + * @property {string|object} data Data to be sent in the request. + * @property {object} options Content-Type set in the header of the bid request, overrides default 'text/plain'. + * If this is a GET request, they'll become query params. If it's a POST request, they'll be added to the body. + * Strings will be added as-is. Objects will be unpacked into query params based on key/value mappings, or + * JSON-serialized into the Request body. + */ + +/** + * @typedef {object} ServerResponse + * + * @property {*} body The response body. If this is legal JSON, then it will be parsed. Otherwise it'll be a + * string with the body's content. + * @property {{get: function(string): string}} headers The response headers. + * Call this like `ServerResponse.headers.get("Content-Type")` + */ + +/** + * @typedef {object} Bid + * + * @property {string} requestId The specific BidRequest which this bid is aimed at. + * This should match the BidRequest.bidId which this Bid targets. + * @property {string} ad A URL which can be used to load this ad, if it's chosen by the publisher. + * @property {string} currency The currency code for the cpm value + * @property {number} cpm The bid price, in US cents per thousand impressions. + * @property {number} ttl Time-to-live - how long (in seconds) Prebid can use this bid. + * @property {boolean} netRevenue Boolean defining whether the bid is Net or Gross. The default is true (Net). + * @property {number} height The height of the ad, in pixels. + * @property {number} width The width of the ad, in pixels. + * + * @property {object} [native] Object for storing native creative assets + * @property {object} [video] Object for storing video response data + * @property {object} [meta] Object for storing bid meta data + * @property {string} [meta.primaryCatId] The IAB primary category ID + * @property {Renderer} renderer A Renderer which can be used as a default for this bid, + * if the publisher doesn't override it. This is only relevant for Outstream Video bids. + */ + +/** + * @typedef {Object} SyncOptions + * + * An object containing information about usersyncs which the adapter should obey. + * + * @property {boolean} iframeEnabled True if iframe usersyncs are allowed, and false otherwise + * @property {boolean} pixelEnabled True if image usersyncs are allowed, and false otherwise + */ + +/** + * TODO: Move this to the UserSync module after that PR is merged. + * + * @typedef {object} UserSync + * + * @property {('image'|'iframe')} type The type of user sync to be done. + * @property {string} url The URL which makes the sync happen. + */ + +// common params for all mediaTypes +const COMMON_BID_RESPONSE_KEYS = ['cpm', 'ttl', 'creativeId', 'netRevenue', 'currency']; +const TIDS = ['auctionId', 'transactionId']; + +/** + * Register a bidder with prebid, using the given spec. + * + * If possible, Adapter modules should use this function instead of adapterManager.registerBidAdapter(). + * + * @param {BidderSpec} spec An object containing the bare-bones functions we need to make a Bidder. + */ +function registerBidder(spec) { + const mediaTypes = Array.isArray(spec.supportedMediaTypes) ? { + supportedMediaTypes: spec.supportedMediaTypes + } : undefined; + function putBidder(spec) { + const bidder = newBidder(spec); + _adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"].registerBidAdapter(bidder, spec.code, mediaTypes); + } + putBidder(spec); + if (Array.isArray(spec.aliases)) { + spec.aliases.forEach(alias => { + let aliasCode = alias; + let gvlid; + let skipPbsAliasing; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(alias)) { + aliasCode = alias.code; + gvlid = alias.gvlid; + skipPbsAliasing = alias.skipPbsAliasing; + } + _adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"].aliasRegistry[aliasCode] = spec.code; + putBidder(Object.assign({}, spec, { + code: aliasCode, + gvlid, + skipPbsAliasing + })); + }); + } +} +const guardTids = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.memoize)(_ref => { + let { + bidderCode + } = _ref; + if ((0,_activities_rules_js__WEBPACK_IMPORTED_MODULE_2__.isActivityAllowed)(_activities_activities_js__WEBPACK_IMPORTED_MODULE_3__.ACTIVITY_TRANSMIT_TID, (0,_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_4__.activityParams)(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER, bidderCode))) { + return { + bidRequest: br => br, + bidderRequest: br => br + }; + } + function get(target, prop, receiver) { + if (TIDS.includes(prop)) { + return null; + } + return Reflect.get(target, prop, receiver); + } + function privateAccessProxy(target, handler) { + const proxy = new Proxy(target, handler); + // always allow methods (such as getFloor) private access to TIDs + Object.entries(target).filter(_ref2 => { + let [_, v] = _ref2; + return typeof v === 'function'; + }).forEach(_ref3 => { + let [prop, fn] = _ref3; + return proxy[prop] = fn.bind(target); + }); + return proxy; + } + const bidRequest = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.memoize)(br => privateAccessProxy(br, { + get + }), arg => arg.bidId); + /** + * Return a view on bidd(er) requests where auctionId/transactionId are nulled if the bidder is not allowed `transmitTid`. + * + * Because both auctionId and transactionId are used for Prebid's own internal bookkeeping, we cannot simply erase them + * from request objects; and because request objects are quite complex and not easily cloneable, we hide the IDs + * with a proxy instead. This should be used only around the adapter logic. + */ + return { + bidRequest, + bidderRequest: br => privateAccessProxy(br, { + get(target, prop, receiver) { + if (prop === 'bids') return br.bids.map(bidRequest); + return get(target, prop, receiver); + } + }) + }; +}); + +/** + * Make a new bidder from the given spec. This is exported mainly for testing. + * Adapters will probably find it more convenient to use registerBidder instead. + * + * @param {BidderSpec} spec + */ +function newBidder(spec) { + return Object.assign(new _adapter_js__WEBPACK_IMPORTED_MODULE_6__["default"](spec.code), { + getSpec: function () { + return Object.freeze(Object.assign({}, spec)); + }, + registerSyncs, + callBids: function (bidderRequest, addBidResponse, done, ajax, onTimelyResponse, configEnabledCallback) { + if (!Array.isArray(bidderRequest.bids)) { + return; + } + const tidGuard = guardTids(bidderRequest); + const adUnitCodesHandled = {}; + function addBidWithCode(adUnitCode, bid) { + const metrics = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_7__.useMetrics)(bid.metrics); + metrics.checkpoint('addBidResponse'); + adUnitCodesHandled[adUnitCode] = true; + if (metrics.measureTime('addBidResponse.validate', () => isValid(adUnitCode, bid))) { + addBidResponse(adUnitCode, bid); + } else { + addBidResponse.reject(adUnitCode, bid, _constants_js__WEBPACK_IMPORTED_MODULE_8__.REJECTION_REASON.INVALID); + } + } + + // After all the responses have come back, call done() and + // register any required usersync pixels. + const responses = []; + function afterAllResponses() { + done(); + _config_js__WEBPACK_IMPORTED_MODULE_9__.config.runWithBidder(spec.code, () => { + _events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_8__.EVENTS.BIDDER_DONE, bidderRequest); + registerSyncs(responses, bidderRequest.gdprConsent, bidderRequest.uspConsent, bidderRequest.gppConsent); + }); + } + const validBidRequests = adapterMetrics(bidderRequest).measureTime('validate', () => bidderRequest.bids.filter(br => filterAndWarn(tidGuard.bidRequest(br)))); + if (validBidRequests.length === 0) { + afterAllResponses(); + return; + } + const bidRequestMap = {}; + validBidRequests.forEach(bid => { + bidRequestMap[bid.bidId] = bid; + // Delete this once we are 1.0 + if (!bid.adUnitCode) { + bid.adUnitCode = bid.placementCode; + } + }); + processBidderRequests(spec, validBidRequests, bidderRequest, ajax, configEnabledCallback, { + onRequest: requestObject => _events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_8__.EVENTS.BEFORE_BIDDER_HTTP, bidderRequest, requestObject), + onResponse: resp => { + onTimelyResponse(spec.code); + responses.push(resp); + }, + onPaapi: paapiConfig => { + const bidRequest = bidRequestMap[paapiConfig.bidId]; + if (bidRequest) { + addPaapiConfig(bidRequest, paapiConfig); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Received fledge auction configuration for an unknown bidId', paapiConfig); + } + }, + // If the server responds with an error, there's not much we can do beside logging. + onError: (errorMessage, error) => { + if (!error.timedOut) { + onTimelyResponse(spec.code); + } + _adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"].callBidderError(spec.code, error, bidderRequest); + _events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_8__.EVENTS.BIDDER_ERROR, { + error, + bidderRequest + }); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Server call for ${spec.code} failed: ${errorMessage} ${error.status}. Continuing without bids.`, { + bidRequests: validBidRequests + }); + }, + onBid: bid => { + const bidRequest = bidRequestMap[bid.requestId]; + if (bidRequest) { + bid.adapterCode = bidRequest.bidder; + if (isInvalidAlternateBidder(bid.bidderCode, bidRequest.bidder)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${bid.bidderCode} is not a registered partner or known bidder of ${bidRequest.bidder}, hence continuing without bid. If you wish to support this bidder, please mark allowAlternateBidderCodes as true in bidderSettings.`); + addBidResponse.reject(bidRequest.adUnitCode, bid, _constants_js__WEBPACK_IMPORTED_MODULE_8__.REJECTION_REASON.BIDDER_DISALLOWED); + return; + } + // creating a copy of original values as cpm and currency are modified later + bid.originalCpm = bid.cpm; + bid.originalCurrency = bid.currency; + bid.meta = bid.meta || Object.assign({}, bid[bidRequest.bidder]); + bid.deferBilling = bidRequest.deferBilling; + bid.deferRendering = bid.deferBilling && (bid.deferRendering ?? typeof spec.onBidBillable !== 'function'); + const prebidBid = Object.assign((0,_bidfactory_js__WEBPACK_IMPORTED_MODULE_11__.createBid)(_constants_js__WEBPACK_IMPORTED_MODULE_8__.STATUS.GOOD, bidRequest), bid, (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(bidRequest, TIDS)); + addBidWithCode(bidRequest.adUnitCode, prebidBid); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Bidder ${spec.code} made bid for unknown request ID: ${bid.requestId}. Ignoring.`); + addBidResponse.reject(null, bid, _constants_js__WEBPACK_IMPORTED_MODULE_8__.REJECTION_REASON.INVALID_REQUEST_ID); + } + }, + onCompletion: afterAllResponses + }); + } + }); + function isInvalidAlternateBidder(responseBidder, requestBidder) { + let allowAlternateBidderCodes = _bidderSettings_js__WEBPACK_IMPORTED_MODULE_12__.bidderSettings.get(requestBidder, 'allowAlternateBidderCodes') || false; + let alternateBiddersList = _bidderSettings_js__WEBPACK_IMPORTED_MODULE_12__.bidderSettings.get(requestBidder, 'allowedAlternateBidderCodes'); + if (!!responseBidder && !!requestBidder && requestBidder !== responseBidder) { + alternateBiddersList = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(alternateBiddersList) ? alternateBiddersList.map(val => val.trim().toLowerCase()).filter(val => !!val).filter(_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques) : alternateBiddersList; + if (!allowAlternateBidderCodes || (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(alternateBiddersList) && alternateBiddersList[0] !== '*' && !alternateBiddersList.includes(responseBidder)) { + return true; + } + } + return false; + } + function registerSyncs(responses, gdprConsent, uspConsent, gppConsent) { + registerSyncInner(spec, responses, gdprConsent, uspConsent, gppConsent); + } + function filterAndWarn(bid) { + if (!spec.isBidRequestValid(bid)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Invalid bid sent to bidder ${spec.code}: ${JSON.stringify(bid)}`); + return false; + } + return true; + } +} +const RESPONSE_PROPS = ['bids', 'paapi']; + +/** + * Run a set of bid requests - that entails converting them to HTTP requests, sending + * them over the network, and parsing the responses. + * + * @param spec bid adapter spec + * @param bids bid requests to run + * @param bidderRequest the bid request object that `bids` is connected to + * @param ajax ajax method to use + * @param wrapCallback {function(callback)} a function used to wrap every callback (for the purpose of `config.currentBidder`) + * @param onRequest {function({})} invoked once for each HTTP request built by the adapter - with the raw request + * @param onResponse {function({})} invoked once on each successful HTTP response - with the raw response + * @param onError {function(String, {})} invoked once for each HTTP error - with status code and response + * @param onBid {function({})} invoked once for each bid in the response - with the bid as returned by interpretResponse + * @param onCompletion {function()} invoked once when all bid requests have been processed + */ +const processBidderRequests = (0,_hook_js__WEBPACK_IMPORTED_MODULE_13__.hook)('async', function (spec, bids, bidderRequest, ajax, wrapCallback, _ref4) { + let { + onRequest, + onResponse, + onPaapi, + onError, + onBid, + onCompletion + } = _ref4; + const metrics = adapterMetrics(bidderRequest); + onCompletion = metrics.startTiming('total').stopBefore(onCompletion); + const tidGuard = guardTids(bidderRequest); + let requests = metrics.measureTime('buildRequests', () => spec.buildRequests(bids.map(tidGuard.bidRequest), tidGuard.bidderRequest(bidderRequest))); + if (!requests || requests.length === 0) { + onCompletion(); + return; + } + if (!Array.isArray(requests)) { + requests = [requests]; + } + const requestDone = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.delayExecution)(onCompletion, requests.length); + requests.forEach(request => { + const requestMetrics = metrics.fork(); + function addBid(bid) { + if (bid != null) bid.metrics = requestMetrics.fork().renameWith(); + onBid(bid); + } + // If the server responds successfully, use the adapter code to unpack the Bids from it. + // If the adapter code fails, no bids should be added. After all the bids have been added, + // make sure to call the `requestDone` function so that we're one step closer to calling onCompletion(). + const onSuccess = wrapCallback(function (response, responseObj) { + networkDone(); + try { + response = JSON.parse(response); + } catch (e) {/* response might not be JSON... that's ok. */} + + // Make response headers available for #1742. These are lazy-loaded because most adapters won't need them. + response = { + body: response, + headers: headerParser(responseObj) + }; + onResponse(response); + try { + response = requestMetrics.measureTime('interpretResponse', () => spec.interpretResponse(response, request)); + } catch (err) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Bidder ${spec.code} failed to interpret the server's response. Continuing without bids`, null, err); + requestDone(); + return; + } + + // adapters can reply with: + // a single bid + // an array of bids + // a BidderAuctionResponse object + + let bids, paapiConfigs; + if (response && !Object.keys(response).some(key => !RESPONSE_PROPS.includes(key))) { + bids = response.bids; + paapiConfigs = response.paapi; + } else { + bids = response; + } + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(paapiConfigs)) { + paapiConfigs.forEach(onPaapi); + } + if (bids) { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bids)) { + bids.forEach(addBid); + } else { + addBid(bids); + } + } + requestDone(); + function headerParser(xmlHttpResponse) { + return { + get: responseObj.getResponseHeader.bind(responseObj) + }; + } + }); + const onFailure = wrapCallback(function (errorMessage, error) { + networkDone(); + onError(errorMessage, error); + requestDone(); + }); + onRequest(request); + const networkDone = requestMetrics.startTiming('net'); + function getOptions(defaults) { + const ro = request.options; + return Object.assign(defaults, ro, { + browsingTopics: ro?.hasOwnProperty('browsingTopics') && !ro.browsingTopics ? false : (_bidderSettings_js__WEBPACK_IMPORTED_MODULE_12__.bidderSettings.get(spec.code, 'topicsHeader') ?? true) && (0,_activities_rules_js__WEBPACK_IMPORTED_MODULE_2__.isActivityAllowed)(_activities_activities_js__WEBPACK_IMPORTED_MODULE_3__.ACTIVITY_TRANSMIT_UFPD, (0,_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_4__.activityParams)(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER, spec.code)) + }); + } + switch (request.method) { + case 'GET': + ajax(`${request.url}${formatGetParameters(request.data)}`, { + success: onSuccess, + error: onFailure + }, undefined, getOptions({ + method: 'GET', + withCredentials: true + })); + break; + case 'POST': + const enableGZipCompression = request.options?.endpointCompression; + const debugMode = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.getParameterByName)(_constants_js__WEBPACK_IMPORTED_MODULE_8__.DEBUG_MODE).toUpperCase() === 'TRUE' || (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.debugTurnedOn)(); + const callAjax = _ref5 => { + let { + url, + payload + } = _ref5; + ajax(url, { + success: onSuccess, + error: onFailure + }, payload, getOptions({ + method: 'POST', + contentType: 'text/plain', + withCredentials: true + })); + }; + if (enableGZipCompression && debugMode) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Skipping GZIP compression for ${spec.code} as debug mode is enabled`); + } + if (enableGZipCompression && !debugMode && (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isGzipCompressionSupported)()) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.compressDataWithGZip)(request.data).then(compressedPayload => { + const url = new URL(request.url, window.location.origin); + if (!url.searchParams.has('gzip')) { + url.searchParams.set('gzip', '1'); + } + callAjax({ + url: url.href, + payload: compressedPayload + }); + }); + } else { + callAjax({ + url: request.url, + payload: typeof request.data === 'string' ? request.data : JSON.stringify(request.data) + }); + } + break; + default: + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Skipping invalid request from ${spec.code}. Request type ${request.type} must be GET or POST`); + requestDone(); + } + function formatGetParameters(data) { + if (data) { + return `?${typeof data === 'object' ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseQueryStringParameters)(data) : data}`; + } + return ''; + } + }); +}, 'processBidderRequests'); +const registerSyncInner = (0,_hook_js__WEBPACK_IMPORTED_MODULE_13__.hook)('async', function (spec, responses, gdprConsent, uspConsent, gppConsent) { + const aliasSyncEnabled = _config_js__WEBPACK_IMPORTED_MODULE_9__.config.getConfig('userSync.aliasSyncEnabled'); + if (spec.getUserSyncs && (aliasSyncEnabled || !_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"].aliasRegistry[spec.code])) { + let syncs = spec.getUserSyncs({ + iframeEnabled: _userSync_js__WEBPACK_IMPORTED_MODULE_14__.userSync.canBidderRegisterSync('iframe', spec.code), + pixelEnabled: _userSync_js__WEBPACK_IMPORTED_MODULE_14__.userSync.canBidderRegisterSync('image', spec.code) + }, responses, gdprConsent, uspConsent, gppConsent); + if (syncs) { + if (!Array.isArray(syncs)) { + syncs = [syncs]; + } + syncs.forEach(sync => { + _userSync_js__WEBPACK_IMPORTED_MODULE_14__.userSync.registerSync(sync.type, spec.code, sync.url); + }); + _userSync_js__WEBPACK_IMPORTED_MODULE_14__.userSync.bidderDone(spec.code); + } + } +}, 'registerSyncs'); +const addPaapiConfig = (0,_hook_js__WEBPACK_IMPORTED_MODULE_13__.hook)('sync', (request, paapiConfig) => {}, 'addPaapiConfig'); + +// check that the bid has a width and height set +function validBidSize(adUnitCode, bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_15__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if ((bid.width || parseInt(bid.width, 10) === 0) && (bid.height || parseInt(bid.height, 10) === 0)) { + bid.width = parseInt(bid.width, 10); + bid.height = parseInt(bid.height, 10); + return true; + } + if (bid.wratio != null && bid.hratio != null) { + bid.wratio = parseInt(bid.wratio, 10); + bid.hratio = parseInt(bid.hratio, 10); + return true; + } + const bidRequest = index.getBidRequest(bid); + const mediaTypes = index.getMediaTypes(bid); + const sizes = bidRequest && bidRequest.sizes || mediaTypes && mediaTypes.banner && mediaTypes.banner.sizes; + const parsedSizes = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(sizes); + + // if a banner impression has one valid size, we assign that size to any bid + // response that does not explicitly set width or height + if (parsedSizes.length === 1) { + const [width, height] = parsedSizes[0].split('x'); + bid.width = parseInt(width, 10); + bid.height = parseInt(height, 10); + return true; + } + return false; +} + +// Validate the arguments sent to us by the adapter. If this returns false, the bid should be totally ignored. +function isValid(adUnitCode, bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_15__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + function hasValidKeys() { + let bidKeys = Object.keys(bid); + return COMMON_BID_RESPONSE_KEYS.every(key => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_16__.includes)(bidKeys, key) && !(0,_polyfill_js__WEBPACK_IMPORTED_MODULE_16__.includes)([undefined, null], bid[key])); + } + function errorMessage(msg) { + return `Invalid bid from ${bid.bidderCode}. Ignoring bid: ${msg}`; + } + if (!adUnitCode) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('No adUnitCode was supplied to addBidResponse.'); + return false; + } + if (!bid) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Some adapter tried to add an undefined bid for ${adUnitCode}.`); + return false; + } + if (!hasValidKeys()) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage(`Bidder ${bid.bidderCode} is missing required params. Check http://prebid.org/dev-docs/bidder-adapter-1.html for list of params.`)); + return false; + } + if ( true && bid.mediaType === 'native' && !(0,_native_js__WEBPACK_IMPORTED_MODULE_17__.nativeBidIsValid)(bid, { + index + })) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage('Native bid missing some required properties.')); + return false; + } + if ( true && bid.mediaType === 'video' && !(0,_video_js__WEBPACK_IMPORTED_MODULE_18__.isValidVideoBid)(bid, { + index + })) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage(`Video bid does not have required vastUrl or renderer property`)); + return false; + } + if (bid.mediaType === 'banner' && !validBidSize(adUnitCode, bid, { + index + })) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage(`Banner bids require a width and height`)); + return false; + } + return true; +} +function adapterMetrics(bidderRequest) { + return (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_7__.useMetrics)(bidderRequest.metrics).renameWith(n => [`adapter.client.${n}`, `adapters.client.${bidderRequest.bidderCode}.${n}`]); +} + +/***/ }), + +/***/ "./src/adloader.js": +/*!*************************!*\ + !*** ./src/adloader.js ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ loadExternalScript: () => (/* binding */ loadExternalScript) +/* harmony export */ }); +/* harmony import */ var _activities_activities_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _activities_activityParams_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _activities_rules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); + + + + + +const _requestCache = new WeakMap(); +// The below list contains modules or vendors whom Prebid allows to load external JS. +const _approvedLoadExternalJSList = [ +// Prebid maintained modules: +'debugging', 'outstream', +// RTD modules: +'aaxBlockmeter', 'adagio', 'adloox', 'akamaidap', 'arcspan', 'airgrid', 'browsi', 'brandmetrics', 'clean.io', 'humansecurity', 'confiant', 'contxtful', 'hadron', 'mediafilter', 'medianet', 'azerionedge', 'a1Media', 'geoedge', 'qortex', 'dynamicAdBoost', '51Degrees', 'symitridap', 'wurfl', 'nodalsAi', 'anonymised', 'optable', +// UserId Submodules +'justtag', 'tncId', 'ftrackId', 'id5']; + +/** + * Loads external javascript. Can only be used if external JS is approved by Prebid. See https://github.com/prebid/prebid-js-external-js-template#policy + * Each unique URL will be loaded at most 1 time. + * @param {string} url the url to load + * @param {string} moduleType moduleType of the module requesting this resource + * @param {string} moduleCode bidderCode or module code of the module requesting this resource + * @param {function} [callback] callback function to be called after the script is loaded + * @param {Document} [doc] the context document, in which the script will be loaded, defaults to loaded document + * @param {object} attributes an object of attributes to be added to the script with setAttribute by [key] and [value]; Only the attributes passed in the first request of a url will be added. + */ +function loadExternalScript(url, moduleType, moduleCode, callback, doc, attributes) { + if (!(0,_activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.isActivityAllowed)(_activities_activities_js__WEBPACK_IMPORTED_MODULE_1__.LOAD_EXTERNAL_SCRIPT, (0,_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_2__.activityParams)(moduleType, moduleCode))) { + return; + } + if (!moduleCode || !url) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('cannot load external script without url and moduleCode'); + return; + } + if (!(0,_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)(_approvedLoadExternalJSList, moduleCode)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${moduleCode} not whitelisted for loading external JavaScript`); + return; + } + if (!doc) { + doc = document; // provide a "valid" key for the WeakMap + } + // only load each asset once + const storedCachedObject = getCacheObject(doc, url); + if (storedCachedObject) { + if (callback && typeof callback === 'function') { + if (storedCachedObject.loaded) { + // invokeCallbacks immediately + callback(); + } else { + // queue the callback + storedCachedObject.callbacks.push(callback); + } + } + return storedCachedObject.tag; + } + const cachedDocObj = _requestCache.get(doc) || {}; + const cacheObject = { + loaded: false, + tag: null, + callbacks: [] + }; + cachedDocObj[url] = cacheObject; + _requestCache.set(doc, cachedDocObj); + if (callback && typeof callback === 'function') { + cacheObject.callbacks.push(callback); + } + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`module ${moduleCode} is loading external JavaScript`); + return requestResource(url, function () { + cacheObject.loaded = true; + try { + for (let i = 0; i < cacheObject.callbacks.length; i++) { + cacheObject.callbacks[i](); + } + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Error executing callback', 'adloader.js:loadExternalScript', e); + } + }, doc, attributes); + function requestResource(tagSrc, callback, doc, attributes) { + if (!doc) { + doc = document; + } + var jptScript = doc.createElement('script'); + jptScript.type = 'text/javascript'; + jptScript.async = true; + const cacheObject = getCacheObject(doc, url); + if (cacheObject) { + cacheObject.tag = jptScript; + } + if (jptScript.readyState) { + jptScript.onreadystatechange = function () { + if (jptScript.readyState === 'loaded' || jptScript.readyState === 'complete') { + jptScript.onreadystatechange = null; + callback(); + } + }; + } else { + jptScript.onload = function () { + callback(); + }; + } + jptScript.src = tagSrc; + if (attributes) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.setScriptAttributes)(jptScript, attributes); + } + + // add the new script tag to the page + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.insertElement)(jptScript, doc); + return jptScript; + } + function getCacheObject(doc, url) { + const cachedDocObj = _requestCache.get(doc); + if (cachedDocObj && cachedDocObj[url]) { + return cachedDocObj[url]; + } + return null; // return new cache object? + } +} +; + +/***/ }), + +/***/ "./src/adserver.js": +/*!*************************!*\ + !*** ./src/adserver.js ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getPPID: () => (/* binding */ getPPID) +/* harmony export */ }); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); + + +/** + * return the GAM PPID, if available (eid for the userID configured with `userSync.ppidSource`) + */ +const getPPID = (0,_hook_js__WEBPACK_IMPORTED_MODULE_0__.hook)('sync', () => undefined); + +/***/ }), + +/***/ "./src/ajax.js": +/*!*********************!*\ + !*** ./src/ajax.js ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ajax: () => (/* binding */ ajax), +/* harmony export */ ajaxBuilder: () => (/* binding */ ajaxBuilder), +/* harmony export */ fetch: () => (/* binding */ fetch), +/* harmony export */ sendBeacon: () => (/* binding */ sendBeacon) +/* harmony export */ }); +/* unused harmony exports dep, toFetchRequest, fetcherFactory, attachCallbacks */ +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); + + +const dep = { + fetch: window.fetch.bind(window), + makeRequest: (r, o) => new Request(r, o), + timeout(timeout, resource) { + const ctl = new AbortController(); + let cancelTimer = setTimeout(() => { + ctl.abort(); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`Request timeout after ${timeout}ms`, resource); + cancelTimer = null; + }, timeout); + return { + signal: ctl.signal, + done() { + cancelTimer && clearTimeout(cancelTimer); + } + }; + } +}; +const GET = 'GET'; +const POST = 'POST'; +const CTYPE = 'Content-Type'; + +/** + * transform legacy `ajax` parameters into a fetch request. + * @returns {Request} + */ +function toFetchRequest(url, data) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const method = options.method || (data ? POST : GET); + if (method === GET && data) { + const urlInfo = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseUrl)(url, options); + Object.assign(urlInfo.search, data); + url = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.buildUrl)(urlInfo); + } + const headers = new Headers(options.customHeaders); + headers.set(CTYPE, options.contentType || 'text/plain'); + const rqOpts = { + method, + headers + }; + if (method !== GET && data) { + rqOpts.body = data; + } + if (options.withCredentials) { + rqOpts.credentials = 'include'; + } + if (isSecureContext) { + ['browsingTopics', 'adAuctionHeaders'].forEach(opt => { + // the Request constructor will throw an exception if the browser supports topics/fledge + // but we're not in a secure context + if (options[opt]) { + rqOpts[opt] = true; + } + }); + } + if (options.keepalive) { + rqOpts.keepalive = true; + } + return dep.makeRequest(url, rqOpts); +} + +/** + * Return a version of `fetch` that automatically cancels requests after `timeout` milliseconds. + * + * If provided, `request` and `done` should be functions accepting a single argument. + * `request` is invoked at the beginning of each request, and `done` at the end; both are passed its origin. + * + * @returns {function(*, {}?): Promise} + */ +function fetcherFactory() { + let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3000; + let { + request, + done + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let fetcher = (resource, options) => { + let to; + if (timeout != null && options?.signal == null && !_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('disableAjaxTimeout')) { + to = dep.timeout(timeout, resource); + options = Object.assign({ + signal: to.signal + }, options); + } + let pm = dep.fetch(resource, options); + if (to?.done != null) pm = pm.finally(to.done); + return pm; + }; + if (request != null || done != null) { + fetcher = (fetch => function (resource, options) { + const origin = new URL(resource?.url == null ? resource : resource.url, document.location).origin; + let req = fetch(resource, options); + request && request(origin); + if (done) req = req.finally(() => done(origin)); + return req; + })(fetcher); + } + return fetcher; +} +function toXHR(_ref, responseText) { + let { + status, + statusText = '', + headers, + url + } = _ref; + let xml = 0; + function getXML(onError) { + if (xml === 0) { + try { + xml = new DOMParser().parseFromString(responseText, headers?.get(CTYPE)?.split(';')?.[0]); + } catch (e) { + xml = null; + onError && onError(e); + } + } + return xml; + } + return { + // eslint-disable-next-line no-restricted-globals + readyState: XMLHttpRequest.DONE, + status, + statusText, + responseText, + response: responseText, + responseType: '', + responseURL: url, + get responseXML() { + return getXML(_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError); + }, + getResponseHeader: header => headers?.has(header) ? headers.get(header) : null, + toJSON() { + return Object.assign({ + responseXML: getXML() + }, this); + }, + timedOut: false + }; +} + +/** + * attach legacy `ajax` callbacks to a fetch promise. + */ +function attachCallbacks(fetchPm, callback) { + const { + success, + error + } = typeof callback === 'object' && callback != null ? callback : { + success: typeof callback === 'function' ? callback : () => null, + error: (e, x) => (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Network error', e, x) + }; + return fetchPm.then(response => response.text().then(responseText => [response, responseText])).then(_ref2 => { + let [response, responseText] = _ref2; + const xhr = toXHR(response, responseText); + response.ok || response.status === 304 ? success(responseText, xhr) : error(response.statusText, xhr); + }, reason => error('', Object.assign(toXHR({ + status: 0 + }, ''), { + reason, + timedOut: reason?.name === 'AbortError' + }))); +} +function ajaxBuilder() { + let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3000; + let { + request, + done + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const fetcher = fetcherFactory(timeout, { + request, + done + }); + return function (url, callback, data) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + attachCallbacks(fetcher(toFetchRequest(url, data, options)), callback); + }; +} + +/** + * simple wrapper around sendBeacon such that invocations of navigator.sendBeacon can be centrally maintained. + * verifies that the navigator and sendBeacon are defined for maximum compatibility + * @param {string} url The URL that will receive the data. Can be relative or absolute. + * @param {*} data An ArrayBuffer, a TypedArray, a DataView, a Blob, a string literal or object, a FormData or a URLSearchParams object containing the data to send. + * @returns {boolean} true if the user agent successfully queued the data for transfer. Otherwise, it returns false. + */ +function sendBeacon(url, data) { + if (!window.navigator || !window.navigator.sendBeacon) { + return false; + } + return window.navigator.sendBeacon(url, data); +} +const ajax = ajaxBuilder(); +const fetch = fetcherFactory(); + +/***/ }), + +/***/ "./src/auction.js": +/*!************************!*\ + !*** ./src/auction.js ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AUCTION_COMPLETED: () => (/* binding */ AUCTION_COMPLETED), +/* harmony export */ AUCTION_IN_PROGRESS: () => (/* binding */ AUCTION_IN_PROGRESS), +/* harmony export */ addBidResponse: () => (/* binding */ addBidResponse), +/* harmony export */ addBidToAuction: () => (/* binding */ addBidToAuction), +/* harmony export */ addBidderRequests: () => (/* binding */ addBidderRequests), +/* harmony export */ callPrebidCache: () => (/* binding */ callPrebidCache), +/* harmony export */ getPriceByGranularity: () => (/* binding */ getPriceByGranularity), +/* harmony export */ getPriceGranularity: () => (/* binding */ getPriceGranularity), +/* harmony export */ getStandardBidderSettings: () => (/* binding */ getStandardBidderSettings), +/* harmony export */ newAuction: () => (/* binding */ newAuction) +/* harmony export */ }); +/* unused harmony exports AUCTION_STARTED, resetAuctionState, responsesReady, bidsBackCallback, auctionCallbacks, getMediaTypeGranularity, getCreativeId, getAdvertiserDomain, getDSP, getPrimaryCatId, getKeyValueTargetingPairs, adjustBids */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./cpmBucketManager.js */ "./src/cpmBucketManager.js"); +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./native.js */ "./src/native.js"); +/* harmony import */ var _videoCache_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./videoCache.js */ "./src/videoCache.js"); +/* harmony import */ var _Renderer_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _userSync_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userSync.js */ "./src/userSync.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _video_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./video.js */ "./src/video.js"); +/* harmony import */ var _mediaTypes_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./events.js */ "./src/events.js"); +/* harmony import */ var _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _utils_cpm_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils/cpm.js */ "./src/utils/cpm.js"); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _utils_ttlCollection_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/ttlCollection.js */ "./src/utils/ttlCollection.js"); +/* harmony import */ var _bidTTL_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bidTTL.js */ "./src/bidTTL.js"); +/** + * Module for auction instances. + * + * In Prebid 0.x, $$PREBID_GLOBAL$$ had _bidsRequested and _bidsReceived as public properties. + * Starting 1.0, Prebid will support concurrent auctions. Each auction instance will store private properties, bidsRequested and bidsReceived. + * + * AuctionManager will create an instance of auction and will store all the auctions. + * + */ + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/config.js').MediaTypePriceGranularity} MediaTypePriceGranularity + * @typedef {import('../src/mediaTypes.js').MediaType} MediaType + */ + +/** + * @typedef {Object} AdUnit An object containing the adUnit configuration. + * + * @property {string} code A code which will be used to uniquely identify this bidder. This should be the same + * one as is used in the call to registerBidAdapter + * @property {Array.} sizes A list of size for adUnit. + * @property {object} params Any bidder-specific params which the publisher used in their bid request. + * This is guaranteed to have passed the spec.areParamsValid() test. + */ + +/** + * @typedef {Array.} size + */ + +/** + * @typedef {Array.} AdUnitCode + */ + +/** + * @typedef {Object} BidderRequest + * + * @property {string} bidderCode - adUnit bidder + * @property {number} auctionId - random UUID + * @property {string} bidderRequestId - random string, unique key set on all bidRequest.bids[] + * @property {Array.} bids + * @property {number} auctionStart - Date.now() at auction start + * @property {number} timeout - callback timeout + * @property {refererInfo} refererInfo - referer info object + * @property {string} [tid] - random UUID (used for s2s) + * @property {string} [src] - s2s or client (used for s2s) + * @property {import('./types/ortb2.js').Ortb2.BidRequest} [ortb2] Global (not specific to any adUnit) first party data to use for all requests in this auction. + */ + +/** + * @typedef {Object} BidReceived + * //TODO add all properties + */ + +/** + * @typedef {Object} Auction + * + * @property {function(): string} getAuctionStatus - returns the auction status which can be any one of 'started', 'in progress' or 'completed' + * @property {function(): AdUnit[]} getAdUnits - return the adUnits for this auction instance + * @property {function(): AdUnitCode[]} getAdUnitCodes - return the adUnitCodes for this auction instance + * @property {function(): BidRequest[]} getBidRequests - get all bid requests for this auction instance + * @property {function(): BidReceived[]} getBidsReceived - get all bid received for this auction instance + * @property {function(): void} startAuctionTimer - sets the bidsBackHandler callback and starts the timer for auction + * @property {function(): void} callBids - sends requests to all adapters for bids + */ + + + + + + + + + + + + + + + + + + + + + + + +const { + syncUsers +} = _userSync_js__WEBPACK_IMPORTED_MODULE_0__.userSync; +const AUCTION_STARTED = 'started'; +const AUCTION_IN_PROGRESS = 'inProgress'; +const AUCTION_COMPLETED = 'completed'; + +// register event for bid adjustment +_events_js__WEBPACK_IMPORTED_MODULE_1__.on(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_ADJUSTMENT, function (bid) { + adjustBids(bid); +}); +const MAX_REQUESTS_PER_ORIGIN = 4; +const outstandingRequests = {}; +const sourceInfo = {}; +const queuedCalls = []; +const pbjsInstance = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)(); + +/** + * Clear global state for tests + */ +function resetAuctionState() { + queuedCalls.length = 0; + [outstandingRequests, sourceInfo].forEach(ob => Object.keys(ob).forEach(k => { + delete ob[k]; + })); +} + +/** + * Creates new auction instance + * + * @param {Object} requestConfig + * @param {AdUnit} requestConfig.adUnits + * @param {AdUnitCode} requestConfig.adUnitCodes + * @param {function():void} requestConfig.callback + * @param {number} requestConfig.cbTimeout + * @param {Array.} requestConfig.labels + * @param {string} requestConfig.auctionId + * @param {{global: {}, bidder: {}}} requestConfig.ortb2Fragments first party data, separated into global + * (from getConfig('ortb2') + requestBids({ortb2})) and bidder (a map from bidderCode to ortb2) + * @param {Object} requestConfig.metrics + * @returns {Auction} auction instance + */ +function newAuction(_ref) { + let { + adUnits, + adUnitCodes, + callback, + cbTimeout, + labels, + auctionId, + ortb2Fragments, + metrics + } = _ref; + metrics = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_4__.useMetrics)(metrics); + const _adUnits = adUnits; + const _labels = labels; + const _adUnitCodes = adUnitCodes; + const _auctionId = auctionId || (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.generateUUID)(); + const _timeout = cbTimeout; + const _timelyRequests = new Set(); + const done = (0,_utils_promise_js__WEBPACK_IMPORTED_MODULE_6__.defer)(); + const requestsDone = (0,_utils_promise_js__WEBPACK_IMPORTED_MODULE_6__.defer)(); + let _bidsRejected = []; + let _callback = callback; + let _bidderRequests = []; + let _bidsReceived = (0,_utils_ttlCollection_js__WEBPACK_IMPORTED_MODULE_7__.ttlCollection)({ + startTime: bid => bid.responseTimestamp, + ttl: bid => (0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_8__.getMinBidCacheTTL)() == null ? null : Math.max((0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_8__.getMinBidCacheTTL)(), bid.ttl) * 1000 + }); + let _noBids = []; + let _winningBids = []; + let _auctionStart; + let _auctionEnd; + let _timeoutTimer; + let _auctionStatus; + let _nonBids = []; + (0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_8__.onMinBidCacheTTLChange)(() => _bidsReceived.refresh()); + function addBidRequests(bidderRequests) { + _bidderRequests = _bidderRequests.concat(bidderRequests); + } + function addBidReceived(bid) { + _bidsReceived.add(bid); + } + function addBidRejected(bidsRejected) { + _bidsRejected = _bidsRejected.concat(bidsRejected); + } + function addNoBid(noBid) { + _noBids = _noBids.concat(noBid); + } + function addNonBids(seatnonbids) { + _nonBids = _nonBids.concat(seatnonbids); + } + function getProperties() { + return { + auctionId: _auctionId, + timestamp: _auctionStart, + auctionEnd: _auctionEnd, + auctionStatus: _auctionStatus, + adUnits: _adUnits, + adUnitCodes: _adUnitCodes, + labels: _labels, + bidderRequests: _bidderRequests, + noBids: _noBids, + bidsReceived: _bidsReceived.toArray(), + bidsRejected: _bidsRejected, + winningBids: _winningBids, + timeout: _timeout, + metrics: metrics, + seatNonBids: _nonBids + }; + } + function startAuctionTimer() { + _timeoutTimer = setTimeout(() => executeCallback(true), _timeout); + } + function executeCallback(timedOut) { + if (!timedOut) { + clearTimeout(_timeoutTimer); + } else { + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AUCTION_TIMEOUT, getProperties()); + } + if (_auctionEnd === undefined) { + let timedOutRequests = []; + if (timedOut) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logMessage)(`Auction ${_auctionId} timedOut`); + timedOutRequests = _bidderRequests.filter(rq => !_timelyRequests.has(rq.bidderRequestId)).flatMap(br => br.bids); + if (timedOutRequests.length) { + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_TIMEOUT, timedOutRequests); + } + } + _auctionStatus = AUCTION_COMPLETED; + _auctionEnd = Date.now(); + metrics.checkpoint('auctionEnd'); + metrics.timeBetween('requestBids', 'auctionEnd', 'requestBids.total'); + metrics.timeBetween('callBids', 'auctionEnd', 'requestBids.callBids'); + done.resolve(); + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AUCTION_END, getProperties()); + bidsBackCallback(_adUnits, function () { + try { + if (_callback != null) { + const bids = _bidsReceived.toArray().filter(bid => _adUnitCodes.includes(bid.adUnitCode)).reduce(groupByPlacement, {}); + _callback.apply(pbjsInstance, [bids, timedOut, _auctionId]); + _callback = null; + } + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Error executing bidsBackHandler', null, e); + } finally { + // Calling timed out bidders + if (timedOutRequests.length) { + _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].callTimedOutBidders(adUnits, timedOutRequests, _timeout); + } + // Only automatically sync if the publisher has not chosen to "enableOverride" + let userSyncConfig = _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('userSync') || {}; + if (!userSyncConfig.enableOverride) { + // Delay the auto sync by the config delay + syncUsers(userSyncConfig.syncDelay); + } + } + }); + } + } + function auctionDone() { + _config_js__WEBPACK_IMPORTED_MODULE_10__.config.resetBidder(); + // when all bidders have called done callback atleast once it means auction is complete + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logInfo)(`Bids Received for Auction with id: ${_auctionId}`, _bidsReceived.toArray()); + _auctionStatus = AUCTION_COMPLETED; + executeCallback(false); + } + function onTimelyResponse(bidderRequestId) { + _timelyRequests.add(bidderRequestId); + } + function callBids() { + _auctionStatus = AUCTION_STARTED; + _auctionStart = Date.now(); + let bidRequests = metrics.measureTime('requestBids.makeRequests', () => _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].makeBidRequests(_adUnits, _auctionStart, _auctionId, _timeout, _labels, ortb2Fragments, metrics)); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logInfo)(`Bids Requested for Auction with id: ${_auctionId}`, bidRequests); + metrics.checkpoint('callBids'); + if (bidRequests.length < 1) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('No valid bid requests returned for auction'); + auctionDone(); + } else { + addBidderRequests.call({ + dispatch: addBidderRequestsCallback, + context: this + }, bidRequests); + } + } + + /** + * callback executed after addBidderRequests completes + * @param {BidRequest[]} bidRequests + */ + function addBidderRequestsCallback(bidRequests) { + bidRequests.forEach(bidRequest => { + addBidRequests(bidRequest); + }); + let requests = {}; + let call = { + bidRequests, + run: () => { + startAuctionTimer(); + _auctionStatus = AUCTION_IN_PROGRESS; + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AUCTION_INIT, getProperties()); + let callbacks = auctionCallbacks(auctionDone, this); + _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].callBids(_adUnits, bidRequests, callbacks.addBidResponse, callbacks.adapterDone, { + request(source, origin) { + increment(outstandingRequests, origin); + increment(requests, source); + if (!sourceInfo[source]) { + sourceInfo[source] = { + SRA: true, + origin + }; + } + if (requests[source] > 1) { + sourceInfo[source].SRA = false; + } + }, + done(origin) { + outstandingRequests[origin]--; + if (queuedCalls[0]) { + if (runIfOriginHasCapacity(queuedCalls[0])) { + queuedCalls.shift(); + } + } + } + }, _timeout, onTimelyResponse, ortb2Fragments); + requestsDone.resolve(); + } + }; + if (!runIfOriginHasCapacity(call)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('queueing auction due to limited endpoint capacity'); + queuedCalls.push(call); + } + function runIfOriginHasCapacity(call) { + let hasCapacity = true; + let maxRequests = _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('maxRequestsPerOrigin') || MAX_REQUESTS_PER_ORIGIN; + call.bidRequests.some(bidRequest => { + let requests = 1; + let source = typeof bidRequest.src !== 'undefined' && bidRequest.src === _constants_js__WEBPACK_IMPORTED_MODULE_2__.S2S.SRC ? 's2s' : bidRequest.bidderCode; + // if we have no previous info on this source just let them through + if (sourceInfo[source]) { + if (sourceInfo[source].SRA === false) { + // some bidders might use more than the MAX_REQUESTS_PER_ORIGIN in a single auction. In those cases + // set their request count to MAX_REQUESTS_PER_ORIGIN so the auction isn't permanently queued waiting + // for capacity for that bidder + requests = Math.min(bidRequest.bids.length, maxRequests); + } + if (outstandingRequests[sourceInfo[source].origin] + requests > maxRequests) { + hasCapacity = false; + } + } + // return only used for terminating this .some() iteration early if it is determined we don't have capacity + return !hasCapacity; + }); + if (hasCapacity) { + call.run(); + } + return hasCapacity; + } + function increment(obj, prop) { + if (typeof obj[prop] === 'undefined') { + obj[prop] = 1; + } else { + obj[prop]++; + } + } + } + function addWinningBid(winningBid) { + _winningBids = _winningBids.concat(winningBid); + _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].callBidWonBidder(winningBid.adapterCode || winningBid.bidder, winningBid, adUnits); + if (!winningBid.deferBilling) { + _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].triggerBilling(winningBid); + } + } + function setBidTargeting(bid) { + _adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].callSetTargetingBidder(bid.adapterCode || bid.bidder, bid); + } + _events_js__WEBPACK_IMPORTED_MODULE_1__.on(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.SEAT_NON_BID, event => { + if (event.auctionId === _auctionId) { + addNonBids(event.seatnonbid); + } + }); + return { + addBidReceived, + addBidRejected, + addNoBid, + callBids, + addWinningBid, + setBidTargeting, + getWinningBids: () => _winningBids, + getAuctionStart: () => _auctionStart, + getAuctionEnd: () => _auctionEnd, + getTimeout: () => _timeout, + getAuctionId: () => _auctionId, + getAuctionStatus: () => _auctionStatus, + getAdUnits: () => _adUnits, + getAdUnitCodes: () => _adUnitCodes, + getBidRequests: () => _bidderRequests, + getBidsReceived: () => _bidsReceived.toArray(), + getNoBids: () => _noBids, + getNonBids: () => _nonBids, + getFPD: () => ortb2Fragments, + getMetrics: () => metrics, + end: done.promise, + requestsDone: requestsDone.promise, + getProperties + }; +} + +/** + * Hook into this to intercept bids before they are added to an auction. + * + * @type {Function} + * @param adUnitCode + * @param bid + * @param {function(String): void} reject a function that, when called, rejects `bid` with the given reason. + */ +const addBidResponse = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.ignoreCallbackArg)((0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function (adUnitCode, bid, reject) { + if (!isValidPrice(bid)) { + reject(_constants_js__WEBPACK_IMPORTED_MODULE_2__.REJECTION_REASON.PRICE_TOO_HIGH); + } else { + this.dispatch.call(null, adUnitCode, bid); + } +}, 'addBidResponse')); + +/** + * Delay hook for adapter responses. + * + * `ready` is a promise; auctions wait for it to resolve before closing. Modules can hook into this + * to delay the end of auctions while they perform initialization that does not need to delay their start. + */ +const responsesReady = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('sync', ready => ready, 'responsesReady'); +const addBidderRequests = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('sync', function (bidderRequests) { + this.dispatch.call(this.context, bidderRequests); +}, 'addBidderRequests'); +const bidsBackCallback = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function (adUnits, callback) { + if (callback) { + callback(); + } +}, 'bidsBackCallback'); +function auctionCallbacks(auctionDone, auctionInstance) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let outstandingBidsAdded = 0; + let allAdapterCalledDone = false; + let bidderRequestsDone = new Set(); + let bidResponseMap = {}; + function afterBidAdded() { + outstandingBidsAdded--; + if (allAdapterCalledDone && outstandingBidsAdded === 0) { + auctionDone(); + } + } + function handleBidResponse(adUnitCode, bid, handler) { + bidResponseMap[bid.requestId] = true; + addCommonResponseProperties(bid, adUnitCode); + outstandingBidsAdded++; + return handler(afterBidAdded); + } + function acceptBidResponse(adUnitCode, bid) { + handleBidResponse(adUnitCode, bid, done => { + let bidResponse = getPreparedBidForAuction(bid); + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_ACCEPTED, bidResponse); + if ( true && bidResponse.mediaType === _mediaTypes_js__WEBPACK_IMPORTED_MODULE_13__.VIDEO) { + tryAddVideoBid(auctionInstance, bidResponse, done); + } else { + if ( true && (0,_native_js__WEBPACK_IMPORTED_MODULE_14__.isNativeResponse)(bidResponse)) { + (0,_native_js__WEBPACK_IMPORTED_MODULE_14__.setNativeResponseProperties)(bidResponse, index.getAdUnit(bidResponse)); + } + addBidToAuction(auctionInstance, bidResponse); + done(); + } + }); + } + function rejectBidResponse(adUnitCode, bid, reason) { + return handleBidResponse(adUnitCode, bid, done => { + bid.rejectionReason = reason; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)(`Bid from ${bid.bidder || 'unknown bidder'} was rejected: ${reason}`, bid); + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_REJECTED, bid); + auctionInstance.addBidRejected(bid); + done(); + }); + } + function adapterDone() { + let bidderRequest = this; + let bidderRequests = auctionInstance.getBidRequests(); + const auctionOptionsConfig = _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('auctionOptions'); + bidderRequestsDone.add(bidderRequest); + if (auctionOptionsConfig && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(auctionOptionsConfig)) { + const secondaryBidders = auctionOptionsConfig.secondaryBidders; + if (secondaryBidders && !bidderRequests.every(bidder => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_15__.includes)(secondaryBidders, bidder.bidderCode))) { + bidderRequests = bidderRequests.filter(request => !(0,_polyfill_js__WEBPACK_IMPORTED_MODULE_15__.includes)(secondaryBidders, request.bidderCode)); + } + } + allAdapterCalledDone = bidderRequests.every(bidderRequest => bidderRequestsDone.has(bidderRequest)); + bidderRequest.bids.forEach(bid => { + if (!bidResponseMap[bid.bidId]) { + auctionInstance.addNoBid(bid); + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.NO_BID, bid); + } + }); + if (allAdapterCalledDone && outstandingBidsAdded === 0) { + auctionDone(); + } + } + return { + addBidResponse: function () { + function addBid(adUnitCode, bid) { + addBidResponse.call({ + dispatch: acceptBidResponse + }, adUnitCode, bid, (() => { + let rejected = false; + return reason => { + if (!rejected) { + rejectBidResponse(adUnitCode, bid, reason); + rejected = true; + } + }; + })()); + } + addBid.reject = rejectBidResponse; + return addBid; + }(), + adapterDone: function () { + responsesReady(_utils_promise_js__WEBPACK_IMPORTED_MODULE_6__.PbPromise.resolve()).finally(() => adapterDone.call(this)); + } + }; +} + +// Add a bid to the auction. +function addBidToAuction(auctionInstance, bidResponse) { + setupBidTargeting(bidResponse); + (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_4__.useMetrics)(bidResponse.metrics).timeSince('addBidResponse', 'addBidResponse.total'); + auctionInstance.addBidReceived(bidResponse); + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_RESPONSE, bidResponse); +} + +// Video bids may fail if the cache is down, or there's trouble on the network. +function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager.index + } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + let addBid = true; + const videoMediaType = index.getMediaTypes({ + requestId: bidResponse.originalRequestId || bidResponse.requestId, + adUnitId: bidResponse.adUnitId + })?.video; + const context = videoMediaType && videoMediaType?.context; + const useCacheKey = videoMediaType && videoMediaType?.useCacheKey; + const { + useLocal, + url: cacheUrl, + ignoreBidderCacheKey + } = _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('cache') || {}; + if (useLocal) { + // stores video bid vast as local blob in the browser + (0,_videoCache_js__WEBPACK_IMPORTED_MODULE_16__.storeLocally)(bidResponse); + } else if (cacheUrl && (useCacheKey || context !== _video_js__WEBPACK_IMPORTED_MODULE_17__.OUTSTREAM)) { + if (!bidResponse.videoCacheKey || ignoreBidderCacheKey) { + addBid = false; + callPrebidCache(auctionInstance, bidResponse, afterBidAdded, videoMediaType); + } else if (!bidResponse.vastUrl) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('videoCacheKey specified but not required vastUrl for video bid'); + addBid = false; + } + } + if (addBid) { + addBidToAuction(auctionInstance, bidResponse); + afterBidAdded(); + } +} +const callPrebidCache = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function (auctionInstance, bidResponse, afterBidAdded, videoMediaType) { + if (true) { + (0,_videoCache_js__WEBPACK_IMPORTED_MODULE_16__.batchAndStore)(auctionInstance, bidResponse, afterBidAdded); + } +}, 'callPrebidCache'); + +/** + * Augment `bidResponse` with properties that are common across all bids - including rejected bids. + * + */ +function addCommonResponseProperties(bidResponse, adUnitCode) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const bidderRequest = index.getBidderRequest(bidResponse); + const adUnit = index.getAdUnit(bidResponse); + const start = bidderRequest && bidderRequest.start || bidResponse.requestTimestamp; + Object.assign(bidResponse, { + responseTimestamp: bidResponse.responseTimestamp || (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.timestamp)(), + requestTimestamp: bidResponse.requestTimestamp || start, + cpm: parseFloat(bidResponse.cpm) || 0, + bidder: bidResponse.bidder || bidResponse.bidderCode, + adUnitCode + }); + if (adUnit?.ttlBuffer != null) { + bidResponse.ttlBuffer = adUnit.ttlBuffer; + } + bidResponse.timeToRespond = bidResponse.responseTimestamp - bidResponse.requestTimestamp; +} + +/** + * Add additional bid response properties that are universal for all _accepted_ bids. + */ +function getPreparedBidForAuction(bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + // Let listeners know that now is the time to adjust the bid, if they want to. + // + // CAREFUL: Publishers rely on certain bid properties to be available (like cpm), + // but others to not be set yet (like priceStrings). See #1372 and #1389. + _events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_ADJUSTMENT, bid); + const adUnit = index.getAdUnit(bid); + bid.instl = adUnit?.ortb2Imp?.instl === 1; + + // a publisher-defined renderer can be used to render bids + const bidRenderer = index.getBidRequest(bid)?.renderer || adUnit.renderer; + + // a publisher can also define a renderer for a mediaType + const bidObjectMediaType = bid.mediaType; + const mediaTypes = index.getMediaTypes(bid); + const bidMediaType = mediaTypes && mediaTypes[bidObjectMediaType]; + var mediaTypeRenderer = bidMediaType && bidMediaType.renderer; + var renderer = null; + + // the renderer for the mediaType takes precendence + if (mediaTypeRenderer && mediaTypeRenderer.render && !(mediaTypeRenderer.backupOnly === true && bid.renderer)) { + renderer = mediaTypeRenderer; + } else if (bidRenderer && bidRenderer.render && !(bidRenderer.backupOnly === true && bid.renderer)) { + renderer = bidRenderer; + } + if (renderer) { + // be aware, an adapter could already have installed the bidder, in which case this overwrite's the existing adapter + bid.renderer = _Renderer_js__WEBPACK_IMPORTED_MODULE_18__.Renderer.install({ + url: renderer.url, + config: renderer.options, + renderNow: renderer.url == null + }); // rename options to config, to make it consistent? + bid.renderer.setRender(renderer.render); + } + + // Use the config value 'mediaTypeGranularity' if it has been defined for mediaType, else use 'customPriceBucket' + const mediaTypeGranularity = getMediaTypeGranularity(bid.mediaType, mediaTypes, _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('mediaTypePriceGranularity')); + const priceStringsObj = (0,_cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_19__.getPriceBucketString)(bid.cpm, typeof mediaTypeGranularity === 'object' ? mediaTypeGranularity : _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('customPriceBucket'), _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('currency.granularityMultiplier')); + bid.pbLg = priceStringsObj.low; + bid.pbMg = priceStringsObj.med; + bid.pbHg = priceStringsObj.high; + bid.pbAg = priceStringsObj.auto; + bid.pbDg = priceStringsObj.dense; + bid.pbCg = priceStringsObj.custom; + return bid; +} +function setupBidTargeting(bidObject) { + let keyValues; + const cpmCheck = _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__.bidderSettings.get(bidObject.bidderCode, 'allowZeroCpmBids') === true ? bidObject.cpm >= 0 : bidObject.cpm > 0; + if (bidObject.bidderCode && (cpmCheck || bidObject.dealId)) { + keyValues = getKeyValueTargetingPairs(bidObject.bidderCode, bidObject); + } + + // use any targeting provided as defaults, otherwise just set from getKeyValueTargetingPairs + bidObject.adserverTargeting = Object.assign(bidObject.adserverTargeting || {}, keyValues); +} + +/** + * @param {MediaType} mediaType + * @param mediaTypes media types map from adUnit + * @param {MediaTypePriceGranularity} [mediaTypePriceGranularity] + * @returns {(Object|string|undefined)} + */ +function getMediaTypeGranularity(mediaType, mediaTypes, mediaTypePriceGranularity) { + if (mediaType && mediaTypePriceGranularity) { + if ( true && mediaType === _mediaTypes_js__WEBPACK_IMPORTED_MODULE_13__.VIDEO) { + const context = mediaTypes?.[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_13__.VIDEO]?.context ?? 'instream'; + if (mediaTypePriceGranularity[`${_mediaTypes_js__WEBPACK_IMPORTED_MODULE_13__.VIDEO}-${context}`]) { + return mediaTypePriceGranularity[`${_mediaTypes_js__WEBPACK_IMPORTED_MODULE_13__.VIDEO}-${context}`]; + } + } + return mediaTypePriceGranularity[mediaType]; + } +} + +/** + * This function returns the price granularity defined. It can be either publisher defined or default value + * @param {Bid} bid bid response object + * @param {object} obj + * @param {object} obj.index + * @returns {string} granularity + */ +const getPriceGranularity = function (bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + // Use the config value 'mediaTypeGranularity' if it has been set for mediaType, else use 'priceGranularity' + const mediaTypeGranularity = getMediaTypeGranularity(bid.mediaType, index.getMediaTypes(bid), _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('mediaTypePriceGranularity')); + const granularity = typeof bid.mediaType === 'string' && mediaTypeGranularity ? typeof mediaTypeGranularity === 'string' ? mediaTypeGranularity : 'custom' : _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('priceGranularity'); + return granularity; +}; + +/** + * This function returns a function to get bid price by price granularity + * @param {string} granularity + * @returns {function} + */ +const getPriceByGranularity = granularity => { + return bid => { + const bidGranularity = granularity || getPriceGranularity(bid); + if (bidGranularity === _constants_js__WEBPACK_IMPORTED_MODULE_2__.GRANULARITY_OPTIONS.AUTO) { + return bid.pbAg; + } else if (bidGranularity === _constants_js__WEBPACK_IMPORTED_MODULE_2__.GRANULARITY_OPTIONS.DENSE) { + return bid.pbDg; + } else if (bidGranularity === _constants_js__WEBPACK_IMPORTED_MODULE_2__.GRANULARITY_OPTIONS.LOW) { + return bid.pbLg; + } else if (bidGranularity === _constants_js__WEBPACK_IMPORTED_MODULE_2__.GRANULARITY_OPTIONS.MEDIUM) { + return bid.pbMg; + } else if (bidGranularity === _constants_js__WEBPACK_IMPORTED_MODULE_2__.GRANULARITY_OPTIONS.HIGH) { + return bid.pbHg; + } else if (bidGranularity === _constants_js__WEBPACK_IMPORTED_MODULE_2__.GRANULARITY_OPTIONS.CUSTOM) { + return bid.pbCg; + } + }; +}; + +/** + * This function returns a function to get crid from bid response + * @returns {function} + */ +const getCreativeId = () => { + return bid => { + return bid.creativeId ? bid.creativeId : ''; + }; +}; + +/** + * This function returns a function to get first advertiser domain from bid response meta + * @returns {function} + */ +const getAdvertiserDomain = () => { + return bid => { + return bid.meta && bid.meta.advertiserDomains && bid.meta.advertiserDomains.length > 0 ? [bid.meta.advertiserDomains].flat()[0] : ''; + }; +}; + +/** + * This function returns a function to get dsp name or id from bid response meta + * @returns {function} + */ +const getDSP = () => { + return bid => { + return bid.meta && (bid.meta.networkId || bid.meta.networkName) ? bid?.meta?.networkName || bid?.meta?.networkId : ''; + }; +}; + +/** + * This function returns a function to get the primary category id from bid response meta + * @returns {function} + */ +const getPrimaryCatId = () => { + return bid => { + return bid.meta && bid.meta.primaryCatId ? bid.meta.primaryCatId : ''; + }; +}; + +// factory for key value objs +function createKeyVal(key, value) { + return { + key, + val: typeof value === 'function' ? function (bidResponse, bidReq) { + return value(bidResponse, bidReq); + } : function (bidResponse) { + return bidResponse[value]; + } + }; +} +function defaultAdserverTargeting() { + return [createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.BIDDER, 'bidderCode'), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.AD_ID, 'adId'), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.PRICE_BUCKET, getPriceByGranularity()), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.SIZE, 'size'), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.DEAL, 'dealId'), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.SOURCE, 'source'), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.FORMAT, 'mediaType'), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.ADOMAIN, getAdvertiserDomain()), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.ACAT, getPrimaryCatId()), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.DSP, getDSP()), createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.CRID, getCreativeId())]; +} + +/** + * @param {string} mediaType + * @param {string} bidderCode + * @returns {*} + */ +function getStandardBidderSettings(mediaType, bidderCode) { + const standardSettings = Object.assign({}, _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__.bidderSettings.settingsFor(null)); + if (!standardSettings[_constants_js__WEBPACK_IMPORTED_MODULE_2__.JSON_MAPPING.ADSERVER_TARGETING]) { + standardSettings[_constants_js__WEBPACK_IMPORTED_MODULE_2__.JSON_MAPPING.ADSERVER_TARGETING] = defaultAdserverTargeting(); + } + if ( true && mediaType === 'video') { + const adserverTargeting = standardSettings[_constants_js__WEBPACK_IMPORTED_MODULE_2__.JSON_MAPPING.ADSERVER_TARGETING].slice(); + standardSettings[_constants_js__WEBPACK_IMPORTED_MODULE_2__.JSON_MAPPING.ADSERVER_TARGETING] = adserverTargeting; + + // Adding hb_uuid + hb_cache_id + [_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.UUID, _constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.CACHE_ID].forEach(targetingKeyVal => { + if (typeof (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_15__.find)(adserverTargeting, kvPair => kvPair.key === targetingKeyVal) === 'undefined') { + adserverTargeting.push(createKeyVal(targetingKeyVal, 'videoCacheKey')); + } + }); + + // Adding hb_cache_host + if (_config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('cache.url') && (!bidderCode || _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__.bidderSettings.get(bidderCode, 'sendStandardTargeting') !== false)) { + const urlInfo = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.parseUrl)(_config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('cache.url')); + if (typeof (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_15__.find)(adserverTargeting, targetingKeyVal => targetingKeyVal.key === _constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.CACHE_HOST) === 'undefined') { + adserverTargeting.push(createKeyVal(_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.CACHE_HOST, function (bidResponse) { + return bidResponse?.adserverTargeting?.[_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.CACHE_HOST] || urlInfo.hostname; + })); + } + } + } + return standardSettings; +} +function getKeyValueTargetingPairs(bidderCode, custBidObj) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (!custBidObj) { + return {}; + } + const bidRequest = index.getBidRequest(custBidObj); + var keyValues = {}; + + // 1) set the keys from "standard" setting or from prebid defaults + // initialize default if not set + const standardSettings = getStandardBidderSettings(custBidObj.mediaType, bidderCode); + setKeys(keyValues, standardSettings, custBidObj, bidRequest); + + // 2) set keys from specific bidder setting override if they exist + if (bidderCode && _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__.bidderSettings.getOwn(bidderCode, _constants_js__WEBPACK_IMPORTED_MODULE_2__.JSON_MAPPING.ADSERVER_TARGETING)) { + setKeys(keyValues, _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__.bidderSettings.ownSettingsFor(bidderCode), custBidObj, bidRequest); + custBidObj.sendStandardTargeting = _bidderSettings_js__WEBPACK_IMPORTED_MODULE_20__.bidderSettings.get(bidderCode, 'sendStandardTargeting'); + } + + // set native key value targeting + if ( true && custBidObj['native']) { + keyValues = Object.assign({}, keyValues, (0,_native_js__WEBPACK_IMPORTED_MODULE_14__.getNativeTargeting)(custBidObj)); + } + return keyValues; +} +function setKeys(keyValues, bidderSettings, custBidObj, bidReq) { + var targeting = bidderSettings[_constants_js__WEBPACK_IMPORTED_MODULE_2__.JSON_MAPPING.ADSERVER_TARGETING]; + custBidObj.size = custBidObj.getSize(); + (targeting || []).forEach(function (kvPair) { + var key = kvPair.key; + var value = kvPair.val; + if (keyValues[key]) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('The key: ' + key + ' is being overwritten'); + } + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.isFn)(value)) { + try { + value = value(custBidObj, bidReq); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('bidmanager', 'ERROR', e); + } + } + if ((typeof bidderSettings.suppressEmptyKeys !== 'undefined' && bidderSettings.suppressEmptyKeys === true || key === _constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.DEAL || key === _constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.ACAT || key === _constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.DSP || key === _constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.CRID) && ( + // hb_deal & hb_acat are suppressed automatically if not set + + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.isEmptyStr)(value) || value === null || value === undefined)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.logInfo)("suppressing empty key '" + key + "' from adserver targeting"); + } else { + keyValues[key] = value; + } + }); + return keyValues; +} +function adjustBids(bid) { + let bidPriceAdjusted = (0,_utils_cpm_js__WEBPACK_IMPORTED_MODULE_21__.adjustCpm)(bid.cpm, bid); + if (bidPriceAdjusted >= 0) { + bid.cpm = bidPriceAdjusted; + } +} + +/** + * groupByPlacement is a reduce function that converts an array of Bid objects + * to an object with placement codes as keys, with each key representing an object + * with an array of `Bid` objects for that placement + * @returns {*} as { [adUnitCode]: { bids: [Bid, Bid, Bid] } } + */ +function groupByPlacement(bidsByPlacement, bid) { + if (!bidsByPlacement[bid.adUnitCode]) { + bidsByPlacement[bid.adUnitCode] = { + bids: [] + }; + } + bidsByPlacement[bid.adUnitCode].bids.push(bid); + return bidsByPlacement; +} + +/** + * isValidPrice is price validation function + * which checks if price from bid response + * is not higher than top limit set in config + * @type {Function} + * @param bid + * @returns {boolean} + */ +function isValidPrice(bid) { + const maxBidValue = _config_js__WEBPACK_IMPORTED_MODULE_10__.config.getConfig('maxBid'); + if (!maxBidValue || !bid.cpm) return true; + return maxBidValue >= Number(bid.cpm); +} + +/***/ }), + +/***/ "./src/auctionIndex.js": +/*!*****************************!*\ + !*** ./src/auctionIndex.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AuctionIndex: () => (/* binding */ AuctionIndex) +/* harmony export */ }); +/** + * @typedef {Object} AuctionIndex + * + * @property {function({ auctionId: * }): *} getAuction Returns auction instance for `auctionId` + * @property {function({ adUnitId: * }): *} getAdUnit Returns `adUnit` object for `transactionId`. + * You should prefer `getMediaTypes` for looking up bid media types. + * @property {function({ adUnitId: *, requestId: * }): *} getMediaTypes Returns mediaTypes object from bidRequest (through `requestId`) falling back to the adUnit (through `transactionId`). + * The bidRequest is given precedence because its mediaTypes can differ from the adUnit's (if bidder-specific labels are in use). + * Bids that have no associated request do not have labels either, and use the adUnit's mediaTypes. + * @property {function({ requestId: *, bidderRequestId: * }): *} getBidderRequest Returns bidderRequest that matches both requestId and bidderRequestId (if either or both are provided). + * Bid responses are not guaranteed to have a corresponding request. + * @property {function({ requestId: * }): *} getBidRequest Returns bidRequest object for requestId. + * Bid responses are not guaranteed to have a corresponding request. + */ + +/** + * Retrieves request-related bid data. + * All methods are designed to work with Bid (response) objects returned by bid adapters. + */ +function AuctionIndex(getAuctions) { + Object.assign(this, { + getAuction(_ref) { + let { + auctionId + } = _ref; + if (auctionId != null) { + return getAuctions().find(auction => auction.getAuctionId() === auctionId); + } + }, + getAdUnit(_ref2) { + let { + adUnitId + } = _ref2; + if (adUnitId != null) { + return getAuctions().flatMap(a => a.getAdUnits()).find(au => au.adUnitId === adUnitId); + } + }, + getMediaTypes(_ref3) { + let { + adUnitId, + requestId + } = _ref3; + if (requestId != null) { + const req = this.getBidRequest({ + requestId + }); + if (req != null && (adUnitId == null || req.adUnitId === adUnitId)) { + return req.mediaTypes; + } + } else if (adUnitId != null) { + const au = this.getAdUnit({ + adUnitId + }); + if (au != null) { + return au.mediaTypes; + } + } + }, + getBidderRequest(_ref4) { + let { + requestId, + bidderRequestId + } = _ref4; + if (requestId != null || bidderRequestId != null) { + let bers = getAuctions().flatMap(a => a.getBidRequests()); + if (bidderRequestId != null) { + bers = bers.filter(ber => ber.bidderRequestId === bidderRequestId); + } + if (requestId == null) { + return bers[0]; + } else { + return bers.find(ber => ber.bids && ber.bids.find(br => br.bidId === requestId) != null); + } + } + }, + getBidRequest(_ref5) { + let { + requestId + } = _ref5; + if (requestId != null) { + return getAuctions().flatMap(a => a.getBidRequests()).flatMap(ber => ber.bids).find(br => br && br.bidId === requestId); + } + }, + getOrtb2(bid) { + return this.getBidderRequest(bid)?.ortb2 || this.getAuction(bid)?.getFPD()?.global?.ortb2; + } + }); +} + +/***/ }), + +/***/ "./src/auctionManager.js": +/*!*******************************!*\ + !*** ./src/auctionManager.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ auctionManager: () => (/* binding */ auctionManager) +/* harmony export */ }); +/* unused harmony export newAuctionManager */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _auction_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./auction.js */ "./src/auction.js"); +/* harmony import */ var _auctionIndex_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./auctionIndex.js */ "./src/auctionIndex.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _utils_ttlCollection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/ttlCollection.js */ "./src/utils/ttlCollection.js"); +/* harmony import */ var _bidTTL_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bidTTL.js */ "./src/bidTTL.js"); +/** + * AuctionManager modules is responsible for creating auction instances. + * This module is the gateway for Prebid core to access auctions. + * It stores all created instances of auction and can be used to get consolidated values from auction. + */ + +/** + * @typedef {Object} AuctionManager + * + * @property {function(): Array} getBidsRequested - returns consolidated bid requests + * @property {function(): Array} getBidsReceived - returns consolidated bid received + * @property {function(): Array} getAllBidsForAdUnitCode - returns consolidated bid received for a given adUnit + * @property {function(): Array} getAdUnits - returns consolidated adUnits + * @property {function(): Array} getAdUnitCodes - returns consolidated adUnitCodes + * @property {function(): Object} createAuction - creates auction instance and stores it for future reference + * @property {function(): Object} findBidByAdId - find bid received by adId. This function will be called by $$PREBID_GLOBAL$$.renderAd + * @property {function(): Object} getStandardBidderAdServerTargeting - returns standard bidder targeting for all the adapters. Refer http://prebid.org/dev-docs/publisher-api-reference.html#module_pbjs.bidderSettings for more details + * @property {function(Object): void} addWinningBid - add a winning bid to an auction based on auctionId + * @property {function(): void} clearAllAuctions - clear all auctions for testing + * @property {AuctionIndex} index + */ + + + + + + + + + +/** + * Creates new instance of auctionManager. There will only be one instance of auctionManager but + * a factory is created to assist in testing. + * + * @returns {AuctionManager} auctionManagerInstance + */ +function newAuctionManager() { + const _auctions = (0,_utils_ttlCollection_js__WEBPACK_IMPORTED_MODULE_0__.ttlCollection)({ + startTime: au => au.end.then(() => au.getAuctionEnd()), + ttl: au => (0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_1__.getMinBidCacheTTL)() == null ? null : au.end.then(() => { + return Math.max((0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_1__.getMinBidCacheTTL)(), ...au.getBidsReceived().map(bid => bid.ttl)) * 1000; + }) + }); + (0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_1__.onMinBidCacheTTLChange)(() => _auctions.refresh()); + const auctionManager = { + onExpiry: _auctions.onExpiry + }; + function getAuction(auctionId) { + for (const auction of _auctions) { + if (auction.getAuctionId() === auctionId) return auction; + } + } + auctionManager.addWinningBid = function (bid) { + const metrics = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__.useMetrics)(bid.metrics); + metrics.checkpoint('bidWon'); + metrics.timeBetween('auctionEnd', 'bidWon', 'adserver.pending'); + metrics.timeBetween('requestBids', 'bidWon', 'adserver.e2e'); + const auction = getAuction(bid.auctionId); + if (auction) { + auction.addWinningBid(bid); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Auction not found when adding winning bid`); + } + }; + Object.entries({ + getAllWinningBids: { + name: 'getWinningBids' + }, + getBidsRequested: { + name: 'getBidRequests' + }, + getNoBids: {}, + getAdUnits: {}, + getBidsReceived: { + pre(auction) { + return auction.getAuctionStatus() === _auction_js__WEBPACK_IMPORTED_MODULE_4__.AUCTION_COMPLETED; + } + }, + getAdUnitCodes: { + post: _utils_js__WEBPACK_IMPORTED_MODULE_3__.uniques + } + }).forEach(_ref => { + let [mgrMethod, { + name = mgrMethod, + pre, + post + }] = _ref; + const mapper = pre == null ? auction => auction[name]() : auction => pre(auction) ? auction[name]() : []; + const filter = post == null ? items => items : items => items.filter(post); + auctionManager[mgrMethod] = () => { + return filter(_auctions.toArray().flatMap(mapper)); + }; + }); + function allBidsReceived() { + return _auctions.toArray().flatMap(au => au.getBidsReceived()); + } + auctionManager.getAllBidsForAdUnitCode = function (adUnitCode) { + return allBidsReceived().filter(bid => bid && bid.adUnitCode === adUnitCode); + }; + auctionManager.createAuction = function (opts) { + const auction = (0,_auction_js__WEBPACK_IMPORTED_MODULE_4__.newAuction)(opts); + _addAuction(auction); + return auction; + }; + auctionManager.findBidByAdId = function (adId) { + return allBidsReceived().find(bid => bid.adId === adId); + }; + auctionManager.getStandardBidderAdServerTargeting = function () { + return (0,_auction_js__WEBPACK_IMPORTED_MODULE_4__.getStandardBidderSettings)()[_constants_js__WEBPACK_IMPORTED_MODULE_5__.JSON_MAPPING.ADSERVER_TARGETING]; + }; + auctionManager.setStatusForBids = function (adId, status) { + let bid = auctionManager.findBidByAdId(adId); + if (bid) bid.status = status; + if (bid && status === _constants_js__WEBPACK_IMPORTED_MODULE_5__.BID_STATUS.BID_TARGETING_SET) { + const auction = getAuction(bid.auctionId); + if (auction) auction.setBidTargeting(bid); + } + }; + auctionManager.getLastAuctionId = function () { + const auctions = _auctions.toArray(); + return auctions.length && auctions[auctions.length - 1].getAuctionId(); + }; + auctionManager.clearAllAuctions = function () { + _auctions.clear(); + }; + function _addAuction(auction) { + _auctions.add(auction); + } + auctionManager.index = new _auctionIndex_js__WEBPACK_IMPORTED_MODULE_6__.AuctionIndex(() => _auctions.toArray()); + return auctionManager; +} +const auctionManager = newAuctionManager(); + +/***/ }), + +/***/ "./src/banner.js": +/*!***********************!*\ + !*** ./src/banner.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ORTB_BANNER_PARAMS: () => (/* binding */ ORTB_BANNER_PARAMS) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); + + +/** + * List of OpenRTB 2.x banner object properties with simple validators. + * Not included: `ext` + * reference: https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md + */ +const ORTB_BANNER_PARAMS = new Map([['format', value => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'object')], ['w', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['h', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['btype', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['battr', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['pos', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['mimes', value => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string')], ['topframe', value => [1, 0].includes(value)], ['expdir', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['api', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['id', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr], ['vcm', value => [1, 0].includes(value)]]); + +/***/ }), + +/***/ "./src/bidTTL.js": +/*!***********************!*\ + !*** ./src/bidTTL.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBufferedTTL: () => (/* binding */ getBufferedTTL), +/* harmony export */ getMinBidCacheTTL: () => (/* binding */ getMinBidCacheTTL), +/* harmony export */ onMinBidCacheTTLChange: () => (/* binding */ onMinBidCacheTTLChange) +/* harmony export */ }); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); + + +const CACHE_TTL_SETTING = 'minBidCacheTTL'; +let TTL_BUFFER = 1; +let minCacheTTL = null; +const listeners = []; +_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('ttlBuffer', cfg => { + if (typeof cfg.ttlBuffer === 'number') { + TTL_BUFFER = cfg.ttlBuffer; + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Invalid value for ttlBuffer', cfg.ttlBuffer); + } +}); +function getBufferedTTL(bid) { + return bid.ttl - (bid.hasOwnProperty('ttlBuffer') ? bid.ttlBuffer : TTL_BUFFER); +} +function getMinBidCacheTTL() { + return minCacheTTL; +} +_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig(CACHE_TTL_SETTING, cfg => { + const prev = minCacheTTL; + minCacheTTL = cfg?.[CACHE_TTL_SETTING]; + minCacheTTL = typeof minCacheTTL === 'number' ? minCacheTTL : null; + if (prev !== minCacheTTL) { + listeners.forEach(l => l(minCacheTTL)); + } +}); +function onMinBidCacheTTLChange(listener) { + listeners.push(listener); +} + +/***/ }), + +/***/ "./src/bidderSettings.js": +/*!*******************************!*\ + !*** ./src/bidderSettings.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ bidderSettings: () => (/* binding */ bidderSettings) +/* harmony export */ }); +/* unused harmony export ScopedSettings */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); + + + +class ScopedSettings { + constructor(getSettings, defaultScope) { + this.getSettings = getSettings; + this.defaultScope = defaultScope; + } + + /** + * Get setting value at `path` under the given scope, falling back to the default scope if needed. + * If `scope` is `null`, get the setting's default value. + * @param scope {String|null} + * @param path {String} + * @returns {*} + */ + get(scope, path) { + let value = this.getOwn(scope, path); + if (typeof value === 'undefined') { + value = this.getOwn(null, path); + } + return value; + } + + /** + * Get the setting value at `path` *without* falling back to the default value. + * @param scope {String} + * @param path {String} + * @returns {*} + */ + getOwn(scope, path) { + scope = this.#resolveScope(scope); + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.getSettings(), `${scope}.${path}`); + } + + /** + * @returns {string[]} all existing scopes except the default one. + */ + getScopes() { + return Object.keys(this.getSettings()).filter(scope => scope !== this.defaultScope); + } + + /** + * @returns all settings in the given scope, merged with the settings for the default scope. + */ + settingsFor(scope) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({}, this.ownSettingsFor(null), this.ownSettingsFor(scope)); + } + + /** + * @returns all settings in the given scope, *without* any of the default settings. + */ + ownSettingsFor(scope) { + scope = this.#resolveScope(scope); + return this.getSettings()[scope] || {}; + } + #resolveScope(scope) { + if (scope == null) { + return this.defaultScope; + } else { + return scope; + } + } +} +const bidderSettings = new ScopedSettings(() => (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().bidderSettings || {}, _constants_js__WEBPACK_IMPORTED_MODULE_3__.JSON_MAPPING.BD_SETTING_STANDARD); + +/***/ }), + +/***/ "./src/bidfactory.js": +/*!***************************!*\ + !*** ./src/bidfactory.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createBid: () => (/* binding */ createBid) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); + + +/** + Required paramaters + bidderCode, + height, + width, + statusCode + Optional paramaters + adId, + cpm, + ad, + adUrl, + dealId, + priceKeyString; + */ +function Bid(statusCode) { + let { + src = 'client', + bidder = '', + bidId, + transactionId, + adUnitId, + auctionId + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var _bidSrc = src; + var _statusCode = statusCode || 0; + Object.assign(this, { + bidderCode: bidder, + width: 0, + height: 0, + statusMessage: _getStatus(), + adId: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getUniqueIdentifierStr)(), + requestId: bidId, + transactionId, + adUnitId, + auctionId, + mediaType: 'banner', + source: _bidSrc + }); + function _getStatus() { + switch (_statusCode) { + case 0: + return 'Pending'; + case 1: + return 'Bid available'; + case 2: + return 'Bid returned empty or error response'; + case 3: + return 'Bid timed out'; + } + } + this.getStatusCode = function () { + return _statusCode; + }; + + // returns the size of the bid creative. Concatenation of width and height by ‘x’. + this.getSize = function () { + return this.width + 'x' + this.height; + }; + this.getIdentifiers = function () { + return { + src: this.source, + bidder: this.bidderCode, + bidId: this.requestId, + transactionId: this.transactionId, + adUnitId: this.adUnitId, + auctionId: this.auctionId + }; + }; +} + +// Bid factory function. +function createBid(statusCode, identifiers) { + return new Bid(statusCode, identifiers); +} + +/***/ }), + +/***/ "./src/config.js": +/*!***********************!*\ + !*** ./src/config.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ RANDOM: () => (/* binding */ RANDOM), +/* harmony export */ config: () => (/* binding */ config) +/* harmony export */ }); +/* unused harmony export newConfig */ +/* harmony import */ var _cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./cpmBucketManager.js */ "./src/cpmBucketManager.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* + * Module for getting and setting Prebid configuration. +*/ + +/** + * @typedef {Object} MediaTypePriceGranularity + * + * @property {(string|Object)} [banner] + * @property {(string|Object)} [native] + * @property {(string|Object)} [video] + * @property {(string|Object)} [video-instream] + * @property {(string|Object)} [video-outstream] + */ + + + + + +const DEFAULT_DEBUG = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)(_constants_js__WEBPACK_IMPORTED_MODULE_1__.DEBUG_MODE).toUpperCase() === 'TRUE'; +const DEFAULT_BIDDER_TIMEOUT = 3000; +const DEFAULT_ENABLE_SEND_ALL_BIDS = true; +const DEFAULT_DISABLE_AJAX_TIMEOUT = false; +const DEFAULT_BID_CACHE = false; +const DEFAULT_DEVICE_ACCESS = true; +const DEFAULT_MAX_NESTED_IFRAMES = 10; +const DEFAULT_MAXBID_VALUE = 5000; +const DEFAULT_IFRAMES_CONFIG = {}; +const RANDOM = 'random'; +const FIXED = 'fixed'; +const VALID_ORDERS = {}; +VALID_ORDERS[RANDOM] = true; +VALID_ORDERS[FIXED] = true; +const DEFAULT_BIDDER_SEQUENCE = RANDOM; +const GRANULARITY_OPTIONS = { + LOW: 'low', + MEDIUM: 'medium', + HIGH: 'high', + AUTO: 'auto', + DENSE: 'dense', + CUSTOM: 'custom' +}; +const ALL_TOPICS = '*'; +function attachProperties(config) { + let useDefaultValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + const values = useDefaultValues ? { + priceGranularity: GRANULARITY_OPTIONS.MEDIUM, + customPriceBucket: {}, + mediaTypePriceGranularity: {}, + bidderSequence: DEFAULT_BIDDER_SEQUENCE, + auctionOptions: {} + } : {}; + function getProp(name) { + return values[name]; + } + function setProp(name, val) { + if (!values.hasOwnProperty(name)) { + Object.defineProperty(config, name, { + enumerable: true + }); + } + values[name] = val; + } + const props = { + publisherDomain: { + set(val) { + if (val != null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('publisherDomain is deprecated and has no effect since v7 - use pageUrl instead'); + } + setProp('publisherDomain', val); + } + }, + priceGranularity: { + set(val) { + if (validatePriceGranularity(val)) { + if (typeof val === 'string') { + setProp('priceGranularity', hasGranularity(val) ? val : GRANULARITY_OPTIONS.MEDIUM); + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(val)) { + setProp('customPriceBucket', val); + setProp('priceGranularity', GRANULARITY_OPTIONS.CUSTOM); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Using custom price granularity'); + } + } + } + }, + customPriceBucket: {}, + mediaTypePriceGranularity: { + set(val) { + val != null && setProp('mediaTypePriceGranularity', Object.keys(val).reduce((aggregate, item) => { + if (validatePriceGranularity(val[item])) { + if (typeof val === 'string') { + aggregate[item] = hasGranularity(val[item]) ? val[item] : getProp('priceGranularity'); + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(val)) { + aggregate[item] = val[item]; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(`Using custom price granularity for ${item}`); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Invalid price granularity for media type: ${item}`); + } + return aggregate; + }, {})); + } + }, + bidderSequence: { + set(val) { + if (VALID_ORDERS[val]) { + setProp('bidderSequence', val); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Invalid order: ${val}. Bidder Sequence was not set.`); + } + } + }, + auctionOptions: { + set(val) { + if (validateauctionOptions(val)) { + setProp('auctionOptions', val); + } + } + } + }; + Object.defineProperties(config, Object.fromEntries(Object.entries(props).map(_ref => { + let [k, def] = _ref; + return [k, Object.assign({ + get: getProp.bind(null, k), + set: setProp.bind(null, k), + enumerable: values.hasOwnProperty(k), + configurable: !values.hasOwnProperty(k) + }, def)]; + }))); + return config; + function hasGranularity(val) { + return (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(Object.keys(GRANULARITY_OPTIONS), option => val === GRANULARITY_OPTIONS[option]); + } + function validatePriceGranularity(val) { + if (!val) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Prebid Error: no value passed to `setPriceGranularity()`'); + return false; + } + if (typeof val === 'string') { + if (!hasGranularity(val)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Prebid Warning: setPriceGranularity was called with invalid setting, using `medium` as default.'); + } + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(val)) { + if (!(0,_cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_3__.isValidPriceConfig)(val)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Invalid custom price value passed to `setPriceGranularity()`'); + return false; + } + } + return true; + } + function validateauctionOptions(val) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(val)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Auction Options must be an object'); + return false; + } + for (let k of Object.keys(val)) { + if (k !== 'secondaryBidders' && k !== 'suppressStaleRender' && k !== 'suppressExpiredRender') { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Auction Options given an incorrect param: ${k}`); + return false; + } + if (k === 'secondaryBidders') { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(val[k])) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Auction Options ${k} must be of type Array`); + return false; + } else if (!val[k].every(_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Auction Options ${k} must be only string`); + return false; + } + } else if (k === 'suppressStaleRender' || k === 'suppressExpiredRender') { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBoolean)(val[k])) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Auction Options ${k} must be of type boolean`); + return false; + } + } + } + return true; + } +} +function newConfig() { + let listeners = []; + let defaults; + let config; + let bidderConfig; + let currBidder = null; + function resetConfig() { + defaults = {}; + let newConfig = attachProperties({ + // `debug` is equivalent to legacy `pbjs.logging` property + debug: DEFAULT_DEBUG, + bidderTimeout: DEFAULT_BIDDER_TIMEOUT, + enableSendAllBids: DEFAULT_ENABLE_SEND_ALL_BIDS, + useBidCache: DEFAULT_BID_CACHE, + /** + * deviceAccess set to false will disable setCookie, getCookie, hasLocalStorage + * @type {boolean} + */ + deviceAccess: DEFAULT_DEVICE_ACCESS, + disableAjaxTimeout: DEFAULT_DISABLE_AJAX_TIMEOUT, + // default max nested iframes for referer detection + maxNestedIframes: DEFAULT_MAX_NESTED_IFRAMES, + // default max bid + maxBid: DEFAULT_MAXBID_VALUE, + userSync: { + topics: DEFAULT_IFRAMES_CONFIG + } + }); + if (config) { + callSubscribers(Object.keys(config).reduce((memo, topic) => { + if (config[topic] !== newConfig[topic]) { + memo[topic] = newConfig[topic] || {}; + } + return memo; + }, {})); + } + config = newConfig; + bidderConfig = {}; + } + + /** + * Returns base config with bidder overrides (if there is currently a bidder) + * @private + */ + function _getConfig() { + if (currBidder && bidderConfig && (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(bidderConfig[currBidder])) { + const curr = bidderConfig[currBidder]; + const topics = new Set([...Object.keys(config), ...Object.keys(curr)]); + const merged = {}; + for (const topic of topics) { + const base = config[topic]; + const override = curr[topic]; + merged[topic] = override === undefined ? base : base === undefined ? override : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(override) ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)({}, base, override) : override; + } + return merged; + } + return { + ...config + }; + } + function _getRestrictedConfig() { + // This causes reading 'ortb2' to throw an error; with prebid 7, that will almost + // always be the incorrect way to access FPD configuration (https://github.com/prebid/Prebid.js/issues/7651) + // code that needs the ortb2 config should explicitly use `getAnyConfig` + // TODO: this is meant as a temporary tripwire to catch inadvertent use of `getConfig('ortb')` as we transition. + // It should be removed once the risk of that happening is low enough. + const conf = _getConfig(); + Object.defineProperty(conf, 'ortb2', { + get: function () { + throw new Error('invalid access to \'orbt2\' config - use request parameters instead'); + } + }); + return conf; + } + const [getAnyConfig, getConfig] = [_getConfig, _getRestrictedConfig].map(accessor => { + /* + * Returns configuration object if called without parameters, + * or single configuration property if given a string matching a configuration + * property name. Allows deep access e.g. getConfig('currency.adServerCurrency') + * + * If called with callback parameter, or a string and a callback parameter, + * subscribes to configuration updates. See `subscribe` function for usage. + */ + return function getConfig() { + if (arguments.length <= 1 && typeof (arguments.length <= 0 ? undefined : arguments[0]) !== 'function') { + const option = arguments.length <= 0 ? undefined : arguments[0]; + return option ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(accessor(), option) : _getConfig(); + } + return subscribe(...arguments); + }; + }); + const [readConfig, readAnyConfig] = [getConfig, getAnyConfig].map(wrapee => { + /* + * Like getConfig, except that it returns a deepClone of the result. + */ + return function readConfig() { + let res = wrapee(...arguments); + if (res && typeof res === 'object') { + res = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(res); + } + return res; + }; + }); + + /** + * Internal API for modules (such as prebid-server) that might need access to all bidder config + */ + function getBidderConfig() { + return bidderConfig; + } + + /* + * Sets configuration given an object containing key-value pairs and calls + * listeners that were added by the `subscribe` function + */ + function setConfig(options) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(options)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('setConfig options must be an object'); + return; + } + let topics = Object.keys(options); + let topicalConfig = {}; + topics.forEach(topic => { + let option = options[topic]; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(defaults[topic]) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(option)) { + option = Object.assign({}, defaults[topic], option); + } + try { + topicalConfig[topic] = config[topic] = option; + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Cannot set config for property ${topic} : `, e); + } + }); + callSubscribers(topicalConfig); + } + + /** + * Sets configuration defaults which setConfig values can be applied on top of + * @param {object} options + */ + function setDefaults(options) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(defaults)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('defaults must be an object'); + return; + } + Object.assign(defaults, options); + // Add default values to config as well + Object.assign(config, options); + } + + /* + * Adds a function to a set of listeners that are invoked whenever `setConfig` + * is called. The subscribed function will be passed the options object that + * was used in the `setConfig` call. Topics can be subscribed to to only get + * updates when specific properties are updated by passing a topic string as + * the first parameter. + * + * If `options.init` is true, the listener will be immediately called with the current options. + * + * Returns an `unsubscribe` function for removing the subscriber from the + * set of listeners + * + * Example use: + * // subscribe to all configuration changes + * subscribe((config) => console.log('config set:', config)); + * + * // subscribe to only 'logging' changes + * subscribe('logging', (config) => console.log('logging set:', config)); + * + * // unsubscribe + * const unsubscribe = subscribe(...); + * unsubscribe(); // no longer listening + * + */ + function subscribe(topic, listener) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let callback = listener; + if (typeof topic !== 'string') { + // first param should be callback function in this case, + // meaning it gets called for any config change + callback = topic; + topic = ALL_TOPICS; + options = listener || {}; + } + if (typeof callback !== 'function') { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('listener must be a function'); + return; + } + const nl = { + topic, + callback + }; + listeners.push(nl); + if (options.init) { + if (topic === ALL_TOPICS) { + callback(getConfig()); + } else { + callback({ + [topic]: getConfig(topic) + }); + } + } + + // save and call this function to remove the listener + return function unsubscribe() { + listeners.splice(listeners.indexOf(nl), 1); + }; + } + + /* + * Calls listeners that were added by the `subscribe` function + */ + function callSubscribers(options) { + const TOPICS = Object.keys(options); + + // call subscribers of a specific topic, passing only that configuration + listeners.filter(listener => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(TOPICS, listener.topic)).forEach(listener => { + listener.callback({ + [listener.topic]: options[listener.topic] + }); + }); + + // call subscribers that didn't give a topic, passing everything that was set + listeners.filter(listener => listener.topic === ALL_TOPICS).forEach(listener => listener.callback(options)); + } + function setBidderConfig(config) { + let mergeFlag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + try { + check(config); + config.bidders.forEach(bidder => { + if (!bidderConfig[bidder]) { + bidderConfig[bidder] = attachProperties({}, false); + } + Object.keys(config.config).forEach(topic => { + let option = config.config[topic]; + const currentConfig = bidderConfig[bidder][topic]; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(option) && (currentConfig == null || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(currentConfig))) { + const func = mergeFlag ? _utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep : Object.assign; + bidderConfig[bidder][topic] = func({}, currentConfig || {}, option); + } else { + bidderConfig[bidder][topic] = option; + } + }); + }); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e); + } + function check(obj) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(obj)) { + throw 'setBidderConfig bidder options must be an object'; + } + if (!(Array.isArray(obj.bidders) && obj.bidders.length)) { + throw 'setBidderConfig bidder options must contain a bidders list with at least 1 bidder'; + } + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(obj.config)) { + throw 'setBidderConfig bidder options must contain a config object'; + } + } + } + function mergeConfig(obj) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(obj)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('mergeConfig input must be an object'); + return; + } + const mergedConfig = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(_getConfig(), obj); + setConfig({ + ...mergedConfig + }); + return mergedConfig; + } + function mergeBidderConfig(obj) { + return setBidderConfig(obj, true); + } + + /** + * Internal functions for core to execute some synchronous code while having an active bidder set. + */ + function runWithBidder(bidder, fn) { + currBidder = bidder; + try { + return fn(); + } finally { + resetBidder(); + } + } + function callbackWithBidder(bidder) { + return function (cb) { + return function () { + if (typeof cb === 'function') { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return runWithBidder(bidder, cb.bind(this, ...args)); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('config.callbackWithBidder callback is not a function'); + } + }; + }; + } + function getCurrentBidder() { + return currBidder; + } + function resetBidder() { + currBidder = null; + } + resetConfig(); + return { + getCurrentBidder, + resetBidder, + getConfig, + getAnyConfig, + readConfig, + readAnyConfig, + setConfig, + mergeConfig, + setDefaults, + resetConfig, + runWithBidder, + callbackWithBidder, + setBidderConfig, + getBidderConfig, + mergeBidderConfig + }; +} + +/** + * Set a `cache.url` if we should use prebid-cache to store video bids before adding bids to the auction. + * This must be set if you want to use the dfpAdServerVideo module. + */ +const config = newConfig(); + +/***/ }), + +/***/ "./src/consentHandler.js": +/*!*******************************!*\ + !*** ./src/consentHandler.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ GDPR_GVLIDS: () => (/* binding */ GDPR_GVLIDS), +/* harmony export */ VENDORLESS_GVLID: () => (/* binding */ VENDORLESS_GVLID), +/* harmony export */ allConsent: () => (/* binding */ allConsent), +/* harmony export */ coppaDataHandler: () => (/* binding */ coppaDataHandler), +/* harmony export */ gdprDataHandler: () => (/* binding */ gdprDataHandler), +/* harmony export */ gppDataHandler: () => (/* binding */ gppDataHandler), +/* harmony export */ uspDataHandler: () => (/* binding */ uspDataHandler) +/* harmony export */ }); +/* unused harmony exports ConsentHandler, gvlidRegistry, multiHandler */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); + + + + +/** + * Placeholder gvlid for when vendor consent is not required. When this value is used as gvlid, the gdpr + * enforcement module will take it to mean "vendor consent was given". + * + * see https://github.com/prebid/Prebid.js/issues/8161 + */ +const VENDORLESS_GVLID = Object.freeze({}); +class ConsentHandler { + #enabled; + #data; + #defer; + #ready; + #dirty = true; + #hash; + generatedTime; + hashFields; + constructor() { + this.reset(); + } + #resolve(data) { + this.#ready = true; + this.#data = data; + this.#defer.resolve(data); + } + + /** + * reset this handler (mainly for tests) + */ + reset() { + this.#defer = (0,_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.defer)(); + this.#enabled = false; + this.#data = null; + this.#ready = false; + this.generatedTime = null; + } + + /** + * Enable this consent handler. This should be called by the relevant consent management module + * on initialization. + */ + enable() { + this.#enabled = true; + } + + /** + * @returns {boolean} true if the related consent management module is enabled. + */ + get enabled() { + return this.#enabled; + } + + /** + * @returns {boolean} true if consent data has been resolved (it may be `null` if the resolution failed). + */ + get ready() { + return this.#ready; + } + + /** + * @returns a promise than resolves to the consent data, or null if no consent data is available + */ + get promise() { + if (this.#ready) { + return _utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.PbPromise.resolve(this.#data); + } + if (!this.#enabled) { + this.#resolve(null); + } + return this.#defer.promise; + } + setConsentData(data) { + let time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.timestamp)(); + this.generatedTime = time; + this.#dirty = true; + this.#resolve(data); + } + getConsentData() { + return this.#data; + } + get hash() { + if (this.#dirty) { + this.#hash = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.cyrb53Hash)(JSON.stringify(this.#data && this.hashFields ? this.hashFields.map(f => this.#data[f]) : this.#data)); + this.#dirty = false; + } + return this.#hash; + } +} +class UspConsentHandler extends ConsentHandler { + getConsentMeta() { + const consentData = this.getConsentData(); + if (consentData && this.generatedTime) { + return { + generatedAt: this.generatedTime + }; + } + } +} +class GdprConsentHandler extends ConsentHandler { + hashFields = ['gdprApplies', 'consentString']; + getConsentMeta() { + const consentData = this.getConsentData(); + if (consentData && consentData.vendorData && this.generatedTime) { + return { + gdprApplies: consentData.gdprApplies, + consentStringSize: (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(consentData.vendorData.tcString) ? consentData.vendorData.tcString.length : 0, + generatedAt: this.generatedTime, + apiVersion: consentData.apiVersion + }; + } + } +} +class GppConsentHandler extends ConsentHandler { + hashFields = ['applicableSections', 'gppString']; + getConsentMeta() { + const consentData = this.getConsentData(); + if (consentData && this.generatedTime) { + return { + generatedAt: this.generatedTime + }; + } + } +} +function gvlidRegistry() { + const registry = {}; + const flat = {}; + const none = {}; + return { + /** + * Register a module's GVL ID. + * @param {string} moduleType defined in `activities/modules.js` + * @param {string} moduleName + * @param {number} gvlid + */ + register(moduleType, moduleName, gvlid) { + if (gvlid) { + (registry[moduleName] = registry[moduleName] || {})[moduleType] = gvlid; + if (flat.hasOwnProperty(moduleName)) { + if (flat[moduleName] !== gvlid) flat[moduleName] = none; + } else { + flat[moduleName] = gvlid; + } + } + }, + /** + * @typedef {Object} GvlIdResult + * @property {Object.} modules - A map from module type to that module's GVL ID. + * @property {number} [gvlid] - The single GVL ID for this family of modules (only defined if all modules with this name declared the same ID). + */ + + /** + * Get a module's GVL ID(s). + * + * @param {string} moduleName - The name of the module. + * @return {GvlIdResult} An object where: + * `modules` is a map from module type to that module's GVL ID; + * `gvlid` is the single GVL ID for this family of modules (only defined if all modules with this name declare the same ID). + */ + get(moduleName) { + const result = { + modules: registry[moduleName] || {} + }; + if (flat.hasOwnProperty(moduleName) && flat[moduleName] !== none) { + result.gvlid = flat[moduleName]; + } + return result; + } + }; +} +const gdprDataHandler = new GdprConsentHandler(); +const uspDataHandler = new UspConsentHandler(); +const gppDataHandler = new GppConsentHandler(); +const coppaDataHandler = (() => { + function getCoppa() { + return !!_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa'); + } + return { + getCoppa, + getConsentData: getCoppa, + getConsentMeta: getCoppa, + reset() {}, + get promise() { + return _utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.PbPromise.resolve(getCoppa()); + }, + get hash() { + return getCoppa() ? '1' : '0'; + } + }; +})(); +const GDPR_GVLIDS = gvlidRegistry(); +const ALL_HANDLERS = { + gdpr: gdprDataHandler, + usp: uspDataHandler, + gpp: gppDataHandler, + coppa: coppaDataHandler +}; +function multiHandler() { + let handlers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ALL_HANDLERS; + handlers = Object.entries(handlers); + function collector(method) { + return function () { + return Object.fromEntries(handlers.map(_ref => { + let [name, handler] = _ref; + return [name, handler[method]()]; + })); + }; + } + return Object.assign({ + get promise() { + return _utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.PbPromise.all(handlers.map(_ref2 => { + let [name, handler] = _ref2; + return handler.promise.then(val => [name, val]); + })).then(entries => Object.fromEntries(entries)); + }, + get hash() { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.cyrb53Hash)(handlers.map(_ref3 => { + let [_, handler] = _ref3; + return handler.hash; + }).join(':')); + } + }, Object.fromEntries(['getConsentData', 'getConsentMeta', 'reset'].map(n => [n, collector(n)]))); +} +const allConsent = multiHandler(); + +/***/ }), + +/***/ "./src/constants.js": +/*!**************************!*\ + !*** ./src/constants.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AD_RENDER_FAILED_REASON: () => (/* binding */ AD_RENDER_FAILED_REASON), +/* harmony export */ BID_STATUS: () => (/* binding */ BID_STATUS), +/* harmony export */ DEBUG_MODE: () => (/* binding */ DEBUG_MODE), +/* harmony export */ DEFAULT_TARGETING_KEYS: () => (/* binding */ DEFAULT_TARGETING_KEYS), +/* harmony export */ EVENTS: () => (/* binding */ EVENTS), +/* harmony export */ EVENT_ID_PATHS: () => (/* binding */ EVENT_ID_PATHS), +/* harmony export */ GRANULARITY_OPTIONS: () => (/* binding */ GRANULARITY_OPTIONS), +/* harmony export */ JSON_MAPPING: () => (/* binding */ JSON_MAPPING), +/* harmony export */ MESSAGES: () => (/* binding */ MESSAGES), +/* harmony export */ NATIVE_ASSET_TYPES: () => (/* binding */ NATIVE_ASSET_TYPES), +/* harmony export */ NATIVE_IMAGE_TYPES: () => (/* binding */ NATIVE_IMAGE_TYPES), +/* harmony export */ NATIVE_KEYS: () => (/* binding */ NATIVE_KEYS), +/* harmony export */ NATIVE_KEYS_THAT_ARE_NOT_ASSETS: () => (/* binding */ NATIVE_KEYS_THAT_ARE_NOT_ASSETS), +/* harmony export */ PB_LOCATOR: () => (/* binding */ PB_LOCATOR), +/* harmony export */ PREBID_NATIVE_DATA_KEYS_TO_ORTB: () => (/* binding */ PREBID_NATIVE_DATA_KEYS_TO_ORTB), +/* harmony export */ REJECTION_REASON: () => (/* binding */ REJECTION_REASON), +/* harmony export */ S2S: () => (/* binding */ S2S), +/* harmony export */ STATUS: () => (/* binding */ STATUS), +/* harmony export */ TARGETING_KEYS: () => (/* binding */ TARGETING_KEYS) +/* harmony export */ }); +const JSON_MAPPING = { + PL_CODE: 'code', + PL_SIZE: 'sizes', + PL_BIDS: 'bids', + BD_BIDDER: 'bidder', + BD_ID: 'paramsd', + BD_PL_ID: 'placementId', + ADSERVER_TARGETING: 'adserverTargeting', + BD_SETTING_STANDARD: 'standard' +}; +const DEBUG_MODE = 'pbjs_debug'; +const STATUS = { + GOOD: 1 +}; +const EVENTS = { + AUCTION_INIT: 'auctionInit', + AUCTION_TIMEOUT: 'auctionTimeout', + AUCTION_END: 'auctionEnd', + BID_ADJUSTMENT: 'bidAdjustment', + BID_TIMEOUT: 'bidTimeout', + BID_REQUESTED: 'bidRequested', + BID_RESPONSE: 'bidResponse', + BID_REJECTED: 'bidRejected', + NO_BID: 'noBid', + SEAT_NON_BID: 'seatNonBid', + BID_WON: 'bidWon', + BIDDER_DONE: 'bidderDone', + BIDDER_ERROR: 'bidderError', + SET_TARGETING: 'setTargeting', + BEFORE_REQUEST_BIDS: 'beforeRequestBids', + BEFORE_BIDDER_HTTP: 'beforeBidderHttp', + REQUEST_BIDS: 'requestBids', + ADD_AD_UNITS: 'addAdUnits', + AD_RENDER_FAILED: 'adRenderFailed', + AD_RENDER_SUCCEEDED: 'adRenderSucceeded', + TCF2_ENFORCEMENT: 'tcf2Enforcement', + AUCTION_DEBUG: 'auctionDebug', + BID_VIEWABLE: 'bidViewable', + STALE_RENDER: 'staleRender', + EXPIRED_RENDER: 'expiredRender', + BILLABLE_EVENT: 'billableEvent', + BID_ACCEPTED: 'bidAccepted', + RUN_PAAPI_AUCTION: 'paapiRunAuction', + PBS_ANALYTICS: 'pbsAnalytics', + PAAPI_BID: 'paapiBid', + PAAPI_NO_BID: 'paapiNoBid', + PAAPI_ERROR: 'paapiError', + BEFORE_PBS_HTTP: 'beforePBSHttp', + BROWSI_INIT: 'browsiInit', + BROWSI_DATA: 'browsiData' +}; +const AD_RENDER_FAILED_REASON = { + PREVENT_WRITING_ON_MAIN_DOCUMENT: 'preventWritingOnMainDocument', + NO_AD: 'noAd', + EXCEPTION: 'exception', + CANNOT_FIND_AD: 'cannotFindAd', + MISSING_DOC_OR_ADID: 'missingDocOrAdid' +}; +const EVENT_ID_PATHS = { + bidWon: 'adUnitCode' +}; +const GRANULARITY_OPTIONS = { + LOW: 'low', + MEDIUM: 'medium', + HIGH: 'high', + AUTO: 'auto', + DENSE: 'dense', + CUSTOM: 'custom' +}; +const TARGETING_KEYS = { + BIDDER: 'hb_bidder', + AD_ID: 'hb_adid', + PRICE_BUCKET: 'hb_pb', + SIZE: 'hb_size', + DEAL: 'hb_deal', + SOURCE: 'hb_source', + FORMAT: 'hb_format', + UUID: 'hb_uuid', + CACHE_ID: 'hb_cache_id', + CACHE_HOST: 'hb_cache_host', + ADOMAIN: 'hb_adomain', + ACAT: 'hb_acat', + CRID: 'hb_crid', + DSP: 'hb_dsp' +}; +const DEFAULT_TARGETING_KEYS = { + BIDDER: 'hb_bidder', + AD_ID: 'hb_adid', + PRICE_BUCKET: 'hb_pb', + SIZE: 'hb_size', + DEAL: 'hb_deal', + FORMAT: 'hb_format', + UUID: 'hb_uuid', + CACHE_HOST: 'hb_cache_host' +}; +const NATIVE_KEYS = { + title: 'hb_native_title', + body: 'hb_native_body', + body2: 'hb_native_body2', + privacyLink: 'hb_native_privacy', + privacyIcon: 'hb_native_privicon', + sponsoredBy: 'hb_native_brand', + image: 'hb_native_image', + icon: 'hb_native_icon', + clickUrl: 'hb_native_linkurl', + displayUrl: 'hb_native_displayurl', + cta: 'hb_native_cta', + rating: 'hb_native_rating', + address: 'hb_native_address', + downloads: 'hb_native_downloads', + likes: 'hb_native_likes', + phone: 'hb_native_phone', + price: 'hb_native_price', + salePrice: 'hb_native_saleprice', + rendererUrl: 'hb_renderer_url', + adTemplate: 'hb_adTemplate' +}; +const S2S = { + SRC: 's2s', + DEFAULT_ENDPOINT: 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction', + SYNCED_BIDDERS_KEY: 'pbjsSyncs' +}; +const BID_STATUS = { + BID_TARGETING_SET: 'targetingSet', + RENDERED: 'rendered', + BID_REJECTED: 'bidRejected' +}; +const REJECTION_REASON = { + INVALID: 'Bid has missing or invalid properties', + INVALID_REQUEST_ID: 'Invalid request ID', + BIDDER_DISALLOWED: 'Bidder code is not allowed by allowedAlternateBidderCodes / allowUnknownBidderCodes', + FLOOR_NOT_MET: 'Bid does not meet price floor', + CANNOT_CONVERT_CURRENCY: 'Unable to convert currency', + DSA_REQUIRED: 'Bid does not provide required DSA transparency info', + DSA_MISMATCH: 'Bid indicates inappropriate DSA rendering method', + PRICE_TOO_HIGH: 'Bid price exceeds maximum value' +}; +const PREBID_NATIVE_DATA_KEYS_TO_ORTB = { + body: 'desc', + body2: 'desc2', + sponsoredBy: 'sponsored', + cta: 'ctatext', + rating: 'rating', + address: 'address', + downloads: 'downloads', + likes: 'likes', + phone: 'phone', + price: 'price', + salePrice: 'saleprice', + displayUrl: 'displayurl' +}; +const NATIVE_ASSET_TYPES = { + sponsored: 1, + desc: 2, + rating: 3, + likes: 4, + downloads: 5, + price: 6, + saleprice: 7, + phone: 8, + address: 9, + desc2: 10, + displayurl: 11, + ctatext: 12 +}; +const NATIVE_IMAGE_TYPES = { + ICON: 1, + MAIN: 3 +}; +const NATIVE_KEYS_THAT_ARE_NOT_ASSETS = ['privacyIcon', 'clickUrl', 'sendTargetingKeys', 'adTemplate', 'rendererUrl', 'type']; +const MESSAGES = { + REQUEST: 'Prebid Request', + RESPONSE: 'Prebid Response', + NATIVE: 'Prebid Native', + EVENT: 'Prebid Event' +}; +const PB_LOCATOR = '__pb_locator__'; + +/***/ }), + +/***/ "./src/cpmBucketManager.js": +/*!*********************************!*\ + !*** ./src/cpmBucketManager.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getPriceBucketString: () => (/* binding */ getPriceBucketString), +/* harmony export */ isValidPriceConfig: () => (/* binding */ isValidPriceConfig) +/* harmony export */ }); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); + + + +const _defaultPrecision = 2; +const _lgPriceConfig = { + 'buckets': [{ + 'max': 5, + 'increment': 0.5 + }] +}; +const _mgPriceConfig = { + 'buckets': [{ + 'max': 20, + 'increment': 0.1 + }] +}; +const _hgPriceConfig = { + 'buckets': [{ + 'max': 20, + 'increment': 0.01 + }] +}; +const _densePriceConfig = { + 'buckets': [{ + 'max': 3, + 'increment': 0.01 + }, { + 'max': 8, + 'increment': 0.05 + }, { + 'max': 20, + 'increment': 0.5 + }] +}; +const _autoPriceConfig = { + 'buckets': [{ + 'max': 5, + 'increment': 0.05 + }, { + 'max': 10, + 'increment': 0.1 + }, { + 'max': 20, + 'increment': 0.5 + }] +}; +function getPriceBucketString(cpm, customConfig) { + let granularityMultiplier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + let cpmFloat = parseFloat(cpm); + if (isNaN(cpmFloat)) { + cpmFloat = ''; + } + return { + low: cpmFloat === '' ? '' : getCpmStringValue(cpm, _lgPriceConfig, granularityMultiplier), + med: cpmFloat === '' ? '' : getCpmStringValue(cpm, _mgPriceConfig, granularityMultiplier), + high: cpmFloat === '' ? '' : getCpmStringValue(cpm, _hgPriceConfig, granularityMultiplier), + auto: cpmFloat === '' ? '' : getCpmStringValue(cpm, _autoPriceConfig, granularityMultiplier), + dense: cpmFloat === '' ? '' : getCpmStringValue(cpm, _densePriceConfig, granularityMultiplier), + custom: cpmFloat === '' ? '' : getCpmStringValue(cpm, customConfig, granularityMultiplier) + }; +} +function getCpmStringValue(cpm, config, granularityMultiplier) { + let cpmStr = ''; + if (!isValidPriceConfig(config)) { + return cpmStr; + } + const cap = config.buckets.reduce((prev, curr) => { + if (prev.max > curr.max) { + return prev; + } + return curr; + }, { + 'max': 0 + }); + let bucketFloor = 0; + let bucket = (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_0__.find)(config.buckets, bucket => { + if (cpm > cap.max * granularityMultiplier) { + // cpm exceeds cap, just return the cap. + let precision = bucket.precision; + if (typeof precision === 'undefined') { + precision = _defaultPrecision; + } + cpmStr = (bucket.max * granularityMultiplier).toFixed(precision); + } else if (cpm <= bucket.max * granularityMultiplier && cpm >= bucketFloor * granularityMultiplier) { + bucket.min = bucketFloor; + return bucket; + } else { + bucketFloor = bucket.max; + } + }); + if (bucket) { + cpmStr = getCpmTarget(cpm, bucket, granularityMultiplier); + } + return cpmStr; +} +function isValidPriceConfig(config) { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(config) || !config.buckets || !Array.isArray(config.buckets)) { + return false; + } + let isValid = true; + config.buckets.forEach(bucket => { + if (!bucket.max || !bucket.increment) { + isValid = false; + } + }); + return isValid; +} +function getCpmTarget(cpm, bucket, granularityMultiplier) { + const precision = typeof bucket.precision !== 'undefined' ? bucket.precision : _defaultPrecision; + const increment = bucket.increment * granularityMultiplier; + const bucketMin = bucket.min * granularityMultiplier; + let roundingFunction = Math.floor; + let customRoundingFunction = _config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('cpmRoundingFunction'); + if (typeof customRoundingFunction === 'function') { + roundingFunction = customRoundingFunction; + } + + // start increments at the bucket min and then add bucket min back to arrive at the correct rounding + // note - we're padding the values to avoid using decimals in the math prior to flooring + // this is done as JS can return values slightly below the expected mark which would skew the price bucket target + // (eg 4.01 / 0.01 = 400.99999999999994) + // min precison should be 2 to move decimal place over. + let pow = Math.pow(10, precision + 2); + let cpmToRound = (cpm * pow - bucketMin * pow) / (increment * pow); + let cpmTarget; + let invalidRounding; + // It is likely that we will be passed {cpmRoundingFunction: roundingFunction()} + // rather than the expected {cpmRoundingFunction: roundingFunction}. Default back to floor in that case + try { + cpmTarget = roundingFunction(cpmToRound) * increment + bucketMin; + } catch (err) { + invalidRounding = true; + } + if (invalidRounding || typeof cpmTarget !== 'number') { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid rounding function passed in config'); + cpmTarget = Math.floor(cpmToRound) * increment + bucketMin; + } + // force to 10 decimal places to deal with imprecise decimal/binary conversions + // (for example 0.1 * 3 = 0.30000000000000004) + + cpmTarget = Number(cpmTarget.toFixed(10)); + return cpmTarget.toFixed(precision); +} + + +/***/ }), + +/***/ "./src/creativeRenderers.js": +/*!**********************************!*\ + !*** ./src/creativeRenderers.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PUC_MIN_VERSION: () => (/* binding */ PUC_MIN_VERSION), +/* harmony export */ getCreativeRenderer: () => (/* binding */ getCreativeRenderer), +/* harmony export */ getCreativeRendererSource: () => (/* binding */ getCreativeRendererSource) +/* harmony export */ }); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_creative_renderer_display_renderer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/creative-renderer-display/renderer.js */ "./libraries/creative-renderer-display/renderer.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); + + + + + +// the minimum rendererVersion that will be used by PUC +const PUC_MIN_VERSION = 3; +const getCreativeRendererSource = (0,_hook_js__WEBPACK_IMPORTED_MODULE_0__.hook)('sync', function (bidResponse) { + return _libraries_creative_renderer_display_renderer_js__WEBPACK_IMPORTED_MODULE_1__.RENDERER; +}); +const getCreativeRenderer = function () { + const renderers = {}; + return function (bidResponse) { + const src = getCreativeRendererSource(bidResponse); + if (!renderers.hasOwnProperty(src)) { + renderers[src] = new _utils_promise_js__WEBPACK_IMPORTED_MODULE_2__.PbPromise(resolve => { + const iframe = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.createInvisibleIframe)(); + iframe.srcdoc = ``; + iframe.onload = () => resolve(iframe.contentWindow.render); + document.body.appendChild(iframe); + }); + } + return renderers[src]; + }; +}(); + +/***/ }), + +/***/ "./src/debugging.js": +/*!**************************!*\ + !*** ./src/debugging.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DEBUG_KEY: () => (/* binding */ DEBUG_KEY), +/* harmony export */ loadSession: () => (/* binding */ loadSession) +/* harmony export */ }); +/* unused harmony exports debuggingModuleLoader, debuggingControls, reset */ +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _bidfactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bidfactory.js */ "./src/bidfactory.js"); +/* harmony import */ var _adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./adloader.js */ "./src/adloader.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + +const DEBUG_KEY = "__pbjs_debugging__"; +function isDebuggingInstalled() { + return (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().installedModules.includes('debugging'); +} +function loadScript(url) { + return new _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.PbPromise(resolve => { + (0,_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(url, _activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_PREBID, 'debugging', resolve); + }); +} +function debuggingModuleLoader() { + let { + alreadyInstalled = isDebuggingInstalled, + script = loadScript + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let loading = null; + return function () { + if (loading == null) { + loading = new _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.PbPromise((resolve, reject) => { + // run this in a 0-delay timeout to give installedModules time to be populated + setTimeout(() => { + if (alreadyInstalled()) { + resolve(); + } else { + const url = "/build/dev/debugging-standalone.js"; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)(`Debugging module not installed, loading it from "${url}"...`); + (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)()._installDebugging = true; + script(url).then(() => { + (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)()._installDebugging({ + DEBUG_KEY, + hook: _hook_js__WEBPACK_IMPORTED_MODULE_5__.hook, + config: _config_js__WEBPACK_IMPORTED_MODULE_6__.config, + createBid: _bidfactory_js__WEBPACK_IMPORTED_MODULE_7__.createBid, + logger: (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.prefixLog)('DEBUG:') + }); + }).then(resolve, reject); + } + }); + }); + } + return loading; + }; +} +function debuggingControls() { + let { + load = debuggingModuleLoader(), + hook = (0,_hook_js__WEBPACK_IMPORTED_MODULE_5__.getHook)('requestBids') + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let promise = null; + let enabled = false; + function waitForDebugging(next) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return (promise || _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.PbPromise.resolve()).then(() => next.apply(this, args)); + } + function enable() { + if (!enabled) { + promise = load(); + // set debugging to high priority so that it has the opportunity to mess with most things + hook.before(waitForDebugging, 99); + enabled = true; + } + } + function disable() { + hook.getHooks({ + hook: waitForDebugging + }).remove(); + enabled = false; + } + function reset() { + promise = null; + disable(); + } + return { + enable, + disable, + reset + }; +} +const ctl = debuggingControls(); +const reset = ctl.reset; +function loadSession() { + let storage = null; + try { + // eslint-disable-next-line no-restricted-properties + storage = window.sessionStorage; + } catch (e) {} + if (storage !== null) { + let debugging = ctl; + let config = null; + try { + config = storage.getItem(DEBUG_KEY); + } catch (e) {} + if (config !== null) { + // just make sure the module runs; it will take care of parsing the config (and disabling itself if necessary) + debugging.enable(); + } + } +} +_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('debugging', function (_ref) { + let { + debugging + } = _ref; + debugging?.enabled ? ctl.enable() : ctl.disable(); +}); + +/***/ }), + +/***/ "./src/eventTrackers.js": +/*!******************************!*\ + !*** ./src/eventTrackers.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EVENT_TYPE_IMPRESSION: () => (/* binding */ EVENT_TYPE_IMPRESSION), +/* harmony export */ EVENT_TYPE_WIN: () => (/* binding */ EVENT_TYPE_WIN), +/* harmony export */ TRACKER_METHOD_IMG: () => (/* binding */ TRACKER_METHOD_IMG), +/* harmony export */ TRACKER_METHOD_JS: () => (/* binding */ TRACKER_METHOD_JS), +/* harmony export */ parseEventTrackers: () => (/* binding */ parseEventTrackers) +/* harmony export */ }); +const TRACKER_METHOD_IMG = 1; +const TRACKER_METHOD_JS = 2; +const EVENT_TYPE_IMPRESSION = 1; +const EVENT_TYPE_WIN = 500; + +/** + * Returns a map from event type (EVENT_TYPE_*) + * to a map from tracker method (TRACKER_METHOD_*) + * to an array of tracking URLs + * + * @param {{}[]} eventTrackers an array of "Event Tracker Response Object" as defined + * in the ORTB native 1.2 spec (https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf, section 5.8) + * @returns {{[type: string]: {[method: string]: string[]}}} + */ +function parseEventTrackers(eventTrackers) { + return (eventTrackers ?? []).reduce((tally, _ref) => { + let { + event, + method, + url + } = _ref; + const trackersForType = tally[event] = tally[event] ?? {}; + const trackersForMethod = trackersForType[method] = trackersForType[method] ?? []; + trackersForMethod.push(url); + return tally; + }, {}); +} + +/***/ }), + +/***/ "./src/events.js": +/*!***********************!*\ + !*** ./src/events.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ addEvents: () => (/* binding */ addEvents), +/* harmony export */ clearEvents: () => (/* binding */ clearEvents), +/* harmony export */ emit: () => (/* binding */ emit), +/* harmony export */ get: () => (/* binding */ get), +/* harmony export */ getEvents: () => (/* binding */ getEvents), +/* harmony export */ has: () => (/* binding */ has), +/* harmony export */ off: () => (/* binding */ off), +/* harmony export */ on: () => (/* binding */ on) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _utils_ttlCollection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/ttlCollection.js */ "./src/utils/ttlCollection.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/** + * events.js + */ + + + + +const TTL_CONFIG = 'eventHistoryTTL'; +let eventTTL = null; + +// keep a record of all events fired +const eventsFired = (0,_utils_ttlCollection_js__WEBPACK_IMPORTED_MODULE_0__.ttlCollection)({ + monotonic: true, + ttl: () => eventTTL +}); +_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(TTL_CONFIG, val => { + const previous = eventTTL; + val = val?.[TTL_CONFIG]; + eventTTL = typeof val === 'number' ? val * 1000 : null; + if (previous !== eventTTL) { + eventsFired.refresh(); + } +}); +let slice = Array.prototype.slice; +let push = Array.prototype.push; + +// define entire events +let allEvents = Object.values(_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS); +const idPaths = _constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENT_ID_PATHS; +const _public = function () { + let _handlers = {}; + let _public = {}; + + /** + * + * @param {String} eventString The name of the event. + * @param {Array} args The payload emitted with the event. + * @private + */ + function _dispatch(eventString, args) { + _utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage('Emitting event for: ' + eventString); + let eventPayload = args[0] || {}; + let idPath = idPaths[eventString]; + let key = eventPayload[idPath]; + let event = _handlers[eventString] || { + que: [] + }; + var eventKeys = Object.keys(event); + let callbacks = []; + + // record the event: + eventsFired.add({ + eventType: eventString, + args: eventPayload, + id: key, + elapsedTime: _utils_js__WEBPACK_IMPORTED_MODULE_3__.getPerformanceNow() + }); + + /** + * Push each specific callback to the `callbacks` array. + * If the `event` map has a key that matches the value of the + * event payload id path, e.g. `eventPayload[idPath]`, then apply + * each function in the `que` array as an argument to push to the + * `callbacks` array + */ + if (key && eventKeys.includes(key)) { + push.apply(callbacks, event[key].que); + } + + /** Push each general callback to the `callbacks` array. */ + push.apply(callbacks, event.que); + + /** call each of the callbacks */ + (callbacks || []).forEach(function (fn) { + if (!fn) return; + try { + fn.apply(null, args); + } catch (e) { + _utils_js__WEBPACK_IMPORTED_MODULE_3__.logError('Error executing handler:', 'events.js', e, eventString); + } + }); + } + function _checkAvailableEvent(event) { + return allEvents.includes(event); + } + _public.has = _checkAvailableEvent; + _public.on = function (eventString, handler, id) { + // check whether available event or not + if (_checkAvailableEvent(eventString)) { + let event = _handlers[eventString] || { + que: [] + }; + if (id) { + event[id] = event[id] || { + que: [] + }; + event[id].que.push(handler); + } else { + event.que.push(handler); + } + _handlers[eventString] = event; + } else { + _utils_js__WEBPACK_IMPORTED_MODULE_3__.logError('Wrong event name : ' + eventString + ' Valid event names :' + allEvents); + } + }; + _public.emit = function (event) { + let args = slice.call(arguments, 1); + _dispatch(event, args); + }; + _public.off = function (eventString, handler, id) { + let event = _handlers[eventString]; + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(event) || _utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(event.que) && _utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(event[id])) { + return; + } + if (id && (_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(event[id]) || _utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(event[id].que))) { + return; + } + if (id) { + (event[id].que || []).forEach(function (_handler) { + let que = event[id].que; + if (_handler === handler) { + que.splice(que.indexOf(_handler), 1); + } + }); + } else { + (event.que || []).forEach(function (_handler) { + let que = event.que; + if (_handler === handler) { + que.splice(que.indexOf(_handler), 1); + } + }); + } + _handlers[eventString] = event; + }; + _public.get = function () { + return _handlers; + }; + _public.addEvents = function (events) { + allEvents = allEvents.concat(events); + }; + + /** + * This method can return a copy of all the events fired + * @return {Array} array of events fired + */ + _public.getEvents = function () { + return eventsFired.toArray().map(val => Object.assign({}, val)); + }; + return _public; +}(); +_utils_js__WEBPACK_IMPORTED_MODULE_3__._setEventEmitter(_public.emit.bind(_public)); +const { + on, + off, + get, + getEvents, + emit, + addEvents, + has +} = _public; +function clearEvents() { + eventsFired.clear(); +} + +/***/ }), + +/***/ "./src/fpd/enrichment.js": +/*!*******************************!*\ + !*** ./src/fpd/enrichment.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ enrichFPD: () => (/* binding */ enrichFPD) +/* harmony export */ }); +/* unused harmony export dep */ +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../hook.js */ "./src/hook.js"); +/* harmony import */ var _refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _rootDomain_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rootDomain.js */ "./src/fpd/rootDomain.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); +/* harmony import */ var _sua_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sua.js */ "./src/fpd/sua.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _oneClient_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./oneClient.js */ "./src/fpd/oneClient.js"); +/* harmony import */ var _activities_rules_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _activities_activityParams_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _activities_activities_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + + + + + +const dep = { + getRefererInfo: _refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo, + findRootDomain: _rootDomain_js__WEBPACK_IMPORTED_MODULE_1__.findRootDomain, + getWindowTop: _utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop, + getWindowSelf: _utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf, + getHighEntropySUA: _sua_js__WEBPACK_IMPORTED_MODULE_3__.getHighEntropySUA, + getLowEntropySUA: _sua_js__WEBPACK_IMPORTED_MODULE_3__.getLowEntropySUA, + getDocument: _utils_js__WEBPACK_IMPORTED_MODULE_2__.getDocument +}; +const oneClient = (0,_oneClient_js__WEBPACK_IMPORTED_MODULE_4__.clientSectionChecker)('FPD'); + +/** + * Enrich an ortb2 object with first-party data. + * @param {Promise} fpd - A promise that resolves to an ortb2 object. + * @returns {Promise} - A promise that resolves to an enriched ortb2 object. + */ +const enrichFPD = (0,_hook_js__WEBPACK_IMPORTED_MODULE_5__.hook)('sync', fpd => { + const promArr = [fpd, getSUA().catch(() => null), tryToGetCdepLabel().catch(() => null)]; + return _utils_promise_js__WEBPACK_IMPORTED_MODULE_6__.PbPromise.all(promArr).then(_ref => { + let [ortb2, sua, cdep] = _ref; + const ri = dep.getRefererInfo(); + Object.entries(ENRICHMENTS).forEach(_ref2 => { + let [section, getEnrichments] = _ref2; + const data = getEnrichments(ortb2, ri); + if (data && Object.keys(data).length > 0) { + ortb2[section] = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)({}, data, ortb2[section]); + } + }); + if (sua) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2, 'device.sua', Object.assign({}, sua, ortb2.device.sua)); + } + if (cdep) { + const ext = { + cdep + }; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2, 'device.ext', Object.assign({}, ext, ortb2.device.ext)); + } + const documentLang = dep.getDocument().documentElement.lang; + if (documentLang) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2, 'site.ext.data.documentLang', documentLang); + } + ortb2 = oneClient(ortb2); + for (let section of _oneClient_js__WEBPACK_IMPORTED_MODULE_4__.CLIENT_SECTIONS) { + if ((0,_oneClient_js__WEBPACK_IMPORTED_MODULE_4__.hasSection)(ortb2, section)) { + ortb2[section] = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)({}, clientEnrichment(ortb2, ri), ortb2[section]); + break; + } + } + return ortb2; + }); +}); +function winFallback(fn) { + try { + return fn(dep.getWindowTop()); + } catch (e) { + return fn(dep.getWindowSelf()); + } +} +function getSUA() { + const hints = _config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig('firstPartyData.uaHints'); + return !Array.isArray(hints) || hints.length === 0 ? _utils_promise_js__WEBPACK_IMPORTED_MODULE_6__.PbPromise.resolve(dep.getLowEntropySUA()) : dep.getHighEntropySUA(hints); +} +function removeUndef(obj) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDefinedParams)(obj, Object.keys(obj)); +} +function tryToGetCdepLabel() { + return _utils_promise_js__WEBPACK_IMPORTED_MODULE_6__.PbPromise.resolve('cookieDeprecationLabel' in navigator && (0,_activities_rules_js__WEBPACK_IMPORTED_MODULE_9__.isActivityAllowed)(_activities_activities_js__WEBPACK_IMPORTED_MODULE_10__.ACTIVITY_ACCESS_DEVICE, (0,_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_11__.activityParams)(_activities_modules_js__WEBPACK_IMPORTED_MODULE_12__.MODULE_TYPE_PREBID, 'cdep')) && navigator.cookieDeprecationLabel.getValue()); +} +const ENRICHMENTS = { + site(ortb2, ri) { + if (_oneClient_js__WEBPACK_IMPORTED_MODULE_4__.CLIENT_SECTIONS.filter(p => p !== 'site').some(_oneClient_js__WEBPACK_IMPORTED_MODULE_4__.hasSection.bind(null, ortb2))) { + // do not enrich site if dooh or app are set + return; + } + return removeUndef({ + page: ri.page, + ref: ri.ref + }); + }, + device() { + return winFallback(win => { + // screen.width and screen.height are the physical dimensions of the screen + const w = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().screen.width; + const h = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().screen.height; + + // vpw and vph are the viewport dimensions of the browser window + const { + width: vpw, + height: vph + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_13__.getViewportSize)(); + const device = { + w, + h, + dnt: (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDNT)() ? 1 : 0, + ua: win.navigator.userAgent, + language: win.navigator.language.split('-').shift(), + ext: { + vpw, + vph + } + }; + if (win.navigator?.webdriver) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(device, 'ext.webdriver', true); + } + return device; + }); + }, + regs() { + const regs = {}; + if (winFallback(win => win.navigator.globalPrivacyControl)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(regs, 'ext.gpc', '1'); + } + const coppa = _config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig('coppa'); + if (typeof coppa === 'boolean') { + regs.coppa = coppa ? 1 : 0; + } + return regs; + } +}; + +// Enrichment of properties common across dooh, app and site - will be dropped into whatever +// section is appropriate +function clientEnrichment(ortb2, ri) { + const domain = (0,_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.parseDomain)(ri.page, { + noLeadingWww: true + }); + const keywords = winFallback(win => win.document.querySelector('meta[name=\'keywords\']'))?.content?.replace?.(/\s/g, ''); + return removeUndef({ + domain, + keywords, + publisher: removeUndef({ + domain: dep.findRootDomain(domain) + }) + }); +} + +/***/ }), + +/***/ "./src/fpd/oneClient.js": +/*!******************************!*\ + !*** ./src/fpd/oneClient.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CLIENT_SECTIONS: () => (/* binding */ CLIENT_SECTIONS), +/* harmony export */ clientSectionChecker: () => (/* binding */ clientSectionChecker), +/* harmony export */ hasSection: () => (/* binding */ hasSection) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); + + +// mutually exclusive ORTB sections in order of priority - 'dooh' beats 'app' & 'site' and 'app' beats 'site'; +// if one is set, the others will be removed +const CLIENT_SECTIONS = ['dooh', 'app', 'site']; +function clientSectionChecker(logPrefix) { + return function onlyOneClientSection(ortb2) { + CLIENT_SECTIONS.reduce((found, section) => { + if (hasSection(ortb2, section)) { + if (found != null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`${logPrefix} specifies both '${found}' and '${section}'; dropping the latter.`); + delete ortb2[section]; + } else { + found = section; + } + } + return found; + }, null); + return ortb2; + }; +} +function hasSection(ortb2, section) { + return ortb2[section] != null && Object.keys(ortb2[section]).length > 0; +} + +/***/ }), + +/***/ "./src/fpd/rootDomain.js": +/*!*******************************!*\ + !*** ./src/fpd/rootDomain.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ findRootDomain: () => (/* binding */ findRootDomain) +/* harmony export */ }); +/* unused harmony export coreStorage */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); +/* harmony import */ var _storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../storageManager.js */ "./src/storageManager.js"); + + +const coreStorage = (0,_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getCoreStorageManager)('fpdEnrichment'); + +/** + * Find the root domain by testing for the topmost domain that will allow setting cookies. + */ + +const findRootDomain = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.memoize)(function findRootDomain() { + let fullDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.host; + if (!coreStorage.cookiesAreEnabled()) { + return fullDomain; + } + const domainParts = fullDomain.split('.'); + if (domainParts.length === 2) { + return fullDomain; + } + let rootDomain; + let continueSearching; + let startIndex = -2; + const TEST_COOKIE_NAME = `_rdc${Date.now()}`; + const TEST_COOKIE_VALUE = 'writeable'; + do { + rootDomain = domainParts.slice(startIndex).join('.'); + let expirationDate = new Date((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.timestamp)() + 10 * 1000).toUTCString(); + + // Write a test cookie + coreStorage.setCookie(TEST_COOKIE_NAME, TEST_COOKIE_VALUE, expirationDate, 'Lax', rootDomain, undefined); + + // See if the write was successful + const value = coreStorage.getCookie(TEST_COOKIE_NAME, undefined); + if (value === TEST_COOKIE_VALUE) { + continueSearching = false; + // Delete our test cookie + coreStorage.setCookie(TEST_COOKIE_NAME, '', 'Thu, 01 Jan 1970 00:00:01 GMT', undefined, rootDomain, undefined); + } else { + startIndex += -1; + continueSearching = Math.abs(startIndex) <= domainParts.length; + } + } while (continueSearching); + return rootDomain; +}); + +/***/ }), + +/***/ "./src/fpd/sua.js": +/*!************************!*\ + !*** ./src/fpd/sua.js ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getHighEntropySUA: () => (/* binding */ getHighEntropySUA), +/* harmony export */ getLowEntropySUA: () => (/* binding */ getLowEntropySUA), +/* harmony export */ highEntropySUAAccessor: () => (/* binding */ highEntropySUAAccessor) +/* harmony export */ }); +/* unused harmony exports SUA_SOURCE_UNKNOWN, SUA_SOURCE_LOW_ENTROPY, SUA_SOURCE_HIGH_ENTROPY, SUA_SOURCE_UA_HEADER, HIGH_ENTROPY_HINTS, LOW_ENTROPY_HINTS, lowEntropySUAAccessor, uaDataToSUA */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/promise.js */ "./src/utils/promise.js"); + + +const SUA_SOURCE_UNKNOWN = 0; +const SUA_SOURCE_LOW_ENTROPY = 1; +const SUA_SOURCE_HIGH_ENTROPY = 2; +const SUA_SOURCE_UA_HEADER = 3; + +// "high entropy" (i.e. privacy-sensitive) fields that can be requested from the navigator. +const HIGH_ENTROPY_HINTS = ['architecture', 'bitness', 'model', 'platformVersion', 'fullVersionList']; +const LOW_ENTROPY_HINTS = ['brands', 'mobile', 'platform']; + +/** + * Returns low entropy UA client hints encoded as an ortb2.6 device.sua object; or null if no UA client hints are available. + */ +const getLowEntropySUA = lowEntropySUAAccessor(); + +/** + * Returns a promise to high entropy UA client hints encoded as an ortb2.6 device.sua object, or null if no UA client hints are available. + * + * Note that the return value is a promise because the underlying browser API returns a promise; this + * seems to plan for additional controls (such as alerts / permission request prompts to the user); it's unclear + * at the moment if this means that asking for more hints would result in slower / more expensive calls. + * + * @param {Array[String]} hints hints to request, defaults to all (HIGH_ENTROPY_HINTS). + */ +const getHighEntropySUA = highEntropySUAAccessor(); +function lowEntropySUAAccessor() { + let uaData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.navigator?.userAgentData; + const sua = uaData && LOW_ENTROPY_HINTS.some(h => typeof uaData[h] !== 'undefined') ? Object.freeze(uaDataToSUA(SUA_SOURCE_LOW_ENTROPY, uaData)) : null; + return function () { + return sua; + }; +} +function highEntropySUAAccessor() { + let uaData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.navigator?.userAgentData; + const cache = {}; + const keys = new WeakMap(); + return function () { + let hints = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : HIGH_ENTROPY_HINTS; + if (!keys.has(hints)) { + const sorted = Array.from(hints); + sorted.sort(); + keys.set(hints, sorted.join('|')); + } + const key = keys.get(hints); + if (!cache.hasOwnProperty(key)) { + try { + cache[key] = uaData.getHighEntropyValues(hints).then(result => { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(result) ? null : Object.freeze(uaDataToSUA(SUA_SOURCE_HIGH_ENTROPY, result)); + }).catch(() => null); + } catch (e) { + cache[key] = _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.PbPromise.resolve(null); + } + } + return cache[key]; + }; +} + +/** + * Convert a User Agent client hints object to an ORTB 2.6 device.sua fragment + * https://iabtechlab.com/wp-content/uploads/2022/04/OpenRTB-2-6_FINAL.pdf + * + * @param source source of the UAData object (0 to 3) + * @param uaData https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/ + * @return {{}} + */ +function uaDataToSUA(source, uaData) { + function toBrandVersion(brand, version) { + const bv = { + brand + }; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(version) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(version)) { + bv.version = version.split('.'); + } + return bv; + } + const sua = { + source + }; + if (uaData.platform) { + sua.platform = toBrandVersion(uaData.platform, uaData.platformVersion); + } + if (uaData.fullVersionList || uaData.brands) { + sua.browsers = (uaData.fullVersionList || uaData.brands).map(_ref => { + let { + brand, + version + } = _ref; + return toBrandVersion(brand, version); + }); + } + if (typeof uaData['mobile'] !== 'undefined') { + sua.mobile = uaData.mobile ? 1 : 0; + } + ['model', 'bitness', 'architecture'].forEach(prop => { + const value = uaData[prop]; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(value)) { + sua[prop] = value; + } + }); + return sua; +} + +/***/ }), + +/***/ "./src/hook.js": +/*!*********************!*\ + !*** ./src/hook.js ***! + \*********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getHook: () => (/* binding */ getHook), +/* harmony export */ hook: () => (/* binding */ hook), +/* harmony export */ ignoreCallbackArg: () => (/* binding */ ignoreCallbackArg), +/* harmony export */ module: () => (/* binding */ module), +/* harmony export */ ready: () => (/* binding */ ready), +/* harmony export */ setupBeforeHookFnOnce: () => (/* binding */ setupBeforeHookFnOnce), +/* harmony export */ submodule: () => (/* binding */ submodule), +/* harmony export */ wrapHook: () => (/* binding */ wrapHook) +/* harmony export */ }); +/* harmony import */ var fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fun-hooks/no-eval/index.js */ "./node_modules/fun-hooks/no-eval/index.js"); +/* harmony import */ var fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); + + + +/** + * NOTE: you must not call `next` asynchronously from 'sync' hooks + * see https://github.com/snapwich/fun-hooks/issues/42 + */ +let hook = fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0___default()({ + ready: (fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0___default().SYNC) | (fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0___default().ASYNC) | (fun_hooks_no_eval_index_js__WEBPACK_IMPORTED_MODULE_0___default().QUEUE) +}); +const readyCtl = (0,_utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.defer)(); +hook.ready = (() => { + const ready = hook.ready; + return function () { + try { + return ready.apply(hook, arguments); + } finally { + readyCtl.resolve(); + } + }; +})(); + +/** + * A promise that resolves when hooks are ready. + * @type {Promise} + */ +const ready = readyCtl.promise; +const getHook = hook.get; +function setupBeforeHookFnOnce(baseFn, hookFn) { + let priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 15; + let result = baseFn.getHooks({ + hook: hookFn + }); + if (result.length === 0) { + baseFn.before(hookFn, priority); + } +} +const submoduleInstallMap = {}; +function module(name, install) { + let { + postInstallAllowed = false + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + hook('async', function (submodules) { + submodules.forEach(args => install(...args)); + if (postInstallAllowed) submoduleInstallMap[name] = install; + }, name)([]); // will be queued until hook.ready() called in pbjs.processQueue(); +} +function submodule(name) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + const install = submoduleInstallMap[name]; + if (install) return install(...args); + getHook(name).before((next, modules) => { + modules.push(args); + next(modules); + }); +} + +/** + * Copy hook methods (.before, .after, etc) from a given hook to a given wrapper object. + */ +function wrapHook(hook, wrapper) { + Object.defineProperties(wrapper, Object.fromEntries(['before', 'after', 'getHooks', 'removeAll'].map(m => [m, { + get: () => hook[m] + }]))); + return wrapper; +} + +/** + * 'async' hooks expect the last argument to be a callback, and have special treatment for it if it's a function; + * which prevents it from being used as a normal argument in 'before' hooks - and presents a modified version of it + * to the hooked function. + * + * This returns a wrapper around a given 'async' hook that works around this, for when the last argument + * should be treated as a normal argument. + */ +function ignoreCallbackArg(hook) { + return wrapHook(hook, function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + args.push(function () {}); + return hook.apply(this, args); + }); +} + +/***/ }), + +/***/ "./src/mediaTypes.js": +/*!***************************!*\ + !*** ./src/mediaTypes.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ADPOD: () => (/* binding */ ADPOD), +/* harmony export */ ALL_MEDIATYPES: () => (/* binding */ ALL_MEDIATYPES), +/* harmony export */ BANNER: () => (/* binding */ BANNER), +/* harmony export */ NATIVE: () => (/* binding */ NATIVE), +/* harmony export */ VIDEO: () => (/* binding */ VIDEO) +/* harmony export */ }); +/** + * This file contains the valid Media Types in Prebid. + * + * All adapters are assumed to support banner ads. Other media types are specified by Adapters when they + * register themselves with prebid-core. + */ + +/** + * @typedef {('native'|'video'|'banner')} MediaType + * @typedef {('adpod')} VideoContext + */ + +/** @type {MediaType} */ +const NATIVE = 'native'; +/** @type {MediaType} */ +const VIDEO = 'video'; +/** @type {MediaType} */ +const BANNER = 'banner'; +/** @type {VideoContext} */ +const ADPOD = 'adpod'; +const ALL_MEDIATYPES = [NATIVE, VIDEO, BANNER]; + +/***/ }), + +/***/ "./src/native.js": +/*!***********************!*\ + !*** ./src/native.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NATIVE_TARGETING_KEYS: () => (/* binding */ NATIVE_TARGETING_KEYS), +/* harmony export */ convertOrtbRequestToProprietaryNative: () => (/* binding */ convertOrtbRequestToProprietaryNative), +/* harmony export */ decorateAdUnitsWithNativeParams: () => (/* binding */ decorateAdUnitsWithNativeParams), +/* harmony export */ fireNativeTrackers: () => (/* binding */ fireNativeTrackers), +/* harmony export */ getAllAssetsMessage: () => (/* binding */ getAllAssetsMessage), +/* harmony export */ getAssetMessage: () => (/* binding */ getAssetMessage), +/* harmony export */ getNativeRenderingData: () => (/* binding */ getNativeRenderingData), +/* harmony export */ getNativeTargeting: () => (/* binding */ getNativeTargeting), +/* harmony export */ isNativeResponse: () => (/* binding */ isNativeResponse), +/* harmony export */ nativeAdapters: () => (/* binding */ nativeAdapters), +/* harmony export */ nativeBidIsValid: () => (/* binding */ nativeBidIsValid), +/* harmony export */ setNativeResponseProperties: () => (/* binding */ setNativeResponseProperties), +/* harmony export */ toLegacyResponse: () => (/* binding */ toLegacyResponse), +/* harmony export */ toOrtbNativeRequest: () => (/* binding */ toOrtbNativeRequest) +/* harmony export */ }); +/* unused harmony exports IMAGE, processNativeAdUnitParams, isOpenRTBBidRequestValid, nativeAdUnit, nativeBidder, hasNonNativeBidder, isNativeOpenRTBBidValid, fireImpressionTrackers, fireClickTrackers, fromOrtbNativeRequest, legacyPropertiesToOrtbNative, toOrtbNativeResponse */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _adRendering_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./adRendering.js */ "./src/adRendering.js"); +/* harmony import */ var _creativeRenderers_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./creativeRenderers.js */ "./src/creativeRenderers.js"); +/* harmony import */ var _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventTrackers.js */ "./src/eventTrackers.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const nativeAdapters = []; +const NATIVE_TARGETING_KEYS = Object.keys(_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS).map(key => _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS[key]); +const IMAGE = { + ortb: { + ver: '1.2', + assets: [{ + required: 1, + id: 1, + img: { + type: 3, + wmin: 100, + hmin: 100 + } + }, { + required: 1, + id: 2, + title: { + len: 140 + } + }, { + required: 1, + id: 3, + data: { + type: 1 + } + }, { + required: 0, + id: 4, + data: { + type: 2 + } + }, { + required: 0, + id: 5, + img: { + type: 1, + wmin: 20, + hmin: 20 + } + }] + }, + image: { + required: true + }, + title: { + required: true + }, + sponsoredBy: { + required: true + }, + clickUrl: { + required: true + }, + body: { + required: false + }, + icon: { + required: false + } +}; +const SUPPORTED_TYPES = { + image: IMAGE +}; + +// inverse native maps useful for converting to legacy +const PREBID_NATIVE_DATA_KEYS_TO_ORTB_INVERSE = inverse(_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB); +const NATIVE_ASSET_TYPES_INVERSE = inverse(_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSET_TYPES); +function isNativeResponse(bidResponse) { + // check for native data and not mediaType; it's possible + // to treat banner responses as native + return bidResponse.native && typeof bidResponse.native === 'object'; +} + +/** + * Recieves nativeParams from an adUnit. If the params were not of type 'type', + * passes them on directly. If they were of type 'type', translate + * them into the predefined specific asset requests for that type of native ad. + */ +function processNativeAdUnitParams(params) { + if (params && params.type && typeIsSupported(params.type)) { + params = SUPPORTED_TYPES[params.type]; + } + if (params && params.ortb && !isOpenRTBBidRequestValid(params.ortb)) { + return; + } + return params; +} +function decorateAdUnitsWithNativeParams(adUnits) { + adUnits.forEach(adUnit => { + const nativeParams = adUnit.nativeParams || adUnit?.mediaTypes?.native; + if (nativeParams) { + adUnit.nativeParams = processNativeAdUnitParams(nativeParams); + } + if (adUnit.nativeParams) { + adUnit.nativeOrtbRequest = adUnit.nativeParams.ortb || toOrtbNativeRequest(adUnit.nativeParams); + } + }); +} +function isOpenRTBBidRequestValid(ortb) { + const assets = ortb.assets; + if (!Array.isArray(assets) || assets.length === 0) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`assets in mediaTypes.native.ortb is not an array, or it's empty. Assets: `, assets); + return false; + } + + // validate that ids exist, that they are unique and that they are numbers + const ids = assets.map(asset => asset.id); + if (assets.length !== new Set(ids).size || ids.some(id => id !== parseInt(id, 10))) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`each asset object must have 'id' property, it must be unique and it must be an integer`); + return false; + } + if (ortb.hasOwnProperty('eventtrackers') && !Array.isArray(ortb.eventtrackers)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('ortb.eventtrackers is not an array. Eventtrackers: ', ortb.eventtrackers); + return false; + } + return assets.every(asset => isOpenRTBAssetValid(asset)); +} +function isOpenRTBAssetValid(asset) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(asset)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`asset must be an object. Provided asset: `, asset); + return false; + } + if (asset.img) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.img.w) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.img.wmin)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`for img asset there must be 'w' or 'wmin' property`); + return false; + } + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.img.h) && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.img.hmin)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`for img asset there must be 'h' or 'hmin' property`); + return false; + } + } else if (asset.title) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.title.len)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`for title asset there must be 'len' property defined`); + return false; + } + } else if (asset.data) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.data.type)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`for data asset 'type' property must be a number`); + return false; + } + } else if (asset.video) { + if (!Array.isArray(asset.video.mimes) || !Array.isArray(asset.video.protocols) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.video.minduration) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(asset.video.maxduration)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('video asset is not properly configured'); + return false; + } + } + return true; +} + +/** + * Check if the native type specified in the adUnit is supported by Prebid. + */ +function typeIsSupported(type) { + if (!(type && (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(Object.keys(SUPPORTED_TYPES), type))) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${type} nativeParam is not supported`); + return false; + } + return true; +} + +/** + * Helper functions for working with native-enabled adUnits + * TODO: abstract this and the video helper functions into general + * adunit validation helper functions + */ +const nativeAdUnit = adUnit => { + const mediaType = adUnit.mediaType === 'native'; + const mediaTypes = adUnit?.mediaTypes?.native; + return mediaType || mediaTypes; +}; +const nativeBidder = bid => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(nativeAdapters, bid.bidder); +const hasNonNativeBidder = adUnit => adUnit.bids.filter(bid => !nativeBidder(bid)).length; + +/** + * Validate that the native assets on this bid contain all assets that were + * marked as required in the adUnit configuration. + * @param {Bid} bid Native bid to validate + * @param {BidRequest[]} bidRequests All bid requests for an auction + * @return {Boolean} If object is valid + */ +function nativeBidIsValid(bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const adUnit = index.getAdUnit(bid); + if (!adUnit) { + return false; + } + let ortbRequest = adUnit.nativeOrtbRequest; + let ortbResponse = bid.native?.ortb || toOrtbNativeResponse(bid.native, ortbRequest); + return isNativeOpenRTBBidValid(ortbResponse, ortbRequest); +} +function isNativeOpenRTBBidValid(bidORTB, bidRequestORTB) { + if (!bidORTB?.link?.url) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`native response doesn't have 'link' property. Ortb response: `, bidORTB); + return false; + } + let requiredAssetIds = bidRequestORTB.assets.filter(asset => asset.required === 1).map(a => a.id); + let returnedAssetIds = bidORTB.assets.map(asset => asset.id); + const match = requiredAssetIds.every(assetId => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(returnedAssetIds, assetId)); + if (!match) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`didn't receive a bid with all required assets. Required ids: ${requiredAssetIds}, but received ids in response: ${returnedAssetIds}`); + } + return match; +} + +/* + * Native responses may have associated impression or click trackers. + * This retrieves the appropriate tracker urls for the given ad object and + * fires them. As a native creatives may be in a cross-origin frame, it may be + * necessary to invoke this function via postMessage. secureCreatives is + * configured to fire this function when it receives a `message` of 'Prebid Native' + * and an `adId` with the value of the `bid.adId`. When a message is posted with + * these parameters, impression trackers are fired. To fire click trackers, the + * message should contain an `action` set to 'click'. + * + * // Native creative template example usage + * + * %%PATTERN:hb_native_title%% + * + * + * + */ +function fireNativeTrackers(message, bidResponse) { + const nativeResponse = bidResponse.native.ortb || legacyPropertiesToOrtbNative(bidResponse.native); + if (message.action === 'click') { + fireClickTrackers(nativeResponse, message?.assetId); + } else { + fireImpressionTrackers(nativeResponse); + } + return message.action; +} +function fireImpressionTrackers(nativeResponse) { + let { + runMarkup = mkup => (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.insertHtmlIntoIframe)(mkup), + fetchURL = _utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let { + [_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.TRACKER_METHOD_IMG]: img = [], + [_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.TRACKER_METHOD_JS]: js = [] + } = (0,_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.parseEventTrackers)(nativeResponse.eventtrackers || [])[_eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.EVENT_TYPE_IMPRESSION] || {}; + if (nativeResponse.imptrackers) { + img = img.concat(nativeResponse.imptrackers); + } + img.forEach(url => fetchURL(url)); + js = js.map(url => ``); + if (nativeResponse.jstracker) { + // jstracker is already HTML markup + js = js.concat([nativeResponse.jstracker]); + } + if (js.length) { + runMarkup(js.join('\n')); + } +} +function fireClickTrackers(nativeResponse) { + let assetId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let { + fetchURL = _utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + // legacy click tracker + if (!assetId) { + (nativeResponse.link?.clicktrackers || []).forEach(url => fetchURL(url)); + } else { + // ortb click tracker. This will try to call the clicktracker associated with the asset; + // will fallback to the link if none is found. + const assetIdLinkMap = (nativeResponse.assets || []).filter(a => a.link).reduce((map, asset) => { + map[asset.id] = asset.link; + return map; + }, {}); + const masterClickTrackers = nativeResponse.link?.clicktrackers || []; + let assetLink = assetIdLinkMap[assetId]; + let clickTrackers = masterClickTrackers; + if (assetLink) { + clickTrackers = assetLink.clicktrackers || []; + } + clickTrackers.forEach(url => fetchURL(url)); + } +} +function setNativeResponseProperties(bid, adUnit) { + const nativeOrtbRequest = adUnit?.nativeOrtbRequest; + const nativeOrtbResponse = bid.native?.ortb; + if (nativeOrtbRequest && nativeOrtbResponse) { + const legacyResponse = toLegacyResponse(nativeOrtbResponse, nativeOrtbRequest); + Object.assign(bid.native, legacyResponse); + } + ['rendererUrl', 'adTemplate'].forEach(prop => { + const val = adUnit?.nativeParams?.[prop]; + if (val) { + bid.native[prop] = getAssetValue(val); + } + }); +} + +/** + * Gets native targeting key-value pairs + * @param {Object} bid + * @return {Object} targeting + */ +function getNativeTargeting(bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let keyValues = {}; + const adUnit = index.getAdUnit(bid); + const globalSendTargetingKeys = adUnit?.nativeParams?.ortb == null && adUnit?.nativeParams?.sendTargetingKeys !== false; + const nativeKeys = getNativeKeys(adUnit); + const flatBidNativeKeys = { + ...bid.native, + ...bid.native.ext + }; + delete flatBidNativeKeys.ext; + Object.keys(flatBidNativeKeys).forEach(asset => { + const key = nativeKeys[asset]; + let value = getAssetValue(bid.native[asset]) || getAssetValue(bid?.native?.ext?.[asset]); + if (asset === 'adTemplate' || !key || !value) { + return; + } + let sendPlaceholder = adUnit?.nativeParams?.[asset]?.sendId; + if (typeof sendPlaceholder !== 'boolean') { + sendPlaceholder = adUnit?.nativeParams?.ext?.[asset]?.sendId; + } + if (sendPlaceholder) { + const placeholder = `${key}:${bid.adId}`; + value = placeholder; + } + let assetSendTargetingKeys = adUnit?.nativeParams?.[asset]?.sendTargetingKeys; + if (typeof assetSendTargetingKeys !== 'boolean') { + assetSendTargetingKeys = adUnit?.nativeParams?.ext?.[asset]?.sendTargetingKeys; + } + const sendTargeting = typeof assetSendTargetingKeys === 'boolean' ? assetSendTargetingKeys : globalSendTargetingKeys; + if (sendTargeting) { + keyValues[key] = value; + } + }); + return keyValues; +} +function getNativeAssets(nativeProps, keys) { + let ext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let assets = []; + Object.entries(nativeProps).filter(_ref => { + let [k, v] = _ref; + return v && (ext === false && k === 'ext' || keys == null || keys.includes(k)); + }).forEach(_ref2 => { + let [key, value] = _ref2; + if (ext === false && key === 'ext') { + assets.push(...getNativeAssets(value, keys, true)); + } else if (ext || _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS.hasOwnProperty(key)) { + assets.push({ + key, + value: getAssetValue(value) + }); + } + }); + return assets; +} +function getNativeRenderingData(bid, adUnit, keys) { + const data = { + ...(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDefinedParams)(bid.native, ['rendererUrl', 'adTemplate']), + assets: getNativeAssets(bid.native, keys), + nativeKeys: _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS + }; + if (bid.native.ortb) { + data.ortb = bid.native.ortb; + } else if (adUnit.mediaTypes?.native?.ortb) { + data.ortb = toOrtbNativeResponse(bid.native, adUnit.nativeOrtbRequest); + } + return data; +} +function assetsMessage(data, adObject, keys) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_3__.auctionManager.index + } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + const msg = { + message: 'assetResponse', + adId: data.adId + }; + let renderData = (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_5__.getRenderingData)(adObject).native; + if (renderData) { + // if we have native rendering data (set up by the nativeRendering module) + // include it in full ("all assets") together with the renderer. + // this is to allow PUC to use dynamic renderers without requiring changes in creative setup + msg.native = Object.assign({}, renderData); + msg.renderer = (0,_creativeRenderers_js__WEBPACK_IMPORTED_MODULE_6__.getCreativeRendererSource)(adObject); + msg.rendererVersion = _creativeRenderers_js__WEBPACK_IMPORTED_MODULE_6__.PUC_MIN_VERSION; + if (keys != null) { + renderData.assets = renderData.assets.filter(_ref3 => { + let { + key + } = _ref3; + return keys.includes(key); + }); + } + } else { + renderData = getNativeRenderingData(adObject, index.getAdUnit(adObject), keys); + } + return Object.assign(msg, renderData); +} +const NATIVE_KEYS_INVERTED = Object.fromEntries(Object.entries(_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS).map(_ref4 => { + let [k, v] = _ref4; + return [v, k]; +})); + +/** + * Constructs a message object containing asset values for each of the + * requested data keys. + */ +function getAssetMessage(data, adObject) { + const keys = data.assets.map(k => NATIVE_KEYS_INVERTED[k]); + return assetsMessage(data, adObject, keys); +} +function getAllAssetsMessage(data, adObject) { + return assetsMessage(data, adObject, null); +} + +/** + * Native assets can be a string or an object with a url prop. Returns the value + * appropriate for sending in adserver targeting or placeholder replacement. + */ +function getAssetValue(value) { + return value?.url || value; +} +function getNativeKeys(adUnit) { + const extraNativeKeys = {}; + if (adUnit?.nativeParams?.ext) { + Object.keys(adUnit.nativeParams.ext).forEach(extKey => { + extraNativeKeys[extKey] = `hb_native_${extKey}`; + }); + } + return { + ..._constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS, + ...extraNativeKeys + }; +} + +/** + * converts Prebid legacy native assets request to OpenRTB format + * @param {object} legacyNativeAssets an object that describes a native bid request in Prebid proprietary format + * @returns an OpenRTB format of the same bid request + */ +function toOrtbNativeRequest(legacyNativeAssets) { + if (!legacyNativeAssets && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(legacyNativeAssets)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Native assets object is empty or not an object: ', legacyNativeAssets); + return; + } + const ortb = { + ver: '1.2', + assets: [] + }; + for (let key in legacyNativeAssets) { + // skip conversion for non-asset keys + if (_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS_THAT_ARE_NOT_ASSETS.includes(key)) continue; + if (!_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS.hasOwnProperty(key)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Unrecognized native asset code: ${key}. Asset will be ignored.`); + continue; + } + if (key === 'privacyLink') { + ortb.privacy = 1; + continue; + } + const asset = legacyNativeAssets[key]; + let required = 0; + if (asset.required && (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)(asset.required)) { + required = Number(asset.required); + } + const ortbAsset = { + id: ortb.assets.length, + required + }; + // data cases + if (key in _constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB) { + ortbAsset.data = { + type: _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSET_TYPES[_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]] + }; + if (asset.len) { + ortbAsset.data.len = asset.len; + } + // icon or image case + } else if (key === 'icon' || key === 'image') { + ortbAsset.img = { + type: key === 'icon' ? _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.ICON : _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.MAIN + }; + // if min_width and min_height are defined in aspect_ratio, they are preferred + if (asset.aspect_ratios) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(asset.aspect_ratios)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)("image.aspect_ratios was passed, but it's not a an array:", asset.aspect_ratios); + } else if (!asset.aspect_ratios.length) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)("image.aspect_ratios was passed, but it's empty:", asset.aspect_ratios); + } else { + const { + min_width: minWidth, + min_height: minHeight + } = asset.aspect_ratios[0]; + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(minWidth) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(minHeight)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('image.aspect_ratios min_width or min_height are invalid: ', minWidth, minHeight); + } else { + ortbAsset.img.wmin = minWidth; + ortbAsset.img.hmin = minHeight; + } + const aspectRatios = asset.aspect_ratios.filter(ar => ar.ratio_width && ar.ratio_height).map(ratio => `${ratio.ratio_width}:${ratio.ratio_height}`); + if (aspectRatios.length > 0) { + ortbAsset.img.ext = { + aspectratios: aspectRatios + }; + } + } + } + + // if asset.sizes exist, by OpenRTB spec we should remove wmin and hmin + if (asset.sizes) { + if (asset.sizes.length !== 2 || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(asset.sizes[0]) || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(asset.sizes[1])) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('image.sizes was passed, but its value is not an array of integers:', asset.sizes); + } else { + ortbAsset.img.w = asset.sizes[0]; + ortbAsset.img.h = asset.sizes[1]; + delete ortbAsset.img.hmin; + delete ortbAsset.img.wmin; + } + } + // title case + } else if (key === 'title') { + ortbAsset.title = { + // in openRTB, len is required for titles, while in legacy prebid was not. + // for this reason, if len is missing in legacy prebid, we're adding a default value of 140. + len: asset.len || 140 + }; + // all extensions to the native bid request are passed as is + } else if (key === 'ext') { + ortbAsset.ext = asset; + // in `ext` case, required field is not needed + delete ortbAsset.required; + } + ortb.assets.push(ortbAsset); + } + return ortb; +} + +/** + * Greatest common divisor between two positive integers + * https://en.wikipedia.org/wiki/Euclidean_algorithm + */ +function gcd(a, b) { + while (a && b && a !== b) { + if (a > b) { + a = a - b; + } else { + b = b - a; + } + } + return a || b; +} + +/** + * This function converts an OpenRTB native request object to Prebid proprietary + * format. The purpose of this function is to help adapters to handle the + * transition phase where publishers may be using OpenRTB objects but the + * bidder does not yet support it. + * @param {object} openRTBRequest an OpenRTB v1.2 request object + * @returns a Prebid legacy native format request + */ +function fromOrtbNativeRequest(openRTBRequest) { + if (!isOpenRTBBidRequestValid(openRTBRequest)) { + return; + } + const oldNativeObject = {}; + for (const asset of openRTBRequest.assets) { + if (asset.title) { + const title = { + required: asset.required ? Boolean(asset.required) : false, + len: asset.title.len + }; + oldNativeObject.title = title; + } else if (asset.img) { + const image = { + required: asset.required ? Boolean(asset.required) : false + }; + if (asset.img.w && asset.img.h) { + image.sizes = [asset.img.w, asset.img.h]; + } else if (asset.img.wmin && asset.img.hmin) { + const scale = gcd(asset.img.wmin, asset.img.hmin); + image.aspect_ratios = [{ + min_width: asset.img.wmin, + min_height: asset.img.hmin, + ratio_width: asset.img.wmin / scale, + ratio_height: asset.img.hmin / scale + }]; + } + if (asset.img.type === _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.MAIN) { + oldNativeObject.image = image; + } else { + oldNativeObject.icon = image; + } + } else if (asset.data) { + let assetType = Object.keys(_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSET_TYPES).find(k => _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSET_TYPES[k] === asset.data.type); + let prebidAssetName = Object.keys(_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB).find(k => _constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB[k] === assetType); + oldNativeObject[prebidAssetName] = { + required: asset.required ? Boolean(asset.required) : false + }; + if (asset.data.len) { + oldNativeObject[prebidAssetName].len = asset.data.len; + } + } + if (openRTBRequest.privacy) { + oldNativeObject.privacyLink = { + required: false + }; + } + // video was not supported by old prebid assets + } + return oldNativeObject; +} + +/** + * Converts an OpenRTB request to a proprietary Prebid.js format. + * The proprietary Prebid format has many limitations and will be dropped in + * the future; adapters are encouraged to stop using it in favour of OpenRTB format. + * IMPLEMENTATION DETAILS: This function returns the same exact object if no + * conversion is needed. If a conversion is needed (meaning, at least one + * bidRequest contains a native.ortb definition), it will return a copy. + * + * @param {BidRequest[]} bidRequests an array of valid bid requests + * @returns an array of valid bid requests where the openRTB bids are converted to proprietary format. + */ +function convertOrtbRequestToProprietaryNative(bidRequests) { + if (true) { + if (!bidRequests || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidRequests)) return bidRequests; + // check if a conversion is needed + if (!bidRequests.some(bidRequest => (bidRequest?.mediaTypes || {})[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE]?.ortb)) { + return bidRequests; + } + let bidRequestsCopy = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(bidRequests); + // convert Native ORTB definition to old-style prebid native definition + for (const bidRequest of bidRequestsCopy) { + if (bidRequest.mediaTypes && bidRequest.mediaTypes[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE] && bidRequest.mediaTypes[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE].ortb) { + bidRequest.mediaTypes[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE] = Object.assign((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(bidRequest.mediaTypes[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE], _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS_THAT_ARE_NOT_ASSETS), fromOrtbNativeRequest(bidRequest.mediaTypes[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE].ortb)); + bidRequest.nativeParams = processNativeAdUnitParams(bidRequest.mediaTypes[_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.NATIVE]); + } + } + return bidRequestsCopy; + } + return bidRequests; +} + +/** + * convert PBJS proprietary native properties that are *not* assets to the ORTB native format. + * + * @param legacyNative `bidResponse.native` object as returned by adapters + */ +function legacyPropertiesToOrtbNative(legacyNative) { + const response = { + link: {}, + eventtrackers: [] + }; + Object.entries(legacyNative).forEach(_ref5 => { + let [key, value] = _ref5; + switch (key) { + case 'clickUrl': + response.link.url = value; + break; + case 'clickTrackers': + response.link.clicktrackers = Array.isArray(value) ? value : [value]; + break; + case 'impressionTrackers': + (Array.isArray(value) ? value : [value]).forEach(url => { + response.eventtrackers.push({ + event: _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.EVENT_TYPE_IMPRESSION, + method: _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.TRACKER_METHOD_IMG, + url + }); + }); + break; + case 'javascriptTrackers': + // jstracker is deprecated, but we need to use it here since 'javascriptTrackers' is markup, not an url + // TODO: at the time of writing this, core expected javascriptTrackers to be a string (despite the name), + // but many adapters are passing an array. It's possible that some of them are, in fact, passing URLs and not markup + // in general, native trackers seem to be neglected and/or broken + response.jstracker = Array.isArray(value) ? value.join('') : value; + break; + case 'privacyLink': + response.privacy = value; + break; + } + }); + return response; +} +function toOrtbNativeResponse(legacyResponse, ortbRequest) { + const ortbResponse = { + ...legacyPropertiesToOrtbNative(legacyResponse), + assets: [] + }; + function useRequestAsset(predicate, fn) { + let asset = ortbRequest.assets.find(predicate); + if (asset != null) { + asset = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(asset); + fn(asset); + ortbResponse.assets.push(asset); + } + } + Object.keys(legacyResponse).filter(key => !!legacyResponse[key]).forEach(key => { + const value = getAssetValue(legacyResponse[key]); + switch (key) { + // process titles + case 'title': + useRequestAsset(asset => asset.title != null, titleAsset => { + titleAsset.title = { + text: value + }; + }); + break; + case 'image': + case 'icon': + const imageType = key === 'image' ? _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.MAIN : _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.ICON; + useRequestAsset(asset => asset.img != null && asset.img.type === imageType, imageAsset => { + imageAsset.img = { + url: value + }; + }); + break; + default: + if (key in _constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB) { + useRequestAsset(asset => asset.data != null && asset.data.type === _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSET_TYPES[_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]], dataAsset => { + dataAsset.data = { + value + }; + }); + } + break; + } + }); + return ortbResponse; +} + +/** + * Generates a legacy response from an ortb response. Useful during the transition period. + * @param {*} ortbResponse a standard ortb response object + * @param {*} ortbRequest the ortb request, useful to match ids. + * @returns an object containing the response in legacy native format: { title: "this is a title", image: ... } + */ +function toLegacyResponse(ortbResponse, ortbRequest) { + const legacyResponse = {}; + const requestAssets = ortbRequest?.assets || []; + legacyResponse.clickUrl = ortbResponse.link?.url; + legacyResponse.privacyLink = ortbResponse.privacy; + for (const asset of ortbResponse?.assets || []) { + const requestAsset = requestAssets.find(reqAsset => asset.id === reqAsset.id); + if (asset.title) { + legacyResponse.title = asset.title.text; + } else if (asset.img) { + legacyResponse[requestAsset?.img?.type === _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.MAIN ? 'image' : 'icon'] = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + } else if (asset.data) { + legacyResponse[PREBID_NATIVE_DATA_KEYS_TO_ORTB_INVERSE[NATIVE_ASSET_TYPES_INVERSE[requestAsset?.data?.type]]] = asset.data.value; + } + } + + // Handle trackers + legacyResponse.impressionTrackers = []; + let jsTrackers = []; + if (ortbResponse.imptrackers) { + legacyResponse.impressionTrackers.push(...ortbResponse.imptrackers); + } + for (const eventTracker of ortbResponse?.eventtrackers || []) { + if (eventTracker.event === _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.EVENT_TYPE_IMPRESSION && eventTracker.method === _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.TRACKER_METHOD_IMG) { + legacyResponse.impressionTrackers.push(eventTracker.url); + } + if (eventTracker.event === _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.EVENT_TYPE_IMPRESSION && eventTracker.method === _eventTrackers_js__WEBPACK_IMPORTED_MODULE_4__.TRACKER_METHOD_JS) { + jsTrackers.push(eventTracker.url); + } + } + jsTrackers = jsTrackers.map(url => ``); + if (ortbResponse?.jstracker) { + jsTrackers.push(ortbResponse.jstracker); + } + if (jsTrackers.length) { + legacyResponse.javascriptTrackers = jsTrackers.join('\n'); + } + return legacyResponse; +} + +/** + * Inverts key-values of an object. + */ +function inverse(obj) { + var retobj = {}; + for (var key in obj) { + retobj[obj[key]] = key; + } + return retobj; +} + +/***/ }), + +/***/ "./src/pbjsORTB.js": +/*!*************************!*\ + !*** ./src/pbjsORTB.js ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ BID_RESPONSE: () => (/* binding */ BID_RESPONSE), +/* harmony export */ DEFAULT: () => (/* binding */ DEFAULT), +/* harmony export */ IMP: () => (/* binding */ IMP), +/* harmony export */ PBS: () => (/* binding */ PBS), +/* harmony export */ PROCESSOR_TYPES: () => (/* binding */ PROCESSOR_TYPES), +/* harmony export */ REQUEST: () => (/* binding */ REQUEST), +/* harmony export */ RESPONSE: () => (/* binding */ RESPONSE), +/* harmony export */ getProcessors: () => (/* binding */ getProcessors), +/* harmony export */ registerOrtbProcessor: () => (/* binding */ registerOrtbProcessor) +/* harmony export */ }); +/* unused harmony exports PROCESSOR_DIALECTS, processorRegistry */ +const PROCESSOR_TYPES = ['request', 'imp', 'bidResponse', 'response']; +const PROCESSOR_DIALECTS = ['default', 'pbs']; +const [REQUEST, IMP, BID_RESPONSE, RESPONSE] = PROCESSOR_TYPES; +const [DEFAULT, PBS] = PROCESSOR_DIALECTS; +const types = new Set(PROCESSOR_TYPES); +function processorRegistry() { + const processors = {}; + return { + registerOrtbProcessor(_ref) { + let { + type, + name, + fn, + priority = 0, + dialects = [DEFAULT] + } = _ref; + if (!types.has(type)) { + throw new Error(`ORTB processor type must be one of: ${PROCESSOR_TYPES.join(', ')}`); + } + dialects.forEach(dialect => { + if (!processors.hasOwnProperty(dialect)) { + processors[dialect] = {}; + } + if (!processors[dialect].hasOwnProperty(type)) { + processors[dialect][type] = {}; + } + processors[dialect][type][name] = { + priority, + fn + }; + }); + }, + getProcessors(dialect) { + return processors[dialect] || {}; + } + }; +} +const { + registerOrtbProcessor, + getProcessors +} = processorRegistry(); + +/***/ }), + +/***/ "./src/polyfill.js": +/*!*************************!*\ + !*** ./src/polyfill.js ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ find: () => (/* binding */ find), +/* harmony export */ findIndex: () => (/* binding */ findIndex), +/* harmony export */ includes: () => (/* binding */ includes) +/* harmony export */ }); +// These stubs are here to help transition away from core-js polyfills for browsers we are no longer supporting. +// You should not need these for new code; use stock JS instead! + +function includes(target, elem, start) { + return target && target.includes(elem, start) || false; +} +function find(arr, pred, thisArg) { + return arr && arr.find(pred, thisArg); +} +function findIndex(arr, pred, thisArg) { + return arr && arr.findIndex(pred, thisArg); +} + +/***/ }), + +/***/ "./src/prebid.js": +/*!***********************!*\ + !*** ./src/prebid.js ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ adUnitSetupChecks: () => (/* binding */ adUnitSetupChecks), +/* harmony export */ checkAdUnitSetup: () => (/* binding */ checkAdUnitSetup), +/* harmony export */ startAuction: () => (/* binding */ startAuction) +/* harmony export */ }); +/* unused harmony exports syncOrtb2, executeCallbacks */ +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _secureCreatives_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./secureCreatives.js */ "./src/secureCreatives.js"); +/* harmony import */ var _userSync_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./userSync.js */ "./src/userSync.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _targeting_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./targeting.js */ "./src/targeting.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _debugging_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./debugging.js */ "./src/debugging.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _bidfactory_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./bidfactory.js */ "./src/bidfactory.js"); +/* harmony import */ var _storageManager_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./events.js */ "./src/events.js"); +/* harmony import */ var _utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./fpd/enrichment.js */ "./src/fpd/enrichment.js"); +/* harmony import */ var _consentHandler_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./consentHandler.js */ "./src/consentHandler.js"); +/* harmony import */ var _adRendering_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./adRendering.js */ "./src/adRendering.js"); +/* harmony import */ var _utils_reducers_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utils/reducers.js */ "./src/utils/reducers.js"); +/* harmony import */ var _video_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./video.js */ "./src/video.js"); +/* harmony import */ var _banner_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./banner.js */ "./src/banner.js"); +/* harmony import */ var _mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _utils_prerendering_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils/prerendering.js */ "./src/utils/prerendering.js"); +/* harmony import */ var _adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/** @module pbjs */ + + + + + + + + + + + + + + + + + + + + + + + + + + + +const pbjsInstance = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(); +const { + triggerUserSyncs +} = _userSync_js__WEBPACK_IMPORTED_MODULE_1__.userSync; + +/* private variables */ +const { + ADD_AD_UNITS, + REQUEST_BIDS, + SET_TARGETING +} = _constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS; +const eventValidators = { + bidWon: checkDefinedPlacement +}; + +// initialize existing debugging sessions if present +(0,_debugging_js__WEBPACK_IMPORTED_MODULE_3__.loadSession)(); + +/* Public vars */ +pbjsInstance.bidderSettings = pbjsInstance.bidderSettings || {}; + +// let the world know we are loaded +pbjsInstance.libLoaded = true; + +// version auto generated from build +pbjsInstance.version = "v9.45.0-pre"; +(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Prebid.js v9.45.0-pre loaded"); +pbjsInstance.installedModules = pbjsInstance.installedModules || []; + +// create adUnit array +pbjsInstance.adUnits = pbjsInstance.adUnits || []; + +// Allow publishers who enable user sync override to trigger their sync +pbjsInstance.triggerUserSyncs = triggerUserSyncs; +function checkDefinedPlacement(id) { + var adUnitCodes = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getBidsRequested().map(bidSet => bidSet.bids.map(bid => bid.adUnitCode)).reduce(_utils_js__WEBPACK_IMPORTED_MODULE_4__.flatten).filter(_utils_js__WEBPACK_IMPORTED_MODULE_4__.uniques); + if (!adUnitCodes.includes(id)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('The "' + id + '" placement is not defined.'); + return; + } + return true; +} +function validateSizes(sizes, targLength) { + let cleanSizes = []; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(sizes) && (targLength ? sizes.length === targLength : sizes.length > 0)) { + // check if an array of arrays or array of numbers + if (sizes.every(sz => (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArrayOfNums)(sz, 2))) { + cleanSizes = sizes; + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArrayOfNums)(sizes, 2)) { + cleanSizes.push(sizes); + } + } + return cleanSizes; +} + +// synchronize fields between mediaTypes[mediaType] and ortb2Imp[mediaType] +function syncOrtb2(adUnit, mediaType) { + const ortb2Imp = (0,_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, `ortb2Imp.${mediaType}`); + const mediaTypes = (0,_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, `mediaTypes.${mediaType}`); + if (!ortb2Imp && !mediaTypes) { + // omitting sync due to not present mediaType + return; + } + const fields = { + [_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.VIDEO]: true && _video_js__WEBPACK_IMPORTED_MODULE_8__.ORTB_VIDEO_PARAMS, + [_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.BANNER]: _banner_js__WEBPACK_IMPORTED_MODULE_9__.ORTB_BANNER_PARAMS + }[mediaType]; + if (!fields) { + return; + } + [...fields].forEach(_ref => { + let [key, validator] = _ref; + const mediaTypesFieldValue = (0,_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, `mediaTypes.${mediaType}.${key}`); + const ortbFieldValue = (0,_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, `ortb2Imp.${mediaType}.${key}`); + if (mediaTypesFieldValue == undefined && ortbFieldValue == undefined) { + // omitting the params if it's not defined on either of sides + } else if (mediaTypesFieldValue == undefined) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(adUnit, `mediaTypes.${mediaType}.${key}`, ortbFieldValue); + } else if (ortbFieldValue == undefined) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(adUnit, `ortb2Imp.${mediaType}.${key}`, mediaTypesFieldValue); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`adUnit ${adUnit.code}: specifies conflicting ortb2Imp.${mediaType}.${key} and mediaTypes.${mediaType}.${key}, the latter will be ignored`, adUnit); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(adUnit, `mediaTypes.${mediaType}.${key}`, ortbFieldValue); + } + }); +} +function validateBannerMediaType(adUnit) { + const validatedAdUnit = (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(adUnit); + const banner = validatedAdUnit.mediaTypes.banner; + const bannerSizes = banner.sizes == null ? null : validateSizes(banner.sizes); + const format = adUnit.ortb2Imp?.banner?.format ?? banner?.format; + let formatSizes; + if (format != null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(validatedAdUnit, 'ortb2Imp.banner.format', format); + banner.format = format; + try { + formatSizes = format.filter(_ref2 => { + let { + w, + h, + wratio, + hratio + } = _ref2; + if ((w ?? h) != null && (wratio ?? hratio) != null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`Ad unit banner.format specifies both w/h and wratio/hratio`, adUnit); + return false; + } + return w != null && h != null || wratio != null && hratio != null; + }).map(_ref3 => { + let { + w, + h, + wratio, + hratio + } = _ref3; + return [w ?? wratio, h ?? hratio]; + }); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Invalid format definition on ad unit ${adUnit.code}`, format); + } + if (formatSizes != null && bannerSizes != null && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepEqual)(bannerSizes, formatSizes)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`Ad unit ${adUnit.code} has conflicting sizes and format definitions`, adUnit); + } + } + const sizes = formatSizes ?? bannerSizes ?? []; + const expdir = adUnit.ortb2Imp?.banner?.expdir ?? banner.expdir; + if (expdir != null) { + banner.expdir = expdir; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(validatedAdUnit, 'ortb2Imp.banner.expdir', expdir); + } + if (sizes.length > 0) { + banner.sizes = sizes; + // Deprecation Warning: This property will be deprecated in next release in favor of adUnit.mediaTypes.banner.sizes + validatedAdUnit.sizes = sizes; + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Detected a mediaTypes.banner object without a proper sizes field. Please ensure the sizes are listed like: [[300, 250], ...]. Removing invalid mediaTypes.banner object from request.'); + delete validatedAdUnit.mediaTypes.banner; + } + syncOrtb2(validatedAdUnit, 'banner'); + return validatedAdUnit; +} +function validateVideoMediaType(adUnit) { + const validatedAdUnit = (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(adUnit); + const video = validatedAdUnit.mediaTypes.video; + if (video.playerSize) { + let tarPlayerSizeLen = typeof video.playerSize[0] === 'number' ? 2 : 1; + const videoSizes = validateSizes(video.playerSize, tarPlayerSizeLen); + if (videoSizes.length > 0) { + if (tarPlayerSizeLen === 2) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)('Transforming video.playerSize from [640,480] to [[640,480]] so it\'s in the proper format.'); + } + video.playerSize = videoSizes; + // Deprecation Warning: This property will be deprecated in next release in favor of adUnit.mediaTypes.video.playerSize + validatedAdUnit.sizes = videoSizes; + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Detected incorrect configuration of mediaTypes.video.playerSize. Please specify only one set of dimensions in a format like: [[640, 480]]. Removing invalid mediaTypes.video.playerSize property from request.'); + delete validatedAdUnit.mediaTypes.video.playerSize; + } + } + (0,_video_js__WEBPACK_IMPORTED_MODULE_8__.validateOrtbVideoFields)(validatedAdUnit); + syncOrtb2(validatedAdUnit, 'video'); + return validatedAdUnit; +} +function validateNativeMediaType(adUnit) { + function err(msg) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Error in adUnit "${adUnit.code}": ${msg}. Removing native request from ad unit`, adUnit); + delete validatedAdUnit.mediaTypes.native; + return validatedAdUnit; + } + function checkDeprecated(onDeprecated) { + for (const key of ['sendTargetingKeys', 'types']) { + if (native.hasOwnProperty(key)) { + const res = onDeprecated(key); + if (res) return res; + } + } + } + const validatedAdUnit = (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(adUnit); + const native = validatedAdUnit.mediaTypes.native; + // if native assets are specified in OpenRTB format, remove legacy assets and print a warn. + if (native.ortb) { + if (native.ortb.assets?.some(asset => !(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(asset.id) || asset.id < 0 || asset.id % 1 !== 0)) { + return err('native asset ID must be a nonnegative integer'); + } + if (checkDeprecated(key => err(`ORTB native requests cannot specify "${key}"`))) { + return validatedAdUnit; + } + const legacyNativeKeys = Object.keys(_constants_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE_KEYS).filter(key => _constants_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE_KEYS[key].includes('hb_native_')); + const nativeKeys = Object.keys(native); + const intersection = nativeKeys.filter(nativeKey => legacyNativeKeys.includes(nativeKey)); + if (intersection.length > 0) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`when using native OpenRTB format, you cannot use legacy native properties. Deleting ${intersection} keys from request.`); + intersection.forEach(legacyKey => delete validatedAdUnit.mediaTypes.native[legacyKey]); + } + } else { + checkDeprecated(key => `mediaTypes.native.${key} is deprecated, consider using native ORTB instead`, adUnit); + } + if (native.image && native.image.sizes && !Array.isArray(native.image.sizes)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Please use an array of sizes for native.image.sizes field. Removing invalid mediaTypes.native.image.sizes property from request.'); + delete validatedAdUnit.mediaTypes.native.image.sizes; + } + if (native.image && native.image.aspect_ratios && !Array.isArray(native.image.aspect_ratios)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Please use an array of sizes for native.image.aspect_ratios field. Removing invalid mediaTypes.native.image.aspect_ratios property from request.'); + delete validatedAdUnit.mediaTypes.native.image.aspect_ratios; + } + if (native.icon && native.icon.sizes && !Array.isArray(native.icon.sizes)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Please use an array of sizes for native.icon.sizes field. Removing invalid mediaTypes.native.icon.sizes property from request.'); + delete validatedAdUnit.mediaTypes.native.icon.sizes; + } + return validatedAdUnit; +} +function validateAdUnitPos(adUnit, mediaType) { + let pos = adUnit?.mediaTypes?.[mediaType]?.pos; + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(pos) || isNaN(pos) || !isFinite(pos)) { + let warning = `Value of property 'pos' on ad unit ${adUnit.code} should be of type: Number`; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(warning); + delete adUnit.mediaTypes[mediaType].pos; + } + return adUnit; +} +function validateAdUnit(adUnit) { + const msg = msg => `adUnit.code '${adUnit.code}' ${msg}`; + const mediaTypes = adUnit.mediaTypes; + const bids = adUnit.bids; + if (bids != null && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(bids)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(msg(`defines 'adUnit.bids' that is not an array. Removing adUnit from auction`)); + return null; + } + if (bids == null && adUnit.ortb2Imp == null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(msg(`has no 'adUnit.bids' and no 'adUnit.ortb2Imp'. Removing adUnit from auction`)); + return null; + } + if (!mediaTypes || Object.keys(mediaTypes).length === 0) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(msg(`does not define a 'mediaTypes' object. This is a required field for the auction, so this adUnit has been removed.`)); + return null; + } + if (adUnit.ortb2Imp != null && (bids == null || bids.length === 0)) { + adUnit.bids = [{ + bidder: null + }]; // the 'null' bidder is treated as an s2s-only placeholder by adapterManager + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)(msg(`defines 'adUnit.ortb2Imp' with no 'adUnit.bids'; it will be seen only by S2S adapters`)); + } + return adUnit; +} +const adUnitSetupChecks = { + validateAdUnit, + validateBannerMediaType, + validateSizes +}; +if (true) { + Object.assign(adUnitSetupChecks, { + validateNativeMediaType + }); +} +if (true) { + Object.assign(adUnitSetupChecks, { + validateVideoMediaType + }); +} +const checkAdUnitSetup = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('sync', function (adUnits) { + const validatedAdUnits = []; + adUnits.forEach(adUnit => { + adUnit = validateAdUnit(adUnit); + if (adUnit == null) return; + const mediaTypes = adUnit.mediaTypes; + let validatedBanner, validatedVideo, validatedNative; + if (mediaTypes.banner) { + validatedBanner = validateBannerMediaType(adUnit); + if (mediaTypes.banner.hasOwnProperty('pos')) validatedBanner = validateAdUnitPos(validatedBanner, 'banner'); + } + if ( true && mediaTypes.video) { + validatedVideo = validatedBanner ? validateVideoMediaType(validatedBanner) : validateVideoMediaType(adUnit); + if (mediaTypes.video.hasOwnProperty('pos')) validatedVideo = validateAdUnitPos(validatedVideo, 'video'); + } + if ( true && mediaTypes.native) { + validatedNative = validatedVideo ? validateNativeMediaType(validatedVideo) : validatedBanner ? validateNativeMediaType(validatedBanner) : validateNativeMediaType(adUnit); + } + const validatedAdUnit = Object.assign({}, validatedBanner, validatedVideo, validatedNative); + validatedAdUnits.push(validatedAdUnit); + }); + return validatedAdUnits; +}, 'checkAdUnitSetup'); +function fillAdUnitDefaults(adUnits) { + if (true) { + adUnits.forEach(au => (0,_video_js__WEBPACK_IMPORTED_MODULE_8__.fillVideoDefaults)(au)); + } +} + +/// /////////////////////////////// +// // +// Start Public APIs // +// // +/// /////////////////////////////// + +/** + * This function returns the query string targeting parameters available at this moment for a given ad unit. Note that some bidder's response may not have been received if you call this function too quickly after the requests are sent. + * @param {string} [adunitCode] adUnitCode to get the bid responses for + * @alias module:pbjs.getAdserverTargetingForAdUnitCodeStr + * @return {Array} returnObj return bids array + */ +pbjsInstance.getAdserverTargetingForAdUnitCodeStr = function (adunitCode) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.getAdserverTargetingForAdUnitCodeStr", arguments); + + // call to retrieve bids array + if (adunitCode) { + var res = pbjsInstance.getAdserverTargetingForAdUnitCode(adunitCode); + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.transformAdServerTargetingObj)(res); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('Need to call getAdserverTargetingForAdUnitCodeStr with adunitCode'); + } +}; + +/** + * This function returns the query string targeting parameters available at this moment for a given ad unit. Note that some bidder's response may not have been received if you call this function too quickly after the requests are sent. + * @param adunitCode {string} adUnitCode to get the bid responses for + * @alias module:pbjs.getHighestUnusedBidResponseForAdUnitCode + * @returns {Object} returnObj return bid + */ +pbjsInstance.getHighestUnusedBidResponseForAdUnitCode = function (adunitCode) { + if (adunitCode) { + const bid = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getAllBidsForAdUnitCode(adunitCode).filter(_targeting_js__WEBPACK_IMPORTED_MODULE_12__.isBidUsable); + return bid.length ? bid.reduce(_utils_reducers_js__WEBPACK_IMPORTED_MODULE_13__.getHighestCpm) : {}; + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('Need to call getHighestUnusedBidResponseForAdUnitCode with adunitCode'); + } +}; + +/** + * This function returns the query string targeting parameters available at this moment for a given ad unit. Note that some bidder's response may not have been received if you call this function too quickly after the requests are sent. + * @param adUnitCode {string} adUnitCode to get the bid responses for + * @alias module:pbjs.getAdserverTargetingForAdUnitCode + * @returns {Object} returnObj return bids + */ +pbjsInstance.getAdserverTargetingForAdUnitCode = function (adUnitCode) { + return pbjsInstance.getAdserverTargeting(adUnitCode)[adUnitCode]; +}; + +/** + * returns all ad server targeting for all ad units + * @return {Object} Map of adUnitCodes and targeting values [] + * @alias module:pbjs.getAdserverTargeting + */ + +pbjsInstance.getAdserverTargeting = function (adUnitCode) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.getAdserverTargeting", arguments); + return _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.getAllTargeting(adUnitCode); +}; +pbjsInstance.getConsentMetadata = function () { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.getConsentMetadata"); + return _consentHandler_js__WEBPACK_IMPORTED_MODULE_14__.allConsent.getConsentMeta(); +}; +function getBids(type) { + const responses = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager[type]().filter(bid => _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getAdUnitCodes().includes(bid.adUnitCode)); + + // find the last auction id to get responses for most recent auction only + const currentAuctionId = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getLastAuctionId(); + return responses.map(bid => bid.adUnitCode).filter(_utils_js__WEBPACK_IMPORTED_MODULE_4__.uniques).map(adUnitCode => responses.filter(bid => bid.auctionId === currentAuctionId && bid.adUnitCode === adUnitCode)).filter(bids => bids && bids[0] && bids[0].adUnitCode).map(bids => { + return { + [bids[0].adUnitCode]: { + bids + } + }; + }).reduce((a, b) => Object.assign(a, b), {}); +} + +/** + * This function returns the bids requests involved in an auction but not bid on + * @alias module:pbjs.getNoBids + * @return {Object} map | object that contains the bidRequests + */ + +pbjsInstance.getNoBids = function () { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.getNoBids", arguments); + return getBids('getNoBids'); +}; + +/** + * This function returns the bids requests involved in an auction but not bid on or the specified adUnitCode + * @param {string} adUnitCode adUnitCode + * @alias module:pbjs.getNoBidsForAdUnitCode + * @return {Object} bidResponse object + */ + +pbjsInstance.getNoBidsForAdUnitCode = function (adUnitCode) { + const bids = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getNoBids().filter(bid => bid.adUnitCode === adUnitCode); + return { + bids + }; +}; + +/** + * This function returns the bid responses at the given moment. + * @alias module:pbjs.getBidResponses + * @return {Object} map | object that contains the bidResponses + */ + +pbjsInstance.getBidResponses = function () { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.getBidResponses", arguments); + return getBids('getBidsReceived'); +}; + +/** + * Returns bidResponses for the specified adUnitCode + * @param {string} adUnitCode adUnitCode + * @alias module:pbjs.getBidResponsesForAdUnitCode + * @return {Object} bidResponse object + */ + +pbjsInstance.getBidResponsesForAdUnitCode = function (adUnitCode) { + const bids = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getBidsReceived().filter(bid => bid.adUnitCode === adUnitCode); + return { + bids + }; +}; + +/** + * Set query string targeting on one or more GPT ad units. + * @param {(string|string[])} adUnit a single `adUnit.code` or multiple. + * @param {function(object): function(string): boolean} customSlotMatching gets a GoogleTag slot and returns a filter function for adUnitCode, so you can decide to match on either eg. return slot => { return adUnitCode => { return slot.getSlotElementId() === 'myFavoriteDivId'; } }; + * @alias module:pbjs.setTargetingForGPTAsync + */ +pbjsInstance.setTargetingForGPTAsync = function (adUnit, customSlotMatching) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.setTargetingForGPTAsync", arguments); + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isGptPubadsDefined)()) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('window.googletag is not defined on the page'); + return; + } + _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.setTargetingForGPT(adUnit, customSlotMatching); +}; + +/** + * Set query string targeting on all AST (AppNexus Seller Tag) ad units. Note that this function has to be called after all ad units on page are defined. For working example code, see [Using Prebid.js with AppNexus Publisher Ad Server](http://prebid.org/dev-docs/examples/use-prebid-with-appnexus-ad-server.html). + * @param {(string|string[])} adUnitCodes adUnitCode or array of adUnitCodes + * @alias module:pbjs.setTargetingForAst + */ +pbjsInstance.setTargetingForAst = function (adUnitCodes) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.setTargetingForAn", arguments); + if (!_targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.isApntagDefined()) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('window.apntag is not defined on the page'); + return; + } + _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.setTargetingForAst(adUnitCodes); + + // emit event + _events_js__WEBPACK_IMPORTED_MODULE_15__.emit(SET_TARGETING, _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.getAllTargeting()); +}; + +/** + * This function will render the ad (based on params) in the given iframe document passed through. + * Note that doc SHOULD NOT be the parent document page as we can't doc.write() asynchronously + * @param {Document} doc document + * @param {string} id bid id to locate the ad + * @alias module:pbjs.renderAd + */ +pbjsInstance.renderAd = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function (doc, id, options) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.renderAd", arguments); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('Calling renderAd with adId :' + id); + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_16__.renderAdDirect)(doc, id, options); +}); + +/** + * Remove adUnit from the $$PREBID_GLOBAL$$ configuration, if there are no addUnitCode(s) it will remove all + * @param {string| Array} adUnitCode the adUnitCode(s) to remove + * @alias module:pbjs.removeAdUnit + */ +pbjsInstance.removeAdUnit = function (adUnitCode) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.removeAdUnit", arguments); + if (!adUnitCode) { + pbjsInstance.adUnits = []; + return; + } + let adUnitCodes; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(adUnitCode)) { + adUnitCodes = adUnitCode; + } else { + adUnitCodes = [adUnitCode]; + } + adUnitCodes.forEach(adUnitCode => { + for (let i = pbjsInstance.adUnits.length - 1; i >= 0; i--) { + if (pbjsInstance.adUnits[i].code === adUnitCode) { + pbjsInstance.adUnits.splice(i, 1); + } + } + }); +}; + +/** + * @param {Object} requestOptions + * @param {function} requestOptions.bidsBackHandler + * @param {number} requestOptions.timeout + * @param {Array} requestOptions.adUnits + * @param {Array} requestOptions.adUnitCodes + * @param {Array} requestOptions.labels + * @param {String} requestOptions.auctionId + * @alias module:pbjs.requestBids + */ +pbjsInstance.requestBids = function () { + const delegate = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function () { + let { + bidsBackHandler, + timeout, + adUnits, + adUnitCodes, + labels, + auctionId, + ttlBuffer, + ortb2, + metrics, + defer + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + _events_js__WEBPACK_IMPORTED_MODULE_15__.emit(REQUEST_BIDS); + const cbTimeout = timeout || _config_js__WEBPACK_IMPORTED_MODULE_17__.config.getConfig('bidderTimeout'); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.requestBids", arguments); + if (adUnitCodes != null && !Array.isArray(adUnitCodes)) { + adUnitCodes = [adUnitCodes]; + } + if (adUnitCodes && adUnitCodes.length) { + // if specific adUnitCodes supplied filter adUnits for those codes + adUnits = adUnits.filter(unit => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_18__.includes)(adUnitCodes, unit.code)); + } else { + // otherwise derive adUnitCodes from adUnits + adUnitCodes = adUnits && adUnits.map(unit => unit.code); + } + adUnitCodes = adUnitCodes.filter(_utils_js__WEBPACK_IMPORTED_MODULE_4__.uniques); + const ortb2Fragments = { + global: (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)({}, _config_js__WEBPACK_IMPORTED_MODULE_17__.config.getAnyConfig('ortb2') || {}, ortb2 || {}), + bidder: Object.fromEntries(Object.entries(_config_js__WEBPACK_IMPORTED_MODULE_17__.config.getBidderConfig()).map(_ref4 => { + let [bidder, cfg] = _ref4; + return [bidder, (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(cfg.ortb2)]; + }).filter(_ref5 => { + let [_, ortb2] = _ref5; + return ortb2 != null; + })) + }; + return (0,_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_19__.enrichFPD)(_utils_promise_js__WEBPACK_IMPORTED_MODULE_20__.PbPromise.resolve(ortb2Fragments.global)).then(global => { + ortb2Fragments.global = global; + return startAuction({ + bidsBackHandler, + timeout: cbTimeout, + adUnits, + adUnitCodes, + labels, + auctionId, + ttlBuffer, + ortb2Fragments, + metrics, + defer + }); + }); + }, 'requestBids'); + return (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.wrapHook)(delegate, (0,_utils_prerendering_js__WEBPACK_IMPORTED_MODULE_21__.delayIfPrerendering)(() => !_config_js__WEBPACK_IMPORTED_MODULE_17__.config.getConfig('allowPrerendering'), function requestBids() { + let req = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + // unlike the main body of `delegate`, this runs before any other hook has a chance to; + // it's also not restricted in its return value in the way `async` hooks are. + + // if the request does not specify adUnits, clone the global adUnit array; + // otherwise, if the caller goes on to use addAdUnits/removeAdUnits, any asynchronous logic + // in any hook might see their effects. + + let adUnits = req.adUnits || pbjsInstance.adUnits; + req.adUnits = (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(adUnits) ? adUnits.slice() : [adUnits]; + req.metrics = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_22__.newMetrics)(); + req.metrics.checkpoint('requestBids'); + req.defer = (0,_utils_promise_js__WEBPACK_IMPORTED_MODULE_20__.defer)({ + promiseFactory: r => new Promise(r) + }); + delegate.call(this, req); + return req.defer.promise; + })); +}(); +const startAuction = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function () { + let { + bidsBackHandler, + timeout: cbTimeout, + adUnits, + ttlBuffer, + adUnitCodes, + labels, + auctionId, + ortb2Fragments, + metrics, + defer + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const s2sBidders = (0,_adapterManager_js__WEBPACK_IMPORTED_MODULE_23__.getS2SBidderSet)(_config_js__WEBPACK_IMPORTED_MODULE_17__.config.getConfig('s2sConfig') || []); + fillAdUnitDefaults(adUnits); + adUnits = (0,_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_22__.useMetrics)(metrics).measureTime('requestBids.validate', () => checkAdUnitSetup(adUnits)); + function auctionDone(bids, timedOut, auctionId) { + if (typeof bidsBackHandler === 'function') { + try { + bidsBackHandler(bids, timedOut, auctionId); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Error executing bidsBackHandler', null, e); + } + } + defer.resolve({ + bids, + timedOut, + auctionId + }); + } + const tids = {}; + + /* + * for a given adunit which supports a set of mediaTypes + * and a given bidder which supports a set of mediaTypes + * a bidder is eligible to participate on the adunit + * if it supports at least one of the mediaTypes on the adunit + */ + adUnits.forEach(adUnit => { + // get the adunit's mediaTypes, defaulting to banner if mediaTypes isn't present + const adUnitMediaTypes = Object.keys(adUnit.mediaTypes || { + 'banner': 'banner' + }); + + // get the bidder's mediaTypes + const allBidders = adUnit.bids.map(bid => bid.bidder); + const bidderRegistry = _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].bidderRegistry; + const bidders = allBidders.filter(bidder => !s2sBidders.has(bidder)); + adUnit.adUnitId = (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(); + const tid = adUnit.ortb2Imp?.ext?.tid; + if (tid) { + if (tids.hasOwnProperty(adUnit.code)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`Multiple distinct ortb2Imp.ext.tid were provided for twin ad units '${adUnit.code}'`); + } else { + tids[adUnit.code] = tid; + } + } + if (ttlBuffer != null && !adUnit.hasOwnProperty('ttlBuffer')) { + adUnit.ttlBuffer = ttlBuffer; + } + bidders.forEach(bidder => { + const adapter = bidderRegistry[bidder]; + const spec = adapter && adapter.getSpec && adapter.getSpec(); + // banner is default if not specified in spec + const bidderMediaTypes = spec && spec.supportedMediaTypes || ['banner']; + + // check if the bidder's mediaTypes are not in the adUnit's mediaTypes + const bidderEligible = adUnitMediaTypes.some(type => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_18__.includes)(bidderMediaTypes, type)); + if (!bidderEligible) { + // drop the bidder from the ad unit if it's not compatible + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)((0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.unsupportedBidderMessage)(adUnit, bidder)); + adUnit.bids = adUnit.bids.filter(bid => bid.bidder !== bidder); + } + }); + }); + if (!adUnits || adUnits.length === 0) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('No adUnits configured. No bids requested.'); + auctionDone(); + } else { + adUnits.forEach(au => { + const tid = au.ortb2Imp?.ext?.tid || tids[au.code] || (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(); + if (!tids.hasOwnProperty(au.code)) { + tids[au.code] = tid; + } + au.transactionId = tid; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(au, 'ortb2Imp.ext.tid', tid); + }); + const auction = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.createAuction({ + adUnits, + adUnitCodes, + callback: auctionDone, + cbTimeout, + labels, + auctionId, + ortb2Fragments, + metrics + }); + let adUnitsLen = adUnits.length; + if (adUnitsLen > 15) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`Current auction ${auction.getAuctionId()} contains ${adUnitsLen} adUnits.`, adUnits); + } + adUnitCodes.forEach(code => _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.setLatestAuctionForAdUnit(code, auction.getAuctionId())); + auction.callBids(); + } +}, 'startAuction'); +function executeCallbacks(fn, reqBidsConfigObj) { + runAll(_storageManager_js__WEBPACK_IMPORTED_MODULE_24__.storageCallbacks); + runAll(enableAnalyticsCallbacks); + fn.call(this, reqBidsConfigObj); + function runAll(queue) { + var queued; + while (queued = queue.shift()) { + queued(); + } + } +} + +// This hook will execute all storage callbacks which were registered before gdpr enforcement hook was added. Some bidders, user id modules use storage functions when module is parsed but gdpr enforcement hook is not added at that stage as setConfig callbacks are yet to be called. Hence for such calls we execute all the stored callbacks just before requestBids. At this hook point we will know for sure that tcfControl module is added or not +pbjsInstance.requestBids.before(executeCallbacks, 49); + +/** + * + * Add adunit(s) + * @param {Array|Object} adUnitArr Array of adUnits or single adUnit Object. + * @alias module:pbjs.addAdUnits + */ +pbjsInstance.addAdUnits = function (adUnitArr) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.addAdUnits", arguments); + pbjsInstance.adUnits.push.apply(pbjsInstance.adUnits, (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(adUnitArr) ? adUnitArr : [adUnitArr]); + // emit event + _events_js__WEBPACK_IMPORTED_MODULE_15__.emit(ADD_AD_UNITS); +}; + +/** + * @param {string} event the name of the event + * @param {Function} handler a callback to set on event + * @param {string} id an identifier in the context of the event + * @alias module:pbjs.onEvent + * + * This API call allows you to register a callback to handle a Prebid.js event. + * An optional `id` parameter provides more finely-grained event callback registration. + * This makes it possible to register callback events for a specific item in the + * event context. For example, `bidWon` events will accept an `id` for ad unit code. + * `bidWon` callbacks registered with an ad unit code id will be called when a bid + * for that ad unit code wins the auction. Without an `id` this method registers the + * callback for every `bidWon` event. + * + * Currently `bidWon` is the only event that accepts an `id` parameter. + */ +pbjsInstance.onEvent = function (event, handler, id) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.onEvent", arguments); + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(handler)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('The event handler provided is not a function and was not set on event "' + event + '".'); + return; + } + if (id && !eventValidators[event].call(null, id)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('The id provided is not valid for event "' + event + '" and no handler was set.'); + return; + } + _events_js__WEBPACK_IMPORTED_MODULE_15__.on(event, handler, id); +}; + +/** + * @param {string} event the name of the event + * @param {Function} handler a callback to remove from the event + * @param {string} id an identifier in the context of the event (see `$$PREBID_GLOBAL$$.onEvent`) + * @alias module:pbjs.offEvent + */ +pbjsInstance.offEvent = function (event, handler, id) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.offEvent", arguments); + if (id && !eventValidators[event].call(null, id)) { + return; + } + _events_js__WEBPACK_IMPORTED_MODULE_15__.off(event, handler, id); +}; + +/** + * Return a copy of all events emitted + * + * @alias module:pbjs.getEvents + */ +pbjsInstance.getEvents = function () { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.getEvents"); + return _events_js__WEBPACK_IMPORTED_MODULE_15__.getEvents(); +}; + +/* + * Wrapper to register bidderAdapter externally (adapterManager.registerBidAdapter()) + * @param {Function} bidderAdaptor [description] + * @param {string} bidderCode [description] + * @param {object} spec [description] + * @alias module:pbjs.registerBidAdapter + */ +pbjsInstance.registerBidAdapter = function (bidderAdaptor, bidderCode, spec) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.registerBidAdapter", arguments); + try { + const bidder = spec ? (0,_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_25__.newBidder)(spec) : bidderAdaptor(); + _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].registerBidAdapter(bidder, bidderCode); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Error registering bidder adapter : ' + e.message); + } +}; + +/** + * Wrapper to register analyticsAdapter externally (adapterManager.registerAnalyticsAdapter()) + * @param {Object} options [description] + * @alias module:pbjs.registerAnalyticsAdapter + */ +pbjsInstance.registerAnalyticsAdapter = function (options) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.registerAnalyticsAdapter", arguments); + try { + _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].registerAnalyticsAdapter(options); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Error registering analytics adapter : ' + e.message); + } +}; + +/** + * Wrapper to bidfactory.createBid() + * @param {string} statusCode [description] + * @alias module:pbjs.createBid + * @return {Object} bidResponse [description] + */ +pbjsInstance.createBid = function (statusCode) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.createBid", arguments); + return (0,_bidfactory_js__WEBPACK_IMPORTED_MODULE_26__.createBid)(statusCode); +}; + +/** + * Enable sending analytics data to the analytics provider of your + * choice. + * + * For usage, see [Integrate with the Prebid Analytics + * API](http://prebid.org/dev-docs/integrate-with-the-prebid-analytics-api.html). + * + * For a list of analytics adapters, see [Analytics for + * Prebid](http://prebid.org/overview/analytics.html). + * @param {Object} config + * @param {string} config.provider The name of the provider, e.g., `"ga"` for Google Analytics. + * @param {Object} config.options The options for this particular analytics adapter. This will likely vary between adapters. + * @alias module:pbjs.enableAnalytics + */ + +// Stores 'enableAnalytics' callbacks for later execution. +const enableAnalyticsCallbacks = []; +const enableAnalyticsCb = (0,_hook_js__WEBPACK_IMPORTED_MODULE_11__.hook)('async', function (config) { + if (config && !(0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(config)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.enableAnalytics for: ", config); + _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].enableAnalytics(config); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)("pbjs.enableAnalytics should be called with option {}"); + } +}, 'enableAnalyticsCb'); +pbjsInstance.enableAnalytics = function (config) { + enableAnalyticsCallbacks.push(enableAnalyticsCb.bind(this, config)); +}; + +/** + * @alias module:pbjs.aliasBidder + */ +pbjsInstance.aliasBidder = function (bidderCode, alias, options) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)("Invoking pbjs.aliasBidder", arguments); + if (bidderCode && alias) { + _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].aliasBidAdapter(bidderCode, alias, options); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('bidderCode and alias must be passed as arguments', "pbjs.aliasBidder"); + } +}; + +/** + * @alias module:pbjs.aliasRegistry + */ +pbjsInstance.aliasRegistry = _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].aliasRegistry; +_config_js__WEBPACK_IMPORTED_MODULE_17__.config.getConfig('aliasRegistry', config => { + if (config.aliasRegistry === 'private') delete pbjsInstance.aliasRegistry; +}); + +/** + * The bid response object returned by an external bidder adapter during the auction. + * @typedef {Object} AdapterBidResponse + * @property {string} pbAg Auto granularity price bucket; CPM <= 5 ? increment = 0.05 : CPM > 5 && CPM <= 10 ? increment = 0.10 : CPM > 10 && CPM <= 20 ? increment = 0.50 : CPM > 20 ? priceCap = 20.00. Example: `"0.80"`. + * @property {string} pbCg Custom price bucket. For example setup, see `setConfig({ priceGranularity: ... })`. Example: `"0.84"`. + * @property {string} pbDg Dense granularity price bucket; CPM <= 3 ? increment = 0.01 : CPM > 3 && CPM <= 8 ? increment = 0.05 : CPM > 8 && CPM <= 20 ? increment = 0.50 : CPM > 20? priceCap = 20.00. Example: `"0.84"`. + * @property {string} pbLg Low granularity price bucket; $0.50 increment, capped at $5, floored to two decimal places. Example: `"0.50"`. + * @property {string} pbMg Medium granularity price bucket; $0.10 increment, capped at $20, floored to two decimal places. Example: `"0.80"`. + * @property {string} pbHg High granularity price bucket; $0.01 increment, capped at $20, floored to two decimal places. Example: `"0.84"`. + * + * @property {string} bidder The string name of the bidder. This *may* be the same as the `bidderCode`. For For a list of all bidders and their codes, see [Bidders' Params](http://prebid.org/dev-docs/bidders.html). + * @property {string} bidderCode The unique string that identifies this bidder. For a list of all bidders and their codes, see [Bidders' Params](http://prebid.org/dev-docs/bidders.html). + * + * @property {string} requestId The [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) representing the bid request. + * @property {number} requestTimestamp The time at which the bid request was sent out, expressed in milliseconds. + * @property {number} responseTimestamp The time at which the bid response was received, expressed in milliseconds. + * @property {number} timeToRespond How long it took for the bidder to respond with this bid, expressed in milliseconds. + * + * @property {string} size The size of the ad creative, expressed in `"AxB"` format, where A and B are numbers of pixels. Example: `"320x50"`. + * @property {string} width The width of the ad creative in pixels. Example: `"320"`. + * @property {string} height The height of the ad creative in pixels. Example: `"50"`. + * + * @property {string} ad The actual ad creative content, often HTML with CSS, JavaScript, and/or links to additional content. Example: `"",`. + * @property {number} ad_id The ad ID of the creative, as understood by the bidder's system. Used by the line item's [creative in the ad server](http://prebid.org/adops/send-all-bids-adops.html#step-3-add-a-creative). + * @property {string} adUnitCode The code used to uniquely identify the ad unit on the publisher's page. + * + * @property {string} statusMessage The status of the bid. Allowed values: `"Bid available"` or `"Bid returned empty or error response"`. + * @property {number} cpm The exact bid price from the bidder, expressed to the thousandths place. Example: `"0.849"`. + * + * @property {Object} adserverTargeting An object whose values represent the ad server's targeting on the bid. + * @property {string} adserverTargeting.hb_adid The ad ID of the creative, as understood by the ad server. + * @property {string} adserverTargeting.hb_pb The price paid to show the creative, as logged in the ad server. + * @property {string} adserverTargeting.hb_bidder The winning bidder whose ad creative will be served by the ad server. + */ + +/** + * Get all of the bids that have been rendered. Useful for [troubleshooting your integration](http://prebid.org/dev-docs/prebid-troubleshooting-guide.html). + * @return {Array} A list of bids that have been rendered. + */ +pbjsInstance.getAllWinningBids = function () { + return _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getAllWinningBids(); +}; + +/** + * Get all of the bids that have won their respective auctions. + * @return {Array} A list of bids that have won their respective auctions. + */ +pbjsInstance.getAllPrebidWinningBids = function () { + return _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getBidsReceived().filter(bid => bid.status === _constants_js__WEBPACK_IMPORTED_MODULE_2__.BID_STATUS.BID_TARGETING_SET); +}; + +/** + * Get array of highest cpm bids for all adUnits, or highest cpm bid + * object for the given adUnit + * @param {string} adUnitCode - optional ad unit code + * @alias module:pbjs.getHighestCpmBids + * @return {Array} array containing highest cpm bid object(s) + */ +pbjsInstance.getHighestCpmBids = function (adUnitCode) { + return _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.getWinningBids(adUnitCode); +}; +pbjsInstance.clearAllAuctions = function () { + _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.clearAllAuctions(); +}; +if (true) { + /** + * Mark the winning bid as used, should only be used in conjunction with video + * @typedef {Object} MarkBidRequest + * @property {string} adUnitCode The ad unit code + * @property {string} adId The id representing the ad we want to mark + * @property {boolean} events If true, fires tracking pixels and BID_WON handlers + * @property {boolean} analytics alias of `events` (for backwards compat) + * + * @alias module:pbjs.markWinningBidAsUsed + */ + pbjsInstance.markWinningBidAsUsed = function (_ref6) { + let { + adId, + adUnitCode, + analytics = false, + events = false + } = _ref6; + let bids; + if (adUnitCode && adId == null) { + bids = _targeting_js__WEBPACK_IMPORTED_MODULE_12__.targeting.getWinningBids(adUnitCode); + } else if (adId) { + bids = _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getBidsReceived().filter(bid => bid.adId === adId); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.'); + } + if (bids.length > 0) { + if (analytics || events) { + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_16__.markWinningBid)(bids[0]); + } else { + _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.addWinningBid(bids[0]); + } + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_16__.markBidAsRendered)(bids[0]); + } + }; +} + +/** + * Get Prebid config options + * @param {Object} options + * @alias module:pbjs.getConfig + */ +pbjsInstance.getConfig = _config_js__WEBPACK_IMPORTED_MODULE_17__.config.getAnyConfig; +pbjsInstance.readConfig = _config_js__WEBPACK_IMPORTED_MODULE_17__.config.readAnyConfig; +pbjsInstance.mergeConfig = _config_js__WEBPACK_IMPORTED_MODULE_17__.config.mergeConfig; +pbjsInstance.mergeBidderConfig = _config_js__WEBPACK_IMPORTED_MODULE_17__.config.mergeBidderConfig; + +/** + * Set Prebid config options. + * See https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html + * + * @param {Object} options Global Prebid configuration object. Must be JSON - no JavaScript functions are allowed. + */ +pbjsInstance.setConfig = _config_js__WEBPACK_IMPORTED_MODULE_17__.config.setConfig; +pbjsInstance.setBidderConfig = _config_js__WEBPACK_IMPORTED_MODULE_17__.config.setBidderConfig; +pbjsInstance.que.push(() => (0,_secureCreatives_js__WEBPACK_IMPORTED_MODULE_27__.listenMessagesFromCreative)()); + +/** + * This queue lets users load Prebid asynchronously, but run functions the same way regardless of whether it gets loaded + * before or after their script executes. For example, given the code: + * + * + * + * + * If the page's script runs before prebid loads, then their function gets added to the queue, and executed + * by prebid once it's done loading. If it runs after prebid loads, then this monkey-patch causes their + * function to execute immediately. + * + * @param {function} command A function which takes no arguments. This is guaranteed to run exactly once, and only after + * the Prebid script has been fully loaded. + * @alias module:pbjs.cmd.push + * @alias module:pbjs.que.push + */ +function quePush(command) { + if (typeof command === 'function') { + try { + command.call(); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Error processing command :', e.message, e.stack); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)("Commands written into pbjs.cmd.push must be wrapped in a function"); + } +} +function processQueue(queue) { + queue.forEach(function (cmd) { + if (typeof cmd.called === 'undefined') { + try { + cmd.call(); + cmd.called = true; + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Error processing command :', 'prebid.js', e); + } + } + }); +} + +/** + * @alias module:pbjs.processQueue + */ +pbjsInstance.processQueue = (0,_utils_prerendering_js__WEBPACK_IMPORTED_MODULE_21__.delayIfPrerendering)(() => (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().delayPrerendering, function () { + pbjsInstance.que.push = pbjsInstance.cmd.push = quePush; + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_16__.insertLocatorFrame)(); + _hook_js__WEBPACK_IMPORTED_MODULE_11__.hook.ready(); + processQueue(pbjsInstance.que); + processQueue(pbjsInstance.cmd); +}); + +/** + * @alias module:pbjs.triggerBilling + */ +pbjsInstance.triggerBilling = _ref7 => { + let { + adId, + adUnitCode + } = _ref7; + _auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getAllWinningBids().filter(bid => bid.adId === adId || adId == null && bid.adUnitCode === adUnitCode).forEach(bid => { + _adapterManager_js__WEBPACK_IMPORTED_MODULE_23__["default"].triggerBilling(bid); + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_16__.renderIfDeferred)(bid); + }); +}; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pbjsInstance); + +/***/ }), + +/***/ "./src/prebidGlobal.js": +/*!*****************************!*\ + !*** ./src/prebidGlobal.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getGlobal: () => (/* binding */ getGlobal), +/* harmony export */ registerModule: () => (/* binding */ registerModule) +/* harmony export */ }); +// if $$PREBID_GLOBAL$$ already exists in global document scope, use it, if not, create the object +// global defination should happen BEFORE imports to avoid global undefined errors. +/* global $$DEFINE_PREBID_GLOBAL$$ */ +const scope = false ? 0 : window; +const global = scope.pbjs = scope.pbjs || {}; +global.cmd = global.cmd || []; +global.que = global.que || []; + +// create a pbjs global pointer +if (scope === window) { + scope._pbjsGlobals = scope._pbjsGlobals || []; + scope._pbjsGlobals.push("pbjs"); +} +function getGlobal() { + return global; +} +function registerModule(name) { + global.installedModules.push(name); +} + +/***/ }), + +/***/ "./src/refererDetection.js": +/*!*********************************!*\ + !*** ./src/refererDetection.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getRefererInfo: () => (/* binding */ getRefererInfo), +/* harmony export */ parseDomain: () => (/* binding */ parseDomain) +/* harmony export */ }); +/* unused harmony exports ensureProtocol, detectReferer, cacheWithLocation */ +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/** + * The referer detection module attempts to gather referer information from the current page that prebid.js resides in. + * The information that it tries to collect includes: + * The detected top url in the nav bar, + * Whether it was able to reach the top most window (if for example it was embedded in several iframes), + * The number of iframes it was embedded in if applicable (by default max ten iframes), + * A list of the domains of each embedded window if applicable. + * Canonical URL which refers to an HTML link element, with the attribute of rel="canonical", found in the element of your webpage + */ + + + + +/** + * Prepend a URL with the page's protocol (http/https), if necessary. + */ +function ensureProtocol(url) { + let win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window; + if (!url) return url; + if (/\w+:\/\//.exec(url)) { + // url already has protocol + return url; + } + let windowProto = win.location.protocol; + try { + windowProto = win.top.location.protocol; + } catch (e) {} + if (/^\/\//.exec(url)) { + // url uses relative protocol ("//example.com") + return windowProto + url; + } else { + return `${windowProto}//${url}`; + } +} + +/** + * Extract the domain portion from a URL. + * @param {string} url - The URL to extract the domain from. + * @param {Object} options - Options for parsing the domain. + * @param {boolean} options.noLeadingWww - If true, remove 'www.' appearing at the beginning of the domain. + * @param {boolean} options.noPort - If true, do not include the ':[port]' portion. + * @return {string|undefined} - The extracted domain or undefined if the URL is invalid. + */ +function parseDomain(url) { + let { + noLeadingWww = false, + noPort = false + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + try { + url = new URL(ensureProtocol(url)); + } catch (e) { + return; + } + url = noPort ? url.hostname : url.host; + if (noLeadingWww && url.startsWith('www.')) { + url = url.substring(4); + } + return url; +} + +/** + * This function returns canonical URL which refers to an HTML link element, with the attribute of rel="canonical", found in the element of your webpage + * + * @param {Object} doc document + * @returns {string|null} + */ +function getCanonicalUrl(doc) { + try { + const element = doc.querySelector("link[rel='canonical']"); + if (element !== null) { + return element.href; + } + } catch (e) { + // Ignore error + } + return null; +} + +/** + * @param {Window} win Window + * @returns {Function} + */ +function detectReferer(win) { + /** + * This function would return a read-only array of hostnames for all the parent frames. + * win.location.ancestorOrigins is only supported in webkit browsers. For non-webkit browsers it will return undefined. + * + * @param {Window} win Window object + * @returns {(undefined|Array)} Ancestor origins or undefined + */ + function getAncestorOrigins(win) { + try { + if (!win.location.ancestorOrigins) { + return; + } + return win.location.ancestorOrigins; + } catch (e) { + // Ignore error + } + } + + // TODO: the meaning of "reachedTop" seems to be intentionally ambiguous - best to leave them out of + // the typedef for now. (for example, unit tests enforce that "reachedTop" should be false in some situations where we + // happily provide a location for the top). + + /** + * @typedef {Object} refererInfo + * @property {string|null} location the browser's location, or null if not available (due to cross-origin restrictions) + * @property {string|null} canonicalUrl the site's canonical URL as set by the publisher, through setConfig({pageUrl}) or + * @property {string|null} page the best candidate for the current page URL: `canonicalUrl`, falling back to `location` + * @property {string|null} domain the domain portion of `page` + * @property {string|null} ref the referrer (document.referrer) to the current page, or null if not available (due to cross-origin restrictions) + * @property {string} topmostLocation of the top-most frame for which we could guess the location. Outside of cross-origin scenarios, this is equivalent to `location`. + * @property {number} numIframes number of steps between window.self and window.top + * @property {Array} stack our best guess at the location for each frame, in the direction top -> self. + */ + + /** + * Walk up the windows to get the origin stack and best available referrer, canonical URL, etc. + * + * @returns {refererInfo} An object containing referer information. + */ + function refererInfo() { + const stack = []; + const ancestors = getAncestorOrigins(win); + const maxNestedIframes = _config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('maxNestedIframes'); + let currentWindow; + let bestLocation; + let bestCanonicalUrl; + let reachedTop = false; + let level = 0; + let valuesFromAmp = false; + let inAmpFrame = false; + let hasTopLocation = false; + do { + const previousWindow = currentWindow; + const wasInAmpFrame = inAmpFrame; + let currentLocation; + let crossOrigin = false; + let foundLocation = null; + inAmpFrame = false; + currentWindow = currentWindow ? currentWindow.parent : win; + try { + currentLocation = currentWindow.location.href || null; + } catch (e) { + crossOrigin = true; + } + if (crossOrigin) { + if (wasInAmpFrame) { + const context = previousWindow.context; + try { + foundLocation = context.sourceUrl; + bestLocation = foundLocation; + hasTopLocation = true; + valuesFromAmp = true; + if (currentWindow === win.top) { + reachedTop = true; + } + if (context.canonicalUrl) { + bestCanonicalUrl = context.canonicalUrl; + } + } catch (e) {/* Do nothing */} + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Trying to access cross domain iframe. Continuing without referrer and location'); + try { + // the referrer to an iframe is the parent window + const referrer = previousWindow.document.referrer; + if (referrer) { + foundLocation = referrer; + if (currentWindow === win.top) { + reachedTop = true; + } + } + } catch (e) {/* Do nothing */} + if (!foundLocation && ancestors && ancestors[level - 1]) { + foundLocation = ancestors[level - 1]; + if (currentWindow === win.top) { + hasTopLocation = true; + } + } + if (foundLocation && !valuesFromAmp) { + bestLocation = foundLocation; + } + } + } else { + if (currentLocation) { + foundLocation = currentLocation; + bestLocation = foundLocation; + valuesFromAmp = false; + if (currentWindow === win.top) { + reachedTop = true; + const canonicalUrl = getCanonicalUrl(currentWindow.document); + if (canonicalUrl) { + bestCanonicalUrl = canonicalUrl; + } + } + } + if (currentWindow.context && currentWindow.context.sourceUrl) { + inAmpFrame = true; + } + } + stack.push(foundLocation); + level++; + } while (currentWindow !== win.top && level < maxNestedIframes); + stack.reverse(); + let ref; + try { + ref = win.top.document.referrer; + } catch (e) {} + const location = reachedTop || hasTopLocation ? bestLocation : null; + const canonicalUrl = _config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('pageUrl') || bestCanonicalUrl || null; + let page = _config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('pageUrl') || location || ensureProtocol(canonicalUrl, win); + if (location && location.indexOf('?') > -1 && page.indexOf('?') === -1) { + page = `${page}${location.substring(location.indexOf('?'))}`; + } + return { + reachedTop, + isAmp: valuesFromAmp, + numIframes: level - 1, + stack, + topmostLocation: bestLocation || null, + location, + canonicalUrl, + page, + domain: parseDomain(page) || null, + ref: ref || null, + // TODO: the "legacy" refererInfo object is provided here, for now, to accomodate + // adapters that decided to just send it verbatim to their backend. + legacy: { + reachedTop, + isAmp: valuesFromAmp, + numIframes: level - 1, + stack, + referer: bestLocation || null, + canonicalUrl + } + }; + } + return refererInfo; +} + +// cache result of fn (= referer info) as long as: +// - we are the top window +// - canonical URL tag and window location have not changed +function cacheWithLocation(fn) { + let win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window; + if (win.top !== win) return fn; + let canonical, href, value; + return function () { + const newCanonical = getCanonicalUrl(win.document); + const newHref = win.location.href; + if (canonical !== newCanonical || newHref !== href) { + canonical = newCanonical; + href = newHref; + value = fn(); + } + return value; + }; +} + +/** + * @type {function(): refererInfo} + */ +const getRefererInfo = cacheWithLocation(detectReferer(window)); + +/***/ }), + +/***/ "./src/secureCreatives.js": +/*!********************************!*\ + !*** ./src/secureCreatives.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ listenMessagesFromCreative: () => (/* binding */ listenMessagesFromCreative) +/* harmony export */ }); +/* unused harmony exports getReplier, receiveMessage, resizeRemoteCreative */ +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./native.js */ "./src/native.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _adRendering_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./adRendering.js */ "./src/adRendering.js"); +/* harmony import */ var _creativeRenderers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./creativeRenderers.js */ "./src/creativeRenderers.js"); +/* Secure Creatives + Provides support for rendering creatives into cross domain iframes such as SafeFrame to prevent + access to a publisher page from creative payloads. + */ + + + + + + + +const { + REQUEST, + RESPONSE, + NATIVE, + EVENT +} = _constants_js__WEBPACK_IMPORTED_MODULE_0__.MESSAGES; +const HANDLER_MAP = { + [REQUEST]: handleRenderRequest, + [EVENT]: handleEventRequest +}; +if (true) { + Object.assign(HANDLER_MAP, { + [NATIVE]: handleNativeRequest + }); +} +function listenMessagesFromCreative() { + window.addEventListener('message', function (ev) { + receiveMessage(ev); + }, false); +} +function getReplier(ev) { + if (ev.origin == null && ev.ports.length === 0) { + return function () { + const msg = 'Cannot post message to a frame with null origin. Please update creatives to use MessageChannel, see https://github.com/prebid/Prebid.js/issues/7870'; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(msg); + throw new Error(msg); + }; + } else if (ev.ports.length > 0) { + return function (message) { + ev.ports[0].postMessage(JSON.stringify(message)); + }; + } else { + return function (message) { + ev.source.postMessage(JSON.stringify(message), ev.origin); + }; + } +} +function ensureAdId(adId, reply) { + return function (data) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return reply(Object.assign({}, data, { + adId + }), ...args); + }; +} +function receiveMessage(ev) { + var key = ev.message ? 'message' : 'data'; + var data = {}; + try { + data = JSON.parse(ev[key]); + } catch (e) { + return; + } + if (data && data.adId && data.message && HANDLER_MAP.hasOwnProperty(data.message)) { + return (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.getBidToRender)(data.adId, data.message === _constants_js__WEBPACK_IMPORTED_MODULE_0__.MESSAGES.REQUEST).then(adObject => { + HANDLER_MAP[data.message](ensureAdId(data.adId, getReplier(ev)), data, adObject); + }); + } +} +function getResizer(adId, bidResponse) { + // in some situations adId !== bidResponse.adId + // the first is the one that was requested and is tied to the element + // the second is the one that is being rendered (sometimes different, e.g. in some paapi setups) + return function (width, height) { + resizeRemoteCreative({ + ...bidResponse, + width, + height, + adId + }); + }; +} +function handleRenderRequest(reply, message, bidResponse) { + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.handleRender)({ + renderFn(adData) { + reply(Object.assign({ + message: RESPONSE, + renderer: (0,_creativeRenderers_js__WEBPACK_IMPORTED_MODULE_3__.getCreativeRendererSource)(bidResponse), + rendererVersion: _creativeRenderers_js__WEBPACK_IMPORTED_MODULE_3__.PUC_MIN_VERSION + }, adData)); + }, + resizeFn: getResizer(message.adId, bidResponse), + options: message.options, + adId: message.adId, + bidResponse + }); +} +function handleNativeRequest(reply, data, adObject) { + // handle this script from native template in an ad server + // window.parent.postMessage(JSON.stringify({ + // message: 'Prebid Native', + // adId: '%%PATTERN:hb_adid%%' + // }), '*'); + if (adObject == null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Cannot find ad for x-origin event request: '${data.adId}'`); + return; + } + switch (data.action) { + case 'assetRequest': + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.deferRendering)(adObject, () => reply((0,_native_js__WEBPACK_IMPORTED_MODULE_4__.getAssetMessage)(data, adObject))); + break; + case 'allAssetRequest': + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.deferRendering)(adObject, () => reply((0,_native_js__WEBPACK_IMPORTED_MODULE_4__.getAllAssetsMessage)(data, adObject))); + break; + default: + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.handleNativeMessage)(data, adObject, { + resizeFn: getResizer(data.adId, adObject) + }); + (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.markWinner)(adObject); + } +} +function handleEventRequest(reply, data, adObject) { + if (adObject == null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Cannot find ad '${data.adId}' for x-origin event request`); + return; + } + if (adObject.status !== _constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.RENDERED) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Received x-origin event request without corresponding render request for ad '${adObject.adId}'`); + return; + } + return (0,_adRendering_js__WEBPACK_IMPORTED_MODULE_2__.handleCreativeEvent)(data, adObject); +} +function resizeRemoteCreative(_ref) { + let { + instl, + adId, + adUnitCode, + width, + height + } = _ref; + // do not resize interstitials - the creative frame takes the full screen and sizing of the ad should + // be handled within it. + if (instl) return; + function getDimension(value) { + return value ? value + 'px' : '100%'; + } + // resize both container div + iframe + ['div', 'iframe'].forEach(elmType => { + // not select element that gets removed after dfp render + let element = getElementByAdUnit(elmType + ':not([style*="display: none"])'); + if (element) { + let elementStyle = element.style; + elementStyle.width = getDimension(width); + elementStyle.height = getDimension(height); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Unable to locate matching page element for adUnitCode ${adUnitCode}. Can't resize it to ad's dimensions. Please review setup.`); + } + }); + function getElementByAdUnit(elmType) { + let id = getElementIdBasedOnAdServer(adId, adUnitCode); + let parentDivEle = document.getElementById(id); + return parentDivEle && parentDivEle.querySelector(elmType); + } + function getElementIdBasedOnAdServer(adId, adUnitCode) { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isGptPubadsDefined)()) { + return getDfpElementId(adId); + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isApnGetTagDefined)()) { + return getAstElementId(adUnitCode); + } else { + return adUnitCode; + } + } + function getDfpElementId(adId) { + const slot = (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(window.googletag.pubads().getSlots(), slot => { + return (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(slot.getTargetingKeys(), key => { + return (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(slot.getTargeting(key), adId); + }); + }); + return slot ? slot.getSlotElementId() : null; + } + function getAstElementId(adUnitCode) { + let astTag = window.apntag.getTag(adUnitCode); + return astTag && astTag.targetId; + } +} + +/***/ }), + +/***/ "./src/storageManager.js": +/*!*******************************!*\ + !*** ./src/storageManager.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ STORAGE_TYPE_COOKIES: () => (/* binding */ STORAGE_TYPE_COOKIES), +/* harmony export */ STORAGE_TYPE_LOCALSTORAGE: () => (/* binding */ STORAGE_TYPE_LOCALSTORAGE), +/* harmony export */ getCoreStorageManager: () => (/* binding */ getCoreStorageManager), +/* harmony export */ getStorageManager: () => (/* binding */ getStorageManager), +/* harmony export */ storageCallbacks: () => (/* binding */ storageCallbacks) +/* harmony export */ }); +/* unused harmony exports newStorageManager, deviceAccessRule, storageAllowedRule, resetData */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _bidderSettings_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _activities_rules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _activities_params_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./activities/params.js */ "./src/activities/params.js"); +/* harmony import */ var _activities_activities_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _activities_activityParams_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./activities/activityParams.js */ "./src/activities/activityParams.js"); + + + + + + + + + +const STORAGE_TYPE_LOCALSTORAGE = 'html5'; +const STORAGE_TYPE_COOKIES = 'cookie'; +let storageCallbacks = []; + +/* eslint-disable no-restricted-properties */ + +/* + * Storage manager constructor. Consumers should prefer one of `getStorageManager` or `getCoreStorageManager`. + */ +function newStorageManager() { + let { + moduleName, + moduleType + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let { + isAllowed = _activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.isActivityAllowed + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + function isValid(cb, storageType) { + let mod = moduleName; + const curBidder = _config_js__WEBPACK_IMPORTED_MODULE_1__.config.getCurrentBidder(); + if (curBidder && moduleType === _activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_BIDDER && _adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].aliasRegistry[curBidder] === moduleName) { + mod = curBidder; + } + const result = { + valid: isAllowed(_activities_activities_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_ACCESS_DEVICE, (0,_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_5__.activityParams)(moduleType, mod, { + [_activities_params_js__WEBPACK_IMPORTED_MODULE_6__.ACTIVITY_PARAM_STORAGE_TYPE]: storageType + })) + }; + return cb(result); + } + function schedule(operation, storageType, done) { + if (done && typeof done === 'function') { + storageCallbacks.push(function () { + let result = isValid(operation, storageType); + done(result); + }); + } else { + return isValid(operation, storageType); + } + } + + /** + * @param {string} key + * @param {string} value + * @param {string} [expires=''] + * @param {string} [sameSite='/'] + * @param {string} [domain] domain (e.g., 'example.com' or 'subdomain.example.com'). + * If not specified, defaults to the host portion of the current document location. + * If a domain is specified, subdomains are always included. + * Domain must match the domain of the JavaScript origin. Setting cookies to foreign domains will be silently ignored. + * @param {function} [done] + */ + const setCookie = function (key, value, expires, sameSite, domain, done) { + let cb = function (result) { + if (result && result.valid) { + const domainPortion = domain && domain !== '' ? ` ;domain=${encodeURIComponent(domain)}` : ''; + const expiresPortion = expires && expires !== '' ? ` ;expires=${expires}` : ''; + const isNone = sameSite != null && sameSite.toLowerCase() == 'none'; + const secure = isNone ? '; Secure' : ''; + document.cookie = `${key}=${encodeURIComponent(value)}${expiresPortion}; path=/${domainPortion}${sameSite ? `; SameSite=${sameSite}` : ''}${secure}`; + } + }; + return schedule(cb, STORAGE_TYPE_COOKIES, done); + }; + + /** + * @param {string} name + * @param {function} [done] + * @returns {(string|null)} + */ + const getCookie = function (name, done) { + let cb = function (result) { + if (result && result.valid) { + let m = window.document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]*)\\s*(;|$)'); + return m ? decodeURIComponent(m[2]) : null; + } + return null; + }; + return schedule(cb, STORAGE_TYPE_COOKIES, done); + }; + + /** + * @param {function} [done] + * @returns {boolean} + */ + const cookiesAreEnabled = function (done) { + let cb = function (result) { + if (result && result.valid) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.checkCookieSupport)(); + } + return false; + }; + return schedule(cb, STORAGE_TYPE_COOKIES, done); + }; + function storageMethods(name) { + const capName = name.charAt(0).toUpperCase() + name.substring(1); + const backend = () => window[name]; + const hasStorage = function (done) { + let cb = function (result) { + if (result && result.valid) { + try { + return !!backend(); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.logError)(`${name} api disabled`); + } + } + return false; + }; + return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done); + }; + return { + [`has${capName}`]: hasStorage, + [`${name}IsEnabled`](done) { + let cb = function (result) { + if (result && result.valid) { + try { + backend().setItem('prebid.cookieTest', '1'); + return backend().getItem('prebid.cookieTest') === '1'; + } catch (error) {} finally { + try { + backend().removeItem('prebid.cookieTest'); + } catch (error) {} + } + } + return false; + }; + return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done); + }, + [`setDataIn${capName}`](key, value, done) { + let cb = function (result) { + if (result && result.valid && hasStorage()) { + backend().setItem(key, value); + } + }; + return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done); + }, + [`getDataFrom${capName}`](key, done) { + let cb = function (result) { + if (result && result.valid && hasStorage()) { + return backend().getItem(key); + } + return null; + }; + return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done); + }, + [`removeDataFrom${capName}`](key, done) { + let cb = function (result) { + if (result && result.valid && hasStorage()) { + backend().removeItem(key); + } + }; + return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done); + } + }; + } + + /** + * Returns all cookie values from the jar whose names contain the `keyLike` + * Needs to exist in `utils.js` as it follows the StorageHandler interface defined in live-connect-js. If that module were to be removed, this function can go as well. + * @param {string} keyLike + * @param {function} [done] + * @returns {string[]} + */ + const findSimilarCookies = function (keyLike, done) { + let cb = function (result) { + if (result && result.valid) { + const all = []; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.hasDeviceAccess)()) { + const cookies = document.cookie.split(';'); + while (cookies.length) { + const cookie = cookies.pop(); + let separatorIndex = cookie.indexOf('='); + separatorIndex = separatorIndex < 0 ? cookie.length : separatorIndex; + const cookieName = decodeURIComponent(cookie.slice(0, separatorIndex).replace(/^\s+/, '')); + if (cookieName.indexOf(keyLike) >= 0) { + all.push(decodeURIComponent(cookie.slice(separatorIndex + 1))); + } + } + } + return all; + } + }; + return schedule(cb, STORAGE_TYPE_COOKIES, done); + }; + return { + setCookie, + getCookie, + cookiesAreEnabled, + ...storageMethods('localStorage'), + ...storageMethods('sessionStorage'), + findSimilarCookies + }; +} + +/** + * Get a storage manager for a particular module. + * + * Either bidderCode or a combination of moduleType + moduleName must be provided. The former is a shorthand + * for `{moduleType: 'bidder', moduleName: bidderCode}`. + * + */ +function getStorageManager() { + let { + moduleType, + moduleName, + bidderCode + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + function err() { + throw new Error(`Invalid invocation for getStorageManager: must set either bidderCode, or moduleType + moduleName`); + } + if (bidderCode) { + if (moduleType && moduleType !== _activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_BIDDER || moduleName) err(); + moduleType = _activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_BIDDER; + moduleName = bidderCode; + } else if (!moduleName || !moduleType) { + err(); + } + return newStorageManager({ + moduleType, + moduleName + }); +} + +/** + * Get a storage manager for "core" (vendorless, or first-party) modules. Shorthand for `getStorageManager({moduleName, moduleType: 'core'})`. + * + * @param {string} moduleName Module name + */ +function getCoreStorageManager(moduleName) { + return newStorageManager({ + moduleName: moduleName, + moduleType: _activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_PREBID + }); +} + +/** + * Block all access to storage when deviceAccess = false + */ +function deviceAccessRule() { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_7__.hasDeviceAccess)()) { + return { + allow: false + }; + } +} +(0,_activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.registerActivityControl)(_activities_activities_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_ACCESS_DEVICE, 'deviceAccess config', deviceAccessRule); + +/** + * By default, deny bidders accessDevice unless they enable it through bidderSettings + * + * // TODO: for backwards compat, the check is done on the adapter - rather than bidder's code. + */ +function storageAllowedRule(params) { + let bs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _bidderSettings_js__WEBPACK_IMPORTED_MODULE_8__.bidderSettings; + if (params[_activities_params_js__WEBPACK_IMPORTED_MODULE_6__.ACTIVITY_PARAM_COMPONENT_TYPE] !== _activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_BIDDER) return; + let allow = bs.get(params[_activities_params_js__WEBPACK_IMPORTED_MODULE_6__.ACTIVITY_PARAM_ADAPTER_CODE], 'storageAllowed'); + if (!allow || allow === true) { + allow = !!allow; + } else { + const storageType = params[_activities_params_js__WEBPACK_IMPORTED_MODULE_6__.ACTIVITY_PARAM_STORAGE_TYPE]; + allow = Array.isArray(allow) ? allow.some(e => e === storageType) : allow === storageType; + } + if (!allow) { + return { + allow + }; + } +} +(0,_activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.registerActivityControl)(_activities_activities_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_ACCESS_DEVICE, 'bidderSettings.*.storageAllowed', storageAllowedRule); +function resetData() { + storageCallbacks = []; +} + +/***/ }), + +/***/ "./src/targeting.js": +/*!**************************!*\ + !*** ./src/targeting.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ filters: () => (/* binding */ filters), +/* harmony export */ getGPTSlotsForAdUnits: () => (/* binding */ getGPTSlotsForAdUnits), +/* harmony export */ getHighestCpmBidsFromBidPool: () => (/* binding */ getHighestCpmBidsFromBidPool), +/* harmony export */ isBidUsable: () => (/* binding */ isBidUsable), +/* harmony export */ sortByDealAndPriceBucketOrCpm: () => (/* binding */ sortByDealAndPriceBucketOrCpm), +/* harmony export */ targeting: () => (/* binding */ targeting) +/* harmony export */ }); +/* unused harmony exports TARGETING_KEYS_ARR, newTargeting */ +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _bidTTL_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bidTTL.js */ "./src/bidTTL.js"); +/* harmony import */ var _bidderSettings_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./events.js */ "./src/events.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _mediaTypes_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./native.js */ "./src/native.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _utils_reducers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/reducers.js */ "./src/utils/reducers.js"); + + + + + + + + + + + + +var pbTargetingKeys = []; +const MAX_DFP_KEYLENGTH = 20; +const CFG_ALLOW_TARGETING_KEYS = `targetingControls.allowTargetingKeys`; +const CFG_ADD_TARGETING_KEYS = `targetingControls.addTargetingKeys`; +const TARGETING_KEY_CONFIGURATION_ERROR_MSG = `Only one of "${CFG_ALLOW_TARGETING_KEYS}" or "${CFG_ADD_TARGETING_KEYS}" can be set`; +const TARGETING_KEYS_ARR = Object.keys(_constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS).map(key => _constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS[key]); + +// return unexpired bids +const isBidNotExpired = bid => bid.responseTimestamp + (0,_bidTTL_js__WEBPACK_IMPORTED_MODULE_1__.getBufferedTTL)(bid) * 1000 > (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)(); + +// return bids whose status is not set. Winning bids can only have a status of `rendered`. +const isUnusedBid = bid => bid && (bid.status && !(0,_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)([_constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.RENDERED], bid.status) || !bid.status); +let filters = { + isActualBid(bid) { + return bid.getStatusCode() === _constants_js__WEBPACK_IMPORTED_MODULE_0__.STATUS.GOOD; + }, + isBidNotExpired, + isUnusedBid +}; +function isBidUsable(bid) { + return !Object.values(filters).some(predicate => !predicate(bid)); +} + +// If two bids are found for same adUnitCode, we will use the highest one to take part in auction +// This can happen in case of concurrent auctions +// If adUnitBidLimit is set above 0 return top N number of bids +const getHighestCpmBidsFromBidPool = (0,_hook_js__WEBPACK_IMPORTED_MODULE_4__.hook)('sync', function (bidsReceived, winReducer) { + let adUnitBidLimit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + let hasModified = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + let winSorter = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _utils_js__WEBPACK_IMPORTED_MODULE_2__.sortByHighestCpm; + if (!hasModified) { + const bids = []; + const dealPrioritization = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('sendBidsControl.dealPrioritization'); + // bucket by adUnitcode + let buckets = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.groupBy)(bidsReceived, 'adUnitCode'); + // filter top bid for each bucket by bidder + Object.keys(buckets).forEach(bucketKey => { + let bucketBids = []; + let bidsByBidder = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.groupBy)(buckets[bucketKey], 'bidderCode'); + Object.keys(bidsByBidder).forEach(key => { + bucketBids.push(bidsByBidder[key].reduce(winReducer)); + }); + // if adUnitBidLimit is set, pass top N number bids + if (adUnitBidLimit) { + bucketBids = dealPrioritization ? bucketBids.sort(sortByDealAndPriceBucketOrCpm(true)) : bucketBids.sort((a, b) => b.cpm - a.cpm); + bids.push(...bucketBids.slice(0, adUnitBidLimit)); + } else { + bucketBids = bucketBids.sort(winSorter); + bids.push(...bucketBids); + } + }); + return bids; + } + return bidsReceived; +}); + +/** + * A descending sort function that will sort the list of objects based on the following two dimensions: + * - bids with a deal are sorted before bids w/o a deal + * - then sort bids in each grouping based on the hb_pb value + * eg: the following list of bids would be sorted like: + * [{ + * "hb_adid": "vwx", + * "hb_pb": "28", + * "hb_deal": "7747" + * }, { + * "hb_adid": "jkl", + * "hb_pb": "10", + * "hb_deal": "9234" + * }, { + * "hb_adid": "stu", + * "hb_pb": "50" + * }, { + * "hb_adid": "def", + * "hb_pb": "2" + * }] + */ +function sortByDealAndPriceBucketOrCpm() { + let useCpm = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return function (a, b) { + if (a.adserverTargeting.hb_deal !== undefined && b.adserverTargeting.hb_deal === undefined) { + return -1; + } + if (a.adserverTargeting.hb_deal === undefined && b.adserverTargeting.hb_deal !== undefined) { + return 1; + } + + // assuming both values either have a deal or don't have a deal - sort by the hb_pb param + if (useCpm) { + return b.cpm - a.cpm; + } + return b.adserverTargeting.hb_pb - a.adserverTargeting.hb_pb; + }; +} + +/** + * Return a map where each code in `adUnitCodes` maps to a list of GPT slots that match it. + * + * @param {Array} adUnitCodes + * @param customSlotMatching + * @param getSlots + * @return {Object.} + */ +function getGPTSlotsForAdUnits(adUnitCodes, customSlotMatching) { + let getSlots = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : () => window.googletag.pubads().getSlots(); + return getSlots().reduce((auToSlots, slot) => { + const customMatch = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(customSlotMatching) && customSlotMatching(slot); + Object.keys(auToSlots).filter((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(customMatch) ? customMatch : (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isAdUnitCodeMatchingSlot)(slot)).forEach(au => auToSlots[au].push(slot)); + return auToSlots; + }, Object.fromEntries(adUnitCodes.map(au => [au, []]))); +} + +/** + * Clears targeting for bids + */ +function clearTargeting(slot) { + pbTargetingKeys.forEach(key => { + if (slot.getTargeting(key)) { + slot.clearTargeting(key); + } + }); +} + +/** + * @typedef {Object.} targeting + * @property {string} targeting_key + */ + +/** + * @typedef {Object.[]>[]} targetingArray + */ + +function newTargeting(auctionManager) { + let targeting = {}; + let latestAuctionForAdUnit = {}; + targeting.setLatestAuctionForAdUnit = function (adUnitCode, auctionId) { + latestAuctionForAdUnit[adUnitCode] = auctionId; + }; + targeting.resetPresetTargeting = function (adUnitCode, customSlotMatching) { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isGptPubadsDefined)()) { + const adUnitCodes = getAdUnitCodes(adUnitCode); + Object.values(getGPTSlotsForAdUnits(adUnitCodes, customSlotMatching)).forEach(slots => { + slots.forEach(slot => { + clearTargeting(slot); + }); + }); + } + }; + targeting.resetPresetTargetingAST = function (adUnitCode) { + const adUnitCodes = getAdUnitCodes(adUnitCode); + adUnitCodes.forEach(function (unit) { + const astTag = window.apntag.getTag(unit); + if (astTag && astTag.keywords) { + const currentKeywords = Object.keys(astTag.keywords); + const newKeywords = {}; + currentKeywords.forEach(key => { + if (!(0,_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(pbTargetingKeys, key.toLowerCase())) { + newKeywords[key] = astTag.keywords[key]; + } + }); + window.apntag.modifyTag(unit, { + keywords: newKeywords + }); + } + }); + }; + function addBidToTargeting(bids) { + let enableSendAllBids = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + let deals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + const standardKeys = true ? TARGETING_KEYS_ARR.concat(_native_js__WEBPACK_IMPORTED_MODULE_6__.NATIVE_TARGETING_KEYS) : 0; + const allowSendAllBidsTargetingKeys = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('targetingControls.allowSendAllBidsTargetingKeys'); + const allowedSendAllBidTargeting = allowSendAllBidsTargetingKeys ? allowSendAllBidsTargetingKeys.map(key => _constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS[key]) : standardKeys; + return bids.reduce((result, bid) => { + if (enableSendAllBids || deals && bid.dealId) { + const targetingValue = getTargetingMap(bid, standardKeys.filter(key => typeof bid.adserverTargeting[key] !== 'undefined' && (deals || allowedSendAllBidTargeting.indexOf(key) !== -1))); + if (targetingValue) { + result.push({ + [bid.adUnitCode]: targetingValue + }); + } + } + return result; + }, []); + } + function getBidderTargeting(bids) { + const alwaysIncludeDeals = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('targetingControls.alwaysIncludeDeals'); + const enableSendAllBids = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('enableSendAllBids'); + return addBidToTargeting(bids, enableSendAllBids, alwaysIncludeDeals); + } + + /** + * Returns filtered ad server targeting for custom and allowed keys. + * @param {targetingArray} targeting + * @param {string[]} allowedKeys + * @return {targetingArray} filtered targeting + */ + function getAllowedTargetingKeyValues(targeting, allowedKeys) { + const defaultKeyring = Object.assign({}, _constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS, _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS); + const defaultKeys = Object.keys(defaultKeyring); + const keyDispositions = {}; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`allowTargetingKeys - allowed keys [ ${allowedKeys.map(k => defaultKeyring[k]).join(', ')} ]`); + targeting.map(adUnit => { + const adUnitCode = Object.keys(adUnit)[0]; + const keyring = adUnit[adUnitCode]; + const keys = keyring.filter(kvPair => { + const key = Object.keys(kvPair)[0]; + // check if key is in default keys, if not, it's custom, we won't remove it. + const isCustom = defaultKeys.filter(defaultKey => key.indexOf(defaultKeyring[defaultKey]) === 0).length === 0; + // check if key explicitly allowed, if not, we'll remove it. + const found = isCustom || (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(allowedKeys, allowedKey => { + const allowedKeyName = defaultKeyring[allowedKey]; + // we're looking to see if the key exactly starts with one of our default keys. + // (which hopefully means it's not custom) + const found = key.indexOf(allowedKeyName) === 0; + return found; + }); + keyDispositions[key] = !found; + return found; + }); + adUnit[adUnitCode] = keys; + }); + const removedKeys = Object.keys(keyDispositions).filter(d => keyDispositions[d]); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`allowTargetingKeys - removed keys [ ${removedKeys.join(', ')} ]`); + // remove any empty targeting objects, as they're unnecessary. + const filteredTargeting = targeting.filter(adUnit => { + const adUnitCode = Object.keys(adUnit)[0]; + const keyring = adUnit[adUnitCode]; + return keyring.length > 0; + }); + return filteredTargeting; + } + + /** + * Returns all ad server targeting for all ad units. + * @param {string=} adUnitCode + * @return {Object.} targeting + */ + targeting.getAllTargeting = function (adUnitCode, bidLimit, bidsReceived) { + let winReducer = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _utils_reducers_js__WEBPACK_IMPORTED_MODULE_7__.getHighestCpm; + let winSorter = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _utils_js__WEBPACK_IMPORTED_MODULE_2__.sortByHighestCpm; + bidsReceived ||= getBidsReceived(winReducer, winSorter); + const adUnitCodes = getAdUnitCodes(adUnitCode); + const sendAllBids = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('enableSendAllBids'); + const bidLimitConfigValue = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('sendBidsControl.bidLimit'); + const adUnitBidLimit = sendAllBids && (bidLimit || bidLimitConfigValue) || 0; + const { + customKeysByUnit, + filteredBids + } = getfilteredBidsAndCustomKeys(adUnitCodes, bidsReceived); + const bidsSorted = getHighestCpmBidsFromBidPool(filteredBids, winReducer, adUnitBidLimit, undefined, winSorter); + let targeting = getTargetingLevels(bidsSorted, customKeysByUnit, adUnitCodes); + const defaultKeys = Object.keys(Object.assign({}, _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_TARGETING_KEYS, _constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS)); + let allowedKeys = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig(CFG_ALLOW_TARGETING_KEYS); + const addedKeys = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig(CFG_ADD_TARGETING_KEYS); + if (addedKeys != null && allowedKeys != null) { + throw new Error(TARGETING_KEY_CONFIGURATION_ERROR_MSG); + } else if (addedKeys != null) { + allowedKeys = defaultKeys.concat(addedKeys); + } else { + allowedKeys = allowedKeys || defaultKeys; + } + if (Array.isArray(allowedKeys) && allowedKeys.length > 0) { + targeting = getAllowedTargetingKeyValues(targeting, allowedKeys); + } + targeting = flattenTargeting(targeting); + const auctionKeysThreshold = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('targetingControls.auctionKeyMaxChars'); + if (auctionKeysThreshold) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Detected 'targetingControls.auctionKeyMaxChars' was active for this auction; set with a limit of ${auctionKeysThreshold} characters. Running checks on auction keys...`); + targeting = filterTargetingKeys(targeting, auctionKeysThreshold); + } + + // make sure at least there is a entry per adUnit code in the targetingSet so receivers of SET_TARGETING call's can know what ad units are being invoked + adUnitCodes.forEach(code => { + if (!targeting[code]) { + targeting[code] = {}; + } + }); + return targeting; + }; + function updatePBTargetingKeys(adUnitCode) { + Object.keys(adUnitCode).forEach(key => { + adUnitCode[key].forEach(targetKey => { + const targetKeys = Object.keys(targetKey); + if (pbTargetingKeys.indexOf(targetKeys[0]) === -1) { + pbTargetingKeys = targetKeys.concat(pbTargetingKeys); + } + }); + }); + } + function getTargetingLevels(bidsSorted, customKeysByUnit, adUnitCodes) { + const useAllBidsCustomTargeting = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('targetingControls.allBidsCustomTargeting') !== false; + const targeting = getWinningBidTargeting(bidsSorted, adUnitCodes).concat(getBidderTargeting(bidsSorted)).concat(getAdUnitTargeting(adUnitCodes)); + if (useAllBidsCustomTargeting) { + targeting.push(...getCustomBidTargeting(bidsSorted, customKeysByUnit)); + } + targeting.forEach(adUnitCode => { + updatePBTargetingKeys(adUnitCode); + }); + return targeting; + } + function getfilteredBidsAndCustomKeys(adUnitCodes, bidsReceived) { + const filteredBids = []; + const customKeysByUnit = {}; + const alwaysIncludeDeals = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('targetingControls.alwaysIncludeDeals'); + bidsReceived.forEach(bid => { + const adUnitIsEligible = (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(adUnitCodes, bid.adUnitCode); + const cpmAllowed = _bidderSettings_js__WEBPACK_IMPORTED_MODULE_8__.bidderSettings.get(bid.bidderCode, 'allowZeroCpmBids') === true ? bid.cpm >= 0 : bid.cpm > 0; + const isPreferredDeal = alwaysIncludeDeals && bid.dealId; + if (adUnitIsEligible && (isPreferredDeal || cpmAllowed)) { + filteredBids.push(bid); + Object.keys(bid.adserverTargeting).filter(getCustomKeys()).forEach(key => { + const truncKey = key.substring(0, MAX_DFP_KEYLENGTH); + const data = customKeysByUnit[bid.adUnitCode] || {}; + const value = [bid.adserverTargeting[key]]; + if (data[truncKey]) { + data[truncKey] = data[truncKey].concat(value).filter(_utils_js__WEBPACK_IMPORTED_MODULE_2__.uniques); + } else { + data[truncKey] = value; + } + customKeysByUnit[bid.adUnitCode] = data; + }); + } + }); + return { + filteredBids, + customKeysByUnit + }; + } + + // warn about conflicting configuration + _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('targetingControls', function (config) { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_9__["default"])(config, CFG_ALLOW_TARGETING_KEYS) != null && (0,_utils_js__WEBPACK_IMPORTED_MODULE_9__["default"])(config, CFG_ADD_TARGETING_KEYS) != null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(TARGETING_KEY_CONFIGURATION_ERROR_MSG); + } + }); + + // create an encoded string variant based on the keypairs of the provided object + // - note this will encode the characters between the keys (ie = and &) + function convertKeysToQueryForm(keyMap) { + return Object.keys(keyMap).reduce(function (queryString, key) { + let encodedKeyPair = `${key}%3d${encodeURIComponent(keyMap[key])}%26`; + return queryString += encodedKeyPair; + }, ''); + } + function filterTargetingKeys(targeting, auctionKeysThreshold) { + // read each targeting.adUnit object and sort the adUnits into a list of adUnitCodes based on priorization setting (eg CPM) + let targetingCopy = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(targeting); + let targetingMap = Object.keys(targetingCopy).map(adUnitCode => { + return { + adUnitCode, + adserverTargeting: targetingCopy[adUnitCode] + }; + }).sort(sortByDealAndPriceBucketOrCpm()); + + // iterate through the targeting based on above list and transform the keys into the query-equivalent and count characters + return targetingMap.reduce(function (accMap, currMap, index, arr) { + let adUnitQueryString = convertKeysToQueryForm(currMap.adserverTargeting); + + // for the last adUnit - trim last encoded ampersand from the converted query string + if (index + 1 === arr.length) { + adUnitQueryString = adUnitQueryString.slice(0, -3); + } + + // if under running threshold add to result + let code = currMap.adUnitCode; + let querySize = adUnitQueryString.length; + if (querySize <= auctionKeysThreshold) { + auctionKeysThreshold -= querySize; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`AdUnit '${code}' auction keys comprised of ${querySize} characters. Deducted from running threshold; new limit is ${auctionKeysThreshold}`, targetingCopy[code]); + accMap[code] = targetingCopy[code]; + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`The following keys for adUnitCode '${code}' exceeded the current limit of the 'auctionKeyMaxChars' setting.\nThe key-set size was ${querySize}, the current allotted amount was ${auctionKeysThreshold}.\n`, targetingCopy[code]); + } + if (index + 1 === arr.length && Object.keys(accMap).length === 0) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('No auction targeting keys were permitted due to the setting in setConfig(targetingControls.auctionKeyMaxChars). Please review setup and consider adjusting.'); + } + return accMap; + }, {}); + } + + /** + * Converts targeting array and flattens to make it easily iteratable + * e.g: Sample input to this function + * ``` + * [ + * { + * "div-gpt-ad-1460505748561-0": [{"hb_bidder": ["appnexusAst"]}] + * }, + * { + * "div-gpt-ad-1460505748561-0": [{"hb_bidder_appnexusAs": ["appnexusAst", "other"]}] + * } + * ] + * ``` + * Resulting array + * ``` + * { + * "div-gpt-ad-1460505748561-0": { + * "hb_bidder": "appnexusAst", + * "hb_bidder_appnexusAs": "appnexusAst,other" + * } + * } + * ``` + * + * @param {targetingArray} targeting + * @return {Object.} targeting + */ + function flattenTargeting(targeting) { + let targetingObj = targeting.map(targeting => { + return { + [Object.keys(targeting)[0]]: targeting[Object.keys(targeting)[0]].map(target => { + return { + [Object.keys(target)[0]]: target[Object.keys(target)[0]].join(',') + }; + }).reduce((p, c) => Object.assign(c, p), {}) + }; + }); + targetingObj = targetingObj.reduce(function (accumulator, targeting) { + var key = Object.keys(targeting)[0]; + accumulator[key] = Object.assign({}, accumulator[key], targeting[key]); + return accumulator; + }, {}); + return targetingObj; + } + targeting.setTargetingForGPT = (0,_hook_js__WEBPACK_IMPORTED_MODULE_4__.hook)('sync', function (adUnit, customSlotMatching) { + // get our ad unit codes + let targetingSet = targeting.getAllTargeting(adUnit); + let resetMap = Object.fromEntries(pbTargetingKeys.map(key => [key, null])); + Object.entries(getGPTSlotsForAdUnits(Object.keys(targetingSet), customSlotMatching)).forEach(_ref => { + let [targetId, slots] = _ref; + if (slots.length > 1) { + // This can lead to duplicate impressions. This is existing behavior and changing to only target one slot could be a breaking change for existing integrations. + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`Multiple slots found matching: ${targetId}. Targeting will be set on all matching slots, which can lead to duplicate impressions if more than one are requested from GAM. To resolve this, ensure the arguments to setTargetingForGPTAsync resolve to a single slot by explicitly matching the desired slotElementID.`); + } + slots.forEach(slot => { + // now set new targeting keys + Object.keys(targetingSet[targetId]).forEach(key => { + let value = targetingSet[targetId][key]; + if (typeof value === 'string' && value.indexOf(',') !== -1) { + // due to the check the array will be formed only if string has ',' else plain string will be assigned as value + value = value.split(','); + } + targetingSet[targetId][key] = value; + }); + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(`Attempting to set targeting-map for slot: ${slot.getSlotElementId()} with targeting-map:`, targetingSet[targetId]); + slot.updateTargetingFromMap(Object.assign({}, resetMap, targetingSet[targetId])); + }); + }); + Object.keys(targetingSet).forEach(adUnitCode => { + Object.keys(targetingSet[adUnitCode]).forEach(targetingKey => { + if (targetingKey === 'hb_adid') { + auctionManager.setStatusForBids(targetingSet[adUnitCode][targetingKey], _constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.BID_TARGETING_SET); + } + }); + }); + targeting.targetingDone(targetingSet); + + // emit event + _events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.SET_TARGETING, targetingSet); + }, 'setTargetingForGPT'); + targeting.targetingDone = (0,_hook_js__WEBPACK_IMPORTED_MODULE_4__.hook)('sync', function (targetingSet) { + return targetingSet; + }, 'targetingDone'); + + /** + * normlizes input to a `adUnit.code` array + * @param {(string|string[])} adUnitCode [description] + * @return {string[]} AdUnit code array + */ + function getAdUnitCodes(adUnitCode) { + if (typeof adUnitCode === 'string') { + return [adUnitCode]; + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(adUnitCode)) { + return adUnitCode; + } + return auctionManager.getAdUnitCodes() || []; + } + function getBidsReceived() { + let winReducer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _utils_reducers_js__WEBPACK_IMPORTED_MODULE_7__.getOldestHighestCpmBid; + let winSorter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + let bidsReceived = auctionManager.getBidsReceived().reduce((bids, bid) => { + const bidCacheEnabled = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('useBidCache'); + const filterFunction = _config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('bidCacheFilterFunction'); + const isBidFromLastAuction = latestAuctionForAdUnit[bid.adUnitCode] === bid.auctionId; + const filterFunctionResult = bidCacheEnabled && !isBidFromLastAuction && typeof filterFunction === 'function' ? !!filterFunction(bid) : true; + const cacheFilter = bidCacheEnabled || isBidFromLastAuction; + const bidFilter = cacheFilter && filterFunctionResult; + if (bidFilter && (0,_utils_js__WEBPACK_IMPORTED_MODULE_9__["default"])(bid, 'video.context') !== _mediaTypes_js__WEBPACK_IMPORTED_MODULE_11__.ADPOD && isBidUsable(bid)) { + bid.latestTargetedAuctionId = latestAuctionForAdUnit[bid.adUnitCode]; + bids.push(bid); + } + return bids; + }, []); + return getHighestCpmBidsFromBidPool(bidsReceived, winReducer, undefined, undefined, undefined, winSorter); + } + + /** + * Returns top bids for a given adUnit or set of adUnits. + * @param {(string|string[])} adUnitCode adUnitCode or array of adUnitCodes + * @param {(Array|undefined)} bids - The received bids, defaulting to the result of getBidsReceived(). + * @param {function(Array): Array} [winReducer = getHighestCpm] - reducer method + * @param {function(Array): Array} [winSorter = sortByHighestCpm] - sorter method + * @return {Array} - An array of winning bids. + */ + targeting.getWinningBids = function (adUnitCode, bids) { + let winReducer = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _utils_reducers_js__WEBPACK_IMPORTED_MODULE_7__.getHighestCpm; + let winSorter = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _utils_js__WEBPACK_IMPORTED_MODULE_2__.sortByHighestCpm; + const bidsReceived = bids || getBidsReceived(winReducer, winSorter); + const adUnitCodes = getAdUnitCodes(adUnitCode); + return bidsReceived.filter(bid => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(adUnitCodes, bid.adUnitCode)).filter(bid => _bidderSettings_js__WEBPACK_IMPORTED_MODULE_8__.bidderSettings.get(bid.bidderCode, 'allowZeroCpmBids') === true ? bid.cpm >= 0 : bid.cpm > 0).map(bid => bid.adUnitCode).filter(_utils_js__WEBPACK_IMPORTED_MODULE_2__.uniques).map(adUnitCode => bidsReceived.filter(bid => bid.adUnitCode === adUnitCode ? bid : null).reduce(_utils_reducers_js__WEBPACK_IMPORTED_MODULE_7__.getHighestCpm)); + }; + + /** + * @param {(string|string[])} adUnitCodes adUnitCode or array of adUnitCodes + * Sets targeting for AST + */ + targeting.setTargetingForAst = function (adUnitCodes) { + let astTargeting = targeting.getAllTargeting(adUnitCodes); + try { + targeting.resetPresetTargetingAST(adUnitCodes); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('unable to reset targeting for AST' + e); + } + Object.keys(astTargeting).forEach(targetId => Object.keys(astTargeting[targetId]).forEach(key => { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(`Attempting to set targeting for targetId: ${targetId} key: ${key} value: ${astTargeting[targetId][key]}`); + // setKeywords supports string and array as value + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(astTargeting[targetId][key]) || (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(astTargeting[targetId][key])) { + let keywordsObj = {}; + let regex = /pt[0-9]/; + if (key.search(regex) < 0) { + keywordsObj[key.toUpperCase()] = astTargeting[targetId][key]; + } else { + // pt${n} keys should not be uppercased + keywordsObj[key] = astTargeting[targetId][key]; + } + window.apntag.setKeywords(targetId, keywordsObj, { + overrideKeyValue: true + }); + } + })); + }; + + /** + * Get targeting key value pairs for winning bid. + * @param {Array} bidsReceived code array + * @param {string[]} adUnitCodes code array + * @return {targetingArray} winning bids targeting + */ + function getWinningBidTargeting(bidsReceived, adUnitCodes) { + let winners = targeting.getWinningBids(adUnitCodes, bidsReceived); + let standardKeys = getStandardKeys(); + winners = winners.map(winner => { + return { + [winner.adUnitCode]: Object.keys(winner.adserverTargeting).filter(key => typeof winner.sendStandardTargeting === 'undefined' || winner.sendStandardTargeting || standardKeys.indexOf(key) === -1).reduce((acc, key) => { + const targetingValue = [winner.adserverTargeting[key]]; + const targeting = { + [key.substring(0, MAX_DFP_KEYLENGTH)]: targetingValue + }; + if (key === _constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS.DEAL) { + const bidderCodeTargetingKey = `${key}_${winner.bidderCode}`.substring(0, MAX_DFP_KEYLENGTH); + const bidderCodeTargeting = { + [bidderCodeTargetingKey]: targetingValue + }; + return [...acc, targeting, bidderCodeTargeting]; + } + return [...acc, targeting]; + }, []) + }; + }); + return winners; + } + function getStandardKeys() { + return auctionManager.getStandardBidderAdServerTargeting() // in case using a custom standard key set + .map(targeting => targeting.key).concat(TARGETING_KEYS_ARR).filter(_utils_js__WEBPACK_IMPORTED_MODULE_2__.uniques); // standard keys defined in the library. + } + function getCustomKeys() { + let standardKeys = getStandardKeys(); + if (true) { + standardKeys = standardKeys.concat(_native_js__WEBPACK_IMPORTED_MODULE_6__.NATIVE_TARGETING_KEYS); + } + return function (key) { + return standardKeys.indexOf(key) === -1; + }; + } + + /** + * Get custom targeting key value pairs for bids. + * @param {Array} bidsSorted code array + * @param {Object} customKeysByUnit code array + * @return {targetingArray} bids with custom targeting defined in bidderSettings + */ + function getCustomBidTargeting(bidsSorted, customKeysByUnit) { + return bidsSorted.reduce((acc, bid) => { + const newBid = Object.assign({}, bid); + const customKeysForUnit = customKeysByUnit[newBid.adUnitCode]; + const targeting = []; + if (customKeysForUnit) { + Object.keys(customKeysForUnit).forEach(key => { + if (key && customKeysForUnit[key]) targeting.push({ + [key]: customKeysForUnit[key] + }); + }); + } + acc.push({ + [newBid.adUnitCode]: targeting + }); + return acc; + }, []); + } + function getTargetingMap(bid, keys) { + return keys.reduce((targeting, key) => { + const value = bid.adserverTargeting[key]; + if (value) { + targeting.push({ + [`${key}_${bid.bidderCode}`.substring(0, MAX_DFP_KEYLENGTH)]: [bid.adserverTargeting[key]] + }); + } + return targeting; + }, []); + } + function getAdUnitTargeting(adUnitCodes) { + function getTargetingObj(adUnit) { + return adUnit?.[_constants_js__WEBPACK_IMPORTED_MODULE_0__.JSON_MAPPING.ADSERVER_TARGETING]; + } + function getTargetingValues(adUnit) { + const aut = getTargetingObj(adUnit); + return Object.keys(aut).map(function (key) { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(aut[key])) aut[key] = aut[key].split(',').map(s => s.trim()); + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(aut[key])) aut[key] = [aut[key]]; + return { + [key]: aut[key] + }; + }); + } + return auctionManager.getAdUnits().filter(adUnit => adUnitCodes.includes(adUnit.code) && getTargetingObj(adUnit)).reduce((result, adUnit) => { + const targetingValues = getTargetingValues(adUnit); + if (targetingValues) result.push({ + [adUnit.code]: targetingValues + }); + return result; + }, []); + } + targeting.isApntagDefined = function () { + if (window.apntag && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(window.apntag.setKeywords)) { + return true; + } + }; + return targeting; +} +const targeting = newTargeting(_auctionManager_js__WEBPACK_IMPORTED_MODULE_12__.auctionManager); + +/***/ }), + +/***/ "./src/userSync.js": +/*!*************************!*\ + !*** ./src/userSync.js ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ USERSYNC_DEFAULT_CONFIG: () => (/* binding */ USERSYNC_DEFAULT_CONFIG), +/* harmony export */ userSync: () => (/* binding */ userSync) +/* harmony export */ }); +/* unused harmony export newUserSync */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _storageManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _activities_rules_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _activities_activities_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _activities_params_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./activities/params.js */ "./src/activities/params.js"); +/* harmony import */ var _activities_modules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./activities/activityParams.js */ "./src/activities/activityParams.js"); + + + + + + + + + +const USERSYNC_DEFAULT_CONFIG = { + syncEnabled: true, + filterSettings: { + image: { + bidders: '*', + filter: 'include' + } + }, + syncsPerBidder: 5, + syncDelay: 3000, + auctionDelay: 500 +}; + +// Set userSync default values +_config_js__WEBPACK_IMPORTED_MODULE_0__.config.setDefaults({ + 'userSync': (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(USERSYNC_DEFAULT_CONFIG) +}); +const storage = (0,_storageManager_js__WEBPACK_IMPORTED_MODULE_2__.getCoreStorageManager)('usersync'); + +/** + * Factory function which creates a new UserSyncPool. + * + * @param {} deps Configuration options and dependencies which the + * UserSync object needs in order to behave properly. + */ +function newUserSync(deps) { + let publicApi = {}; + // A queue of user syncs for each adapter + // Let getDefaultQueue() set the defaults + let queue = getDefaultQueue(); + + // Whether or not user syncs have been trigger on this page load for a specific bidder + let hasFiredBidder = new Set(); + // How many bids for each adapter + let numAdapterBids = {}; + + // for now - default both to false in case filterSettings config is absent/misconfigured + let permittedPixels = { + image: true, + iframe: false + }; + + // Use what is in config by default + let usConfig = deps.config; + // Update if it's (re)set + _config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('userSync', conf => { + // Added this logic for https://github.com/prebid/Prebid.js/issues/4864 + // if userSync.filterSettings does not contain image/all configs, merge in default image config to ensure image pixels are fired + if (conf.userSync) { + let fs = conf.userSync.filterSettings; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(fs)) { + if (!fs.image && !fs.all) { + conf.userSync.filterSettings.image = { + bidders: '*', + filter: 'include' + }; + } + } + } + usConfig = Object.assign(usConfig, conf.userSync); + }); + deps.regRule(_activities_activities_js__WEBPACK_IMPORTED_MODULE_3__.ACTIVITY_SYNC_USER, 'userSync config', params => { + if (!usConfig.syncEnabled) { + return { + allow: false, + reason: 'syncs are disabled' + }; + } + if (params[_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_COMPONENT_TYPE] === _activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER) { + const syncType = params[_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_SYNC_TYPE]; + const bidder = params[_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_COMPONENT_NAME]; + if (!publicApi.canBidderRegisterSync(syncType, bidder)) { + return { + allow: false, + reason: `${syncType} syncs are not enabled for ${bidder}` + }; + } + } + }); + + /** + * @function getDefaultQueue + * @summary Returns the default empty queue + * @private + * @return {object} A queue with no syncs + */ + function getDefaultQueue() { + return { + image: [], + iframe: [] + }; + } + + /** + * @function fireSyncs + * @summary Trigger all user syncs in the queue + * @private + */ + function fireSyncs() { + if (!usConfig.syncEnabled || !deps.browserSupportsCookies) { + return; + } + try { + // Iframe syncs + loadIframes(); + // Image pixels + fireImagePixels(); + } catch (e) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error firing user syncs', e); + } + // Reset the user sync queue + queue = getDefaultQueue(); + } + function forEachFire(queue, fn) { + // Randomize the order of the pixels before firing + // This is to avoid giving any bidder who has registered multiple syncs + // any preferential treatment and balancing them out + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.shuffle)(queue).forEach(fn); + } + + /** + * @function fireImagePixels + * @summary Loops through user sync pixels and fires each one + * @private + */ + function fireImagePixels() { + if (!permittedPixels.image) { + return; + } + forEachFire(queue.image, sync => { + let [bidderName, trackingPixelUrl] = sync; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(`Invoking image pixel user sync for bidder: ${bidderName}`); + // Create image object and add the src url + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(trackingPixelUrl); + }); + } + + /** + * @function loadIframes + * @summary Loops through iframe syncs and loads an iframe element into the page + * @private + */ + function loadIframes() { + if (!permittedPixels.iframe) { + return; + } + forEachFire(queue.iframe, sync => { + let [bidderName, iframeUrl] = sync; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(`Invoking iframe user sync for bidder: ${bidderName}`); + // Insert iframe into DOM + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.insertUserSyncIframe)(iframeUrl); + // for a bidder, if iframe sync is present then remove image pixel + removeImagePixelsForBidder(queue, bidderName); + }); + } + function removeImagePixelsForBidder(queue, iframeSyncBidderName) { + queue.image = queue.image.filter(imageSync => { + let imageSyncBidderName = imageSync[0]; + return imageSyncBidderName !== iframeSyncBidderName; + }); + } + + /** + * @function incrementAdapterBids + * @summary Increment the count of user syncs queue for the adapter + * @private + * @param {object} numAdapterBids The object contain counts for all adapters + * @param {string} bidder The name of the bidder adding a sync + * @returns {object} The updated version of numAdapterBids + */ + function incrementAdapterBids(numAdapterBids, bidder) { + if (!numAdapterBids[bidder]) { + numAdapterBids[bidder] = 1; + } else { + numAdapterBids[bidder] += 1; + } + return numAdapterBids; + } + + /** + * @function registerSync + * @summary Add sync for this bidder to a queue to be fired later + * @public + * @param {string} type The type of the sync including image, iframe + * @param {string} bidder The name of the adapter. e.g. "rubicon" + * @param {string} url Either the pixel url or iframe url depending on the type + * @example Using Image Sync + * // registerSync(type, adapter, pixelUrl) + * userSync.registerSync('image', 'rubicon', 'http://example.com/pixel') + */ + publicApi.registerSync = (type, bidder, url) => { + if (hasFiredBidder.has(bidder)) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(`already fired syncs for "${bidder}", ignoring registerSync call`); + } + if (!usConfig.syncEnabled || !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(queue[type])) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`User sync type "${type}" not supported`); + } + if (!bidder) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Bidder is required for registering sync`); + } + if (usConfig.syncsPerBidder !== 0 && Number(numAdapterBids[bidder]) >= usConfig.syncsPerBidder) { + return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Number of user syncs exceeded for "${bidder}"`); + } + if (deps.isAllowed(_activities_activities_js__WEBPACK_IMPORTED_MODULE_3__.ACTIVITY_SYNC_USER, (0,_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__.activityParams)(_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_BIDDER, bidder, { + [_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_SYNC_TYPE]: type, + [_activities_params_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_PARAM_SYNC_URL]: url + }))) { + // the bidder's pixel has passed all checks and is allowed to register + queue[type].push([bidder, url]); + numAdapterBids = incrementAdapterBids(numAdapterBids, bidder); + } + }; + + /** + * Mark a bidder as done with its user syncs - no more will be accepted from them in this session. + * @param {string} bidderCode + */ + publicApi.bidderDone = hasFiredBidder.add.bind(hasFiredBidder); + + /** + * @function shouldBidderBeBlocked + * @summary Check filterSettings logic to determine if the bidder should be prevented from registering their userSync tracker + * @private + * @param {string} type The type of the sync; either image or iframe + * @param {string} bidder The name of the adapter. e.g. "rubicon" + * @returns {boolean} true => bidder is not allowed to register; false => bidder can register + */ + function shouldBidderBeBlocked(type, bidder) { + let filterConfig = usConfig.filterSettings; + + // apply the filter check if the config object is there (eg filterSettings.iframe exists) and if the config object is properly setup + if (isFilterConfigValid(filterConfig, type)) { + permittedPixels[type] = true; + let activeConfig = filterConfig.all ? filterConfig.all : filterConfig[type]; + let biddersToFilter = activeConfig.bidders === '*' ? [bidder] : activeConfig.bidders; + let filterType = activeConfig.filter || 'include'; // set default if undefined + + // return true if the bidder is either: not part of the include (ie outside the whitelist) or part of the exclude (ie inside the blacklist) + const checkForFiltering = { + 'include': (bidders, bidder) => !(0,_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.includes)(bidders, bidder), + 'exclude': (bidders, bidder) => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.includes)(bidders, bidder) + }; + return checkForFiltering[filterType](biddersToFilter, bidder); + } + return !permittedPixels[type]; + } + + /** + * @function isFilterConfigValid + * @summary Check if the filterSettings object in the userSync config is setup properly + * @private + * @param {object} filterConfig sub-config object taken from filterSettings + * @param {string} type The type of the sync; either image or iframe + * @returns {boolean} true => config is setup correctly, false => setup incorrectly or filterConfig[type] is not present + */ + function isFilterConfigValid(filterConfig, type) { + if (filterConfig.all && filterConfig[type]) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Detected presence of the "filterSettings.all" and "filterSettings.${type}" in userSync config. You cannot mix "all" with "iframe/image" configs; they are mutually exclusive.`); + return false; + } + let activeConfig = filterConfig.all ? filterConfig.all : filterConfig[type]; + let activeConfigName = filterConfig.all ? 'all' : type; + + // if current pixel type isn't part of the config's logic, skip rest of the config checks... + // we return false to skip subsequent filter checks in shouldBidderBeBlocked() function + if (!activeConfig) { + return false; + } + let filterField = activeConfig.filter; + let biddersField = activeConfig.bidders; + if (filterField && filterField !== 'include' && filterField !== 'exclude') { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`UserSync "filterSettings.${activeConfigName}.filter" setting '${filterField}' is not a valid option; use either 'include' or 'exclude'.`); + return false; + } + if (biddersField !== '*' && !(Array.isArray(biddersField) && biddersField.length > 0 && biddersField.every(bidderInList => (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bidderInList) && bidderInList !== '*'))) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Detected an invalid setup in userSync "filterSettings.${activeConfigName}.bidders"; use either '*' (to represent all bidders) or an array of bidders.`); + return false; + } + return true; + } + + /** + * @function syncUsers + * @summary Trigger all the user syncs based on publisher-defined timeout + * @public + * @param {number} timeout The delay in ms before syncing data - default 0 + */ + publicApi.syncUsers = function () { + let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + if (timeout) { + return setTimeout(fireSyncs, Number(timeout)); + } + fireSyncs(); + }; + + /** + * @function triggerUserSyncs + * @summary A `syncUsers` wrapper for determining if enableOverride has been turned on + * @public + */ + publicApi.triggerUserSyncs = () => { + if (usConfig.enableOverride) { + publicApi.syncUsers(); + } + }; + publicApi.canBidderRegisterSync = (type, bidder) => { + if (usConfig.filterSettings) { + if (shouldBidderBeBlocked(type, bidder)) { + return false; + } + } + return true; + }; + return publicApi; +} +const userSync = newUserSync(Object.defineProperties({ + config: _config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('userSync'), + isAllowed: _activities_rules_js__WEBPACK_IMPORTED_MODULE_8__.isActivityAllowed, + regRule: _activities_rules_js__WEBPACK_IMPORTED_MODULE_8__.registerActivityControl +}, { + browserSupportsCookies: { + get: function () { + // call storage lazily to give time for consent data to be available + return !(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isSafariBrowser)() && storage.cookiesAreEnabled(); + } + } +})); + +/** + * @typedef {Object} UserSyncConfig + * + * @property {boolean} enableOverride + * @property {boolean} syncEnabled + * @property {number} syncsPerBidder + * @property {string[]} enabledBidders + * @property {Object} filterSettings + */ + +/***/ }), + +/***/ "./src/utils.js": +/*!**********************!*\ + !*** ./src/utils.js ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ _each: () => (/* binding */ _each), +/* harmony export */ _map: () => (/* binding */ _map), +/* harmony export */ _setEventEmitter: () => (/* binding */ _setEventEmitter), +/* harmony export */ binarySearch: () => (/* binding */ binarySearch), +/* harmony export */ buildUrl: () => (/* binding */ buildUrl), +/* harmony export */ canAccessWindowTop: () => (/* binding */ canAccessWindowTop), +/* harmony export */ checkCookieSupport: () => (/* binding */ checkCookieSupport), +/* harmony export */ cleanObj: () => (/* binding */ cleanObj), +/* harmony export */ compareCodeAndSlot: () => (/* binding */ compareCodeAndSlot), +/* harmony export */ compressDataWithGZip: () => (/* binding */ compressDataWithGZip), +/* harmony export */ contains: () => (/* binding */ contains), +/* harmony export */ convertObjectToArray: () => (/* binding */ convertObjectToArray), +/* harmony export */ createIframe: () => (/* binding */ createIframe), +/* harmony export */ createInvisibleIframe: () => (/* binding */ createInvisibleIframe), +/* harmony export */ createTrackPixelHtml: () => (/* binding */ createTrackPixelHtml), +/* harmony export */ createTrackPixelIframeHtml: () => (/* binding */ createTrackPixelIframeHtml), +/* harmony export */ cyrb53Hash: () => (/* binding */ cyrb53Hash), +/* harmony export */ debugTurnedOn: () => (/* binding */ debugTurnedOn), +/* harmony export */ deepAccess: () => (/* reexport safe */ dlv_index_js__WEBPACK_IMPORTED_MODULE_0__["default"]), +/* harmony export */ deepClone: () => (/* binding */ deepClone), +/* harmony export */ deepEqual: () => (/* binding */ deepEqual), +/* harmony export */ deepSetValue: () => (/* reexport safe */ dset__WEBPACK_IMPORTED_MODULE_1__.dset), +/* harmony export */ delayExecution: () => (/* binding */ delayExecution), +/* harmony export */ encodeMacroURI: () => (/* binding */ encodeMacroURI), +/* harmony export */ extractDomainFromHost: () => (/* binding */ extractDomainFromHost), +/* harmony export */ flatten: () => (/* binding */ flatten), +/* harmony export */ formatQS: () => (/* binding */ formatQS), +/* harmony export */ generateUUID: () => (/* binding */ generateUUID), +/* harmony export */ getBidIdParameter: () => (/* binding */ getBidIdParameter), +/* harmony export */ getBidRequest: () => (/* binding */ getBidRequest), +/* harmony export */ getBidderCodes: () => (/* binding */ getBidderCodes), +/* harmony export */ getDNT: () => (/* binding */ getDNT), +/* harmony export */ getDefinedParams: () => (/* binding */ getDefinedParams), +/* harmony export */ getDocument: () => (/* binding */ getDocument), +/* harmony export */ getDomLoadingDuration: () => (/* binding */ getDomLoadingDuration), +/* harmony export */ getParameterByName: () => (/* binding */ getParameterByName), +/* harmony export */ getPerformanceNow: () => (/* binding */ getPerformanceNow), +/* harmony export */ getPrebidInternal: () => (/* binding */ getPrebidInternal), +/* harmony export */ getSafeframeGeometry: () => (/* binding */ getSafeframeGeometry), +/* harmony export */ getUniqueIdentifierStr: () => (/* binding */ getUniqueIdentifierStr), +/* harmony export */ getUnixTimestampFromNow: () => (/* binding */ getUnixTimestampFromNow), +/* harmony export */ getUserConfiguredParams: () => (/* binding */ getUserConfiguredParams), +/* harmony export */ getValue: () => (/* binding */ getValue), +/* harmony export */ getWinDimensions: () => (/* binding */ getWinDimensions), +/* harmony export */ getWindowLocation: () => (/* binding */ getWindowLocation), +/* harmony export */ getWindowSelf: () => (/* binding */ getWindowSelf), +/* harmony export */ getWindowTop: () => (/* binding */ getWindowTop), +/* harmony export */ groupBy: () => (/* binding */ groupBy), +/* harmony export */ hasConsoleLogger: () => (/* binding */ hasConsoleLogger), +/* harmony export */ hasDeviceAccess: () => (/* binding */ hasDeviceAccess), +/* harmony export */ hasNonSerializableProperty: () => (/* binding */ hasNonSerializableProperty), +/* harmony export */ inIframe: () => (/* binding */ inIframe), +/* harmony export */ insertElement: () => (/* binding */ insertElement), +/* harmony export */ insertHtmlIntoIframe: () => (/* binding */ insertHtmlIntoIframe), +/* harmony export */ insertUserSyncIframe: () => (/* binding */ insertUserSyncIframe), +/* harmony export */ internal: () => (/* binding */ internal), +/* harmony export */ isA: () => (/* binding */ isA), +/* harmony export */ isAdUnitCodeMatchingSlot: () => (/* binding */ isAdUnitCodeMatchingSlot), +/* harmony export */ isApnGetTagDefined: () => (/* binding */ isApnGetTagDefined), +/* harmony export */ isArray: () => (/* binding */ isArray), +/* harmony export */ isArrayOfNums: () => (/* binding */ isArrayOfNums), +/* harmony export */ isBoolean: () => (/* binding */ isBoolean), +/* harmony export */ isEmpty: () => (/* binding */ isEmpty), +/* harmony export */ isEmptyStr: () => (/* binding */ isEmptyStr), +/* harmony export */ isFn: () => (/* binding */ isFn), +/* harmony export */ isGptPubadsDefined: () => (/* binding */ isGptPubadsDefined), +/* harmony export */ isGzipCompressionSupported: () => (/* binding */ isGzipCompressionSupported), +/* harmony export */ isInteger: () => (/* binding */ isInteger), +/* harmony export */ isNumber: () => (/* binding */ isNumber), +/* harmony export */ isPlainObject: () => (/* binding */ isPlainObject), +/* harmony export */ isSafariBrowser: () => (/* binding */ isSafariBrowser), +/* harmony export */ isSafeFrameWindow: () => (/* binding */ isSafeFrameWindow), +/* harmony export */ isStr: () => (/* binding */ isStr), +/* harmony export */ isValidMediaTypes: () => (/* binding */ isValidMediaTypes), +/* harmony export */ logError: () => (/* binding */ logError), +/* harmony export */ logInfo: () => (/* binding */ logInfo), +/* harmony export */ logMessage: () => (/* binding */ logMessage), +/* harmony export */ logWarn: () => (/* binding */ logWarn), +/* harmony export */ memoize: () => (/* binding */ memoize), +/* harmony export */ mergeDeep: () => (/* binding */ mergeDeep), +/* harmony export */ parseGPTSingleSizeArray: () => (/* binding */ parseGPTSingleSizeArray), +/* harmony export */ parseGPTSingleSizeArrayToRtbSize: () => (/* binding */ parseGPTSingleSizeArrayToRtbSize), +/* harmony export */ parseQS: () => (/* binding */ parseQS), +/* harmony export */ parseQueryStringParameters: () => (/* binding */ parseQueryStringParameters), +/* harmony export */ parseSizesInput: () => (/* binding */ parseSizesInput), +/* harmony export */ parseUrl: () => (/* binding */ parseUrl), +/* harmony export */ pick: () => (/* binding */ pick), +/* harmony export */ prefixLog: () => (/* binding */ prefixLog), +/* harmony export */ replaceAuctionPrice: () => (/* binding */ replaceAuctionPrice), +/* harmony export */ replaceClickThrough: () => (/* binding */ replaceClickThrough), +/* harmony export */ replaceMacros: () => (/* binding */ replaceMacros), +/* harmony export */ resetWinDimensions: () => (/* binding */ resetWinDimensions), +/* harmony export */ safeJSONEncode: () => (/* binding */ safeJSONEncode), +/* harmony export */ safeJSONParse: () => (/* binding */ safeJSONParse), +/* harmony export */ setOnAny: () => (/* binding */ setOnAny), +/* harmony export */ setScriptAttributes: () => (/* binding */ setScriptAttributes), +/* harmony export */ shuffle: () => (/* binding */ shuffle), +/* harmony export */ sizeTupleToRtbSize: () => (/* binding */ sizeTupleToRtbSize), +/* harmony export */ sizeTupleToSizeString: () => (/* binding */ sizeTupleToSizeString), +/* harmony export */ sizesToSizeTuples: () => (/* binding */ sizesToSizeTuples), +/* harmony export */ sortByHighestCpm: () => (/* binding */ sortByHighestCpm), +/* harmony export */ timestamp: () => (/* binding */ timestamp), +/* harmony export */ transformAdServerTargetingObj: () => (/* binding */ transformAdServerTargetingObj), +/* harmony export */ triggerNurlWithCpm: () => (/* binding */ triggerNurlWithCpm), +/* harmony export */ triggerPixel: () => (/* binding */ triggerPixel), +/* harmony export */ uniques: () => (/* binding */ uniques), +/* harmony export */ unsupportedBidderMessage: () => (/* binding */ unsupportedBidderMessage), +/* harmony export */ waitForElementToLoad: () => (/* binding */ waitForElementToLoad) +/* harmony export */ }); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var klona_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! klona/json */ "./node_modules/klona/json/index.mjs"); +/* harmony import */ var _polyfill_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants.js */ "./src/constants.js"); +/* harmony import */ var _utils_promise_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var dlv_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dlv/index.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var dset__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dset */ "./node_modules/dset/dist/index.mjs"); + + + + + + + + + +var tStr = 'String'; +var tFn = 'Function'; +var tNumb = 'Number'; +var tObject = 'Object'; +var tBoolean = 'Boolean'; +var toString = Object.prototype.toString; +let consoleExists = Boolean(window.console); +let consoleLogExists = Boolean(consoleExists && window.console.log); +let consoleInfoExists = Boolean(consoleExists && window.console.info); +let consoleWarnExists = Boolean(consoleExists && window.console.warn); +let consoleErrorExists = Boolean(consoleExists && window.console.error); +let eventEmitter; +let windowDimensions; +const pbjsInstance = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)(); +function _setEventEmitter(emitFn) { + // called from events.js - this hoop is to avoid circular imports + eventEmitter = emitFn; +} +function emitEvent() { + if (eventEmitter != null) { + eventEmitter(...arguments); + } +} +const getWinDimensions = function () { + let lastCheckTimestamp; + const CHECK_INTERVAL_MS = 20; + return () => { + if (!windowDimensions || !lastCheckTimestamp || Date.now() - lastCheckTimestamp > CHECK_INTERVAL_MS) { + internal.resetWinDimensions(); + lastCheckTimestamp = Date.now(); + } + return windowDimensions; + }; +}(); +function resetWinDimensions() { + const top = canAccessWindowTop() ? internal.getWindowTop() : internal.getWindowSelf(); + windowDimensions = { + screen: { + width: top.screen?.width, + height: top.screen?.height, + availWidth: top.screen?.availWidth, + availHeight: top.screen?.availHeight, + colorDepth: top.screen?.colorDepth + }, + innerHeight: top.innerHeight, + innerWidth: top.innerWidth, + outerWidth: top.outerWidth, + outerHeight: top.outerHeight, + visualViewport: { + height: top.visualViewport?.height, + width: top.visualViewport?.width + }, + document: { + documentElement: { + clientWidth: top.document?.documentElement?.clientWidth, + clientHeight: top.document?.documentElement?.clientHeight, + scrollTop: top.document?.documentElement?.scrollTop, + scrollLeft: top.document?.documentElement?.scrollLeft + }, + body: { + scrollTop: document.body?.scrollTop, + scrollLeft: document.body?.scrollLeft, + clientWidth: document.body?.clientWidth, + clientHeight: document.body?.clientHeight + } + } + }; +} + +// this allows stubbing of utility functions that are used internally by other utility functions +const internal = { + checkCookieSupport, + createTrackPixelIframeHtml, + getWindowSelf, + getWindowTop, + canAccessWindowTop, + getWindowLocation, + insertUserSyncIframe, + insertElement, + isFn, + triggerPixel, + logError, + logWarn, + logMessage, + logInfo, + parseQS, + formatQS, + deepEqual, + resetWinDimensions +}; +let prebidInternal = {}; +/** + * Returns object that is used as internal prebid namespace + */ +function getPrebidInternal() { + return prebidInternal; +} + +/* utility method to get incremental integer starting from 1 */ +var getIncrementalInteger = function () { + var count = 0; + return function () { + count++; + return count; + }; +}(); + +// generate a random string (to be used as a dynamic JSONP callback) +function getUniqueIdentifierStr() { + return getIncrementalInteger() + Math.random().toString(16).substr(2); +} + +/** + * Returns a random v4 UUID of the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, + * where each x is replaced with a random hexadecimal digit from 0 to f, + * and y is replaced with a random hexadecimal digit from 8 to b. + * https://gist.github.com/jed/982883 via node-uuid + */ +function generateUUID(placeholder) { + return placeholder ? (placeholder ^ _getRandomData() >> placeholder / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, generateUUID); +} + +/** + * Returns random data using the Crypto API if available and Math.random if not + * Method is from https://gist.github.com/jed/982883 like generateUUID, direct link https://gist.github.com/jed/982883#gistcomment-45104 + */ +function _getRandomData() { + if (window && window.crypto && window.crypto.getRandomValues) { + return crypto.getRandomValues(new Uint8Array(1))[0] % 16; + } else { + return Math.random() * 16; + } +} +function getBidIdParameter(key, paramsObj) { + return paramsObj?.[key] || ''; +} + +// parse a query string object passed in bid params +// bid params should be an object such as {key: "value", key1 : "value1"} +// aliases to formatQS +function parseQueryStringParameters(queryObj) { + let result = ''; + for (var k in queryObj) { + if (queryObj.hasOwnProperty(k)) { + result += k + '=' + encodeURIComponent(queryObj[k]) + '&'; + } + } + result = result.replace(/&$/, ''); + return result; +} + +// transform an AdServer targeting bids into a query string to send to the adserver +function transformAdServerTargetingObj(targeting) { + // we expect to receive targeting for a single slot at a time + if (targeting && Object.getOwnPropertyNames(targeting).length > 0) { + return Object.keys(targeting).map(key => `${key}=${encodeURIComponent(targeting[key])}`).join('&'); + } else { + return ''; + } +} + +/** + * Parse a GPT-Style general size Array like `[[300, 250]]` or `"300x250,970x90"` into an array of width, height tuples `[[300, 250]]` or '[[300,250], [970,90]]' + */ +function sizesToSizeTuples(sizes) { + if (typeof sizes === 'string') { + // multiple sizes will be comma-separated + return sizes.split(/\s*,\s*/).map(sz => sz.match(/^(\d+)x(\d+)$/i)).filter(match => match).map(_ref => { + let [_, w, h] = _ref; + return [parseInt(w, 10), parseInt(h, 10)]; + }); + } else if (Array.isArray(sizes)) { + if (isValidGPTSingleSize(sizes)) { + return [sizes]; + } + return sizes.filter(isValidGPTSingleSize); + } + return []; +} + +/** + * Parse a GPT-Style general size Array like `[[300, 250]]` or `"300x250,970x90"` into an array of sizes `["300x250"]` or '['300x250', '970x90']' + * @param {(Array.|Array.)} sizeObj Input array or double array [300,250] or [[300,250], [728,90]] + * @return {Array.} Array of strings like `["300x250"]` or `["300x250", "728x90"]` + */ +function parseSizesInput(sizeObj) { + return sizesToSizeTuples(sizeObj).map(sizeTupleToSizeString); +} +function sizeTupleToSizeString(size) { + return size[0] + 'x' + size[1]; +} + +// Parse a GPT style single size array, (i.e [300, 250]) +// into an AppNexus style string, (i.e. 300x250) +function parseGPTSingleSizeArray(singleSize) { + if (isValidGPTSingleSize(singleSize)) { + return sizeTupleToSizeString(singleSize); + } +} +function sizeTupleToRtbSize(size) { + return { + w: size[0], + h: size[1] + }; +} + +// Parse a GPT style single size array, (i.e [300, 250]) +// into OpenRTB-compatible (imp.banner.w/h, imp.banner.format.w/h, imp.video.w/h) object(i.e. {w:300, h:250}) +function parseGPTSingleSizeArrayToRtbSize(singleSize) { + if (isValidGPTSingleSize(singleSize)) { + return sizeTupleToRtbSize(singleSize); + } +} +function isValidGPTSingleSize(singleSize) { + // if we aren't exactly 2 items in this array, it is invalid + return isArray(singleSize) && singleSize.length === 2 && !isNaN(singleSize[0]) && !isNaN(singleSize[1]); +} +function getWindowTop() { + return window.top; +} +function getWindowSelf() { + return window.self; +} +function getWindowLocation() { + return window.location; +} +function getDocument() { + return document; +} +function canAccessWindowTop() { + try { + if (internal.getWindowTop().location.href) { + return true; + } + } catch (e) { + return false; + } +} + +/** + * Wrappers to console.(log | info | warn | error). Takes N arguments, the same as the native methods + */ +function logMessage() { + if (debugTurnedOn() && consoleLogExists) { + // eslint-disable-next-line no-console + console.log.apply(console, decorateLog(arguments, 'MESSAGE:')); + } +} +function logInfo() { + if (debugTurnedOn() && consoleInfoExists) { + // eslint-disable-next-line no-console + console.info.apply(console, decorateLog(arguments, 'INFO:')); + } +} +function logWarn() { + if (debugTurnedOn() && consoleWarnExists) { + // eslint-disable-next-line no-console + console.warn.apply(console, decorateLog(arguments, 'WARNING:')); + } + emitEvent(_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_DEBUG, { + type: 'WARNING', + arguments: arguments + }); +} +function logError() { + if (debugTurnedOn() && consoleErrorExists) { + // eslint-disable-next-line no-console + console.error.apply(console, decorateLog(arguments, 'ERROR:')); + } + emitEvent(_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_DEBUG, { + type: 'ERROR', + arguments: arguments + }); +} +function prefixLog(prefix) { + function decorate(fn) { + return function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + fn(prefix, ...args); + }; + } + return { + logError: decorate(logError), + logWarn: decorate(logWarn), + logMessage: decorate(logMessage), + logInfo: decorate(logInfo) + }; +} +function decorateLog(args, prefix) { + args = [].slice.call(args); + let bidder = _config_js__WEBPACK_IMPORTED_MODULE_4__.config.getCurrentBidder(); + prefix && args.unshift(prefix); + if (bidder) { + args.unshift(label('#aaa')); + } + args.unshift(label('#3b88c3')); + args.unshift('%cPrebid' + (bidder ? `%c${bidder}` : '')); + return args; + function label(color) { + return `display: inline-block; color: #fff; background: ${color}; padding: 1px 4px; border-radius: 3px;`; + } +} +function hasConsoleLogger() { + return consoleLogExists; +} +function debugTurnedOn() { + return !!_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('debug'); +} +const createIframe = (() => { + const DEFAULTS = { + border: '0px', + hspace: '0', + vspace: '0', + marginWidth: '0', + marginHeight: '0', + scrolling: 'no', + frameBorder: '0', + allowtransparency: 'true' + }; + return function (doc, attrs) { + let style = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const f = doc.createElement('iframe'); + Object.assign(f, Object.assign({}, DEFAULTS, attrs)); + Object.assign(f.style, style); + return f; + }; +})(); +function createInvisibleIframe() { + return createIframe(document, { + id: getUniqueIdentifierStr(), + width: 0, + height: 0, + src: 'about:blank' + }, { + display: 'none', + height: '0px', + width: '0px', + border: '0px' + }); +} + +/* + * Check if a given parameter name exists in query string + * and if it does return the value + */ +function getParameterByName(name) { + return parseQS(getWindowLocation().search)[name] || ''; +} + +/** + * Return if the object is of the + * given type. + * @param {*} object to test + * @param {String} _t type string (e.g., Array) + * @return {Boolean} if object is of type _t + */ +function isA(object, _t) { + return toString.call(object) === '[object ' + _t + ']'; +} +function isFn(object) { + return isA(object, tFn); +} +function isStr(object) { + return isA(object, tStr); +} +const isArray = Array.isArray.bind(Array); +function isNumber(object) { + return isA(object, tNumb); +} +function isPlainObject(object) { + return isA(object, tObject); +} +function isBoolean(object) { + return isA(object, tBoolean); +} + +/** + * Return if the object is "empty"; + * this includes falsey, no keys, or no items at indices + * @param {*} object object to test + * @return {Boolean} if object is empty + */ +function isEmpty(object) { + if (!object) return true; + if (isArray(object) || isStr(object)) { + return !(object.length > 0); + } + return Object.keys(object).length <= 0; +} + +/** + * Return if string is empty, null, or undefined + * @param str string to test + * @returns {boolean} if string is empty + */ +function isEmptyStr(str) { + return isStr(str) && (!str || str.length === 0); +} + +/** + * Iterate object with the function + * falls back to es5 `forEach` + * @param {Array|Object} object + * @param {Function} fn - The function to execute for each element. It receives three arguments: value, key, and the original object. + * @returns {void} + */ +function _each(object, fn) { + if (isFn(object?.forEach)) return object.forEach(fn, this); + Object.entries(object || {}).forEach(_ref2 => { + let [k, v] = _ref2; + return fn.call(this, v, k); + }); +} +function contains(a, obj) { + return isFn(a?.includes) && a.includes(obj); +} + +/** + * Map an array or object into another array + * given a function + * @param {Array|Object} object + * @param {Function} callback - The function to execute for each element. It receives three arguments: value, key, and the original object. + * @return {Array} + */ +function _map(object, callback) { + if (isFn(object?.map)) return object.map(callback); + return Object.entries(object || {}).map(_ref3 => { + let [k, v] = _ref3; + return callback(v, k, object); + }); +} + +/* +* Inserts an element(elm) as targets child, by default as first child +* @param {HTMLElement} elm +* @param {HTMLElement} [doc] +* @param {HTMLElement} [target] +* @param {Boolean} [asLastChildChild] +* @return {HTML Element} +*/ +function insertElement(elm, doc, target, asLastChildChild) { + doc = doc || document; + let parentEl; + if (target) { + parentEl = doc.getElementsByTagName(target); + } else { + parentEl = doc.getElementsByTagName('head'); + } + try { + parentEl = parentEl.length ? parentEl : doc.getElementsByTagName('body'); + if (parentEl.length) { + parentEl = parentEl[0]; + let insertBeforeEl = asLastChildChild ? null : parentEl.firstChild; + return parentEl.insertBefore(elm, insertBeforeEl); + } + } catch (e) {} +} + +/** + * Returns a promise that completes when the given element triggers a 'load' or 'error' DOM event, or when + * `timeout` milliseconds have elapsed. + * + * @param {HTMLElement} element + * @param {Number} [timeout] + * @returns {Promise} + */ +function waitForElementToLoad(element, timeout) { + let timer = null; + return new _utils_promise_js__WEBPACK_IMPORTED_MODULE_5__.PbPromise(resolve => { + const onLoad = function () { + element.removeEventListener('load', onLoad); + element.removeEventListener('error', onLoad); + if (timer != null) { + window.clearTimeout(timer); + } + resolve(); + }; + element.addEventListener('load', onLoad); + element.addEventListener('error', onLoad); + if (timeout != null) { + timer = window.setTimeout(onLoad, timeout); + } + }); +} + +/** + * Inserts an image pixel with the specified `url` for cookie sync + * @param {string} url URL string of the image pixel to load + * @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process + * @param {Number} [timeout] an optional timeout in milliseconds for the image to load before calling `done` + */ +function triggerPixel(url, done, timeout) { + const img = new Image(); + if (done && internal.isFn(done)) { + waitForElementToLoad(img, timeout).then(done); + } + img.src = url; +} + +/** + * Inserts an empty iframe with the specified `html`, primarily used for tracking purposes + * (though could be for other purposes) + * @param {string} htmlCode snippet of HTML code used for tracking purposes + */ +function insertHtmlIntoIframe(htmlCode) { + if (!htmlCode) { + return; + } + const iframe = createInvisibleIframe(); + internal.insertElement(iframe, document, 'body'); + (doc => { + doc.open(); + doc.write(htmlCode); + doc.close(); + })(iframe.contentWindow.document); +} + +/** + * Inserts empty iframe with the specified `url` for cookie sync + * @param {string} url URL to be requested + * @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process + * @param {Number} [timeout] an optional timeout in milliseconds for the iframe to load before calling `done` + */ +function insertUserSyncIframe(url, done, timeout) { + let iframeHtml = internal.createTrackPixelIframeHtml(url, false, 'allow-scripts allow-same-origin'); + let div = document.createElement('div'); + div.innerHTML = iframeHtml; + let iframe = div.firstChild; + if (done && internal.isFn(done)) { + waitForElementToLoad(iframe, timeout).then(done); + } + internal.insertElement(iframe, document, 'html', true); +} + +/** + * Creates a snippet of HTML that retrieves the specified `url` + * @param {string} url URL to be requested + * @param encode + * @return {string} HTML snippet that contains the img src = set to `url` + */ +function createTrackPixelHtml(url) { + let encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : encodeURI; + if (!url) { + return ''; + } + let escapedUrl = encode(url); + let img = '
'; + img += '
'; + return img; +} +; + +/** + * encodeURI, but preserves macros of the form '${MACRO}' (e.g. '${AUCTION_PRICE}') + * @param url + * @return {string} + */ +function encodeMacroURI(url) { + const macros = Array.from(url.matchAll(/\$({[^}]+})/g)).map(match => match[1]); + return macros.reduce((str, macro) => { + return str.replace('$' + encodeURIComponent(macro), '$' + macro); + }, encodeURI(url)); +} + +/** + * Creates a snippet of Iframe HTML that retrieves the specified `url` + * @param {string} url plain URL to be requested + * @param {string} encodeUri boolean if URL should be encoded before inserted. Defaults to true + * @param {string} sandbox string if provided the sandbox attribute will be included with the given value + * @return {string} HTML snippet that contains the iframe src = set to `url` + */ +function createTrackPixelIframeHtml(url) { + let encodeUri = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let sandbox = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + if (!url) { + return ''; + } + if (encodeUri) { + url = encodeURI(url); + } + if (sandbox) { + sandbox = `sandbox="${sandbox}"`; + } + return ``; +} +function uniques(value, index, arry) { + return arry.indexOf(value) === index; +} +function flatten(a, b) { + return a.concat(b); +} +function getBidRequest(id, bidderRequests) { + if (!id) { + return; + } + return bidderRequests.flatMap(br => br.bids).find(bid => ['bidId', 'adId', 'bid_id'].some(prop => bid[prop] === id)); +} +function getValue(obj, key) { + return obj[key]; +} +function getBidderCodes() { + let adUnits = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : pbjsInstance.adUnits; + // this could memoize adUnits + return adUnits.map(unit => unit.bids.map(bid => bid.bidder).reduce(flatten, [])).reduce(flatten, []).filter(bidder => typeof bidder !== 'undefined').filter(uniques); +} +function isGptPubadsDefined() { + if (window.googletag && isFn(window.googletag.pubads) && isFn(window.googletag.pubads().getSlots)) { + return true; + } +} +function isApnGetTagDefined() { + if (window.apntag && isFn(window.apntag.getTag)) { + return true; + } +} +const sortByHighestCpm = (a, b) => { + return b.cpm - a.cpm; +}; + +/** + * Fisher–Yates shuffle + * http://stackoverflow.com/a/6274398 + * https://bost.ocks.org/mike/shuffle/ + * istanbul ignore next + */ +function shuffle(array) { + let counter = array.length; + + // while there are elements in the array + while (counter > 0) { + // pick a random index + let index = Math.floor(Math.random() * counter); + + // decrease counter by 1 + counter--; + + // and swap the last element with it + let temp = array[counter]; + array[counter] = array[index]; + array[index] = temp; + } + return array; +} +function deepClone(obj) { + return (0,klona_json__WEBPACK_IMPORTED_MODULE_6__.klona)(obj) || {}; +} +function inIframe() { + try { + return internal.getWindowSelf() !== internal.getWindowTop(); + } catch (e) { + return true; + } +} + +/** + * https://iabtechlab.com/wp-content/uploads/2016/03/SafeFrames_v1.1_final.pdf + */ +function isSafeFrameWindow() { + if (!inIframe()) { + return false; + } + const ws = internal.getWindowSelf(); + return !!(ws.$sf && ws.$sf.ext); +} + +/** + * Returns the result of calling the function $sf.ext.geom() if it exists + * @see https://iabtechlab.com/wp-content/uploads/2016/03/SafeFrames_v1.1_final.pdf — 5.4 Function $sf.ext.geom + * @returns {Object | undefined} geometric information about the container + */ +function getSafeframeGeometry() { + try { + const ws = getWindowSelf(); + return typeof ws.$sf.ext.geom === 'function' ? ws.$sf.ext.geom() : undefined; + } catch (e) { + logError('Error getting SafeFrame geometry', e); + return undefined; + } +} +function isSafariBrowser() { + return /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent); +} +function replaceMacros(str, subs) { + if (!str) return; + return Object.entries(subs).reduce((str, _ref4) => { + let [key, val] = _ref4; + return str.replace(new RegExp('\\$\\{' + key + '\\}', 'g'), val || ''); + }, str); +} +function replaceAuctionPrice(str, cpm) { + return replaceMacros(str, { + AUCTION_PRICE: cpm + }); +} +function replaceClickThrough(str, clicktag) { + if (!str || !clicktag || typeof clicktag !== 'string') return; + return str.replace(/\${CLICKTHROUGH}/g, clicktag); +} +function timestamp() { + return new Date().getTime(); +} + +/** + * The returned value represents the time elapsed since the time origin. @see https://developer.mozilla.org/en-US/docs/Web/API/Performance/now + * @returns {number} + */ +function getPerformanceNow() { + return window.performance && window.performance.now && window.performance.now() || 0; +} + +/** + * Retuns the difference between `timing.domLoading` and `timing.navigationStart`. + * This function uses the deprecated `Performance.timing` API and should be removed in future. + * It has not been updated yet because it is still used in some modules. + * @deprecated + * @param {Window} w The window object used to perform the api call. default to window.self + * @returns {number} + */ +function getDomLoadingDuration(w) { + let domLoadingDuration = -1; + w = w || getWindowSelf(); + const performance = w.performance; + if (w.performance?.timing) { + if (w.performance.timing.navigationStart > 0) { + const val = performance.timing.domLoading - performance.timing.navigationStart; + if (val > 0) { + domLoadingDuration = val; + } + } + } + return domLoadingDuration; +} + +/** + * When the deviceAccess flag config option is false, no cookies should be read or set + * @returns {boolean} + */ +function hasDeviceAccess() { + return _config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('deviceAccess') !== false; +} + +/** + * @returns {(boolean|undefined)} + */ +function checkCookieSupport() { + // eslint-disable-next-line no-restricted-properties + if (window.navigator.cookieEnabled || !!document.cookie.length) { + return true; + } +} + +/** + * Given a function, return a function which only executes the original after + * it's been called numRequiredCalls times. + * + * Note that the arguments from the previous calls will *not* be forwarded to the original function. + * Only the final call's arguments matter. + * + * @param {function} func The function which should be executed, once the returned function has been executed + * numRequiredCalls times. + * @param {number} numRequiredCalls The number of times which the returned function needs to be called before + * func is. + */ +function delayExecution(func, numRequiredCalls) { + if (numRequiredCalls < 1) { + throw new Error(`numRequiredCalls must be a positive number. Got ${numRequiredCalls}`); + } + let numCalls = 0; + return function () { + numCalls++; + if (numCalls === numRequiredCalls) { + func.apply(this, arguments); + } + }; +} + +/** + * https://stackoverflow.com/a/34890276/428704 + * @param {Array} xs + * @param {string} key + * @returns {Object} {${key_value}: ${groupByArray}, key_value: {groupByArray}} + */ +function groupBy(xs, key) { + return xs.reduce(function (rv, x) { + (rv[x[key]] = rv[x[key]] || []).push(x); + return rv; + }, {}); +} + +/** + * Build an object consisting of only defined parameters to avoid creating an + * object with defined keys and undefined values. + * @param {Object} object The object to pick defined params out of + * @param {string[]} params An array of strings representing properties to look for in the object + * @returns {Object} An object containing all the specified values that are defined + */ +function getDefinedParams(object, params) { + return params.filter(param => object[param]).reduce((bid, param) => Object.assign(bid, { + [param]: object[param] + }), {}); +} + +/** + * @typedef {Object} MediaTypes + * @property {Object} banner banner configuration + * @property {Object} native native configuration + * @property {Object} video video configuration + */ + +/** + * Validates an adunit's `mediaTypes` parameter + * @param {MediaTypes} mediaTypes mediaTypes parameter to validate + * @return {boolean} If object is valid + */ +function isValidMediaTypes(mediaTypes) { + const SUPPORTED_MEDIA_TYPES = ['banner', 'native', 'video']; + const SUPPORTED_STREAM_TYPES = ['instream', 'outstream', 'adpod']; + const types = Object.keys(mediaTypes); + if (!types.every(type => (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.includes)(SUPPORTED_MEDIA_TYPES, type))) { + return false; + } + if ( true && mediaTypes.video && mediaTypes.video.context) { + return (0,_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.includes)(SUPPORTED_STREAM_TYPES, mediaTypes.video.context); + } + return true; +} + +/** + * Returns user configured bidder params from adunit + * @param {Object} adUnits + * @param {string} adUnitCode code + * @param {string} bidder code + * @return {Array} user configured param for the given bidder adunit configuration + */ +function getUserConfiguredParams(adUnits, adUnitCode, bidder) { + return adUnits.filter(adUnit => adUnit.code === adUnitCode).flatMap(adUnit => adUnit.bids).filter(bidderData => bidderData.bidder === bidder).map(bidderData => bidderData.params || {}); +} + +/** + * Returns Do Not Track state + */ +function getDNT() { + return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNotTrack === '1' || navigator.doNotTrack === 'yes'; +} +const compareCodeAndSlot = (slot, adUnitCode) => slot.getAdUnitPath() === adUnitCode || slot.getSlotElementId() === adUnitCode; + +/** + * Returns filter function to match adUnitCode in slot + * @param {Object} slot GoogleTag slot + * @return {function} filter function + */ +function isAdUnitCodeMatchingSlot(slot) { + return adUnitCode => compareCodeAndSlot(slot, adUnitCode); +} + +/** + * Constructs warning message for when unsupported bidders are dropped from an adunit + * @param {Object} adUnit ad unit from which the bidder is being dropped + * @param {string} bidder bidder code that is not compatible with the adUnit + * @return {string} warning message to display when condition is met + */ +function unsupportedBidderMessage(adUnit, bidder) { + const mediaType = Object.keys(adUnit.mediaTypes || { + 'banner': 'banner' + }).join(', '); + return ` + ${adUnit.code} is a ${mediaType} ad unit + containing bidders that don't support ${mediaType}: ${bidder}. + This bidder won't fetch demand. + `; +} + +/** + * Checks input is integer or not + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger + * @param {*} value + */ +const isInteger = Number.isInteger.bind(Number); + +/** + * Returns a new object with undefined properties removed from given object + * @param obj the object to clean + */ +function cleanObj(obj) { + return Object.fromEntries(Object.entries(obj).filter(_ref5 => { + let [_, v] = _ref5; + return typeof v !== 'undefined'; + })); +} + +/** + * Create a new object with selected properties. Also allows property renaming and transform functions. + * @param obj the original object + * @param properties An array of desired properties + */ +function pick(obj, properties) { + if (typeof obj !== 'object') { + return {}; + } + return properties.reduce((newObj, prop, i) => { + if (typeof prop === 'function') { + return newObj; + } + let newProp = prop; + let match = prop.match(/^(.+?)\sas\s(.+?)$/i); + if (match) { + prop = match[1]; + newProp = match[2]; + } + let value = obj[prop]; + if (typeof properties[i + 1] === 'function') { + value = properties[i + 1](value, newObj); + } + if (typeof value !== 'undefined') { + newObj[newProp] = value; + } + return newObj; + }, {}); +} +function isArrayOfNums(val, size) { + return isArray(val) && (size ? val.length === size : true) && val.every(v => isInteger(v)); +} +function parseQS(query) { + return !query ? {} : query.replace(/^\?/, '').split('&').reduce((acc, criteria) => { + let [k, v] = criteria.split('='); + if (/\[\]$/.test(k)) { + k = k.replace('[]', ''); + acc[k] = acc[k] || []; + acc[k].push(v); + } else { + acc[k] = v || ''; + } + return acc; + }, {}); +} +function formatQS(query) { + return Object.keys(query).map(k => Array.isArray(query[k]) ? query[k].map(v => `${k}[]=${v}`).join('&') : `${k}=${query[k]}`).join('&'); +} +function parseUrl(url, options) { + let parsed = document.createElement('a'); + if (options && 'noDecodeWholeURL' in options && options.noDecodeWholeURL) { + parsed.href = url; + } else { + parsed.href = decodeURIComponent(url); + } + // in window.location 'search' is string, not object + let qsAsString = options && 'decodeSearchAsString' in options && options.decodeSearchAsString; + return { + href: parsed.href, + protocol: (parsed.protocol || '').replace(/:$/, ''), + hostname: parsed.hostname, + port: +parsed.port, + pathname: parsed.pathname.replace(/^(?!\/)/, '/'), + search: qsAsString ? parsed.search : internal.parseQS(parsed.search || ''), + hash: (parsed.hash || '').replace(/^#/, ''), + host: parsed.host || window.location.host + }; +} +function buildUrl(obj) { + return (obj.protocol || 'http') + '://' + (obj.host || obj.hostname + (obj.port ? `:${obj.port}` : '')) + (obj.pathname || '') + (obj.search ? `?${internal.formatQS(obj.search || '')}` : '') + (obj.hash ? `#${obj.hash}` : ''); +} + +/** + * This function deeply compares two objects checking for their equivalence. + * @param {Object} obj1 + * @param {Object} obj2 + * @param {Object} [options] - Options for comparison. + * @param {boolean} [options.checkTypes=false] - If set, two objects with identical properties but different constructors will *not* be considered equivalent. + * @returns {boolean} - Returns `true` if the objects are equivalent, `false` otherwise. + */ +function deepEqual(obj1, obj2) { + let { + checkTypes = false + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + // Quick reference check + if (obj1 === obj2) return true; + + // If either is null or not an object, do a direct equality check + if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) { + return false; + } + // Cache the Array checks + const isArr1 = Array.isArray(obj1); + const isArr2 = Array.isArray(obj2); + // Special case: both are arrays + if (isArr1 && isArr2) { + if (obj1.length !== obj2.length) return false; + for (let i = 0; i < obj1.length; i++) { + if (!deepEqual(obj1[i], obj2[i], { + checkTypes + })) { + return false; + } + } + return true; + } else if (isArr1 || isArr2) { + return false; + } + + // If we’re checking types, compare constructors (e.g., plain object vs. Date) + if (checkTypes && obj1.constructor !== obj2.constructor) { + return false; + } + + // Compare object keys. Cache keys for both to avoid repeated calls. + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) return false; + for (const key of keys1) { + // If `obj2` doesn't have this key or sub-values aren't equal, bail out. + if (!Object.prototype.hasOwnProperty.call(obj2, key)) { + return false; + } + if (!deepEqual(obj1[key], obj2[key], { + checkTypes + })) { + return false; + } + } + return true; +} +function mergeDeep(target) { + for (let i = 0; i < (arguments.length <= 1 ? 0 : arguments.length - 1); i++) { + const source = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1]; + if (!isPlainObject(source)) { + continue; + } + mergeDeepHelper(target, source); + } + return target; +} +function mergeDeepHelper(target, source) { + // quick check + if (!isPlainObject(target) || !isPlainObject(source)) { + return; + } + const keys = Object.keys(source); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === '__proto__' || key === 'constructor') { + continue; + } + const val = source[key]; + if (isPlainObject(val)) { + if (!target[key]) { + target[key] = {}; + } + mergeDeepHelper(target[key], val); + } else if (Array.isArray(val)) { + if (!Array.isArray(target[key])) { + target[key] = [...val]; + } else { + // deduplicate + val.forEach(obj => { + if (!target[key].some(item => deepEqual(item, obj))) { + target[key].push(obj); + } + }); + } + } else { + // direct assignment + target[key] = val; + } + } +} + +/** + * returns a hash of a string using a fast algorithm + * source: https://stackoverflow.com/a/52171480/845390 + * @param str + * @param seed (optional) + * @returns {string} + */ +function cyrb53Hash(str) { + let seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // IE doesn't support imul + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill + let imul = function (opA, opB) { + if (isFn(Math.imul)) { + return Math.imul(opA, opB); + } else { + opB |= 0; // ensure that opB is an integer. opA will automatically be coerced. + // floating points give us 53 bits of precision to work with plus 1 sign bit + // automatically handled for our convienence: + // 1. 0x003fffff /*opA & 0x000fffff*/ * 0x7fffffff /*opB*/ = 0x1fffff7fc00001 + // 0x1fffff7fc00001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/ + var result = (opA & 0x003fffff) * opB; + // 2. We can remove an integer coersion from the statement above because: + // 0x1fffff7fc00001 + 0xffc00000 = 0x1fffffff800001 + // 0x1fffffff800001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/ + if (opA & 0xffc00000) result += (opA & 0xffc00000) * opB | 0; + return result | 0; + } + }; + let h1 = 0xdeadbeef ^ seed; + let h2 = 0x41c6ce57 ^ seed; + for (let i = 0, ch; i < str.length; i++) { + ch = str.charCodeAt(i); + h1 = imul(h1 ^ ch, 2654435761); + h2 = imul(h2 ^ ch, 1597334677); + } + h1 = imul(h1 ^ h1 >>> 16, 2246822507) ^ imul(h2 ^ h2 >>> 13, 3266489909); + h2 = imul(h2 ^ h2 >>> 16, 2246822507) ^ imul(h1 ^ h1 >>> 13, 3266489909); + return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(); +} + +/** + * returns the result of `JSON.parse(data)`, or undefined if that throws an error. + * @param data + * @returns {any} + */ +function safeJSONParse(data) { + try { + return JSON.parse(data); + } catch (e) {} +} +function safeJSONEncode(data) { + try { + return JSON.stringify(data); + } catch (e) { + return ''; + } +} + +/** + * Returns a memoized version of `fn`. + * + * @param fn + * @param key cache key generator, invoked with the same arguments passed to `fn`. + * By default, the first argument is used as key. + * @return {function(): any} + */ +function memoize(fn) { + let key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (arg) { + return arg; + }; + const cache = new Map(); + const memoized = function () { + const cacheKey = key.apply(this, arguments); + if (!cache.has(cacheKey)) { + cache.set(cacheKey, fn.apply(this, arguments)); + } + return cache.get(cacheKey); + }; + memoized.clear = cache.clear.bind(cache); + return memoized; +} + +/** + * Returns a Unix timestamp for given time value and unit. + * @param {number} timeValue numeric value, defaults to 0 (which means now) + * @param {string} timeUnit defaults to days (or 'd'), use 'm' for minutes. Any parameter that isn't 'd' or 'm' will return Date.now(). + * @returns {number} + */ +function getUnixTimestampFromNow() { + let timeValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let timeUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'd'; + const acceptableUnits = ['m', 'd']; + if (acceptableUnits.indexOf(timeUnit) < 0) { + return Date.now(); + } + const multiplication = timeValue / (timeUnit === 'm' ? 1440 : 1); + return Date.now() + (timeValue && timeValue > 0 ? 1000 * 60 * 60 * 24 * multiplication : 0); +} + +/** + * Converts given object into an array, so {key: 1, anotherKey: 'fred', third: ['fred']} is turned + * into [{key: 1}, {anotherKey: 'fred'}, {third: ['fred']}] + * @param {Object} obj the object + * @returns {Array} + */ +function convertObjectToArray(obj) { + return Object.keys(obj).map(key => { + return { + [key]: obj[key] + }; + }); +} + +/** + * Sets dataset attributes on a script + * @param {HTMLScriptElement} script + * @param {object} attributes + */ +function setScriptAttributes(script, attributes) { + Object.entries(attributes).forEach(_ref6 => { + let [k, v] = _ref6; + return script.setAttribute(k, v); + }); +} + +/** + * Perform a binary search for `el` on an ordered array `arr`. + * + * @returns the lowest nonnegative integer I that satisfies: + * key(arr[i]) >= key(el) for each i between I and arr.length + * + * (if one or more matches are found for `el`, returns the index of the first; + * if the element is not found, return the index of the first element that's greater; + * if no greater element exists, return `arr.length`) + */ +function binarySearch(arr, el) { + let key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : el => el; + let left = 0; + let right = arr.length && arr.length - 1; + const target = key(el); + while (right - left > 1) { + const middle = left + Math.round((right - left) / 2); + if (target > key(arr[middle])) { + left = middle; + } else { + right = middle; + } + } + while (arr.length > left && target > key(arr[left])) { + left++; + } + return left; +} + +/** + * Checks if an object has non-serializable properties. + * Non-serializable properties are functions and RegExp objects. + * + * @param {Object} obj - The object to check. + * @param {Set} checkedObjects - A set of properties that have already been checked. + * @returns {boolean} - Returns true if the object has non-serializable properties, false otherwise. + */ +function hasNonSerializableProperty(obj) { + let checkedObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); + for (const key in obj) { + const value = obj[key]; + const type = typeof value; + if (value === undefined || type === 'function' || type === 'symbol' || value instanceof RegExp || value instanceof Map || value instanceof Set || value instanceof Date || value !== null && type === 'object' && value.hasOwnProperty('toJSON')) { + return true; + } + if (value !== null && type === 'object' && value.constructor === Object) { + if (checkedObjects.has(value)) { + // circular reference, means we have a non-serializable property + return true; + } + checkedObjects.add(value); + if (hasNonSerializableProperty(value, checkedObjects)) { + return true; + } + } + } + return false; +} + +/** + * Returns the value of a nested property in an array of objects. + * + * @param {Array} collection - Array of objects. + * @param {String} key - Key of nested property. + * @returns {any|undefined} - Value of nested property. + */ +function setOnAny(collection, key) { + for (let i = 0, result; i < collection.length; i++) { + result = (0,dlv_index_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection[i], key); + if (result) { + return result; + } + } + return undefined; +} +function extractDomainFromHost(pageHost) { + let domain = null; + try { + let domains = /[-\w]+\.([-\w]+|[-\w]{3,}|[-\w]{1,3}\.[-\w]{2})$/i.exec(pageHost); + if (domains != null && domains.length > 0) { + domain = domains[0]; + for (let i = 1; i < domains.length; i++) { + if (domains[i].length > domain.length) { + domain = domains[i]; + } + } + } + } catch (e) { + domain = null; + } + return domain; +} +function triggerNurlWithCpm(bid, cpm) { + if (isStr(bid.nurl) && bid.nurl !== '') { + bid.nurl = bid.nurl.replace(/\${AUCTION_PRICE}/, cpm); + triggerPixel(bid.nurl); + } +} + +// To ensure that isGzipCompressionSupported() doesn’t become an overhead, we have used memoization to cache the result after the first execution. +// This way, even if the function is called multiple times, it will only perform the actual check once and return the cached result in subsequent calls. +const isGzipCompressionSupported = function () { + let cachedResult; // Store the result + + return function () { + if (cachedResult !== undefined) { + return cachedResult; // Return cached result if already computed + } + try { + if (typeof window.CompressionStream === 'undefined') { + cachedResult = false; + } else { + (() => new window.CompressionStream('gzip'))(); + cachedResult = true; + } + } catch (error) { + cachedResult = false; + } + return cachedResult; + }; +}(); + +// Make sure to use isGzipCompressionSupported before calling this function +async function compressDataWithGZip(data) { + if (typeof data !== 'string') { + // TextEncoder (below) expects a string + data = JSON.stringify(data); + } + const encoder = new TextEncoder(); + const encodedData = encoder.encode(data); + const compressedStream = new Blob([encodedData]).stream().pipeThrough(new window.CompressionStream('gzip')); + const compressedBlob = await new Response(compressedStream).blob(); + const compressedArrayBuffer = await compressedBlob.arrayBuffer(); + return new Uint8Array(compressedArrayBuffer); +} + +/***/ }), + +/***/ "./src/utils/cpm.js": +/*!**************************!*\ + !*** ./src/utils/cpm.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ adjustCpm: () => (/* binding */ adjustCpm) +/* harmony export */ }); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _bidderSettings_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); + + + +function adjustCpm(cpm, bidResponse, bidRequest) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_0__.auctionManager.index, + bs = _bidderSettings_js__WEBPACK_IMPORTED_MODULE_1__.bidderSettings + } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + bidRequest = bidRequest || index.getBidRequest(bidResponse); + const adapterCode = bidResponse?.adapterCode; + const bidderCode = bidResponse?.bidderCode || bidRequest?.bidder; + const adjustAlternateBids = bs.get(bidResponse?.adapterCode, 'adjustAlternateBids'); + const bidCpmAdjustment = bs.getOwn(bidderCode, 'bidCpmAdjustment') || bs.get(adjustAlternateBids ? adapterCode : bidderCode, 'bidCpmAdjustment'); + if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') { + try { + return bidCpmAdjustment(cpm, Object.assign({}, bidResponse), bidRequest); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error during bid adjustment', e); + } + } + return cpm; +} + +/***/ }), + +/***/ "./src/utils/focusTimeout.js": +/*!***********************************!*\ + !*** ./src/utils/focusTimeout.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setFocusTimeout: () => (/* binding */ setFocusTimeout) +/* harmony export */ }); +/* unused harmony export reset */ +let outOfFocusStart = null; // enforce null otherwise it could be undefined and the callback wouldn't execute +let timeOutOfFocus = 0; +let suspendedTimeouts = []; +function trackTimeOutOfFocus() { + if (document.hidden) { + outOfFocusStart = Date.now(); + } else { + timeOutOfFocus += Date.now() - (outOfFocusStart ?? 0); // when the page is loaded in hidden state outOfFocusStart is undefined, which results in timeoutOffset being NaN + outOfFocusStart = null; + suspendedTimeouts.forEach(_ref => { + let { + callback, + startTime, + setTimerId + } = _ref; + return setTimerId(setFocusTimeout(callback, timeOutOfFocus - startTime)()); + }); + suspendedTimeouts = []; + } +} +document.addEventListener('visibilitychange', trackTimeOutOfFocus); +function reset() { + outOfFocusStart = null; + timeOutOfFocus = 0; + suspendedTimeouts = []; + document.removeEventListener('visibilitychange', trackTimeOutOfFocus); + document.addEventListener('visibilitychange', trackTimeOutOfFocus); +} + +/** + * Wraps native setTimeout function in order to count time only when page is focused + * + * @param {function(): void} [callback] - A function that will be invoked after the passed time + * @param {number} [milliseconds] - Minimum duration (in milliseconds) that the callback will be executed after + * @returns {function(): number} - Getter function for current timer id + */ +function setFocusTimeout(callback, milliseconds) { + const startTime = timeOutOfFocus; + let timerId = setTimeout(() => { + if (timeOutOfFocus === startTime && outOfFocusStart == null) { + callback(); + } else if (outOfFocusStart != null) { + // case when timeout ended during page is out of focus + suspendedTimeouts.push({ + callback, + startTime, + setTimerId(newId) { + timerId = newId; + } + }); + } else { + timerId = setFocusTimeout(callback, timeOutOfFocus - startTime)(); + } + }, milliseconds); + return () => timerId; +} + +/***/ }), + +/***/ "./src/utils/gdpr.js": +/*!***************************!*\ + !*** ./src/utils/gdpr.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ hasPurpose1Consent: () => (/* binding */ hasPurpose1Consent) +/* harmony export */ }); +/** + * Check if GDPR purpose 1 consent was given. + * + * @param gdprConsent GDPR consent data + * @returns {boolean} true if the gdprConsent is null-y; or GDPR does not apply; or if purpose 1 consent was given. + */ +function hasPurpose1Consent(gdprConsent) { + if (gdprConsent?.gdprApplies) { + return gdprConsent?.vendorData?.purpose?.consents?.[1] === true; + } + return true; +} + +/***/ }), + +/***/ "./src/utils/ipUtils.js": +/*!******************************!*\ + !*** ./src/utils/ipUtils.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ scrubIPv4: () => (/* binding */ scrubIPv4), +/* harmony export */ scrubIPv6: () => (/* binding */ scrubIPv6) +/* harmony export */ }); +function scrubIPv4(ip) { + if (!ip) { + return null; + } + const ones = 24; + let ipParts = ip.split('.').map(Number); + if (ipParts.length != 4) { + return null; + } + let mask = []; + for (let i = 0; i < 4; i++) { + let n = Math.max(0, Math.min(8, ones - i * 8)); + mask.push(0xff << 8 - n & 0xff); + } + let maskedIP = ipParts.map((part, i) => part & mask[i]); + return maskedIP.join('.'); +} +function scrubIPv6(ip) { + if (!ip) { + return null; + } + const ones = 64; + let ipParts = ip.split(':').map(part => parseInt(part, 16)); + ipParts = ipParts.map(part => isNaN(part) ? 0 : part); + while (ipParts.length < 8) { + ipParts.push(0); + } + if (ipParts.length != 8) { + return null; + } + let mask = []; + for (let i = 0; i < 8; i++) { + let n = Math.max(0, Math.min(16, ones - i * 16)); + mask.push(0xffff << 16 - n & 0xffff); + } + let maskedIP = ipParts.map((part, i) => part & mask[i]); + return maskedIP.map(part => part.toString(16)).join(':'); +} + +/***/ }), + +/***/ "./src/utils/perfMetrics.js": +/*!**********************************!*\ + !*** ./src/utils/perfMetrics.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ newMetrics: () => (/* binding */ newMetrics), +/* harmony export */ timedAuctionHook: () => (/* binding */ timedAuctionHook), +/* harmony export */ timedBidResponseHook: () => (/* binding */ timedBidResponseHook), +/* harmony export */ useMetrics: () => (/* binding */ useMetrics) +/* harmony export */ }); +/* unused harmony exports CONFIG_TOGGLE, metricsFactory, hookTimer */ +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../config.js */ "./src/config.js"); + +const CONFIG_TOGGLE = 'performanceMetrics'; +const getTime = window.performance && window.performance.now ? () => window.performance.now() : () => Date.now(); +const NODES = new WeakMap(); +function metricsFactory() { + let { + now = getTime, + mkNode = makeNode, + mkTimer = makeTimer, + mkRenamer = rename => rename, + nodes = NODES + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return function newMetrics() { + function makeMetrics(self) { + let rename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : n => ({ + forEach(fn) { + fn(n); + } + }); + rename = mkRenamer(rename); + function accessor(slot) { + return function (name) { + return self.dfWalk({ + visit(edge, node) { + const obj = node[slot]; + if (obj.hasOwnProperty(name)) { + return obj[name]; + } + } + }); + }; + } + const getTimestamp = accessor('timestamps'); + + /** + * Register a metric. + * + * @param name metric name + * @param value metric valiue + */ + function setMetric(name, value) { + const names = rename(name); + self.dfWalk({ + follow(inEdge, outEdge) { + return outEdge.propagate && (!inEdge || !inEdge.stopPropagation); + }, + visit(edge, node) { + names.forEach(name => { + if (edge == null) { + node.metrics[name] = value; + } else { + if (!node.groups.hasOwnProperty(name)) { + node.groups[name] = []; + } + node.groups[name].push(value); + } + }); + } + }); + } + + /** + * Mark the current time as a checkpoint with the given name, to be referenced later + * by `timeSince` or `timeBetween`. + * + * @param name checkpoint name + */ + function checkpoint(name) { + self.timestamps[name] = now(); + } + + /** + * Get the tame passed since `checkpoint`, and optionally save it as a metric. + * + * @param {string} checkpoint checkpoint name + * @param {string} [metric] - The name of the metric to save. Optional. + * @returns {number|null} - The time in milliseconds between now and the checkpoint, or `null` if the checkpoint is not found. + */ + function timeSince(checkpoint, metric) { + const ts = getTimestamp(checkpoint); + const elapsed = ts != null ? now() - ts : null; + if (metric != null) { + setMetric(metric, elapsed); + } + return elapsed; + } + + /** + * Get the time passed between `startCheckpoint` and `endCheckpoint`, optionally saving it as a metric. + * + * @param {string} startCheckpoint - The name of the starting checkpoint. + * @param {string} endCheckpoint - The name of the ending checkpoint. + * @param {string} [metric] - The name of the metric to save. Optional. + * @returns {number|null} - The time in milliseconds between `startCheckpoint` and `endCheckpoint`, or `null` if either checkpoint is not found. + */ + function timeBetween(startCheckpoint, endCheckpoint, metric) { + const start = getTimestamp(startCheckpoint); + const end = getTimestamp(endCheckpoint); + const elapsed = start != null && end != null ? end - start : null; + if (metric != null) { + setMetric(metric, elapsed); + } + return elapsed; + } + + /** + * A function that, when called, stops a time measure and saves it as a metric. + * + * @typedef {function(): void} MetricsTimer + * @template {function} F + * @property {function(F): F} stopBefore returns a wrapper around the given function that begins by + * stopping this time measure. + * @property {function(F): F} stopAfter returns a wrapper around the given function that ends by + * stopping this time measure. + */ + + /** + * Start measuring a time metric with the given name. + * + * @param name metric name + * @return {MetricsTimer} + */ + function startTiming(name) { + return mkTimer(now, val => setMetric(name, val)); + } + + /** + * Run fn and measure the time spent in it. + * + * @template T + * @param name the name to use for the measured time metric + * @param {function(): T} fn + * @return {T} the return value of `fn` + */ + function measureTime(name, fn) { + return startTiming(name).stopAfter(fn)(); + } + + /** + * @typedef {Function} HookFn + * @property {(function(T): void)} bail + * + * @template T + * @typedef {HookFn} TimedHookFn + * @property {(function(): void)} stopTiming + * @property {T} untimed + */ + + /** + * Convenience method for measuring time spent in a `.before` or `.after` hook. + * + * @template T + * @param {string} name - The metric name. + * @param {HookFn} next - The hook's `next` (first) argument. + * @param {function(TimedHookFn): T} fn - A function that will be run immediately; it takes `next`, + * where both `next` and `next.bail` automatically + * call `stopTiming` before continuing with the original hook. + * @return {T} - The return value of `fn`. + */ + function measureHookTime(name, next, fn) { + const stopTiming = startTiming(name); + return fn(function (orig) { + const next = stopTiming.stopBefore(orig); + next.bail = orig.bail && stopTiming.stopBefore(orig.bail); + next.stopTiming = stopTiming; + next.untimed = orig; + return next; + }(next)); + } + + /** + * Get all registered metrics. + * @return {{}} + */ + function getMetrics() { + let result = {}; + self.dfWalk({ + visit(edge, node) { + result = Object.assign({}, !edge || edge.includeGroups ? node.groups : null, node.metrics, result); + } + }); + return result; + } + + /** + * Create and return a new metrics object that starts as a view on all metrics registered here, + * and - by default - also propagates all new metrics here. + * + * Propagated metrics are grouped together, and intended for repeated operations. For example, with the following: + * + * ``` + * const metrics = newMetrics(); + * const requests = metrics.measureTime('buildRequests', buildRequests) + * requests.forEach((req) => { + * const requestMetrics = metrics.fork(); + * requestMetrics.measureTime('processRequest', () => processRequest(req); + * }) + * ``` + * + * if `buildRequests` takes 10ms and returns 3 objects, which respectively take 100, 200, and 300ms in `processRequest`, then + * the final `metrics.getMetrics()` would be: + * + * ``` + * { + * buildRequests: 10, + * processRequest: [100, 200, 300] + * } + * ``` + * + * while the inner `requestMetrics.getMetrics()` would be: + * + * ``` + * { + * buildRequests: 10, + * processRequest: 100 // or 200 for the 2nd loop, etc + * } + * ``` + * + * + * @param {Object} [options={}] - Options for forking the metrics. + * @param {boolean} [options.propagate=true] - If false, the forked metrics will not be propagated here. + * @param {boolean} [options.stopPropagation=false] - If true, propagation from the new metrics is stopped here, instead of + * continuing up the chain (if for example these metrics were themselves created through `.fork()`). + * @param {boolean} [options.includeGroups=false] - If true, the forked metrics will also replicate metrics that were propagated + * here from elsewhere. For example: + * ``` + * const metrics = newMetrics(); + * const op1 = metrics.fork(); + * const withoutGroups = metrics.fork(); + * const withGroups = metrics.fork({includeGroups: true}); + * op1.setMetric('foo', 'bar'); + * withoutGroups.getMetrics() // {} + * withGroups.getMetrics() // {foo: ['bar']} + * ``` + * @returns {Object} - The new metrics object. + */ + function fork() { + let { + propagate = true, + stopPropagation = false, + includeGroups = false + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return makeMetrics(mkNode([[self, { + propagate, + stopPropagation, + includeGroups + }]]), rename); + } + + /** + * Join `otherMetrics` with these; all metrics from `otherMetrics` will (by default) be propagated here, + * and all metrics from here will be included in `otherMetrics`. + * + * `propagate`, `stopPropagation` and `includeGroups` have the same semantics as in `.fork()`. + */ + function join(otherMetrics) { + let { + propagate = true, + stopPropagation = false, + includeGroups = false + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const other = nodes.get(otherMetrics); + if (other != null) { + other.addParent(self, { + propagate, + stopPropagation, + includeGroups + }); + } + } + + /** + * return a version of these metrics where all new metrics are renamed according to `renameFn`. + * + * @param {function(String): Array[String]} renameFn + */ + function renameWith(renameFn) { + return makeMetrics(self, renameFn); + } + + /** + * Create a new metrics object that uses the same propagation and renaming rules as this one. + */ + function newMetrics() { + return makeMetrics(self.newSibling(), rename); + } + const metrics = { + startTiming, + measureTime, + measureHookTime, + checkpoint, + timeSince, + timeBetween, + setMetric, + getMetrics, + fork, + join, + newMetrics, + renameWith, + toJSON() { + return getMetrics(); + } + }; + nodes.set(metrics, self); + return metrics; + } + return makeMetrics(mkNode([])); + }; +} +function wrapFn(fn, before, after) { + return function () { + before && before(); + try { + return fn.apply(this, arguments); + } finally { + after && after(); + } + }; +} +function makeTimer(now, cb) { + const start = now(); + let done = false; + function stopTiming() { + if (!done) { + cb(now() - start); + done = true; + } + } + stopTiming.stopBefore = fn => wrapFn(fn, stopTiming); + stopTiming.stopAfter = fn => wrapFn(fn, null, stopTiming); + return stopTiming; +} +function makeNode(parents) { + return { + metrics: {}, + timestamps: {}, + groups: {}, + addParent(node, edge) { + parents.push([node, edge]); + }, + newSibling() { + return makeNode(parents.slice()); + }, + dfWalk() { + let { + visit, + follow = () => true, + visited = new Set(), + inEdge + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let res; + if (!visited.has(this)) { + visited.add(this); + res = visit(inEdge, this); + if (res != null) return res; + for (const [parent, outEdge] of parents) { + if (follow(inEdge, outEdge)) { + res = parent.dfWalk({ + visit, + follow, + visited, + inEdge: outEdge + }); + if (res != null) return res; + } + } + } + } + }; +} +const nullMetrics = (() => { + const nop = function () {}; + const empty = () => ({}); + const none = { + forEach: nop + }; + const nullTimer = () => null; + nullTimer.stopBefore = fn => fn; + nullTimer.stopAfter = fn => fn; + const nullNode = Object.defineProperties({ + dfWalk: nop, + newSibling: () => nullNode, + addParent: nop + }, Object.fromEntries(['metrics', 'timestamps', 'groups'].map(prop => [prop, { + get: empty + }]))); + return metricsFactory({ + now: () => 0, + mkNode: () => nullNode, + mkRenamer: () => () => none, + mkTimer: () => nullTimer, + nodes: { + get: nop, + set: nop + } + })(); +})(); +let enabled = true; +_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig(CONFIG_TOGGLE, cfg => { + enabled = !!cfg[CONFIG_TOGGLE]; +}); + +/** + * convenience fallback function for metrics that may be undefined, especially during tests. + */ +function useMetrics(metrics) { + return enabled && metrics || nullMetrics; +} +const newMetrics = (() => { + const makeMetrics = metricsFactory(); + return function () { + return enabled ? makeMetrics() : nullMetrics; + }; +})(); +function hookTimer(prefix, getMetrics) { + return function (name, hookFn) { + return function (next) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + const that = this; + return useMetrics(getMetrics.apply(that, args)).measureHookTime(prefix + name, next, function (next) { + return hookFn.call(that, next, ...args); + }); + }; + }; +} +const timedAuctionHook = hookTimer('requestBids.', req => req.metrics); +const timedBidResponseHook = hookTimer('addBidResponse.', (_, bid) => bid.metrics); + +/***/ }), + +/***/ "./src/utils/prerendering.js": +/*!***********************************!*\ + !*** ./src/utils/prerendering.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ delayIfPrerendering: () => (/* binding */ delayIfPrerendering) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); + + +/** + * Returns a wrapper around fn that delays execution until the page if activated, if it was prerendered and isDelayEnabled returns true. + * https://developer.chrome.com/docs/web-platform/prerender-pages + */ +function delayIfPrerendering(isDelayEnabled, fn) { + return function () { + if (document.prerendering && isDelayEnabled()) { + const that = this; + const args = Array.from(arguments); + return new Promise(resolve => { + document.addEventListener('prerenderingchange', () => { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Auctions were suspended while page was prerendering`); + resolve(fn.apply(that, args)); + }, { + once: true + }); + }); + } else { + return Promise.resolve(fn.apply(this, arguments)); + } + }; +} + +/***/ }), + +/***/ "./src/utils/promise.js": +/*!******************************!*\ + !*** ./src/utils/promise.js ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PbPromise: () => (/* binding */ PbPromise), +/* harmony export */ defer: () => (/* binding */ defer), +/* harmony export */ delay: () => (/* binding */ delay) +/* harmony export */ }); +/* unused harmony export pbSetTimeout */ +/* harmony import */ var _libraries_greedy_greedyPromise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../libraries/greedy/greedyPromise.js */ "./libraries/greedy/greedyPromise.js"); +/* harmony import */ var _prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../prebidGlobal.js */ "./src/prebidGlobal.js"); + + +const pbSetTimeout = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().setTimeout ?? ( true ? _libraries_greedy_greedyPromise_js__WEBPACK_IMPORTED_MODULE_1__.greedySetTimeout : 0); +const PbPromise = (0,_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().Promise ?? ( true ? _libraries_greedy_greedyPromise_js__WEBPACK_IMPORTED_MODULE_1__.GreedyPromise : 0); +function delay() { + let delayMs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + return new PbPromise(resolve => { + pbSetTimeout(resolve, delayMs); + }); +} + +/** + * @returns a {promise, resolve, reject} trio where `promise` is resolved by calling `resolve` or `reject`. + */ +function defer() { + let { + promiseFactory = resolver => new PbPromise(resolver) + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + function invoker(delegate) { + return val => delegate(val); + } + let resolveFn, rejectFn; + return { + promise: promiseFactory((resolve, reject) => { + resolveFn = resolve; + rejectFn = reject; + }), + resolve: invoker(resolveFn), + reject: invoker(rejectFn) + }; +} + +/***/ }), + +/***/ "./src/utils/reducers.js": +/*!*******************************!*\ + !*** ./src/utils/reducers.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getHighestCpm: () => (/* binding */ getHighestCpm), +/* harmony export */ getOldestHighestCpmBid: () => (/* binding */ getOldestHighestCpmBid), +/* harmony export */ keyCompare: () => (/* binding */ keyCompare), +/* harmony export */ maximum: () => (/* binding */ maximum), +/* harmony export */ minimum: () => (/* binding */ minimum) +/* harmony export */ }); +/* unused harmony exports simpleCompare, reverseCompare, tiebreakCompare, getLatestHighestCpmBid */ +function simpleCompare(a, b) { + if (a === b) return 0; + return a < b ? -1 : 1; +} +function keyCompare() { + let key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : item => item; + return (a, b) => simpleCompare(key(a), key(b)); +} +function reverseCompare() { + let compare = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : simpleCompare; + return (a, b) => -compare(a, b) || 0; +} +function tiebreakCompare() { + for (var _len = arguments.length, compares = new Array(_len), _key = 0; _key < _len; _key++) { + compares[_key] = arguments[_key]; + } + return function (a, b) { + for (const cmp of compares) { + const val = cmp(a, b); + if (val !== 0) return val; + } + return 0; + }; +} +function minimum() { + let compare = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : simpleCompare; + return (min, item) => compare(item, min) < 0 ? item : min; +} +function maximum() { + let compare = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : simpleCompare; + return minimum(reverseCompare(compare)); +} +const cpmCompare = keyCompare(bid => bid.cpm); +const timestampCompare = keyCompare(bid => bid.responseTimestamp); + +// This function will get highest cpm value bid, in case of tie it will return the bid with lowest timeToRespond +const getHighestCpm = maximum(tiebreakCompare(cpmCompare, reverseCompare(keyCompare(bid => bid.timeToRespond)))); + +// This function will get the oldest hightest cpm value bid, in case of tie it will return the bid which came in first +// Use case for tie: https://github.com/prebid/Prebid.js/issues/2448 +const getOldestHighestCpmBid = maximum(tiebreakCompare(cpmCompare, reverseCompare(timestampCompare))); + +// This function will get the latest hightest cpm value bid, in case of tie it will return the bid which came in last +// Use case for tie: https://github.com/prebid/Prebid.js/issues/2539 +const getLatestHighestCpmBid = maximum(tiebreakCompare(cpmCompare, timestampCompare)); + +/***/ }), + +/***/ "./src/utils/ttlCollection.js": +/*!************************************!*\ + !*** ./src/utils/ttlCollection.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ttlCollection: () => (/* binding */ ttlCollection) +/* harmony export */ }); +/* harmony import */ var _promise_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js"); +/* harmony import */ var _focusTimeout_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./focusTimeout.js */ "./src/utils/focusTimeout.js"); + + + + +/** + * Create a set-like collection that automatically forgets items after a certain time. + * + * @param {Object} [options={}] - Optional settings + * @param {function(*): (number|Promise)} [options.startTime=timestamp] - A function taking an item added to this collection, + * and returning (a promise to) a timestamp to be used as the starting time for the item + * (the item will be dropped after `ttl(item)` milliseconds have elapsed since this timestamp). + * Defaults to the time the item was added to the collection. + * @param {function(*): (number|void|Promise)} [options.ttl=() => null] - A function taking an item added to this collection, + * and returning (a promise to) the duration (in milliseconds) the item should be kept in it. + * May return null to indicate that the item should be persisted indefinitely. + * @param {boolean} [options.monotonic=false] - Set to true for better performance, but only if, given any two items A and B in this collection: + * if A was added before B, then: + * - startTime(A) + ttl(A) <= startTime(B) + ttl(B) + * - Promise.all([startTime(A), ttl(A)]) never resolves later than Promise.all([startTime(B), ttl(B)]) + * @param {number} [options.slack=5000] - Maximum duration (in milliseconds) that an item is allowed to persist + * once past its TTL. This is also roughly the interval between "garbage collection" sweeps. + * @returns {Object} A set-like collection with automatic TTL expiration. + * @returns {function(*): void} return.add - Add an item to the collection. + * @returns {function(): void} return.clear - Clear the collection. + * @returns {function(): Array<*>} return.toArray - Get all the items in the collection, in insertion order. + * @returns {function(): void} return.refresh - Refresh the TTL for each item in the collection. + * @returns {(function(function(*): void): function(): void)} return.onExpiry - Register a callback to be run when an item has expired and is about to be + * removed from the collection. Returns an un-registration function + */ +function ttlCollection() { + let { + startTime = _utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp, + ttl = () => null, + monotonic = false, + slack = 5000 + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const items = new Map(); + const callbacks = []; + const pendingPurge = []; + const markForPurge = monotonic ? entry => pendingPurge.push(entry) : entry => pendingPurge.splice((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.binarySearch)(pendingPurge, entry, el => el.expiry), 0, entry); + let nextPurge, task; + function reschedulePurge() { + task && clearTimeout(task); + if (pendingPurge.length > 0) { + const now = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp)(); + nextPurge = Math.max(now, pendingPurge[0].expiry + slack); + task = (0,_focusTimeout_js__WEBPACK_IMPORTED_MODULE_1__.setFocusTimeout)(() => { + const now = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp)(); + let cnt = 0; + for (const entry of pendingPurge) { + if (entry.expiry > now) break; + callbacks.forEach(cb => { + try { + cb(entry.item); + } catch (e) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e); + } + }); + items.delete(entry.item); + cnt++; + } + pendingPurge.splice(0, cnt); + task = null; + reschedulePurge(); + }, nextPurge - now); + } else { + task = null; + } + } + function mkEntry(item) { + const values = {}; + const thisCohort = currentCohort; + let expiry; + function update() { + if (thisCohort === currentCohort && values.start != null && values.delta != null) { + expiry = values.start + values.delta; + markForPurge(entry); + if (task == null || nextPurge > expiry + slack) { + reschedulePurge(); + } + } + } + const [init, refresh] = Object.entries({ + start: startTime, + delta: ttl + }).map(_ref => { + let [field, getter] = _ref; + let currentCall; + return function () { + const thisCall = currentCall = {}; + _promise_js__WEBPACK_IMPORTED_MODULE_2__.PbPromise.resolve(getter(item)).then(val => { + if (thisCall === currentCall) { + values[field] = val; + update(); + } + }); + }; + }); + const entry = { + item, + refresh, + get expiry() { + return expiry; + } + }; + init(); + refresh(); + return entry; + } + let currentCohort = {}; + return { + [Symbol.iterator]: () => items.keys(), + /** + * Add an item to this collection. + * @param item + */ + add(item) { + !items.has(item) && items.set(item, mkEntry(item)); + }, + /** + * Clear this collection. + */ + clear() { + pendingPurge.length = 0; + reschedulePurge(); + items.clear(); + currentCohort = {}; + }, + /** + * @returns {[]} all the items in this collection, in insertion order. + */ + toArray() { + return Array.from(items.keys()); + }, + /** + * Refresh the TTL for each item in this collection. + */ + refresh() { + pendingPurge.length = 0; + reschedulePurge(); + for (const entry of items.values()) { + entry.refresh(); + } + }, + /** + * Register a callback to be run when an item has expired and is about to be + * removed the from the collection. + * @param cb a callback that takes the expired item as argument + * @return an unregistration function. + */ + onExpiry(cb) { + callbacks.push(cb); + return () => { + const idx = callbacks.indexOf(cb); + if (idx >= 0) { + callbacks.splice(idx, 1); + } + }; + } + }; +} + +/***/ }), + +/***/ "./src/video.js": +/*!**********************!*\ + !*** ./src/video.js ***! + \**********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ INSTREAM: () => (/* binding */ INSTREAM), +/* harmony export */ ORTB_VIDEO_PARAMS: () => (/* binding */ ORTB_VIDEO_PARAMS), +/* harmony export */ OUTSTREAM: () => (/* binding */ OUTSTREAM), +/* harmony export */ checkVideoBidSetup: () => (/* binding */ checkVideoBidSetup), +/* harmony export */ fillVideoDefaults: () => (/* binding */ fillVideoDefaults), +/* harmony export */ isValidVideoBid: () => (/* binding */ isValidVideoBid), +/* harmony export */ validateOrtbVideoFields: () => (/* binding */ validateOrtbVideoFields) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hook.js */ "./src/hook.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); + + + + +const OUTSTREAM = 'outstream'; +const INSTREAM = 'instream'; + +/** + * List of OpenRTB 2.x video object properties with simple validators. + * Not included: `companionad`, `durfloors`, `ext` + * reference: https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md + */ +const ORTB_VIDEO_PARAMS = new Map([['mimes', value => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string')], ['minduration', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['maxduration', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['startdelay', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['maxseq', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['poddur', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['protocols', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['w', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['h', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['podid', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr], ['podseq', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['rqddurs', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['placement', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], +// deprecated, see plcmt +['plcmt', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['linearity', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['skip', value => [1, 0].includes(value)], ['skipmin', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['skipafter', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['sequence', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], +// deprecated +['slotinpod', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['mincpmpersec', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber], ['battr', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['maxextended', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['minbitrate', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['maxbitrate', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['boxingallowed', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['playbackmethod', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['playbackend', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['delivery', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['pos', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger], ['api', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['companiontype', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums], ['poddedupe', _utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums]]); +function fillVideoDefaults(adUnit) { + const video = adUnit?.mediaTypes?.video; + if (video != null && video.plcmt == null) { + if (video.context === OUTSTREAM || [2, 3, 4].includes(video.placement)) { + video.plcmt = 4; + } else if (video.context !== OUTSTREAM && [2, 6].includes(video.playbackmethod)) { + video.plcmt = 2; + } + } +} + +/** + * validateOrtbVideoFields mutates the `adUnit.mediaTypes.video` object by removing invalid ortb properties (default). + * The onInvalidParam callback can be used to handle invalid properties differently. + * Other properties are ignored and kept as is. + * + * @param {Object} adUnit - The adUnit object. + * @param {Function} onInvalidParam - The callback function to be called with key, value, and adUnit. + * @returns {void} + */ +function validateOrtbVideoFields(adUnit, onInvalidParam) { + const videoParams = adUnit?.mediaTypes?.video; + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(videoParams)) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`validateOrtbVideoFields: videoParams must be an object.`); + return; + } + if (videoParams != null) { + Object.entries(videoParams).forEach(_ref => { + let [key, value] = _ref; + if (!ORTB_VIDEO_PARAMS.has(key)) { + return; + } + const isValid = ORTB_VIDEO_PARAMS.get(key)(value); + if (!isValid) { + if (typeof onInvalidParam === 'function') { + onInvalidParam(key, value, adUnit); + } else { + delete videoParams[key]; + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Invalid prop in adUnit "${adUnit.code}": Invalid value for mediaTypes.video.${key} ORTB property. The property has been removed.`); + } + } + }); + } +} + +/** + * @typedef {object} VideoBid + * @property {string} adId id of the bid + */ + +/** + * Validate that the assets required for video context are present on the bid + * @param {VideoBid} bid Video bid to validate + * @param {Object} [options] - Options object + * @param {Object} [options.index=auctionManager.index] - Index object, defaulting to `auctionManager.index` + * @return {Boolean} If object is valid + */ +function isValidVideoBid(bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const videoMediaType = index.getMediaTypes(bid)?.video; + const context = videoMediaType && videoMediaType?.context; + const useCacheKey = videoMediaType && videoMediaType?.useCacheKey; + const adUnit = index.getAdUnit(bid); + + // if context not defined assume default 'instream' for video bids + // instream bids require a vast url or vast xml content + return checkVideoBidSetup(bid, adUnit, videoMediaType, context, useCacheKey); +} +const checkVideoBidSetup = (0,_hook_js__WEBPACK_IMPORTED_MODULE_2__.hook)('sync', function (bid, adUnit, videoMediaType, context, useCacheKey) { + if (videoMediaType && (useCacheKey || context !== OUTSTREAM)) { + // xml-only video bids require a prebid cache url + const { + url, + useLocal + } = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('cache') || {}; + if (!url && !useLocal && bid.vastXml && !bid.vastUrl) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(` + This bid contains only vastXml and will not work when a prebid cache url is not specified. + Try enabling either prebid cache with pbjs.setConfig({ cache: {url: "..."} }); + or local cache with pbjs.setConfig({ cache: { useLocal: true }}); + `); + return false; + } + return !!(bid.vastUrl || bid.vastXml); + } + + // outstream bids require a renderer on the bid or pub-defined on adunit + if (context === OUTSTREAM && !useCacheKey) { + return !!(bid.renderer || adUnit && adUnit.renderer || videoMediaType.renderer); + } + return true; +}, 'checkVideoBidSetup'); + +/***/ }), + +/***/ "./src/videoCache.js": +/*!***************************!*\ + !*** ./src/videoCache.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ batchAndStore: () => (/* binding */ batchAndStore), +/* harmony export */ store: () => (/* binding */ store), +/* harmony export */ storeLocally: () => (/* binding */ storeLocally), +/* harmony export */ vastLocalCache: () => (/* binding */ vastLocalCache) +/* harmony export */ }); +/* unused harmony exports getCacheUrl, _internal, storeBatch, batchingCache */ +/* harmony import */ var _ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ajax.js */ "./src/ajax.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config.js */ "./src/config.js"); +/* harmony import */ var _auctionManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js"); +/* harmony import */ var _auction_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./auction.js */ "./src/auction.js"); +/** + * This module interacts with the server used to cache video ad content to be restored later. + * At a high level, the expected workflow goes like this: + * + * - Request video ads from Bidders + * - Generate IDs for each valid bid, and cache the key/value pair on the server. + * - Return these IDs so that publishers can use them to fetch the bids later. + * + * This trickery helps integrate with ad servers, which set character limits on request params. + */ + + + + + + + +/** + * Might be useful to be configurable in the future + * Depending on publisher needs + */ +const ttlBufferInSeconds = 15; +const vastLocalCache = new Map(); + +/** + * @typedef {object} CacheableUrlBid + * @property {string} vastUrl A URL which loads some valid VAST XML. + */ + +/** + * @typedef {object} CacheablePayloadBid + * @property {string} vastXml Some VAST XML which loads an ad in a video player. + */ + +/** + * A CacheableBid describes the types which the videoCache can store. + * + * @typedef {CacheableUrlBid|CacheablePayloadBid} CacheableBid + */ + +/** + * Function which wraps a URI that serves VAST XML, so that it can be loaded. + * + * @param {string} uri The URI where the VAST content can be found. + * @param {(string|string[])} impTrackerURLs An impression tracker URL for the delivery of the video ad + * @return A VAST URL which loads XML from the given URI. + */ +function wrapURI(uri, impTrackerURLs) { + impTrackerURLs = impTrackerURLs && (Array.isArray(impTrackerURLs) ? impTrackerURLs : [impTrackerURLs]); + // Technically, this is vulnerable to cross-script injection by sketchy vastUrl bids. + // We could make sure it's a valid URI... but since we're loading VAST XML from the + // URL they provide anyway, that's probably not a big deal. + let impressions = impTrackerURLs ? impTrackerURLs.map(trk => ``).join('') : ''; + return ` + + + prebid.org wrapper + + ${impressions} + + + + `; +} + +/** + * Wraps a bid in the format expected by the prebid-server endpoints, or returns null if + * the bid can't be converted cleanly. + * + * @param {CacheableBid} bid + * @param {Object} [options] - Options object. + * @param {Object} [options.index=auctionManager.index] - Index object, defaulting to `auctionManager.index`. + * @return {Object|null} - The payload to be sent to the prebid-server endpoints, or null if the bid can't be converted cleanly. + */ +function toStorageRequest(bid) { + let { + index = _auctionManager_js__WEBPACK_IMPORTED_MODULE_0__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const vastValue = getVastXml(bid); + const auction = index.getAuction(bid); + const ttlWithBuffer = Number(bid.ttl) + ttlBufferInSeconds; + let payload = { + type: 'xml', + value: vastValue, + ttlseconds: ttlWithBuffer + }; + if (_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('cache.vasttrack')) { + payload.bidder = bid.bidder; + payload.bidid = bid.requestId; + payload.aid = bid.auctionId; + } + if (auction != null) { + payload.timestamp = auction.getAuctionStart(); + } + if (typeof bid.customCacheKey === 'string' && bid.customCacheKey !== '') { + payload.key = bid.customCacheKey; + } + return payload; +} + +/** + * A function which should be called with the results of the storage operation. + * + * @callback videoCacheStoreCallback + * + * @param {Error} [error] The error, if one occurred. + * @param {?string[]} uuids An array of unique IDs. The array will have one element for each bid we were asked + * to store. It may include null elements if some of the bids were malformed, or an error occurred. + * Each non-null element in this array is a valid input into the retrieve function, which will fetch + * some VAST XML which can be used to render this bid's ad. + */ + +/** + * A function which bridges the APIs between the videoCacheStoreCallback and our ajax function's API. + * + * @param {videoCacheStoreCallback} done A callback to the "store" function. + * @return {Function} A callback which interprets the cache server's responses, and makes up the right + * arguments for our callback. + */ +function shimStorageCallback(done) { + return { + success: function (responseBody) { + let ids; + try { + ids = JSON.parse(responseBody).responses; + } catch (e) { + done(e, []); + return; + } + if (ids) { + done(null, ids); + } else { + done(new Error("The cache server didn't respond with a responses property."), []); + } + }, + error: function (statusText, responseBody) { + done(new Error(`Error storing video ad in the cache: ${statusText}: ${JSON.stringify(responseBody)}`), []); + } + }; +} +function getVastXml(bid) { + return bid.vastXml ? bid.vastXml : wrapURI(bid.vastUrl, bid.vastImpUrl); +} +; + +/** + * If the given bid is for a Video ad, generate a unique ID and cache it somewhere server-side. + * + * @param {CacheableBid[]} bids A list of bid objects which should be cached. + * @param {videoCacheStoreCallback} [done] An optional callback which should be executed after + * the data has been stored in the cache. + */ +function store(bids, done) { + let getAjax = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajaxBuilder; + const requestData = { + puts: bids.map(toStorageRequest) + }; + const ajax = getAjax(_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('cache.timeout')); + ajax(_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('cache.url'), shimStorageCallback(done), JSON.stringify(requestData), { + contentType: 'text/plain', + withCredentials: true + }); +} +function getCacheUrl(id) { + return `${_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('cache.url')}?uuid=${id}`; +} +const storeLocally = bid => { + const vastXml = getVastXml(bid); + const bidVastUrl = URL.createObjectURL(new Blob([vastXml], { + type: 'text/xml' + })); + assignVastUrlAndCacheId(bid, bidVastUrl); + vastLocalCache.set(bid.videoCacheKey, bidVastUrl); +}; +const assignVastUrlAndCacheId = (bid, vastUrl, videoCacheKey) => { + bid.videoCacheKey = videoCacheKey || (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(); + if (!bid.vastUrl) { + bid.vastUrl = vastUrl; + } +}; +const _internal = { + store +}; +function storeBatch(batch) { + const bids = batch.map(entry => entry.bidResponse); + function err(msg) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Failed to save to the video cache: ${msg}. Video bids will be discarded:`, bids); + } + _internal.store(bids, function (error, cacheIds) { + if (error) { + err(error); + } else if (batch.length !== cacheIds.length) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`expected ${batch.length} cache IDs, got ${cacheIds.length} instead`); + } else { + cacheIds.forEach((cacheId, i) => { + const { + auctionInstance, + bidResponse, + afterBidAdded + } = batch[i]; + if (cacheId.uuid === '') { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`); + } else { + assignVastUrlAndCacheId(bidResponse, getCacheUrl(cacheId.uuid), cacheId.uuid); + (0,_auction_js__WEBPACK_IMPORTED_MODULE_4__.addBidToAuction)(auctionInstance, bidResponse); + afterBidAdded(); + } + }); + } + }); +} +; +let batchSize, batchTimeout, cleanupHandler; +if (true) { + _config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('cache', _ref => { + let { + cache + } = _ref; + batchSize = typeof cache.batchSize === 'number' && cache.batchSize > 0 ? cache.batchSize : 1; + batchTimeout = typeof cache.batchTimeout === 'number' && cache.batchTimeout > 0 ? cache.batchTimeout : 0; + + // removing blobs that are not going to be used + if (cache.useLocal && !cleanupHandler) { + cleanupHandler = _auctionManager_js__WEBPACK_IMPORTED_MODULE_0__.auctionManager.onExpiry(auction => { + auction.getBidsReceived().forEach(bid => { + const vastUrl = vastLocalCache.get(bid.videoCacheKey); + if (vastUrl && vastUrl.startsWith('blob')) { + URL.revokeObjectURL(vastUrl); + } + vastLocalCache.delete(bid.videoCacheKey); + }); + }); + } + }); +} +const batchingCache = function () { + let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : setTimeout; + let cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : storeBatch; + let batches = [[]]; + let debouncing = false; + const noTimeout = cb => cb(); + return function (auctionInstance, bidResponse, afterBidAdded) { + const batchFunc = batchTimeout > 0 ? timeout : noTimeout; + if (batches[batches.length - 1].length >= batchSize) { + batches.push([]); + } + batches[batches.length - 1].push({ + auctionInstance, + bidResponse, + afterBidAdded + }); + if (!debouncing) { + debouncing = true; + batchFunc(() => { + batches.forEach(cache); + batches = [[]]; + debouncing = false; + }, batchTimeout); + } + }; +}; +const batchAndStore = batchingCache(); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["viewport"],{ + +/***/ "./libraries/viewport/viewport.js": +/*!****************************************!*\ + !*** ./libraries/viewport/viewport.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getViewportCoordinates: () => (/* binding */ getViewportCoordinates), +/* harmony export */ getViewportSize: () => (/* binding */ getViewportSize) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + +function getViewportCoordinates() { + try { + const win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)(); + let { + scrollY: top, + scrollX: left + } = win; + const { + height: innerHeight, + width: innerWidth + } = getViewportSize(); + return { + top, + right: left + innerWidth, + bottom: top + innerHeight, + left + }; + } catch (e) { + return {}; + } +} +function getViewportSize() { + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)(); + try { + const innerHeight = windowDimensions.innerHeight || windowDimensions.document.documentElement.clientHeight || windowDimensions.document.body.clientHeight || 0; + const innerWidth = windowDimensions.innerWidth || windowDimensions.document.documentElement.clientWidth || windowDimensions.document.body.clientWidth || 0; + return { + width: innerWidth, + height: innerHeight + }; + } catch (e) { + return {}; + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["greedy"],{ + +/***/ "./libraries/greedy/greedyPromise.js": +/*!*******************************************!*\ + !*** ./libraries/greedy/greedyPromise.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ GreedyPromise: () => (/* binding */ GreedyPromise), +/* harmony export */ greedySetTimeout: () => (/* binding */ greedySetTimeout) +/* harmony export */ }); +const SUCCESS = 0; +const FAIL = 1; + +/** + * A version of Promise that runs callbacks synchronously when it can (i.e. after it's been fulfilled or rejected). + */ +class GreedyPromise { + #result; + #callbacks; + constructor(resolver) { + if (typeof resolver !== 'function') { + throw new Error('resolver not a function'); + } + const result = []; + const callbacks = []; + let [resolve, reject] = [SUCCESS, FAIL].map(type => { + return function (value) { + if (type === SUCCESS && typeof value?.then === 'function') { + value.then(resolve, reject); + } else if (!result.length) { + result.push(type, value); + while (callbacks.length) callbacks.shift()(); + } + }; + }); + try { + resolver(resolve, reject); + } catch (e) { + reject(e); + } + this.#result = result; + this.#callbacks = callbacks; + } + then(onSuccess, onError) { + const result = this.#result; + return new this.constructor((resolve, reject) => { + const continuation = () => { + let value = result[1]; + let [handler, resolveFn] = result[0] === SUCCESS ? [onSuccess, resolve] : [onError, reject]; + if (typeof handler === 'function') { + try { + value = handler(value); + } catch (e) { + reject(e); + return; + } + resolveFn = resolve; + } + resolveFn(value); + }; + result.length ? continuation() : this.#callbacks.push(continuation); + }); + } + catch(onError) { + return this.then(null, onError); + } + finally(onFinally) { + let val; + return this.then(v => { + val = v; + return onFinally(); + }, e => { + val = this.constructor.reject(e); + return onFinally(); + }).then(() => val); + } + static #collect(promises, collector, done) { + let cnt = promises.length; + function clt() { + collector.apply(this, arguments); + if (--cnt <= 0 && done) done(); + } + promises.length === 0 && done ? done() : promises.forEach((p, i) => this.resolve(p).then(val => clt(true, val, i), err => clt(false, err, i))); + } + static race(promises) { + return new this((resolve, reject) => { + this.#collect(promises, (success, result) => success ? resolve(result) : reject(result)); + }); + } + static all(promises) { + return new this((resolve, reject) => { + let res = []; + this.#collect(promises, (success, val, i) => success ? res[i] = val : reject(val), () => resolve(res)); + }); + } + static allSettled(promises) { + return new this(resolve => { + let res = []; + this.#collect(promises, (success, val, i) => res[i] = success ? { + status: 'fulfilled', + value: val + } : { + status: 'rejected', + reason: val + }, () => resolve(res)); + }); + } + static resolve(value) { + return new this(resolve => resolve(value)); + } + static reject(error) { + return new this((resolve, reject) => reject(error)); + } +} +function greedySetTimeout(fn) { + let delayMs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + if (delayMs > 0) { + return setTimeout(fn, delayMs); + } else { + fn(); + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["creative-renderer-display"],{ + +/***/ "./libraries/creative-renderer-display/renderer.js": +/*!*********************************************************!*\ + !*** ./libraries/creative-renderer-display/renderer.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ RENDERER: () => (/* binding */ RENDERER) +/* harmony export */ }); +// this file is autogenerated, see creative/README.md +const RENDERER = "(()=>{\"use strict\";window.render=function({ad:e,adUrl:t,width:n,height:i,instl:d},{mkFrame:r},s){if(!e&&!t)throw{reason:\"noAd\",message:\"Missing ad markup or URL\"};{if(null==i){const e=s.document?.body;[e,e?.parentElement].filter((e=>null!=e?.style)).forEach((e=>e.style.height=\"100%\"))}const h=s.document,o={width:n??\"100%\",height:i??\"100%\"};if(t&&!e?o.src=t:o.srcdoc=e,h.body.appendChild(r(h,o)),d&&s.frameElement){const e=s.frameElement.style;e.width=n?`${n}px`:\"100vw\",e.height=i?`${i}px`:\"100vh\"}}}})();"; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["analyticsAdapter"],{ + +/***/ "./libraries/analyticsAdapter/AnalyticsAdapter.js": +/*!********************************************************!*\ + !*** ./libraries/analyticsAdapter/AnalyticsAdapter.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AnalyticsAdapter), +/* harmony export */ setLabels: () => (/* binding */ setLabels) +/* harmony export */ }); +/* unused harmony exports _internal, DEFAULT_INCLUDE_EVENTS, setDebounceDelay */ +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); + + + + + +const _internal = { + ajax: _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax +}; +const ENDPOINT = 'endpoint'; +const BUNDLE = 'bundle'; +const LABELS_KEY = 'analyticsLabels'; +const labels = { + internal: {}, + publisher: {} +}; +let allLabels = {}; +_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(LABELS_KEY, cfg => { + labels.publisher = cfg[LABELS_KEY]; + allLabels = combineLabels(); + ; +}); +function setLabels(internalLabels) { + labels.internal = internalLabels; + allLabels = combineLabels(); +} +; +const combineLabels = () => Object.values(labels).reduce((acc, curr) => ({ + ...acc, + ...curr +}), {}); +const DEFAULT_INCLUDE_EVENTS = Object.values(_src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS).filter(ev => ev !== _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AUCTION_DEBUG); +let debounceDelay = 100; +function setDebounceDelay(delay) { + debounceDelay = delay; +} +function AnalyticsAdapter(_ref) { + let { + url, + analyticsType, + global, + handler + } = _ref; + const queue = []; + let handlers; + let enabled = false; + let sampled = true; + let provider; + const emptyQueue = (() => { + let running = false; + let timer; + const clearQueue = () => { + if (!running) { + running = true; // needed to avoid recursive re-processing when analytics event handlers trigger other events + try { + let i = 0; + let notDecreasing = 0; + while (queue.length > 0) { + i++; + const len = queue.length; + queue.shift()(); + if (queue.length >= len) { + notDecreasing++; + } else { + notDecreasing = 0; + } + if (notDecreasing >= 10) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Detected probable infinite loop, discarding events', queue); + queue.length = 0; + return; + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`${provider} analytics: processed ${i} events`); + } finally { + running = false; + } + } + }; + return function () { + if (timer != null) { + clearTimeout(timer); + timer = null; + } + debounceDelay === 0 ? clearQueue() : timer = setTimeout(clearQueue, debounceDelay); + }; + })(); + return Object.defineProperties({ + track: _track, + enqueue: _enqueue, + enableAnalytics: _enable, + disableAnalytics: _disable, + getAdapterType: () => analyticsType, + getGlobal: () => global, + getHandler: () => handler, + getUrl: () => url + }, { + enabled: { + get: () => enabled + } + }); + function _track(_ref2) { + let { + eventType, + args + } = _ref2; + if (this.getAdapterType() === BUNDLE) { + window[global](handler, eventType, args); + } + if (this.getAdapterType() === ENDPOINT) { + _callEndpoint(...arguments); + } + } + function _callEndpoint(_ref3) { + let { + eventType, + args, + callback + } = _ref3; + _internal.ajax(url, callback, JSON.stringify({ + eventType, + args, + labels: allLabels + })); + } + function _enqueue(_ref4) { + let { + eventType, + args + } = _ref4; + queue.push(() => { + if (Object.keys(allLabels || []).length > 0) { + args = { + [LABELS_KEY]: allLabels, + ...args + }; + } + this.track({ + eventType, + labels: allLabels, + args + }); + }); + emptyQueue(); + } + function _enable(config) { + provider = config?.provider; + var _this = this; + if (typeof config === 'object' && typeof config.options === 'object') { + sampled = typeof config.options.sampling === 'undefined' || Math.random() < parseFloat(config.options.sampling); + } else { + sampled = true; + } + if (sampled) { + const trackedEvents = (() => { + const { + includeEvents = DEFAULT_INCLUDE_EVENTS, + excludeEvents = [] + } = config || {}; + return new Set(Object.values(_src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS).filter(ev => includeEvents.includes(ev)).filter(ev => !excludeEvents.includes(ev))); + })(); + + // first send all events fired before enableAnalytics called + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.getEvents().forEach(event => { + if (!event || !trackedEvents.has(event.eventType)) { + return; + } + const { + eventType, + args + } = event; + _enqueue.call(_this, { + eventType, + args + }); + }); + + // Next register event listeners to send data immediately + handlers = Object.fromEntries(Array.from(trackedEvents).map(ev => { + const handler = args => this.enqueue({ + eventType: ev, + args + }); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.on(ev, handler); + return [ev, handler]; + })); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`Analytics adapter for "${global}" disabled by sampling`); + } + + // finally set this function to return log message, prevents multiple adapter listeners + this._oldEnable = this.enableAnalytics; + this.enableAnalytics = function _enable() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`Analytics adapter for "${global}" already enabled, unnecessary call to \`enableAnalytics\`.`); + }; + enabled = true; + } + function _disable() { + Object.entries(handlers || {}).forEach(_ref5 => { + let [event, handler] = _ref5; + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.off(event, handler); + }); + this.enableAnalytics = this._oldEnable ? this._oldEnable : _enable; + enabled = false; + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gptUtils"],{ + +/***/ "./libraries/gptUtils/gptUtils.js": +/*!****************************************!*\ + !*** ./libraries/gptUtils/gptUtils.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getGptSlotForAdUnitCode: () => (/* binding */ getGptSlotForAdUnitCode), +/* harmony export */ getGptSlotInfoForAdUnitCode: () => (/* binding */ getGptSlotInfoForAdUnitCode), +/* harmony export */ getSegments: () => (/* binding */ getSegments), +/* harmony export */ getSignals: () => (/* binding */ getSignals), +/* harmony export */ isSlotMatchingAdUnitCode: () => (/* binding */ isSlotMatchingAdUnitCode), +/* harmony export */ setKeyValue: () => (/* binding */ setKeyValue), +/* harmony export */ subscribeToGamSlotRenderEndedEvent: () => (/* binding */ subscribeToGamSlotRenderEndedEvent), +/* harmony export */ taxonomies: () => (/* binding */ taxonomies) +/* harmony export */ }); +/* unused harmony export subscribeToGamEvent */ +/* harmony import */ var _src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/fpd/oneClient.js */ "./src/fpd/oneClient.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); + + + + +/** + * Returns filter function to match adUnitCode in slot + * @param {string} adUnitCode AdUnit code + * @return {function} filter function + */ +function isSlotMatchingAdUnitCode(adUnitCode) { + return slot => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.compareCodeAndSlot)(slot, adUnitCode); +} + +/** + * @summary Export a k-v pair to GAM + */ +function setKeyValue(key, value) { + if (!key || typeof key !== 'string') return false; + window.googletag = window.googletag || { + cmd: [] + }; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(() => { + window.googletag.pubads().setTargeting(key, value); + }); +} + +/** + * @summary Uses the adUnit's code in order to find a matching gpt slot object on the page + */ +function getGptSlotForAdUnitCode(adUnitCode) { + let matchingSlot; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isGptPubadsDefined)()) { + // find the first matching gpt slot on the page + matchingSlot = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(window.googletag.pubads().getSlots(), isSlotMatchingAdUnitCode(adUnitCode)); + } + return matchingSlot; +} + +/** + * @summary Uses the adUnit's code in order to find a matching gptSlot on the page + */ +function getGptSlotInfoForAdUnitCode(adUnitCode) { + const matchingSlot = getGptSlotForAdUnitCode(adUnitCode); + if (matchingSlot) { + return { + gptSlot: matchingSlot.getAdUnitPath(), + divId: matchingSlot.getSlotElementId() + }; + } + return {}; +} +const taxonomies = ['IAB_AUDIENCE_1_1', 'IAB_CONTENT_2_2']; +function getSignals(fpd) { + const signals = Object.entries({ + [taxonomies[0]]: getSegments(fpd, ['user.data'], 4), + [taxonomies[1]]: getSegments(fpd, _src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_2__.CLIENT_SECTIONS.map(section => `${section}.content.data`), 6) + }).map(_ref => { + let [taxonomy, values] = _ref; + return values.length ? { + taxonomy, + values + } : null; + }).filter(ob => ob); + return signals; +} +function getSegments(fpd, sections, segtax) { + return sections.flatMap(section => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(fpd, section) || []).filter(datum => datum.ext?.segtax === segtax).flatMap(datum => datum.segment?.map(seg => seg.id)).filter(ob => ob).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.uniques); +} + +/** + * Add an event listener on the given GAM event. + * If GPT Pubads isn't defined, window.googletag is set to a new object. + * @param {String} event + * @param {Function} callback + */ +function subscribeToGamEvent(event, callback) { + const register = () => window.googletag.pubads().addEventListener(event, callback); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isGptPubadsDefined)()) { + register(); + return; + } + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(register); +} + +/** + * @typedef {Object} Slot + * @property {function(String): (String|null)} get + * @property {function(): String} getAdUnitPath + * @property {function(): String[]} getAttributeKeys + * @property {function(): String[]} getCategoryExclusions + * @property {function(String): String} getSlotElementId + * @property {function(): String[]} getTargeting + * @property {function(): String[]} getTargetingKeys + * @see {@link https://developers.google.com/publisher-tag/reference#googletag.Slot GPT official docs} + */ + +/** + * @typedef {Object} SlotRenderEndedEvent + * @property {(String|null)} advertiserId + * @property {(String|null)} campaignId + * @property {(String[]|null)} companyIds + * @property {(Number|null)} creativeId + * @property {(Number|null)} creativeTemplateId + * @property {(Boolean)} isBackfill + * @property {(Boolean)} isEmpty + * @property {(Number[]|null)} labelIds + * @property {(Number|null)} lineItemId + * @property {(String)} serviceName + * @property {(string|Number[]|null)} size + * @property {(Slot)} slot + * @property {(Boolean)} slotContentChanged + * @property {(Number|null)} sourceAgnosticCreativeId + * @property {(Number|null)} sourceAgnosticLineItemId + * @property {(Number[]|null)} yieldGroupIds + * @see {@link https://developers.google.com/publisher-tag/reference#googletag.events.SlotRenderEndedEvent GPT official docs} + */ + +/** + * @callback SlotRenderEndedEventCallback + * @param {SlotRenderEndedEvent} event + * @returns {void} + */ + +/** + * Add an event listener on the GAM event 'slotRenderEnded'. + * @param {SlotRenderEndedEventCallback} callback + */ +function subscribeToGamSlotRenderEndedEvent(callback) { + subscribeToGamEvent('slotRenderEnded', callback); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["boundingClientRect"],{ + +/***/ "./libraries/boundingClientRect/boundingClientRect.js": +/*!************************************************************!*\ + !*** ./libraries/boundingClientRect/boundingClientRect.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBoundingClientRect: () => (/* binding */ getBoundingClientRect) +/* harmony export */ }); +/* unused harmony export clearCache */ +/* harmony import */ var _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/prebid.js */ "./src/prebid.js"); + +const cache = new Map(); +_src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.before((next, auctionConfig) => { + clearCache(); + next(auctionConfig); +}); +function clearCache() { + cache.clear(); +} +function getBoundingClientRect(element) { + let clientRect; + if (cache.has(element)) { + clientRect = cache.get(element); + } else { + // eslint-disable-next-line no-restricted-properties + clientRect = element.getBoundingClientRect(); + cache.set(element, clientRect); + } + return clientRect; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["percentInView"],{ + +/***/ "./libraries/percentInView/percentInView.js": +/*!**************************************************!*\ + !*** ./libraries/percentInView/percentInView.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ percentInView: () => (/* binding */ percentInView) +/* harmony export */ }); +/* unused harmony export getBoundingBox */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + + +function getBoundingBox(element) { + let { + w, + h + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let { + width, + height, + left, + top, + right, + bottom, + x, + y + } = (0,_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__.getBoundingClientRect)(element); + if ((width === 0 || height === 0) && w && h) { + width = w; + height = h; + right = left + w; + bottom = top + h; + } + return { + width, + height, + left, + top, + right, + bottom, + x, + y + }; +} +function getIntersectionOfRects(rects) { + const bbox = { + left: rects[0].left, + right: rects[0].right, + top: rects[0].top, + bottom: rects[0].bottom + }; + for (let i = 1; i < rects.length; ++i) { + bbox.left = Math.max(bbox.left, rects[i].left); + bbox.right = Math.min(bbox.right, rects[i].right); + if (bbox.left >= bbox.right) { + return null; + } + bbox.top = Math.max(bbox.top, rects[i].top); + bbox.bottom = Math.min(bbox.bottom, rects[i].bottom); + if (bbox.top >= bbox.bottom) { + return null; + } + } + bbox.width = bbox.right - bbox.left; + bbox.height = bbox.bottom - bbox.top; + return bbox; +} +const percentInView = function (element) { + let { + w, + h + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const elementBoundingBox = getBoundingBox(element, { + w, + h + }); + const { + innerHeight, + innerWidth + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)(); + + // Obtain the intersection of the element and the viewport + const elementInViewBoundingBox = getIntersectionOfRects([{ + left: 0, + top: 0, + right: innerWidth, + bottom: innerHeight + }, elementBoundingBox]); + let elementInViewArea, elementTotalArea; + if (elementInViewBoundingBox !== null) { + // Some or all of the element is in view + elementInViewArea = elementInViewBoundingBox.width * elementInViewBoundingBox.height; + elementTotalArea = elementBoundingBox.width * elementBoundingBox.height; + return elementInViewArea / elementTotalArea * 100; + } + + // No overlap between element and the viewport; therefore, the element + // lies completely out of view + return 0; +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["domainOverrideToRootDomain"],{ + +/***/ "./libraries/domainOverrideToRootDomain/index.js": +/*!*******************************************************!*\ + !*** ./libraries/domainOverrideToRootDomain/index.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ domainOverrideToRootDomain: () => (/* binding */ domainOverrideToRootDomain) +/* harmony export */ }); +/** + * Create a domainOverride callback for an ID module, closing over + * an instance of StorageManager. + * + * The domainOverride function, given document.domain, will return + * the topmost domain we are able to set a cookie on. For example, + * given subdomain.example.com, it would return example.com. + * + * @param {StorageManager} storage e.g. from getStorageManager() + * @param {string} moduleName the name of the module using this function + * @returns {function(): string} + */ +function domainOverrideToRootDomain(storage, moduleName) { + return function () { + const domainElements = document.domain.split('.'); + const cookieName = `_gd${Date.now()}_${moduleName}`; + for (let i = 0, topDomain, testCookie; i < domainElements.length; i++) { + const nextDomain = domainElements.slice(i).join('.'); + + // write test cookie + storage.setCookie(cookieName, '1', undefined, undefined, nextDomain); + + // read test cookie to verify domain was valid + testCookie = storage.getCookie(cookieName); + + // delete test cookie + storage.setCookie(cookieName, '', 'Thu, 01 Jan 1970 00:00:01 GMT', undefined, nextDomain); + if (testCookie === '1') { + // cookie was written successfully using test domain so the topDomain is updated + topDomain = nextDomain; + } else { + // cookie failed to write using test domain so exit by returning the topDomain + return topDomain; + } + } + }; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ortbConverter"],{ + +/***/ "./libraries/ortbConverter/converter.js": +/*!**********************************************!*\ + !*** ./libraries/ortbConverter/converter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ defaultProcessors: () => (/* binding */ defaultProcessors), +/* harmony export */ ortbConverter: () => (/* binding */ ortbConverter) +/* harmony export */ }); +/* harmony import */ var _lib_composer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/composer.js */ "./libraries/ortbConverter/lib/composer.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _processors_default_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./processors/default.js */ "./libraries/ortbConverter/processors/default.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _lib_mergeProcessors_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/mergeProcessors.js */ "./libraries/ortbConverter/lib/mergeProcessors.js"); + + + + + +function ortbConverter() { + let { + context: defaultContext = {}, + processors = defaultProcessors, + overrides = {}, + imp, + request, + bidResponse, + response + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const REQ_CTX = new WeakMap(); + function builder(slot, wrapperFn, builderFn, errorHandler) { + let build; + return function () { + if (build == null) { + build = function () { + let delegate = builderFn.bind(this, (0,_lib_composer_js__WEBPACK_IMPORTED_MODULE_0__.compose)(processors()[slot] || {}, overrides[slot] || {})); + if (wrapperFn) { + delegate = wrapperFn.bind(this, delegate); + } + return function () { + try { + return delegate.apply(this, arguments); + } catch (e) { + errorHandler.call(this, e, ...arguments); + } + }; + }(); + } + return build.apply(this, arguments); + }; + } + const buildImp = builder(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__.IMP, imp, function (process, bidRequest, context) { + const imp = {}; + process(imp, bidRequest, context); + return imp; + }, function (error, bidRequest, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error while converting bidRequest to ORTB imp; request skipped.', { + error, + bidRequest, + context + }); + }); + const buildRequest = builder(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__.REQUEST, request, function (process, imps, bidderRequest, context) { + const ortbRequest = { + imp: imps + }; + process(ortbRequest, bidderRequest, context); + return ortbRequest; + }, function (error, imps, bidderRequest, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error while converting to ORTB request', { + error, + imps, + bidderRequest, + context + }); + throw error; + }); + const buildBidResponse = builder(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__.BID_RESPONSE, bidResponse, function (process, bid, context) { + const bidResponse = {}; + process(bidResponse, bid, context); + return bidResponse; + }, function (error, bid, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error while converting ORTB seatbid.bid to bidResponse; bid skipped.', { + error, + bid, + context + }); + }); + const buildResponse = builder(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__.RESPONSE, response, function (process, bidResponses, ortbResponse, context) { + const response = { + bids: bidResponses + }; + process(response, ortbResponse, context); + return response; + }, function (error, bidResponses, ortbResponse, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error while converting from ORTB response', { + error, + bidResponses, + ortbResponse, + context + }); + throw error; + }); + return { + toORTB(_ref) { + let { + bidderRequest, + bidRequests, + context = {} + } = _ref; + bidRequests = bidRequests || bidderRequest.bids; + const ctx = { + req: Object.assign({ + bidRequests + }, defaultContext, context), + imp: {} + }; + ctx.req.impContext = ctx.imp; + const imps = bidRequests.map(bidRequest => { + const impContext = Object.assign({ + bidderRequest, + reqContext: ctx.req + }, defaultContext, context); + const result = buildImp(bidRequest, impContext); + if (result != null) { + if (result.hasOwnProperty('id')) { + Object.assign(impContext, { + bidRequest, + imp: result + }); + ctx.imp[result.id] = impContext; + return result; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Converted ORTB imp does not specify an id, ignoring bid request', bidRequest, result); + } + }).filter(Boolean); + const request = buildRequest(imps, bidderRequest, ctx.req); + ctx.req.bidderRequest = bidderRequest; + if (request != null) { + REQ_CTX.set(request, ctx); + } + return request; + }, + fromORTB(_ref2) { + let { + request, + response + } = _ref2; + const ctx = REQ_CTX.get(request); + if (ctx == null) { + throw new Error('ortbRequest passed to `fromORTB` must be the same object returned by `toORTB`'); + } + function augmentContext(ctx) { + let extraParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + return Object.assign(ctx, { + ortbRequest: request + }, extraParams); + } + const impsById = Object.fromEntries((request.imp || []).map(imp => [imp.id, imp])); + const bidResponses = (response.seatbid || []).flatMap(seatbid => (seatbid.bid || []).map(bid => { + if (impsById.hasOwnProperty(bid.impid) && ctx.imp.hasOwnProperty(bid.impid)) { + return buildBidResponse(bid, augmentContext(ctx.imp[bid.impid], { + imp: impsById[bid.impid], + seatbid, + ortbResponse: response + })); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('ORTB response seatbid[].bid[].impid does not match any imp in request; ignoring bid', bid); + })).filter(Boolean); + return buildResponse(bidResponses, response, augmentContext(ctx.req)); + } + }; +} +const defaultProcessors = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.memoize)(() => (0,_lib_mergeProcessors_js__WEBPACK_IMPORTED_MODULE_3__.mergeProcessors)(_processors_default_js__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_PROCESSORS, (0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__.getProcessors)(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT))); + +/***/ }), + +/***/ "./libraries/ortbConverter/lib/composer.js": +/*!*************************************************!*\ + !*** ./libraries/ortbConverter/lib/composer.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ compose: () => (/* binding */ compose) +/* harmony export */ }); +const SORTED = new WeakMap(); + +/** + * @typedef {Object} Component + * A component function, that can be composed with other compatible functions into one. + * Compatible functions take the same arguments; return values are ignored. + * + * @property {function} fn the component function; + * @property {number} priority determines the order in which this function will run when composed with others. + */ + +/** + * + * @param {Object.} components - An object where keys are component names and values are components to compose. + * @param {Object.} overrides - A map from component names to functions that should override those components. + * Override functions are replacements, except that they get the original function they are overriding as their first argument. If the override + * is `false`, the component is disabled. + * + * @return {function} - A function that will run all components in order of priority, with functions from `overrides` taking + * precedence over components that match names. + */ +function compose(components) { + let overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!SORTED.has(components)) { + const sorted = Object.entries(components); + sorted.sort((a, b) => { + a = a[1].priority || 0; + b = b[1].priority || 0; + return a === b ? 0 : a > b ? -1 : 1; + }); + SORTED.set(components, sorted.map(_ref => { + let [name, cmp] = _ref; + return [name, cmp.fn]; + })); + } + const fns = SORTED.get(components).filter(_ref2 => { + let [name] = _ref2; + return !overrides.hasOwnProperty(name) || overrides[name]; + }).map(function (_ref3) { + let [name, fn] = _ref3; + return overrides.hasOwnProperty(name) ? overrides[name].bind(this, fn) : fn; + }); + return function () { + const args = Array.from(arguments); + fns.forEach(fn => { + fn.apply(this, args); + }); + }; +} + +/***/ }), + +/***/ "./libraries/ortbConverter/lib/mergeProcessors.js": +/*!********************************************************!*\ + !*** ./libraries/ortbConverter/lib/mergeProcessors.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ mergeProcessors: () => (/* binding */ mergeProcessors) +/* harmony export */ }); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); + +function mergeProcessors() { + for (var _len = arguments.length, processors = new Array(_len), _key = 0; _key < _len; _key++) { + processors[_key] = arguments[_key]; + } + const left = processors.shift(); + const right = processors.length > 1 ? mergeProcessors(...processors) : processors[0]; + return Object.fromEntries(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.PROCESSOR_TYPES.map(type => [type, Object.assign({}, left[type], right[type])])); +} + +/***/ }), + +/***/ "./libraries/ortbConverter/processors/banner.js": +/*!******************************************************!*\ + !*** ./libraries/ortbConverter/processors/banner.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ bannerResponseProcessor: () => (/* binding */ bannerResponseProcessor), +/* harmony export */ fillBannerImp: () => (/* binding */ fillBannerImp) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + +/** + * fill in a request `imp` with banner parameters from `bidRequest`. + */ +function fillBannerImp(imp, bidRequest, context) { + if (context.mediaType && context.mediaType !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) return; + const bannerParams = bidRequest?.mediaTypes?.banner; + if (bannerParams) { + const banner = { + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() === true ? 0 : 1 + }; + if (bannerParams.sizes && bidRequest.ortb2Imp?.banner?.format == null) { + banner.format = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.sizesToSizeTuples)(bannerParams.sizes).map(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.sizeTupleToRtbSize); + } + if (bannerParams.hasOwnProperty('pos')) { + banner.pos = bannerParams.pos; + } + imp.banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(banner, imp.banner); + } +} +function bannerResponseProcessor() { + let { + createPixel = url => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(decodeURIComponent(url), _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.encodeMacroURI) + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return function fillBannerResponse(bidResponse, bid) { + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + if (bid.adm && bid.nurl) { + bidResponse.ad = createPixel(bid.nurl) + bid.adm; + } else if (bid.adm) { + bidResponse.ad = bid.adm; + } else if (bid.nurl) { + bidResponse.adUrl = bid.nurl; + } + } + }; +} + +/***/ }), + +/***/ "./libraries/ortbConverter/processors/default.js": +/*!*******************************************************!*\ + !*** ./libraries/ortbConverter/processors/default.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DEFAULT_PROCESSORS: () => (/* binding */ DEFAULT_PROCESSORS) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _banner_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./banner.js */ "./libraries/ortbConverter/processors/banner.js"); +/* harmony import */ var _video_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./video.js */ "./libraries/ortbConverter/processors/video.js"); +/* harmony import */ var _mediaType_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mediaType.js */ "./libraries/ortbConverter/processors/mediaType.js"); +/* harmony import */ var _native_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./native.js */ "./libraries/ortbConverter/processors/native.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../src/fpd/oneClient.js */ "./src/fpd/oneClient.js"); + + + + + + + +const DEFAULT_PROCESSORS = { + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.REQUEST]: { + fpd: { + // sets initial request to bidderRequest.ortb2 + priority: 99, + fn(ortbRequest, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(ortbRequest, bidderRequest.ortb2); + } + }, + onlyOneClient: { + // make sure only one of 'dooh', 'app', 'site' is set in request + priority: -99, + fn: (0,_src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_2__.clientSectionChecker)('ORTB request') + }, + props: { + // sets request properties id, tmax, test + fn(ortbRequest, bidderRequest) { + Object.assign(ortbRequest, { + id: ortbRequest.id || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + test: ortbRequest.test || 0 + }); + const timeout = parseInt(bidderRequest.timeout, 10); + if (!isNaN(timeout)) { + ortbRequest.tmax = timeout; + } + } + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.IMP]: { + fpd: { + // sets initial imp to bidRequest.ortb2Imp + priority: 99, + fn(imp, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(imp, bidRequest.ortb2Imp); + } + }, + id: { + // sets imp.id + fn(imp, bidRequest) { + imp.id = bidRequest.bidId; + } + }, + banner: { + // populates imp.banner + fn: _banner_js__WEBPACK_IMPORTED_MODULE_3__.fillBannerImp + }, + pbadslot: { + // removes imp.ext.data.pbaslot if it's not a string + // TODO: is this needed? + fn(imp) { + const pbadslot = imp.ext?.data?.pbadslot; + if (!pbadslot || typeof pbadslot !== 'string') { + delete imp.ext?.data?.pbadslot; + } + } + }, + secure: { + // should set imp.secure to 1 unless publisher has set it + fn(imp, bidRequest) { + imp.secure = imp.secure ?? 1; + } + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.BID_RESPONSE]: { + mediaType: { + // sets bidResponse.mediaType from context.mediaType, falling back to seatbid.bid[].mtype + priority: 99, + fn: _mediaType_js__WEBPACK_IMPORTED_MODULE_4__.setResponseMediaType + }, + banner: { + // sets banner response attributes if bidResponse.mediaType === BANNER + fn: (0,_banner_js__WEBPACK_IMPORTED_MODULE_3__.bannerResponseProcessor)() + }, + props: { + // sets base bidResponse properties common to all types of bids + fn(bidResponse, bid, context) { + Object.entries({ + requestId: context.bidRequest?.bidId, + seatBidId: bid.id, + cpm: bid.price, + currency: context.ortbResponse.cur || context.currency, + width: bid.w, + height: bid.h, + wratio: bid.wratio, + hratio: bid.hratio, + dealId: bid.dealid, + creative_id: bid.crid, + creativeId: bid.crid, + burl: bid.burl, + ttl: bid.exp || context.ttl, + netRevenue: context.netRevenue + }).filter(_ref => { + let [k, v] = _ref; + return typeof v !== 'undefined'; + }).forEach(_ref2 => { + let [k, v] = _ref2; + return bidResponse[k] = v; + }); + if (!bidResponse.meta) { + bidResponse.meta = {}; + } + if (bid.adomain) { + bidResponse.meta.advertiserDomains = bid.adomain; + } + if (bid.ext?.dsa) { + bidResponse.meta.dsa = bid.ext.dsa; + } + if (bid.cat) { + bidResponse.meta.primaryCatId = bid.cat[0]; + bidResponse.meta.secondaryCatIds = bid.cat.slice(1); + } + if (bid.attr) { + bidResponse.meta.attr = bid.attr; + } + if (bid.ext?.eventtrackers) { + bidResponse.eventtrackers = (bidResponse.eventtrackers ?? []).concat(bid.ext.eventtrackers); + } + } + } + } +}; +if (true) { + DEFAULT_PROCESSORS[_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.IMP].native = { + // populates imp.native + fn: _native_js__WEBPACK_IMPORTED_MODULE_5__.fillNativeImp + }; + DEFAULT_PROCESSORS[_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.BID_RESPONSE].native = { + // populates bidResponse.native if bidResponse.mediaType === NATIVE + fn: _native_js__WEBPACK_IMPORTED_MODULE_5__.fillNativeResponse + }; +} +if (true) { + DEFAULT_PROCESSORS[_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.IMP].video = { + // populates imp.video + fn: _video_js__WEBPACK_IMPORTED_MODULE_6__.fillVideoImp + }; + DEFAULT_PROCESSORS[_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.BID_RESPONSE].video = { + // sets video response attributes if bidResponse.mediaType === VIDEO + fn: _video_js__WEBPACK_IMPORTED_MODULE_6__.fillVideoResponse + }; +} + +/***/ }), + +/***/ "./libraries/ortbConverter/processors/mediaType.js": +/*!*********************************************************!*\ + !*** ./libraries/ortbConverter/processors/mediaType.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ORTB_MTYPES: () => (/* binding */ ORTB_MTYPES), +/* harmony export */ setResponseMediaType: () => (/* binding */ setResponseMediaType) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/mediaTypes.js */ "./src/mediaTypes.js"); + +const ORTB_MTYPES = { + 1: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + 2: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + 4: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE +}; + +/** + * Sets response mediaType, using ORTB 2.6 `seatbid.bid[].mtype`. + * + * Note that this will throw away bids if there is no `mtype` in the response. + */ +function setResponseMediaType(bidResponse, bid, context) { + if (bidResponse.mediaType) return; + const mediaType = context.mediaType; + if (!mediaType && !ORTB_MTYPES.hasOwnProperty(bid.mtype)) { + throw new Error('Cannot determine mediaType for response'); + } + bidResponse.mediaType = mediaType || ORTB_MTYPES[bid.mtype]; +} + +/***/ }), + +/***/ "./libraries/ortbConverter/processors/native.js": +/*!******************************************************!*\ + !*** ./libraries/ortbConverter/processors/native.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ fillNativeImp: () => (/* binding */ fillNativeImp), +/* harmony export */ fillNativeResponse: () => (/* binding */ fillNativeResponse) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + +function fillNativeImp(imp, bidRequest, context) { + if (context.mediaType && context.mediaType !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) return; + let nativeReq = bidRequest.nativeOrtbRequest; + if (nativeReq) { + nativeReq = Object.assign({}, context.nativeRequest, nativeReq); + if (nativeReq.assets?.length) { + imp.native = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({}, { + request: JSON.stringify(nativeReq), + ver: nativeReq.ver + }, imp.native); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('mediaTypes.native is set, but no assets were specified. Native request skipped.', bidRequest); + } + } +} +function fillNativeResponse(bidResponse, bid) { + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + let ortb; + if (typeof bid.adm === 'string') { + ortb = JSON.parse(bid.adm); + } else { + ortb = bid.adm; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(ortb) && Array.isArray(ortb.assets)) { + bidResponse.native = { + ortb + }; + } else { + throw new Error('ORTB native response contained no assets'); + } + } +} + +/***/ }), + +/***/ "./libraries/ortbConverter/processors/video.js": +/*!*****************************************************!*\ + !*** ./libraries/ortbConverter/processors/video.js ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ fillVideoImp: () => (/* binding */ fillVideoImp), +/* harmony export */ fillVideoResponse: () => (/* binding */ fillVideoResponse) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../src/video.js */ "./src/video.js"); + + + +function fillVideoImp(imp, bidRequest, context) { + if (context.mediaType && context.mediaType !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) return; + const videoParams = bidRequest?.mediaTypes?.video; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(videoParams)) { + const video = Object.fromEntries( + // Parameters that share the same name & semantics between pbjs adUnits and imp.video + Object.entries(videoParams).filter(_ref => { + let [name] = _ref; + return _src_video_js__WEBPACK_IMPORTED_MODULE_2__.ORTB_VIDEO_PARAMS.has(name); + })); + if (videoParams.playerSize) { + const format = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.sizesToSizeTuples)(videoParams.playerSize).map(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.sizeTupleToRtbSize); + if (format.length > 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('video request specifies more than one playerSize; all but the first will be ignored'); + } + Object.assign(video, format[0]); + } + imp.video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(video, imp.video); + } +} +function fillVideoResponse(bidResponse, seatbid, context) { + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + if (context?.imp?.video?.w && context?.imp?.video?.h) { + [bidResponse.playerWidth, bidResponse.playerHeight] = [context.imp.video.w, context.imp.video.h]; + } + if (seatbid.adm) { + bidResponse.vastXml = seatbid.adm; + } + if (seatbid.nurl) { + bidResponse.vastUrl = seatbid.nurl; + } + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["teqblazeUtils"],{ + +/***/ "./libraries/teqblazeUtils/bidderUtils.js": +/*!************************************************!*\ + !*** ./libraries/teqblazeUtils/bidderUtils.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildPlacementProcessingFunction: () => (/* binding */ buildPlacementProcessingFunction), +/* harmony export */ buildRequests: () => (/* binding */ buildRequests), +/* harmony export */ buildRequestsBase: () => (/* binding */ buildRequestsBase), +/* harmony export */ getUserSyncs: () => (/* binding */ getUserSyncs), +/* harmony export */ interpretResponse: () => (/* binding */ interpretResponse), +/* harmony export */ interpretResponseBuilder: () => (/* binding */ interpretResponseBuilder), +/* harmony export */ isBidRequestValid: () => (/* binding */ isBidRequestValid) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); + + + +const PROTOCOL_PATTERN = /^[a-z0-9.+-]+:/i; +const isBidResponseValid = bid => { + if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) { + return false; + } + switch (bid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + return Boolean(bid.width && bid.height && bid.ad); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + return Boolean(bid.vastUrl || bid.vastXml); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + return Boolean(bid.native && bid.native.impressionTrackers && bid.native.impressionTrackers.length); + default: + return false; + } +}; +const getBidFloor = bid => { + try { + const bidFloor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; + } catch (err) { + return 0; + } +}; +const createBasePlacement = bid => { + const { + bidId, + mediaTypes, + transactionId, + userIdAsEids + } = bid; + const schain = bid.schain || {}; + const bidfloor = getBidFloor(bid); + const placement = { + bidId, + schain, + bidfloor + }; + if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + placement.sizes = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]) { + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + placement.playerSize = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize; + placement.minduration = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].minduration; + placement.maxduration = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].maxduration; + placement.mimes = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].mimes; + placement.protocols = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].protocols; + placement.startdelay = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].startdelay; + placement.placement = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].placement; + placement.plcmt = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].plcmt; + placement.skip = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].skip; + placement.skipafter = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].skipafter; + placement.minbitrate = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].minbitrate; + placement.maxbitrate = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].maxbitrate; + placement.delivery = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].delivery; + placement.playbackmethod = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playbackmethod; + placement.api = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].api; + placement.linearity = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].linearity; + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]) { + placement.native = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } + if (transactionId) { + placement.ext = placement.ext || {}; + placement.ext.tid = transactionId; + } + if (userIdAsEids && userIdAsEids.length) { + placement.eids = userIdAsEids; + } + return placement; +}; +const defaultPlacementType = (bid, bidderRequest, placement) => { + const { + placementId, + endpointId + } = bid.params; + if (placementId) { + placement.placementId = placementId; + placement.type = 'publisher'; + } else if (endpointId) { + placement.endpointId = endpointId; + placement.type = 'network'; + } +}; +const checkIfObjectHasKey = function (keys, obj) { + let mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'some'; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = obj[key]; + if (mode === 'some' && val) return true; + if (mode === 'every' && !val) return false; + } + return mode === 'every'; +}; +const isBidRequestValid = function () { + let keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['placementId', 'endpointId']; + let mode = arguments.length > 1 ? arguments[1] : undefined; + return function () { + let bid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const { + params, + bidId, + mediaTypes + } = bid; + let valid = Boolean(bidId && params && checkIfObjectHasKey(keys, params, mode)); + if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + valid = valid && Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes); + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]) { + valid = valid && Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize); + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]) { + valid = valid && Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]); + } else { + valid = false; + } + return valid; + }; +}; + +/** + * @param {{ adUrl, validBidRequests, bidderRequest, placementProcessingFunction }} config + * @returns {function} + */ +const buildRequestsBase = config => { + const { + adUrl, + validBidRequests, + bidderRequest + } = config; + const placementProcessingFunction = config.placementProcessingFunction || buildPlacementProcessingFunction(); + const device = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.device'); + const page = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.page', ''); + const proto = PROTOCOL_PATTERN.exec(page); + const protocol = proto?.[0]; + const placements = []; + const request = { + deviceWidth: device?.w || 0, + deviceHeight: device?.h || 0, + language: device?.language?.split('-')[0] || '', + secure: protocol === 'https:' ? 1 : 0, + host: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.domain', ''), + page, + placements, + coppa: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.regs.coppa') ? 1 : 0, + tmax: bidderRequest.timeout, + bcat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.bcat'), + badv: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.badv'), + bapp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.bapp'), + battr: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.battr') + }; + if (bidderRequest.uspConsent) { + request.ccpa = bidderRequest.uspConsent; + } + if (bidderRequest.gdprConsent) { + request.gdpr = { + consentString: bidderRequest.gdprConsent.consentString + }; + } + if (bidderRequest.gppConsent) { + request.gpp = bidderRequest.gppConsent.gppString; + request.gpp_sid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest.ortb2?.regs?.gpp) { + request.gpp = bidderRequest.ortb2.regs.gpp; + request.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + if (bidderRequest?.ortb2?.device) { + request.device = bidderRequest.ortb2.device; + } + const len = validBidRequests.length; + for (let i = 0; i < len; i++) { + const bid = validBidRequests[i]; + placements.push(placementProcessingFunction(bid, bidderRequest)); + } + return { + method: 'POST', + url: adUrl, + data: request + }; +}; +const buildRequests = adUrl => function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const placementProcessingFunction = buildPlacementProcessingFunction(); + return buildRequestsBase({ + adUrl, + validBidRequests, + bidderRequest, + placementProcessingFunction + }); +}; +function interpretResponseBuilder() { + let { + addtlBidValidation = bid => true + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return function (serverResponse) { + let response = []; + for (let i = 0; i < serverResponse.body.length; i++) { + let resItem = serverResponse.body[i]; + if (isBidResponseValid(resItem) && addtlBidValidation(resItem)) { + const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : []; + resItem.meta = { + ...resItem.meta, + advertiserDomains + }; + response.push(resItem); + } + } + return response; + }; +} +const interpretResponse = interpretResponseBuilder(); +const getUserSyncs = syncUrl => (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => { + const type = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let url = syncUrl + `/${type}?pbjs=1`; + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + url += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + url += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`; + } + } + if (uspConsent && uspConsent.consentString) { + url += `&ccpa_consent=${uspConsent.consentString}`; + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + url += '&gpp=' + gppConsent.gppString; + url += '&gpp_sid=' + gppConsent.applicableSections.join(','); + } + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') ? 1 : 0; + url += `&coppa=${coppa}`; + return [{ + type, + url + }]; +}; + +/** + * + * @param {{ addPlacementType?: function, addCustomFieldsToPlacement?: function }} [config] + * @returns {function(object, object): object} + */ +const buildPlacementProcessingFunction = config => (bid, bidderRequest) => { + const addPlacementType = config?.addPlacementType ?? defaultPlacementType; + const placement = createBasePlacement(bid); + addPlacementType(bid, bidderRequest, placement); + if (config?.addCustomFieldsToPlacement) { + config.addCustomFieldsToPlacement(bid, bidderRequest, placement); + } + return placement; +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["urlUtils"],{ + +/***/ "./libraries/urlUtils/urlUtils.js": +/*!****************************************!*\ + !*** ./libraries/urlUtils/urlUtils.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ tryAppendQueryString: () => (/* binding */ tryAppendQueryString) +/* harmony export */ }); +function tryAppendQueryString(existingUrl, key, value) { + if (value) { + return existingUrl + key + '=' + encodeURIComponent(value) + '&'; + } + return existingUrl; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adagioUtils"],{ + +/***/ "./libraries/adagioUtils/adagioUtils.js": +/*!**********************************************!*\ + !*** ./libraries/adagioUtils/adagioUtils.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ _ADAGIO: () => (/* binding */ _ADAGIO), +/* harmony export */ getBestWindowForAdagio: () => (/* binding */ getBestWindowForAdagio) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * Returns the best Window object to use with ADAGIO. + * @returns {Window} window.top or window.self object + */ +function getBestWindowForAdagio() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.canAccessWindowTop)() ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)() : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSelf)(); +} + +/** + * Returns the window.ADAGIO global object used to store Adagio data. + * This object is created in window.top if possible, otherwise in window.self. + */ +const _ADAGIO = function () { + const w = getBestWindowForAdagio(); + w.ADAGIO = w.ADAGIO || {}; + w.ADAGIO.pageviewId = w.ADAGIO.pageviewId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + w.ADAGIO.adUnits = w.ADAGIO.adUnits || {}; + w.ADAGIO.pbjsAdUnits = w.ADAGIO.pbjsAdUnits || []; + w.ADAGIO.queue = w.ADAGIO.queue || []; + w.ADAGIO.versions = w.ADAGIO.versions || {}; + w.ADAGIO.versions.pbjs = "9.45.0-pre"; + w.ADAGIO.windows = w.ADAGIO.windows || []; + w.ADAGIO.isSafeFrameWindow = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isSafeFrameWindow)(); + return w.ADAGIO; +}(); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ortb2Utils"],{ + +/***/ "./libraries/ortb2Utils/currency.js": +/*!******************************************!*\ + !*** ./libraries/ortb2Utils/currency.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getCurrencyFromBidderRequest: () => (/* binding */ getCurrencyFromBidderRequest) +/* harmony export */ }); +function getCurrencyFromBidderRequest(bidderRequest) { + return bidderRequest?.ortb2?.ext?.prebid?.adServerCurrency; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["htmlEscape"],{ + +/***/ "./libraries/htmlEscape/htmlEscape.js": +/*!********************************************!*\ + !*** ./libraries/htmlEscape/htmlEscape.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ escapeUnsafeChars: () => (/* binding */ escapeUnsafeChars) +/* harmony export */ }); +/** + * Encode a string for inclusion in HTML. + * See https://pragmaticwebsecurity.com/articles/spasecurity/json-stringify-xss.html and + * https://codeql.github.com/codeql-query-help/javascript/js-bad-code-sanitization/ + * @return {string} + */ +const escapeUnsafeChars = (() => { + const escapes = { + '<': '\\u003C', + '>': '\\u003E', + '/': '\\u002F', + '\\': '\\\\', + '\b': '\\b', + '\f': '\\f', + '\n': '\\n', + '\r': '\\r', + '\t': '\\t', + '\0': '\\0', + '\u2028': '\\u2028', + '\u2029': '\\u2029' + }; + return function (str) { + return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g, x => escapes[x]); + }; +})(); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nexx360Utils"],{ + +/***/ "./libraries/nexx360Utils/index.js": +/*!*****************************************!*\ + !*** ./libraries/nexx360Utils/index.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createResponse: () => (/* binding */ createResponse), +/* harmony export */ enrichImp: () => (/* binding */ enrichImp), +/* harmony export */ enrichRequest: () => (/* binding */ enrichRequest), +/* harmony export */ getAmxId: () => (/* binding */ getAmxId), +/* harmony export */ getUserSyncs: () => (/* binding */ getUserSyncs) +/* harmony export */ }); +/* unused harmony export createRenderer */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; + +/** + * Register the user sync pixels which should be dropped after the auction. + * + /** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * + */ + +/** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') && serverResponses[0].body.hasOwnProperty('ext') && serverResponses[0].body.ext.hasOwnProperty('cookies') && typeof serverResponses[0].body.ext.cookies === 'object') { + return serverResponses[0].body.ext.cookies.slice(0, 5); + } else { + return []; + } +} +; +function outstreamRender(response) { + response.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [response.width, response.height], + targetId: response.divId, + adResponse: response.vastXml, + rendererOptions: { + showBigPlayButton: false, + showProgressBar: 'bar', + showVolume: false, + allowFullscreen: true, + skippable: false, + content: response.vastXml + } + }); + }); +} +; +function createRenderer(bid, url) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_0__.Renderer.install({ + id: bid.id, + url: url, + loaded: false, + adUnitCode: bid.ext.adUnitCode, + targetId: bid.ext.divId + }); + renderer.setRender(outstreamRender); + return renderer; +} +; +function enrichImp(imp, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'tagid', bidRequest.adUnitCode); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.adUnitCode', bidRequest.adUnitCode); + const divId = bidRequest.params.divId || bidRequest.adUnitCode; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.divId', divId); + if (imp.video) { + const playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.playerSize'); + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.context'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'video.ext.playerSize', playerSize); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'video.ext.context', videoContext); + } + return imp; +} +function enrichRequest(request, amxId, bidderRequest, pageViewId, bidderVersion) { + if (amxId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.localStorage.amxId', amxId); + if (!request.user) request.user = {}; + if (!request.user.ext) request.user.ext = {}; + if (!request.user.ext.eids) request.user.ext.eids = []; + request.user.ext.eids.push({ + source: 'amxdt.net', + uids: [{ + id: `${amxId}`, + atype: 1 + }] + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.version', "9.45.0-pre"); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.source', 'prebid.js'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.pageViewId', pageViewId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.bidderVersion', bidderVersion); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'cur', [(0,_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest) || 'USD']); + if (!request.user) request.user = {}; + return request; +} +; +function createResponse(bid, respBody) { + const response = { + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.crid, + currency: respBody.cur, + netRevenue: true, + ttl: 120, + mediaType: [_src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM, _src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM].includes(bid.ext.mediaType) ? 'video' : bid.ext.mediaType, + meta: { + advertiserDomains: bid.adomain, + demandSource: bid.ext.ssp + } + }; + if (bid.dealid) response.dealid = bid.dealid; + if (bid.ext.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) response.ad = bid.adm; + if ([_src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM, _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM].includes(bid.ext.mediaType)) response.vastXml = bid.adm; + if (bid.ext.mediaType === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM) { + response.renderer = createRenderer(bid, OUTSTREAM_RENDERER_URL); + if (bid.ext.divId) response.divId = bid.ext.divId; + } + ; + if (bid.ext.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE) { + try { + response.native = { + ortb: JSON.parse(bid.adm) + }; + } catch (e) {} + } + return response; +} + +/** + * Get the AMX ID + * @return { string | false } false if localstorageNotEnabled + */ +function getAmxId(storage, bidderCode) { + if (!storage.localStorageIsEnabled()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(`localstorage not enabled for ${bidderCode}`); + return false; + } + const amxId = storage.getDataFromLocalStorage('__amuidpb'); + return amxId || false; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sizeUtils"],{ + +/***/ "./libraries/sizeUtils/sizeUtils.js": +/*!******************************************!*\ + !*** ./libraries/sizeUtils/sizeUtils.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getAdUnitSizes: () => (/* binding */ getAdUnitSizes), +/* harmony export */ normalizeBannerSizes: () => (/* binding */ normalizeBannerSizes) +/* harmony export */ }); +/** + * Read an adUnit object and return the sizes used in an [[728, 90]] format (even if they had [728, 90] defined) + * Preference is given to the `adUnit.mediaTypes.banner.sizes` object over the `adUnit.sizes` + * @param {object} adUnit one adUnit object from the normal list of adUnits + * @returns {Array.} array of arrays containing numeric sizes + */ +function getAdUnitSizes(adUnit) { + if (!adUnit) { + return; + } + let sizes = []; + if (adUnit.mediaTypes && adUnit.mediaTypes.banner && Array.isArray(adUnit.mediaTypes.banner.sizes)) { + let bannerSizes = adUnit.mediaTypes.banner.sizes; + if (Array.isArray(bannerSizes[0])) { + sizes = bannerSizes; + } else { + sizes.push(bannerSizes); + } + // TODO - remove this else block when we're ready to deprecate adUnit.sizes for bidders + } else if (Array.isArray(adUnit.sizes)) { + if (Array.isArray(adUnit.sizes[0])) { + sizes = adUnit.sizes; + } else { + sizes.push(adUnit.sizes); + } + } + return sizes; +} + +/** + * Normalize adUnit.mediaTypes.banner.sizes to Array.> + * + * @param {Array. | Array.>} bidSizes - value of adUnit.mediaTypes.banner.sizes. + * @returns {Array.>} - Normalized value. + */ + +function normalizeBannerSizes(bidSizes) { + let sizes = []; + if (Array.isArray(bidSizes) && bidSizes.length === 2 && !Array.isArray(bidSizes[0])) { + sizes.push({ + width: parseInt(bidSizes[0], 10), + height: parseInt(bidSizes[1], 10) + }); + } else if (Array.isArray(bidSizes) && Array.isArray(bidSizes[0])) { + bidSizes.forEach(size => { + sizes.push({ + width: parseInt(size[0], 10), + height: parseInt(size[1], 10) + }); + }); + } + return sizes; +} + +/***/ }), + +/***/ "./libraries/sizeUtils/tranformSize.js": +/*!*********************************************!*\ + !*** ./libraries/sizeUtils/tranformSize.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ normalAdSize: () => (/* binding */ normalAdSize), +/* harmony export */ transformSizes: () => (/* binding */ transformSizes) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * get sizes for rtb + * @param {Array|Object} requestSizes + * @return {Object} + */ +function transformSizes(requestSizes) { + let sizes = []; + let sizeObj = {}; + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray(requestSizes) && requestSizes.length === 2 && !_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray(requestSizes[0])) { + sizeObj.width = parseInt(requestSizes[0], 10); + sizeObj.height = parseInt(requestSizes[1], 10); + sizes.push(sizeObj); + } else if (typeof requestSizes === 'object') { + for (let i = 0; i < requestSizes.length; i++) { + let size = requestSizes[i]; + sizeObj = {}; + sizeObj.width = parseInt(size[0], 10); + sizeObj.height = parseInt(size[1], 10); + sizes.push(sizeObj); + } + } + return sizes; +} +const normalAdSize = [{ + w: 300, + h: 250 +}, { + w: 300, + h: 600 +}, { + w: 728, + h: 90 +}, { + w: 970, + h: 250 +}, { + w: 320, + h: 50 +}, { + w: 160, + h: 600 +}, { + w: 320, + h: 180 +}, { + w: 320, + h: 100 +}, { + w: 336, + h: 280 +}]; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["xeUtils"],{ + +/***/ "./libraries/xeUtils/bidderUtils.js": +/*!******************************************!*\ + !*** ./libraries/xeUtils/bidderUtils.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildRequests: () => (/* binding */ buildRequests), +/* harmony export */ getUserSyncs: () => (/* binding */ getUserSyncs), +/* harmony export */ interpretResponse: () => (/* binding */ interpretResponse), +/* harmony export */ isBidRequestValid: () => (/* binding */ isBidRequestValid) +/* harmony export */ }); +/* unused harmony export getBidFloor */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); + + + +function getBidFloor(bid) { + let currency = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'USD'; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return null; + } + let floor = bid.getFloor({ + currency, + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === currency) { + return floor.floor; + } + return null; +} +function isBidRequestValid(bid) { + if (bid && typeof bid.params !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Params is not defined or is incorrect in the bidder settings'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('env', bid.params) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('pid', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Env or pid is not present in bidder params'); + return false; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video') && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playerSize'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('mediaTypes.video.playerSize is required for video'); + return false; + } + return true; +} +function buildRequests(validBidRequests, bidderRequest, endpoint) { + const { + refererInfo = {}, + gdprConsent = {}, + uspConsent + } = bidderRequest; + const requests = validBidRequests.map(req => { + const request = {}; + request.tmax = bidderRequest.timeout || 0; + request.bidId = req.bidId; + request.banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(req, 'mediaTypes.banner'); + request.auctionId = req.ortb2?.source?.tid; + request.transactionId = req.ortb2Imp?.ext?.tid; + request.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)((0,_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_2__.getAdUnitSizes)(req)); + request.schain = req.schain; + request.location = { + page: refererInfo.page, + location: refererInfo.location, + domain: refererInfo.domain, + whost: window.location.host, + ref: refererInfo.ref, + isAmp: refererInfo.isAmp + }; + request.device = { + ua: navigator.userAgent, + lang: navigator.language + }; + request.env = { + env: req.params.env, + pid: req.params.pid + }; + request.ortb2 = req.ortb2; + request.ortb2Imp = req.ortb2Imp; + request.tz = new Date().getTimezoneOffset(); + request.ext = req.params.ext; + request.bc = req.bidRequestsCount; + request.floor = getBidFloor(req); + if (req.userIdAsEids && req.userIdAsEids.length !== 0) { + request.userEids = req.userIdAsEids; + } else { + request.userEids = []; + } + request.gdprConsent = gdprConsent; + if (uspConsent) { + request.usPrivacy = uspConsent; + } else { + request.usPrivacy = ''; + } + const video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(req, 'mediaTypes.video'); + if (video) { + request.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(req, 'mediaTypes.video.playerSize')); + request.video = video; + } + return request; + }); + return { + method: 'POST', + url: endpoint + '/bid', + data: JSON.stringify(requests), + withCredentials: true, + bidderRequest, + options: { + contentType: 'application/json' + } + }; +} +function interpretResponse(serverResponse, _ref) { + let { + bidderRequest + } = _ref; + const response = []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(serverResponse, 'body.data'))) { + return response; + } + serverResponse.body.data.forEach(serverBid => { + const bidIndex = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.findIndex)(bidderRequest.bids, bidRequest => { + return bidRequest.bidId === serverBid.requestId; + }); + if (bidIndex !== -1) { + const bid = { + requestId: serverBid.requestId, + dealId: bidderRequest.dealId || null, + ...serverBid + }; + response.push(bid); + } + }); + return response; +} +function getUserSyncs(syncOptions, serverResponses) { + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let uspConsent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + const syncs = []; + const pixels = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(serverResponses, '0.body.data.0.ext.pixels'); + if ((syncOptions.iframeEnabled || syncOptions.pixelEnabled) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(pixels) && pixels.length !== 0) { + const gdprFlag = `&gdpr=${gdprConsent.gdprApplies ? 1 : 0}`; + const gdprString = `&gdpr_consent=${encodeURIComponent(gdprConsent.consentString || '')}`; + const usPrivacy = `us_privacy=${encodeURIComponent(uspConsent)}`; + pixels.forEach(pixel => { + const [type, url] = pixel; + const sync = { + type, + url: `${url}&${usPrivacy}${gdprFlag}${gdprString}` + }; + if (type === 'iframe' && syncOptions.iframeEnabled) { + syncs.push(sync); + } else if (type === 'image' && syncOptions.pixelEnabled) { + syncs.push(sync); + } + }); + } + return syncs; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adkernelUtils"],{ + +/***/ "./libraries/adkernelUtils/adkernelUtils.js": +/*!**************************************************!*\ + !*** ./libraries/adkernelUtils/adkernelUtils.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBidFloor: () => (/* binding */ getBidFloor) +/* harmony export */ }); +function getBidFloor(bid, mediaType, sizes) { + var floor; + var size = sizes.length === 1 ? sizes[0] : '*'; + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType, + size + }); + if (typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = parseFloat(floorInfo.floor); + } + } + return floor; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["precisoUtils"],{ + +/***/ "./libraries/precisoUtils/bidNativeUtils.js": +/*!**************************************************!*\ + !*** ./libraries/precisoUtils/bidNativeUtils.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ OPENRTB: () => (/* binding */ OPENRTB), +/* harmony export */ interpretNativeAd: () => (/* binding */ interpretNativeAd), +/* harmony export */ interpretNativeBid: () => (/* binding */ interpretNativeBid) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _bidUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bidUtils.js */ "./libraries/precisoUtils/bidUtils.js"); + + + +const TTL = 55; +// Codes defined by OpenRTB Native Ads 1.1 specification +const OPENRTB = { + NATIVE: { + IMAGE_TYPE: { + ICON: 1, + MAIN: 3 + }, + ASSET_ID: { + TITLE: 1, + IMAGE: 2, + ICON: 3, + BODY: 4, + SPONSORED: 5, + CTA: 6 + }, + DATA_ASSET_TYPE: { + SPONSORED: 1, + DESC: 2, + CTA_TEXT: 12 + } + } +}; + +/** + * @param {object} serverBid Bid by OpenRTB 2.5 §4.2.3 + * @returns {object} Prebid native bidObject + */ +function interpretNativeBid(serverBid) { + return { + requestId: serverBid.impid, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, + cpm: serverBid.price, + creativeId: serverBid.adid || serverBid.crid, + width: 1, + height: 1, + ttl: TTL, + meta: { + advertiserDomains: serverBid.adomain + }, + netRevenue: true, + currency: 'USD', + // native: interpretNativeAd(serverBid.adm) + native: interpretNativeAd((0,_bidUtils_js__WEBPACK_IMPORTED_MODULE_1__.macroReplace)(serverBid.adm, serverBid.price)) + }; +} + +/** + * @param {string} adm JSON-encoded Request by OpenRTB Native Ads 1.1 §4.1 + * @returns {object} Prebid bidObject.native + */ + +function interpretNativeAd(adm) { + try { + const native = JSON.parse(adm).native; + if (native) { + const result = { + clickUrl: encodeURI(native.link.url), + impressionTrackers: native.imptrackers || native.eventtrackers[0].url + }; + if (native.link.clicktrackers) { + result.clickTrackers = native.link.clicktrackers[0]; + } + native.assets.forEach(asset => { + switch (asset.id) { + case OPENRTB.NATIVE.ASSET_ID.TITLE: + result.title = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'title.text'); + break; + case OPENRTB.NATIVE.ASSET_ID.IMAGE: + result.image = { + url: encodeURI(asset.img.url), + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'img.w'), + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'img.h') + }; + break; + case OPENRTB.NATIVE.ASSET_ID.ICON: + result.icon = { + url: encodeURI(asset.img.url), + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'img.w'), + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'img.h') + }; + break; + case OPENRTB.NATIVE.ASSET_ID.BODY: + result.body = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'data.value'); + break; + case OPENRTB.NATIVE.ASSET_ID.SPONSORED: + result.sponsoredBy = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'data.value'); + break; + case OPENRTB.NATIVE.ASSET_ID.CTA: + result.cta = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(asset, 'data.value'); + break; + } + }); + return result; + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Error in bidUtils interpretNativeAd' + error); + } +} + +/***/ }), + +/***/ "./libraries/precisoUtils/bidUtils.js": +/*!********************************************!*\ + !*** ./libraries/precisoUtils/bidUtils.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildBidResponse: () => (/* binding */ buildBidResponse), +/* harmony export */ buildRequests: () => (/* binding */ buildRequests), +/* harmony export */ interpretResponse: () => (/* binding */ interpretResponse), +/* harmony export */ macroReplace: () => (/* binding */ macroReplace), +/* harmony export */ onBidWon: () => (/* binding */ onBidWon) +/* harmony export */ }); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bidUtilsCommon.js */ "./libraries/precisoUtils/bidUtilsCommon.js"); +/* harmony import */ var _bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./bidNativeUtils.js */ "./libraries/precisoUtils/bidNativeUtils.js"); + + + +// import { NATIVE } from '../../src/mediaTypes.js'; + + +const buildRequests = endpoint => function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_0__.convertOrtbRequestToProprietaryNative)(validBidRequests); + var city = Intl.DateTimeFormat().resolvedOptions().timeZone; + let req = { + id: validBidRequests[0].auctionId, + imp: validBidRequests.map(slot => mapImpression(slot, bidderRequest)), + user: { + id: validBidRequests[0].userId.pubcid || '', + buyeruid: validBidRequests[0].buyerUid || '', + geo: { + country: validBidRequests[0].params.region || city, + region: validBidRequests[0].params.region || city + } + }, + device: validBidRequests[0].ortb2.device, + site: validBidRequests[0].ortb2.site, + source: validBidRequests[0].ortb2.source, + bcat: validBidRequests[0].ortb2.bcat || validBidRequests[0].params.bcat, + badv: validBidRequests[0].ortb2.badv || validBidRequests[0].params.badv, + wlang: validBidRequests[0].ortb2.wlang || validBidRequests[0].params.wlang + }; + if (req.device && req.device != 'undefined') { + req.device.geo = { + country: req.user.geo.country, + region: req.user.geo.region + }; + } + ; + req.site.publisher = { + publisherId: validBidRequests[0].params.publisherId + }; + (0,_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.consentCheck)(bidderRequest, req); + return { + method: 'POST', + url: endpoint, + data: req + }; +}; +function interpretResponse(serverResponse) { + const bidsValue = []; + const bidResponse = serverResponse.body; + bidResponse.seatbid.forEach(seat => { + seat.bid.forEach(bid => { + bidsValue.push({ + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.crid, + ad: macroReplace(bid.adm, bid.price), + currency: 'USD', + netRevenue: true, + ttl: 300, + meta: { + advertiserDomains: bid.adomain || '' + } + }); + }); + }); + return bidsValue; +} +function onBidWon(bid) { + if (bid.nurl) { + const resolvedNurl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bid.nurl, bid.price); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(resolvedNurl); + } +} +function macroReplace(adm, cpm) { + let replacedadm = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(adm, cpm); + return replacedadm; +} +function mapImpression(slot, bidderRequest) { + const imp = { + id: slot.bidId, + bidFloor: (0,_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.getBidFloor)(slot) + }; + if (slot.mediaType === 'native' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(slot, 'mediaTypes.native')) { + imp.native = mapNative(slot); + } else { + imp.banner = mapBanner(slot); + } + return imp; +} +function mapNative(slot) { + if (slot.mediaType === 'native' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(slot, 'mediaTypes.native')) { + let request = { + assets: slot.nativeOrtbRequest.assets || slot.nativeParams.ortb.assets, + ver: '1.2' + }; + return { + request: JSON.stringify(request) + }; + } +} +function mapBanner(slot) { + if (slot.mediaTypes.banner) { + let format = (slot.mediaTypes.banner.sizes || slot.sizes).map(size => { + return { + w: size[0], + h: size[1] + }; + }); + return { + format + }; + } +} +function buildBidResponse(serverResponse) { + const responseBody = serverResponse.body; + const bids = []; + responseBody.seatbid.forEach(seat => { + seat.bid.forEach(serverBid => { + if (!serverBid.price) { + return; + } + if (serverBid.adm.indexOf('{') === 0) { + let interpretedBid = (0,_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_5__.interpretNativeBid)(serverBid); + bids.push(interpretedBid); + } else { + bids.push({ + requestId: serverBid.impid, + cpm: serverBid.price, + width: serverBid.w, + height: serverBid.h, + creativeId: serverBid.crid, + ad: macroReplace(serverBid.adm, serverBid.price), + currency: 'USD', + netRevenue: true, + ttl: 300, + meta: { + advertiserDomains: serverBid.adomain || '' + } + }); + } + }); + }); + return bids; +} + +// export function interpretNativeAd(adm) { +// try { +// // logInfo('adm::' + adm); +// const native = JSON.parse(adm).native; +// if (native) { +// const result = { +// clickUrl: encodeURI(native.link.url), +// impressionTrackers: native.eventtrackers[0].url, +// }; +// if (native.link.clicktrackers[0]) { +// result.clickTrackers = native.link.clicktrackers[0]; +// } + +// native.assets.forEach(asset => { +// switch (asset.id) { +// case OPENRTB.NATIVE.ASSET_ID.TITLE: +// result.title = deepAccess(asset, 'title.text'); +// break; +// case OPENRTB.NATIVE.ASSET_ID.IMAGE: +// result.image = { +// url: encodeURI(asset.img.url), +// width: deepAccess(asset, 'img.w'), +// height: deepAccess(asset, 'img.h') +// }; +// break; +// case OPENRTB.NATIVE.ASSET_ID.ICON: +// result.icon = { +// url: encodeURI(asset.img.url), +// width: deepAccess(asset, 'img.w'), +// height: deepAccess(asset, 'img.h') +// }; +// break; +// case OPENRTB.NATIVE.ASSET_ID.DATA: +// result.body = deepAccess(asset, 'data.value'); +// break; +// case OPENRTB.NATIVE.ASSET_ID.SPONSORED: +// result.sponsoredBy = deepAccess(asset, 'data.value'); +// break; +// case OPENRTB.NATIVE.ASSET_ID.CTA: +// result.cta = deepAccess(asset, 'data.value'); +// break; +// } +// }); +// return result; +// } +// } catch (error) { +// logInfo('Error in bidUtils interpretNativeAd' + error); +// } +// } + +// export const OPENRTB = { +// NATIVE: { +// IMAGE_TYPE: { +// ICON: 1, +// MAIN: 3, +// }, +// ASSET_ID: { +// TITLE: 1, +// IMAGE: 2, +// ICON: 3, +// BODY: 4, +// SPONSORED: 5, +// CTA: 6 +// }, +// DATA_ASSET_TYPE: { +// SPONSORED: 1, +// DESC: 2, +// CTA_TEXT: 12, +// }, +// } +// }; + +// /** +// * @param {object} serverBid Bid by OpenRTB 2.5 §4.2.3 +// * @returns {object} Prebid native bidObject +// */ +// export function interpretNativeBid(serverBid) { +// return { +// requestId: serverBid.impid, +// mediaType: NATIVE, +// cpm: serverBid.price, +// creativeId: serverBid.adid || serverBid.crid, +// width: 1, +// height: 1, +// ttl: 56, +// meta: { +// advertiserDomains: serverBid.adomain +// }, +// netRevenue: true, +// currency: 'USD', +// native: interpretNativeAd(macroReplace(serverBid.adm, serverBid.price)) +// } +// } + +/***/ }), + +/***/ "./libraries/precisoUtils/bidUtilsCommon.js": +/*!**************************************************!*\ + !*** ./libraries/precisoUtils/bidUtilsCommon.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ bidWinReport: () => (/* binding */ bidWinReport), +/* harmony export */ buildBidRequests: () => (/* binding */ buildBidRequests), +/* harmony export */ buildUserSyncs: () => (/* binding */ buildUserSyncs), +/* harmony export */ consentCheck: () => (/* binding */ consentCheck), +/* harmony export */ getBidFloor: () => (/* binding */ getBidFloor), +/* harmony export */ interpretResponse: () => (/* binding */ interpretResponse), +/* harmony export */ isBidRequestValid: () => (/* binding */ isBidRequestValid) +/* harmony export */ }); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + +function isBidResponseValid(bid) { + if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency || !bid.meta) { + return false; + } + switch (bid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + return Boolean(bid.width && bid.height && bid.ad); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + return Boolean(bid.vastXml || bid.vastUrl); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + return Boolean(bid.native && bid.native.impressionTrackers); + default: + return false; + } +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidFloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; + } catch (_) { + return 0; + } +} +function isBidRequestValid(bid) { + return Boolean(bid.bidId && bid.params && bid.params.placementId); +} +const buildBidRequests = adurl => function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + const winTop = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(); + const location = winTop.location; + const placements = []; + const request = { + deviceWidth: winTop.screen.width, + deviceHeight: winTop.screen.height, + language: navigator && navigator.language ? navigator.language.split('-')[0] : '', + host: location.host, + page: location.pathname, + placements: placements + }; + consentCheck(bidderRequest, request); + const len = validBidRequests.length; + for (let i = 0; i < len; i++) { + const bid = validBidRequests[i]; + const placement = { + placementId: bid.params.placementId, + bidId: bid.bidId, + schain: bid.schain || {}, + bidfloor: getBidFloor(bid) + }; + if (typeof bid.userId !== 'undefined') { + placement.userId = bid.userId; + } + const mediaType = bid.mediaTypes; + if (mediaType && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes) { + placement.sizes = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + placements.push(placement); + } + return { + method: 'POST', + url: adurl, + data: request + }; +}; +function interpretResponse(serverResponse) { + let response = []; + for (let i = 0; i < serverResponse.body.length; i++) { + let resItem = serverResponse.body[i]; + if (isBidResponseValid(resItem)) { + const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : []; + resItem.meta = { + ...resItem.meta, + advertiserDomains + }; + response.push(resItem); + } + } + return response; +} +function consentCheck(bidderRequest, req) { + if (bidderRequest) { + if (bidderRequest.uspConsent) { + req.ccpa = bidderRequest.uspConsent; + } + if (bidderRequest.gdprConsent) { + req.gdpr = bidderRequest.gdprConsent; + } + if (bidderRequest.gppConsent) { + req.gpp = bidderRequest.gppConsent; + } + } +} +const buildUserSyncs = (syncOptions, serverResponses, gdprConsent, uspConsent, syncEndpoint) => { + let syncType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + const isCk2trk = syncEndpoint.includes('ck.2trk.info'); + let syncUrl = isCk2trk ? syncEndpoint : `${syncEndpoint}/${syncType}?pbjs=1`; + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`; + } + } else { + syncUrl += isCk2trk ? `&gdpr=0&gdpr_consent=` : ''; + } + if (isCk2trk) { + syncUrl += uspConsent ? `&us_privacy=${uspConsent}` : `&us_privacy=`; + syncUrl += syncOptions.iframeEnabled ? `&t=4` : `&t=2`; + } else { + if (uspConsent && uspConsent.consentString) { + syncUrl += `&ccpa_consent=${uspConsent.consentString}`; + } + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') ? 1 : 0; + syncUrl += `&coppa=${coppa}`; + } + return [{ + type: syncType, + url: syncUrl + }]; +}; +function bidWinReport(bid) { + const cpm = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'adserverTargeting.hb_pb') || ''; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.nurl) && bid.nurl !== '') { + bid.nurl = bid.nurl.replace(/\${AUCTION_PRICE}/, cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(bid.nurl); + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["userSyncUtils"],{ + +/***/ "./libraries/userSyncUtils/userSyncUtils.js": +/*!**************************************************!*\ + !*** ./libraries/userSyncUtils/userSyncUtils.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getUserSyncParams: () => (/* binding */ getUserSyncParams) +/* harmony export */ }); +function getUserSyncParams(gdprConsent, uspConsent, gppConsent) { + let params = {}; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params['gdpr'] = Number(gdprConsent.gdprApplies); + } + if (typeof gdprConsent.consentString === 'string') { + params['gdpr_consent'] = gdprConsent.consentString; + } + } + if (uspConsent) { + params['us_privacy'] = encodeURIComponent(uspConsent); + } + if (gppConsent?.gppString) { + params['gpp'] = gppConsent.gppString; + params['gpp_sid'] = gppConsent.applicableSections?.toString(); + } + return params; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["braveUtils"],{ + +/***/ "./libraries/braveUtils/buildAndInterpret.js": +/*!***************************************************!*\ + !*** ./libraries/braveUtils/buildAndInterpret.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildRequests: () => (/* binding */ buildRequests), +/* harmony export */ interpretResponse: () => (/* binding */ interpretResponse) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./libraries/braveUtils/index.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/native.js */ "./src/native.js"); + + + + +const buildRequests = (validBidRequests, bidderRequest, endpointURL, defaultCur) => { + if (!validBidRequests.length || !bidderRequest) return []; + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_0__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const endpoint = endpointURL.replace('hash', validBidRequests[0].params.placementId); + const imp = validBidRequests.map(br => { + const impObject = { + id: br.bidId, + secure: 1, + bidfloor: (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.getFloor)(br, Object.keys(br.mediaTypes)[0]), + defaultCur + }; + if (br.mediaTypes.banner) impObject.banner = (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.createBannerRequest)(br);else if (br.mediaTypes.video) impObject.video = (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.createVideoRequest)(br);else if (br.mediaTypes.native) impObject.native = { + id: br.transactionId, + ver: '1.2', + request: (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.createNativeRequest)(br) + }; + return impObject; + }); + const data = { + id: bidderRequest.bidderRequestId, + cur: [defaultCur], + device: bidderRequest.ortb2?.device || { + w: screen.width, + h: screen.height, + language: navigator.language?.split('-')[0], + ua: navigator.userAgent + }, + site: (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.prepareSite)(validBidRequests[0], bidderRequest), + tmax: bidderRequest.timeout, + regs: { + ext: {}, + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') == true ? 1 : 0 + }, + user: { + ext: {} + }, + imp + }; + (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.prepareConsents)(data, bidderRequest); + (0,_index_js__WEBPACK_IMPORTED_MODULE_1__.prepareEids)(data, validBidRequests[0]); + if (validBidRequests[0].schain) data.source = { + ext: { + schain: validBidRequests[0].schain + } + }; + return { + method: 'POST', + url: endpoint, + data + }; +}; +const interpretResponse = (serverResponse, defaultCur, parseNative) => { + if (!serverResponse || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(serverResponse.body)) return []; + let bids = []; + serverResponse.body.seatbid.forEach(response => { + response.bid.forEach(bid => { + const mediaType = bid.ext?.mediaType || 'banner'; + const bidObj = { + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ttl: 1200, + currency: defaultCur, + netRevenue: true, + creativeId: bid.crid, + dealId: bid.dealid || null, + mediaType + }; + switch (mediaType) { + case 'video': + bidObj.vastXml = bid.adm; + break; + case 'native': + bidObj.native = parseNative(bid.adm); + break; + default: + bidObj.ad = bid.adm; + } + bids.push(bidObj); + }); + }); + return bids; +}; + +/***/ }), + +/***/ "./libraries/braveUtils/index.js": +/*!***************************************!*\ + !*** ./libraries/braveUtils/index.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createBannerRequest: () => (/* binding */ createBannerRequest), +/* harmony export */ createNativeRequest: () => (/* binding */ createNativeRequest), +/* harmony export */ createVideoRequest: () => (/* binding */ createVideoRequest), +/* harmony export */ getFloor: () => (/* binding */ getFloor), +/* harmony export */ parseNative: () => (/* binding */ parseNative), +/* harmony export */ prepareConsents: () => (/* binding */ prepareConsents), +/* harmony export */ prepareEids: () => (/* binding */ prepareEids), +/* harmony export */ prepareSite: () => (/* binding */ prepareSite) +/* harmony export */ }); +/* harmony import */ var _nativeAssets_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nativeAssets.js */ "./libraries/braveUtils/nativeAssets.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + +/** + * Builds a native request object based on the bid request + * @param {object} br - The bid request + * @returns {object} The native request object + */ +function createNativeRequest(br) { + let impObject = { + ver: '1.2', + assets: [] + }; + Object.keys(br.mediaTypes.native).forEach(key => { + const props = _nativeAssets_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSETS[key]; + if (props) { + const asset = { + required: br.mediaTypes.native[key].required ? 1 : 0, + id: props.id, + [props.name]: {} + }; + if (props.type) asset[props.name]['type'] = props.type; + if (br.mediaTypes.native[key].len) asset[props.name]['len'] = br.mediaTypes.native[key].len; + if (br.mediaTypes.native[key].sizes && br.mediaTypes.native[key].sizes[0]) { + asset[props.name]['w'] = br.mediaTypes.native[key].sizes[0]; + asset[props.name]['h'] = br.mediaTypes.native[key].sizes[1]; + } + impObject.assets.push(asset); + } + }); + return impObject; +} + +/** + * Builds a banner request object based on the bid request + * @param {object} br - The bid request + * @returns {object} The banner request object + */ +function createBannerRequest(br) { + let [w, h] = [300, 250]; + let format = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(br.mediaTypes.banner.sizes)) { + [w, h] = br.mediaTypes.banner.sizes; + format.push({ + w, + h + }); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(br.mediaTypes.banner.sizes)) { + [w, h] = br.mediaTypes.banner.sizes[0]; + if (br.mediaTypes.banner.sizes.length > 1) { + format = br.mediaTypes.banner.sizes.map(size => ({ + w: size[0], + h: size[1] + })); + } + } + return { + w, + h, + format, + id: br.transactionId + }; +} + +/** + * Builds a video request object based on the bid request + * @param {object} br - The bid request + * @returns {object} The video request object + */ +function createVideoRequest(br) { + let videoObj = { + ...br.mediaTypes.video, + id: br.transactionId + }; + if (videoObj.playerSize) { + const size = Array.isArray(videoObj.playerSize[0]) ? videoObj.playerSize[0] : videoObj.playerSize; + videoObj.w = size[0]; + videoObj.h = size[1]; + } else { + videoObj.w = 640; + videoObj.h = 480; + } + return videoObj; +} +/** + * Parses the native ad response + * @param {object} adm - The native ad response + * @returns {object} Parsed native ad object + */ +function parseNative(adm) { + let bid = { + clickUrl: adm.native.link?.url, + impressionTrackers: adm.native.imptrackers || [], + clickTrackers: adm.native.link?.clicktrackers || [], + jstracker: adm.native.jstracker || [] + }; + adm.native.assets.forEach(asset => { + const kind = _nativeAssets_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSETS_IDS[asset.id]; + const content = kind && asset[_nativeAssets_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSETS[kind].name]; + if (content) { + bid[kind] = content.text || content.value || { + url: content.url, + width: content.w, + height: content.h + }; + } + }); + return bid; +} + +/** + * Prepare Bid Floor for request + * @param {object} br - The bid request + * @param {string} mediaType - tyoe of media in request + * @param {string} defaultCur - currency which support bidder + * @returns {number} Parsed float bid floor price + */ +function getFloor(br, mediaType, defaultCur) { + let floor = 0.05; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(br.getFloor)) { + return floor; + } + let floorObj = br.getFloor({ + currency: defaultCur, + mediaType, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorObj) && !isNaN(parseFloat(floorObj.floor))) { + floor = parseFloat(floorObj.floor) || floor; + } + return floor; +} + +/** + * Builds site object + * @param {object} br - The bid request, request - bidderRequest data + * @param {object} request - bidderRequest data + * @returns {object} The site request object + */ +function prepareSite(br, request) { + let siteObj = {}; + siteObj.publisher = { + id: br.params.placementId.toString() + }; + siteObj.domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)(request.refererInfo.page || request.refererInfo.topmostLocation).hostname; + siteObj.page = request.refererInfo.page || request.refererInfo.topmostLocation; + if (request.refererInfo.ref) { + siteObj.ref = request.refererInfo.ref; + } + return siteObj; +} + +/** + * Adds privacy data to request object + * @param {object} data - The request object to bidder + * @param {object} request - bidderRequest data + * @returns {boolean} Response with true once finish + */ +function prepareConsents(data, request) { + if (request.gdprConsent !== undefined) { + data.regs.ext.gdpr = request.gdprConsent.gdprApplies ? 1 : 0; + data.user.ext.consent = request.gdprConsent.consentString ? request.gdprConsent.consentString : ''; + } + if (request.uspConsent !== undefined) { + data.regs.ext.us_privacy = request.uspConsent; + } + return true; +} + +/** + * Adds Eids object to request object + * @param {object} data - The request object to bidder + * @param {object} br - The bid request + * @returns {boolean} Response with true once finish + */ +function prepareEids(data, br) { + if (br.userIdAsEids !== undefined) { + data.user.ext.eids = br.userIdAsEids; + } + return true; +} + +/***/ }), + +/***/ "./libraries/braveUtils/nativeAssets.js": +/*!**********************************************!*\ + !*** ./libraries/braveUtils/nativeAssets.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NATIVE_ASSETS: () => (/* binding */ NATIVE_ASSETS), +/* harmony export */ NATIVE_ASSETS_IDS: () => (/* binding */ NATIVE_ASSETS_IDS) +/* harmony export */ }); +/** + * IDs and asset types for native ad assets. + */ +const NATIVE_ASSETS_IDS = { + 1: 'title', + 2: 'icon', + 3: 'image', + 4: 'body', + 5: 'sponsoredBy', + 6: 'cta' +}; + +/** + * Native assets definition for mapping purposes. + */ +const NATIVE_ASSETS = { + title: { + id: 1, + name: 'title' + }, + icon: { + id: 2, + type: 1, + name: 'img' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + body: { + id: 4, + type: 2, + name: 'data' + }, + sponsoredBy: { + id: 5, + type: 1, + name: 'data' + }, + cta: { + id: 6, + type: 12, + name: 'data' + } +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediaImpactUtils"],{ + +/***/ "./libraries/mediaImpactUtils/index.js": +/*!*********************************************!*\ + !*** ./libraries/mediaImpactUtils/index.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildBidRequestsAndParams: () => (/* binding */ buildBidRequestsAndParams), +/* harmony export */ buildEndpointUrl: () => (/* binding */ buildEndpointUrl), +/* harmony export */ postRequest: () => (/* binding */ postRequest) +/* harmony export */ }); +/* unused harmony export joinSizesToString */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); + + + +/** + * Builds the bid requests and beacon parameters. + * @param {Array} validBidRequests - The array of valid bid requests. + * @param {string} referer - The referer URL. + * @returns {Object} - An object containing bidRequests and beaconParams. + */ +function buildBidRequestsAndParams(validBidRequests, referer) { + const bidRequests = []; + const beaconParams = { + tag: [], + partner: [], + sizes: [], + referer: encodeURIComponent(referer) + }; + validBidRequests.forEach(function (validBidRequest) { + const sizes = validBidRequest.params.sizes || validBidRequest.sizes; + const bidRequestObject = { + adUnitCode: validBidRequest.adUnitCode, + sizes: sizes, + bidId: validBidRequest.bidId, + referer: referer + }; + if (parseInt(validBidRequest.params.unitId)) { + bidRequestObject.unitId = parseInt(validBidRequest.params.unitId); + beaconParams.tag.push(validBidRequest.params.unitId); + } + if (parseInt(validBidRequest.params.partnerId)) { + bidRequestObject.unitId = 0; + bidRequestObject.partnerId = parseInt(validBidRequest.params.partnerId); + beaconParams.partner.push(validBidRequest.params.partnerId); + } + bidRequests.push(bidRequestObject); + beaconParams.sizes.push(joinSizesToString(sizes)); + }); + + // Finalize beaconParams + if (beaconParams.partner.length > 0) { + beaconParams.partner = beaconParams.partner.join(','); + } else { + delete beaconParams.partner; + } + beaconParams.tag = beaconParams.tag.join(','); + beaconParams.sizes = beaconParams.sizes.join(','); + return { + bidRequests, + beaconParams + }; +} +function joinSizesToString(sizes) { + return sizes.map(size => size.join('x')).join('|'); +} +function postRequest(endpoint, data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax)(endpoint, null, data, { + method: 'POST' + }); +} +function buildEndpointUrl(protocol, hostname, pathname, searchParams) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol, + hostname, + pathname, + search: searchParams + }); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["video"],{ + +/***/ "./libraries/video/constants/constants.js": +/*!************************************************!*\ + !*** ./libraries/video/constants/constants.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PLAYBACK_MODE: () => (/* binding */ PLAYBACK_MODE), +/* harmony export */ videoKey: () => (/* binding */ videoKey) +/* harmony export */ }); +const videoKey = 'video'; +const PLAYBACK_MODE = { + VOD: 0, + LIVE: 1, + DVR: 2 +}; + +/***/ }), + +/***/ "./libraries/video/constants/events.js": +/*!*********************************************!*\ + !*** ./libraries/video/constants/events.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AD_BREAK_END: () => (/* binding */ AD_BREAK_END), +/* harmony export */ AD_BREAK_START: () => (/* binding */ AD_BREAK_START), +/* harmony export */ AD_CLICK: () => (/* binding */ AD_CLICK), +/* harmony export */ AD_COMPLETE: () => (/* binding */ AD_COMPLETE), +/* harmony export */ AD_ERROR: () => (/* binding */ AD_ERROR), +/* harmony export */ AD_IMPRESSION: () => (/* binding */ AD_IMPRESSION), +/* harmony export */ AD_LOADED: () => (/* binding */ AD_LOADED), +/* harmony export */ AD_PAUSE: () => (/* binding */ AD_PAUSE), +/* harmony export */ AD_PLAY: () => (/* binding */ AD_PLAY), +/* harmony export */ AD_REQUEST: () => (/* binding */ AD_REQUEST), +/* harmony export */ AD_SKIPPED: () => (/* binding */ AD_SKIPPED), +/* harmony export */ AD_STARTED: () => (/* binding */ AD_STARTED), +/* harmony export */ AD_TIME: () => (/* binding */ AD_TIME), +/* harmony export */ AUCTION_AD_LOAD_ABORT: () => (/* binding */ AUCTION_AD_LOAD_ABORT), +/* harmony export */ AUCTION_AD_LOAD_ATTEMPT: () => (/* binding */ AUCTION_AD_LOAD_ATTEMPT), +/* harmony export */ AUCTION_AD_LOAD_QUEUED: () => (/* binding */ AUCTION_AD_LOAD_QUEUED), +/* harmony export */ AUTOSTART_BLOCKED: () => (/* binding */ AUTOSTART_BLOCKED), +/* harmony export */ BID_ERROR: () => (/* binding */ BID_ERROR), +/* harmony export */ BID_IMPRESSION: () => (/* binding */ BID_IMPRESSION), +/* harmony export */ BUFFER: () => (/* binding */ BUFFER), +/* harmony export */ CAST: () => (/* binding */ CAST), +/* harmony export */ COMPLETE: () => (/* binding */ COMPLETE), +/* harmony export */ CONTENT_LOADED: () => (/* binding */ CONTENT_LOADED), +/* harmony export */ DESTROYED: () => (/* binding */ DESTROYED), +/* harmony export */ ERROR: () => (/* binding */ ERROR), +/* harmony export */ FULLSCREEN: () => (/* binding */ FULLSCREEN), +/* harmony export */ MUTE: () => (/* binding */ MUTE), +/* harmony export */ PAUSE: () => (/* binding */ PAUSE), +/* harmony export */ PLAY: () => (/* binding */ PLAY), +/* harmony export */ PLAYBACK_REQUEST: () => (/* binding */ PLAYBACK_REQUEST), +/* harmony export */ PLAYER_RESIZE: () => (/* binding */ PLAYER_RESIZE), +/* harmony export */ PLAYLIST: () => (/* binding */ PLAYLIST), +/* harmony export */ PLAYLIST_COMPLETE: () => (/* binding */ PLAYLIST_COMPLETE), +/* harmony export */ PLAY_ATTEMPT_FAILED: () => (/* binding */ PLAY_ATTEMPT_FAILED), +/* harmony export */ RENDITION_UPDATE: () => (/* binding */ RENDITION_UPDATE), +/* harmony export */ SEEK_END: () => (/* binding */ SEEK_END), +/* harmony export */ SEEK_START: () => (/* binding */ SEEK_START), +/* harmony export */ SETUP_COMPLETE: () => (/* binding */ SETUP_COMPLETE), +/* harmony export */ SETUP_FAILED: () => (/* binding */ SETUP_FAILED), +/* harmony export */ TIME: () => (/* binding */ TIME), +/* harmony export */ VIEWABLE: () => (/* binding */ VIEWABLE), +/* harmony export */ VOLUME: () => (/* binding */ VOLUME), +/* harmony export */ videoEvents: () => (/* binding */ videoEvents) +/* harmony export */ }); +/* unused harmony export allVideoEvents */ +// Life Cycle +const SETUP_COMPLETE = 'setupComplete'; +const SETUP_FAILED = 'setupFailed'; +const DESTROYED = 'destroyed'; + +// Ads +const AD_REQUEST = 'adRequest'; +const AD_BREAK_START = 'adBreakStart'; +const AD_LOADED = 'adLoaded'; +const AD_STARTED = 'adStarted'; +const AD_IMPRESSION = 'adImpression'; +const AD_PLAY = 'adPlay'; +const AD_TIME = 'adTime'; +const AD_PAUSE = 'adPause'; +const AD_CLICK = 'adClick'; +const AD_SKIPPED = 'adSkipped'; +const AD_ERROR = 'adError'; +const AD_COMPLETE = 'adComplete'; +const AD_BREAK_END = 'adBreakEnd'; + +// Media +const PLAYLIST = 'playlist'; +const PLAYBACK_REQUEST = 'playbackRequest'; +const AUTOSTART_BLOCKED = 'autostartBlocked'; +const PLAY_ATTEMPT_FAILED = 'playAttemptFailed'; +const CONTENT_LOADED = 'contentLoaded'; +const PLAY = 'play'; +const PAUSE = 'pause'; +const BUFFER = 'buffer'; +const TIME = 'time'; +const SEEK_START = 'seekStart'; +const SEEK_END = 'seekEnd'; +const MUTE = 'mute'; +const VOLUME = 'volume'; +const RENDITION_UPDATE = 'renditionUpdate'; +const ERROR = 'error'; +const COMPLETE = 'complete'; +const PLAYLIST_COMPLETE = 'playlistComplete'; + +// Layout +const FULLSCREEN = 'fullscreen'; +const PLAYER_RESIZE = 'playerResize'; +const VIEWABLE = 'viewable'; +const CAST = 'cast'; +const allVideoEvents = [SETUP_COMPLETE, SETUP_FAILED, DESTROYED, AD_REQUEST, AD_BREAK_START, AD_LOADED, AD_STARTED, AD_IMPRESSION, AD_PLAY, AD_TIME, AD_PAUSE, AD_CLICK, AD_SKIPPED, AD_ERROR, AD_COMPLETE, AD_BREAK_END, PLAYLIST, PLAYBACK_REQUEST, AUTOSTART_BLOCKED, PLAY_ATTEMPT_FAILED, CONTENT_LOADED, PLAY, PAUSE, BUFFER, TIME, SEEK_START, SEEK_END, MUTE, VOLUME, RENDITION_UPDATE, ERROR, COMPLETE, PLAYLIST_COMPLETE, FULLSCREEN, PLAYER_RESIZE, VIEWABLE, CAST]; +const AUCTION_AD_LOAD_ATTEMPT = 'auctionAdLoadAttempt'; +const AUCTION_AD_LOAD_QUEUED = 'auctionAdLoadQueued'; +const AUCTION_AD_LOAD_ABORT = 'auctionAdLoadAbort'; +const BID_IMPRESSION = 'bidImpression'; +const BID_ERROR = 'bidError'; +const videoEvents = { + SETUP_COMPLETE, + SETUP_FAILED, + DESTROYED, + AD_REQUEST, + AD_BREAK_START, + AD_LOADED, + AD_STARTED, + AD_IMPRESSION, + AD_PLAY, + AD_TIME, + AD_PAUSE, + AD_CLICK, + AD_SKIPPED, + AD_ERROR, + AD_COMPLETE, + AD_BREAK_END, + PLAYLIST, + PLAYBACK_REQUEST, + AUTOSTART_BLOCKED, + PLAY_ATTEMPT_FAILED, + CONTENT_LOADED, + PLAY, + PAUSE, + BUFFER, + TIME, + SEEK_START, + SEEK_END, + MUTE, + VOLUME, + RENDITION_UPDATE, + ERROR, + COMPLETE, + PLAYLIST_COMPLETE, + FULLSCREEN, + PLAYER_RESIZE, + VIEWABLE, + CAST +}; + +/***/ }), + +/***/ "./libraries/video/constants/ortb.js": +/*!*******************************************!*\ + !*** ./libraries/video/constants/ortb.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AD_POSITION: () => (/* binding */ AD_POSITION), +/* harmony export */ API_FRAMEWORKS: () => (/* binding */ API_FRAMEWORKS), +/* harmony export */ PLACEMENT: () => (/* binding */ PLACEMENT), +/* harmony export */ PLAYBACK_END: () => (/* binding */ PLAYBACK_END), +/* harmony export */ PLAYBACK_METHODS: () => (/* binding */ PLAYBACK_METHODS), +/* harmony export */ PLCMT: () => (/* binding */ PLCMT), +/* harmony export */ PROTOCOLS: () => (/* binding */ PROTOCOLS), +/* harmony export */ VIDEO_MIME_TYPE: () => (/* binding */ VIDEO_MIME_TYPE), +/* harmony export */ VPAID_MIME_TYPE: () => (/* binding */ VPAID_MIME_TYPE) +/* harmony export */ }); +/* unused harmony exports JS_APP_MIME_TYPE, CONTEXT */ +/** + * @typedef {Object} OrtbParams + * @property {OrtbVideoParams} video + * @property {OrtbContentParams} content + */ + +/** + * @typedef OrtbVideoParams + * @property {[string]} mimes - Content MIME types supported (e.g., “video/x-ms-wmv”, “video/mp4”). + * @property {number|undefined} minduration - Minimum video ad duration in seconds. + * @property {number|undefined} maxduration - Maximum video ad duration in seconds. + * @property {[number]} protocols - Supported video protocols. At least one supported protocol must be specified. + * @property {number} w - Width of the video player in device independent pixels (DIPS). + * @property {number} h - Height of the video player in device independent pixels (DIPS). + * @property {number|undefined} startdelay - Indicates the offset of the ad placement. + * @property {number|undefined} placement - Legacy Placement type for the impression. + * @property {number|undefined} plcmt - Modern placement type for the impression. + * @property {number|undefined} linearity - Indicates if the impression must be linear, nonlinear, etc. If omitted, assume all are allowed. + * @property {number} skip - Indicates if the player can allow the video to be skipped, where 0 is no, 1 is yes. + * @property {number|undefined} skipmin - Only ad creatives with a duration greater than this value can be skippable; only applicable if the ad is skippable. + * @property {number|undefined} skipafter - Number of seconds a video must play before skipping is enabled; only applicable if the ad is skippable. + * @property {number|undefined} sequence - If multiple ad impressions are offered in the same bid request, the sequence number will allow for the coordinated delivery of multiple creatives. + * @property {[number]|undefined} battr - Blocked creative attributes. Use this to indicate which creatives the player does not support. + * @property {number|undefined} maxextended - Maximum extended ad duration if extension is allowed. + * @property {number|undefined} minbitrate - Minimum bit rate in Kbps supported by the player. + * @property {number|undefined} maxbitrate - Maximum bit rate in Kbps supported by the player. + * @property {number|undefined} boxingallowed - Indicates if letter-boxing of 4:3 content into a 16:9 window is allowed. 0 is no, 1 is yes. + * @property {[number]|undefined} playbackmethod - Playback methods that may be in use. + * @property {number|undefined} playbackend - The scenario that causes playback to end. + * @property {[number]|undefined} delivery - Supported delivery methods (e.g., streaming, progressive). + * @property {number|undefined} pos - Ad position on screen. + * @property {[Object]|undefined} companionad - list of companion ads. Refer to Section 3.2.6 of the oRTB v2.5 spec for the interface of the companion ad object. + * @property {[number]|undefined} api - List of supported API frameworks for this impression. + * @property {[number]|undefined} companiontype - Supported VAST companion ad types. Refer to List 5.14 of the oRTB v2.5 spec for the interface. + * @property {Object|undefined} ext - Placeholder for exchange-specific extensions to OpenRTB. + */ + +/** + * @typedef OrtbContentParams + * @property {string} id - ID uniquely identifying the content. + * @property {string} url - URL of the content, for buy-side contextualization or review. + * @property {number|undefined} episode - Episode number. + * @property {string|undefined} title - Content title. + * @property {string|undefined} series - Content series i.e. “The Office” (television), “Star Wars” (movie). + * @property {string|undefined} season - Content season (e.g., “Season 3”). + * @property {string|undefined} artist - Artist credited with the content. + * @property {string|undefined} genre - Genre that best describes the content (e.g., rock, pop, etc). + * @property {string|undefined} album - Album to which the content belongs. Typically for audio. + * @property {string|undefined} isrc - International Standard Recording Code conforming to ISO3901. + * @property {Object|undefined} producer - Details about the content Producer. For Producer interface visit Section 3.2.17 of the oRTB v2.5 spec. + * @property {[string]|undefined} cat - List of IAB content categories that describe the content. Refer to List 5.1. of the oRTB v2.5 spec for the complete list. + * @property {number|undefined} prodq - Production quality. Refer to List 5.13 of the oRTB v2.5 spec. + * @property {number|undefined} context - Type of content (game, video, text, etc.). Refer to List 5.18 of the oRTB v2.5 spec. + * @property {string|undefined} contentrating - Content rating (e.g., MPAA). + * @property {string|undefined} userrating - User rating of the content (e.g., number of stars, likes, etc.). + * @property {number|undefined} qagmediarating - Media rating per IQG guidelines. Refer to List 5.19 of the oRTB v2.5 spec. + * @property {string|undefined} keywords - Comma separated list of keywords describing the content. + * @property {number|undefined} livestream - Whether the stream is live or not. 0 means not live (VOD), 1 means content is live streaming. + * @property {number|undefined} sourcerelationship - 0 means indirect, 1 means direct. + * @property {number} len - Duration of content in seconds. + * @property {string|undefined} language - Content language using ISO-639-1-alpha-2. + * @property {number|undefined} embeddable - Indicator of whether or not the content is embeddable (e.g., an embeddable video player). 0 means no, 1 means yes. + * @property {[Object]|undefined} data - Additional content data. Each Data object represents a different data source. See Section 3.2.21 of the oRTB v2.5 spec. + * @property {Object|undefined} ext - Placeholder for exchange-specific extensions to OpenRTB. + */ + +const VIDEO_PREFIX = 'video/'; +const APPLICATION_PREFIX = 'application/'; + +/** + * ORTB 2.5 section 3.2.7 - Video.mimes + * @enum OrtbVideoParams.mimes + */ +const VIDEO_MIME_TYPE = { + MP4: VIDEO_PREFIX + 'mp4', + MPEG: VIDEO_PREFIX + 'mpeg', + OGG: VIDEO_PREFIX + 'ogg', + WEBM: VIDEO_PREFIX + 'webm', + AAC: VIDEO_PREFIX + 'aac', + HLS: APPLICATION_PREFIX + 'vnd.apple.mpegurl' +}; +const JS_APP_MIME_TYPE = APPLICATION_PREFIX + 'javascript'; +const VPAID_MIME_TYPE = JS_APP_MIME_TYPE; + +/** + * ORTB 2.5 section 5.9 - Video Placement Types + * @enum OrtbVideoParams.placement + */ +const PLACEMENT = { + INSTREAM: 1, + BANNER: 2, + ARTICLE: 3, + FEED: 4, + INTERSTITIAL: 5, + SLIDER: 5, + FLOATING: 5, + INTERSTITIAL_SLIDER_FLOATING: 5 +}; + +/** + * ADCOM - https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md#list_plcmtsubtypesvideo + * @enum OrtbVideoParams.plcmt + */ +const PLCMT = { + INSTREAM: 1, + ACCOMPANYING_CONTENT: 2, + INTERSTITIAL: 3, + OUTSTREAM: 4, + NO_CONTENT: 4 +}; + +/** + * ORTB 2.5 section 5.4 - Ad Position + * @enum OrtbVideoParams.pos + */ +const AD_POSITION = { + UNKNOWN: 0, + ABOVE_THE_FOLD: 1, + BELOW_THE_FOLD: 3, + HEADER: 4, + FOOTER: 5, + SIDEBAR: 6, + FULL_SCREEN: 7 +}; + +/** + * ORTB 2.5 section 5.11 - Playback Cessation Modes + * @enum OrtbVideoParams.playbackend + */ +const PLAYBACK_END = { + VIDEO_COMPLETION: 1, + VIEWPORT_LEAVE: 2, + FLOATING: 3 +}; + +/** + * ORTB 2.5 section 5.10 - Playback Methods + * @enum OrtbVideoParams.playbackmethod + */ +const PLAYBACK_METHODS = { + AUTOPLAY: 1, + AUTOPLAY_MUTED: 2, + CLICK_TO_PLAY: 3, + CLICK_TO_PLAY_MUTED: 4, + VIEWABLE: 5, + VIEWABLE_MUTED: 6 +}; + +/** + * ORTB 2.5 section 5.8 - Protocols + * @enum OrtbVideoParams.protocols + */ +const PROTOCOLS = { + // VAST_1_0: 1, + VAST_2_0: 2, + VAST_3_0: 3, + // VAST_1_O_WRAPPER: 4, + VAST_2_0_WRAPPER: 5, + VAST_3_0_WRAPPER: 6, + VAST_4_0: 7, + VAST_4_0_WRAPPER: 8 +}; + +/** + * ORTB 2.5 section 5.6 - API Frameworks + * @enum OrtbVideoParams.api + */ +const API_FRAMEWORKS = { + VPAID_1_0: 1, + VPAID_2_0: 2, + OMID_1_0: 7 +}; + +/** + * ORTB 2.5 section 5.18 - Content Context + * @enum OrtbContentParams.context + */ +const CONTEXT = { + VIDEO: 1, + AUDIO: 3 +}; + +/***/ }), + +/***/ "./libraries/video/constants/vendorCodes.js": +/*!**************************************************!*\ + !*** ./libraries/video/constants/vendorCodes.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AD_PLAYER_PRO_VENDOR: () => (/* binding */ AD_PLAYER_PRO_VENDOR), +/* harmony export */ GAM_VENDOR: () => (/* binding */ GAM_VENDOR), +/* harmony export */ JWPLAYER_VENDOR: () => (/* binding */ JWPLAYER_VENDOR), +/* harmony export */ VIDEO_JS_VENDOR: () => (/* binding */ VIDEO_JS_VENDOR) +/* harmony export */ }); +// Video Vendors +const JWPLAYER_VENDOR = 1; +const VIDEO_JS_VENDOR = 2; +const AD_PLAYER_PRO_VENDOR = 3; + +// Ad Server Vendors +const GAM_VENDOR = 'gam'; + +/***/ }), + +/***/ "./libraries/video/shared/eventHandler.js": +/*!************************************************!*\ + !*** ./libraries/video/shared/eventHandler.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getEventHandler: () => (/* binding */ getEventHandler) +/* harmony export */ }); +/** + * Builds a standard event handler + * @param {String} type Event name + * @param {(function(String, Object): Object)} callback Callback defined by publisher to be executed when the event occurs + * @param {Object} payload Base payload defined when the event is registered + * @param {(function(*): Object)|null|undefined} getExtraPayload Parses the player's event payload to return a normalized payload + * @returns {(function(*): void)|*} event handler + */ +function getEventHandler(type, callback, payload, getExtraPayload) { + return event => { + if (getExtraPayload) { + const extraPayload = getExtraPayload(event); + Object.assign(payload, extraPayload); + } + callback(type, payload); + }; +} + +/***/ }), + +/***/ "./libraries/video/shared/helpers.js": +/*!*******************************************!*\ + !*** ./libraries/video/shared/helpers.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getExternalVideoEventName: () => (/* binding */ getExternalVideoEventName), +/* harmony export */ getExternalVideoEventPayload: () => (/* binding */ getExternalVideoEventPayload) +/* harmony export */ }); +/* harmony import */ var _constants_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constants.js */ "./libraries/video/constants/constants.js"); + +function getExternalVideoEventName(eventName) { + if (!eventName) { + return ''; + } + return _constants_constants_js__WEBPACK_IMPORTED_MODULE_0__.videoKey + eventName.replace(/^./, eventName[0].toUpperCase()); +} +function getExternalVideoEventPayload(eventName, payload) { + if (!payload) { + payload = {}; + } + if (!payload.type) { + payload.type = eventName; + } + return payload; +} + +/***/ }), + +/***/ "./libraries/video/shared/parentModule.js": +/*!************************************************!*\ + !*** ./libraries/video/shared/parentModule.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ParentModule: () => (/* binding */ ParentModule), +/* harmony export */ SubmoduleBuilder: () => (/* binding */ SubmoduleBuilder) +/* harmony export */ }); +/** + * @typedef {Object} ParentModule + * @summary abstraction for any module to store and reference its submodules + * @param {SubmoduleBuilder} submoduleBuilder_ + * @returns {ParentModule} + * @class + */ +function ParentModule(submoduleBuilder_) { + const submoduleBuilder = submoduleBuilder_; + const submodules = {}; + + /** + * @function ParentModule#registerSubmodule + * @summary Stores a submodule + * @param {String} id - unique identifier of the submodule instance + * @param {String} vendorCode - identifier to the submodule type that must be built + * @param {Object} config - additional information necessary to instantiate the submodule + */ + function registerSubmodule(id, vendorCode, config) { + if (submodules[id]) { + return; + } + let submodule; + try { + submodule = submoduleBuilder.build(vendorCode, config); + } catch (e) { + throw e; + } + submodules[id] = submodule; + } + + /** + * @function ParentModule#getSubmodule + * @summary Stores a submodule + * @param {String} id - unique identifier of the submodule instance + * @returns {Object} - a submodule instance + */ + function getSubmodule(id) { + return submodules[id]; + } + return { + registerSubmodule, + getSubmodule + }; +} + +/** + * @typedef {import('../../../modules/videoModule/coreVideo.js').vendorSubmoduleDirectory} vendorSubmoduleDirectory + * @typedef {Object} SubmoduleBuilder + * @summary Instantiates submodules + * @param {vendorSubmoduleDirectory} submoduleDirectory_ + * @param {Object|null|undefined} sharedUtils_ + * @returns {SubmoduleBuilder} + * @class + */ +function SubmoduleBuilder(submoduleDirectory_, sharedUtils_) { + const submoduleDirectory = submoduleDirectory_; + const sharedUtils = sharedUtils_; + + /** + * @function SubmoduleBuilder#build + * @param vendorCode - identifier to the submodule type that must be instantiated + * @param config - additional information necessary to instantiate the submodule + * @throws + * @returns {{init}|*} - a submodule instance + */ + function build(vendorCode, config) { + const submoduleFactory = submoduleDirectory[vendorCode]; + if (!submoduleFactory) { + throw new Error('Unrecognized submodule vendor code: ' + vendorCode); + } + const submodule = submoduleFactory(config, sharedUtils); + return submodule; + } + return { + build + }; +} + +/***/ }), + +/***/ "./libraries/video/shared/state.js": +/*!*****************************************!*\ + !*** ./libraries/video/shared/state.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ stateFactory) +/* harmony export */ }); +/** + * @typedef {Object} State + * @summary simple state object. Can be subclassed + * @function updateState + * @function getState + * @function clearState + */ + +/** + * @summary factory to create a simple state object + * @returns {State} + */ +function stateFactory() { + let state = {}; + + /** + * @function State#updateState + * @summary updates the state + * @param {Object} stateUpdate + */ + function updateState(stateUpdate) { + Object.assign(state, stateUpdate); + } + + /** + * @function State#getState + * @summary provides the current state + * @returns {Object} the current state + */ + function getState() { + return state; + } + + /** + * @function State#clearState + * @summary erases the current state + */ + function clearState() { + state = {}; + } + return { + updateState, + getState, + clearState + }; +} + +/***/ }), + +/***/ "./libraries/video/shared/vastXmlBuilder.js": +/*!**************************************************!*\ + !*** ./libraries/video/shared/vastXmlBuilder.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildVastWrapper: () => (/* binding */ buildVastWrapper), +/* harmony export */ getErrorNode: () => (/* binding */ getErrorNode), +/* harmony export */ getImpressionNode: () => (/* binding */ getImpressionNode) +/* harmony export */ }); +/* unused harmony exports getVastNode, getAdNode, getWrapperNode, getAdSystemNode, getAdTagUriNode */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); + +function buildVastWrapper(adId, adTagUrl, impressionUrl, impressionId, errorUrl) { + let wrapperBody = getAdSystemNode('Prebid org', (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().version); + if (adTagUrl) { + wrapperBody += getAdTagUriNode(adTagUrl); + } + if (impressionUrl) { + wrapperBody += getImpressionNode(impressionUrl, impressionId); + } + if (errorUrl) { + wrapperBody += getErrorNode(errorUrl); + } + return getVastNode(getAdNode(getWrapperNode(wrapperBody), adId), '4.2'); +} +function getVastNode(body, vastVersion) { + return getNode('VAST', body, { + version: vastVersion + }); +} +function getAdNode(body, adId) { + return getNode('Ad', body, { + id: adId + }); +} +function getWrapperNode(body) { + return getNode('Wrapper', body); +} +function getAdSystemNode(system, version) { + return getNode('AdSystem', system, { + version + }); +} +function getAdTagUriNode(adTagUrl) { + return getUrlNode('VASTAdTagURI', adTagUrl); +} +function getImpressionNode(pingUrl, id) { + return getUrlNode('Impression', pingUrl, { + id + }); +} +function getErrorNode(pingUrl) { + return getUrlNode('Error', pingUrl); +} + +// Helpers + +function getUrlNode(labelName, url, attributes) { + const body = ``; + return getNode(labelName, body, attributes); +} +function getNode(labelName, body, attributes) { + const openingLabel = getOpeningLabel(labelName, attributes); + return `<${openingLabel}>${body}`; +} + +/* +attributes is a KVP Object. + */ +function getOpeningLabel(name, attributes) { + if (!attributes) { + return name; + } + return Object.keys(attributes).reduce((label, key) => { + const value = attributes[key]; + if (!value) { + return label; + } + return label + ` ${key}="${value}"`; + }, name); +} + +/***/ }), + +/***/ "./libraries/video/shared/vastXmlEditor.js": +/*!*************************************************!*\ + !*** ./libraries/video/shared/vastXmlEditor.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ vastXmlEditorFactory: () => (/* binding */ vastXmlEditorFactory) +/* harmony export */ }); +/* unused harmony export VastXmlEditor */ +/* harmony import */ var _xmlUtils_xmlUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../xmlUtils/xmlUtils.js */ "./libraries/xmlUtils/xmlUtils.js"); +/* harmony import */ var _vastXmlBuilder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./vastXmlBuilder.js */ "./libraries/video/shared/vastXmlBuilder.js"); + + +function VastXmlEditor(xmlUtil_) { + const xmlUtil = xmlUtil_; + function getVastXmlWithTracking(vastXml, adId, impressionUrl, impressionId, errorUrl) { + const impressionDoc = getImpressionDoc(impressionUrl, impressionId); + const errorDoc = getErrorDoc(errorUrl); + if (!adId && !impressionDoc && !errorDoc) { + return vastXml; + } + const vastXmlDoc = xmlUtil.parse(vastXml); + appendTrackingNodes(vastXmlDoc, impressionDoc, errorDoc); + replaceAdId(vastXmlDoc, adId); + return xmlUtil.serialize(vastXmlDoc); + } + function appendTrackingNodes(vastXmlDoc, impressionDoc, errorDoc) { + const nodes = vastXmlDoc.querySelectorAll('InLine,Wrapper'); + const nodeCount = nodes.length; + for (let i = 0; i < nodeCount; i++) { + const node = nodes[i]; + // A copy of the child is required until we reach the last node. + const requiresCopy = i < nodeCount - 1; + appendChild(node, impressionDoc, requiresCopy); + appendChild(node, errorDoc, requiresCopy); + } + } + function replaceAdId(vastXmlDoc, adId) { + if (!adId) { + return; + } + const adNode = vastXmlDoc.querySelector('Ad'); + if (!adNode) { + return; + } + adNode.id = adId; + } + return { + getVastXmlWithTracking, + buildVastWrapper: _vastXmlBuilder_js__WEBPACK_IMPORTED_MODULE_0__.buildVastWrapper + }; + function getImpressionDoc(impressionUrl, impressionId) { + if (!impressionUrl) { + return; + } + const impressionNode = (0,_vastXmlBuilder_js__WEBPACK_IMPORTED_MODULE_0__.getImpressionNode)(impressionUrl, impressionId); + return xmlUtil.parse(impressionNode); + } + function getErrorDoc(errorUrl) { + if (!errorUrl) { + return; + } + const errorNode = (0,_vastXmlBuilder_js__WEBPACK_IMPORTED_MODULE_0__.getErrorNode)(errorUrl); + return xmlUtil.parse(errorNode); + } + function appendChild(node, child, copy) { + if (!child) { + return; + } + const doc = copy ? child.cloneNode(true) : child; + node.appendChild(doc.documentElement); + } +} +function vastXmlEditorFactory() { + return VastXmlEditor((0,_xmlUtils_xmlUtils_js__WEBPACK_IMPORTED_MODULE_1__["default"])()); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["keywords"],{ + +/***/ "./libraries/keywords/keywords.js": +/*!****************************************!*\ + !*** ./libraries/keywords/keywords.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getAllOrtbKeywords: () => (/* binding */ getAllOrtbKeywords) +/* harmony export */ }); +/* unused harmony export mergeKeywords */ +/* harmony import */ var _src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/fpd/oneClient.js */ "./src/fpd/oneClient.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); + + +const ORTB_KEYWORDS_PATHS = ['user.keywords'].concat(_src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_0__.CLIENT_SECTIONS.flatMap(prefix => ['keywords', 'content.keywords'].map(suffix => `${prefix}.${suffix}`))); + +/** + * @param commaSeparatedKeywords any number of either keyword arrays, or comma-separated keyword strings + * @returns an array with all unique keywords contained across all inputs + */ +function mergeKeywords() { + const keywords = new Set(); + for (var _len = arguments.length, commaSeparatedKeywords = new Array(_len), _key = 0; _key < _len; _key++) { + commaSeparatedKeywords[_key] = arguments[_key]; + } + commaSeparatedKeywords.filter(kwds => kwds).flatMap(kwds => Array.isArray(kwds) ? kwds : kwds.split(',')).map(kw => kw.replace(/^\s*/, '').replace(/\s*$/, '')).filter(kw => kw).forEach(kw => keywords.add(kw)); + return Array.from(keywords.keys()); +} + +/** + * Get an array with all keywords contained in an ortb2 object. + */ +function getAllOrtbKeywords(ortb2) { + for (var _len2 = arguments.length, extraCommaSeparatedKeywords = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + extraCommaSeparatedKeywords[_key2 - 1] = arguments[_key2]; + } + return mergeKeywords(...ORTB_KEYWORDS_PATHS.map(path => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(ortb2, path)), ...extraCommaSeparatedKeywords); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["chunk"],{ + +/***/ "./libraries/chunk/chunk.js": +/*!**********************************!*\ + !*** ./libraries/chunk/chunk.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ chunk: () => (/* binding */ chunk) +/* harmony export */ }); +/** + * http://npm.im/chunk + * Returns an array with *size* chunks from given array + * + * Example: + * ['a', 'b', 'c', 'd', 'e'] chunked by 2 => + * [['a', 'b'], ['c', 'd'], ['e']] + */ +function chunk(array, size) { + let newArray = []; + for (let i = 0; i < Math.ceil(array.length / size); i++) { + let start = i * size; + let end = start + size; + newArray.push(array.slice(start, end)); + } + return newArray; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["appnexusUtils"],{ + +/***/ "./libraries/appnexusUtils/anKeywords.js": +/*!***********************************************!*\ + !*** ./libraries/appnexusUtils/anKeywords.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ convertKeywordStringToANMap: () => (/* binding */ convertKeywordStringToANMap), +/* harmony export */ getANKewyordParamFromMaps: () => (/* binding */ getANKewyordParamFromMaps), +/* harmony export */ getANKeywordParam: () => (/* binding */ getANKeywordParam) +/* harmony export */ }); +/* unused harmony exports transformBidderParamKeywords, getANMapFromOrtbKeywords, getANMapFromOrtbSegments */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _keywords_keywords_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../keywords/keywords.js */ "./libraries/keywords/keywords.js"); +/* harmony import */ var _src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/fpd/oneClient.js */ "./src/fpd/oneClient.js"); + + + +const ORTB_SEGTAX_KEY_MAP = { + 526: '1plusX', + 527: '1plusX', + 541: 'captify_segments', + 540: 'perid' +}; +const ORTB_SEG_PATHS = ['user.data'].concat(_src_fpd_oneClient_js__WEBPACK_IMPORTED_MODULE_0__.CLIENT_SECTIONS.map(prefix => `${prefix}.content.data`)); +function getValueString(param, val, defaultValue) { + if (val === undefined || val === null) { + return defaultValue; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(val)) { + return val; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(val)) { + return val.toString(); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Unsuported type for param: ' + param + ' required type: String'); +} + +/** + * Converts an object of arrays (either strings or numbers) into an array of objects containing key and value properties + * normally read from bidder params + * eg { foo: ['bar', 'baz'], fizz: ['buzz'] } + * becomes [{ key: 'foo', value: ['bar', 'baz']}, {key: 'fizz', value: ['buzz']}] + * @param {Object} keywords object of arrays representing keyvalue pairs + * @param {string} paramName name of parent object (eg 'keywords') containing keyword data, used in error handling + * @returns {Array<{key, value}>} + */ +function transformBidderParamKeywords(keywords) { + let paramName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'keywords'; + const arrs = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(keywords, (v, k) => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(v)) { + let values = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(v, val => { + val = getValueString(paramName + '.' + k, val); + if (val || val === '') { + values.push(val); + } + }); + v = values; + } else { + v = getValueString(paramName + '.' + k, v); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(v)) { + v = [v]; + } else { + return; + } // unsuported types - don't send a key + } + v = v.filter(kw => kw !== ''); + const entry = { + key: k + }; + if (v.length > 0) { + entry.value = v; + } + arrs.push(entry); + }); + return arrs; +} + +// converts a comma separated list of keywords into the standard keyword object format used in appnexus bid params +// 'genre=rock,genre=pop,pets=dog,music' goes to { 'genre': ['rock', 'pop'], 'pets': ['dog'], 'music': [''] } +function convertKeywordStringToANMap(keyStr) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(keyStr) && keyStr !== '') { + // will split based on commas and will eat white space before/after the comma + return convertKeywordsToANMap(keyStr.split(/\s*(?:,)\s*/)); + } else { + return {}; + } +} + +/** + * @param {Array} kwarray keywords as an array of strings + * @return {{}} appnexus-style keyword map + */ +function convertKeywordsToANMap(kwarray) { + const result = {}; + kwarray.forEach(kw => { + // if = exists, then split + if (kw.indexOf('=') !== -1) { + let kwPair = kw.split('='); + let key = kwPair[0]; + let val = kwPair[1]; + + // then check for existing key in result > if so add value to the array > if not, add new key and create value array + if (result.hasOwnProperty(key)) { + result[key].push(val); + } else { + result[key] = [val]; + } + } else { + if (!result.hasOwnProperty(kw)) { + result[kw] = []; + } + } + }); + return result; +} + +/** + * @param ortb2 + * @return {{}} appnexus-style keyword map using all keywords contained in ortb2 + */ +function getANMapFromOrtbKeywords(ortb2) { + return convertKeywordsToANMap((0,_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_2__.getAllOrtbKeywords)(ortb2)); +} +function getANKewyordParamFromMaps() { + for (var _len = arguments.length, anKeywordMaps = new Array(_len), _key = 0; _key < _len; _key++) { + anKeywordMaps[_key] = arguments[_key]; + } + return transformBidderParamKeywords((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(...anKeywordMaps.map(kwMap => Object.fromEntries(Object.entries(kwMap || {}).map(_ref => { + let [k, v] = _ref; + return [k, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(v) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(v) ? [v] : v]; + }))))); +} +function getANKeywordParam(ortb2) { + for (var _len2 = arguments.length, anKeywordsMaps = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + anKeywordsMaps[_key2 - 1] = arguments[_key2]; + } + return getANKewyordParamFromMaps(getANMapFromOrtbKeywords(ortb2), getANMapFromOrtbSegments(ortb2), ...anKeywordsMaps); +} +function getANMapFromOrtbSegments(ortb2) { + let ortbSegData = {}; + ORTB_SEG_PATHS.forEach(path => { + let ortbSegsArrObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2, path) || []; + ortbSegsArrObj.forEach(segObj => { + // only read segment data from known sources + const segtax = ORTB_SEGTAX_KEY_MAP[segObj?.ext?.segtax]; + if (segtax) { + segObj.segment.forEach(seg => { + // if source was in multiple locations of ortb or had multiple segments in same area, stack them together into an array + if (ortbSegData[segtax]) { + ortbSegData[segtax].push(seg.id); + } else { + ortbSegData[segtax] = [seg.id]; + } + }); + } + }); + }); + return ortbSegData; +} + +/***/ }), + +/***/ "./libraries/appnexusUtils/anUtils.js": +/*!********************************************!*\ + !*** ./libraries/appnexusUtils/anUtils.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ appnexusAliases: () => (/* binding */ appnexusAliases), +/* harmony export */ convertCamelToUnderscore: () => (/* binding */ convertCamelToUnderscore), +/* harmony export */ fill: () => (/* binding */ fill) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/** + * Converts a string value in camel-case to underscore eg 'placementId' becomes 'placement_id' + * @param {string} value string value to convert + */ + +function convertCamelToUnderscore(value) { + return value.replace(/(?:^|\.?)([A-Z])/g, function (x, y) { + return '_' + y.toLowerCase(); + }).replace(/^_/, ''); +} +const appnexusAliases = [{ + code: 'appnexusAst', + gvlid: 32 +}, { + code: 'emxdigital', + gvlid: 183 +}, { + code: 'emetriq', + gvlid: 213 +}, { + code: 'pagescience', + gvlid: 32 +}, { + code: 'gourmetads', + gvlid: 32 +}, { + code: 'matomy', + gvlid: 32 +}, { + code: 'featureforward', + gvlid: 32 +}, { + code: 'oftmedia', + gvlid: 32 +}, { + code: 'adasta', + gvlid: 32 +}, { + code: 'beintoo', + gvlid: 618 +}, { + code: 'projectagora', + gvlid: 1032 +}, { + code: 'stailamedia', + gvlid: 32 +}, { + code: 'uol', + gvlid: 32 +}, { + code: 'adzymic', + gvlid: 723 +}]; + +/** + * Creates an array of n length and fills each item with the given value + */ +function fill(value, length) { + let newArray = []; + for (let i = 0; i < length; i++) { + let valueToPush = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(value) ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(value) : value; + newArray.push(valueToPush); + } + return newArray; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adtelligentUtils"],{ + +/***/ "./libraries/adtelligentUtils/adtelligentUtils.js": +/*!********************************************************!*\ + !*** ./libraries/adtelligentUtils/adtelligentUtils.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createTag: () => (/* binding */ createTag), +/* harmony export */ getUserSyncsFn: () => (/* binding */ getUserSyncsFn), +/* harmony export */ isBidRequestValid: () => (/* binding */ isBidRequestValid), +/* harmony export */ supportedMediaTypes: () => (/* binding */ supportedMediaTypes) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + +const supportedMediaTypes = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +function isBidRequestValid(bid) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.aid'); +} +function getUserSyncsFn(syncOptions, serverResponses) { + let syncsCache = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const syncs = []; + function addSyncs(bid) { + const uris = bid.cookieURLs; + const types = bid.cookieURLSTypes || []; + if (Array.isArray(uris)) { + uris.forEach((uri, i) => { + const type = types[i] || 'image'; + if (!syncOptions.pixelEnabled && type === 'image' || !syncOptions.iframeEnabled && type === 'iframe' || syncsCache[uri]) { + return; + } + syncsCache[uri] = true; + syncs.push({ + type: type, + url: uri + }); + }); + } + } + if (syncOptions.pixelEnabled || syncOptions.iframeEnabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(serverResponses) && serverResponses.forEach(response => { + if (response.body) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(response.body)) { + response.body.forEach(b => { + addSyncs(b); + }); + } else { + addSyncs(response.body); + } + } + }); + } + return syncs; +} +function createTag(bidRequests, adapterRequest) { + const tag = { + // TODO: is 'page' the right value here? + Domain: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(adapterRequest, 'refererInfo.page') + }; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + tag.Coppa = 1; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(adapterRequest, 'gdprConsent.gdprApplies')) { + tag.GDPR = 1; + tag.GDPRConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(adapterRequest, 'gdprConsent.consentString'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(adapterRequest, 'uspConsent')) { + tag.USP = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(adapterRequest, 'uspConsent'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests[0], 'schain')) { + tag.Schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests[0], 'schain'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests[0], 'userId')) { + tag.UserIds = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests[0], 'userId'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests[0], 'userIdAsEids')) { + tag.UserEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests[0], 'userIdAsEids'); + } + return tag; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["advangUtils"],{ + +/***/ "./libraries/advangUtils/index.js": +/*!****************************************!*\ + !*** ./libraries/advangUtils/index.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createRequestData: () => (/* binding */ createRequestData), +/* harmony export */ getBannerBidFloor: () => (/* binding */ getBannerBidFloor), +/* harmony export */ getBannerBidParam: () => (/* binding */ getBannerBidParam), +/* harmony export */ getBannerSizes: () => (/* binding */ getBannerSizes), +/* harmony export */ getDoNotTrack: () => (/* binding */ getDoNotTrack), +/* harmony export */ getFirstSize: () => (/* binding */ getFirstSize), +/* harmony export */ getOsVersion: () => (/* binding */ getOsVersion), +/* harmony export */ getTopWindowLocation: () => (/* binding */ getTopWindowLocation), +/* harmony export */ getVideoBidFloor: () => (/* binding */ getVideoBidFloor), +/* harmony export */ getVideoBidParam: () => (/* binding */ getVideoBidParam), +/* harmony export */ getVideoSizes: () => (/* binding */ getVideoSizes), +/* harmony export */ getVideoTargetingParams: () => (/* binding */ getVideoTargetingParams), +/* harmony export */ isBannerBid: () => (/* binding */ isBannerBid), +/* harmony export */ isBannerBidValid: () => (/* binding */ isBannerBidValid), +/* harmony export */ isConnectedTV: () => (/* binding */ isConnectedTV), +/* harmony export */ isMobile: () => (/* binding */ isMobile), +/* harmony export */ isVideoBid: () => (/* binding */ isVideoBid), +/* harmony export */ isVideoBidValid: () => (/* binding */ isVideoBidValid) +/* harmony export */ }); +/* unused harmony exports DEFAULT_MIMES, findAndFillParam, parseSizes, getTopWindowReferrer */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); + + + +const DEFAULT_MIMES = ['video/mp4', 'application/javascript']; +function isBannerBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.banner') || !isVideoBid(bid); +} +function isVideoBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video'); +} +function getBannerBidFloor(bid) { + let floorInfo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor) ? bid.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '*' + }) : {}; + return floorInfo?.floor || getBannerBidParam(bid, 'bidfloor'); +} +function getVideoBidFloor(bid) { + let floorInfo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor) ? bid.getFloor({ + currency: 'USD', + mediaType: 'video', + size: '*' + }) : {}; + return floorInfo.floor || getVideoBidParam(bid, 'bidfloor'); +} +function isVideoBidValid(bid) { + return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement'); +} +function isBannerBidValid(bid) { + return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement'); +} +function getVideoBidParam(bid, key) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.video.' + key) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.' + key); +} +function getBannerBidParam(bid, key) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.banner.' + key) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.' + key); +} +function isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +function isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +function getDoNotTrack() { + return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes'; +} +function findAndFillParam(o, key, value) { + try { + if (typeof value === 'function') { + o[key] = value(); + } else { + o[key] = value; + } + } catch (ex) {} +} +function getOsVersion() { + let clientStrings = [{ + s: 'Android', + r: /Android/ + }, { + s: 'iOS', + r: /(iPhone|iPad|iPod)/ + }, { + s: 'Mac OS X', + r: /Mac OS X/ + }, { + s: 'Mac OS', + r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ + }, { + s: 'Linux', + r: /(Linux|X11)/ + }, { + s: 'Windows 10', + r: /(Windows 10.0|Windows NT 10.0)/ + }, { + s: 'Windows 8.1', + r: /(Windows 8.1|Windows NT 6.3)/ + }, { + s: 'Windows 8', + r: /(Windows 8|Windows NT 6.2)/ + }, { + s: 'Windows 7', + r: /(Windows 7|Windows NT 6.1)/ + }, { + s: 'Windows Vista', + r: /Windows NT 6.0/ + }, { + s: 'Windows Server 2003', + r: /Windows NT 5.2/ + }, { + s: 'Windows XP', + r: /(Windows NT 5.1|Windows XP)/ + }, { + s: 'UNIX', + r: /UNIX/ + }, { + s: 'Search Bot', + r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ + }]; + let cs = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(clientStrings, cs => cs.r.test(navigator.userAgent)); + return cs ? cs.s : 'unknown'; +} +function getFirstSize(sizes) { + return sizes && sizes.length ? sizes[0] : { + w: undefined, + h: undefined + }; +} +function parseSizes(sizes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(sizes).map(size => { + let [width, height] = size.split('x'); + return { + w: parseInt(width, 10) || undefined, + h: parseInt(height, 10) || undefined + }; + }); +} +function getVideoSizes(bid) { + return parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video.playerSize') || bid.sizes); +} +function getBannerSizes(bid) { + return parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.banner.sizes') || bid.sizes); +} +function getTopWindowReferrer(bidderRequest) { + return bidderRequest?.refererInfo?.ref || ''; +} +function getTopWindowLocation(bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)(bidderRequest?.refererInfo?.page, { + decodeSearchAsString: true + }); +} +function getVideoTargetingParams(bid, VIDEO_TARGETING) { + const result = {}; + const excludeProps = ['playerSize', 'context', 'w', 'h']; + Object.keys(Object(bid.mediaTypes.video)).filter(key => !(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(excludeProps, key)).forEach(key => { + result[key] = bid.mediaTypes.video[key]; + }); + Object.keys(Object(bid.params.video)).filter(key => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(VIDEO_TARGETING, key)).forEach(key => { + result[key] = bid.params.video[key]; + }); + return result; +} +function createRequestData(bid, bidderRequest, isVideo, getBidParam, getSizes, getBidFloor, BIDDER_CODE, ADAPTER_VERSION) { + let topLocation = getTopWindowLocation(bidderRequest); + let topReferrer = getTopWindowReferrer(bidderRequest); + let paramSize = getBidParam(bid, 'size'); + let sizes = []; + let coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa'); + if (typeof paramSize !== 'undefined' && paramSize != '') { + sizes = parseSizes(paramSize); + } else { + sizes = getSizes(bid); + } + const firstSize = getFirstSize(sizes); + let floor = getBidFloor(bid) || (isVideo ? 0.5 : 0.1); + const o = { + 'device': { + 'langauge': __webpack_require__.g.navigator.language.split('-')[0], + 'dnt': __webpack_require__.g.navigator.doNotTrack === 1 ? 1 : 0, + 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2, + 'js': 1, + 'os': getOsVersion() + }, + 'at': 2, + 'site': {}, + 'tmax': Math.min(3000, bidderRequest.timeout), + 'cur': ['USD'], + 'id': bid.bidId, + 'imp': [], + 'regs': { + 'ext': {} + }, + 'user': { + 'ext': {} + } + }; + o.site['page'] = topLocation.href; + o.site['domain'] = topLocation.hostname; + o.site['search'] = topLocation.search; + o.site['ref'] = topReferrer; + o.site['mobile'] = isMobile() ? 1 : 0; + const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0; + o.device['dnt'] = getDoNotTrack() ? 1 : 0; + findAndFillParam(o.site, 'name', function () { + return __webpack_require__.g.top.document.title; + }); + findAndFillParam(o.device, 'h', function () { + return __webpack_require__.g.screen.height; + }); + findAndFillParam(o.device, 'w', function () { + return __webpack_require__.g.screen.width; + }); + let placement = getBidParam(bid, 'placement'); + let impType = isVideo ? { + 'video': Object.assign({ + 'id': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + 'pos': 0, + 'w': firstSize.w, + 'h': firstSize.h, + 'mimes': DEFAULT_MIMES + }, getVideoTargetingParams(bid)) + } : { + 'banner': { + 'id': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + 'pos': 0, + 'w': firstSize.w, + 'h': firstSize.h + } + }; + for (let j = 0; j < sizes.length; j++) { + o.imp.push({ + 'id': '' + j, + 'displaymanager': '' + BIDDER_CODE, + 'displaymanagerver': '' + ADAPTER_VERSION, + 'tagId': placement, + 'bidfloor': floor, + 'bidfloorcur': 'USD', + 'secure': secure, + ...impType + }); + } + if (coppa) { + o.regs.ext = { + 'coppa': 1 + }; + } + if (bidderRequest && bidderRequest.gdprConsent) { + let { + gdprApplies, + consentString + } = bidderRequest.gdprConsent; + o.regs.ext = { + 'gdpr': gdprApplies ? 1 : 0 + }; + o.user.ext = { + 'consent': consentString + }; + } + return o; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["transformParamsUtils"],{ + +/***/ "./libraries/transformParamsUtils/convertTypes.js": +/*!********************************************************!*\ + !*** ./libraries/transformParamsUtils/convertTypes.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ convertTypes: () => (/* binding */ convertTypes) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * Try to convert a value to a type. + * If it can't be done, the value will be returned. + * + * @param {string} typeToConvert The target type. e.g. "string", "number", etc. + * @param {*} value The value to be converted into typeToConvert. + */ +function tryConvertType(typeToConvert, value) { + if (typeToConvert === 'string') { + return value && value.toString(); + } else if (typeToConvert === 'number') { + return Number(value); + } else { + return value; + } +} +function convertTypes(types, params) { + Object.keys(types).forEach(key => { + if (params[key]) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(types[key])) { + params[key] = types[key](params[key]); + } else { + params[key] = tryConvertType(types[key], params[key]); + } + + // don't send invalid values + if (isNaN(params[key])) { + delete params.key; + } + } + }); + return params; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["categoryTranslationMapping"],{ + +/***/ "./libraries/categoryTranslationMapping/index.js": +/*!*******************************************************!*\ + !*** ./libraries/categoryTranslationMapping/index.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ APPNEXUS_CATEGORY_MAPPING: () => (/* binding */ APPNEXUS_CATEGORY_MAPPING) +/* harmony export */ }); +/** + * Provides mapping objects used by bidders for categoryTranslation type logic for Adpod feature + */ +const APPNEXUS_CATEGORY_MAPPING = { + '1': 'IAB20-3', + '2': 'IAB18-5', + '3': 'IAB10-1', + '4': 'IAB2-3', + '5': 'IAB19-8', + '6': 'IAB22-1', + '7': 'IAB18-1', + '8': 'IAB12-3', + '9': 'IAB5-1', + '10': 'IAB4-5', + '11': 'IAB13-4', + '12': 'IAB8-7', + '13': 'IAB9-7', + '14': 'IAB7-1', + '15': 'IAB20-18', + '16': 'IAB10-7', + '17': 'IAB19-18', + '18': 'IAB13-6', + '19': 'IAB18-4', + '20': 'IAB1-5', + '21': 'IAB1-6', + '22': 'IAB3-4', + '23': 'IAB19-13', + '24': 'IAB22-2', + '25': 'IAB3-9', + '26': 'IAB17-18', + '27': 'IAB19-6', + '28': 'IAB1-7', + '29': 'IAB9-30', + '30': 'IAB20-7', + '31': 'IAB20-17', + '32': 'IAB7-32', + '33': 'IAB16-5', + '34': 'IAB19-34', + '35': 'IAB11-5', + '36': 'IAB12-3', + '37': 'IAB11-4', + '38': 'IAB12-3', + '39': 'IAB9-30', + '41': 'IAB7-44', + '42': 'IAB7-1', + '43': 'IAB7-30', + '50': 'IAB19-30', + '51': 'IAB17-12', + '52': 'IAB19-30', + '53': 'IAB3-1', + '55': 'IAB13-2', + '56': 'IAB19-30', + '57': 'IAB19-30', + '58': 'IAB7-39', + '59': 'IAB22-1', + '60': 'IAB7-39', + '61': 'IAB21-3', + '62': 'IAB5-1', + '63': 'IAB12-3', + '64': 'IAB20-18', + '65': 'IAB11-2', + '66': 'IAB17-18', + '67': 'IAB9-9', + '68': 'IAB9-5', + '69': 'IAB7-44', + '71': 'IAB22-3', + '73': 'IAB19-30', + '74': 'IAB8-5', + '78': 'IAB22-1', + '85': 'IAB12-2', + '86': 'IAB22-3', + '87': 'IAB11-3', + '112': 'IAB7-32', + '113': 'IAB7-32', + '114': 'IAB7-32', + '115': 'IAB7-32', + '118': 'IAB9-5', + '119': 'IAB9-5', + '120': 'IAB9-5', + '121': 'IAB9-5', + '122': 'IAB9-5', + '123': 'IAB9-5', + '124': 'IAB9-5', + '125': 'IAB9-5', + '126': 'IAB9-5', + '127': 'IAB22-1', + '132': 'IAB1-2', + '133': 'IAB19-30', + '137': 'IAB3-9', + '138': 'IAB19-3', + '140': 'IAB2-3', + '141': 'IAB2-1', + '142': 'IAB2-3', + '143': 'IAB17-13', + '166': 'IAB11-4', + '175': 'IAB3-1', + '176': 'IAB13-4', + '182': 'IAB8-9', + '183': 'IAB3-5' +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dfpUtils"],{ + +/***/ "./libraries/dfpUtils/dfpUtils.js": +/*!****************************************!*\ + !*** ./libraries/dfpUtils/dfpUtils.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DEFAULT_DFP_PARAMS: () => (/* binding */ DEFAULT_DFP_PARAMS), +/* harmony export */ DFP_ENDPOINT: () => (/* binding */ DFP_ENDPOINT), +/* harmony export */ gdprParams: () => (/* binding */ gdprParams) +/* harmony export */ }); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/consentHandler.js */ "./src/consentHandler.js"); + + +/** Safe defaults which work on pretty much all video calls. */ +const DEFAULT_DFP_PARAMS = { + env: 'vp', + gdfp_req: 1, + output: 'vast', + unviewed_position_start: 1 +}; +const DFP_ENDPOINT = { + protocol: 'https', + host: 'securepubads.g.doubleclick.net', + pathname: '/gampad/ads' +}; +function gdprParams() { + const gdprConsent = _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_0__.gdprDataHandler.getConsentData(); + const params = {}; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params.gdpr = Number(gdprConsent.gdprApplies); + } + if (gdprConsent.consentString) { + params.gdpr_consent = gdprConsent.consentString; + } + if (gdprConsent.addtlConsent) { + params.addtl_consent = gdprConsent.addtlConsent; + } + } + return params; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["biddoInvamiaUtils"],{ + +/***/ "./libraries/biddoInvamiaUtils/index.js": +/*!**********************************************!*\ + !*** ./libraries/biddoInvamiaUtils/index.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildBannerRequests: () => (/* binding */ buildBannerRequests), +/* harmony export */ interpretBannerResponse: () => (/* binding */ interpretBannerResponse) +/* harmony export */ }); +/** + * Helper function to build request payload for banner ads. + * @param {Object} bidRequest - The bid request object. + * @param {string} endpointUrl - The endpoint URL specific to the bidder. + * @returns {Array} An array of server requests. + */ +function buildBannerRequests(bidRequest, endpointUrl) { + const serverRequests = []; + const sizes = bidRequest.mediaTypes.banner.sizes; + sizes.forEach(_ref => { + let [width, height] = _ref; + bidRequest.params.requestedSizes = [width, height]; + const payload = { + ctype: 'div', + pzoneid: bidRequest.params.zoneId, + width, + height + }; + const payloadString = Object.keys(payload).map(key => `${key}=${encodeURIComponent(payload[key])}`).join('&'); + serverRequests.push({ + method: 'GET', + url: endpointUrl, + data: payloadString, + bidderRequest: bidRequest + }); + }); + return serverRequests; +} + +/** + * Helper function to interpret server response for banner ads. + * @param {Object} serverResponse - The server response object. + * @param {Object} bidderRequest - The matched bid request for this response. + * @returns {Array} An array of bid responses. + */ +function interpretBannerResponse(serverResponse, bidderRequest) { + const response = serverResponse.body; + const bidResponses = []; + if (response && response.template && response.template.html) { + const { + bidId + } = bidderRequest; + const [width, height] = bidderRequest.params.requestedSizes; + const bidResponse = { + requestId: bidId, + cpm: response.hb.cpm, + creativeId: response.banner.hash, + currency: 'USD', + netRevenue: response.hb.netRevenue, + ttl: 600, + ad: response.template.html, + mediaType: 'banner', + meta: { + advertiserDomains: response.hb.adomains || [] + }, + width, + height + }; + bidResponses.push(bidResponse); + } + return bidResponses; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["targetVideoUtils"],{ + +/***/ "./libraries/targetVideoUtils/bidderUtils.js": +/*!***************************************************!*\ + !*** ./libraries/targetVideoUtils/bidderUtils.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ bannerBid: () => (/* binding */ bannerBid), +/* harmony export */ createVideoTag: () => (/* binding */ createVideoTag), +/* harmony export */ formatRequest: () => (/* binding */ formatRequest), +/* harmony export */ getAd: () => (/* binding */ getAd), +/* harmony export */ getRtbBid: () => (/* binding */ getRtbBid), +/* harmony export */ getSiteObj: () => (/* binding */ getSiteObj), +/* harmony export */ getSyncResponse: () => (/* binding */ getSyncResponse), +/* harmony export */ videoBid: () => (/* binding */ videoBid) +/* harmony export */ }); +/* unused harmony exports getSizes, getBannerHtml */ +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants.js */ "./libraries/targetVideoUtils/constants.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); + + + + +function getSizes(request) { + let sizes = request.sizes; + if (!sizes && request.mediaTypes && request.mediaTypes.banner && request.mediaTypes.banner.sizes) { + sizes = request.mediaTypes.banner.sizes; + } + if (Array.isArray(sizes) && !Array.isArray(sizes[0])) { + sizes = [sizes[0], sizes[1]]; + } + if (!Array.isArray(sizes) || !Array.isArray(sizes[0])) { + sizes = [[0, 0]]; + } + return sizes; +} +function formatRequest(_ref) { + let { + payload, + url, + bidderRequest, + bidId + } = _ref; + const request = { + method: 'POST', + data: JSON.stringify(payload), + url, + options: { + withCredentials: true + } + }; + if (bidderRequest) { + request.bidderRequest = bidderRequest; + } + if (bidId) { + request.bidId = bidId; + } + return request; +} +function createVideoTag(bid) { + const tag = {}; + tag.id = parseInt(bid.params.placementId, 10); + tag.gpid = 'targetVideo'; + tag.sizes = getSizes(bid); + tag.primary_size = tag.sizes[0]; + tag.ad_types = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; + tag.uuid = bid.bidId; + tag.allow_smaller_sizes = false; + tag.use_pmt_rule = false; + tag.prebid = true; + tag.disable_psa = true; + tag.hb_source = 1; + tag.require_asset_url = true; + tag.video = { + playback_method: 2, + skippable: true + }; + return tag; +} +function bannerBid(serverBid, rtbBid, bidderRequest, margin) { + const bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidRequest)(serverBid.uuid, [bidderRequest]); + const sizes = getSizes(bidRequest); + const bid = { + requestId: serverBid.uuid, + cpm: rtbBid.cpm / margin, + creativeId: rtbBid.creative_id, + dealId: rtbBid.deal_id, + currency: 'USD', + netRevenue: true, + width: sizes[0][0], + height: sizes[0][1], + ttl: 300, + adUnitCode: bidRequest.adUnitCode, + appnexus: { + buyerMemberId: rtbBid.buyer_member_id, + dealPriority: rtbBid.deal_priority, + dealCode: rtbBid.deal_code + } + }; + if (rtbBid.rtb.video) { + Object.assign(bid, { + vastImpUrl: rtbBid.notify_url, + ad: getBannerHtml(rtbBid.notify_url + '&redir=' + encodeURIComponent(rtbBid.rtb.video.asset_url)), + ttl: 3600 + }); + } + return bid; +} +function videoBid(serverBid, requestId, currency, params, ttl) { + const { + ad, + adUrl, + vastUrl, + vastXml + } = getAd(serverBid); + const bid = { + requestId, + params, + currency, + cpm: serverBid.price, + width: serverBid.w, + height: serverBid.h, + creativeId: serverBid.adid || serverBid.crid, + netRevenue: false, + ttl, + meta: { + advertiserDomains: serverBid.adomain || [] + } + }; + if (vastUrl || vastXml) { + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + if (vastUrl) bid.vastUrl = vastUrl; + if (vastXml) bid.vastXml = vastXml; + } else { + bid.ad = ad; + bid.adUrl = adUrl; + } + ; + return bid; +} +function getRtbBid(tag) { + return tag && tag.ads && tag.ads.length && tag.ads.find(ad => ad.rtb); +} +function getBannerHtml(vastUrl) { + return ` + + + + + + + +
+ + + + `; +} +function getAd(bid) { + let ad, adUrl, vastXml, vastUrl; + switch ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.type')) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + if (bid.adm.substr(0, 4) === 'http') { + vastUrl = bid.adm; + } else { + vastXml = bid.adm; + } + ; + break; + default: + if (bid.adm && bid.nurl) { + ad = bid.adm; + ad += (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(decodeURIComponent(bid.nurl)); + } else if (bid.adm) { + ad = bid.adm; + } else if (bid.nurl) { + adUrl = bid.nurl; + } + ; + } + return { + ad, + adUrl, + vastXml, + vastUrl + }; +} +function getSyncResponse(syncOptions, gdprConsent, uspConsent, gppConsent, endpoint) { + const params = { + endpoint + }; + + // Attaching GDPR Consent Params in UserSync url + if (gdprConsent) { + params.gdpr = gdprConsent.gdprApplies ? 1 : 0; + params.gdpr_consent = encodeURIComponent(gdprConsent.consentString || ''); + } + + // CCPA + if (uspConsent && typeof uspConsent === 'string') { + params.us_privacy = encodeURIComponent(uspConsent); + } + + // GPP Consent + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + params.gpp = encodeURIComponent(gppConsent.gppString); + params.gpp_sid = encodeURIComponent(gppConsent?.applicableSections?.join(',')); + } + const queryParams = Object.keys(params).length > 0 ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(params) : ''; + let response = []; + if (syncOptions.iframeEnabled) { + response = [{ + type: 'iframe', + url: _constants_js__WEBPACK_IMPORTED_MODULE_3__.SYNC_URL + 'load-cookie.html?' + queryParams + }]; + } + return response; +} +function getSiteObj() { + const refInfo = _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo && (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)() || {}; + return { + page: refInfo.page, + ref: refInfo.ref, + domain: refInfo.domain + }; +} + +/***/ }), + +/***/ "./libraries/targetVideoUtils/constants.js": +/*!*************************************************!*\ + !*** ./libraries/targetVideoUtils/constants.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ BANNER_ENDPOINT_URL: () => (/* binding */ BANNER_ENDPOINT_URL), +/* harmony export */ BIDDER_CODE: () => (/* binding */ BIDDER_CODE), +/* harmony export */ GVLID: () => (/* binding */ GVLID), +/* harmony export */ MARGIN: () => (/* binding */ MARGIN), +/* harmony export */ SOURCE: () => (/* binding */ SOURCE), +/* harmony export */ SYNC_URL: () => (/* binding */ SYNC_URL), +/* harmony export */ TIME_TO_LIVE: () => (/* binding */ TIME_TO_LIVE), +/* harmony export */ VIDEO_ENDPOINT_URL: () => (/* binding */ VIDEO_ENDPOINT_URL), +/* harmony export */ VIDEO_PARAMS: () => (/* binding */ VIDEO_PARAMS) +/* harmony export */ }); +const SOURCE = 'pbjs'; +const GVLID = 786; +const MARGIN = 1.35; +const BIDDER_CODE = 'targetVideo'; +const TIME_TO_LIVE = 300; +const BANNER_ENDPOINT_URL = 'https://ib.adnxs.com/ut/v3/prebid'; +const VIDEO_ENDPOINT_URL = 'https://pbs.prebrid.tv/openrtb2/auction'; +const SYNC_URL = 'https://bppb.link/static/'; +const VIDEO_PARAMS = ['api', 'linearity', 'maxduration', 'mimes', 'minduration', 'plcmt', 'playbackmethod', 'protocols', 'startdelay', 'placement']; + + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["browsiUtils"],{ + +/***/ "./libraries/browsiUtils/browsiUtils.js": +/*!**********************************************!*\ + !*** ./libraries/browsiUtils/browsiUtils.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ generateRandomString: () => (/* binding */ generateRandomString), +/* harmony export */ getMacroId: () => (/* binding */ getMacroId), +/* harmony export */ getPredictorData: () => (/* binding */ getPredictorData), +/* harmony export */ getSlotByCode: () => (/* binding */ getSlotByCode), +/* harmony export */ getTargetingKeys: () => (/* binding */ getTargetingKeys), +/* harmony export */ getTargetingValues: () => (/* binding */ getTargetingValues), +/* harmony export */ getUUID: () => (/* binding */ getUUID), +/* harmony export */ setKeyValue: () => (/* binding */ setKeyValue), +/* harmony export */ toUrlParams: () => (/* binding */ toUrlParams) +/* harmony export */ }); +/* unused harmony exports isObjectDefined, getAllSlots, getHbm, getLahb, getRahb, getRahbByTs */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); + + + + +/** @type {string} */ +const VIEWABILITY_KEYNAME = 'browsiViewability'; +/** @type {string} */ +const SCROLL_KEYNAME = 'browsiScroll'; +/** @type {string} */ +const REVENUE_KEYNAME = 'browsiRevenue'; +function isObjectDefined(obj) { + return !!(obj && typeof obj === 'object' && Object.keys(obj).length); +} +function generateRandomString() { + const getRandomLetter = () => String.fromCharCode(65 + Math.floor(Math.random() * 26)); // A-Z + return `_${getRandomLetter()}${getRandomLetter()}b${getRandomLetter()}${getRandomLetter()}`; +} +function getUUID() { + if (window.crypto && window.crypto.randomUUID) { + return window.crypto.randomUUID() || undefined; + } + return undefined; +} +function getDaysDifference(firstDate, secondDate) { + const diffInMilliseconds = Math.abs(firstDate - secondDate); + const millisecondsPerDay = 24 * 60 * 60 * 1000; + return diffInMilliseconds / millisecondsPerDay; +} +function isEngagingUser() { + const pageYOffset = window.scrollY || (document.compatMode === 'CSS1Compat' ? document.documentElement?.scrollTop : document.body?.scrollTop); + return pageYOffset > 0; +} +function getRevenueTargetingValue(p) { + if (!p) { + return undefined; + } else if (p <= 0) { + return 'no fill'; + } else if (p <= 0.3) { + return 'low'; + } else if (p <= 0.7) { + return 'medium'; + } + return 'high'; +} +function getTargetingValue(p) { + return !p || p < 0 ? undefined : (Math.floor(p * 10) / 10).toFixed(2); +} +function getTargetingKeys(viewabilityKeyName) { + return { + viewabilityKey: (viewabilityKeyName || VIEWABILITY_KEYNAME).toString(), + scrollKey: SCROLL_KEYNAME, + revenueKey: REVENUE_KEYNAME + }; +} +function getTargetingValues(v) { + return { + viewabilityValue: getTargetingValue(v['viewability']), + scrollValue: getTargetingValue(v['scrollDepth']), + revenueValue: getRevenueTargetingValue(v['revenue']) + }; +} +const setKeyValue = (key, random) => (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_0__.setKeyValue)(key, random.toString()); + +/** + * get all slots on page + * @return {Object[]} slot GoogleTag slots + */ +function getAllSlots() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isGptPubadsDefined)() && window.googletag.pubads().getSlots(); +} + +/** + * get GPT slot by placement id + * @param {string} code placement id + * @return {?Object} + */ +function getSlotByCode(code) { + const slots = getAllSlots(); + if (!slots || !slots.length) { + return null; + } + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(slots, s => s.getSlotElementId() === code || s.getAdUnitPath() === code) || null; +} +function getLocalStorageData(storage) { + let brtd = null; + let bus = null; + try { + brtd = storage.getDataFromLocalStorage('__brtd'); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('unable to parse __brtd'); + } + try { + bus = storage.getDataFromLocalStorage('__bus'); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('unable to parse __bus'); + } + return { + brtd, + bus + }; +} +function convertBusData(bus) { + try { + return JSON.parse(bus); + } catch (e) { + return undefined; + } +} +function getHbm(bus, timestamp) { + try { + if (!isObjectDefined(bus)) { + return undefined; + } + const uahb = isObjectDefined(bus.uahb) ? bus.uahb : undefined; + const rahb = getRahb(bus.rahb, timestamp); + const lahb = getLahb(bus.lahb, timestamp); + return { + uahb: uahb?.avg && Number(uahb.avg?.toFixed(3)), + rahb: rahb?.avg && Number(rahb.avg?.toFixed(3)), + lahb: lahb?.avg && Number(lahb.avg?.toFixed(3)), + lbsa: lahb?.age && Number(lahb?.age?.toFixed(3)) + }; + } catch (e) { + return undefined; + } +} +function getLahb(lahb, timestamp) { + try { + if (!isObjectDefined(lahb)) { + return undefined; + } + return { + avg: lahb.avg, + age: getDaysDifference(timestamp, lahb.time) + }; + } catch (e) { + return undefined; + } +} +function getRahb(rahb, timestamp) { + try { + const rahbByTs = getRahbByTs(rahb, timestamp); + if (!isObjectDefined(rahbByTs)) { + return undefined; + } + const rs = Object.keys(rahbByTs).reduce((sum, curTimestamp) => { + sum.sum += rahbByTs[curTimestamp].sum; + sum.smp += rahbByTs[curTimestamp].smp; + return sum; + }, { + sum: 0, + smp: 0 + }); + return { + avg: rs.sum / rs.smp + }; + } catch (e) { + return undefined; + } +} +function getRahbByTs(rahb, timestamp) { + try { + if (!isObjectDefined(rahb)) { + return undefined; + } + ; + const weekAgoTimestamp = timestamp - 7 * 24 * 60 * 60 * 1000; + Object.keys(rahb).forEach(ts => { + if (parseInt(ts) < weekAgoTimestamp) { + delete rahb[ts]; + } + }); + return rahb; + } catch (e) { + return undefined; + } +} +function getPredictorData(storage, _moduleParams, timestamp, pvid) { + const win = window.top; + const doc = win.document; + const { + brtd, + bus + } = getLocalStorageData(storage); + const convertedBus = convertBusData(bus); + const { + uahb, + rahb, + lahb, + lbsa + } = getHbm(convertedBus, timestamp) || {}; + return { + ...{ + sk: _moduleParams.siteKey, + pk: _moduleParams.pubKey, + sw: win.screen && win.screen.width || -1, + sh: win.screen && win.screen.height || -1, + url: `${doc.location.protocol}//${doc.location.host}${doc.location.pathname}`, + eu: isEngagingUser(), + t: timestamp, + pvid + }, + ...(brtd ? { + us: brtd + } : { + us: '{}' + }), + ...(document.referrer ? { + r: document.referrer + } : {}), + ...(document.title ? { + at: document.title + } : {}), + ...(uahb ? { + uahb + } : {}), + ...(rahb ? { + rahb + } : {}), + ...(lahb ? { + lahb + } : {}), + ...(lbsa ? { + lbsa + } : {}) + }; +} + +/** + * serialize object and return query params string + * @param {Object} data + * @return {string} + */ +function toUrlParams(data) { + return Object.keys(data).map(key => key + '=' + encodeURIComponent(data[key])).join('&'); +} + +/** + * generate id according to macro script + * @param {Object} macro replacement macro + * @param {Object} slot google slot + * @return {?Object} + */ +function getMacroId(macro, slot) { + if (macro) { + try { + const macroResult = evaluate(macro, slot.getSlotElementId(), slot.getAdUnitPath(), (match, p1) => { + return p1 && slot.getTargeting(p1).join('_') || 'NA'; + }); + return macroResult; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`failed to evaluate: ${macro}`); + } + } + return slot.getSlotElementId(); +} +function evaluate(macro, divId, adUnit, replacer) { + let macroResult = macro.p.replace(/['"]+/g, '').replace(//g, divId); + if (adUnit) { + macroResult = macroResult.replace(//g, adUnit); + } + if (replacer) { + macroResult = macroResult.replace(//g, replacer); + } + if (macro.s) { + macroResult = macroResult.substring(macro.s.s, macro.s.e); + } + return macroResult; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cmp"],{ + +/***/ "./libraries/cmp/cmpClient.js": +/*!************************************!*\ + !*** ./libraries/cmp/cmpClient.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ MODE_CALLBACK: () => (/* binding */ MODE_CALLBACK), +/* harmony export */ cmpClient: () => (/* binding */ cmpClient) +/* harmony export */ }); +/* unused harmony exports MODE_MIXED, MODE_RETURN */ +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils/promise.js */ "./src/utils/promise.js"); + + +/** + * @typedef {function} CMPClient + * + * @param {{}} params CMP parameters. Currently this is a subset of {command, callback, parameter, version}. + * @param {boolean} once if true, discard cross-frame event listeners once a reply message is received. + * @returns {Promise<*>} a promise to the API's "result" - see the `mode` argument to `cmpClient` on how that's determined. + * @property {boolean} isDirect true if the CMP is directly accessible (no postMessage required) + * @property {() => void} close close the client; currently, this just stops listening for cross-frame messages. + */ + +const MODE_MIXED = 0; +const MODE_RETURN = 1; +const MODE_CALLBACK = 2; + +/** + * Returns a client function that can interface with a CMP regardless of where it's located. + * + * @param {object} obj + * @param obj.apiName name of the CMP api, e.g. "__gpp" + * @param [obj.apiVersion] CMP API version + * @param [obj.apiArgs] names of the arguments taken by the api function, in order. + * @param [obj.callbackArgs] names of the cross-frame response payload properties that should be passed as callback arguments, in order + * @param [obj.mode] controls the callbacks passed to the underlying API, and how the promises returned by the client are resolved. + * + * The client behaves differently when it's provided a `callback` argument vs when it's not - for short, let's name these + * cases "subscriptions" and "one-shot calls" respectively: + * + * With `mode: MODE_MIXED` (the default), promises returned on subscriptions are resolved to undefined when the callback + * is first run (that is, the promise resolves when the CMP replies, but what it replies with is discarded and + * left for the callback to deal with). For one-shot calls, the returned promise is resolved to the API's + * return value when it's directly accessible, or with the result from the first (and, presumably, the only) + * cross-frame reply when it's not; + * + * With `mode: MODE_RETURN`, the returned promise always resolves to the API's return value - which is taken to be undefined + * when cross-frame; + * + * With `mode: MODE_CALLBACK`, the underlying API is expected to never directly return anything significant; instead, + * it should always accept a callback and - for one-shot calls - invoke it only once with the result. The client will + * automatically generate an appropriate callback for one-shot calls and use the result it's given to resolve + * the returned promise. Subscriptions are treated in the same way as MODE_MIXED. + * + * @param win + * @returns {CMPClient} CMP invocation function (or null if no CMP was found). + */ +function cmpClient(_ref) { + let { + apiName, + apiVersion, + apiArgs = ['command', 'callback', 'parameter', 'version'], + callbackArgs = ['returnValue', 'success'], + mode = MODE_MIXED + } = _ref; + let win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window; + const cmpCallbacks = {}; + const callName = `${apiName}Call`; + const cmpDataPkgName = `${apiName}Return`; + function handleMessage(event) { + const json = typeof event.data === 'string' && event.data.includes(cmpDataPkgName) ? JSON.parse(event.data) : event.data; + if (json?.[cmpDataPkgName]?.callId) { + const payload = json[cmpDataPkgName]; + if (cmpCallbacks.hasOwnProperty(payload.callId)) { + cmpCallbacks[payload.callId](...callbackArgs.map(name => payload[name])); + } + } + } + function findCMP() { + let f = win; + let cmpFrame; + let isDirect = false; + while (f != null) { + try { + if (typeof f[apiName] === 'function') { + cmpFrame = f; + isDirect = true; + break; + } + } catch (e) {} + + // need separate try/catch blocks due to the exception errors thrown when trying to check for a frame that doesn't exist in 3rd party env + try { + if (f.frames[`${apiName}Locator`]) { + cmpFrame = f; + break; + } + } catch (e) {} + if (f === win.top) break; + f = f.parent; + } + return [cmpFrame, isDirect]; + } + const [cmpFrame, isDirect] = findCMP(); + if (!cmpFrame) { + return; + } + function resolveParams(params) { + params = Object.assign({ + version: apiVersion + }, params); + return apiArgs.map(arg => [arg, params[arg]]); + } + function wrapCallback(callback, resolve, reject, preamble) { + const haveCb = typeof callback === 'function'; + return function (result, success) { + preamble && preamble(); + if (mode !== MODE_RETURN) { + const resolver = success == null || success ? resolve : reject; + resolver(haveCb ? undefined : result); + } + haveCb && callback.apply(this, arguments); + }; + } + let client; + if (isDirect) { + client = function invokeCMPDirect() { + let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.PbPromise((resolve, reject) => { + const ret = cmpFrame[apiName](...resolveParams({ + ...params, + callback: params.callback || mode === MODE_CALLBACK ? wrapCallback(params.callback, resolve, reject) : undefined + }).map(_ref2 => { + let [_, val] = _ref2; + return val; + })); + if (mode === MODE_RETURN || params.callback == null && mode === MODE_MIXED) { + resolve(ret); + } + }); + }; + } else { + win.addEventListener('message', handleMessage, false); + client = function invokeCMPFrame(params) { + let once = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.PbPromise((resolve, reject) => { + // call CMP via postMessage + const callId = Math.random().toString(); + const msg = { + [callName]: { + ...Object.fromEntries(resolveParams(params).filter(_ref3 => { + let [param] = _ref3; + return param !== 'callback'; + })), + callId: callId + } + }; + cmpCallbacks[callId] = wrapCallback(params?.callback, resolve, reject, (once || params?.callback == null) && (() => { + delete cmpCallbacks[callId]; + })); + cmpFrame.postMessage(msg, '*'); + if (mode === MODE_RETURN) resolve(); + }); + }; + } + return Object.assign(client, { + isDirect, + close() { + !isDirect && win.removeEventListener('message', handleMessage); + } + }); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["consentManagement"],{ + +/***/ "./libraries/consentManagement/cmUtils.js": +/*!************************************************!*\ + !*** ./libraries/consentManagement/cmUtils.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ configParser: () => (/* binding */ configParser) +/* harmony export */ }); +/* unused harmony exports consentManagementHook, lookupConsentData */ +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _src_activities_params_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/activities/params.js */ "./src/activities/params.js"); + + + + + + +function consentManagementHook(name, loadConsentData) { + const SEEN = new WeakSet(); + return (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_0__.timedAuctionHook)(name, function requestBidsHook(fn, reqBidsConfigObj) { + return loadConsentData().then(_ref => { + let { + consentData, + error + } = _ref; + if (error && (!consentData || !SEEN.has(error))) { + SEEN.add(error); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(error.message, ...(error.args || [])); + } + fn.call(this, reqBidsConfigObj); + }).catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${error?.message} Canceling auction as per consentManagement config.`, ...(error?.args || [])); + fn.stopTiming(); + if (typeof reqBidsConfigObj.bidsBackHandler === 'function') { + reqBidsConfigObj.bidsBackHandler(); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error executing bidsBackHandler'); + } + }); + }); +} + +/** + * + * @typedef {Function} CmpLookupFn CMP lookup function. Should set up communication and keep consent data updated + * through consent data handlers' `setConsentData`. + * @param {SetProvisionalConsent} setProvisionalConsent optionally, the function can call this with provisional consent + * data, which will be used if the lookup times out before "proper" consent data can be retrieved. + * @returns {Promise<{void}>} a promise that resolves when the auction should be continued, or rejects if it should be canceled. + * + * @typedef {Function} SetProvisionalConsent + * @param {*} provisionalConsent + * @returns {void} + */ + +/** + * Look up consent data from CMP or config. + * + * @param {Object} options + * @param {String} options.name e.g. 'GPP'. Used only for log messages. + * @param {ConsentHandler} options.consentDataHandler consent data handler object (from src/consentHandler) + * @param {CmpLookupFn} options.setupCmp + * @param {Number?} options.cmpTimeout timeout (in ms) after which the auction should continue without consent data. + * @param {Number?} options.actionTimeout timeout (in ms) from when provisional consent is available to when the auction should continue with it + * @param {() => {}} options.getNullConsent consent data to use on timeout + * @returns {Promise<{error: Error, consentData: {}}>} + */ +function lookupConsentData(_ref2) { + let { + name, + consentDataHandler, + setupCmp, + cmpTimeout, + actionTimeout, + getNullConsent + } = _ref2; + consentDataHandler.enable(); + let timeoutHandle; + return new Promise((resolve, reject) => { + let provisionalConsent; + let cmpLoaded = false; + function setProvisionalConsent(consentData) { + provisionalConsent = consentData; + if (!cmpLoaded) { + cmpLoaded = true; + actionTimeout != null && resetTimeout(actionTimeout); + } + } + function resetTimeout(timeout) { + if (timeoutHandle != null) clearTimeout(timeoutHandle); + if (timeout != null) { + timeoutHandle = setTimeout(() => { + const consentData = consentDataHandler.getConsentData() ?? (cmpLoaded ? provisionalConsent : getNullConsent()); + const message = `timeout waiting for ${cmpLoaded ? 'user action on CMP' : 'CMP to load'}`; + consentDataHandler.setConsentData(consentData); + resolve({ + consentData, + error: new Error(`${name} ${message}`) + }); + }, timeout); + } else { + timeoutHandle = null; + } + } + setupCmp(setProvisionalConsent).then(() => resolve({ + consentData: consentDataHandler.getConsentData() + }), reject); + cmpTimeout != null && resetTimeout(cmpTimeout); + }).finally(() => { + timeoutHandle && clearTimeout(timeoutHandle); + }).catch(e => { + consentDataHandler.setConsentData(null); + throw e; + }); +} +function configParser() { + let { + namespace, + displayName, + consentDataHandler, + parseConsentData, + getNullConsent, + cmpHandlers, + DEFAULT_CMP = 'iab', + DEFAULT_CONSENT_TIMEOUT = 10000 + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + function msg(message) { + return `consentManagement.${namespace} ${message}`; + } + let requestBidsHook, cdLoader, staticConsentData; + function attachActivityParams(next, params) { + return next(Object.assign({ + [`${namespace}Consent`]: consentDataHandler.getConsentData() + }, params)); + } + function loadConsentData() { + return cdLoader().then(_ref3 => { + let { + error + } = _ref3; + return { + error, + consentData: consentDataHandler.getConsentData() + }; + }); + } + function activate() { + if (requestBidsHook == null) { + requestBidsHook = consentManagementHook(namespace, () => cdLoader()); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().requestBids.before(requestBidsHook, 50); + _src_activities_params_js__WEBPACK_IMPORTED_MODULE_3__.buildActivityParams.before(attachActivityParams); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`${displayName} consentManagement module has been activated...`); + } + } + function reset() { + if (requestBidsHook != null) { + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().requestBids.getHooks({ + hook: requestBidsHook + }).remove(); + _src_activities_params_js__WEBPACK_IMPORTED_MODULE_3__.buildActivityParams.getHooks({ + hook: attachActivityParams + }).remove(); + requestBidsHook = null; + } + } + return function getConsentConfig(config) { + config = config?.[namespace]; + if (!config || typeof config !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(msg(`config not defined, exiting consent manager module`)); + reset(); + return {}; + } + let cmpHandler; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(config.cmpApi)) { + cmpHandler = config.cmpApi; + } else { + cmpHandler = DEFAULT_CMP; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(msg(`config did not specify cmp. Using system default setting (${DEFAULT_CMP}).`)); + } + let cmpTimeout; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(config.timeout)) { + cmpTimeout = config.timeout; + } else { + cmpTimeout = DEFAULT_CONSENT_TIMEOUT; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(msg(`config did not specify timeout. Using system default setting (${DEFAULT_CONSENT_TIMEOUT}).`)); + } + const actionTimeout = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(config.actionTimeout) ? config.actionTimeout : null; + let setupCmp; + if (cmpHandler === 'static') { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(config.consentData)) { + staticConsentData = config.consentData; + cmpTimeout = null; + setupCmp = () => new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_4__.PbPromise(resolve => resolve(consentDataHandler.setConsentData(parseConsentData(staticConsentData)))); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(msg(`config with cmpApi: 'static' did not specify consentData. No consents will be available to adapters.`)); + } + } else if (!cmpHandlers.hasOwnProperty(cmpHandler)) { + consentDataHandler.setConsentData(null); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${displayName} CMP framework (${cmpHandler}) is not a supported framework. Aborting consentManagement module and resuming auction.`); + setupCmp = () => _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_4__.PbPromise.resolve(); + } else { + setupCmp = cmpHandlers[cmpHandler]; + } + const lookup = () => lookupConsentData({ + name: displayName, + consentDataHandler, + setupCmp, + cmpTimeout, + actionTimeout, + getNullConsent + }); + cdLoader = (() => { + let cd; + return function () { + if (cd == null) { + cd = lookup().catch(err => { + cd = null; + throw err; + }); + } + return cd; + }; + })(); + activate(); + return { + cmpHandler, + cmpTimeout, + actionTimeout, + staticConsentData, + loadConsentData, + requestBidsHook + }; + }; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["interpretResponseUtils"],{ + +/***/ "./libraries/interpretResponseUtils/index.js": +/*!***************************************************!*\ + !*** ./libraries/interpretResponseUtils/index.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ interpretResponseUtil: () => (/* binding */ interpretResponseUtil) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + +function interpretResponseUtil(serverResponse, _ref, eachBidCallback) { + let { + bidderRequest + } = _ref; + const bids = []; + if (!serverResponse.body || serverResponse.body.error) { + let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`; + if (serverResponse.body && serverResponse.body.error) { + errorMessage += `: ${serverResponse.body.error}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(errorMessage); + return bids; + } + (serverResponse.body.tags || []).forEach(serverBid => { + try { + const bid = eachBidCallback(serverBid); + if (bid) { + bids.push(bid); + } + } catch (e) { + // Do nothing + } + }); + return bids; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ortb2.5Translator"],{ + +/***/ "./libraries/ortb2.5Translator/translator.js": +/*!***************************************************!*\ + !*** ./libraries/ortb2.5Translator/translator.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ortb25Translator: () => (/* binding */ ortb25Translator) +/* harmony export */ }); +/* unused harmony exports EXT_PROMOTIONS, splitPath, moveRule, DEFAULT_RULES, toOrtb25 */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + +const EXT_PROMOTIONS = ['device.sua', 'source.schain', 'regs.gdpr', 'regs.us_privacy', 'regs.gpp', 'regs.gpp_sid', 'user.consent', 'user.eids']; +function splitPath(path) { + const parts = path.split('.'); + const prefix = parts.slice(0, parts.length - 1).join('.'); + const field = parts[parts.length - 1]; + return [prefix, field]; +} + +/** + * @param sourcePath a JSON path such as `regs.us_privacy` + * @param dest {function(String, String): String} a function taking (prefix, field) and returning a destination path; + * for example, ('regs', 'us_privacy') => 'regs.ext.us_privacy' + * @return {(function({}): (function(): void|undefined))|*} a function that takes an object and, if it contains + * sourcePath, copies its contents to destinationPath, returning a function that deletes the original sourcePath. + */ +function moveRule(sourcePath) { + let dest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (prefix, field) => `${prefix}.ext.${field}`; + const [prefix, field] = splitPath(sourcePath); + dest = dest(prefix, field); + return ortb2 => { + const obj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ortb2, prefix); + if (obj?.[field] != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(ortb2, dest, obj[field]); + return () => delete obj[field]; + } + }; +} +function kwarrayRule(section) { + // move 2.6 `kwarray` into 2.5 comma-separated `keywords`. + return ortb2 => { + const kwarray = ortb2[section]?.kwarray; + if (kwarray != null) { + let kw = (ortb2[section].keywords || '').split(','); + if (Array.isArray(kwarray)) kw.push(...kwarray); + ortb2[section].keywords = kw.join(','); + return () => delete ortb2[section].kwarray; + } + }; +} +const DEFAULT_RULES = Object.freeze([...EXT_PROMOTIONS.map(f => moveRule(f)), ...['app', 'content', 'site', 'user'].map(kwarrayRule)]); + +/** + * Factory for ORTB 2.5 translation functions. + * + * @param deleteFields if true, the translation function will remove fields that have been translated (transferred somewhere else within the request) + * @param rules translation rules; an array of functions of the type returned by `moveRule` + * @return {function({}): {}} a translation function that takes an ORTB object, modifies it in place, and returns it. + */ +function ortb25Translator() { + let deleteFields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + let rules = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_RULES; + return function (ortb2) { + rules.forEach(f => { + try { + const deleter = f(ortb2); + if (typeof deleter === 'function' && deleteFields) deleter(); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error translating request to ORTB 2.5', e); + } + }); + return ortb2; + }; +} + +/** + * Translate an ortb request to version 2.5 by moving 2.6 (and later) fields that have a standardized 2.5 extension. + * + * The request is modified in place and returned. + */ +const toOrtb25 = ortb25Translator(); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["timeoutQueue"],{ + +/***/ "./libraries/timeoutQueue/timeoutQueue.js": +/*!************************************************!*\ + !*** ./libraries/timeoutQueue/timeoutQueue.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ timeoutQueue: () => (/* binding */ timeoutQueue) +/* harmony export */ }); +function timeoutQueue() { + const queue = []; + return { + submit(timeout, onResume, onTimeout) { + const item = [onResume, setTimeout(() => { + queue.splice(queue.indexOf(item), 1); + onTimeout(); + }, timeout)]; + queue.push(item); + }, + resume() { + while (queue.length) { + const [onResume, timerId] = queue.shift(); + clearTimeout(timerId); + onResume(); + } + } + }; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["deepintentUtils"],{ + +/***/ "./libraries/deepintentUtils/index.js": +/*!********************************************!*\ + !*** ./libraries/deepintentUtils/index.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ COMMON_ORTB_VIDEO_PARAMS: () => (/* binding */ COMMON_ORTB_VIDEO_PARAMS), +/* harmony export */ formatResponse: () => (/* binding */ formatResponse) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + +const COMMON_ORTB_VIDEO_PARAMS = { + 'mimes': value => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'), + 'minduration': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'maxduration': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'protocols': value => Array.isArray(value) && value.every(v => v >= 1 && v <= 10), + 'w': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'h': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'startdelay': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'linearity': value => [1, 2].indexOf(value) !== -1, + 'skip': value => [0, 1].indexOf(value) !== -1, + 'skipmin': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'skipafter': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'sequence': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'battr': value => Array.isArray(value) && value.every(v => v >= 1 && v <= 17), + 'maxextended': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'minbitrate': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'maxbitrate': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'boxingallowed': value => [0, 1].indexOf(value) !== -1, + 'playbackmethod': value => Array.isArray(value) && value.every(v => v >= 1 && v <= 6), + 'playbackend': value => [1, 2, 3].indexOf(value) !== -1, + 'api': value => Array.isArray(value) && value.every(v => v >= 1 && v <= 6) +}; +function formatResponse(bid) { + return { + requestId: bid && bid.impid ? bid.impid : undefined, + cpm: bid && bid.price ? bid.price : 0.0, + width: bid && bid.w ? bid.w : 0, + height: bid && bid.h ? bid.h : 0, + ad: bid && bid.adm ? bid.adm : '', + meta: { + advertiserDomains: bid && bid.adomain ? bid.adomain : [] + }, + creativeId: bid && bid.crid ? bid.crid : undefined, + netRevenue: false, + currency: bid && bid.cur ? bid.cur : 'USD', + ttl: 300, + dealId: bid && bid.dealId ? bid.dealId : undefined + }; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["audUtils"],{ + +/***/ "./libraries/audUtils/bidderUtils.js": +/*!*******************************************!*\ + !*** ./libraries/audUtils/bidderUtils.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBannerRequest: () => (/* binding */ getBannerRequest), +/* harmony export */ getBannerResponse: () => (/* binding */ getBannerResponse), +/* harmony export */ getNativeResponse: () => (/* binding */ getNativeResponse) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); + + +// Declare native assets +const NATIVE_ASSETS = [{ + id: 1, + required: 1, + title: { + len: 100 + } +}, +// Title +{ + id: 2, + required: 1, + img: { + type: 3, + w: 300, + h: 250 + } +}, +// Main image +{ + id: 3, + required: 0, + data: { + type: 1, + len: 140 + } +}, +// Body +{ + id: 4, + required: 1, + data: { + type: 2 + } +}, +// Sponsored by +{ + id: 5, + required: 1, + icon: { + w: 50, + h: 50 + } +}, +// Icon +{ + id: 6, + required: 1, + data: { + type: 12, + len: 15 + } +} // Call to action +]; +// Function to get Request +const getBannerRequest = (bidRequests, bidderRequest, ENDPOINT) => { + let request = []; + // Loop for each bid request + bidRequests.forEach(bidReq => { + let guid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + const req = { + id: guid, + imp: [getImpDetails(bidReq)], + placementId: bidReq.params.placement_id, + site: getSiteDetails(bidderRequest), + user: getUserDetails(bidReq) + }; + // Fetch GPP Consent from bidderRequest + if (bidderRequest && bidderRequest.gppConsent && bidderRequest.gppConsent.gppString) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(req, 'regs.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(req, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections); + } else if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.regs && bidderRequest.ortb2.regs.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(req, 'regs.gpp', bidderRequest.ortb2.regs.gpp); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(req, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid); + } + // Fetch coppa compliance from bidderRequest + if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.regs && bidderRequest.ortb2.regs.coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(req, 'regs.coppa', 1); + } + // Fetch uspConsent from bidderRequest + if (bidderRequest?.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(req, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + req.MediaType = getMediaType(bidReq); + // Adding eids if passed + if (bidReq.userIdAsEids) { + req.user.ext.eids = bidReq.userIdAsEids; + } + request.push(req); + }); + // Return the array of request + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(request), + options: { + contentType: 'application/json' + } + }; +}; +// Function to get Response +const getBannerResponse = (bidResponse, mediaType) => { + return formatResponse(bidResponse, mediaType); +}; +// Function to get NATIVE Response +const getNativeResponse = (bidResponse, bidRequest, mediaType) => { + const assets = JSON.parse(JSON.parse(bidRequest.data)[0].imp[0].native.request).assets; + return formatResponse(bidResponse, mediaType, assets); +}; +// Function to format response +const formatResponse = (bidResponse, mediaType, assets) => { + let responseArray = []; + if (bidResponse) { + try { + let bidResp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidResponse, 'body.seatbid', []); + if (bidResp && bidResp[0] && bidResp[0].bid) { + bidResp[0].bid.forEach(bidReq => { + let response = {}; + response.requestId = bidReq.impid; + response.cpm = bidReq.price; + response.width = bidReq.w; + response.height = bidReq.h; + response.ad = bidReq.adm; + response.meta = { + advertiserDomains: bidReq.adomain, + primaryCatId: bidReq.cat || [], + attr: bidReq.attr || [] + }; + response.creativeId = bidReq.crid; + response.netRevenue = false; + response.currency = 'USD'; + response.ttl = 300; + response.dealId = bidReq.dealId; + response.mediaType = mediaType; + if (mediaType == 'native') { + let nativeResp = JSON.parse(bidReq.adm).native; + let nativeData = { + clickUrl: nativeResp.link.url, + impressionTrackers: nativeResp.imptrackers + }; + nativeResp.assets.forEach(asst => { + let data = getNativeAssestData(asst, assets); + nativeData[data.key] = data.value; + }); + response.native = nativeData; + } + responseArray.push(response); + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e); + } + } + return responseArray; +}; +// Function to get imp based on Media Type +const getImpDetails = bidReq => { + let imp = {}; + if (bidReq) { + imp.id = bidReq.bidId; + imp.bidfloor = getFloorPrice(bidReq); + if (bidReq.mediaTypes.native) { + let assets = { + assets: NATIVE_ASSETS + }; + imp.native = { + request: JSON.stringify(assets) + }; + } else if (bidReq.mediaTypes.banner) { + imp.banner = getBannerDetails(bidReq); + } + } + return imp; +}; +// Function to get banner object +const getBannerDetails = bidReq => { + let response = {}; + if (bidReq.mediaTypes.banner) { + // Fetch width and height from MediaTypes object, if not provided in bidReq params + if (bidReq.mediaTypes.banner.sizes && !bidReq.params.height && !bidReq.params.width) { + let sizes = bidReq.mediaTypes.banner.sizes; + if (sizes.length > 0) { + response.h = sizes[0][1]; + response.w = sizes[0][0]; + } + } else { + response.h = bidReq.params.height; + response.w = bidReq.params.width; + } + } + return response; +}; +// Function to get floor price +const getFloorPrice = bidReq => { + let bidfloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'params.bid_floor', 0); + return bidfloor; +}; +// Function to get site object +const getSiteDetails = bidderRequest => { + let page = ''; + let name = ''; + if (bidderRequest && bidderRequest.refererInfo) { + page = bidderRequest.refererInfo.page; + name = bidderRequest.refererInfo.domain; + } + return { + page: page, + name: name + }; +}; +// Function to build the user object +const getUserDetails = bidReq => { + let user = {}; + if (bidReq && bidReq.ortb2 && bidReq.ortb2.user) { + user.id = bidReq.ortb2.user.id ? bidReq.ortb2.user.id : ''; + user.buyeruid = bidReq.ortb2.user.buyeruid ? bidReq.ortb2.user.buyeruid : ''; + user.keywords = bidReq.ortb2.user.keywords ? bidReq.ortb2.user.keywords : ''; + user.customdata = bidReq.ortb2.user.customdata ? bidReq.ortb2.user.customdata : ''; + user.ext = bidReq.ortb2.user.ext ? bidReq.ortb2.user.ext : ''; + } else { + user.id = ''; + user.buyeruid = ''; + user.keywords = ''; + user.customdata = ''; + user.ext = {}; + } + return user; +}; +// Function to get asset data for response +const getNativeAssestData = (params, assets) => { + let response = {}; + if (params.title) { + response.key = 'title'; + response.value = params.title.text; + } + if (params.data) { + response.key = getAssetData(params.id, assets); + response.value = params.data.value; + } + if (params.img) { + response.key = getAssetImageDataType(params.id, assets); + response.value = { + url: params.img.url, + height: params.img.h, + width: params.img.w + }; + } + return response; +}; +// Function to get asset data types based on id +const getAssetData = (paramId, asset) => { + let resp = ''; + for (let i = 0; i < asset.length; i++) { + if (asset[i].id == paramId) { + switch (asset[i].data.type) { + case 1: + resp = 'sponsored'; + break; + case 2: + resp = 'desc'; + break; + case 12: + resp = 'cta'; + break; + } + } + } + return resp; +}; +// Function to get image type based on the id +const getAssetImageDataType = (paramId, asset) => { + let resp = ''; + for (let i = 0; i < asset.length; i++) { + if (asset[i].id == paramId) { + switch (asset[i].img.type) { + case 1: + resp = 'icon'; + break; + case 3: + resp = 'image'; + break; + } + } + } + return resp; +}; +// Function to get Media Type +const getMediaType = bidReq => { + if (bidReq.mediaTypes.native) { + return 'native'; + } else if (bidReq.mediaTypes.banner) { + return 'banner'; + } +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["xmlUtils"],{ + +/***/ "./libraries/xmlUtils/xmlUtils.js": +/*!****************************************!*\ + !*** ./libraries/xmlUtils/xmlUtils.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ XMLUtil) +/* harmony export */ }); +const XML_MIME_TYPE = 'application/xml'; +function XMLUtil() { + let parser; + let serializer; + function getParser() { + if (!parser) { + // DOMParser instantiation is costly; instantiate only once throughout Prebid lifecycle. + parser = new DOMParser(); + } + return parser; + } + function getSerializer() { + if (!serializer) { + // XMLSerializer instantiation is costly; instantiate only once throughout Prebid lifecycle. + serializer = new XMLSerializer(); + } + return serializer; + } + function parse(xmlString) { + return getParser().parseFromString(xmlString, XML_MIME_TYPE); + } + function serialize(xmlDoc) { + return getSerializer().serializeToString(xmlDoc); + } + return { + parse, + serialize + }; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["currencyUtils"],{ + +/***/ "./libraries/currencyUtils/currency.js": +/*!*********************************************!*\ + !*** ./libraries/currencyUtils/currency.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ convertCurrency: () => (/* binding */ convertCurrency), +/* harmony export */ currencyCompare: () => (/* binding */ currencyCompare) +/* harmony export */ }); +/* unused harmony export currencyNormalizer */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils/reducers.js */ "./src/utils/reducers.js"); + + + +/** + * Attempt to convert `amount` from the currency `fromCur` to the currency `toCur`. + * + * By default, when the conversion is not possible (currency module not present or + * throwing errors), the amount is returned unchanged. This behavior can be + * toggled off with bestEffort = false. + */ +function convertCurrency(amount, fromCur, toCur) { + let bestEffort = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + if (fromCur === toCur) return amount; + let result = amount; + try { + result = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().convertCurrency(amount, fromCur, toCur); + } catch (e) { + if (!bestEffort) throw e; + } + return result; +} +function currencyNormalizer() { + let toCurrency = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let bestEffort = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let convert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : convertCurrency; + return function (amount, currency) { + if (toCurrency == null) toCurrency = currency; + return convert(amount, currency, toCurrency, bestEffort); + }; +} +function currencyCompare() { + let get = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : obj => [obj.cpm, obj.currency]; + let normalize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : currencyNormalizer(); + return (0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_1__.keyCompare)(obj => normalize.apply(null, get(obj))); +} + +/***/ }), + +/***/ "./libraries/currencyUtils/floor.js": +/*!******************************************!*\ + !*** ./libraries/currencyUtils/floor.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBidFloor: () => (/* binding */ getBidFloor) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); + + +/** + * get BidFloor + * @param {*} bid + * @returns + */ +function getBidFloor(bid) { + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn(bid.getFloor)) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](bid, 'params.bidfloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; + } catch (_) { + return 0; + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["navigatorData"],{ + +/***/ "./libraries/navigatorData/navigatorData.js": +/*!**************************************************!*\ + !*** ./libraries/navigatorData/navigatorData.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getDM: () => (/* binding */ getDM), +/* harmony export */ getHC: () => (/* binding */ getHC), +/* harmony export */ getHLen: () => (/* binding */ getHLen) +/* harmony export */ }); +function getHLen() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + let hLen; + try { + hLen = win.top.history.length; + } catch (error) { + hLen = undefined; + } + return hLen; +} +function getHC() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + let hc; + try { + hc = win.top.navigator.hardwareConcurrency; + } catch (error) { + hc = undefined; + } + return hc; +} +function getDM() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + let dm; + try { + dm = win.top.navigator.deviceMemory; + } catch (error) { + dm = undefined; + } + return dm; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["fpdUtils"],{ + +/***/ "./libraries/fpdUtils/deviceInfo.js": +/*!******************************************!*\ + !*** ./libraries/fpdUtils/deviceInfo.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getDevice: () => (/* binding */ getDevice), +/* harmony export */ getScreenSize: () => (/* binding */ getScreenSize) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * get device + * @return {boolean} + */ +function getDevice() { + let check = false; + (function (a) { + let reg1 = new RegExp(['(android|bbd+|meego)', '.+mobile|avantgo|bada/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)', '|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone', '|p(ixi|re)/|plucker|pocket|psp|series(4|6)0|symbian|treo|up.(browser|link)|vodafone|wap', '|windows ce|xda|xiino|android|ipad|playbook|silk'].join(''), 'i'); + let reg2 = new RegExp(['1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)', '|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )', '|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55/|capi|ccwa|cdm-|cell', '|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)', '|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene', '|gf-5|g-mo|go(.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c', '|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|/)|ibro|idea|ig01|ikom', '|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |/)|klon|kpt |kwc-|kyo(c|k)', '|le(no|xi)|lg( g|/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50/|ma(te|ui|xo)|mc(01|21|ca)', '|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]', '|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)', '|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio', '|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55/|sa(ge|ma|mm|ms', '|ny|va)|sc(01|h-|oo|p-)|sdk/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al', '|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)', '|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(.b|g1|si)|utst|', 'v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)', '|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-', '|your|zeto|zte-'].join(''), 'i'); + if (reg1.test(a) || reg2.test(a.substr(0, 4))) { + check = true; + } + })(navigator.userAgent || navigator.vendor || window.opera); + return check; +} + +/** + * get screen size + * + * @returns {Array} eg: "['widthxheight']" + */ +function getScreenSize() { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput([window.screen.width, window.screen.height]); +} + +/***/ }), + +/***/ "./libraries/fpdUtils/pageInfo.js": +/*!****************************************!*\ + !*** ./libraries/fpdUtils/pageInfo.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getConnectionDownLink: () => (/* binding */ getConnectionDownLink), +/* harmony export */ getPageDescription: () => (/* binding */ getPageDescription), +/* harmony export */ getPageKeywords: () => (/* binding */ getPageKeywords), +/* harmony export */ getPageTitle: () => (/* binding */ getPageTitle), +/* harmony export */ getReferrer: () => (/* binding */ getReferrer) +/* harmony export */ }); +/** + * get page title + * @returns {string} + */ +function getPageTitle() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + try { + const ogTitle = win.top.document.querySelector('meta[property="og:title"]'); + return win.top.document.title || ogTitle && ogTitle.content || ''; + } catch (e) { + const ogTitle = document.querySelector('meta[property="og:title"]'); + return document.title || ogTitle && ogTitle.content || ''; + } +} + +/** + * get page description + * @returns {string} + */ +function getPageDescription() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + let element; + try { + element = win.top.document.querySelector('meta[name="description"]') || win.top.document.querySelector('meta[property="og:description"]'); + } catch (e) { + element = document.querySelector('meta[name="description"]') || document.querySelector('meta[property="og:description"]'); + } + return element && element.content || ''; +} + +/** + * get page keywords + * @returns {string} + */ +function getPageKeywords() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + let element; + try { + element = win.top.document.querySelector('meta[name="keywords"]'); + } catch (e) { + element = document.querySelector('meta[name="keywords"]'); + } + return element && element.content || ''; +} + +/** + * get connection downlink + * @returns {number} + */ +function getConnectionDownLink() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + const nav = win.navigator || {}; + return nav && nav.connection && nav.connection.downlink >= 0 ? nav.connection.downlink.toString() : undefined; +} + +/** + * @param bidRequest + * @param bidderRequest + * @returns {string} + */ +function getReferrer() { + let bidRequest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let pageUrl; + if (bidRequest.params && bidRequest.params.referrer) { + pageUrl = bidRequest.params.referrer; + } else { + pageUrl = bidderRequest?.refererInfo?.page; + } + return pageUrl; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cookieSync"],{ + +/***/ "./libraries/cookieSync/cookieSync.js": +/*!********************************************!*\ + !*** ./libraries/cookieSync/cookieSync.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ cookieSync: () => (/* binding */ cookieSync) +/* harmony export */ }); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/storageManager.js */ "./src/storageManager.js"); + +const COOKIE_KEY_MGUID = '__mguid_'; +function cookieSync(syncOptions, gdprConsent, uspConsent, bidderCode, cookieOrigin, ckIframeUrl, cookieTime) { + const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: bidderCode + }); + const origin = encodeURIComponent(location.origin || `https://${location.host}`); + let syncParamUrl = `dm=${origin}`; + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + syncParamUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + syncParamUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`; + } + } + if (uspConsent && uspConsent.consentString) { + syncParamUrl += `&ccpa_consent=${uspConsent.consentString}`; + } + if (syncOptions.iframeEnabled) { + window.addEventListener('message', function handler(event) { + if (!event.data || event.origin != cookieOrigin) { + return; + } + this.removeEventListener('message', handler); + event.stopImmediatePropagation(); + const response = event.data; + if (!response.optout && response.mguid) { + storage.setCookie(COOKIE_KEY_MGUID, response.mguid, cookieTime); + } + }, true); + return [{ + type: 'iframe', + url: `${ckIframeUrl}?${syncParamUrl}` + }]; + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dspxUtils"],{ + +/***/ "./libraries/dspxUtils/bidderUtils.js": +/*!********************************************!*\ + !*** ./libraries/dspxUtils/bidderUtils.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ assignDefinedValues: () => (/* binding */ assignDefinedValues), +/* harmony export */ convertMediaInfoForRequest: () => (/* binding */ convertMediaInfoForRequest), +/* harmony export */ extractUserSegments: () => (/* binding */ extractUserSegments), +/* harmony export */ fillUsersIds: () => (/* binding */ fillUsersIds), +/* harmony export */ getBidFloor: () => (/* binding */ getBidFloor), +/* harmony export */ getMediaTypesInfo: () => (/* binding */ getMediaTypesInfo), +/* harmony export */ getVideoContext: () => (/* binding */ getVideoContext), +/* harmony export */ handleSyncUrls: () => (/* binding */ handleSyncUrls), +/* harmony export */ interpretResponse: () => (/* binding */ interpretResponse), +/* harmony export */ isBannerRequest: () => (/* binding */ isBannerRequest), +/* harmony export */ isVideoRequest: () => (/* binding */ isVideoRequest), +/* harmony export */ objectToQueryString: () => (/* binding */ objectToQueryString), +/* harmony export */ siteContentToString: () => (/* binding */ siteContentToString) +/* harmony export */ }); +/* unused harmony exports appendToUrl, getVideoSizes, getBannerSizes, parseSize, parseSizes */ +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ +/** + * Adds userIds to payload + * + * @param bidRequest + * @param payload + */ +function fillUsersIds(bidRequest, payload) { + if (bidRequest.hasOwnProperty('userId')) { + let didMapping = { + did_netid: 'userId.netId', + did_id5: 'userId.id5id.uid', + did_id5_linktype: 'userId.id5id.ext.linkType', + did_uid2: 'userId.uid2', + did_sharedid: 'userId.sharedid', + did_pubcid: 'userId.pubcid', + did_uqid: 'userId.utiq', + did_cruid: 'userId.criteoid', + did_euid: 'userId.euid', + // did_tdid: 'unifiedId', + did_tdid: 'userId.tdid', + did_ppuid: function () { + let path = 'userId.pubProvidedId'; + let value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, path); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) { + for (const rec of value) { + if (rec.uids && rec.uids.length > 0) { + for (let i = 0; i < rec.uids.length; i++) { + if ('id' in rec.uids[i] && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(rec.uids[i], 'ext.stype') === 'ppuid') { + return (rec.uids[i].atype ?? '') + ':' + rec.source + ':' + rec.uids[i].id; + } + } + } + } + } + return undefined; + }, + did_cpubcid: 'crumbs.pubcid' + }; + for (let paramName in didMapping) { + let path = didMapping[paramName]; + + // handle function + if (typeof path == 'function') { + let value = path(paramName); + if (value) { + payload[paramName] = value; + } + continue; + } + // direct access + let value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, path); + if (typeof value == 'string' || typeof value == 'number') { + payload[paramName] = value; + } else if (typeof value == 'object') { + // trying to find string ID value + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, path + '.id') == 'string') { + payload[paramName] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, path + '.id'); + } else { + if (Object.keys(value).length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`WARNING: fillUserIds had to use first key in user object to get value for bid.userId key: ${path}.`); + payload[paramName] = value[Object.keys(value)[0]]; + } + } + } + } + } +} +function appendToUrl(url, what) { + if (!what) { + return url; + } + return url + (url.indexOf('?') !== -1 ? '&' : '?') + what; +} +function objectToQueryString(obj, prefix) { + let str = []; + let p; + for (p in obj) { + if (obj.hasOwnProperty(p)) { + let k = prefix ? prefix + '[' + p + ']' : p; + let v = obj[p]; + str.push(v !== null && typeof v === 'object' ? objectToQueryString(v, k) : encodeURIComponent(k) + '=' + encodeURIComponent(v)); + } + } + return str.filter(n => n).join('&'); +} + +/** + * Check if it's a banner bid request + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {boolean} True if it's a banner bid + */ +function isBannerRequest(bid) { + return bid.mediaType === 'banner' || !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.banner') || !isVideoRequest(bid); +} + +/** + * Check if it's a video bid request + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {boolean} True if it's a video bid + */ +function isVideoRequest(bid) { + return bid.mediaType === 'video' || !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video'); +} + +/** + * Get video sizes + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {object} + */ +function getVideoSizes(bid) { + return parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video.playerSize') || bid.sizes); +} + +/** + * Get video context + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {object} + */ +function getVideoContext(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video.context') || 'unknown'; +} + +/** + * Get banner sizes + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {object} True if it's a video bid + */ +function getBannerSizes(bid) { + return parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.banner.sizes') || bid.sizes); +} + +/** + * Parse size + * @param size + * @returns {object} sizeObj + */ +function parseSize(size) { + let sizeObj = {}; + sizeObj.width = parseInt(size[0], 10); + sizeObj.height = parseInt(size[1], 10); + return sizeObj; +} + +/** + * Parse sizes + * @param sizes + * @returns {{width: number , height: number }[]} + */ +function parseSizes(sizes) { + if (Array.isArray(sizes[0])) { + // is there several sizes ? (ie. [[728,90],[200,300]]) + return sizes.map(size => parseSize(size)); + } + return [parseSize(sizes)]; // or a single one ? (ie. [728,90]) +} + +/** + * Get MediaInfo object for server request + * + * @param mediaTypesInfo + * @returns {*} + */ +function convertMediaInfoForRequest(mediaTypesInfo) { + let requestData = {}; + Object.keys(mediaTypesInfo).forEach(mediaType => { + requestData[mediaType] = mediaTypesInfo[mediaType].map(size => { + return size.width + 'x' + size.height; + }).join(','); + }); + return requestData; +} + +/** + * Get media types info + * + * @param bid + */ +function getMediaTypesInfo(bid) { + let mediaTypesInfo = {}; + if (bid.mediaTypes) { + Object.keys(bid.mediaTypes).forEach(mediaType => { + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER) { + mediaTypesInfo[mediaType] = getBannerSizes(bid); + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO) { + mediaTypesInfo[mediaType] = getVideoSizes(bid); + } + }); + } else { + mediaTypesInfo[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER] = getBannerSizes(bid); + } + return mediaTypesInfo; +} + +/** + * Get Bid Floor + * @param bid + * @returns {number|*} + */ +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.bidfloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; + } catch (_) { + return 0; + } +} + +/** + * Convert site.content to string + * @param content + */ +function siteContentToString(content) { + if (!content) { + return ''; + } + let stringKeys = ['id', 'title', 'series', 'season', 'artist', 'genre', 'isrc', 'url', 'keywords']; + let intKeys = ['episode', 'context', 'livestream']; + let arrKeys = ['cat']; + let retArr = []; + arrKeys.forEach(k => { + let val = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(content, k); + if (val && Array.isArray(val)) { + retArr.push(k + ':' + val.join('|')); + } + }); + intKeys.forEach(k => { + let val = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(content, k); + if (val && typeof val === 'number') { + retArr.push(k + ':' + val); + } + }); + stringKeys.forEach(k => { + let val = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(content, k); + if (val && typeof val === 'string') { + retArr.push(k + ':' + encodeURIComponent(val)); + } + }); + return retArr.join(','); +} + +/** + * Assigns multiple values to the specified keys on an object if the values are not undefined. + * @param {Object} target - The object to which the values will be assigned. + * @param {Object} values - An object containing key-value pairs to be assigned. + */ +function assignDefinedValues(target, values) { + for (const key in values) { + if (values[key] !== undefined) { + target[key] = values[key]; + } + } +} + +/** + * Extracts user segments/topics from the bid request object + * @param {Object} bid - The bid request object + * @returns {{segclass: *, segtax: *, segments: *}|undefined} - User segments/topics or undefined if not found + */ +function extractUserSegments(bid) { + const userData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'ortb2.user.data') || []; + for (const dataObj of userData) { + if (dataObj.segment && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(dataObj.segment) && dataObj.segment.length > 0) { + const segments = dataObj.segment.filter(seg => seg.id && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr)(seg.id) && isFinite(seg.id)).map(seg => Number(seg.id)); + if (segments.length > 0) { + return { + segtax: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(dataObj, 'ext.segtax'), + segclass: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(dataObj, 'ext.segclass'), + segments: segments.join(',') + }; + } + } + } + return undefined; +} +function handleSyncUrls(syncOptions, serverResponses, gdprConsent, uspConsent) { + if (!serverResponses || serverResponses.length === 0) { + return []; + } + const syncs = []; + let gdprParams = ''; + if (gdprConsent) { + if ('gdprApplies' in gdprConsent && typeof gdprConsent.gdprApplies === 'boolean') { + gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdprParams = `gdpr_consent=${gdprConsent.consentString}`; + } + } + if (serverResponses.length > 0 && serverResponses[0].body.userSync) { + if (syncOptions.iframeEnabled) { + serverResponses[0].body.userSync.iframeUrl.forEach(url => syncs.push({ + type: 'iframe', + url: appendToUrl(url, gdprParams) + })); + } + if (syncOptions.pixelEnabled) { + serverResponses[0].body.userSync.imageUrl.forEach(url => syncs.push({ + type: 'image', + url: appendToUrl(url, gdprParams) + })); + } + } + return syncs; +} +function interpretResponse(serverResponse, bidRequest, rendererFunc) { + const bidResponses = []; + const response = serverResponse.body; + const crid = response.crid || 0; + const cpm = response.cpm / 1000000 || 0; + if (cpm !== 0 && crid !== 0) { + const dealId = response.dealid || ''; + const currency = response.currency || 'EUR'; + const netRevenue = response.netRevenue === undefined ? true : response.netRevenue; + const bidResponse = { + requestId: response.bid_id, + cpm: cpm, + width: response.width, + height: response.height, + creativeId: crid, + dealId: dealId, + currency: currency, + netRevenue: netRevenue, + type: response.type, + ttl: 60, + meta: { + advertiserDomains: response.adomain || [] + } + }; + if (response.vastUrl) { + bidResponse.vastUrl = response.vastUrl; + bidResponse.mediaType = 'video'; + } + if (response.vastXml) { + bidResponse.vastXml = response.vastXml; + bidResponse.mediaType = 'video'; + } + if (response.renderer) { + bidResponse.renderer = rendererFunc(bidRequest, response); + } + if (response.videoCacheKey) { + bidResponse.videoCacheKey = response.videoCacheKey; + } + if (response.adTag) { + bidResponse.ad = response.adTag; + } + if (response.bid_appendix) { + Object.keys(response.bid_appendix).forEach(fieldName => { + bidResponse[fieldName] = response.bid_appendix[fieldName]; + }); + } + bidResponses.push(bidResponse); + } + return bidResponses; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["schainSerializer"],{ + +/***/ "./libraries/schainSerializer/schainSerializer.js": +/*!********************************************************!*\ + !*** ./libraries/schainSerializer/schainSerializer.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ serializeSupplyChain: () => (/* binding */ serializeSupplyChain) +/* harmony export */ }); +/** + * Serialize the SupplyChain for Non-OpenRTB Requests + * https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/supplychainobject.md + * + * @param {Object} schain The supply chain object. + * @param {string} schain.ver The version of the supply chain. + * @param {number} schain.complete Indicates if the chain is complete (1) or not (0). + * @param {Array} schain.nodes An array of nodes in the supply chain. + * @param {Array} nodesProperties The list of node properties to include in the serialized string. + * Can include: 'asi', 'sid', 'hp', 'rid', 'name', 'domain', 'ext'. + * @returns {string|null} The serialized supply chain string or null if the nodes are not present. + */ +function serializeSupplyChain(schain, nodesProperties) { + if (!schain?.nodes) return null; + const header = `${schain.ver},${schain.complete}!`; + const nodes = schain.nodes.map(node => nodesProperties.map(prop => node[prop] ? encodeURIComponent(node[prop]).replace(/!/g, '%21') : '').join(',')).join('!'); + return header + nodes; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["uid2IdSystemShared"],{ + +/***/ "./libraries/uid2IdSystemShared/uid2IdSystem_shared.js": +/*!*************************************************************!*\ + !*** ./libraries/uid2IdSystemShared/uid2IdSystem_shared.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Uid2CodeVersion: () => (/* binding */ Uid2CodeVersion), +/* harmony export */ Uid2GetId: () => (/* binding */ Uid2GetId), +/* harmony export */ extractIdentityFromParams: () => (/* binding */ extractIdentityFromParams) +/* harmony export */ }); +/* unused harmony exports Uid2ApiClient, Uid2StorageManager */ +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +const Uid2CodeVersion = '1.1'; +function isValidIdentity(identity) { + return !!(typeof identity === 'object' && identity !== null && identity.advertising_token && identity.identity_expires && identity.refresh_from && identity.refresh_token && identity.refresh_expires); +} + +// Helper function to prepend message +function prependMessage(message) { + return `UID2 shared library - ${message}`; +} + +// Wrapper function for logInfo +function logInfoWrapper(logInfo) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + logInfo(prependMessage(args[0]), ...args.slice(1)); +} + +// This is extracted from an in-progress API client. Once it's available via NPM, this class should be replaced with the NPM package. +class Uid2ApiClient { + constructor(opts, clientId, logInfo, logWarn) { + this._baseUrl = opts.baseUrl; + this._clientVersion = clientId; + this._logInfo = function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return logInfoWrapper(logInfo, ...args); + }; + this._logWarn = logWarn; + } + createArrayBuffer(text) { + const arrayBuffer = new Uint8Array(text.length); + for (let i = 0; i < text.length; i++) { + arrayBuffer[i] = text.charCodeAt(i); + } + return arrayBuffer; + } + hasStatusResponse(response) { + return typeof response === 'object' && response && response.status; + } + isValidRefreshResponse(response) { + return this.hasStatusResponse(response) && (response.status === 'optout' || response.status === 'expired_token' || response.status === 'success' && response.body && isValidIdentity(response.body)); + } + ResponseToRefreshResult(response) { + if (this.isValidRefreshResponse(response)) { + if (response.status === 'success') { + return { + status: response.status, + identity: response.body + }; + } + return response; + } else { + return prependMessage(`Response didn't contain a valid status`); + } + } + callRefreshApi(refreshDetails) { + const url = this._baseUrl + '/v2/token/refresh'; + let resolvePromise; + let rejectPromise; + const promise = new Promise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + this._logInfo('Sending refresh request', refreshDetails); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax)(url, { + success: responseText => { + try { + if (!refreshDetails.refresh_response_key) { + this._logInfo('No response decryption key available, assuming unencrypted JSON'); + const response = JSON.parse(responseText); + const result = this.ResponseToRefreshResult(response); + if (typeof result === 'string') { + rejectPromise(prependMessage(result)); + } else { + resolvePromise(result); + } + } else { + this._logInfo('Decrypting refresh API response'); + const encodeResp = this.createArrayBuffer(atob(responseText)); + window.crypto.subtle.importKey('raw', this.createArrayBuffer(atob(refreshDetails.refresh_response_key)), { + name: 'AES-GCM' + }, false, ['decrypt']).then(key => { + this._logInfo('Imported decryption key'); + // returns the symmetric key + window.crypto.subtle.decrypt({ + name: 'AES-GCM', + iv: encodeResp.slice(0, 12), + tagLength: 128 // The tagLength you used to encrypt (if any) + }, key, encodeResp.slice(12)).then(decrypted => { + const decryptedResponse = String.fromCharCode(...new Uint8Array(decrypted)); + this._logInfo('Decrypted to:', decryptedResponse); + const response = JSON.parse(decryptedResponse); + const result = this.ResponseToRefreshResult(response); + if (typeof result === 'string') { + rejectPromise(prependMessage(result)); + } else { + resolvePromise(result); + } + }, reason => this._logWarn(prependMessage(`Call to UID2 API failed`), reason)); + }, reason => this._logWarn(prependMessage(`Call to UID2 API failed`), reason)); + } + } catch (_err) { + rejectPromise(prependMessage(responseText)); + } + }, + error: (error, xhr) => { + try { + this._logInfo('Error status, assuming unencrypted JSON'); + const response = JSON.parse(xhr.responseText); + const result = this.ResponseToRefreshResult(response); + if (typeof result === 'string') { + rejectPromise(prependMessage(result)); + } else { + resolvePromise(result); + } + } catch (_e) { + rejectPromise(prependMessage(error)); + } + } + }, refreshDetails.refresh_token, { + method: 'POST', + customHeaders: { + 'X-UID2-Client-Version': this._clientVersion + } + }); + return promise; + } +} +class Uid2StorageManager { + constructor(storage, preferLocalStorage, storageName, logInfo) { + this._storage = storage; + this._preferLocalStorage = preferLocalStorage; + this._storageName = storageName; + this._logInfo = function () { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + return logInfoWrapper(logInfo, ...args); + }; + } + readCookie(cookieName) { + return this._storage.cookiesAreEnabled() ? this._storage.getCookie(cookieName) : null; + } + readLocalStorage(key) { + return this._storage.localStorageIsEnabled() ? this._storage.getDataFromLocalStorage(key) : null; + } + readModuleCookie() { + return this.parseIfContainsBraces(this.readCookie(this._storageName)); + } + writeModuleCookie(value) { + this._storage.setCookie(this._storageName, JSON.stringify(value), Date.now() + 60 * 60 * 24 * 1000); + } + readModuleStorage() { + return this.parseIfContainsBraces(this.readLocalStorage(this._storageName)); + } + writeModuleStorage(value) { + this._storage.setDataInLocalStorage(this._storageName, JSON.stringify(value)); + } + readProvidedCookie(cookieName) { + return JSON.parse(this.readCookie(cookieName)); + } + parseIfContainsBraces(value) { + return value?.includes('{') ? JSON.parse(value) : value; + } + storeValue(value) { + if (this._preferLocalStorage) { + this.writeModuleStorage(value); + } else { + this.writeModuleCookie(value); + } + } + getStoredValueWithFallback() { + const preferredStorageLabel = this._preferLocalStorage ? 'local storage' : 'cookie'; + const preferredStorageGet = (this._preferLocalStorage ? this.readModuleStorage : this.readModuleCookie).bind(this); + const preferredStorageSet = (this._preferLocalStorage ? this.writeModuleStorage : this.writeModuleCookie).bind(this); + const fallbackStorageGet = (this._preferLocalStorage ? this.readModuleCookie : this.readModuleStorage).bind(this); + const storedValue = preferredStorageGet(); + if (!storedValue) { + const fallbackValue = fallbackStorageGet(); + if (fallbackValue) { + this._logInfo(`${preferredStorageLabel} was empty, but found a fallback value.`); + if (typeof fallbackValue === 'object') { + this._logInfo(`Copying the fallback value to ${preferredStorageLabel}.`); + preferredStorageSet(fallbackValue); + } + return fallbackValue; + } + } else if (typeof storedValue === 'string') { + const fallbackValue = fallbackStorageGet(); + if (fallbackValue && typeof fallbackValue === 'object') { + this._logInfo(`${preferredStorageLabel} contained a basic token, but found a refreshable token fallback. Copying the fallback value to ${preferredStorageLabel}.`); + preferredStorageSet(fallbackValue); + return fallbackValue; + } + } + return storedValue; + } +} +function refreshTokenAndStore(baseUrl, token, clientId, storageManager, _logInfo, _logWarn) { + _logInfo('UID2 base url provided: ', baseUrl); + const client = new Uid2ApiClient({ + baseUrl + }, clientId, _logInfo, _logWarn); + return client.callRefreshApi(token).then(response => { + _logInfo('Refresh endpoint responded with:', response); + const tokens = { + originalToken: token, + latestToken: response.identity + }; + let storedTokens = storageManager.getStoredValueWithFallback(); + if (storedTokens?.originalIdentity) tokens.originalIdentity = storedTokens.originalIdentity; + storageManager.storeValue(tokens); + return tokens; + }); +} +let clientSideTokenGenerator; +if (true) { + const SERVER_PUBLIC_KEY_PREFIX_LENGTH = 9; + clientSideTokenGenerator = { + isCSTGOptionsValid(maybeOpts, _logWarn) { + if (typeof maybeOpts !== 'object' || maybeOpts === null) { + _logWarn('CSTG is not being used, but is included in the Prebid.js bundle. You can reduce the bundle size by passing "--disable UID2_CSTG" to the Prebid.js build.'); + return false; + } + const opts = maybeOpts; + if (!opts.serverPublicKey && !opts.subscriptionId) { + _logWarn('CSTG has been enabled but its parameters have not been set.'); + return false; + } + if (typeof opts.serverPublicKey !== 'string') { + _logWarn('CSTG opts.serverPublicKey must be a string'); + return false; + } + const serverPublicKeyPrefix = /^(UID2|EUID)-X-[A-Z]-.+/; + if (!serverPublicKeyPrefix.test(opts.serverPublicKey)) { + _logWarn(`CSTG opts.serverPublicKey must match the regular expression ${serverPublicKeyPrefix}`); + return false; + } + // We don't do any further validation of the public key, as we will find out + // later if it's valid by using importKey. + + if (typeof opts.subscriptionId !== 'string') { + _logWarn('CSTG opts.subscriptionId must be a string'); + return false; + } + if (opts.subscriptionId.length === 0) { + _logWarn('CSTG opts.subscriptionId is empty'); + return false; + } + return true; + }, + getValidIdentity(opts, _logWarn) { + if (opts.emailHash) { + if (!UID2DiiNormalization.isBase64Hash(opts.emailHash)) { + _logWarn('CSTG opts.emailHash is invalid'); + return; + } + return { + email_hash: opts.emailHash + }; + } + if (opts.phoneHash) { + if (!UID2DiiNormalization.isBase64Hash(opts.phoneHash)) { + _logWarn('CSTG opts.phoneHash is invalid'); + return; + } + return { + phone_hash: opts.phoneHash + }; + } + if (opts.email) { + const normalizedEmail = UID2DiiNormalization.normalizeEmail(opts.email); + if (normalizedEmail === undefined) { + _logWarn('CSTG opts.email is invalid'); + return; + } + return { + email: normalizedEmail + }; + } + if (opts.phone) { + if (!UID2DiiNormalization.isNormalizedPhone(opts.phone)) { + _logWarn('CSTG opts.phone is invalid'); + return; + } + return { + phone: opts.phone + }; + } + }, + isStoredTokenInvalid(cstgIdentity, storedTokens, _logInfo, _logWarn) { + if (storedTokens) { + if (storedTokens.latestToken === 'optout') { + return true; + } + const identity = Object.values(cstgIdentity)[0]; + if (!this.isStoredTokenFromSameIdentity(storedTokens, identity)) { + _logInfo('CSTG supplied new identity - ignoring stored value.', storedTokens.originalIdentity, cstgIdentity); + // Stored token wasn't originally sourced from the provided identity - ignore the stored value. A new user has logged in? + return true; + } + } + return false; + }, + async generateTokenAndStore(baseUrl, cstgOpts, cstgIdentity, storageManager, _logInfo, _logWarn) { + _logInfo('UID2 cstg opts provided: ', JSON.stringify(cstgOpts)); + const client = new UID2CstgApiClient({ + baseUrl, + cstg: cstgOpts + }, _logInfo, _logWarn); + const response = await client.generateToken(cstgIdentity); + _logInfo('CSTG endpoint responded with:', response); + const tokens = { + originalIdentity: this.encodeOriginalIdentity(cstgIdentity), + latestToken: response.identity + }; + storageManager.storeValue(tokens); + return tokens; + }, + isStoredTokenFromSameIdentity(storedTokens, identity) { + if (!storedTokens.originalIdentity) return false; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.cyrb53Hash)(identity, storedTokens.originalIdentity.salt) === storedTokens.originalIdentity.identity; + }, + encodeOriginalIdentity(identity) { + const identityValue = Object.values(identity)[0]; + const salt = Math.floor(Math.random() * Math.pow(2, 32)); + return { + identity: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.cyrb53Hash)(identityValue, salt), + salt + }; + } + }; + class UID2DiiNormalization { + static EMAIL_EXTENSION_SYMBOL = '+'; + static EMAIL_DOT = '.'; + static GMAIL_DOMAIN = 'gmail.com'; + static isBase64Hash(value) { + if (!(value && value.length === 44)) { + return false; + } + try { + return btoa(atob(value)) === value; + } catch (err) { + return false; + } + } + static isNormalizedPhone(phone) { + return /^\+[0-9]{10,15}$/.test(phone); + } + static normalizeEmail(email) { + if (!email || !email.length) return; + const parsedEmail = email.trim().toLowerCase(); + if (parsedEmail.indexOf(' ') > 0) return; + const emailParts = this.splitEmailIntoAddressAndDomain(parsedEmail); + if (!emailParts) return; + const { + address, + domain + } = emailParts; + const emailIsGmail = this.isGmail(domain); + const parsedAddress = this.normalizeAddressPart(address, emailIsGmail, emailIsGmail); + return parsedAddress ? `${parsedAddress}@${domain}` : undefined; + } + static splitEmailIntoAddressAndDomain(email) { + const parts = email.split('@'); + if (parts.length !== 2 || parts.some(part => part === '')) { + return; + } + return { + address: parts[0], + domain: parts[1] + }; + } + static isGmail(domain) { + return domain === this.GMAIL_DOMAIN; + } + static dropExtension(address) { + let extensionSymbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.EMAIL_EXTENSION_SYMBOL; + return address.split(extensionSymbol)[0]; + } + static normalizeAddressPart(address, shouldRemoveDot, shouldDropExtension) { + let parsedAddress = address; + if (shouldRemoveDot) { + parsedAddress = parsedAddress.replaceAll(this.EMAIL_DOT, ''); + } + if (shouldDropExtension) parsedAddress = this.dropExtension(parsedAddress); + return parsedAddress; + } + } + class UID2CstgApiClient { + constructor(opts, logInfo, logWarn) { + this._baseUrl = opts.baseUrl; + this._serverPublicKey = opts.cstg.serverPublicKey; + this._subscriptionId = opts.cstg.subscriptionId; + this._logInfo = function () { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + return logInfoWrapper(logInfo, ...args); + }; + this._logWarn = logWarn; + } + hasStatusResponse(response) { + return typeof response === 'object' && response && response.status; + } + isCstgApiSuccessResponse(response) { + return this.hasStatusResponse(response) && response.status === 'success' && isValidIdentity(response.body); + } + isCstgApiOptoutResponse(response) { + return this.hasStatusResponse(response) && response.status === 'optout'; + } + isCstgApiClientErrorResponse(response) { + return this.hasStatusResponse(response) && response.status === 'client_error' && typeof response.message === 'string'; + } + isCstgApiForbiddenResponse(response) { + return this.hasStatusResponse(response) && response.status === 'invalid_http_origin' && typeof response.message === 'string'; + } + stripPublicKeyPrefix(serverPublicKey) { + return serverPublicKey.substring(SERVER_PUBLIC_KEY_PREFIX_LENGTH); + } + async generateCstgRequest(cstgIdentity) { + if ('email_hash' in cstgIdentity || 'phone_hash' in cstgIdentity) { + return cstgIdentity; + } + if ('email' in cstgIdentity) { + const emailHash = await UID2CstgCrypto.hash(cstgIdentity.email); + return { + email_hash: emailHash + }; + } + if ('phone' in cstgIdentity) { + const phoneHash = await UID2CstgCrypto.hash(cstgIdentity.phone); + return { + phone_hash: phoneHash + }; + } + } + async generateToken(cstgIdentity) { + const request = await this.generateCstgRequest(cstgIdentity); + this._logInfo('Building CSTG request for', request); + const box = await UID2CstgBox.build(this.stripPublicKeyPrefix(this._serverPublicKey)); + const encoder = new TextEncoder(); + const now = Date.now(); + const { + iv, + ciphertext + } = await box.encrypt(encoder.encode(JSON.stringify(request)), encoder.encode(JSON.stringify([now]))); + const exportedPublicKey = await UID2CstgCrypto.exportPublicKey(box.clientPublicKey); + const requestBody = { + payload: UID2CstgCrypto.bytesToBase64(new Uint8Array(ciphertext)), + iv: UID2CstgCrypto.bytesToBase64(new Uint8Array(iv)), + public_key: UID2CstgCrypto.bytesToBase64(new Uint8Array(exportedPublicKey)), + timestamp: now, + subscription_id: this._subscriptionId + }; + return this.callCstgApi(requestBody, box); + } + async callCstgApi(requestBody, box) { + const url = this._baseUrl + '/v2/token/client-generate'; + let resolvePromise; + let rejectPromise; + const promise = new Promise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + this._logInfo('Sending CSTG request', requestBody); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax)(url, { + success: async (responseText, xhr) => { + try { + const encodedResp = UID2CstgCrypto.base64ToBytes(responseText); + const decrypted = await box.decrypt(encodedResp.slice(0, 12), encodedResp.slice(12)); + const decryptedResponse = new TextDecoder().decode(decrypted); + const response = JSON.parse(decryptedResponse); + if (this.isCstgApiSuccessResponse(response)) { + resolvePromise({ + status: 'success', + identity: response.body + }); + } else if (this.isCstgApiOptoutResponse(response)) { + resolvePromise({ + status: 'optout', + identity: 'optout' + }); + } else { + // A 200 should always be a success response. + // Something has gone wrong. + rejectPromise(prependMessage(`API error: Response body was invalid for HTTP status 200: ${decryptedResponse}`)); + } + } catch (err) { + rejectPromise(prependMessage(err)); + } + }, + error: (error, xhr) => { + try { + if (xhr.status === 400) { + const response = JSON.parse(xhr.responseText); + if (this.isCstgApiClientErrorResponse(response)) { + rejectPromise(prependMessage(`Client error: ${response.message}`)); + } else { + // A 400 should always be a client error. + // Something has gone wrong. + rejectPromise(prependMessage(`UID2 API error: Response body was invalid for HTTP status 400: ${xhr.responseText}`)); + } + } else if (xhr.status === 403) { + const response = JSON.parse(xhr.responseText); + if (this.isCstgApiForbiddenResponse(xhr)) { + rejectPromise(prependMessage(`Forbidden: ${response.message}`)); + } else { + // A 403 should always be a forbidden response. + // Something has gone wrong. + rejectPromise(prependMessage(`UID2 API error: Response body was invalid for HTTP status 403: ${xhr.responseText}`)); + } + } else { + rejectPromise(prependMessage(`UID2 API error: Unexpected HTTP status ${xhr.status}: ${error}`)); + } + } catch (_e) { + rejectPromise(prependMessage(error)); + } + } + }, JSON.stringify(requestBody), { + method: 'POST' + }); + return promise; + } + } + class UID2CstgBox { + static _namedCurve = 'P-256'; + constructor(clientPublicKey, sharedKey) { + this._clientPublicKey = clientPublicKey; + this._sharedKey = sharedKey; + } + static async build(serverPublicKey) { + const clientKeyPair = await UID2CstgCrypto.generateKeyPair(UID2CstgBox._namedCurve); + const importedServerPublicKey = await UID2CstgCrypto.importPublicKey(serverPublicKey, this._namedCurve); + const sharedKey = await UID2CstgCrypto.deriveKey(importedServerPublicKey, clientKeyPair.privateKey); + return new UID2CstgBox(clientKeyPair.publicKey, sharedKey); + } + async encrypt(plaintext, additionalData) { + const iv = window.crypto.getRandomValues(new Uint8Array(12)); + const ciphertext = await window.crypto.subtle.encrypt({ + name: 'AES-GCM', + iv, + additionalData + }, this._sharedKey, plaintext); + return { + iv, + ciphertext + }; + } + async decrypt(iv, ciphertext) { + return window.crypto.subtle.decrypt({ + name: 'AES-GCM', + iv + }, this._sharedKey, ciphertext); + } + get clientPublicKey() { + return this._clientPublicKey; + } + } + class UID2CstgCrypto { + static base64ToBytes(base64) { + const binString = atob(base64); + return Uint8Array.from(binString, m => m.codePointAt(0)); + } + static bytesToBase64(bytes) { + const binString = Array.from(bytes, x => String.fromCodePoint(x)).join(''); + return btoa(binString); + } + static async generateKeyPair(namedCurve) { + const params = { + name: 'ECDH', + namedCurve: namedCurve + }; + return window.crypto.subtle.generateKey(params, false, ['deriveKey']); + } + static async importPublicKey(publicKey, namedCurve) { + const params = { + name: 'ECDH', + namedCurve: namedCurve + }; + return window.crypto.subtle.importKey('spki', this.base64ToBytes(publicKey), params, false, []); + } + static exportPublicKey(publicKey) { + return window.crypto.subtle.exportKey('spki', publicKey); + } + static async deriveKey(serverPublicKey, clientPrivateKey) { + return window.crypto.subtle.deriveKey({ + name: 'ECDH', + public: serverPublicKey + }, clientPrivateKey, { + name: 'AES-GCM', + length: 256 + }, false, ['encrypt', 'decrypt']); + } + static async hash(value) { + const hash = await window.crypto.subtle.digest('SHA-256', new TextEncoder().encode(value)); + return this.bytesToBase64(new Uint8Array(hash)); + } + } +} +function Uid2GetId(config, prebidStorageManager, _logInfo, _logWarn) { + const logInfo = function () { + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; + } + return logInfoWrapper(_logInfo, ...args); + }; + let suppliedToken = null; + const preferLocalStorage = config.storage !== 'cookie'; + const storageManager = new Uid2StorageManager(prebidStorageManager, preferLocalStorage, config.internalStorage, logInfo); + logInfo(`Module is using ${preferLocalStorage ? 'local storage' : 'cookies'} for internal storage.`); + const isCstgEnabled = clientSideTokenGenerator && clientSideTokenGenerator.isCSTGOptionsValid(config.cstg, _logWarn); + if (isCstgEnabled) { + logInfo(`Module is using client-side token generation.`); + // Ignores config.paramToken and config.serverCookieName if any is provided + suppliedToken = null; + } else if (config.paramToken) { + suppliedToken = config.paramToken; + logInfo('Read token from params', suppliedToken); + } else if (config.serverCookieName) { + suppliedToken = storageManager.readProvidedCookie(config.serverCookieName); + logInfo('Read token from server-supplied cookie', suppliedToken); + } + let storedTokens = storageManager.getStoredValueWithFallback(); + logInfo('Loaded module-stored tokens:', storedTokens); + if (storedTokens && typeof storedTokens === 'string') { + // Stored value is a plain token - if no token is supplied, just use the stored value. + + if (!suppliedToken && !isCstgEnabled) { + logInfo('Returning legacy cookie value.'); + return { + id: storedTokens + }; + } + // Otherwise, ignore the legacy value - it should get over-written later anyway. + logInfo('Discarding superseded legacy cookie.'); + storedTokens = null; + } + if (suppliedToken && storedTokens) { + if (storedTokens.originalToken?.advertising_token !== suppliedToken.advertising_token) { + logInfo('Server supplied new token - ignoring stored value.', storedTokens.originalToken?.advertising_token, suppliedToken.advertising_token); + // Stored token wasn't originally sourced from the provided token - ignore the stored value. A new user has logged in? + storedTokens = null; + } + } + if ( true && isCstgEnabled) { + const cstgIdentity = clientSideTokenGenerator.getValidIdentity(config.cstg, _logWarn); + if (cstgIdentity) { + if (storedTokens && clientSideTokenGenerator.isStoredTokenInvalid(cstgIdentity, storedTokens, logInfo, _logWarn)) { + storedTokens = null; + } + if (!storedTokens || Date.now() > storedTokens.latestToken.refresh_expires) { + const promise = clientSideTokenGenerator.generateTokenAndStore(config.apiBaseUrl, config.cstg, cstgIdentity, storageManager, logInfo, _logWarn); + logInfo('Generate token using CSTG'); + return { + callback: cb => { + promise.then(result => { + logInfo('Token generation responded, passing the new token on.', result); + cb(result); + }); + } + }; + } + } + } + const useSuppliedToken = !storedTokens?.latestToken || suppliedToken && suppliedToken.identity_expires > storedTokens.latestToken.identity_expires; + const newestAvailableToken = useSuppliedToken ? suppliedToken : storedTokens.latestToken; + logInfo('UID2 module selected latest token', useSuppliedToken, newestAvailableToken); + if (!newestAvailableToken || Date.now() > newestAvailableToken.refresh_expires) { + logInfo('Newest available token is expired and not refreshable.'); + return { + id: null + }; + } + if (Date.now() > newestAvailableToken.identity_expires) { + const promise = refreshTokenAndStore(config.apiBaseUrl, newestAvailableToken, config.clientId, storageManager, logInfo, _logWarn); + logInfo('Token is expired but can be refreshed, attempting refresh.'); + return { + callback: cb => { + promise.then(result => { + logInfo('Refresh reponded, passing the updated token on.', result); + cb(result); + }); + } + }; + } + // If should refresh (but don't need to), refresh in the background. + if (Date.now() > newestAvailableToken.refresh_from) { + logInfo(`Refreshing token in background with low priority.`); + refreshTokenAndStore(config.apiBaseUrl, newestAvailableToken, config.clientId, storageManager, logInfo, _logWarn); + } + const tokens = { + originalToken: suppliedToken ?? storedTokens?.originalToken, + latestToken: newestAvailableToken + }; + if ( true && isCstgEnabled) { + tokens.originalIdentity = storedTokens?.originalIdentity; + } + storageManager.storeValue(tokens); + return { + id: tokens + }; +} +function extractIdentityFromParams(params) { + const keysToCheck = ['emailHash', 'phoneHash', 'email', 'phone']; + for (let key of keysToCheck) { + if (params.hasOwnProperty(key)) { + return { + [key]: params[key] + }; + } + } + return {}; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pbsExtensions"],{ + +/***/ "./libraries/pbsExtensions/pbsExtensions.js": +/*!**************************************************!*\ + !*** ./libraries/pbsExtensions/pbsExtensions.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ pbsExtensions: () => (/* binding */ pbsExtensions) +/* harmony export */ }); +/* harmony import */ var _ortbConverter_lib_mergeProcessors_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ortbConverter/lib/mergeProcessors.js */ "./libraries/ortbConverter/lib/mergeProcessors.js"); +/* harmony import */ var _processors_pbs_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./processors/pbs.js */ "./libraries/pbsExtensions/processors/pbs.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + + + + +/** + * ORTB converter processor set that understands Prebid Server extensions. + * + * Pass this as the `processors` option to `ortbConverter` if your backend is a PBS instance. + */ +const pbsExtensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.memoize)(() => (0,_ortbConverter_lib_mergeProcessors_js__WEBPACK_IMPORTED_MODULE_1__.mergeProcessors)((0,_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.defaultProcessors)(), _processors_pbs_js__WEBPACK_IMPORTED_MODULE_3__.PBS_PROCESSORS, (0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_4__.getProcessors)(_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_4__.PBS))); + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/adUnitCode.js": +/*!**********************************************************!*\ + !*** ./libraries/pbsExtensions/processors/adUnitCode.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setImpAdUnitCode: () => (/* binding */ setImpAdUnitCode) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + +function setImpAdUnitCode(imp, bidRequest) { + const adUnitCode = bidRequest.adUnitCode; + if (adUnitCode) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(imp, `ext.prebid.adunitcode`, adUnitCode); + } +} + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/aliases.js": +/*!*******************************************************!*\ + !*** ./libraries/pbsExtensions/processors/aliases.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setRequestExtPrebidAliases: () => (/* binding */ setRequestExtPrebidAliases) +/* harmony export */ }); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + +function setRequestExtPrebidAliases(ortbRequest, bidderRequest, context) { + let { + am = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"] + } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + if (am.aliasRegistry[bidderRequest.bidderCode]) { + const bidder = am.bidderRegistry[bidderRequest.bidderCode]; + // adding alias only if alias source bidder exists and alias isn't configured to be standalone + // pbs adapter + if (!bidder || !bidder.getSpec().skipPbsAliasing) { + // set alias + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(ortbRequest, `ext.prebid.aliases.${bidderRequest.bidderCode}`, am.aliasRegistry[bidderRequest.bidderCode]); + + // set alias gvlids if present also + const gvlId = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(`gvlMapping.${bidderRequest.bidderCode}`) || bidder?.getSpec?.().gvlid; + if (gvlId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(ortbRequest, `ext.prebid.aliasgvlids.${bidderRequest.bidderCode}`, gvlId); + } + } + } +} + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/eventTrackers.js": +/*!*************************************************************!*\ + !*** ./libraries/pbsExtensions/processors/eventTrackers.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ addEventTrackers: () => (/* binding */ addEventTrackers) +/* harmony export */ }); +/* harmony import */ var _src_eventTrackers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/eventTrackers.js */ "./src/eventTrackers.js"); + +function addEventTrackers(bidResponse, bid) { + bidResponse.eventtrackers = bidResponse.eventtrackers || []; + [[bid.burl, _src_eventTrackers_js__WEBPACK_IMPORTED_MODULE_0__.EVENT_TYPE_IMPRESSION], + // core used to fire burl directly, but only for bids coming from PBS + [bid?.ext?.prebid?.events?.win, _src_eventTrackers_js__WEBPACK_IMPORTED_MODULE_0__.EVENT_TYPE_WIN]].filter(_ref => { + let [winUrl, type] = _ref; + return winUrl && bidResponse.eventtrackers.find(_ref2 => { + let { + method, + event, + url + } = _ref2; + return event === type && method === _src_eventTrackers_js__WEBPACK_IMPORTED_MODULE_0__.TRACKER_METHOD_IMG && url === winUrl; + }) == null; + }).forEach(_ref3 => { + let [url, event] = _ref3; + bidResponse.eventtrackers.push({ + method: _src_eventTrackers_js__WEBPACK_IMPORTED_MODULE_0__.TRACKER_METHOD_IMG, + event, + url + }); + }); +} + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/mediaType.js": +/*!*********************************************************!*\ + !*** ./libraries/pbsExtensions/processors/mediaType.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ SUPPORTED_MEDIA_TYPES: () => (/* binding */ SUPPORTED_MEDIA_TYPES), +/* harmony export */ extPrebidMediaType: () => (/* binding */ extPrebidMediaType) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ortbConverter/processors/mediaType.js */ "./libraries/ortbConverter/processors/mediaType.js"); + + +const SUPPORTED_MEDIA_TYPES = { + // map from pbjs mediaType to its corresponding imp property + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]: 'banner', + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]: 'native', + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]: 'video' +}; + +/** + * Sets bidResponse.mediaType, using ORTB 2.6 `seatbid.bid[].mtype`, falling back to `ext.prebid.type`, falling back to 'banner'. + */ +function extPrebidMediaType(bidResponse, bid, context) { + let mediaType = context.mediaType; + if (!mediaType) { + mediaType = _ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_1__.ORTB_MTYPES.hasOwnProperty(bid.mtype) ? _ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_1__.ORTB_MTYPES[bid.mtype] : bid.ext?.prebid?.type; + if (!SUPPORTED_MEDIA_TYPES.hasOwnProperty(mediaType)) { + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + } + bidResponse.mediaType = mediaType; +} + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/params.js": +/*!******************************************************!*\ + !*** ./libraries/pbsExtensions/processors/params.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setImpBidParams: () => (/* binding */ setImpBidParams) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + +function setImpBidParams(imp, bidRequest) { + let params = bidRequest.params; + if (params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(imp, `ext.prebid.bidder.${bidRequest.bidder}`, params); + } +} + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/pbs.js": +/*!***************************************************!*\ + !*** ./libraries/pbsExtensions/processors/pbs.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ PBS_PROCESSORS: () => (/* binding */ PBS_PROCESSORS) +/* harmony export */ }); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _mediaType_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mediaType.js */ "./libraries/pbsExtensions/processors/mediaType.js"); +/* harmony import */ var _aliases_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./aliases.js */ "./libraries/pbsExtensions/processors/aliases.js"); +/* harmony import */ var _params_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./params.js */ "./libraries/pbsExtensions/processors/params.js"); +/* harmony import */ var _adUnitCode_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./adUnitCode.js */ "./libraries/pbsExtensions/processors/adUnitCode.js"); +/* harmony import */ var _requestExtPrebid_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./requestExtPrebid.js */ "./libraries/pbsExtensions/processors/requestExtPrebid.js"); +/* harmony import */ var _video_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./video.js */ "./libraries/pbsExtensions/processors/video.js"); +/* harmony import */ var _eventTrackers_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./eventTrackers.js */ "./libraries/pbsExtensions/processors/eventTrackers.js"); + + + + + + + + + +const PBS_PROCESSORS = { + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.REQUEST]: { + extPrebid: { + // set request.ext.prebid.auctiontimestamp, .debug and .targeting + fn: _requestExtPrebid_js__WEBPACK_IMPORTED_MODULE_1__.setRequestExtPrebid + }, + extPrebidChannel: { + // sets request.ext.prebid.channel + fn: _requestExtPrebid_js__WEBPACK_IMPORTED_MODULE_1__.setRequestExtPrebidChannel + }, + extPrebidAliases: { + // sets ext.prebid.aliases + fn: _aliases_js__WEBPACK_IMPORTED_MODULE_2__.setRequestExtPrebidAliases + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.IMP]: { + params: { + // sets bid ext.prebid.bidder.[bidderCode] with bidRequest.params, passed through transformBidParams if necessary + fn: _params_js__WEBPACK_IMPORTED_MODULE_3__.setImpBidParams + }, + adUnitCode: { + // sets bid ext.prebid.adunitcode + fn: _adUnitCode_js__WEBPACK_IMPORTED_MODULE_4__.setImpAdUnitCode + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.BID_RESPONSE]: { + mediaType: { + // sets bidResponse.mediaType according to context.mediaType, falling back to imp.ext.prebid.type + fn: _mediaType_js__WEBPACK_IMPORTED_MODULE_5__.extPrebidMediaType, + priority: 99 + }, + videoCache: { + // sets response video attributes; in addition, looks at ext.prebid.cache and .targeting to set video cache key and URL + fn: _video_js__WEBPACK_IMPORTED_MODULE_6__.setBidResponseVideoCache, + priority: -10 // after 'video' + }, + bidderCode: { + // sets bidderCode from on seatbid.seat + fn(bidResponse, bid, context) { + bidResponse.bidderCode = context.seatbid.seat; + bidResponse.adapterCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'ext.prebid.meta.adaptercode') || context.bidRequest?.bidder || bidResponse.bidderCode; + } + }, + pbsBidId: { + // sets bidResponse.pbsBidId from ext.prebid.bidid + fn(bidResponse, bid) { + const bidId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'ext.prebid.bidid'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.isStr)(bidId)) { + bidResponse.pbsBidId = bidId; + } + } + }, + adserverTargeting: { + // sets bidResponse.adserverTargeting from ext.prebid.targeting + fn(bidResponse, bid) { + const targeting = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'ext.prebid.targeting'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.isPlainObject)(targeting)) { + bidResponse.adserverTargeting = targeting; + } + } + }, + extPrebidMeta: { + // sets bidResponse.meta from ext.prebid.meta + fn(bidResponse, bid) { + bidResponse.meta = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.mergeDeep)({}, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'ext.prebid.meta'), bidResponse.meta); + } + }, + pbsWinTrackers: { + // converts "legacy" burl and ext.prebid.events.win into eventtrackers + fn: _eventTrackers_js__WEBPACK_IMPORTED_MODULE_9__.addEventTrackers + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_0__.RESPONSE]: { + serverSideStats: { + // updates bidderRequest and bidRequests with serverErrors from ext.errors and serverResponseTimeMs from ext.responsetimemillis + fn(response, ortbResponse, context) { + Object.entries({ + errors: 'serverErrors', + responsetimemillis: 'serverResponseTimeMs' + }).forEach(_ref => { + let [serverName, clientName] = _ref; + const value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(ortbResponse, `ext.${serverName}.${context.bidderRequest.bidderCode}`); + if (value) { + context.bidderRequest[clientName] = value; + context.bidRequests.forEach(bid => bid[clientName] = value); + } + }); + } + } + } +}; + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/requestExtPrebid.js": +/*!****************************************************************!*\ + !*** ./libraries/pbsExtensions/processors/requestExtPrebid.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setRequestExtPrebid: () => (/* binding */ setRequestExtPrebid), +/* harmony export */ setRequestExtPrebidChannel: () => (/* binding */ setRequestExtPrebidChannel) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); + + + +function setRequestExtPrebid(ortbRequest, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(ortbRequest, 'ext.prebid', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({ + auctiontimestamp: bidderRequest.auctionStart, + targeting: { + includewinners: true, + includebidderkeys: false + } + }, ortbRequest.ext?.prebid)); + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('debug')) { + ortbRequest.ext.prebid.debug = true; + } +} +function setRequestExtPrebidChannel(ortbRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(ortbRequest, 'ext.prebid.channel', Object.assign({ + name: 'pbjs', + version: (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().version + }, ortbRequest.ext?.prebid?.channel)); +} + +/***/ }), + +/***/ "./libraries/pbsExtensions/processors/video.js": +/*!*****************************************************!*\ + !*** ./libraries/pbsExtensions/processors/video.js ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setBidResponseVideoCache: () => (/* binding */ setBidResponseVideoCache) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../src/utils.js */ "./node_modules/dlv/index.js"); + + +function setBidResponseVideoCache(bidResponse, bid) { + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + // try to get cache values from 'response.ext.prebid.cache' + // else try 'bid.ext.prebid.targeting' as fallback + let { + cacheId: videoCacheKey, + url: vastUrl + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ext.prebid.cache.vastXml') || {}; + if (!videoCacheKey || !vastUrl) { + const { + hb_uuid: uuid, + hb_cache_host: cacheHost, + hb_cache_path: cachePath + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ext.prebid.targeting') || {}; + if (uuid && cacheHost && cachePath) { + videoCacheKey = uuid; + vastUrl = `https://${cacheHost}${cachePath}?uuid=${uuid}`; + } + } + if (videoCacheKey && vastUrl) { + Object.assign(bidResponse, { + videoCacheKey, + vastUrl + }); + } + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mspa"],{ + +/***/ "./libraries/mspa/activityControls.js": +/*!********************************************!*\ + !*** ./libraries/mspa/activityControls.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ setupRules: () => (/* binding */ setupRules) +/* harmony export */ }); +/* unused harmony exports isBasicConsentDenied, sensitiveNoticeIs, isConsentDenied, isTransmitUfpdConsentDenied, isTransmitGeoConsentDenied, mspaRule */ +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + + + +// default interpretation for MSPA consent(s): +// https://docs.prebid.org/features/mspa-usnat.html + +const SENSITIVE_DATA_GEO = 7; +function isApplicable(val) { + return val != null && val !== 0; +} +function isBasicConsentDenied(cd) { + // service provider mode is always consent denied + return ['MspaServiceProviderMode', 'Gpc'].some(prop => cd[prop] === 1) || + // you cannot consent to what you were not notified of + cd.PersonalDataConsents === 2 || + // minors 13+ who have not given consent + cd.KnownChildSensitiveDataConsents[0] === 1 || + // minors 16+ who have not given consent (added in usnat version 2) + cd.KnownChildSensitiveDataConsents[2] === 1 || + // minors under 13 cannot consent + isApplicable(cd.KnownChildSensitiveDataConsents[1]) || + // covered cannot be zero + cd.MspaCoveredTransaction === 0; +} +function sensitiveNoticeIs(cd, value) { + return ['SensitiveDataProcessingOptOutNotice', 'SensitiveDataLimitUseNotice'].some(prop => cd[prop] === value); +} +function isConsentDenied(cd) { + return isBasicConsentDenied(cd) || ['Sale', 'Sharing', 'TargetedAdvertising'].some(scope => { + const oo = cd[`${scope}OptOut`]; + const notice = cd[`${scope}OptOutNotice`]; + // user opted out + return oo === 1 || + // opt-out notice was not given + notice === 2 || + // do not trust CMP if it signals opt-in but no opt-out notice was given + oo === 2 && notice === 0; + }) || + // no sharing notice was given ... + cd.SharingNotice === 2 || + // ... or the CMP says it was not applicable, while also claiming it got consent + cd.SharingOptOut === 2 && cd.SharingNotice === 0; +} +const isTransmitUfpdConsentDenied = (() => { + const sensitiveFlags = (() => { + // deny anything that smells like: genetic, biometric, state/national ID, financial, union membership, + // personal communication data, status as victim of crime (version 2), status as transgender/nonbinary (version 2) + const cannotBeInScope = [6, 7, 9, 10, 12, 14, 16].map(el => --el); + // require consent for everything else (except geo, which is treated separately) + const allExceptGeo = Array.from(Array(16).keys()).filter(el => el !== SENSITIVE_DATA_GEO); + const mustHaveConsent = allExceptGeo.filter(el => !cannotBeInScope.includes(el)); + return Object.fromEntries(Object.entries({ + 1: 12, + 2: 16 + }).map(_ref => { + let [version, cardinality] = _ref; + const isInVersion = el => el < cardinality; + return [version, { + cannotBeInScope: cannotBeInScope.filter(isInVersion), + allExceptGeo: allExceptGeo.filter(isInVersion), + mustHaveConsent: mustHaveConsent.filter(isInVersion) + }]; + })); + })(); + return function (cd) { + const { + cannotBeInScope, + mustHaveConsent, + allExceptGeo + } = sensitiveFlags[cd.Version]; + return isConsentDenied(cd) || + // no notice about sensitive data was given + sensitiveNoticeIs(cd, 2) || + // extra-sensitive data is applicable + cannotBeInScope.some(i => isApplicable(cd.SensitiveDataProcessing[i])) || + // user opted out for not-as-sensitive data + mustHaveConsent.some(i => cd.SensitiveDataProcessing[i] === 1) || + // CMP says it has consent, but did not give notice about it + sensitiveNoticeIs(cd, 0) && allExceptGeo.some(i => cd.SensitiveDataProcessing[i] === 2); + }; +})(); +function isTransmitGeoConsentDenied(cd) { + const geoConsent = cd.SensitiveDataProcessing[SENSITIVE_DATA_GEO]; + return geoConsent === 1 || isBasicConsentDenied(cd) || + // no sensitive data notice was given + sensitiveNoticeIs(cd, 2) || + // do not trust CMP if it says it has consent for geo but didn't show a sensitive data notice + sensitiveNoticeIs(cd, 0) && geoConsent === 2; +} +const CONSENT_RULES = { + [_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_0__.ACTIVITY_SYNC_USER]: isConsentDenied, + [_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_0__.ACTIVITY_ENRICH_EIDS]: isConsentDenied, + [_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_0__.ACTIVITY_ENRICH_UFPD]: isTransmitUfpdConsentDenied, + [_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_0__.ACTIVITY_TRANSMIT_PRECISE_GEO]: isTransmitGeoConsentDenied +}; +function mspaRule(sids, getConsent, denies) { + let applicableSids = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : () => _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__.gppDataHandler.getConsentData()?.applicableSections; + return function () { + if (applicableSids().some(sid => sids.includes(sid))) { + const consent = getConsent(); + if (consent == null) { + return { + allow: false, + reason: 'consent data not available' + }; + } + if (![1, 2].includes(consent.Version)) { + return { + allow: false, + reason: `unsupported consent specification version "${consent.Version}"` + }; + } + if (denies(consent)) { + return { + allow: false + }; + } + } + }; +} +function flatSection(subsections) { + if (!Array.isArray(subsections)) return subsections; + return subsections.reduceRight((subsection, consent) => { + return Object.assign(consent, subsection); + }, {}); +} +function setupRules(api, sids) { + let normalizeConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : c => c; + let rules = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : CONSENT_RULES; + let registerRule = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_2__.registerActivityControl; + let getConsentData = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : () => _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__.gppDataHandler.getConsentData(); + const unreg = []; + const ruleName = `MSPA (GPP '${api}' for section${sids.length > 1 ? 's' : ''} ${sids.join(', ')})`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`Enabling activity controls for ${ruleName}`); + Object.entries(rules).forEach(_ref2 => { + let [activity, denies] = _ref2; + unreg.push(registerRule(activity, ruleName, mspaRule(sids, () => normalizeConsent(flatSection(getConsentData()?.parsedSections?.[api])), denies, () => getConsentData()?.applicableSections || []))); + }); + return () => unreg.forEach(ur => ur()); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["timeToFirstBytesUtils"],{ + +/***/ "./libraries/timeToFirstBytesUtils/timeToFirstBytesUtils.js": +/*!******************************************************************!*\ + !*** ./libraries/timeToFirstBytesUtils/timeToFirstBytesUtils.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getTimeToFirstByte: () => (/* binding */ getTimeToFirstByte) +/* harmony export */ }); +/** + * Calculates the Time to First Byte (TTFB) for the given window object. + * + * This function attempts to use the Navigation Timing Level 2 API first, and falls back to + * the Navigation Timing Level 1 API if the former is not available. + * + * @param {Window} win - The window object from which to retrieve performance timing information. + * @returns {string} The TTFB in milliseconds as a string, or an empty string if the TTFB cannot be determined. + */ +function getTimeToFirstByte(win) { + const performance = win.performance || win.webkitPerformance || win.msPerformance || win.mozPerformance; + const ttfbWithTimingV2 = performance && typeof performance.getEntriesByType === 'function' && Object.prototype.toString.call(performance.getEntriesByType) === '[object Function]' && performance.getEntriesByType('navigation')[0] && performance.getEntriesByType('navigation')[0].responseStart && performance.getEntriesByType('navigation')[0].requestStart && performance.getEntriesByType('navigation')[0].responseStart > 0 && performance.getEntriesByType('navigation')[0].requestStart > 0 && Math.round(performance.getEntriesByType('navigation')[0].responseStart - performance.getEntriesByType('navigation')[0].requestStart); + if (ttfbWithTimingV2) { + return ttfbWithTimingV2.toString(); + } + const ttfbWithTimingV1 = performance && performance.timing.responseStart && performance.timing.requestStart && performance.timing.responseStart > 0 && performance.timing.requestStart > 0 && performance.timing.responseStart - performance.timing.requestStart; + return ttfbWithTimingV1 ? ttfbWithTimingV1.toString() : ''; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pageInfosUtils"],{ + +/***/ "./libraries/pageInfosUtils/pageInfosUtils.js": +/*!****************************************************!*\ + !*** ./libraries/pageInfosUtils/pageInfosUtils.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getConnectionDownLink: () => (/* binding */ getConnectionDownLink), +/* harmony export */ getPageDescription: () => (/* binding */ getPageDescription), +/* harmony export */ getPageTitle: () => (/* binding */ getPageTitle), +/* harmony export */ getReferrerInfo: () => (/* binding */ getReferrerInfo) +/* harmony export */ }); +/** + * Retrieves the referrer information from the bidder request. + * + * @param {Object} bidderRequest - The bidder request object. + * @param {Object} [bidderRequest.refererInfo] - The referer information object. + * @param {string} [bidderRequest.refererInfo.page] - The page URL of the referer. + * @returns {string} The referrer URL if available, otherwise an empty string. + */ +function getReferrerInfo(bidderRequest) { + let ref = ''; + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + ref = bidderRequest.refererInfo.page; + } + return ref; +} + +/** + * Retrieves the title of the current web page. + * + * This function attempts to get the title from the top-level window's document. + * If an error occurs (e.g., due to cross-origin restrictions), it falls back to the current document. + * It first tries to get the title from the `og:title` meta tag, and if that is not available, it uses the document's title. + * + * @returns {string} The title of the current web page, or an empty string if no title is found. + */ +function getPageTitle() { + try { + const ogTitle = window.top.document.querySelector('meta[property="og:title"]'); + return window.top.document.title || ogTitle && ogTitle.content || ''; + } catch (e) { + const ogTitle = document.querySelector('meta[property="og:title"]'); + return document.title || ogTitle && ogTitle.content || ''; + } +} + +/** + * Retrieves the content of the page description meta tag. + * + * This function attempts to get the description from the top-level window's document. + * If it fails (e.g., due to cross-origin restrictions), it falls back to the current document. + * It looks for meta tags with either the name "description" or the property "og:description". + * + * @returns {string} The content of the description meta tag, or an empty string if not found. + */ +function getPageDescription() { + try { + const element = window.top.document.querySelector('meta[name="description"]') || window.top.document.querySelector('meta[property="og:description"]'); + return element && element.content || ''; + } catch (e) { + const element = document.querySelector('meta[name="description"]') || document.querySelector('meta[property="og:description"]'); + return element && element.content || ''; + } +} + +/** + * Retrieves the downlink speed of the user's network connection. + * + * @param {object} nav - The navigator object, typically `window.navigator`. + * @returns {string} The downlink speed as a string if available, otherwise an empty string. + */ +function getConnectionDownLink(nav) { + return nav && nav.connection && nav.connection.downlink >= 0 ? nav.connection.downlink.toString() : ''; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["processResponse"],{ + +/***/ "./libraries/processResponse/index.js": +/*!********************************************!*\ + !*** ./libraries/processResponse/index.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBidFromResponse: () => (/* binding */ getBidFromResponse) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + +function getBidFromResponse(respItem, LOG_ERROR_MESS) { + if (!respItem) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_ERROR_MESS.emptySeatbid); + } else if (!respItem.bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem)); + } else if (!respItem.bid[0]) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_ERROR_MESS.noBid); + } + return respItem && respItem.bid && respItem.bid[0]; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vidazooUtils"],{ + +/***/ "./libraries/vidazooUtils/bidderUtils.js": +/*!***********************************************!*\ + !*** ./libraries/vidazooUtils/bidderUtils.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createBuildRequestsFn: () => (/* binding */ createBuildRequestsFn), +/* harmony export */ createInterpretResponseFn: () => (/* binding */ createInterpretResponseFn), +/* harmony export */ createSessionId: () => (/* binding */ createSessionId), +/* harmony export */ createUserSyncGetter: () => (/* binding */ createUserSyncGetter), +/* harmony export */ getCacheOpt: () => (/* binding */ getCacheOpt), +/* harmony export */ getNextDealId: () => (/* binding */ getNextDealId), +/* harmony export */ getVidazooSessionId: () => (/* binding */ getVidazooSessionId), +/* harmony export */ isBidRequestValid: () => (/* binding */ isBidRequestValid), +/* harmony export */ onBidWon: () => (/* binding */ onBidWon), +/* harmony export */ tryParseJSON: () => (/* binding */ tryParseJSON) +/* harmony export */ }); +/* unused harmony exports getTopWindowQueryParams, extractCID, extractPID, extractSubDomain, setStorageItem, getStorageItem, getUniqueDealId, hashCode, appendUserIdsToRequestPayload, buildRequestData */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _chunk_chunk_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../chunk/chunk.js */ "./libraries/chunk/chunk.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants.js */ "./libraries/vidazooUtils/constants.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +function createSessionId() { + return 'wsid_' + parseInt(Date.now() * Math.random()); +} +function getTopWindowQueryParams() { + try { + const parsedUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseUrl)(window.top.document.URL, { + decodeSearchAsString: true + }); + return parsedUrl.search; + } catch (e) { + return ''; + } +} +function extractCID(params) { + return params.cId || params.CID || params.cID || params.CId || params.cid || params.ciD || params.Cid || params.CiD; +} +function extractPID(params) { + return params.pId || params.PID || params.pID || params.PId || params.pid || params.piD || params.Pid || params.PiD; +} +function extractSubDomain(params) { + return params.subDomain || params.SubDomain || params.Subdomain || params.subdomain || params.SUBDOMAIN || params.subDOMAIN; +} +function isBidRequestValid(bid) { + const params = bid.params || {}; + return !!(extractCID(params) && extractPID(params)); +} +function tryParseJSON(value) { + try { + return JSON.parse(value); + } catch (e) { + return value; + } +} +function setStorageItem(storage, key, value, timestamp) { + try { + const created = timestamp || Date.now(); + const data = JSON.stringify({ + value, + created + }); + storage.setDataInLocalStorage(key, data); + } catch (e) {} +} +function getStorageItem(storage, key) { + try { + return tryParseJSON(storage.getDataFromLocalStorage(key, null)); + } catch (e) {} + return null; +} +function getCacheOpt(storage, useKey) { + let data = storage.getDataFromLocalStorage(useKey, null); + if (!data) { + data = String(Date.now()); + storage.setDataInLocalStorage(useKey, data, null); + } + return data; +} +function getUniqueDealId(storage, key) { + let expiry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants_js__WEBPACK_IMPORTED_MODULE_1__.UNIQUE_DEAL_ID_EXPIRY; + const storageKey = `u_${key}`; + const now = Date.now(); + const data = getStorageItem(storage, storageKey); + let uniqueId; + if (!data || !data.value || now - data.created > expiry) { + uniqueId = `${key}_${now.toString()}`; + setStorageItem(storage, storageKey, uniqueId); + } else { + uniqueId = data.value; + } + return uniqueId; +} +function getNextDealId(storage, key) { + let expiry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants_js__WEBPACK_IMPORTED_MODULE_1__.DEAL_ID_EXPIRY; + try { + const data = getStorageItem(storage, key); + let currentValue = 0; + let timestamp; + if (data && data.value && Date.now() - data.created < expiry) { + currentValue = data.value; + timestamp = data.created; + } + const nextValue = currentValue + 1; + setStorageItem(storage, key, nextValue, timestamp); + return nextValue; + } catch (e) { + return 0; + } +} +function hashCode(s) { + let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '_'; + const l = s.length; + let h = 0; + let i = 0; + if (l > 0) { + while (i < l) { + h = (h << 5) - h + s.charCodeAt(i++) | 0; + } + } + return prefix + h; +} +function onBidWon(bid) { + if (!bid.nurl) { + return; + } + const wonBid = { + adId: bid.adId, + creativeId: bid.creativeId, + auctionId: bid.auctionId, + transactionId: bid.transactionId, + adUnitCode: bid.adUnitCode, + cpm: bid.cpm, + currency: bid.currency, + originalCpm: bid.originalCpm, + originalCurrency: bid.originalCurrency, + netRevenue: bid.netRevenue, + mediaType: bid.mediaType, + timeToRespond: bid.timeToRespond, + status: bid.status + }; + const qs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)(wonBid); + const url = bid.nurl + (bid.nurl.indexOf('?') === -1 ? '?' : '&') + qs; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel)(url); +} + +/** + * Create the spec function for getting user syncs + * + * The options object accepts the following fields: + * + * - iframeSyncUrl + * - imageSyncUrl + * + * @param options + */ +function createUserSyncGetter() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + iframeSyncUrl: '', + imageSyncUrl: '' + }; + return function getUserSyncs(syncOptions, responses) { + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let uspConsent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + let gppConsent = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + const syncs = []; + const { + iframeEnabled, + pixelEnabled + } = syncOptions; + const { + gdprApplies, + consentString = '' + } = gdprConsent; + const { + gppString, + applicableSections + } = gppConsent; + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') ? 1 : 0; + const cidArr = responses.filter(resp => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(resp, 'body.cid')).map(resp => resp.body.cid).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.uniques); + let params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}&coppa=${encodeURIComponent(coppa)}`; + if (gppString && applicableSections?.length) { + params += '&gpp=' + encodeURIComponent(gppString); + params += '&gpp_sid=' + encodeURIComponent(applicableSections.join(',')); + } + if (iframeEnabled && options.iframeSyncUrl) { + syncs.push({ + type: 'iframe', + url: `${options.iframeSyncUrl}/${params}` + }); + } + if (pixelEnabled && options.imageSyncUrl) { + syncs.push({ + type: 'image', + url: `${options.imageSyncUrl}/${params}` + }); + } + return syncs; + }; +} +function appendUserIdsToRequestPayload(payloadRef, userIds) { + let key; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(userIds, (userId, idSystemProviderName) => { + key = `uid.${idSystemProviderName}`; + switch (idSystemProviderName) { + case 'lipb': + payloadRef[key] = userId.lipbid; + break; + case 'id5id': + payloadRef[key] = userId.uid; + break; + default: + payloadRef[key] = userId; + } + }); +} +function getVidazooSessionId(storage) { + return getStorageItem(storage, _constants_js__WEBPACK_IMPORTED_MODULE_1__.SESSION_ID_KEY) || ''; +} +function buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, storage, bidderVersion, bidderCode, getUniqueRequestData) { + const { + params, + bidId, + userId, + adUnitCode, + schain, + mediaTypes, + ortb2Imp, + bidderRequestId, + bidRequestsCount, + bidderRequestsCount, + bidderWinsCount + } = bid; + const { + ext + } = params; + let { + bidFloor + } = params; + const hashUrl = hashCode(topWindowUrl); + const uniqueRequestData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(getUniqueRequestData) ? getUniqueRequestData(hashUrl, bid) : {}; + const uniqueDealId = getUniqueDealId(storage, hashUrl); + const pId = extractPID(params); + const isStorageAllowed = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_4__.bidderSettings.get(bidderCode, 'storageAllowed'); + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.data.pbadslot', ''); + const cat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.site.cat', []); + const pagecat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.site.pagecat', []); + const contentData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.site.content.data', []); + const userData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.user.data', []); + const contentLang = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.site.content.language') || document.documentElement.lang; + const coppa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.coppa', 0); + const device = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.device', {}); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if (floorInfo?.currency === 'USD') { + bidFloor = floorInfo.floor; + } + } + let data = { + url: encodeURIComponent(topWindowUrl), + uqs: getTopWindowQueryParams(), + cb: Date.now(), + bidFloor: bidFloor, + bidId: bidId, + referrer: bidderRequest.refererInfo.ref, + adUnitCode: adUnitCode, + publisherId: pId, + sizes: sizes, + uniqueDealId: uniqueDealId, + bidderVersion: bidderVersion, + prebidVersion: "9.45.0-pre", + res: `${screen.width}x${screen.height}`, + schain: schain, + mediaTypes: mediaTypes, + isStorageAllowed: isStorageAllowed, + gpid: gpid, + cat: cat, + contentData, + contentLang, + coppa, + userData: userData, + pagecat: pagecat, + transactionId: ortb2Imp?.ext?.tid, + bidderRequestId: bidderRequestId, + bidRequestsCount: bidRequestsCount, + bidderRequestsCount: bidderRequestsCount, + bidderWinsCount: bidderWinsCount, + bidderTimeout: bidderTimeout, + device, + ...uniqueRequestData + }; + appendUserIdsToRequestPayload(data, userId); + const sua = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.device.sua'); + if (sua) { + data.sua = sua; + } + if (bidderRequest.gdprConsent) { + if (bidderRequest.gdprConsent.consentString) { + data.gdprConsent = bidderRequest.gdprConsent.consentString; + } + if (bidderRequest.gdprConsent.gdprApplies !== undefined) { + data.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + } + if (bidderRequest.uspConsent) { + data.usPrivacy = bidderRequest.uspConsent; + } + if (bidderRequest.gppConsent) { + data.gppString = bidderRequest.gppConsent.gppString; + data.gppSid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest.ortb2?.regs?.gpp) { + data.gppString = bidderRequest.ortb2.regs.gpp; + data.gppSid = bidderRequest.ortb2.regs.gpp_sid; + } + if (bidderRequest.paapi?.enabled) { + const fledge = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2Imp.ext.ae'); + if (fledge) { + data.fledge = fledge; + } + } + const api = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mediaTypes, 'video.api', []); + if (api.includes(7)) { + const sourceExt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.source.ext'); + if (sourceExt?.omidpv) { + data.omidpv = sourceExt.omidpv; + } + if (sourceExt?.omidpn) { + data.omidpn = sourceExt.omidpn; + } + } + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.ext.dsa'); + if (dsa) { + data.dsa = dsa; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(ext, (value, key) => { + data['ext.' + key] = value; + }); + return data; +} +function createInterpretResponseFn(bidderCode, allowSingleRequest) { + return function interpretResponse(serverResponse, request) { + if (!serverResponse || !serverResponse.body) { + return []; + } + const singleRequestMode = allowSingleRequest && _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(`${bidderCode}.singleRequest`); + const reqBidId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request, 'data.bidId'); + const { + results + } = serverResponse.body; + let output = []; + try { + results.forEach((result, i) => { + const { + creativeId, + ad, + price, + exp, + width, + height, + currency, + bidId, + nurl, + advertiserDomains, + metaData, + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER + } = result; + if (!ad || !price) { + return; + } + const response = { + requestId: singleRequestMode && bidId ? bidId : reqBidId, + cpm: price, + width: width, + height: height, + creativeId: creativeId, + currency: currency || _constants_js__WEBPACK_IMPORTED_MODULE_1__.CURRENCY, + netRevenue: true, + ttl: exp || _constants_js__WEBPACK_IMPORTED_MODULE_1__.TTL_SECONDS + }; + if (nurl) { + response.nurl = nurl; + } + if (metaData) { + Object.assign(response, { + meta: metaData + }); + } else { + Object.assign(response, { + meta: { + advertiserDomains: advertiserDomains || [] + } + }); + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) { + Object.assign(response, { + ad: ad + }); + } else { + Object.assign(response, { + vastXml: ad, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO + }); + } + output.push(response); + }); + return output; + } catch (e) { + return []; + } + }; +} +function createBuildRequestsFn(createRequestDomain, createUniqueRequestData, storage, bidderCode, bidderVersion, allowSingleRequest) { + function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) { + const { + params + } = bid; + const cId = extractCID(params); + const subDomain = extractSubDomain(params); + const data = buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, storage, bidderVersion, bidderCode, createUniqueRequestData); + const dto = { + method: 'POST', + url: `${createRequestDomain(subDomain)}/prebid/multi/${cId}`, + data: data + }; + return dto; + } + function buildSingleRequest(bidRequests, bidderRequest, topWindowUrl, bidderTimeout) { + const { + params + } = bidRequests[0]; + const cId = extractCID(params); + const subDomain = extractSubDomain(params); + const data = bidRequests.map(bid => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(bid.sizes); + return buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, storage, bidderVersion, bidderCode, createUniqueRequestData); + }); + const chunkSize = Math.min(20, _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(`${bidderCode}.chunkSize`) || 10); + const chunkedData = (0,_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_6__.chunk)(data, chunkSize); + return chunkedData.map(chunk => { + return { + method: 'POST', + url: `${createRequestDomain(subDomain)}/prebid/multi/${cId}`, + data: { + bids: chunk + } + }; + }); + } + return function buildRequests(validBidRequests, bidderRequest) { + const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation; + const bidderTimeout = bidderRequest.timeout || _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('bidderTimeout'); + const singleRequestMode = allowSingleRequest && _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(`${bidderCode}.singleRequest`); + const requests = []; + if (singleRequestMode) { + // banner bids are sent as a single request + const bannerBidRequests = validBidRequests.filter(bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.mediaTypes) ? bid.mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) : bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER] !== undefined); + if (bannerBidRequests.length > 0) { + const singleRequests = buildSingleRequest(bannerBidRequests, bidderRequest, topWindowUrl, bidderTimeout); + requests.push(...singleRequests); + } + + // video bids are sent as a single request for each bid + + const videoBidRequests = validBidRequests.filter(bid => bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO] !== undefined); + videoBidRequests.forEach(validBidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(validBidRequest.sizes); + const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout); + requests.push(request); + }); + } else { + validBidRequests.forEach(validBidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(validBidRequest.sizes); + const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout); + requests.push(request); + }); + } + return requests; + }; +} + +/***/ }), + +/***/ "./libraries/vidazooUtils/constants.js": +/*!*********************************************!*\ + !*** ./libraries/vidazooUtils/constants.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CURRENCY: () => (/* binding */ CURRENCY), +/* harmony export */ DEAL_ID_EXPIRY: () => (/* binding */ DEAL_ID_EXPIRY), +/* harmony export */ OPT_CACHE_KEY: () => (/* binding */ OPT_CACHE_KEY), +/* harmony export */ OPT_TIME_KEY: () => (/* binding */ OPT_TIME_KEY), +/* harmony export */ SESSION_ID_KEY: () => (/* binding */ SESSION_ID_KEY), +/* harmony export */ TTL_SECONDS: () => (/* binding */ TTL_SECONDS), +/* harmony export */ UNIQUE_DEAL_ID_EXPIRY: () => (/* binding */ UNIQUE_DEAL_ID_EXPIRY) +/* harmony export */ }); +const CURRENCY = 'USD'; +const TTL_SECONDS = 60 * 5; +const DEAL_ID_EXPIRY = 1000 * 60 * 15; +const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60; +const SESSION_ID_KEY = 'vidSid'; +const OPT_CACHE_KEY = 'vdzwopt'; +const OPT_TIME_KEY = 'vdzHum'; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["intentIqUtils"],{ + +/***/ "./libraries/intentIqUtils/detectBrowserUtils.js": +/*!*******************************************************!*\ + !*** ./libraries/intentIqUtils/detectBrowserUtils.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ detectBrowser: () => (/* binding */ detectBrowser) +/* harmony export */ }); +/* unused harmony exports detectBrowserFromUserAgent, detectBrowserFromUserAgentData */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * Detects the browser using either userAgent or userAgentData + * @return {string} The name of the detected browser or 'unknown' if unable to detect + */ +function detectBrowser() { + try { + if (navigator.userAgent) { + return detectBrowserFromUserAgent(navigator.userAgent); + } else if (navigator.userAgentData) { + return detectBrowserFromUserAgentData(navigator.userAgentData); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Error detecting browser:', error); + } + return 'unknown'; +} + +/** + * Detects the browser from the user agent string + * @param {string} userAgent - The user agent string from the browser + * @return {string} The name of the detected browser or 'unknown' if unable to detect + */ +function detectBrowserFromUserAgent(userAgent) { + const browserRegexPatterns = { + opera: /Opera|OPR/, + edge: /Edg/, + chrome: /Chrome|CriOS/, + safari: /Safari/, + firefox: /Firefox/, + ie: /MSIE|Trident/ + }; + + // Check for Edge first + if (browserRegexPatterns.edge.test(userAgent)) { + return 'edge'; + } + + // Check for Opera next + if (browserRegexPatterns.opera.test(userAgent)) { + return 'opera'; + } + + // Check for Chrome first to avoid confusion with Safari + if (browserRegexPatterns.chrome.test(userAgent)) { + return 'chrome'; + } + + // Now we can safely check for Safari + if (browserRegexPatterns.safari.test(userAgent) && !browserRegexPatterns.chrome.test(userAgent)) { + return 'safari'; + } + + // Check other browsers + for (const browser in browserRegexPatterns) { + if (browserRegexPatterns[browser].test(userAgent)) { + return browser; + } + } + return 'unknown'; +} + +/** + * Detects the browser from the NavigatorUAData object + * @param {Object} userAgentData - The user agent data object from the browser + * @return {string} The name of the detected browser or 'unknown' if unable to detect + */ +function detectBrowserFromUserAgentData(userAgentData) { + const brandNames = userAgentData.brands.map(brand => brand.brand); + if (brandNames.includes('Microsoft Edge')) { + return 'edge'; + } else if (brandNames.includes('Opera')) { + return 'opera'; + } else if (brandNames.some(brand => brand === 'Chromium' || brand === 'Google Chrome')) { + return 'chrome'; + } + return 'unknown'; +} + +/***/ }), + +/***/ "./libraries/intentIqUtils/getCmpData.js": +/*!***********************************************!*\ + !*** ./libraries/intentIqUtils/getCmpData.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getCmpData: () => (/* binding */ getCmpData) +/* harmony export */ }); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/consentHandler.js */ "./src/consentHandler.js"); + + +/** + * Retrieves consent data from the Consent Management Platform (CMP). + * @return {Object} An object containing the following fields: + * - `gdprString` (string): GDPR consent string if available. + * - `uspString` (string): USP consent string if available. + * - `gppString` (string): GPP consent string if available. + */ +function getCmpData() { + const consentData = _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_0__.allConsent.getConsentData(); + return { + gdprApplies: consentData?.gdpr?.gdprApplies || false, + gdprString: typeof consentData?.gdpr?.consentString === 'string' ? consentData.gdpr.consentString : null, + uspString: typeof consentData?.usp === 'string' ? consentData.usp : null, + gppString: typeof consentData?.gpp?.gppString === 'string' ? consentData.gpp.gppString : null + }; +} + +/***/ }), + +/***/ "./libraries/intentIqUtils/getRefferer.js": +/*!************************************************!*\ + !*** ./libraries/intentIqUtils/getRefferer.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ appendVrrefAndFui: () => (/* binding */ appendVrrefAndFui), +/* harmony export */ getReferrer: () => (/* binding */ getReferrer) +/* harmony export */ }); +/* unused harmony exports getRelevantRefferer, isDomainIncluded */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * Determines if the script is running inside an iframe and retrieves the URL. + * @return {string} The encoded vrref value representing the relevant URL. + */ +function getReferrer() { + try { + const url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSelf)() === (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)() ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowLocation)().href : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)().location.href; + if (url.length >= 50) { + const { + origin + } = new URL(url); + return origin; + } + return url; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`Error accessing location: ${error}`); + return ''; + } +} + +/** + * Appends `vrref` and `fui` parameters to the provided URL. + * If the referrer URL is available, it appends `vrref` with the relevant referrer value based on the domain. + * Otherwise, it appends `fui=1`. If a domain name is provided, it may also append `vrref` with the domain. + * @param {string} url - The URL to append parameters to. + * @param {string} domainName - The domain name used to determine the relevant referrer. + * @return {string} The modified URL with appended `vrref` or `fui` parameters. + */ +function appendVrrefAndFui(url, domainName) { + const fullUrl = encodeURIComponent(getReferrer()); + if (fullUrl) { + return url += '&vrref=' + getRelevantRefferer(domainName, fullUrl); + } + url += '&fui=1'; // Full Url Issue + url += '&vrref=' + encodeURIComponent(domainName || ''); + return url; +} + +/** + * Get the relevant referrer based on full URL and domain + * @param {string} domainName The domain name to compare + * @param {string} fullUrl The full URL to analyze + * @return {string} The relevant referrer + */ +function getRelevantRefferer(domainName, fullUrl) { + if (domainName && isDomainIncluded(fullUrl, domainName)) { + return fullUrl; + } + return domainName ? encodeURIComponent(domainName) : fullUrl; +} + +/** + * Checks if the provided domain name is included in the full URL. + * @param {string} fullUrl - The full URL to check. + * @param {string} domainName - The domain name to search for within the URL. + * @return {boolean} `True` if the domain name is found in the URL, `false` otherwise. + */ +function isDomainIncluded(fullUrl, domainName) { + try { + return fullUrl.includes(domainName); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`Invalid URL provided: ${error}`); + return false; + } +} + +/***/ }), + +/***/ "./libraries/intentIqUtils/getSyncKey.js": +/*!***********************************************!*\ + !*** ./libraries/intentIqUtils/getSyncKey.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ SYNC_KEY: () => (/* binding */ SYNC_KEY) +/* harmony export */ }); +const SYNC_KEY = partner => '_iiq_sync' + '_' + partner; + +/***/ }), + +/***/ "./libraries/intentIqUtils/handleAdditionalParams.js": +/*!***********************************************************!*\ + !*** ./libraries/intentIqUtils/handleAdditionalParams.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ handleAdditionalParams: () => (/* binding */ handleAdditionalParams) +/* harmony export */ }); +/* harmony import */ var _intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../intentIqConstants/intentIqConstants.js */ "./libraries/intentIqConstants/intentIqConstants.js"); + + +/** + * Appends additional parameters to a URL if they are valid and applicable for the given request destination. + * + * @param {string} browser - The name of the current browser; used to look up the maximum URL length. + * @param {string} url - The base URL to which additional parameters may be appended. + * @param {(string|number)} requestTo - The destination identifier; used as an index to check if a parameter applies. + * @param {Array} additionalParams - An array of parameter objects to append. + * Each parameter object should have the following properties: + * - `parameterName` {string}: The name of the parameter. + * - `parameterValue` {*}: The value of the parameter. + * - `destination` {Object|Array}: An object or array indicating the applicable destinations. Sync = 0, VR = 1, reporting = 2 + * + * @return {string} The resulting URL with additional parameters appended if valid; otherwise, the original URL. + */ +function handleAdditionalParams(browser, url, requestTo, additionalParams) { + let queryString = ''; + if (!Array.isArray(additionalParams)) return url; + for (let i = 0; i < additionalParams.length; i++) { + const param = additionalParams[i]; + if (typeof param !== 'object' || !param.parameterName || !param.parameterValue || !param.destination || !Array.isArray(param.destination)) { + continue; + } + if (param.destination[requestTo]) { + queryString += `&agp_${encodeURIComponent(param.parameterName)}=${param.parameterValue}`; + } + } + const maxLength = _intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_0__.MAX_REQUEST_LENGTH[browser] ?? 2048; + if (url.length + queryString.length > maxLength) return url; + return url + queryString; +} + +/***/ }), + +/***/ "./libraries/intentIqUtils/intentIqConfig.js": +/*!***************************************************!*\ + !*** ./libraries/intentIqUtils/intentIqConfig.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ iiqPixelServerAddress: () => (/* binding */ iiqPixelServerAddress), +/* harmony export */ iiqServerAddress: () => (/* binding */ iiqServerAddress), +/* harmony export */ reportingServerAddress: () => (/* binding */ reportingServerAddress) +/* harmony export */ }); +const iiqServerAddress = (configParams, gdprDetected) => typeof configParams?.iiqServerAddress === 'string' ? configParams.iiqServerAddress : gdprDetected ? 'https://api-gdpr.intentiq.com' : 'https://api.intentiq.com'; +const iiqPixelServerAddress = (configParams, gdprDetected) => typeof configParams?.iiqPixelServerAddress === 'string' ? configParams.iiqPixelServerAddress : gdprDetected ? 'https://sync-gdpr.intentiq.com' : 'https://sync.intentiq.com'; +const reportingServerAddress = (configParams, gdprDetected) => typeof configParams?.params?.reportingServerAddress === 'string' ? configParams.params.reportingServerAddress : gdprDetected ? 'https://reports-gdpr.intentiq.com/report' : 'https://reports.intentiq.com/report'; + +/***/ }), + +/***/ "./libraries/intentIqUtils/storageUtils.js": +/*!*************************************************!*\ + !*** ./libraries/intentIqUtils/storageUtils.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ defineStorageType: () => (/* binding */ defineStorageType), +/* harmony export */ readData: () => (/* binding */ readData), +/* harmony export */ removeDataByKey: () => (/* binding */ removeDataByKey), +/* harmony export */ storeData: () => (/* binding */ storeData), +/* harmony export */ tryParse: () => (/* binding */ tryParse) +/* harmony export */ }); +/* unused harmony export storage */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../libraries/intentIqConstants/intentIqConstants.js */ "./libraries/intentIqConstants/intentIqConstants.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/activities/modules.js */ "./src/activities/modules.js"); + + + + +const MODULE_NAME = 'intentIqId'; +const PCID_EXPIRY = 365; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** + * Read data from local storage or cookie based on allowed storage types. + * @param {string} key - The key to read data from. + * @param {Array} allowedStorage - Array of allowed storage types ('html5' or 'cookie'). + * @return {string|null} - The retrieved data or null if an error occurs. + */ +function readData(key, allowedStorage) { + try { + if (storage.hasLocalStorage() && allowedStorage.includes('html5')) { + return storage.getDataFromLocalStorage(key); + } + if (storage.cookiesAreEnabled() && allowedStorage.includes('cookie')) { + return storage.getCookie(key); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Error reading data`, error); + } + return null; +} + +/** + * Store Intent IQ data in cookie, local storage or both of them + * expiration date: 365 days + * @param {string} key - The key under which the data will be stored. + * @param {string} value - The value to be stored (e.g., IntentIQ ID). + * @param {Array} allowedStorage - An array of allowed storage types: 'html5' for Local Storage and/or 'cookie' for Cookies. + * @param {Object} firstPartyData - Contains user consent data; if isOptedOut is true, data will not be stored (except for FIRST_PARTY_KEY). + */ +function storeData(key, value, allowedStorage, firstPartyData) { + try { + if (firstPartyData?.isOptedOut && key !== _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_3__.FIRST_PARTY_KEY) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(MODULE_NAME + ': storing data: key=' + key + ' value=' + value); + if (value) { + if (storage.hasLocalStorage() && allowedStorage.includes('html5')) { + storage.setDataInLocalStorage(key, value); + } + if (storage.cookiesAreEnabled() && allowedStorage.includes('cookie')) { + const expiresStr = new Date(Date.now() + PCID_EXPIRY * (60 * 60 * 24 * 1000)).toUTCString(); + storage.setCookie(key, value, expiresStr, 'LAX'); + } + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } +} + +/** + * Remove Intent IQ data from cookie or local storage + * @param key + */ + +function removeDataByKey(key, allowedStorage) { + try { + if (storage.hasLocalStorage() && allowedStorage.includes('html5')) { + storage.removeDataFromLocalStorage(key); + } + if (storage.cookiesAreEnabled() && allowedStorage.includes('cookie')) { + const expiredDate = new Date(0).toUTCString(); + storage.setCookie(key, '', expiredDate, 'LAX'); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } +} + +/** + * Determines the allowed storage types based on provided parameters. + * If no valid storage types are provided, it defaults to 'html5'. + * + * @param {Array} params - An array containing storage type preferences, e.g., ['html5', 'cookie']. + * @return {Array} - Returns an array with allowed storage types. Defaults to ['html5'] if no valid options are provided. + */ +function defineStorageType(params) { + if (!params || !Array.isArray(params)) return ['html5']; // use locale storage be default + const filteredArr = params.filter(item => _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_3__.SUPPORTED_TYPES.includes(item)); + return filteredArr.length ? filteredArr : ['html5']; +} + +/** + * Parse json if possible, else return null + * @param data + */ +function tryParse(data) { + try { + return JSON.parse(data); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err); + return null; + } +} + +/***/ }), + +/***/ "./libraries/intentIqUtils/urlUtils.js": +/*!*********************************************!*\ + !*** ./libraries/intentIqUtils/urlUtils.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ appendSPData: () => (/* binding */ appendSPData) +/* harmony export */ }); +function appendSPData(url, firstPartyData) { + const spdParam = firstPartyData?.spd ? encodeURIComponent(typeof firstPartyData.spd === 'object' ? JSON.stringify(firstPartyData.spd) : firstPartyData.spd) : ''; + url += spdParam ? '&spd=' + spdParam : ''; + return url; +} +; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["intentIqConstants"],{ + +/***/ "./libraries/intentIqConstants/intentIqConstants.js": +/*!**********************************************************!*\ + !*** ./libraries/intentIqConstants/intentIqConstants.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ CLIENT_HINTS_KEY: () => (/* binding */ CLIENT_HINTS_KEY), +/* harmony export */ EMPTY: () => (/* binding */ EMPTY), +/* harmony export */ FIRST_PARTY_KEY: () => (/* binding */ FIRST_PARTY_KEY), +/* harmony export */ GVLID: () => (/* binding */ GVLID), +/* harmony export */ HOURS_24: () => (/* binding */ HOURS_24), +/* harmony export */ INVALID_ID: () => (/* binding */ INVALID_ID), +/* harmony export */ MAX_REQUEST_LENGTH: () => (/* binding */ MAX_REQUEST_LENGTH), +/* harmony export */ META_DATA_CONSTANT: () => (/* binding */ META_DATA_CONSTANT), +/* harmony export */ NOT_YET_DEFINED: () => (/* binding */ NOT_YET_DEFINED), +/* harmony export */ PREBID: () => (/* binding */ PREBID), +/* harmony export */ SCREEN_PARAMS: () => (/* binding */ SCREEN_PARAMS), +/* harmony export */ SUPPORTED_TYPES: () => (/* binding */ SUPPORTED_TYPES), +/* harmony export */ SYNC_REFRESH_MILL: () => (/* binding */ SYNC_REFRESH_MILL), +/* harmony export */ VERSION: () => (/* binding */ VERSION), +/* harmony export */ WITHOUT_IIQ: () => (/* binding */ WITHOUT_IIQ), +/* harmony export */ WITH_IIQ: () => (/* binding */ WITH_IIQ) +/* harmony export */ }); +/* unused harmony export BLACK_LIST */ +const FIRST_PARTY_KEY = '_iiq_fdata'; +const SUPPORTED_TYPES = ['html5', 'cookie']; +const WITH_IIQ = 'A'; +const WITHOUT_IIQ = 'B'; +const NOT_YET_DEFINED = 'U'; +const BLACK_LIST = 'L'; +const CLIENT_HINTS_KEY = '_iiq_ch'; +const EMPTY = 'EMPTY'; +const GVLID = '1323'; +const VERSION = 0.29; +const PREBID = 'pbjs'; +const HOURS_24 = 86400000; +const INVALID_ID = 'INVALID_ID'; +const SCREEN_PARAMS = { + 0: 'windowInnerHeight', + 1: 'windowInnerWidth', + 2: 'devicePixelRatio', + 3: 'windowScreenHeight', + 4: 'windowScreenWidth', + 5: 'language' +}; +const SYNC_REFRESH_MILL = 3600000; +const META_DATA_CONSTANT = 256; +const MAX_REQUEST_LENGTH = { + // https://www.geeksforgeeks.org/maximum-length-of-a-url-in-different-browsers/ + chrome: 2097152, + safari: 80000, + opera: 2097152, + edge: 2048, + firefox: 65536, + ie: 2048 +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["uid1Eids"],{ + +/***/ "./libraries/uid1Eids/uid1Eids.js": +/*!****************************************!*\ + !*** ./libraries/uid1Eids/uid1Eids.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ UID1_EIDS: () => (/* binding */ UID1_EIDS) +/* harmony export */ }); +const UID1_EIDS = { + 'tdid': { + source: 'adserver.org', + atype: 1, + getValue: function (data) { + if (data.id) { + return data.id; + } else { + return data; + } + }, + getUidExt: function (data) { + return { + ...{ + rtiPartner: 'TDID' + }, + ...data.ext + }; + } + } +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["uid2Eids"],{ + +/***/ "./libraries/uid2Eids/uid2Eids.js": +/*!****************************************!*\ + !*** ./libraries/uid2Eids/uid2Eids.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ UID2_EIDS: () => (/* binding */ UID2_EIDS) +/* harmony export */ }); +const UID2_EIDS = { + 'uid2': { + source: 'uidapi.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + } +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["liveIntentId"],{ + +/***/ "./libraries/liveIntentId/idSystem.js": +/*!********************************************!*\ + !*** ./libraries/liveIntentId/idSystem.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ liveIntentIdSubmodule: () => (/* binding */ liveIntentIdSubmodule), +/* harmony export */ reset: () => (/* binding */ reset), +/* harmony export */ setEventFiredFlag: () => (/* binding */ setEventFiredFlag), +/* harmony export */ storage: () => (/* binding */ storage) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var live_connect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! live-connect-js */ "./node_modules/live-connect-js/dist/index.mjs"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _shared_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shared.js */ "./libraries/liveIntentId/shared.js"); +/** + * This module adds LiveIntentId to the User ID module. + * The {@link module:modules/userId} module is required. + * @module modules/idSystem + * @requires module:modules/userId + */ + + + + + // eslint-disable-line prebid/validate-imports + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const EVENTS_TOPIC = 'pre_lips'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_UID, + moduleName: _shared_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_NAME +}); +const calls = { + ajaxGet: (url, onSuccess, onError, timeout, headers) => { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajaxBuilder)(timeout)(url, { + success: onSuccess, + error: onError + }, undefined, { + method: 'GET', + withCredentials: true, + customHeaders: headers + }); + }, + pixelGet: (url, onload) => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(url, onload) +}; +let eventFired = false; +let liveConnect = null; + +/** + * This function is used in tests. + */ +function reset() { + if (window && window.liQ_instances) { + window.liQ_instances.forEach(i => i.eventBus.off(EVENTS_TOPIC, setEventFiredFlag)); + window.liQ_instances = []; + } + liveIntentIdSubmodule.setModuleMode(null); + eventFired = false; + liveConnect = null; +} + +/** + * This function is used in tests. + */ +function setEventFiredFlag() { + eventFired = true; +} +function parseLiveIntentCollectorConfig(collectConfig) { + const config = {}; + collectConfig = collectConfig || {}; + collectConfig.appId && (config.appId = collectConfig.appId); + collectConfig.fpiStorageStrategy && (config.storageStrategy = collectConfig.fpiStorageStrategy); + collectConfig.fpiExpirationDays && (config.expirationDays = collectConfig.fpiExpirationDays); + collectConfig.collectorUrl && (config.collectorUrl = collectConfig.collectorUrl); + config.ajaxTimeout = collectConfig.ajaxTimeout || _shared_js__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_AJAX_TIMEOUT; + return config; +} + +/** + * Create requestedAttributes array to pass to LiveConnect. + * @function + * @param {Object} overrides - object with boolean values that will override defaults { 'foo': true, 'bar': false } + * @returns {Array} + */ + +function initializeLiveConnect(configParams) { + if (liveConnect) { + return liveConnect; + } + configParams = configParams || {}; + const fpidConfig = configParams.fpid || {}; + const publisherId = configParams.publisherId || 'any'; + const identityResolutionConfig = { + publisherId: publisherId, + requestedAttributes: (0,_shared_js__WEBPACK_IMPORTED_MODULE_3__.parseRequestedAttributes)(configParams.requestedAttributesOverrides), + extraAttributes: { + ipv4: configParams.ipv4, + ipv6: configParams.ipv6 + } + }; + if (configParams.url) { + identityResolutionConfig.url = configParams.url; + } + ; + identityResolutionConfig.ajaxTimeout = configParams.ajaxTimeout || _shared_js__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_AJAX_TIMEOUT; + const liveConnectConfig = parseLiveIntentCollectorConfig(configParams.liCollectConfig); + if (!liveConnectConfig.appId && configParams.distributorId) { + liveConnectConfig.distributorId = configParams.distributorId; + identityResolutionConfig.source = configParams.distributorId; + } else { + identityResolutionConfig.source = configParams.partner || 'prebid'; + } + liveConnectConfig.wrapperName = 'prebid'; + liveConnectConfig.trackerVersion = "9.45.0-pre"; + liveConnectConfig.identityResolutionConfig = identityResolutionConfig; + liveConnectConfig.identifiersToResolve = configParams.identifiersToResolve || []; + liveConnectConfig.fireEventDelay = configParams.fireEventDelay; + liveConnectConfig.idCookie = {}; + liveConnectConfig.idCookie.name = fpidConfig.name; + liveConnectConfig.idCookie.strategy = fpidConfig.strategy == 'html5' ? 'localStorage' : fpidConfig.strategy; + const usPrivacyString = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__.uspDataHandler.getConsentData(); + if (usPrivacyString) { + liveConnectConfig.usPrivacyString = usPrivacyString; + } + const gdprConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__.gdprDataHandler.getConsentData(); + if (gdprConsent) { + liveConnectConfig.gdprApplies = gdprConsent.gdprApplies; + liveConnectConfig.gdprConsent = gdprConsent.consentString; + } + const gppConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__.gppDataHandler.getConsentData(); + if (gppConsent) { + liveConnectConfig.gppString = gppConsent.gppString; + liveConnectConfig.gppApplicableSections = gppConsent.applicableSections; + } + // The second param is the storage object, LS & Cookie manipulation uses PBJS. + // The third param is the ajax and pixel object, the AJAX and pixel use PBJS. + liveConnect = liveIntentIdSubmodule.getInitializer()(liveConnectConfig, storage, calls); + const sourceEvent = (0,_shared_js__WEBPACK_IMPORTED_MODULE_3__.makeSourceEventToSend)(configParams); + if (sourceEvent != null) { + liveConnect.push(sourceEvent); + } + return liveConnect; +} +function tryFireEvent() { + if (!eventFired && liveConnect) { + const eventDelay = liveConnect.config.fireEventDelay || _shared_js__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_DELAY; + setTimeout(() => { + const instances = window.liQ_instances; + instances.forEach(i => i.eventBus.once(EVENTS_TOPIC, setEventFiredFlag)); + if (!eventFired && liveConnect) { + liveConnect.fire(); + } + }, eventDelay); + } +} + +/** @type {Submodule} */ +const liveIntentIdSubmodule = { + moduleMode: "standard", + /** + * Used to link submodule with config. + * @type {string} + */ + name: _shared_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_NAME, + gvlid: _shared_js__WEBPACK_IMPORTED_MODULE_3__.GVLID, + setModuleMode(mode) { + this.moduleMode = mode; + }, + getInitializer() { + return (liveConnectConfig, storage, calls) => (0,live_connect_js__WEBPACK_IMPORTED_MODULE_0__.LiveConnect)(liveConnectConfig, storage, calls, this.moduleMode); + }, + /** + * Decode the stored id value for passing to bid requests. + * Note that lipb object is a wrapper for everything, and + * internally it could contain more data other than `lipbid` + * (e.g. `segments`) depending on the `partner` and `publisherId` + * params. + * @function + * @param {{unifiedId:string}} value + * @param {SubmoduleConfig|undefined} config + * @returns {{lipb:Object}} + */ + decode(value, config) { + const configParams = config && config.params || {}; + (0,_shared_js__WEBPACK_IMPORTED_MODULE_3__.setUpTreatment)(configParams); + if (!liveConnect) { + initializeLiveConnect(configParams); + } + tryFireEvent(); + return (0,_shared_js__WEBPACK_IMPORTED_MODULE_3__.composeResult)(value, configParams); + }, + /** + * Performs action to obtain id and return a value in the callback's response argument. + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + const configParams = config && config.params || {}; + (0,_shared_js__WEBPACK_IMPORTED_MODULE_3__.setUpTreatment)(configParams); + const liveConnect = initializeLiveConnect(configParams); + if (!liveConnect) { + return; + } + tryFireEvent(); + const result = function (callback) { + liveConnect.resolve(response => { + callback(response); + }, error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`${_shared_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_NAME}: ID fetch encountered an error: `, error); + callback(); + }); + }; + return { + callback: result + }; + }, + primaryIds: _shared_js__WEBPACK_IMPORTED_MODULE_3__.PRIMARY_IDS, + eids: _shared_js__WEBPACK_IMPORTED_MODULE_3__.eids +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.submodule)('userId', liveIntentIdSubmodule); + +/***/ }), + +/***/ "./libraries/liveIntentId/shared.js": +/*!******************************************!*\ + !*** ./libraries/liveIntentId/shared.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DEFAULT_AJAX_TIMEOUT: () => (/* binding */ DEFAULT_AJAX_TIMEOUT), +/* harmony export */ DEFAULT_DELAY: () => (/* binding */ DEFAULT_DELAY), +/* harmony export */ GVLID: () => (/* binding */ GVLID), +/* harmony export */ MODULE_NAME: () => (/* binding */ MODULE_NAME), +/* harmony export */ PRIMARY_IDS: () => (/* binding */ PRIMARY_IDS), +/* harmony export */ composeResult: () => (/* binding */ composeResult), +/* harmony export */ eids: () => (/* binding */ eids), +/* harmony export */ makeSourceEventToSend: () => (/* binding */ makeSourceEventToSend), +/* harmony export */ parseRequestedAttributes: () => (/* binding */ parseRequestedAttributes), +/* harmony export */ setUpTreatment: () => (/* binding */ setUpTreatment) +/* harmony export */ }); +/* unused harmony exports LI_PROVIDER_DOMAIN, DEFAULT_REQUESTED_ATTRIBUTES, DEFAULT_TREATMENT_RATE */ +/* harmony import */ var _uid1Eids_uid1Eids_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../uid1Eids/uid1Eids.js */ "./libraries/uid1Eids/uid1Eids.js"); +/* harmony import */ var _uid2Eids_uid2Eids_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../uid2Eids/uid2Eids.js */ "./libraries/uid2Eids/uid2Eids.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + + + +const PRIMARY_IDS = ['libp']; +const GVLID = 148; +const DEFAULT_AJAX_TIMEOUT = 5000; +const DEFAULT_DELAY = 500; +const MODULE_NAME = 'liveIntentId'; +const LI_PROVIDER_DOMAIN = 'liveintent.com'; +const DEFAULT_REQUESTED_ATTRIBUTES = { + 'nonId': true +}; +const DEFAULT_TREATMENT_RATE = 0.95; +function parseRequestedAttributes(overrides) { + function renameAttribute(attribute) { + if (attribute === 'fpid') { + return 'idCookie'; + } else { + return attribute; + } + ; + } + function createParameterArray(config) { + return Object.entries(config).flatMap(_ref => { + let [k, v] = _ref; + return typeof v === 'boolean' && v ? [renameAttribute(k)] : []; + }); + } + if (typeof overrides === 'object') { + return createParameterArray({ + ...DEFAULT_REQUESTED_ATTRIBUTES, + ...overrides + }); + } else { + return createParameterArray(DEFAULT_REQUESTED_ATTRIBUTES); + } +} +function makeSourceEventToSend(configParams) { + const sourceEvent = {}; + let nonEmpty = false; + if (typeof configParams.emailHash === 'string') { + nonEmpty = true; + sourceEvent.emailHash = configParams.emailHash; + } + if (typeof configParams.ipv4 === 'string') { + nonEmpty = true; + sourceEvent.ipv4 = configParams.ipv4; + } + if (typeof configParams.ipv6 === 'string') { + nonEmpty = true; + sourceEvent.ipv6 = configParams.ipv6; + } + if (typeof configParams.userAgent === 'string') { + nonEmpty = true; + sourceEvent.userAgent = configParams.userAgent; + } + if (nonEmpty) { + return sourceEvent; + } +} +function composeResult(value, config) { + if (config.activatePartialTreatment) { + if (window.liModuleEnabled) { + return composeIdObject(value); + } else { + return {}; + } + } else { + return composeIdObject(value); + } +} +function composeIdObject(value) { + const result = {}; + + // old versions stored lipbid in unifiedId. Ensure that we can still read the data. + const lipbid = value.nonId || value.unifiedId; + result.lipb = lipbid ? { + ...value, + lipbid + } : value; + delete result.lipb?.unifiedId; + + // Lift usage of uid2 by exposing uid2 if we were asked to resolve it. + // As adapters are applied in lexicographical order, we will always + // be overwritten by the 'proper' uid2 module if it is present. + if (value.uid2) { + result.uid2 = { + 'id': value.uid2, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.bidswitch) { + result.bidswitch = { + 'id': value.bidswitch, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.triplelift) { + result.triplelift = { + 'id': value.triplelift, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.zetassp) { + result.zetassp = { + 'id': value.zetassp, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.medianet) { + result.medianet = { + 'id': value.medianet, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.magnite) { + result.magnite = { + 'id': value.magnite, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.index) { + result.index = { + 'id': value.index, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.openx) { + result.openx = { + 'id': value.openx, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.pubmatic) { + result.pubmatic = { + 'id': value.pubmatic, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.sovrn) { + result.sovrn = { + 'id': value.sovrn, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.idCookie) { + if (!_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.coppaDataHandler.getCoppa()) { + result.lipb = { + ...result.lipb, + fpid: value.idCookie + }; + result.fpid = { + 'id': value.idCookie + }; + } + delete result.lipb.idCookie; + } + if (value.thetradedesk) { + result.lipb = { + ...result.lipb, + tdid: value.thetradedesk + }; + result.tdid = { + 'id': value.thetradedesk, + ext: { + rtiPartner: 'TDID', + provider: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_1__.getRefererInfo)().domain || LI_PROVIDER_DOMAIN + } + }; + delete result.lipb.thetradedesk; + } + if (value.sharethrough) { + result.sharethrough = { + 'id': value.sharethrough, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.sonobi) { + result.sonobi = { + 'id': value.sonobi, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + if (value.vidazoo) { + result.vidazoo = { + 'id': value.vidazoo, + ext: { + provider: LI_PROVIDER_DOMAIN + } + }; + } + return result; +} +function setUpTreatment(config) { + // If the treatment decision has not been made yet + // and Prebid is configured to make this decision. + if (window.liModuleEnabled === undefined && config.activatePartialTreatment) { + const treatmentRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(window.liTreatmentRate) ? window.liTreatmentRate : DEFAULT_TREATMENT_RATE; + window.liModuleEnabled = Math.random() < treatmentRate; + window.liTreatmentRate = treatmentRate; + } + ; +} +const eids = { + ..._uid1Eids_uid1Eids_js__WEBPACK_IMPORTED_MODULE_3__.UID1_EIDS, + ..._uid2Eids_uid2Eids_js__WEBPACK_IMPORTED_MODULE_4__.UID2_EIDS, + 'lipb': { + getValue: function (data) { + return data.lipbid; + }, + source: 'liveintent.com', + atype: 3, + getEidExt: function (data) { + if (Array.isArray(data.segments) && data.segments.length) { + return { + segments: data.segments + }; + } + } + }, + 'bidswitch': { + source: 'bidswitch.net', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'medianet': { + source: 'media.net', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'magnite': { + source: 'rubiconproject.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'index': { + source: 'liveintent.indexexchange.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'openx': { + source: 'openx.net', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'pubmatic': { + source: 'pubmatic.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'sovrn': { + source: 'liveintent.sovrn.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'fpid': { + source: 'fpid.liveintent.com', + atype: 1, + getValue: function (data) { + return data.id; + } + }, + 'sharethrough': { + source: 'sharethrough.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'sonobi': { + source: 'liveintent.sonobi.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'triplelift': { + source: 'liveintent.triplelift.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'zetassp': { + source: 'zeta-ssp.liveintent.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'vidazoo': { + source: 'liveintent.vidazoo.com', + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + } +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["medianetUtils"],{ + +/***/ "./libraries/medianetUtils/constants.js": +/*!**********************************************!*\ + !*** ./libraries/medianetUtils/constants.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ANALYTICS_VERSION: () => (/* binding */ ANALYTICS_VERSION), +/* harmony export */ AUCTION_OPTIONS: () => (/* binding */ AUCTION_OPTIONS), +/* harmony export */ BID_FLOOR_REJECTED: () => (/* binding */ BID_FLOOR_REJECTED), +/* harmony export */ BID_NOBID: () => (/* binding */ BID_NOBID), +/* harmony export */ BID_SUCCESS: () => (/* binding */ BID_SUCCESS), +/* harmony export */ BID_TIMEOUT: () => (/* binding */ BID_TIMEOUT), +/* harmony export */ CONFIG_ERROR: () => (/* binding */ CONFIG_ERROR), +/* harmony export */ CONFIG_PASS: () => (/* binding */ CONFIG_PASS), +/* harmony export */ CONFIG_PENDING: () => (/* binding */ CONFIG_PENDING), +/* harmony export */ CONFIG_URL: () => (/* binding */ CONFIG_URL), +/* harmony export */ DBF_PRIORITY: () => (/* binding */ DBF_PRIORITY), +/* harmony export */ DEFAULT_LOGGING_PERCENT: () => (/* binding */ DEFAULT_LOGGING_PERCENT), +/* harmony export */ DUMMY_BIDDER: () => (/* binding */ DUMMY_BIDDER), +/* harmony export */ ERROR_CONFIG_FETCH: () => (/* binding */ ERROR_CONFIG_FETCH), +/* harmony export */ ERROR_CONFIG_JSON_PARSE: () => (/* binding */ ERROR_CONFIG_JSON_PARSE), +/* harmony export */ ERROR_IWB_BID_MISSING: () => (/* binding */ ERROR_IWB_BID_MISSING), +/* harmony export */ EVENT_PIXEL_URL: () => (/* binding */ EVENT_PIXEL_URL), +/* harmony export */ GET_ENDPOINT: () => (/* binding */ GET_ENDPOINT), +/* harmony export */ GLOBAL_VENDOR_ID: () => (/* binding */ GLOBAL_VENDOR_ID), +/* harmony export */ LOGGING_DELAY: () => (/* binding */ LOGGING_DELAY), +/* harmony export */ LOG_APPR: () => (/* binding */ LOG_APPR), +/* harmony export */ LOG_EVT_ID: () => (/* binding */ LOG_EVT_ID), +/* harmony export */ LOG_RA: () => (/* binding */ LOG_RA), +/* harmony export */ LOG_TYPE_ID: () => (/* binding */ LOG_TYPE_ID), +/* harmony export */ MEDIANET: () => (/* binding */ MEDIANET), +/* harmony export */ NOBID_AFTER_AUCTION: () => (/* binding */ NOBID_AFTER_AUCTION), +/* harmony export */ PBS_ERROR_STATUS_START: () => (/* binding */ PBS_ERROR_STATUS_START), +/* harmony export */ POST_ENDPOINT: () => (/* binding */ POST_ENDPOINT), +/* harmony export */ PREBID_VERSION: () => (/* binding */ PREBID_VERSION), +/* harmony export */ SEND_ALL_BID_PROP: () => (/* binding */ SEND_ALL_BID_PROP), +/* harmony export */ SUCCESS_AFTER_AUCTION: () => (/* binding */ SUCCESS_AFTER_AUCTION), +/* harmony export */ TIMEOUT_AFTER_AUCTION: () => (/* binding */ TIMEOUT_AFTER_AUCTION), +/* harmony export */ VIDEO_CONTEXT: () => (/* binding */ VIDEO_CONTEXT), +/* harmony export */ VIDEO_PLACEMENT: () => (/* binding */ VIDEO_PLACEMENT), +/* harmony export */ VIDEO_UUID_PENDING: () => (/* binding */ VIDEO_UUID_PENDING), +/* harmony export */ WINNING_AUCTION_MISSING_ERROR: () => (/* binding */ WINNING_AUCTION_MISSING_ERROR), +/* harmony export */ WINNING_BID_ABSENT_ERROR: () => (/* binding */ WINNING_BID_ABSENT_ERROR), +/* harmony export */ mnetGlobals: () => (/* binding */ mnetGlobals) +/* harmony export */ }); +const mnetGlobals = { + auctions: {}, + // Stores details of ongoing or completed auctions + infoByAdIdMap: {}, + // Maps ad IDs to their respective information + bdpMap: {}, + configuration: {}, + logsQueue: [], + // Queue for storing logs + errorQueue: [], + // Queue for storing errors, + eventQueue: null, + refererInfo: null +}; +const LOGGING_DELAY = 2000; +const LOG_TYPE_ID = 'kfk'; +const LOG_EVT_ID = 'projectevents'; +const EVENT_PIXEL_URL = 'https://qsearch-a.akamaihd.net/log'; +const POST_ENDPOINT = 'https://navvy.media.net/log'; +const GET_ENDPOINT = 'https://pb-logs.media.net/log'; +const ANALYTICS_VERSION = '2.0.0'; +const PREBID_VERSION = "9.45.0-pre"; +const MEDIANET = 'medianet'; +const GLOBAL_VENDOR_ID = 142; + +// Bid Status +const BID_SUCCESS = 1; +const BID_NOBID = 2; +const BID_TIMEOUT = 3; +const SUCCESS_AFTER_AUCTION = 5; +const NOBID_AFTER_AUCTION = 6; +const TIMEOUT_AFTER_AUCTION = 7; +const BID_FLOOR_REJECTED = 12; +const DBF_PRIORITY = { + [BID_SUCCESS]: 4, + [BID_NOBID]: 3, + [SUCCESS_AFTER_AUCTION]: 2, + [BID_TIMEOUT]: 1, + [NOBID_AFTER_AUCTION]: 1, + [TIMEOUT_AFTER_AUCTION]: 0, + [BID_FLOOR_REJECTED]: 0 +}; + +// Properties +const SEND_ALL_BID_PROP = 'enableSendAllBids'; +const AUCTION_OPTIONS = 'auctionOptions'; + +// Errors +const ERROR_CONFIG_JSON_PARSE = 'analytics_config_parse_fail'; +const ERROR_CONFIG_FETCH = 'analytics_config_ajax_fail'; +const PBS_ERROR_STATUS_START = 2000; +const WINNING_BID_ABSENT_ERROR = 'winning_bid_absent'; +const WINNING_AUCTION_MISSING_ERROR = 'winning_auction_missing'; +const ERROR_IWB_BID_MISSING = 'iwb_bid_missing'; +// Config +const CONFIG_PENDING = 0; +const CONFIG_PASS = 1; +const CONFIG_ERROR = 3; +const DEFAULT_LOGGING_PERCENT = 50; +const CONFIG_URL = 'https://prebid.media.net/rtb/prebid/analytics/config'; +// Dummy Bidder +const DUMMY_BIDDER = '-2'; + +// Video Constants +const VIDEO_UUID_PENDING = 9999; +const VIDEO_CONTEXT = { + INSTREAM: 'instream', + OUTSTREAM: 'outstream' +}; +const VIDEO_PLACEMENT = { + [VIDEO_CONTEXT.INSTREAM]: 1, + [VIDEO_CONTEXT.OUTSTREAM]: 6 +}; + +// Log Types +const LOG_APPR = 'APPR'; +const LOG_RA = 'RA'; + +/***/ }), + +/***/ "./libraries/medianetUtils/logKeys.js": +/*!********************************************!*\ + !*** ./libraries/medianetUtils/logKeys.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ KeysMap: () => (/* binding */ KeysMap) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./libraries/medianetUtils/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./logger.js */ "./libraries/medianetUtils/logger.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants.js */ "./libraries/medianetUtils/constants.js"); + + + + + + +const KeysMap = { + Pick: { + Auction: ['adSlots', () => ({}), 'bidsRequested', () => [], 'bidsReceived', () => [], 'responseBids', () => [], 'bidsTimeout', () => [], 'noBids', () => [], 'psiBids', () => [], 'bidderRequests as pendingRequests', bidderRequests => bidderRequests.length, 'hasEnded', () => false, 'auctionId', 'auctionStatus', 'timestamp', 'timeout', 'bidderRequests.0.ortb2.sup_log', 'bidderRequests.0.bids.0.floorData', 'bidderRequests.0.refererInfo', 'bidderRequests.0 as consentInfo', consentInfo => (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(consentInfo, ['gdprConsent', 'uspConsent'])], + AdSlot: ['code', 'ext as adext', 'logged', () => ({ + [_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOG_APPR]: false, + [_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOG_RA]: false + }), 'supcrid', (_, __, adUnit) => adUnit.emsCode || adUnit.code, 'ortb2Imp'], + BidRequest: [ + // from bidRequest + 'bidder', 'src', 'params', 'bidId', 'bidId as originalRequestId', 'adUnitCode', 'mediaTypes', mediaTypes => Object.keys(mediaTypes), 'iwb', () => 0, 'winner', () => 0, 'status', () => _constants_js__WEBPACK_IMPORTED_MODULE_1__.TIMEOUT_AFTER_AUCTION, 'responseReceived', () => false, 'sizes', (_, __, bidRequest) => (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getRequestedSizes)(bidRequest), 'ext', () => ({})], + BidResponse: ['originalCurrency', 'originalRequestId', 'requestId', + // multi-bid + 'originalBidder', + // from bidderRequest + 'bidderCode', 'currency', 'adId', 'snm as status', 'mediaType', 'cpm', 'timeToRespond', 'dealId', 'meta', 'originalCpm', 'bidderCode', 'creativeId', 'latestTargetedAuctionId', 'floorData', 'width', 'height', 'size', (size, logObj) => size || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidResponseSize)(logObj.width, logObj.height), 'ext'] + }, + Log: { + Bid: ['meta.advertiserDomains as advurl', function () { + let advertiserDomains = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + return advertiserDomains.join(','); + }, 'currMul as omul', 'originalCurrency as icurr', 'inCurrMul as imul', 'mediaTypes as req_mtype', mediaTypes => mediaTypes.join('|'), 'mediaType as res_mtype', 'mediaType as mtype', (mediaType, __, _ref) => { + let { + mediaTypes + } = _ref; + return mediaType || mediaTypes.join('|'); + }, 'ext.seat as ortbseat', 'ext.int_dsp_id as mx_int_dsp_id', 'ext.int_agency_id as mx_int_agency_id', 'ext.pvid as mpvid', 'ext.crid', (crid, _, bidObj) => crid || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidObj.params, 'crid'), 'ext', (ext, _, bidObj) => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(bidObj.bidder === _constants_js__WEBPACK_IMPORTED_MODULE_1__.MEDIANET ? ext : {}), 'requestId as reqid', (requestId, _, bidObj) => requestId || bidObj.bidId, 'originalRequestId as ogReqId', 'adId as adid', 'originalBidder as og_pvnm', 'bidderCode as pvnm', (bidderCode, _, _ref2) => { + let { + bidder + } = _ref2; + return bidderCode || bidder; + }, 'src', 'originalCpm as ogbdp', 'bdp', (bdp, _, bidObj) => bdp || bidObj.cpm, 'cpm as cbdp', 'dfpbd', 'dealId as dId', 'winner', 'currency as curr', 'timeToRespond as rests', 'status', 'iwb', 'floorData.floorValue as bidflr', 'floorData.floorRule as flrrule', 'floorRuleValue as flrRulePrice', 'serverLatencyMillis as rtime', 'creativeId as pcrid', 'dbf', 'latestTargetedAuctionId as lacid', 'utime', 'metrics as ltime', (metrics, logObj) => logObj.rests || (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.calculateRoundTripTime)(metrics), 'bidder as issec', bidder => _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig(_constants_js__WEBPACK_IMPORTED_MODULE_1__.AUCTION_OPTIONS)?.secondaryBidders?.includes?.(bidder) ? 1 : 0, 'sizes as szs', sizes => sizes.join('|'), 'size', (size, _, bidObj) => (bidObj.res_sizes || [size]).join('|'), 'params', (params, _, bidObj) => (0,_logger_js__WEBPACK_IMPORTED_MODULE_5__.getProcessedParams)(params, bidObj.status)], + AdSlot: ['supcrid', 'code as og_supcrid', 'context as vplcmtt', context => _constants_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO_PLACEMENT[context] || 0, 'ortb2Imp.instl as oop', 'targeting as targ', targeting => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(targeting), 'adext', adext => encodeURIComponent((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(adext))], + Auction: ['auctionId as acid', 'sup_log', 'consentInfo.gdprConsent.consentString as gdprConsent', 'consentInfo.uspConsent as ccpa', 'consentInfo.gdprConsent.gdprApplies as gdpr', gdprApplies => gdprApplies ? '1' : '0', 'coppa', () => _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true ? 1 : 0, 'hasEnded as aucstatus', hasEnded => hasEnded ? _src_auction_js__WEBPACK_IMPORTED_MODULE_6__.AUCTION_COMPLETED : _src_auction_js__WEBPACK_IMPORTED_MODULE_6__.AUCTION_IN_PROGRESS, 'availableUids as uid_mod_avb', availableUids => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(availableUids), 'uidValues as id_details', uidValues => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(uidValues), 'refererInfo.topmostLocation as requrl', 'refererInfo.domain as dn', 'refererInfo.ref', _utils_js__WEBPACK_IMPORTED_MODULE_0__.getTopWindowReferrer, 'screen', _utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSize, 'timeout as tmax', 'sts', (_, __, auctionObj) => auctionObj.auctionStartTime - auctionObj.timestamp, 'ets', (_, __, auctionObj) => auctionObj.auctionEndTime - auctionObj.timestamp || -1, 'floorData.modelVersion as flrver', 'floorData as flrdata', floorData => (0,_logger_js__WEBPACK_IMPORTED_MODULE_5__.mergeFieldsToLog)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(floorData, ['location as ln', 'skipped as skp', 'skipRate as sr', 'fetchStatus as fs', 'enforcements.enforceJS as enfj', 'enforcements.floorDeals as enfd']))], + Globals: ['cid', 'ajaxState as ajx', 'pubLper as plper', 'loggingPercent as lper', loggingPercent => Math.round(100 / loggingPercent), 'enableDbf', () => 1, 'flt', () => 1, 'pbv', () => _constants_js__WEBPACK_IMPORTED_MODULE_1__.PREBID_VERSION, 'pbav', () => _constants_js__WEBPACK_IMPORTED_MODULE_1__.ANALYTICS_VERSION, 'coppa', () => _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true ? 1 : 0] + } +}; + +/***/ }), + +/***/ "./libraries/medianetUtils/logger.js": +/*!*******************************************!*\ + !*** ./libraries/medianetUtils/logger.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ errorLogger: () => (/* binding */ errorLogger), +/* harmony export */ firePostLog: () => (/* binding */ firePostLog), +/* harmony export */ getLoggingPayload: () => (/* binding */ getLoggingPayload), +/* harmony export */ getProcessedParams: () => (/* binding */ getProcessedParams), +/* harmony export */ mergeFieldsToLog: () => (/* binding */ mergeFieldsToLog), +/* harmony export */ shouldLogAPPR: () => (/* binding */ shouldLogAPPR) +/* harmony export */ }); +/* unused harmony export fireAjaxLog */ +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils.js */ "./libraries/medianetUtils/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./libraries/medianetUtils/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); + + + + + + +function shouldLogAPPR(auctionData, adUnitId) { + const adSlot = auctionData.adSlots[adUnitId]; + return _constants_js__WEBPACK_IMPORTED_MODULE_0__.mnetGlobals.configuration.shouldLogAPPR && !adSlot.logged[_constants_js__WEBPACK_IMPORTED_MODULE_0__.LOG_APPR]; +} + +// common error logger for medianet analytics and bid adapter +function errorLogger(event) { + let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + let analytics = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + const { + name, + cid, + value, + relatedData, + logData, + project + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(event) ? { + ...event, + logData: data + } : { + name: event, + relatedData: data + }; + const refererInfo = _constants_js__WEBPACK_IMPORTED_MODULE_0__.mnetGlobals.refererInfo || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.getRefererInfo)(); + const errorData = Object.assign({}, { + logid: _constants_js__WEBPACK_IMPORTED_MODULE_0__.LOG_TYPE_ID, + evtid: _constants_js__WEBPACK_IMPORTED_MODULE_0__.LOG_EVT_ID, + project: project || (analytics ? 'prebidanalytics' : 'prebid'), + dn: refererInfo.domain || '', + requrl: refererInfo.topmostLocation || '', + pbav: (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().medianetGlobals.analyticsEnabled ? _constants_js__WEBPACK_IMPORTED_MODULE_0__.ANALYTICS_VERSION : '', + pbver: _constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_VERSION, + // To handle media.net alias bidderAdapter (params.cid) code errors + cid: cid || _constants_js__WEBPACK_IMPORTED_MODULE_0__.mnetGlobals.configuration.cid || '', + event: name || '', + value: value || '', + rd: relatedData || '' + }, logData); + const loggingHost = analytics ? _constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENT_PIXEL_URL : _constants_js__WEBPACK_IMPORTED_MODULE_0__.POST_ENDPOINT; + const payload = analytics ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.formatQS)(errorData) : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(errorData); + function send() { + if (!analytics) { + fireAjaxLog(loggingHost, payload, (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(errorData, ['cid', 'project', 'event as value'])); + return; + } + const pixelUrl = getUrl(); + _constants_js__WEBPACK_IMPORTED_MODULE_0__.mnetGlobals.errorQueue.push(pixelUrl); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(pixelUrl); + } + function getUrl() { + return loggingHost + '?' + payload; + } + return { + send, + getUrl + }; +} +function getLoggingPayload(queryParams) { + return `logid=kfk&evtid=prebid_analytics_events_client&${queryParams}`; +} +function firePostLog(url, payload) { + try { + _constants_js__WEBPACK_IMPORTED_MODULE_0__.mnetGlobals.logsQueue.push(url + '?' + payload); + const isSent = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.sendBeacon)(url, payload); + if (!isSent) { + fireAjaxLog(url, payload); + errorLogger('sb_log_failed').send(); + } + } catch (e) { + fireAjaxLog(url, payload); + errorLogger('sb_not_supported').send(); + } +} +function fireAjaxLog(url, payload) { + let errorData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(url, { + success: () => undefined, + error: (_, _ref) => { + let { + reason + } = _ref; + return errorLogger(Object.assign(errorData, { + name: 'ajax_log_failed', + relatedData: reason + })).send(); + } + }, payload, { + method: 'POST' + }); +} +function mergeFieldsToLog(objParams) { + const logParams = Object.keys(objParams).map(param => { + const value = objParams[param]; + return `${param}=${value === undefined ? '' : value}`; + }); + return logParams.join('||'); +} +function getProcessedParams(params, status) { + if (params === undefined || status !== _constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_SUCCESS) return ''; + const clonedFlattenParams = (0,_utils_js__WEBPACK_IMPORTED_MODULE_4__.flattenObj)(params, '', {}); + return JSON.stringify(clonedFlattenParams); +} + +/***/ }), + +/***/ "./libraries/medianetUtils/utils.js": +/*!******************************************!*\ + !*** ./libraries/medianetUtils/utils.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ calculateRoundTripTime: () => (/* binding */ calculateRoundTripTime), +/* harmony export */ filterBidsListByFilters: () => (/* binding */ filterBidsListByFilters), +/* harmony export */ findBidObj: () => (/* binding */ findBidObj), +/* harmony export */ flattenObj: () => (/* binding */ flattenObj), +/* harmony export */ formatQS: () => (/* binding */ formatQS), +/* harmony export */ getBidResponseSize: () => (/* binding */ getBidResponseSize), +/* harmony export */ getRequestedSizes: () => (/* binding */ getRequestedSizes), +/* harmony export */ getTopWindowReferrer: () => (/* binding */ getTopWindowReferrer), +/* harmony export */ getWindowSize: () => (/* binding */ getWindowSize), +/* harmony export */ isSampledForLogging: () => (/* binding */ isSampledForLogging), +/* harmony export */ onHidden: () => (/* binding */ onHidden), +/* harmony export */ pick: () => (/* binding */ pick) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants.js */ "./libraries/medianetUtils/constants.js"); +/* harmony import */ var _viewport_viewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + +function findBidObj() { + let list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let key = arguments.length > 1 ? arguments[1] : undefined; + let value = arguments.length > 2 ? arguments[2] : undefined; + return list.find(bid => { + return bid[key] === value; + }); +} +function filterBidsListByFilters() { + let list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let filters = arguments.length > 1 ? arguments[1] : undefined; + return list.filter(bid => { + return Object.entries(filters).every(_ref => { + let [key, value] = _ref; + return bid[key] === value; + }); + }); +} +function flattenObj(obj, parent) { + let res = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + for (let key in obj) { + if (Array.isArray(obj[key])) { + continue; + } + const propName = parent ? parent + '.' + key : key; + if (typeof obj[key] == 'object') { + flattenObj(obj[key], propName, res); + } else { + res[propName] = String(obj[key]); + } + } + return res; +} +function formatQS(data) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._map)(data, (value, key) => { + if (value === undefined) { + return key + '='; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(value)) { + value = JSON.stringify(value); + } + return key + '=' + encodeURIComponent(value); + }).join('&'); +} +function getWindowSize() { + const { + width, + height + } = (0,_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_1__.getViewportSize)(); + let w = width || -1; + let h = height || -1; + return `${w}x${h}`; +} +function getRequestedSizes(_ref2) { + let { + mediaTypes, + sizes + } = _ref2; + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mediaTypes, 'banner.sizes') || sizes || []; + const native = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mediaTypes, 'native') ? [[1, 1]] : []; + const playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mediaTypes, 'video.playerSize') || []; + let video = []; + if (playerSize.length === 2) { + video = [playerSize]; + } + return [...banner, ...native, ...video].filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.uniques).map(size => size.join('x')); +} +function getBidResponseSize(width, height) { + if (isNaN(width) || isNaN(height)) { + return ''; + } + return width + 'x' + height; +} +function calculateRoundTripTime(metrics) { + if (!metrics || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(metrics.getMetrics)) { + return -1; + } + const prebidMetrics = metrics.getMetrics(); + const ltime = prebidMetrics['adapter.client.total'] || prebidMetrics['adapter.s2s.total']?.[0] || prebidMetrics['adapter.s2s.total'] || -1; + return parseFloat(ltime.toFixed(2)); +} +function pick(context, properties) { + let omitKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (typeof context !== 'object' || context === null) return {}; + const acc = {}; + properties.forEach((prop, index) => { + if (typeof prop === 'function') { + return; + } + let value, alias; + let [key, aliasPart] = prop.split(/\sas\s/i); + key = key.trim(); + alias = aliasPart?.trim() || key.split('.').pop(); + value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(context, key); + if (typeof properties[index + 1] === 'function') { + value = properties[index + 1](value, acc, context); + } + if (value !== undefined || !omitKeys) { + acc[alias] = value; + } + }); + return acc; +} +const onHidden = function (cb) { + let once = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + const onHiddenOrPageHide = event => { + if (document.visibilityState === 'hidden') { + cb(event); + if (once) { + window.removeEventListener('visibilitychange', onHiddenOrPageHide, true); + window.removeEventListener('pagehide', onHiddenOrPageHide, true); + } + } + }; + window.addEventListener('visibilitychange', onHiddenOrPageHide, true); + // Some browsers have buggy implementations of visibilitychange, + // so we use pagehide in addition, just to be safe. + window.addEventListener('pagehide', onHiddenOrPageHide, true); + + // if the document is already hidden + onHiddenOrPageHide({}); +}; +function getTopWindowReferrer(ref) { + try { + if (ref) return ref; + return window.top.document.referrer; + } catch (e) { + return document.referrer; + } +} +function isSampledForLogging() { + return Math.random() * 100 < parseFloat(_constants_js__WEBPACK_IMPORTED_MODULE_3__.mnetGlobals.configuration.loggingPercent); +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vastTrackers"],{ + +/***/ "./libraries/vastTrackers/vastTrackers.js": +/*!************************************************!*\ + !*** ./libraries/vastTrackers/vastTrackers.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ registerVastTrackers: () => (/* binding */ registerVastTrackers) +/* harmony export */ }); +/* unused harmony exports reset, enable, disable, cacheVideoBidHook, insertVastTrackers, getVastTrackers, addImpUrlToTrackers */ +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/auctionManager.js */ "./src/auctionManager.js"); + + + + + + + +const vastTrackers = []; +let enabled = false; +function reset() { + vastTrackers.length = 0; +} +function enable() { + if (!enabled) { + _src_auction_js__WEBPACK_IMPORTED_MODULE_0__.callPrebidCache.before(addTrackersToResponse); + enabled = true; + } +} +function disable() { + if (enabled) { + _src_auction_js__WEBPACK_IMPORTED_MODULE_0__.callPrebidCache.getHooks({ + hook: addTrackersToResponse + }).remove(); + enabled = false; + } +} +function cacheVideoBidHook() { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.index + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return function addTrackersToResponse(next, auctionInstance, bidResponse, afterBidAdded, videoMediaType) { + if ( true && bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO) { + const vastTrackers = getVastTrackers(bidResponse, { + index + }); + if (vastTrackers) { + bidResponse.vastXml = insertVastTrackers(vastTrackers, bidResponse.vastXml); + const impTrackers = vastTrackers.get('impressions'); + if (impTrackers) { + bidResponse.vastImpUrl = [].concat([...impTrackers]).concat(bidResponse.vastImpUrl).filter(t => t); + } + } + } + next(auctionInstance, bidResponse, afterBidAdded, videoMediaType); + }; +} +const addTrackersToResponse = cacheVideoBidHook(); +enable(); +function registerVastTrackers(moduleType, moduleName, trackerFn) { + if (typeof trackerFn === 'function') { + vastTrackers.push({ + 'moduleType': moduleType, + 'moduleName': moduleName, + 'trackerFn': trackerFn + }); + } +} +function insertVastTrackers(trackers, vastXml) { + const doc = new DOMParser().parseFromString(vastXml, 'text/xml'); + const wrappers = doc.querySelectorAll('VAST Ad Wrapper, VAST Ad InLine'); + try { + if (wrappers.length) { + wrappers.forEach(wrapper => { + if (trackers.get('impressions')) { + trackers.get('impressions').forEach(trackingUrl => { + const impression = doc.createElement('Impression'); + impression.appendChild(doc.createCDATASection(trackingUrl)); + wrapper.appendChild(impression); + }); + } + }); + vastXml = new XMLSerializer().serializeToString(doc); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('an error happened trying to insert trackers in vastXml'); + } + return vastXml; +} +function getVastTrackers(bid, _ref) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.index + } = _ref; + let trackers = []; + vastTrackers.filter(_ref2 => { + let { + moduleType, + moduleName, + trackerFn + } = _ref2; + return (0,_src_activities_rules_js__WEBPACK_IMPORTED_MODULE_4__.isActivityAllowed)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__.ACTIVITY_REPORT_ANALYTICS, (0,_src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__.activityParams)(moduleType, moduleName)); + }).forEach(_ref3 => { + let { + trackerFn + } = _ref3; + const auction = index.getAuction(bid).getProperties(); + const bidRequest = index.getBidRequest(bid); + let trackersToAdd = trackerFn(bid, { + auction, + bidRequest + }); + trackersToAdd.forEach(trackerToAdd => { + if (isValidVastTracker(trackers, trackerToAdd)) { + trackers.push(trackerToAdd); + } + }); + }); + const trackersMap = trackersToMap(trackers); + return trackersMap.size ? trackersMap : null; +} +; +function isValidVastTracker(trackers, trackerToAdd) { + return trackerToAdd.hasOwnProperty('event') && trackerToAdd.hasOwnProperty('url'); +} +function trackersToMap(trackers) { + return trackers.reduce((map, _ref4) => { + let { + url, + event + } = _ref4; + !map.has(event) && map.set(event, new Set()); + map.get(event).add(url); + return map; + }, new Map()); +} +function addImpUrlToTrackers(bid, trackersMap) { + if (bid.vastImpUrl) { + if (!trackersMap) { + trackersMap = new Map(); + } + if (!trackersMap.get('impressions')) { + trackersMap.set('impressions', new Set()); + } + trackersMap.get('impressions').add(bid.vastImpUrl); + } + return trackersMap; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mgidUtils"],{ + +/***/ "./libraries/mgidUtils/mgidUtils.js": +/*!******************************************!*\ + !*** ./libraries/mgidUtils/mgidUtils.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getUserSyncs: () => (/* binding */ getUserSyncs) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_userSync_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/userSync.js */ "./src/userSync.js"); + + + +const PIXEL_SYNC_URL = 'https://cm.mgid.com/i.gif'; +const IFRAME_SYNC_URL = 'https://cm.mgid.com/i.html'; +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + const spb = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('userSync')) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('userSync').syncsPerBidder) ? _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('userSync').syncsPerBidder : _src_userSync_js__WEBPACK_IMPORTED_MODULE_2__.USERSYNC_DEFAULT_CONFIG.syncsPerBidder; + if (spb > 0 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(syncOptions) && (syncOptions.iframeEnabled || syncOptions.pixelEnabled)) { + let pixels = []; + if (serverResponses && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(serverResponses) && serverResponses.length > 0 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(serverResponses[0].body) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(serverResponses[0].body.ext) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(serverResponses[0].body.ext.cm) && serverResponses[0].body.ext.cm.length > 0) { + pixels = serverResponses[0].body.ext.cm; + } + const syncs = []; + const query = []; + query.push('cbuster={cbuster}'); + query.push('gdpr_consent=' + encodeURIComponent((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(gdprConsent) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(gdprConsent?.consentString) ? gdprConsent.consentString : '')); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(gdprConsent) && typeof gdprConsent?.gdprApplies === 'boolean' && gdprConsent.gdprApplies) { + query.push('gdpr=1'); + } else { + query.push('gdpr=0'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(uspConsent) && uspConsent?.consentString) { + query.push(`us_privacy=${encodeURIComponent(uspConsent?.consentString)}`); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(gppConsent) && gppConsent?.gppString) { + query.push(`gppString=${encodeURIComponent(gppConsent?.gppString)}`); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('coppa')) { + query.push('coppa=1'); + } + const q = query.join('&'); + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: IFRAME_SYNC_URL + '?' + q.replace('{cbuster}', Math.round(new Date().getTime())) + }); + } else if (syncOptions.pixelEnabled) { + if (pixels.length === 0) { + for (let i = 0; i < spb; i++) { + syncs.push({ + type: 'image', + url: PIXEL_SYNC_URL + '?' + q.replace('{cbuster}', Math.round(new Date().getTime())) // randomly selects partner if sync required + }); + } + } else { + for (let i = 0; i < spb && i < pixels.length; i++) { + syncs.push({ + type: 'image', + url: pixels[i] + (pixels[i].indexOf('?') > 0 ? '&' : '?') + q.replace('{cbuster}', Math.round(new Date().getTime())) + }); + } + } + } + return syncs; + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["riseUtils"],{ + +/***/ "./libraries/riseUtils/constants.js": +/*!******************************************!*\ + !*** ./libraries/riseUtils/constants.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ADAPTER_VERSION: () => (/* binding */ ADAPTER_VERSION), +/* harmony export */ ALIASES: () => (/* binding */ ALIASES), +/* harmony export */ BASE_URL: () => (/* binding */ BASE_URL), +/* harmony export */ BIDDER_CODE: () => (/* binding */ BIDDER_CODE), +/* harmony export */ DEFAULT_CURRENCY: () => (/* binding */ DEFAULT_CURRENCY), +/* harmony export */ DEFAULT_GVLID: () => (/* binding */ DEFAULT_GVLID), +/* harmony export */ DEFAULT_TTL: () => (/* binding */ DEFAULT_TTL), +/* harmony export */ MODES: () => (/* binding */ MODES), +/* harmony export */ SUPPORTED_AD_TYPES: () => (/* binding */ SUPPORTED_AD_TYPES) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); + +const OW_GVLID = 280; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const ADAPTER_VERSION = '7.0.0'; +const DEFAULT_TTL = 360; +const DEFAULT_CURRENCY = 'USD'; +const BASE_URL = 'https://hb.yellowblue.io/'; +const BIDDER_CODE = 'rise'; +const DEFAULT_GVLID = 1043; +const ALIASES = [{ + code: 'risexchange', + gvlid: DEFAULT_GVLID +}, { + code: 'openwebxchange', + gvlid: OW_GVLID +}]; +const MODES = { + PRODUCTION: 'hb-multi', + TEST: 'hb-multi-test' +}; + +/***/ }), + +/***/ "./libraries/riseUtils/index.js": +/*!**************************************!*\ + !*** ./libraries/riseUtils/index.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ generateBidsParams: () => (/* binding */ generateBidsParams), +/* harmony export */ generateGeneralParams: () => (/* binding */ generateGeneralParams), +/* harmony export */ getSupplyChain: () => (/* binding */ getSupplyChain), +/* harmony export */ makeBaseSpec: () => (/* binding */ makeBaseSpec) +/* harmony export */ }); +/* unused harmony exports getBidRequestMediaTypes, getPos, getName, getFloor, getSizesArray, getEncodedValIfNotEmpty, getAllowedSyncMethod, isSyncMethodAllowed, getEndpoint, getDeviceType, generateBidParameters, buildBidResponse */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants.js */ "./libraries/riseUtils/constants.js"); + + + + +const makeBaseSpec = (baseUrl, modes) => { + return { + version: _constants_js__WEBPACK_IMPORTED_MODULE_0__.ADAPTER_VERSION, + supportedMediaTypes: _constants_js__WEBPACK_IMPORTED_MODULE_0__.SUPPORTED_AD_TYPES, + buildRequests: function (validBidRequests, bidderRequest) { + const combinedRequestsObject = {}; + + // use data from the first bid, to create the general params for all bids + const generalObject = validBidRequests[0]; + const testMode = generalObject.params.testMode; + const rtbDomain = generalObject.params.rtbDomain || baseUrl; + combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest); + combinedRequestsObject.bids = generateBidsParams(validBidRequests, bidderRequest); + return { + method: 'POST', + url: getEndpoint(testMode, rtbDomain, modes), + data: combinedRequestsObject + }; + }, + interpretResponse: function (_ref) { + let { + body + } = _ref; + const bidResponses = []; + if (body.bids) { + body.bids.forEach(adUnit => { + const bidResponse = buildBidResponse(adUnit); + bidResponses.push(bidResponse); + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + for (const response of serverResponses) { + if (syncOptions.iframeEnabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(response, 'body.params.userSyncURL')) { + syncs.push({ + type: 'iframe', + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(response, 'body.params.userSyncURL') + }); + } + if (syncOptions.pixelEnabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(response, 'body.params.userSyncPixels'))) { + const pixels = response.body.params.userSyncPixels.map(pixel => { + return { + type: 'image', + url: pixel + }; + }); + syncs.push(...pixels); + } + } + return syncs; + }, + onBidWon: function (bid) { + if (bid == null) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('onBidWon:', bid); + if (bid.hasOwnProperty('nurl') && bid.nurl.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(bid.nurl); + } + } + }; +}; +function getBidRequestMediaTypes(bidRequest) { + const mediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(mediaTypes)) { + return Object.keys(mediaTypes); + } + return []; +} +function getPos(bidRequest) { + const mediaTypes = getBidRequestMediaTypes(bidRequest); + const firstMediaType = mediaTypes[0]; + if (mediaTypes.length === 1) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, `mediaTypes.${firstMediaType}.pos`); + } +} +function getName(bidRequest) { + const mediaTypes = getBidRequestMediaTypes(bidRequest); + const firstMediaType = mediaTypes[0]; + if (mediaTypes.length === 1) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, `mediaTypes.${firstMediaType}.name`); + } +} +function getFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bid.getFloor)) { + return 0; + } + const mediaTypes = getBidRequestMediaTypes(bid); + const firstMediaType = mediaTypes[0]; + let floorResult = bid.getFloor({ + currency: 'USD', + mediaType: mediaTypes.length === 1 ? firstMediaType : '*', + size: '*' + }); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorResult) && floorResult.currency === 'USD' && floorResult.floor ? floorResult.floor : 0; +} +function getSizesArray(bid) { + let sizesArray = []; + const mediaTypes = getBidRequestMediaTypes(bid); + const firstMediaType = mediaTypes[0]; + if (mediaTypes.length === 1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.${firstMediaType}.sizes`)) { + sizesArray = bid.mediaTypes[firstMediaType].sizes; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.sizes) && bid.sizes.length > 0) { + sizesArray = bid.sizes; + } + return sizesArray; +} +function getSupplyChain(schainObject) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(schainObject)) { + return ''; + } + let scStr = `${schainObject.ver},${schainObject.complete}`; + schainObject.nodes.forEach(node => { + scStr += '!'; + scStr += `${getEncodedValIfNotEmpty(node.asi)},`; + scStr += `${getEncodedValIfNotEmpty(node.sid)},`; + scStr += `${getEncodedValIfNotEmpty(node.hp)},`; + scStr += `${getEncodedValIfNotEmpty(node.rid)},`; + scStr += `${getEncodedValIfNotEmpty(node.name)},`; + scStr += `${getEncodedValIfNotEmpty(node.domain)}`; + }); + return scStr; +} +function getEncodedValIfNotEmpty(val) { + return val !== '' && val !== undefined ? encodeURIComponent(val) : ''; +} +function getAllowedSyncMethod(filterSettings, bidderCode) { + const iframeConfigsToCheck = ['all', 'iframe']; + const pixelConfigToCheck = 'image'; + if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) { + return 'iframe'; + } + if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) { + return 'pixel'; + } +} +function isSyncMethodAllowed(syncRule, bidderCode) { + if (!syncRule) { + return false; + } + const isInclude = syncRule.filter === 'include'; + const bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(syncRule.bidders) ? syncRule.bidders : [bidderCode]; + return isInclude && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.contains)(bidders, bidderCode); +} +function getEndpoint(testMode, baseUrl, modes) { + const protocol = baseUrl.startsWith('http') ? '' : 'https://'; + const url = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`; + return testMode ? `${protocol}${url}${modes.TEST}` : `${protocol}${url}${modes.PRODUCTION}`; +} +function getDeviceType(ua) { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(ua.toLowerCase())) { + return '5'; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\\sce|palm|smartphone|iemobile/i.test(ua.toLowerCase())) { + return '4'; + } + if (/smart[-_\\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\\bdtv\\b|sonydtv|inettvbrowser|\\btv\\b/i.test(ua.toLowerCase())) { + return '3'; + } + return '1'; +} +function generateBidsParams(validBidRequests, bidderRequest) { + const bidsArray = []; + if (validBidRequests.length) { + validBidRequests.forEach(bid => { + bidsArray.push(generateBidParameters(bid, bidderRequest)); + }); + } + return bidsArray; +} +function generateBidParameters(bid, bidderRequest) { + const { + params + } = bid; + const mediaTypes = getBidRequestMediaTypes(bid); + if (isNaN(params.floorPrice)) { + params.floorPrice = 0; + } + const bidObject = { + mediaType: mediaTypes.join(','), + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('adUnitCode', bid), + sizes: getSizesArray(bid), + floorPrice: Math.max(getFloor(bid), params.floorPrice), + bidId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidId', bid), + loop: bid.auctionsCount || 0, + bidderRequestId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidderRequestId', bid), + transactionId: bid.ortb2Imp?.ext?.tid || '', + coppa: 0 + }; + const pos = getPos(bid); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isInteger)(pos)) { + bidObject.pos = pos; + } + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `ortb2Imp.ext.gpid`); + if (gpid) { + bidObject.gpid = gpid; + } + const placementId = params.placementId || getName(bid); + if (placementId) { + bidObject.placementId = placementId; + } + const sua = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `ortb2.device.sua`); + if (sua) { + bidObject.sua = sua; + } + const coppa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `ortb2.regs.coppa`); + if (coppa) { + bidObject.coppa = 1; + } + if (mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO)) { + const playbackMethod = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.playbackmethod`); + let playbackMethodValue; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(playbackMethod) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isInteger)(playbackMethod[0])) { + playbackMethodValue = playbackMethod[0]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isInteger)(playbackMethod)) { + playbackMethodValue = playbackMethod; + } + if (playbackMethodValue) { + bidObject.playbackMethod = playbackMethodValue; + } + const placement = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.placement`); + if (placement) { + bidObject.placement = placement; + } + const minDuration = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.minduration`); + if (minDuration) { + bidObject.minDuration = minDuration; + } + const maxDuration = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.maxduration`); + if (maxDuration) { + bidObject.maxDuration = maxDuration; + } + const skip = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.skip`); + if (skip) { + bidObject.skip = skip; + } + const linearity = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.linearity`); + if (linearity) { + bidObject.linearity = linearity; + } + const protocols = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.protocols`); + if (protocols) { + bidObject.protocols = protocols; + } + const plcmt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.plcmt`); + if (plcmt) { + bidObject.plcmt = plcmt; + } + const mimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.mimes`); + if (mimes) { + bidObject.mimes = mimes; + } + const api = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.video.api`); + if (api) { + bidObject.api = api; + } + } + if (mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE)) { + const nativeOrtbRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `nativeOrtbRequest`); + if (nativeOrtbRequest) { + bidObject.nativeOrtbRequest = nativeOrtbRequest; + } + } + return bidObject; +} +function buildBidResponse(adUnit) { + const bidResponse = { + requestId: adUnit.requestId, + cpm: adUnit.cpm, + currency: adUnit.currency || _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CURRENCY, + width: adUnit.width, + height: adUnit.height, + ttl: adUnit.ttl || _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_TTL, + creativeId: adUnit.creativeId, + netRevenue: adUnit.netRevenue || true, + nurl: adUnit.nurl, + mediaType: adUnit.mediaType, + meta: { + mediaType: adUnit.mediaType + } + }; + if (adUnit.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + bidResponse.vastXml = adUnit.vastXml; + } else if (adUnit.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + bidResponse.ad = adUnit.ad; + } else if (adUnit.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE) { + bidResponse.native = { + ortb: adUnit.native + }; + } + if (adUnit.adomain && adUnit.adomain.length) { + bidResponse.meta.advertiserDomains = adUnit.adomain; + } + return bidResponse; +} +function generateGeneralParams(generalObject, bidderRequest, adapterVersion) { + const domain = window.location.hostname; + const { + syncEnabled, + filterSettings + } = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('userSync') || {}; + const { + bidderCode + } = bidderRequest; + const generalBidParams = generalObject.params; + const timeout = bidderRequest.timeout; + const adapVer = adapterVersion || '6.0.0'; + const generalParams = { + wrapper_type: 'prebidjs', + wrapper_vendor: "pbjs", + wrapper_version: "9.45.0-pre", + adapter_version: adapVer, + auction_start: bidderRequest.auctionStart, + publisher_id: generalBidParams.org, + publisher_name: domain, + site_domain: domain, + dnt: navigator.doNotTrack === 'yes' || navigator.doNotTrack === '1' || navigator.msDoNotTrack === '1' ? 1 : 0, + device_type: getDeviceType(navigator.userAgent), + ua: navigator.userAgent, + is_wrapper: !!generalBidParams.isWrapper, + session_id: generalBidParams.sessionId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidderRequestId', generalObject), + tmax: timeout + }; + const userIdsParam = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('userId', generalObject); + if (userIdsParam) { + generalParams.userIds = JSON.stringify(userIdsParam); + } + const ortb2Metadata = bidderRequest.ortb2 || {}; + if (ortb2Metadata.site) { + generalParams.site_metadata = JSON.stringify(ortb2Metadata.site); + } + if (ortb2Metadata.user) { + generalParams.user_metadata = JSON.stringify(ortb2Metadata.user); + } + if (ortb2Metadata.device) { + generalParams.device = ortb2Metadata.device; + } + if (syncEnabled) { + const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode); + if (allowedSyncMethod) { + generalParams.cs_method = allowedSyncMethod; + } + } + if (bidderRequest.uspConsent) { + generalParams.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies; + generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString; + } + if (bidderRequest.gppConsent) { + generalParams.gpp = bidderRequest.gppConsent.gppString; + generalParams.gpp_sid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest.ortb2?.regs?.gpp) { + generalParams.gpp = bidderRequest.ortb2.regs.gpp; + generalParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + if (generalBidParams.ifa) { + generalParams.ifa = generalBidParams.ifa; + } + if (generalObject.schain) { + generalParams.schain = getSupplyChain(generalObject.schain); + } + if (bidderRequest && bidderRequest.refererInfo) { + generalParams.referrer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.ref'); + generalParams.page_url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.page') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(window, 'location.href'); + generalParams.site_domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.domain') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(window, 'location.hostname'); + } + return generalParams; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["autoplayDetection"],{ + +/***/ "./libraries/autoplayDetection/autoplay.js": +/*!*************************************************!*\ + !*** ./libraries/autoplayDetection/autoplay.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ isAutoplayEnabled: () => (/* binding */ isAutoplayEnabled) +/* harmony export */ }); +let autoplayEnabled = null; + +/** + * Note: this function returns true if detection is not done yet. This is by design: if autoplay is not allowed, + * the call to video.play() will fail immediately, otherwise it may not terminate. + * @returns true if autoplay is not forbidden + */ +const isAutoplayEnabled = () => autoplayEnabled !== false; + +// generated with: +// ask ChatGPT for a 160x90 black PNG image (1/8th the size of 720p) +// +// encode with: +// ffmpeg -i black_image_160x90.png -r 1 -c:v libx264 -bsf:v 'filter_units=remove_types=6' -pix_fmt yuv420p autoplay.mp4 +// this creates a 1 second long, 1 fps YUV 4:2:0 video encoded with H.264 without encoder details. +// +// followed by: +// echo "data:video/mp4;base64,$(base64 -i autoplay.mp4)" + +const autoplayVideoUrl = 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAADxtZGF0AAAAMGWIhAAV//73ye/Apuvb3rW/k89I/Cy3PsIqP39atohOSV14BYa1heKCYgALQC5K4QAAAwZtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAD6AABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACMHRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAoAAAAFoAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAA+gAAAAAAAEAAAAAAahtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAEAAAABAAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFTbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABE3N0YmwAAACvc3RzZAAAAAAAAAABAAAAn2F2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAoABaAEgAAABIAAAAAAAAAAEVTGF2YzYwLjMxLjEwMiBsaWJ4MjY0AAAAAAAAAAAAAAAY//8AAAA1YXZjQwFkAAr/4QAYZ2QACqzZQo35IQAAAwABAAADAAIPEiWWAQAGaOvjyyLA/fj4AAAAABRidHJ0AAAAAAAAAaAAAAGgAAAAGHN0dHMAAAAAAAAAAQAAAAEAAEAAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAABRzdHN6AAAAAAAAADQAAAABAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjYwLjE2LjEwMA=='; +function startDetection() { + const version = navigator.userAgent.match(/iPhone OS (\d+)_(\d+)/); + if (version !== null && parseInt(version[1]) < 17 && !navigator.userAgent.includes('Safari')) { + // skip autodetection on iOS 16 WebView + return; + } + + // we create an HTMLVideoElement muted and not displayed in which we try to play a one frame video + const videoElement = document.createElement('video'); + videoElement.src = autoplayVideoUrl; + videoElement.setAttribute('playsinline', 'true'); + videoElement.muted = true; + videoElement.play().then(() => { + autoplayEnabled = true; + // if the video is played on a WebView with playsinline = false, this stops the video, to prevent it from being displayed fullscreen + videoElement.src = ''; + }).catch(error => { + if (error instanceof DOMException && error.name === 'NotSupportedError') { + // ignore this error caused by a Content Security Policy that disables data: scheme for media URLs + } else { + autoplayEnabled = false; + } + }); +} + +// starts detection as soon as this library is loaded +startDetection(); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["creative-renderer-native"],{ + +/***/ "./libraries/creative-renderer-native/renderer.js": +/*!********************************************************!*\ + !*** ./libraries/creative-renderer-native/renderer.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ RENDERER: () => (/* binding */ RENDERER) +/* harmony export */ }); +// this file is autogenerated, see creative/README.md +const RENDERER = "(()=>{\"use strict\";const e=\"Prebid Native\",t={title:\"text\",data:\"value\",img:\"url\",video:\"vasttag\"};function n(e,t){return new Promise(((n,r)=>{const i=t.createElement(\"script\");i.onload=n,i.onerror=r,i.src=e,t.body.appendChild(i)}))}function r(e){return Array.from(e.querySelectorAll('iframe[srcdoc*=\"render\"]'))}function i(e){const t=e.cloneNode(!0);return r(t).forEach((e=>e.parentNode.removeChild(e))),t.innerHTML}function o(e,t,r,o,s=n){const{rendererUrl:c,assets:d,ortb:a,adTemplate:l}=t,u=o.document;return c?s(c,u).then((()=>{if(\"function\"!=typeof o.renderAd)throw new Error(`Renderer from '${c}' does not define renderAd()`);const e=d||[];return e.ortb=a,o.renderAd(e)})):Promise.resolve(r(l??i(u.body)))}window.render=function({adId:n,native:s},{sendMessage:c},d,a=o){const{head:l,body:u}=d.document,f=()=>{u.style.display=\"none\",u.style.display=\"block\",c(e,{action:\"resizeNativeHeight\",height:u.offsetHeight,width:u.offsetWidth})};function b(e,t){const n=r(e);Array.from(e.childNodes).filter((e=>!n.includes(e))).forEach((t=>e.removeChild(t))),e.insertAdjacentHTML(\"afterbegin\",t)}const h=function(e,{assets:n=[],ortb:r,nativeKeys:i={}}){const o=Object.fromEntries(n.map((({key:e,value:t})=>[e,t])));let s=Object.fromEntries(Object.entries(i).flatMap((([t,n])=>{const r=o.hasOwnProperty(t)?o[t]:void 0;return[[`##${n}##`,r],[`${n}:${e}`,r]]})));return r&&Object.assign(s,{\"##hb_native_linkurl##\":r.link?.url,\"##hb_native_privacy##\":r.privacy},Object.fromEntries((r.assets||[]).flatMap((e=>{const n=Object.keys(t).find((t=>e[t]));return[n&&[`##hb_native_asset_id_${e.id}##`,e[n][t[n]]],e.link?.url&&[`##hb_native_asset_link_id_${e.id}##`,e.link.url]].filter((e=>e))})))),s=Object.entries(s).concat([[/##hb_native_asset_(link_)?id_\\d+##/g]]),function(e){return s.reduce(((e,[t,n])=>e.replaceAll(t,n||\"\")),e)}}(n,s);return b(l,h(i(l))),a(n,s,h,d).then((t=>{b(u,t),\"function\"==typeof d.postRenderAd&&d.postRenderAd({adId:n,...s}),d.document.querySelectorAll(\".pb-click\").forEach((t=>{const n=t.getAttribute(\"hb_native_asset_id\");t.addEventListener(\"click\",(()=>c(e,{action:\"click\",assetId:n})))})),c(e,{action:\"fireNativeImpressionTrackers\"}),\"complete\"===d.document.readyState?f():d.onload=f}))}})();"; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["userAgentUtils"],{ + +/***/ "./libraries/userAgentUtils/index.js": +/*!*******************************************!*\ + !*** ./libraries/userAgentUtils/index.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBrowser: () => (/* binding */ getBrowser), +/* harmony export */ getDeviceType: () => (/* binding */ getDeviceType), +/* harmony export */ getOS: () => (/* binding */ getOS) +/* harmony export */ }); +/* harmony import */ var _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userAgentTypes.enums.js */ "./libraries/userAgentUtils/userAgentTypes.enums.js"); + + +/** + * Get the approximate device type enum from the user agent + * @returns {number} + */ +const getDeviceType = () => { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.deviceTypes.TABLET; + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.deviceTypes.MOBILE; + return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.deviceTypes.DESKTOP; +}; + +/** + * Get the approximate browser type enum from the user agent (or vendor + * if available) + * @returns {number} + */ +const getBrowser = () => { + if (/Edg/.test(navigator.userAgent)) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.EDGE;else if (/Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.CHROME;else if (navigator.userAgent.match('CriOS')) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.CHROME;else if (/Firefox/.test(navigator.userAgent)) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.FIREFOX;else if (/Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor)) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.SAFARI;else if (/Trident/.test(navigator.userAgent) || /MSIE/.test(navigator.userAgent)) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.INTERNET_EXPLORER;else return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.browserTypes.OTHER; +}; + +/** + * Get the approximate OS enum from the user agent (or app version, + * if available) + * @returns {number} + */ +const getOS = () => { + if (navigator.userAgent.indexOf('Android') != -1) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.ANDROID; + if (navigator.userAgent.indexOf('like Mac') != -1) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.IOS; + if (navigator.userAgent.indexOf('Win') != -1) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.WINDOWS; + if (navigator.userAgent.indexOf('Mac') != -1) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.MAC; + if (navigator.userAgent.indexOf('Linux') != -1) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.LINUX; + if (navigator.appVersion.indexOf('X11') != -1) return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.UNIX; + return _userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_0__.osTypes.OTHER; +}; + +/***/ }), + +/***/ "./libraries/userAgentUtils/userAgentTypes.enums.js": +/*!**********************************************************!*\ + !*** ./libraries/userAgentUtils/userAgentTypes.enums.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ browserTypes: () => (/* binding */ browserTypes), +/* harmony export */ deviceTypes: () => (/* binding */ deviceTypes), +/* harmony export */ osTypes: () => (/* binding */ osTypes) +/* harmony export */ }); +const deviceTypes = Object.freeze({ + DESKTOP: 0, + MOBILE: 1, + TABLET: 2 +}); +const browserTypes = Object.freeze({ + CHROME: 0, + FIREFOX: 1, + SAFARI: 2, + EDGE: 3, + INTERNET_EXPLORER: 4, + OTHER: 5 +}); +const osTypes = Object.freeze({ + WINDOWS: 0, + MAC: 1, + LINUX: 2, + UNIX: 3, + IOS: 4, + ANDROID: 5, + OTHER: 6 +}); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["connectionInfo"],{ + +/***/ "./libraries/connectionInfo/connectionUtils.js": +/*!*****************************************************!*\ + !*** ./libraries/connectionInfo/connectionUtils.js ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getConnectionType: () => (/* binding */ getConnectionType) +/* harmony export */ }); +/** + * Returns the type of connection. + * + * @returns {number} - Type of connection. + */ +function getConnectionType() { + const connection = navigator.connection || navigator.webkitConnection; + if (!connection) { + return 0; + } + switch (connection.type) { + case 'ethernet': + return 1; + case 'wifi': + return 2; + case 'wimax': + return 6; + default: + switch (connection.effectiveType) { + case 'slow-2g': + case '2g': + return 4; + case '3g': + return 5; + case '4g': + return 6; + case '5g': + return 7; + default: + return connection.type == 'cellular' ? 3 : 0; + } + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nexverseUtils"],{ + +/***/ "./libraries/nexverseUtils/index.js": +/*!******************************************!*\ + !*** ./libraries/nexverseUtils/index.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildEndpointUrl: () => (/* binding */ buildEndpointUrl), +/* harmony export */ getDeviceModel: () => (/* binding */ getDeviceModel), +/* harmony export */ getUid: () => (/* binding */ getUid), +/* harmony export */ isBidRequestValid: () => (/* binding */ isBidRequestValid), +/* harmony export */ parseNativeResponse: () => (/* binding */ parseNativeResponse), +/* harmony export */ printLog: () => (/* binding */ printLog) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + +const LOG_WARN_PREFIX = '[Nexverse warn]: '; +const LOG_ERROR_PREFIX = '[Nexverse error]: '; +const LOG_INFO_PREFIX = '[Nexverse info]: '; +const NEXVERSE_USER_COOKIE_KEY = 'user_nexverse'; + +/** + * Determines the device model (if possible). + * @returns {string} The device model or a fallback message if not identifiable. + */ +function getDeviceModel() { + const ua = navigator.userAgent; + if (/iPhone/i.test(ua)) { + return 'iPhone'; + } else if (/iPad/i.test(ua)) { + return 'iPad'; + } else if (/Android/i.test(ua)) { + const match = ua.match(/Android.*;\s([a-zA-Z0-9\s]+)\sBuild/); + return match ? match[1].trim() : 'Unknown Android Device'; + } else if (/Windows Phone/i.test(ua)) { + return 'Windows Phone'; + } else if (/Macintosh/i.test(ua)) { + return 'Mac'; + } else if (/Linux/i.test(ua)) { + return 'Linux'; + } else if (/Windows/i.test(ua)) { + return 'Windows PC'; + } + return ''; +} + +/** + * Prepapre the endpoint URL based on passed bid request. + * @param {string} bidderEndPoint - Bidder End Point. + * @param {object} bid - Bid details. + * @returns {string} The Endpoint URL with required parameters. + */ +function buildEndpointUrl(bidderEndPoint, bid) { + const { + uid, + pubId, + pubEpid + } = bid.params; + const isDebug = bid.isDebug; + let endPoint = `${bidderEndPoint}?uid=${encodeURIComponent(uid)}&pub_id=${encodeURIComponent(pubId)}&pub_epid=${encodeURIComponent(pubEpid)}`; + if (isDebug) { + endPoint = `${endPoint}&test=1`; + } + return endPoint; +} +/** + * Validates the bid request to ensure all required parameters are present. + * @param {Object} bid - The bid request object. + * @returns {boolean} True if the bid request is valid, false otherwise. + */ +function isBidRequestValid(bid) { + const isValid = !!(bid.params && bid.params.uid && bid.params.uid.trim() && bid.params.pubId && bid.params.pubId.trim() && bid.params.pubEpid && bid.params.pubEpid.trim()); + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${LOG_ERROR_PREFIX} Missing required bid parameters.`); + } + return isValid; +} + +/** + * Parses the native response from the server into Prebid's native format. + * + * @param {string} adm - The adm field from the bid response (JSON string). + * @returns {Object} The parsed native response object. + */ +function parseNativeResponse(adm) { + try { + const admObj = JSON.parse(adm); + return admObj.native; + } catch (e) { + printLog('error', `Error parsing native response: `, e); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${LOG_ERROR_PREFIX} Error parsing native response: `, e); + return {}; + } +} + +/** + * Parses the native response from the server into Prebid's native format. + * @param {type} type - Type of log. default is info + * @param {args} args - Log data. + */ +function printLog(type) { + // Determine the prefix based on the log type + const prefixes = { + error: LOG_ERROR_PREFIX, + warning: LOG_WARN_PREFIX, + // Assuming warning uses the same prefix as error + info: LOG_INFO_PREFIX + }; + + // Construct the log message by joining all arguments into a single string + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + const logMessage = args.map(arg => arg instanceof Error ? `${arg.name}: ${arg.message}` : arg).join(' '); // Join all arguments into a single string with a space separator + // Add prefix and punctuation (for info type) + const formattedMessage = `${prefixes[type] || LOG_INFO_PREFIX} ${logMessage}${type === 'info' ? '.' : ''}`; + // Map the log type to its corresponding log function + const logFunctions = { + error: _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError, + warning: _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn, + info: _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo + }; + + // Call the appropriate log function (defaulting to logInfo) + (logFunctions[type] || _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(formattedMessage); +} +/** + * Get or Create Uid for First Party Cookie + */ +const getUid = storage => { + let nexverseUid = storage.getCookie(NEXVERSE_USER_COOKIE_KEY); + if (!nexverseUid) { + nexverseUid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + } + try { + const expirationInMs = 60 * 60 * 24 * 1000; // 1 day in milliseconds + const expirationTime = new Date(Date.now() + expirationInMs); // Set expiration time + // Set the cookie with the expiration date + storage.setCookie(NEXVERSE_USER_COOKIE_KEY, nexverseUid, expirationTime.toUTCString()); + } catch (e) { + printLog('error', `Failed to set UID cookie: ${e.message}`); + } + return nexverseUid; +}; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["getOrigin"],{ + +/***/ "./libraries/getOrigin/index.js": +/*!**************************************!*\ + !*** ./libraries/getOrigin/index.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getOrigin: () => (/* binding */ getOrigin) +/* harmony export */ }); +/** + * Returns the origin + */ +function getOrigin() { + // IE10 does not have this property. https://gist.github.com/hbogs/7908703 + if (!window.location.origin) { + return window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); + } else { + return window.location.origin; + } +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["weakStore"],{ + +/***/ "./libraries/weakStore/weakStore.js": +/*!******************************************!*\ + !*** ./libraries/weakStore/weakStore.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ auctionStore: () => (/* binding */ auctionStore) +/* harmony export */ }); +/* unused harmony export weakStore */ +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/auctionManager.js */ "./src/auctionManager.js"); + +function weakStore(get) { + const store = new WeakMap(); + return function (id) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const obj = get(id); + if (obj == null) return; + if (!store.has(obj)) { + store.set(obj, init); + } + return store.get(obj); + }; +} +const auctionStore = () => weakStore(auctionId => _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_0__.auctionManager.index.getAuction({ + auctionId +})); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["paapiTools"],{ + +/***/ "./libraries/paapiTools/buyerOrigins.js": +/*!**********************************************!*\ + !*** ./libraries/paapiTools/buyerOrigins.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ BO_CSR_ONET: () => (/* binding */ BO_CSR_ONET) +/* harmony export */ }); +/* + This list is several known buyer origins for PAAPI auctions. + Bidders should add anyone they like to it. + It is not intended to be comphensive nor maintained by the Core team. + Rather, Bid adapters should simply append additional constants whenever + the need arises in their adapter. + + The goal is to reduce expression of common constants over many + bid adapters attempting to define interestGroupBuyers + in advance of network traffic. + + Bidders should consider updating their interstGroupBuyer list + with server communication for auctions initiated after the first bid response. + + Known buyers without current importers are commented out. If you need one, uncomment it. +*/ + +const BO_CSR_ONET = 'https://csr.onet.pl'; +// export const BO_DOUBLECLICK_GOOGLEADS = 'https://googleads.g.doubleclick.net'; +// export const BO_DOUBLECLICK_TD = 'https://td.doubleclick.net'; +// export const BO_RTBHOUSE = 'https://f.creativecdn.com'; +// export const BO_CRITEO_US = 'https://fledge.us.criteo.com'; +// export const BO_CRITEO_EU = 'https://fledge.eu.criteo.com'; +// export const BO_CRITEO_AS = 'https://fledge.as.criteo.com'; +// export const BO_CRITEO_GRID_MERCURY = 'https://grid-mercury.criteo.com'; +// export const BO_CRITEO_BIDSWITCH_TRADR = 'https://tradr.bsw-sb.criteo.com'; +// export const BO_CRITEO_BIDSWITCH_SANDBOX = 'https://dsp-paapi-sandbox.bsw-ig.criteo.com'; +// export const BO_APPSPOT = 'https://fledge-buyer-testing-1.uc.r.appspot.com'; +// export const BO_OPTABLE = 'https://ads.optable.co'; +// export const BO_ADROLL = 'https://x.adroll.com'; +// export const BO_ADFORM = 'https://a2.adform.net'; +// export const BO_RETARGETLY = 'https://cookieless-campaign.prd-00.retargetly.com'; +// export const BO_AUDIGENT = 'https://proton.ad.gt'; +// export const BO_YAHOO = 'https://pa.ybp.yahoo.com'; +// export const BO_DOTOMI = 'https://usadmm.dotomi.com'; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["objectGuard"],{ + +/***/ "./libraries/objectGuard/objectGuard.js": +/*!**********************************************!*\ + !*** ./libraries/objectGuard/objectGuard.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ objectGuard: () => (/* binding */ objectGuard), +/* harmony export */ writeProtectRule: () => (/* binding */ writeProtectRule) +/* harmony export */ }); +/* harmony import */ var _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/activities/redactor.js */ "./src/activities/redactor.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + +/** + * @typedef {import('../src/activities/redactor.js').TransformationRuleDef} TransformationRuleDef + * @typedef {import('../src/adapters/bidderFactory.js').TransformationRule} TransformationRule + * @typedef {Object} ObjectGuard + * @property {*} obj a view on the guarded object + * @property {function(): void} verify a function that checks for and rolls back disallowed changes to the guarded object + */ + +/** + * Create a factory function for object guards using the given rules. + * + * An object guard is a pair {obj, verify} where: + * - `obj` is a view on the guarded object that applies "redact" rules (the same rules used in activites/redactor.js) + * - `verify` is a function that, when called, will check that the guarded object was not modified + * in a way that violates any "write protect" rules, and rolls back any offending changes. + * + * This is meant to provide sandboxed version of a privacy-sensitive object, where reads + * are filtered through redaction rules and writes are checked against write protect rules. + * + * @param {Array[TransformationRule]} rules + * @return {function(*, ...[*]): ObjectGuard} + */ +function objectGuard(rules) { + const root = {}; + const writeRules = []; + rules.forEach(rule => { + if (rule.wp) writeRules.push(rule); + if (!rule.get) return; + rule.paths.forEach(path => { + let node = root; + path.split('.').forEach(el => { + node.children = node.children || {}; + node.children[el] = node.children[el] || {}; + node = node.children[el]; + }); + node.rule = rule; + }); + }); + const wpTransformer = (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_0__.objectTransformer)(writeRules); + function mkGuard(obj, tree, applies) { + return new Proxy(obj, { + get(target, prop, receiver) { + const val = Reflect.get(target, prop, receiver); + if (tree.hasOwnProperty(prop)) { + const { + children, + rule + } = tree[prop]; + if (children && val != null && typeof val === 'object') { + return mkGuard(val, children, applies); + } else if (rule && (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_0__.isData)(val) && applies(rule)) { + return rule.get(val); + } + } + return val; + } + }); + } + function mkVerify(transformResult) { + return function () { + transformResult.forEach(fn => fn()); + }; + } + return function guard(obj) { + const session = {}; + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return { + obj: mkGuard(obj, root.children || {}, (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_0__.sessionedApplies)(session, ...args)), + verify: mkVerify(wpTransformer(session, obj, ...args)) + }; + }; +} + +/** + * @param {TransformationRuleDef} ruleDef + * @return {TransformationRule} + */ +function writeProtectRule(ruleDef) { + return Object.assign({ + wp: true, + run(root, path, object, property, applies) { + const origHasProp = object && object.hasOwnProperty(property); + const original = origHasProp ? object[property] : undefined; + const origCopy = origHasProp && original != null && typeof original === 'object' ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(original) : original; + return function () { + const object = path == null ? root : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(root, path); + const finalHasProp = object && (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_0__.isData)(object[property]); + const finalValue = finalHasProp ? object[property] : undefined; + if (!origHasProp && finalHasProp && applies()) { + delete object[property]; + } else if ((origHasProp !== finalHasProp || finalValue !== original || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepEqual)(finalValue, origCopy)) && applies()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(root, (path == null ? [] : [path]).concat(property).join('.'), origCopy); + } + }; + } + }, ruleDef); +} + +/***/ }), + +/***/ "./libraries/objectGuard/ortbGuard.js": +/*!********************************************!*\ + !*** ./libraries/objectGuard/ortbGuard.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ guardOrtb2Fragments: () => (/* binding */ guardOrtb2Fragments) +/* harmony export */ }); +/* unused harmony exports ortb2GuardFactory, ortb2Guard, ortb2FragmentsGuardFactory */ +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/activities/redactor.js */ "./src/activities/redactor.js"); +/* harmony import */ var _objectGuard_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./objectGuard.js */ "./libraries/objectGuard/objectGuard.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + + + + +/** + * @typedef {import('./objectGuard.js').ObjectGuard} ObjectGuard + */ + +function ortb2EnrichRules() { + let isAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.isActivityAllowed; + return [{ + name: _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_1__.ACTIVITY_ENRICH_EIDS, + paths: _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_2__.ORTB_EIDS_PATHS, + applies: (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_2__.appliesWhenActivityDenied)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_1__.ACTIVITY_ENRICH_EIDS, isAllowed) + }, { + name: _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_1__.ACTIVITY_ENRICH_UFPD, + paths: _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_2__.ORTB_UFPD_PATHS, + applies: (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_2__.appliesWhenActivityDenied)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_1__.ACTIVITY_ENRICH_UFPD, isAllowed) + }].map(_objectGuard_js__WEBPACK_IMPORTED_MODULE_3__.writeProtectRule); +} +function ortb2GuardFactory() { + let isAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_0__.isActivityAllowed; + return (0,_objectGuard_js__WEBPACK_IMPORTED_MODULE_3__.objectGuard)((0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_2__.ortb2TransmitRules)(isAllowed).concat(ortb2EnrichRules(isAllowed))); +} + +/** + * + * + * @typedef {Function} ortb2Guard + * @param {{}} ortb2 ORTB object to guard + * @param {{}} params activity params to use for activity checks + * @returns {ObjectGuard} + */ + +/* + * Get a guard for an ORTB object. Read access is restricted in the same way it'd be redacted (see activites/redactor.js); + * and writes are checked against the enrich* activites. + * + * @type ortb2Guard + */ +const ortb2Guard = ortb2GuardFactory(); +function ortb2FragmentsGuardFactory() { + let guardOrtb2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ortb2Guard; + return function guardOrtb2Fragments(fragments, params) { + fragments.global = fragments.global || {}; + fragments.bidder = fragments.bidder || {}; + const bidders = new Set(Object.keys(fragments.bidder)); + const verifiers = []; + function makeGuard(ortb2) { + const guard = guardOrtb2(ortb2, params); + verifiers.push(guard.verify); + return guard.obj; + } + const obj = { + global: makeGuard(fragments.global), + bidder: Object.fromEntries(Object.entries(fragments.bidder).map(_ref => { + let [bidder, ortb2] = _ref; + return [bidder, makeGuard(ortb2)]; + })) + }; + return { + obj, + verify() { + Object.entries(obj.bidder).filter(_ref2 => { + let [bidder] = _ref2; + return !bidders.has(bidder); + }).forEach(_ref3 => { + let [bidder, ortb2] = _ref3; + const repl = {}; + const guard = guardOrtb2(repl, params); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(guard.obj, ortb2); + guard.verify(); + fragments.bidder[bidder] = repl; + }); + verifiers.forEach(fn => fn()); + } + }; + }; +} + +/** + * Get a guard for an ortb2Fragments object. + * @type {function(*, *): ObjectGuard} + */ +const guardOrtb2Fragments = ortb2FragmentsGuardFactory(); + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["equativUtils"],{ + +/***/ "./libraries/equativUtils/equativUtils.js": +/*!************************************************!*\ + !*** ./libraries/equativUtils/equativUtils.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getBidFloor: () => (/* binding */ getBidFloor) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); + + +const DEFAULT_FLOOR = 0.0; + +/** + * Get floors from Prebid Price Floors module + * + * @param {object} bid Bid request object + * @param {string} currency Ad server currency + * @param {string} mediaType Bid media type + * @return {number} Floor price + */ +function getBidFloor(bid, currency, mediaType) { + const floors = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, `mediaTypes.${mediaType}.${mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO ? 'playerSize' : 'sizes'}`) || []).forEach(size => { + const floor = bid.getFloor({ + currency: currency || 'USD', + mediaType, + size + }).floor; + floors.push(!isNaN(floor) ? floor : DEFAULT_FLOOR); + }); + } + return floors.length ? Math.min(...floors) : DEFAULT_FLOOR; +} + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["smartyadsUtils"],{ + +/***/ "./libraries/smartyadsUtils/getAdUrlByRegion.js": +/*!******************************************************!*\ + !*** ./libraries/smartyadsUtils/getAdUrlByRegion.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getAdUrlByRegion: () => (/* binding */ getAdUrlByRegion) +/* harmony export */ }); +const adUrls = { + US_EAST: 'https://n1.smartyads.com/?c=o&m=prebid&secret_key=prebid_js', + EU: 'https://n2.smartyads.com/?c=o&m=prebid&secret_key=prebid_js', + SGP: 'https://n6.smartyads.com/?c=o&m=prebid&secret_key=prebid_js' +}; +function getAdUrlByRegion(bid) { + let adUrl; + if (bid.params.region && adUrls[bid.params.region]) { + adUrl = adUrls[bid.params.region]; + } else { + try { + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const region = timezone.split('/')[0]; + switch (region) { + case 'Europe': + adUrl = adUrls['EU']; + break; + case 'Asia': + adUrl = adUrls['SGP']; + break; + default: + adUrl = adUrls['US_EAST']; + } + } catch (err) { + adUrl = adUrls['US_EAST']; + } + } + return adUrl; +} +; + +/***/ }) + +}]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["1plusXRtdProvider"],{ + +/***/ "./modules/1plusXRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/1plusXRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports fpidStorage, segtaxes, extractConfig, extractConsent, extractFpid, getPapiUrl, buildOrtb2Updates, updateBidderConfig, setTargetingDataToConfig, onePlusXSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + + +// Constants +const REAL_TIME_MODULE = 'realTimeData'; +const MODULE_NAME = '1plusX'; +const ORTB2_NAME = '1plusX.com'; +const PAPI_VERSION = 'v1.0'; +const LOG_PREFIX = '[1plusX RTD Module]: '; +const OPE_FPID = 'ope_fpid'; +const fpidStorage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME +}); +const segtaxes = { + // cf. https://github.com/InteractiveAdvertisingBureau/openrtb/pull/108 + AUDIENCE: 526, + CONTENT: 527 +}; +// Functions +/** + * Extracts the parameters for 1plusX RTD module from the config object passed at instanciation + * @param {Object} moduleConfig Config object passed to the module + * @param {Object} reqBidsConfigObj Config object for the bidders; each adapter has its own entry + * @returns {Object} Extracted configuration parameters for the module + */ +const extractConfig = (moduleConfig, reqBidsConfigObj) => { + // CustomerId + const customerId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(moduleConfig, 'params.customerId'); + if (!customerId) { + throw new Error('Missing parameter customerId in moduleConfig'); + } + // Timeout + const tempTimeout = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(moduleConfig, 'params.timeout'); + const timeout = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(tempTimeout) && tempTimeout > 300 ? tempTimeout : 1000; + + // Bidders + const biddersTemp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(moduleConfig, 'params.bidders'); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(biddersTemp) || !biddersTemp.length) { + throw new Error('Missing parameter bidders in moduleConfig'); + } + const adUnitBidders = reqBidsConfigObj.adUnits.flatMap(_ref => { + let { + bids + } = _ref; + return bids.map(_ref2 => { + let { + bidder + } = _ref2; + return bidder; + }); + }).filter((e, i, a) => a.indexOf(e) === i); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(adUnitBidders) || !adUnitBidders.length) { + throw new Error('Missing parameter bidders in bidRequestConfig'); + } + const bidders = biddersTemp.filter(bidder => adUnitBidders.includes(bidder)); + if (!bidders.length) { + throw new Error('No bidRequestConfig bidder found in moduleConfig bidders'); + } + const fpidStorageType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(moduleConfig, 'params.fpidStorageType', _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_LOCALSTORAGE); + if (fpidStorageType !== _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_COOKIES && fpidStorageType !== _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_LOCALSTORAGE) { + throw new Error(`fpidStorageType must be ${_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_LOCALSTORAGE} or ${_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_COOKIES}`); + } + return { + customerId, + timeout, + bidders, + fpidStorageType + }; +}; + +/** + * Extracts consent from the Prebid consent object and translates it + * into a 1plusX profile api query parameter dict + * @param {object} prebid + * @param {object} prebid.gdpr gdpr object + * @returns {Object|null} dictionary of papi gdpr query parameters + */ +const extractConsent = _ref3 => { + let { + gdpr + } = _ref3; + if (!gdpr) { + return null; + } + const { + gdprApplies, + consentString + } = gdpr; + if (!(gdprApplies == '0' || gdprApplies == '1')) { + throw 'TCF Consent: gdprApplies has wrong format'; + } + if (consentString && typeof consentString != 'string') { + throw 'TCF Consent: consentString must be string if defined'; + } + const result = { + 'gdpr_applies': gdprApplies, + 'consent_string': consentString + }; + return result; +}; + +/** + * Extracts the OPE first party id field + * @param {string} fpidStorageType indicates where fpid should be read from + * @returns fpid string if found, else null + */ +const extractFpid = fpidStorageType => { + try { + switch (fpidStorageType) { + case _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_COOKIES: + return fpidStorage.getCookie(OPE_FPID); + case _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_LOCALSTORAGE: + return fpidStorage.getDataFromLocalStorage(OPE_FPID); + default: + { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Got unknown fpidStorageType ${fpidStorageType}. Aborting...`); + return null; + } + } + } catch (error) { + return null; + } +}; +/** + * Gets the URL of Profile Api from which targeting data will be fetched + * @param {string} customerId + * @param {object} consent query params as dict + * @param {string} [fpid] first party id + * @returns {string} URL to access 1plusX Profile API + */ +const getPapiUrl = (customerId, consent, fpid) => { + // https://[yourClientId].profiles.tagger.opecloud.com/[VERSION]/targeting?url= + const currentUrl = encodeURIComponent(window.location.href); + var papiUrl = `https://${customerId}.profiles.tagger.opecloud.com/${PAPI_VERSION}/targeting?url=${currentUrl}`; + if (consent) { + Object.entries(consent).forEach(_ref4 => { + let [key, value] = _ref4; + papiUrl += `&${key}=${value}`; + }); + } + if (fpid) { + papiUrl += `&fpid=${fpid}`; + } + return papiUrl; +}; + +/** + * Fetches targeting data. It contains the audience segments & the contextual topics + * @param {string} papiUrl URL of profile API + * @returns {Promise} Promise object resolving with data fetched from Profile API + */ +const getTargetingDataFromPapi = papiUrl => { + return new Promise((resolve, reject) => { + const requestOptions = { + customHeaders: { + 'Accept': 'application/json' + } + }; + const callbacks = { + success(responseText, response) { + resolve(JSON.parse(response.response)); + }, + error(error) { + reject(error); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(papiUrl, callbacks, null, requestOptions); + }); +}; + +/** + * Prepares the update for the ORTB2 object + * @param {Object} targetingData Targeting data fetched from Profile API + * @param {string[]} targetingData.segments Represents the audience segments of the user + * @param {string[]} targetingData.topics Represents the topics of the page + * @returns {Object} Object describing the updates to make on bidder configs + */ +const buildOrtb2Updates = _ref5 => { + let { + segments = [], + topics = [] + } = _ref5; + const userData = { + name: ORTB2_NAME, + segment: segments.map(segmentId => ({ + id: segmentId + })), + ext: { + segtax: segtaxes.AUDIENCE + } + }; + const siteContentData = { + name: ORTB2_NAME, + segment: topics.map(topicId => ({ + id: topicId + })), + ext: { + segtax: segtaxes.CONTENT + } + }; + return { + userData, + siteContentData + }; +}; + +/** + * Merges the targeting data with the existing config for bidder and updates + * @param {string} bidder Bidder for which to set config + * @param {Object} ortb2Updates Updates to be applied to bidder config + * @param {Object} biddersOrtb2 All current bidder configs + */ +const updateBidderConfig = (bidder, ortb2Updates, biddersOrtb2) => { + const { + siteContentData, + userData + } = ortb2Updates; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(biddersOrtb2, { + [bidder]: {} + }); + const bidderConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(biddersOrtb2, bidder); + { + const siteDataPath = 'site.content.data'; + const currentSiteContentData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderConfig, siteDataPath) || []; + const updatedSiteContentData = [...currentSiteContentData.filter(_ref6 => { + let { + name + } = _ref6; + return name != siteContentData.name; + }), siteContentData]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(bidderConfig, siteDataPath, updatedSiteContentData); + } + { + const userDataPath = 'user.data'; + const currentUserData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderConfig, userDataPath) || []; + const updatedUserData = [...currentUserData.filter(_ref7 => { + let { + name + } = _ref7; + return name != userData.name; + }), userData]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(bidderConfig, userDataPath, updatedUserData); + } +}; + +/** + * Updates bidder configs with the targeting data retreived from Profile API + * @param {Object} papiResponse Response from Profile API + * @param {Object} config Module configuration + * @param {string[]} config.bidders Bidders specified in module's configuration + */ +const setTargetingDataToConfig = (papiResponse, _ref8) => { + let { + bidders, + biddersOrtb2 + } = _ref8; + const { + s: segments, + t: topics + } = papiResponse; + const ortb2Updates = buildOrtb2Updates({ + segments, + topics + }); + for (const bidder of bidders) { + updateBidderConfig(bidder, ortb2Updates, biddersOrtb2); + } +}; + +// Functions exported in submodule object +/** + * Init + * @param {Object} config Module configuration + * @param {boolean} userConsent + * @returns true + */ +const init = (config, userConsent) => { + return true; +}; + +/** + * + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Function} callback Called on completion + * @param {Object} moduleConfig Configuration for 1plusX RTD module + * @param {Object} userConsent + */ +const getBidRequestData = (reqBidsConfigObj, callback, moduleConfig, userConsent) => { + try { + // Get the required config + const { + customerId, + bidders, + fpidStorageType + } = extractConfig(moduleConfig, reqBidsConfigObj); + const { + ortb2Fragments: { + bidder: biddersOrtb2 + } + } = reqBidsConfigObj; + // Get PAPI URL + const papiUrl = getPapiUrl(customerId, extractConsent(userConsent) || {}, extractFpid(fpidStorageType)); + // Call PAPI + getTargetingDataFromPapi(papiUrl).then(papiResponse => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(LOG_PREFIX, 'Get targeting data request successful'); + setTargetingDataToConfig(papiResponse, { + bidders, + biddersOrtb2 + }); + callback(); + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX, error); + callback(); + } +}; + +// The RTD submodule object to be exported +const onePlusXSubmodule = { + name: MODULE_NAME, + init, + getBidRequestData +}; + +// Register the onePlusXSubmodule as submodule of realTimeData +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)(REAL_TIME_MODULE, onePlusXSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('1plusXRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/1plusXRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["33acrossAnalyticsAdapter"],{ + +/***/ "./modules/33acrossAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/33acrossAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports POST_GAM_TIMEOUT, DEFAULT_ENDPOINT, log, locals */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + +/** + * @typedef {typeof import('../src/constants.js').EVENTS} EVENTS + */ + + + +/** @typedef {'pending'|'available'|'targetingSet'|'rendered'|'timeout'|'rejected'|'noBid'|'error'} BidStatus */ +/** + * @type {Object} + */ +const BidStatus = { + PENDING: 'pending', + AVAILABLE: 'available', + TARGETING_SET: 'targetingSet', + RENDERED: 'rendered', + TIMEOUT: 'timeout', + REJECTED: 'rejected', + NOBID: 'noBid', + ERROR: 'error' +}; +const ANALYTICS_VERSION = '1.0.0'; +const PROVIDER_NAME = '33across'; +const GVLID = 58; +/** Time to wait for all transactions in an auction to complete before sending the report */ +const DEFAULT_TRANSACTION_TIMEOUT = 10000; +/** Time to wait after all GAM slots have registered before sending the report */ +const POST_GAM_TIMEOUT = 500; +const DEFAULT_ENDPOINT = 'https://analytics.33across.com/api/v1/event'; +const log = getLogger(); + +/** + * @typedef {Object} AnalyticsReport - Sent when all bids are complete (as determined by `bidWon` and `slotRenderEnded` events) + * @property {string} analyticsVersion - Version of the Prebid.js 33Across Analytics Adapter + * @property {string} pid - Partner ID + * @property {string} src - Source of the report ('pbjs') + * @property {string} pbjsVersion - Version of Prebid.js + * @property {Auction[]} auctions + */ + +/** + * @typedef {Object} AnalyticsCache + * @property {string} pid Partner ID + * @property {Object} auctions + * @property {string} [usPrivacy] + */ + +/** + * @typedef {Object} Auction - Parsed auction data + * @property {AdUnit[]} adUnits + * @property {string} auctionId + * @property {string[]} userIds + */ + +/** + * @typedef {string} AdUnitSize + */ + +/** + * @typedef {('banner'|'native'|'video')} AdUnitMediaType + */ + +/** + * @typedef {Object} BidResponse + * @property {number} cpm + * @property {string} cur + * @property {number} [cpmOrig] + * @property {number} cpmFloor + * @property {AdUnitMediaType} mediaType + * @property {AdUnitSize} size + */ + +/** + * @typedef {Object} Bid - Parsed bid data + * @property {string} bidder + * @property {string} bidId + * @property {string} source + * @property {string} status + * @property {BidResponse} [bidResponse] + * @property {1|0} [hasWon] + */ + +/** + * @typedef {Object} AdUnit - Parsed adUnit data + * @property {string} transactionId - Primary key for *this* auction/adUnit combination + * @property {string} adUnitCode + * @property {string} slotId - Equivalent to GPID. (Note that + * GPID supports adUnits where multiple units have the same `code` values + * by appending a `#UNIQUIFIER`. The value of the UNIQUIFIER is likely to be the div-id, + * but, if div-id is randomized / unavailable, may be something else like the media size) + * @property {Array} mediaTypes + * @property {Array} sizes + * @property {Array} bids + */ + +/** + * After the first transaction begins, wait until all transactions are complete + * before calling `onComplete`. If the timeout is reached before all transactions + * are complete, send the report anyway. + * + * Use this to track all transactions per auction, and send the report as soon + * as all adUnits have been won (or after timeout) even if other bid/auction + * activity is still happening. + */ +class TransactionManager { + /** + * Milliseconds between activity to allow until this collection automatically completes. + * @type {number} + */ + #sendTimeout; + #sendTimeoutId; + #transactionsPending = new Set(); + #transactionsCompleted = new Set(); + #onComplete; + constructor(_ref) { + let { + timeout, + onComplete + } = _ref; + this.#sendTimeout = timeout; + this.#onComplete = onComplete; + } + status() { + return { + pending: [...this.#transactionsPending], + completed: [...this.#transactionsCompleted] + }; + } + initiate(transactionId) { + this.#transactionsPending.add(transactionId); + this.#restartSendTimeout(); + } + complete(transactionId) { + if (!this.#transactionsPending.has(transactionId)) { + log.warn(`transactionId "${transactionId}" was not found. No transaction to mark as complete.`); + return; + } + this.#transactionsPending.delete(transactionId); + this.#transactionsCompleted.add(transactionId); + if (this.#transactionsPending.size === 0) { + this.#flushTransactions(); + } + } + #flushTransactions() { + this.#clearSendTimeout(); + this.#transactionsPending = new Set(); + this.#onComplete(); + } + + // gulp-eslint is using eslint 6, a version that doesn't support private method syntax + + #clearSendTimeout() { + return clearTimeout(this.#sendTimeoutId); + } + #restartSendTimeout() { + this.#clearSendTimeout(); + this.#sendTimeoutId = setTimeout(() => { + if (this.#sendTimeout !== 0) { + log.warn(`Timed out waiting for ad transactions to complete. Sending report.`); + } + this.#flushTransactions(); + }, this.#sendTimeout); + } +} + +/** + * Initialized during `enableAnalytics`. Exported for testing purposes. + */ +const locals = { + /** @type {Object} - one manager per auction */ + transactionManagers: {}, + /** @type {AnalyticsCache} */ + cache: { + auctions: {}, + pid: '' + }, + /** @type {Object} */ + adUnitMap: {}, + reset() { + this.transactionManagers = {}; + this.cache = { + auctions: {}, + pid: '' + }; + this.adUnitMap = {}; + } +}; + +/** + * @typedef {Object} AnalyticsAdapter + * @property {function} track + * @property {function} enableAnalytics + * @property {function} disableAnalytics + * @property {function} [originEnableAnalytics] + * @property {function} [originDisableAnalytics] + * @property {function} [_oldEnable] + */ + +/** + * @type {AnalyticsAdapter} + */ +const analyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + analyticsType: 'endpoint' +}), { + track: analyticEventHandler +}); +analyticsAdapter.originEnableAnalytics = analyticsAdapter.enableAnalytics; +analyticsAdapter.enableAnalytics = enableAnalyticsWrapper; + +/** + * @typedef {Object} AnalyticsConfig + * @property {string} provider - set by pbjs at module registration time + * @property {Object} options + * @property {string} options.pid - Publisher/Partner ID + * @property {string} [options.endpoint=DEFAULT_ENDPOINT] - Endpoint to send analytics data + * @property {number} [options.timeout=DEFAULT_TRANSACTION_TIMEOUT] - Timeout for sending analytics data + */ + +/** + * @param {AnalyticsConfig} config Analytics module configuration + */ +function enableAnalyticsWrapper(config) { + const { + options + } = config; + const pid = options.pid; + if (!pid) { + log.error('No partnerId provided for "options.pid". No analytics will be sent.'); + return; + } + const endpoint = calculateEndpoint(options.endpoint); + this.getUrl = () => endpoint; + const timeout = calculateTransactionTimeout(options.timeout); + this.getTimeout = () => timeout; + locals.cache = { + pid, + auctions: {} + }; + window.googletag = window.googletag || { + cmd: [] + }; + window.googletag.cmd.push(subscribeToGamSlots); + analyticsAdapter.originEnableAnalytics(config); +} + +/** + * @param {string} [endpoint] + * @returns {string} + */ +function calculateEndpoint() { + let endpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_ENDPOINT; + if (typeof endpoint === 'string' && endpoint.startsWith('http')) { + return endpoint; + } + log.info(`Invalid endpoint provided for "options.endpoint". Using default endpoint.`); + return DEFAULT_ENDPOINT; +} +/** + * @param {number} [configTimeout] + * @returns {number} Transaction Timeout + */ +function calculateTransactionTimeout() { + let configTimeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_TRANSACTION_TIMEOUT; + if (typeof configTimeout === 'number' && configTimeout >= 0) { + return configTimeout; + } + log.info(`Invalid timeout provided for "options.timeout". Using default timeout of ${DEFAULT_TRANSACTION_TIMEOUT}ms.`); + return DEFAULT_TRANSACTION_TIMEOUT; +} +function subscribeToGamSlots() { + window.googletag.pubads().addEventListener('slotRenderEnded', event => { + setTimeout(() => { + const { + transactionId, + auctionId + } = getAdUnitMetadata(event.slot.getAdUnitPath(), event.slot.getSlotElementId()); + if (!transactionId || !auctionId) { + const slotName = `${event.slot.getAdUnitPath()} - ${event.slot.getSlotElementId()}`; + log.warn('Could not find configured ad unit matching GAM render of slot:', { + slotName + }); + return; + } + locals.transactionManagers[auctionId] && locals.transactionManagers[auctionId].complete(transactionId); + }, POST_GAM_TIMEOUT); + }); +} +function getAdUnitMetadata(adUnitPath, adSlotElementId) { + const adUnitMeta = locals.adUnitMap[adUnitPath] || locals.adUnitMap[adSlotElementId]; + if (adUnitMeta && adUnitMeta.length > 0) { + return adUnitMeta[adUnitMeta.length - 1]; + } + return {}; +} + +/** necessary for testing */ +analyticsAdapter.originDisableAnalytics = analyticsAdapter.disableAnalytics; +analyticsAdapter.disableAnalytics = function () { + analyticsAdapter._oldEnable = enableAnalyticsWrapper; + locals.reset(); + analyticsAdapter.originDisableAnalytics(); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: analyticsAdapter, + code: PROVIDER_NAME, + gvlid: GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (analyticsAdapter); + +/** + * @param {AnalyticsCache} analyticsCache + * @param {string} completedAuctionId value of auctionId + * @return {AnalyticsReport} Analytics report + */ +function createReportFromCache(analyticsCache, completedAuctionId) { + const { + pid, + auctions + } = analyticsCache; + const report = { + pid, + src: 'pbjs', + analyticsVersion: ANALYTICS_VERSION, + pbjsVersion: "9.45.0-pre", + // Replaced by build script + auctions: [auctions[completedAuctionId]] + }; + if (_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.uspDataHandler.getConsentData()) { + report.usPrivacy = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.uspDataHandler.getConsentData(); + } + if (_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gdprDataHandler.getConsentData()) { + report.gdpr = Number(Boolean(_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gdprDataHandler.getConsentData().gdprApplies)); + report.gdprConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gdprDataHandler.getConsentData().consentString || ''; + } + if (_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData()) { + report.gpp = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData().gppString; + report.gppSid = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData().applicableSections; + } + if (_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.coppaDataHandler.getCoppa()) { + report.coppa = Number(_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.coppaDataHandler.getCoppa()); + } + return report; +} +function getCachedBid(auctionId, bidId) { + const auction = locals.cache.auctions[auctionId]; + for (let adUnit of auction.adUnits) { + for (let bid of adUnit.bids) { + if (bid.bidId === bidId) { + return bid; + } + } + } + log.error(`Cannot find bid "${bidId}" in auction "${auctionId}".`); +} +; + +/** + * @param {Object} args + * @param {Object} args.args Event data + * @param {string} args.eventType + */ +function analyticEventHandler(_ref2) { + let { + eventType, + args + } = _ref2; + if (!locals.cache) { + log.error('Something went wrong. Analytics cache is not initialized.'); + return; + } + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_INIT: + onAuctionInit(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_REQUESTED: + // BidStatus.PENDING + onBidRequested(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT: + for (let bid of args) { + setCachedBidStatus(bid.auctionId, bid.bidId, BidStatus.TIMEOUT); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_RESPONSE: + onBidResponse(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_REJECTED: + onBidRejected(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.NO_BID: + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.SEAT_NON_BID: + setCachedBidStatus(args.auctionId, args.bidId, BidStatus.NOBID); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BIDDER_ERROR: + if (args.bidderRequest && args.bidderRequest.bids) { + for (let bid of args.bidderRequest.bids) { + setCachedBidStatus(args.bidderRequest.auctionId, bid.bidId, BidStatus.ERROR); + } + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END: + onAuctionEnd(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_WON: + // BidStatus.TARGETING_SET | BidStatus.RENDERED | BidStatus.ERROR + onBidWon(args); + break; + default: + break; + } +} + +/**************** + * AUCTION_INIT * + ***************/ +function onAuctionInit(_ref3) { + let { + adUnits, + auctionId, + bidderRequests + } = _ref3; + if (typeof auctionId !== 'string' || !Array.isArray(bidderRequests)) { + log.error('Analytics adapter failed to parse auction.'); + return; + } + locals.cache.auctions[auctionId] = { + auctionId, + adUnits: adUnits.map(au => { + setAdUnitMap(au.code, auctionId, au.transactionId); + return { + transactionId: au.transactionId, + adUnitCode: au.code, + // Note: GPID supports adUnits that have matching `code` values by appending a `#UNIQUIFIER`. + // The value of the UNIQUIFIER is likely to be the div-id, + // but, if div-id is randomized / unavailable, may be something else like the media size) + slotId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(au, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(au, 'ortb2Imp.ext.data.pbadslot', au.code), + mediaTypes: Object.keys(au.mediaTypes), + sizes: au.sizes.map(size => size.join('x')), + bids: [] + }; + }), + userIds: Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequests, '0.bids.0.userId', {})) + }; + locals.transactionManagers[auctionId] ||= new TransactionManager({ + timeout: analyticsAdapter.getTimeout(), + onComplete() { + sendReport(createReportFromCache(locals.cache, auctionId), analyticsAdapter.getUrl()); + delete locals.transactionManagers[auctionId]; + } + }); +} +function setAdUnitMap(adUnitCode, auctionId, transactionId) { + if (!locals.adUnitMap[adUnitCode]) { + locals.adUnitMap[adUnitCode] = []; + } + locals.adUnitMap[adUnitCode].push({ + auctionId, + transactionId + }); +} + +/***************** + * BID_REQUESTED * + ****************/ +function onBidRequested(_ref4) { + let { + auctionId, + bids + } = _ref4; + for (let { + bidder, + bidId, + transactionId, + src + } of bids) { + const auction = locals.cache.auctions[auctionId]; + const adUnit = auction.adUnits.find(adUnit => adUnit.transactionId === transactionId); + if (!adUnit) return; + adUnit.bids.push({ + bidder, + bidId, + status: BidStatus.PENDING, + hasWon: 0, + source: src + }); + + // if there is no manager for this auction, then the auction has already been completed + locals.transactionManagers[auctionId] && locals.transactionManagers[auctionId].initiate(transactionId); + } +} + +/**************** + * BID_RESPONSE * + ***************/ +function onBidResponse(_ref5) { + let { + requestId, + auctionId, + cpm, + currency, + originalCpm, + floorData, + mediaType, + size, + status, + source + } = _ref5; + const bid = getCachedBid(auctionId, requestId); + if (!bid) return; + setBidStatus(bid, status); + Object.assign(bid, { + bidResponse: { + cpm, + cur: currency, + cpmOrig: originalCpm, + cpmFloor: floorData?.floorValue, + mediaType, + size + }, + source + }); +} + +/**************** + * BID_REJECTED * + ***************/ +function onBidRejected(_ref6) { + let { + requestId, + auctionId, + cpm, + currency, + originalCpm, + floorData, + mediaType, + width, + height, + source + } = _ref6; + const bid = getCachedBid(auctionId, requestId); + if (!bid) return; + setBidStatus(bid, BidStatus.REJECTED); + Object.assign(bid, { + bidResponse: { + cpm, + cur: currency, + cpmOrig: originalCpm, + cpmFloor: floorData?.floorValue, + mediaType, + size: `${width}x${height}` + }, + source + }); +} + +/*************** + * AUCTION_END * + **************/ +/** + * @param {Object} args + * @param {{requestId: string, status: string}[]} args.bidsReceived + * @param {string} args.auctionId + * @returns {void} + */ +function onAuctionEnd(_ref7) { + let { + bidsReceived, + auctionId + } = _ref7; + for (let bid of bidsReceived) { + setCachedBidStatus(auctionId, bid.requestId, bid.status); + } +} + +/*********** + * BID_WON * + **********/ +function onBidWon(bidWon) { + const { + auctionId, + requestId, + transactionId + } = bidWon; + const bid = getCachedBid(auctionId, requestId); + if (!bid) { + return; + } + setBidStatus(bid, bidWon.status ?? BidStatus.ERROR); + locals.transactionManagers[auctionId] && locals.transactionManagers[auctionId].complete(transactionId); +} + +/** + * @param {Bid} bid + * @param {BidStatus} [status] + * @returns {void} + */ +function setBidStatus(bid) { + let status = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : BidStatus.AVAILABLE; + const statusStates = { + pending: { + next: [BidStatus.AVAILABLE, BidStatus.TARGETING_SET, BidStatus.RENDERED, BidStatus.TIMEOUT, BidStatus.REJECTED, BidStatus.NOBID, BidStatus.ERROR] + }, + available: { + next: [BidStatus.TARGETING_SET, BidStatus.RENDERED, BidStatus.TIMEOUT, BidStatus.REJECTED, BidStatus.NOBID, BidStatus.ERROR] + }, + targetingSet: { + next: [BidStatus.RENDERED, BidStatus.ERROR, BidStatus.TIMEOUT] + }, + rendered: { + next: [] + }, + timeout: { + next: [] + }, + rejected: { + next: [] + }, + noBid: { + next: [] + }, + error: { + next: [BidStatus.TARGETING_SET, BidStatus.RENDERED, BidStatus.TIMEOUT, BidStatus.REJECTED, BidStatus.NOBID, BidStatus.ERROR] + } + }; + const winningStatuses = [BidStatus.RENDERED]; + if (statusStates[bid.status].next.includes(status)) { + bid.status = status; + if (winningStatuses.includes(status)) { + // occassionally we can detect a bidWon before prebid reports it as such + bid.hasWon = 1; + } + } +} +function setCachedBidStatus(auctionId, bidId, status) { + const bid = getCachedBid(auctionId, bidId); + if (!bid) return; + setBidStatus(bid, status); +} + +/** + * Guarantees sending of data without waiting for response, even after page is left/closed + * + * @param {AnalyticsReport} report Request payload + * @param {string} endpoint URL + */ +function sendReport(report, endpoint) { + if ((0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.sendBeacon)(endpoint, JSON.stringify(report))) { + log.info(`Analytics report sent to ${endpoint}`, report); + return; + } + log.error('Analytics report exceeded User-Agent data limits and was not sent.', report); +} + +/** + * Encapsulate certain logger functions and add a prefix to the final messages. + * + * @return {Object} New logger functions + */ +function getLogger() { + const LPREFIX = `${PROVIDER_NAME} Analytics: `; + return { + info: function (msg) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(`${LPREFIX}${msg}`, ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(args)); + }, + warn: function (msg) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(`${LPREFIX}${msg}`, ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(args)); + }, + error: function (msg) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(`${LPREFIX}${msg}`, ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(args)); + } + }; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('33acrossAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/33acrossAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["33acrossBidAdapter"],{ + +/***/ "./modules/33acrossBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/33acrossBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/percentInView/percentInView.js */ "./libraries/percentInView/percentInView.js"); + + + + + + + + +// **************************** UTILS ************************** // +const BIDDER_CODE = '33across'; +const BIDDER_ALIASES = ['33across_mgni']; +const END_POINT = 'https://ssc.33across.com/api/v1/hb'; +const SYNC_ENDPOINT = 'https://ssc-cms.33across.com/ps/?m=xch&rt=html&ru=deb'; +const CURRENCY = 'USD'; +const GVLID = 58; +const GUID_PATTERN = /^[a-zA-Z0-9_-]{22}$/; +const PRODUCT = { + SIAB: 'siab', + INVIEW: 'inview', + INSTREAM: 'instream' +}; +const VIDEO_ORTB_PARAMS = ['mimes', 'minduration', 'maxduration', 'placement', 'plcmt', 'protocols', 'startdelay', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']; +const adapterState = { + uniqueSiteIds: [] +}; +const NON_MEASURABLE = 'nm'; +function getTTXConfig() { + const ttxSettings = Object.assign({}, _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('ttxSettings')); + return ttxSettings; +} + +// **************************** VALIDATION *************************** // +function isBidRequestValid(bid) { + return _validateBasic(bid) && _validateBanner(bid) && _validateVideo(bid); +} +function _validateBasic(bid) { + if (!bid.params) { + return false; + } + if (!_validateGUID(bid)) { + return false; + } + return true; +} +function _validateGUID(bid) { + const siteID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.siteId', '') || ''; + if (siteID.trim().match(GUID_PATTERN) === null) { + return false; + } + return true; +} +function _validateBanner(bid) { + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner'); + + // If there's no banner no need to validate against banner rules + if (banner === undefined) { + return true; + } + if (!Array.isArray(banner.sizes)) { + return false; + } + return true; +} +function _validateVideo(bid) { + const videoAdUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video'); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.video', {}); + + // If there's no video no need to validate against video rules + if (videoAdUnit === undefined) { + return true; + } + if (!Array.isArray(videoAdUnit.playerSize)) { + return false; + } + if (!videoAdUnit.context) { + return false; + } + const videoParams = { + ...videoAdUnit, + ...videoBidderParams + }; + if (!Array.isArray(videoParams.mimes) || videoParams.mimes.length === 0) { + return false; + } + if (!Array.isArray(videoParams.protocols) || videoParams.protocols.length === 0) { + return false; + } + + // If placement if defined, it must be a number + if ([videoParams.placement, videoParams.plcmt].some(value => typeof value !== 'undefined' && typeof value !== 'number')) { + return false; + } + + // If startdelay is defined it must be a number + if (videoAdUnit.context === 'instream' && typeof videoParams.startdelay !== 'undefined' && typeof videoParams.startdelay !== 'number') { + return false; + } + return true; +} + +// **************************** BUILD REQUESTS *************************** // +// NOTE: With regards to gdrp consent data, the server will independently +// infer the gdpr applicability therefore, setting the default value to false +function buildRequests(bidRequests, bidderRequest) { + const { + ttxSettings, + gdprConsent, + uspConsent, + gppConsent, + pageUrl, + referer + } = _buildRequestParams(bidRequests, bidderRequest); + const groupedRequests = _buildRequestGroups(ttxSettings, bidRequests); + const serverRequests = []; + for (const key in groupedRequests) { + serverRequests.push(_createServerRequest({ + bidRequests: groupedRequests[key], + gdprConsent, + uspConsent, + gppConsent, + pageUrl, + referer, + ttxSettings, + bidderRequest + })); + } + return serverRequests; +} +function _buildRequestParams(bidRequests, bidderRequest) { + const ttxSettings = getTTXConfig(); + const gdprConsent = Object.assign({ + consentString: undefined, + gdprApplies: false + }, bidderRequest && bidderRequest.gdprConsent); + adapterState.uniqueSiteIds = bidRequests.map(req => req.params.siteId).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.uniques); + return { + ttxSettings, + gdprConsent, + uspConsent: bidderRequest?.uspConsent, + gppConsent: bidderRequest?.gppConsent, + pageUrl: bidderRequest?.refererInfo?.page, + referer: bidderRequest?.refererInfo?.ref + }; +} +function _buildRequestGroups(ttxSettings, bidRequests) { + const bidRequestsComplete = bidRequests.map(_inferProduct); + const enableSRAMode = ttxSettings && ttxSettings.enableSRAMode; + const keyFunc = enableSRAMode === true ? _getSRAKey : _getMRAKey; + return _groupBidRequests(bidRequestsComplete, keyFunc); +} +function _groupBidRequests(bidRequests, keyFunc) { + const groupedRequests = {}; + bidRequests.forEach(req => { + const key = keyFunc(req); + groupedRequests[key] = groupedRequests[key] || []; + groupedRequests[key].push(req); + }); + return groupedRequests; +} +function _getSRAKey(bidRequest) { + return `${bidRequest.params.siteId}:${bidRequest.params.productId}`; +} +function _getMRAKey(bidRequest) { + return `${bidRequest.bidId}`; +} + +// Infer the necessary data from valid bid for a minimal ttxRequest and create HTTP request +function _createServerRequest(_ref) { + let { + bidRequests, + gdprConsent = {}, + uspConsent, + gppConsent = {}, + pageUrl, + referer, + ttxSettings, + bidderRequest + } = _ref; + const ttxRequest = {}; + const firstBidRequest = bidRequests[0]; + const { + siteId, + test + } = firstBidRequest.params; + const coppaValue = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('coppa'); + + /* + * Infer data for the request payload + */ + ttxRequest.imp = []; + bidRequests.forEach(req => { + ttxRequest.imp.push(_buildImpORTB(req)); + }); + ttxRequest.site = { + id: siteId + }; + ttxRequest.device = _buildDeviceORTB(firstBidRequest.ortb2?.device); + if (pageUrl) { + ttxRequest.site.page = pageUrl; + } + if (referer) { + ttxRequest.site.ref = referer; + } + ttxRequest.id = bidderRequest?.bidderRequestId; + if (gdprConsent.consentString) { + ttxRequest.user = setExtensions(ttxRequest.user, { + 'consent': gdprConsent.consentString + }); + } + if (Array.isArray(firstBidRequest.userIdAsEids) && firstBidRequest.userIdAsEids.length > 0) { + ttxRequest.user = setExtensions(ttxRequest.user, { + 'eids': firstBidRequest.userIdAsEids + }); + } + ttxRequest.regs = setExtensions(ttxRequest.regs, { + 'gdpr': Number(gdprConsent.gdprApplies) + }); + if (uspConsent) { + ttxRequest.regs = setExtensions(ttxRequest.regs, { + 'us_privacy': uspConsent + }); + } + if (gppConsent.gppString) { + Object.assign(ttxRequest.regs, { + 'gpp': gppConsent.gppString, + 'gpp_sid': gppConsent.applicableSections + }); + } + if (coppaValue !== undefined) { + ttxRequest.regs.coppa = Number(!!coppaValue); + } + ttxRequest.ext = { + ttx: { + prebidStartedAt: Date.now(), + caller: [{ + 'name': 'prebidjs', + 'version': "9.45.0-pre" + }] + } + }; + if (firstBidRequest.schain) { + ttxRequest.source = setExtensions(ttxRequest.source, { + 'schain': firstBidRequest.schain + }); + } + + // Finally, set the openRTB 'test' param if this is to be a test bid + if (test === 1) { + ttxRequest.test = 1; + } + + /* + * Now construct the full server request + */ + const options = { + contentType: 'text/plain', + withCredentials: true + }; + + // Allow the ability to configure the HB endpoint for testing purposes. + const url = ttxSettings && ttxSettings.url || `${END_POINT}?guid=${siteId}`; + + // Return the server request + return { + 'method': 'POST', + 'url': url, + 'data': JSON.stringify(ttxRequest), + 'options': options + }; +} + +// BUILD REQUESTS: SET EXTENSIONS +function setExtensions() { + let obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let extFields = arguments.length > 1 ? arguments[1] : undefined; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)({}, obj, { + 'ext': extFields + }); +} + +// BUILD REQUESTS: IMP +function _buildImpORTB(bidRequest) { + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'ortb2Imp.ext.gpid'); + const imp = { + id: bidRequest.bidId, + ext: { + ttx: { + prod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.productId') + }, + ...(gpid ? { + gpid + } : {}) + } + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner')) { + imp.banner = { + ..._buildBannerORTB(bidRequest) + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video')) { + imp.video = _buildVideoORTB(bidRequest); + } + return imp; +} + +// BUILD REQUESTS: SIZE INFERENCE +function _transformSizes(sizes) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(sizes) && sizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(sizes[0])) { + return [_getSize(sizes)]; + } + return sizes.map(_getSize); +} +function _getSize(size) { + return { + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + }; +} + +// BUILD REQUESTS: PRODUCT INFERENCE +function _inferProduct(bidRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)({}, bidRequest, { + params: { + productId: _getProduct(bidRequest) + } + }); +} +function _getProduct(bidRequest) { + const { + params, + mediaTypes + } = bidRequest; + const { + banner, + video + } = mediaTypes; + if (video && !banner && video.context === 'instream') { + return PRODUCT.INSTREAM; + } + return params.productId === PRODUCT.INVIEW ? params.productId : PRODUCT.SIAB; +} + +// BUILD REQUESTS: BANNER +function _buildBannerORTB(bidRequest) { + const bannerAdUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner', {}); + const element = _getAdSlotHTMLElement(bidRequest.adUnitCode); + const sizes = _transformSizes(bannerAdUnit.sizes); + let format; + + // We support size based bidfloors so obtain one if there's a rule associated + if (typeof bidRequest.getFloor === 'function') { + format = sizes.map(size => { + const bidfloors = _getBidFloors(bidRequest, size, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER); + let formatExt; + if (bidfloors) { + formatExt = { + ext: { + ttx: { + bidfloors: [bidfloors] + } + } + }; + } + return Object.assign({}, size, formatExt); + }); + } else { + format = sizes; + } + const minSize = _getMinSize(sizes); + const viewabilityAmount = _isViewabilityMeasurable(element) ? _getViewability(element, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(), minSize) : NON_MEASURABLE; + const ext = contributeViewability(viewabilityAmount); + return { + format, + ext + }; +} + +// BUILD REQUESTS: VIDEO + +function _buildVideoORTB(bidRequest) { + const videoAdUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.video', {}); + const videoParams = { + ...videoAdUnit, + ...videoBidderParams // Bidder Specific overrides + }; + const video = {}; + const { + w, + h + } = _getSize(videoParams.playerSize[0]); + video.w = w; + video.h = h; + + // Obtain all ORTB params related video from Ad Unit + VIDEO_ORTB_PARAMS.forEach(param => { + if (videoParams.hasOwnProperty(param)) { + video[param] = videoParams[param]; + } + }); + const product = _getProduct(bidRequest); + + // Placement Inference Rules: + // - If no placement is defined then default to 2 (In Banner) + // - If the old deprecated field is defined, use its value for the recent placement field + + const calculatePlacementValue = () => { + const IN_BANNER_PLACEMENT_VALUE = 2; + if (video.placement) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('[33Across Adapter] The ORTB field `placement` is deprecated, please use `plcmt` instead'); + return video.placement; + } + return IN_BANNER_PLACEMENT_VALUE; + }; + video.plcmt ??= calculatePlacementValue(); + if (product === PRODUCT.INSTREAM) { + video.startdelay = video.startdelay || 0; + } + + // bidfloors + if (typeof bidRequest.getFloor === 'function') { + const bidfloors = _getBidFloors(bidRequest, { + w: video.w, + h: video.h + }, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO); + if (bidfloors) { + Object.assign(video, { + ext: { + ttx: { + bidfloors: [bidfloors] + } + } + }); + } + } + return video; +} + +// BUILD REQUESTS: BIDFLOORS +function _getBidFloors(bidRequest, size, mediaType) { + const bidFloors = bidRequest.getFloor({ + currency: CURRENCY, + mediaType, + size: [size.w, size.h] + }); + if (!isNaN(bidFloors?.floor) && bidFloors?.currency === CURRENCY) { + return bidFloors.floor; + } +} + +// BUILD REQUESTS: VIEWABILITY +function _isViewabilityMeasurable(element) { + return !_isIframe() && element !== null; +} +function _getViewability(element, topWin) { + let { + w, + h + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return topWin.document.visibilityState === 'visible' ? (0,_libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_4__.percentInView)(element, { + w, + h + }) : 0; +} +function _mapAdUnitPathToElementId(adUnitCode) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isGptPubadsDefined)()) { + // eslint-disable-next-line no-undef + const adSlots = googletag.pubads().getSlots(); + const isMatchingAdSlot = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__.isSlotMatchingAdUnitCode)(adUnitCode); + for (let i = 0; i < adSlots.length; i++) { + if (isMatchingAdSlot(adSlots[i])) { + const id = adSlots[i].getSlotElementId(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`[33Across Adapter] Map ad unit path to HTML element id: '${adUnitCode}' -> ${id}`); + return id; + } + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`[33Across Adapter] Unable to locate element for ad unit code: '${adUnitCode}'`); + return null; +} +function _getAdSlotHTMLElement(adUnitCode) { + return document.getElementById(adUnitCode) || document.getElementById(_mapAdUnitPathToElementId(adUnitCode)); +} +function _getMinSize(sizes) { + return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min); +} + +/** + * Viewability contribution to request.. + */ +function contributeViewability(viewabilityAmount) { + const amount = isNaN(viewabilityAmount) ? viewabilityAmount : Math.round(viewabilityAmount); + return { + ttx: { + viewability: { + amount + } + } + }; +} +function _isIframe() { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)() !== (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(); + } catch (e) { + return true; + } +} + +// **************************** INTERPRET RESPONSE ******************************** // +function interpretResponse(serverResponse, bidRequest) { + const { + seatbid, + cur = 'USD' + } = serverResponse.body; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(seatbid)) { + return []; + } + + // Pick seats with valid bids and convert them into an Array of responses + // in format expected by Prebid Core + return seatbid.filter(seat => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(seat.bid) && seat.bid.length > 0).reduce((acc, seat) => { + return acc.concat(seat.bid.map(bid => _createBidResponse(bid, cur))); + }, []); +} +function _createBidResponse(bid, cur) { + const isADomainPresent = bid.adomain && bid.adomain.length; + const bidResponse = { + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ad: bid.adm, + ttl: bid.ttl || 60, + creativeId: bid.crid, + mediaType: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ext.ttx.mediaType', _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER), + currency: cur, + netRevenue: true + }; + if (isADomainPresent) { + bidResponse.meta = { + advertiserDomains: bid.adomain + }; + } + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + const vastType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ext.ttx.vastType', 'xml'); + if (vastType === 'xml') { + bidResponse.vastXml = bidResponse.ad; + } else { + bidResponse.vastUrl = bidResponse.ad; + } + } + return bidResponse; +} + +// **************************** USER SYNC *************************** // +// Register one sync per unique guid so long as iframe is enable +// Else no syncs +// For logic on how we handle gdpr data see _createSyncs and module's unit tests +// '33acrossBidAdapter#getUserSyncs' +function getUserSyncs(syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + const syncUrls = syncOptions.iframeEnabled ? adapterState.uniqueSiteIds.map(siteId => _createSync({ + gdprConsent, + uspConsent, + gppConsent, + siteId + })) : []; + + // Clear adapter state of siteID's since we don't need this info anymore. + adapterState.uniqueSiteIds = []; + return syncUrls; +} + +// Sync object will always be of type iframe for TTX +function _createSync(_ref2) { + let { + siteId = 'zzz000000000003zzz', + gdprConsent = {}, + uspConsent, + gppConsent = {} + } = _ref2; + const ttxSettings = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('ttxSettings'); + const syncUrl = ttxSettings && ttxSettings.syncUrl || SYNC_ENDPOINT; + const { + consentString, + gdprApplies + } = gdprConsent; + const { + gppString = '', + applicableSections = [] + } = gppConsent; + const sync = { + type: 'iframe', + url: `${syncUrl}&id=${siteId}&gdpr_consent=${encodeURIComponent(consentString)}&us_privacy=${encodeURIComponent(uspConsent)}&gpp=${encodeURIComponent(gppString)}&gpp_sid=${encodeURIComponent(applicableSections.join(','))}` + }; + if (typeof gdprApplies === 'boolean') { + sync.url += `&gdpr=${Number(gdprApplies)}`; + } + return sync; +} + +// BUILD REQUESTS: DEVICE +function _buildDeviceORTB() { + let device = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)(); + const deviceProps = { + ext: { + ttx: { + ...getScreenDimensions(), + pxr: win.devicePixelRatio, + vp: getViewportDimensions(), + ah: win.screen.availHeight, + mtp: win.navigator.maxTouchPoints + } + } + }; + if (device.sua) { + deviceProps.sua = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(device.sua, ['browsers', 'platform', 'model', 'mobile']); + } + return deviceProps; +} +function getTopMostAccessibleWindow() { + let mostAccessibleWindow = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)(); + try { + while (mostAccessibleWindow.parent !== mostAccessibleWindow && mostAccessibleWindow.parent.document) { + mostAccessibleWindow = mostAccessibleWindow.parent; + } + } catch (err) { + // Do not throw an exception if we can't access the topmost frame. + } + return mostAccessibleWindow; +} +function getViewportDimensions() { + const topWin = getTopMostAccessibleWindow(); + const documentElement = topWin.document.documentElement; + return { + w: documentElement.clientWidth, + h: documentElement.clientHeight + }; +} +function getScreenDimensions() { + const { + innerWidth: windowWidth, + innerHeight: windowHeight, + screen + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)(); + const [biggerDimension, smallerDimension] = [Math.max(screen.width, screen.height), Math.min(screen.width, screen.height)]; + if (windowHeight > windowWidth) { + // Portrait mode + return { + w: smallerDimension, + h: biggerDimension + }; + } + + // Landscape mode + return { + w: biggerDimension, + h: smallerDimension + }; +} +const spec = { + NON_MEASURABLE, + code: BIDDER_CODE, + aliases: BIDDER_ALIASES, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + gvlid: GVLID, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('33acrossBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","boundingClientRect","percentInView","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/33acrossBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["33acrossIdSystem"],{ + +/***/ "./modules/33acrossIdSystem.js": +/*!*************************************!*\ + !*** ./modules/33acrossIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, domainUtils, thirtyThreeAcrossIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_domainOverrideToRootDomain_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/domainOverrideToRootDomain/index.js */ "./libraries/domainOverrideToRootDomain/index.js"); + +/** + * This module adds 33acrossId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/33acrossIdSystem + * @requires module:modules/userId + */ + + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = '33acrossId'; +const API_URL = 'https://lexicon.33across.com/v1/envelope'; +const AJAX_TIMEOUT = 10000; +const CALLER_NAME = 'pbjs'; +const GVLID = 58; +const STORAGE_FPID_KEY = '33acrossIdFp'; +const STORAGE_TPID_KEY = '33acrossIdTp'; +const STORAGE_HEM_KEY = '33acrossIdHm'; +const DEFAULT_1PID_SUPPORT = true; +const DEFAULT_TPID_SUPPORT = true; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const domainUtils = { + domainOverride: (0,_libraries_domainOverrideToRootDomain_index_js__WEBPACK_IMPORTED_MODULE_2__.domainOverrideToRootDomain)(storage, MODULE_NAME) +}; +function calculateResponseObj(response) { + if (!response.succeeded) { + if (response.error == 'Cookied User') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`${MODULE_NAME}: Unsuccessful response`.concat(' ', response.error)); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: Unsuccessful response`.concat(' ', response.error)); + } + return {}; + } + if (!response.data.envelope) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`${MODULE_NAME}: No envelope was received`); + return {}; + } + return { + envelope: response.data.envelope, + fp: response.data.fp, + tp: response.data.tp + }; +} +function calculateQueryStringParams(_ref, gdprConsentData, enabledStorageTypes) { + let { + pid, + pubProvidedHem + } = _ref; + const uspString = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.uspDataHandler.getConsentData(); + const coppaValue = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.coppaDataHandler.getCoppa(); + const gppConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.gppDataHandler.getConsentData(); + const params = { + pid, + gdpr: 0, + src: CALLER_NAME, + ver: "9.45.0-pre", + coppa: Number(coppaValue) + }; + if (uspString) { + params.us_privacy = uspString; + } + if (gppConsent) { + const { + gppString = '', + applicableSections = [] + } = gppConsent; + params.gpp = gppString; + params.gpp_sid = encodeURIComponent(applicableSections.join(',')); + } + if (gdprConsentData?.consentString) { + params.gdpr_consent = gdprConsentData.consentString; + } + const fp = getStoredValue(STORAGE_FPID_KEY, enabledStorageTypes); + if (fp) { + params.fp = encodeURIComponent(fp); + } + const tp = getStoredValue(STORAGE_TPID_KEY, enabledStorageTypes); + if (tp) { + params.tp = encodeURIComponent(tp); + } + const hem = pubProvidedHem || getStoredValue(STORAGE_HEM_KEY, enabledStorageTypes); + if (hem) { + params.sha256 = encodeURIComponent(hem); + } + return params; +} +function deleteFromStorage(key) { + if (storage.cookiesAreEnabled()) { + const expiredDate = new Date(0).toUTCString(); + storage.setCookie(key, '', expiredDate, 'Lax', domainUtils.domainOverride()); + } + storage.removeDataFromLocalStorage(key); +} +function storeValue(key, value, _ref2) { + let { + enabledStorageTypes, + expires + } = _ref2; + enabledStorageTypes.forEach(storageType => { + if (storageType === _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_COOKIES) { + const expirationInMs = 60 * 60 * 24 * 1000 * expires; + const expirationTime = new Date(Date.now() + expirationInMs); + storage.setCookie(key, value, expirationTime.toUTCString(), 'Lax', domainUtils.domainOverride()); + } else if (storageType === _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_LOCALSTORAGE) { + storage.setDataInLocalStorage(key, value); + } + }); +} +function getStoredValue(key, enabledStorageTypes) { + let storedValue; + enabledStorageTypes.find(storageType => { + if (storageType === _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_COOKIES) { + storedValue = storage.getCookie(key); + } else if (storageType === _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_LOCALSTORAGE) { + storedValue = storage.getDataFromLocalStorage(key); + } + return !!storedValue; + }); + return storedValue; +} +function filterEnabledSupplementalIds(_ref3, _ref4) { + let { + tp, + fp, + hem + } = _ref3; + let { + storeFpid, + storeTpid, + envelopeAvailable + } = _ref4; + const ids = []; + if (storeFpid) { + ids.push( + /** + * [ + * , + * < ID value to store or remove >, + * < clear flag: indicates if existing storage item should be removed or not based on certain condition> + * ] + */ + [STORAGE_FPID_KEY, fp, !fp], [STORAGE_HEM_KEY, hem, !envelopeAvailable] // Clear hashed email if envelope is not available + ); + } + if (storeTpid) { + ids.push([STORAGE_TPID_KEY, tp, !tp]); + } + return ids; +} +function updateSupplementalIdStorage(supplementalId, storageConfig) { + const [key, id, clear] = supplementalId; + if (clear) { + deleteFromStorage(key); + return; + } + if (id) { + storeValue(key, id, storageConfig); + } +} +function handleSupplementalIds(ids, _ref5) { + let { + enabledStorageTypes, + expires, + ...options + } = _ref5; + filterEnabledSupplementalIds(ids, options).forEach(supplementalId => { + updateSupplementalIdStorage(supplementalId, { + enabledStorageTypes, + expires + }); + }); +} + +/** @type {Submodule} */ +const thirtyThreeAcrossIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + gvlid: GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} id + * @returns {{'33acrossId':{ envelope: string}}} + */ + decode(id) { + return { + [MODULE_NAME]: { + envelope: id + } + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(_ref6) { + let { + params = {}, + enabledStorageTypes = [], + storage: storageConfig = {} + } = _ref6; + let { + gdpr: gdprConsentData + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (typeof params.pid !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: Submodule requires a partner ID to be defined`); + return; + } + if (gdprConsentData?.gdprApplies === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`${MODULE_NAME}: Submodule cannot be used where GDPR applies`); + return; + } + const { + storeFpid = DEFAULT_1PID_SUPPORT, + storeTpid = DEFAULT_TPID_SUPPORT, + apiUrl = API_URL, + pid, + hem + } = params; + const pubProvidedHem = hem || window._33across?.hem?.sha256; + return { + callback(cb) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajaxBuilder)(AJAX_TIMEOUT)(apiUrl, { + success(response) { + let responseObj = {}; + try { + responseObj = calculateResponseObj(JSON.parse(response)); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: ID reading error:`, err); + } + if (!responseObj.envelope) { + ['', '_last', '_exp', '_cst'].forEach(suffix => { + deleteFromStorage(`${MODULE_NAME}${suffix}`); + }); + } + handleSupplementalIds({ + fp: responseObj.fp, + tp: responseObj.tp, + hem: pubProvidedHem + }, { + storeFpid, + storeTpid, + envelopeAvailable: !!responseObj.envelope, + enabledStorageTypes, + expires: storageConfig.expires + }); + cb(responseObj.envelope); + }, + error(err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: ID error response`, err); + cb(); + } + }, calculateQueryStringParams({ + pid, + pubProvidedHem + }, gdprConsentData, enabledStorageTypes), { + method: 'GET', + withCredentials: true + }); + } + }; + }, + domainOverride: domainUtils.domainOverride, + eids: { + '33acrossId': { + source: '33across.com', + atype: 1, + getValue: function (data) { + return data.envelope; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('userId', thirtyThreeAcrossIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('33acrossIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["domainOverrideToRootDomain","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/33acrossIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["51DegreesRtdProvider"],{ + +/***/ "./modules/51DegreesRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/51DegreesRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports LOG_PREFIX, extractConfig, get51DegreesJSURL, getHighEntropyValues, is51DegreesMetaPresent, deepSetNotEmptyValue, convert51DegreesDataToOrtb2, convert51DegreesDeviceToOrtb2, getBidRequestData, fiftyOneDegreesSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + +const MODULE_NAME = '51Degrees'; +const LOG_PREFIX = `[${MODULE_NAME} RTD Submodule]:`; +const { + logMessage, + logWarn, + logError +} = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)(LOG_PREFIX); + +// ORTB device types +const ORTB_DEVICE_TYPE = { + UNKNOWN: 0, + MOBILE_TABLET: 1, + PERSONAL_COMPUTER: 2, + CONNECTED_TV: 3, + PHONE: 4, + TABLET: 5, + CONNECTED_DEVICE: 6, + SET_TOP_BOX: 7, + OOH_DEVICE: 8 +}; + +// Map of 51Degrees device types to ORTB device types. See +// https://51degrees.com/developers/property-dictionary?item=Device%7CDevice +// for available properties and values. +const ORTB_DEVICE_TYPE_MAP = new Map([['Phone', ORTB_DEVICE_TYPE.PHONE], ['Console', ORTB_DEVICE_TYPE.SET_TOP_BOX], ['Desktop', ORTB_DEVICE_TYPE.PERSONAL_COMPUTER], ['EReader', ORTB_DEVICE_TYPE.PERSONAL_COMPUTER], ['IoT', ORTB_DEVICE_TYPE.CONNECTED_DEVICE], ['Kiosk', ORTB_DEVICE_TYPE.OOH_DEVICE], ['MediaHub', ORTB_DEVICE_TYPE.SET_TOP_BOX], ['Mobile', ORTB_DEVICE_TYPE.MOBILE_TABLET], ['Router', ORTB_DEVICE_TYPE.CONNECTED_DEVICE], ['SmallScreen', ORTB_DEVICE_TYPE.CONNECTED_DEVICE], ['SmartPhone', ORTB_DEVICE_TYPE.MOBILE_TABLET], ['SmartSpeaker', ORTB_DEVICE_TYPE.CONNECTED_DEVICE], ['SmartWatch', ORTB_DEVICE_TYPE.CONNECTED_DEVICE], ['Tablet', ORTB_DEVICE_TYPE.TABLET], ['Tv', ORTB_DEVICE_TYPE.CONNECTED_TV], ['Vehicle Display', ORTB_DEVICE_TYPE.PERSONAL_COMPUTER]]); + +/** + * Extracts the parameters for 51Degrees RTD module from the config object passed at instantiation + * @param {Object} moduleConfig Configuration object of the 51Degrees RTD module + * @param {Object} reqBidsConfigObj Configuration object for the bidders, currently not used + */ +const extractConfig = (moduleConfig, reqBidsConfigObj) => { + // Resource key + let resourceKey = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(moduleConfig, 'params.resourceKey'); + // On-premise JS URL + let onPremiseJSUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(moduleConfig, 'params.onPremiseJSUrl'); + + // Trim the values + if (typeof resourceKey === 'string') { + resourceKey = resourceKey.trim(); + } + if (typeof onPremiseJSUrl === 'string') { + onPremiseJSUrl = onPremiseJSUrl.trim(); + } + + // If this module is configured via a 3rd party wrapper, both form inputs + // might be mandatory. To handle this, 0 can be used as a value to skip + // the parameter. + if (typeof resourceKey === 'string' && resourceKey.trim() === '0') { + resourceKey = undefined; + } + if (typeof onPremiseJSUrl === 'string' && onPremiseJSUrl.trim() === '0') { + onPremiseJSUrl = undefined; + } + + // Verify that onPremiseJSUrl is a valid URL: either a full URL, relative + // path (/path/to/file.js), or a protocol-relative URL (//example.com/path/to/file.js) + if (typeof onPremiseJSUrl === 'string' && onPremiseJSUrl.length && !(onPremiseJSUrl.startsWith('https://') || onPremiseJSUrl.startsWith('http://') || onPremiseJSUrl.startsWith('/'))) { + throw new Error(LOG_PREFIX + ' Invalid URL format for onPremiseJSUrl in moduleConfig'); + } + + // Verify that one of the parameters is provided, + // but not both at the same time + if (!resourceKey && !onPremiseJSUrl) { + throw new Error(LOG_PREFIX + ' Missing parameter resourceKey or onPremiseJSUrl in moduleConfig'); + } else if (resourceKey && onPremiseJSUrl) { + throw new Error(LOG_PREFIX + ' Only one of resourceKey or onPremiseJSUrl should be provided in moduleConfig'); + } + + // Verify that the resource key is not the one provided as an example + if (resourceKey === '') { + throw new Error(LOG_PREFIX + ' replace in configuration with a resource key obtained from https://configure.51degrees.com/HNZ75HT1'); + } + return { + resourceKey, + onPremiseJSUrl + }; +}; + +/** + * Gets 51Degrees JS URL + * @param {Object} pathData API path data + * @param {string} [pathData.resourceKey] Resource key + * @param {string} [pathData.onPremiseJSUrl] On-premise JS URL + * @param {Object} [pathData.hev] High entropy values + * @param {Window} [win] Window object (mainly for testing) + * @returns {string} 51Degrees JS URL + */ +const get51DegreesJSURL = (pathData, win) => { + const _window = win || window; + const baseURL = pathData.onPremiseJSUrl || `https://cloud.51degrees.com/api/v4/${pathData.resourceKey}.js`; + const queryPrefix = baseURL.includes('?') ? '&' : '?'; + const qs = {}; + deepSetNotEmptyValue(qs, '51D_GetHighEntropyValues', pathData.hev && Object.keys(pathData.hev).length ? btoa(JSON.stringify(pathData.hev)) : null); + deepSetNotEmptyValue(qs, '51D_ScreenPixelsHeight', _window?.screen?.height); + deepSetNotEmptyValue(qs, '51D_ScreenPixelsWidth', _window?.screen?.width); + deepSetNotEmptyValue(qs, '51D_PixelRatio', _window?.devicePixelRatio); + const _qs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)(qs); + const _qsString = _qs ? `${queryPrefix}${_qs}` : ''; + return `${baseURL}${_qsString}`; +}; + +/** + * Retrieves high entropy values from `navigator.userAgentData` if available + * + * @param {Array} hints - An array of hints indicating which high entropy values to retrieve + * @returns {Promise>} A promise that resolves to an object containing high entropy values if supported, or `undefined` if not + */ +const getHighEntropyValues = async hints => { + return navigator?.userAgentData?.getHighEntropyValues?.(hints); +}; + +/** + * Check if meta[http-equiv="Delegate-CH"] tag is present in the document head and points to 51Degrees cloud + * + * The way to delegate processing User-Agent Client Hints to a 3rd party is either + * via setting Permissions-Policy + Accept-CH response headers or Delegate-CH meta-http equiv. + * Of those two, Delegate-CH meta http-equiv is an easier and more performant option + * (client hints are sent on the very first request without a round trip required). + * Using the getHighEntropyValues() API is an alternative; + * however, Google is likely to restrict it as part of the Privacy Sandbox in future + * versions of Chrome, so we want to be future-proof and transparent here. + * Hence, a check that would output the warning if the user does not have proper delegation of UA-CH. + * + * @returns {boolean} True if 51Degrees meta is present + * @returns {boolean} False if 51Degrees meta is not present + */ +const is51DegreesMetaPresent = () => { + const meta51 = document.head.querySelectorAll('meta[http-equiv="Delegate-CH"]'); + if (!meta51.length) { + return false; + } + return Array.from(meta51).some(meta => !meta.content ? false : meta.content.includes('cloud.51degrees')); +}; + +/** + * Sets the value of a key in the ORTB2 object if the value is not empty + * + * @param {Object} obj The object to set the key in + * @param {string} key The key to set + * @param {any} value The value to set + */ +const deepSetNotEmptyValue = (obj, key, value) => { + if (!key) { + throw new Error(LOG_PREFIX + ' Key is required'); + } + if (value) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(obj, key, value); + } +}; + +/** + * Converts all 51Degrees data to ORTB2 format + * + * @param {Object} data51 Response from 51Degrees API + * @param {Object} [data51.device] Device data + * + * @returns {Object} Enriched ORTB2 object + */ +const convert51DegreesDataToOrtb2 = data51 => { + let ortb2Data = {}; + if (!data51) { + return ortb2Data; + } + ortb2Data = convert51DegreesDeviceToOrtb2(data51.device); + + // placeholder for the next 51Degrees RTD submodule update + + return ortb2Data; +}; + +/** + * Converts 51Degrees device data to ORTB2 format + * + * @param {Object} device 51Degrees device object + * @param {string} [device.deviceid] Device ID (unique 51Degrees identifier) + * @param {string} [device.devicetype] Device type + * @param {string} [device.hardwarevendor] Hardware vendor + * @param {string} [device.hardwaremodel] Hardware model + * @param {string[]} [device.hardwarename] Hardware name + * @param {string} [device.platformname] Platform name + * @param {string} [device.platformversion] Platform version + * @param {number} [device.screenpixelsheight] Screen height in pixels + * @param {number} [device.screenpixelswidth] Screen width in pixels + * @param {number} [device.screenpixelsphysicalheight] Screen physical height in pixels + * @param {number} [device.screenpixelsphysicalwidth] Screen physical width in pixels + * @param {number} [device.pixelratio] Pixel ratio + * @param {number} [device.screeninchesheight] Screen height in inches + * + * @returns {Object} Enriched ORTB2 object + */ +const convert51DegreesDeviceToOrtb2 = device => { + const ortb2Device = {}; + if (!device) { + return ortb2Device; + } + const deviceModel = device.hardwaremodel || (device.hardwarename && device.hardwarename.length ? device.hardwarename.join(',') : null); + const devicePhysicalPPI = device.screenpixelsphysicalheight && device.screeninchesheight ? Math.round(device.screenpixelsphysicalheight / device.screeninchesheight) : null; + const devicePPI = device.screenpixelsheight && device.screeninchesheight ? Math.round(device.screenpixelsheight / device.screeninchesheight) : null; + deepSetNotEmptyValue(ortb2Device, 'devicetype', ORTB_DEVICE_TYPE_MAP.get(device.devicetype)); + deepSetNotEmptyValue(ortb2Device, 'make', device.hardwarevendor); + deepSetNotEmptyValue(ortb2Device, 'model', deviceModel); + deepSetNotEmptyValue(ortb2Device, 'os', device.platformname); + deepSetNotEmptyValue(ortb2Device, 'osv', device.platformversion); + deepSetNotEmptyValue(ortb2Device, 'h', device.screenpixelsphysicalheight || device.screenpixelsheight); + deepSetNotEmptyValue(ortb2Device, 'w', device.screenpixelsphysicalwidth || device.screenpixelswidth); + deepSetNotEmptyValue(ortb2Device, 'pxratio', device.pixelratio); + deepSetNotEmptyValue(ortb2Device, 'ppi', devicePhysicalPPI || devicePPI); + deepSetNotEmptyValue(ortb2Device, 'ext.fiftyonedegrees_deviceId', device.deviceid); + return { + device: ortb2Device + }; +}; + +/** + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Function} callback Called on completion + * @param {Object} moduleConfig Configuration for 1plusX RTD module + * @param {Object} userConsent + */ +const getBidRequestData = (reqBidsConfigObj, callback, moduleConfig, userConsent) => { + try { + // Get the required config + const { + resourceKey, + onPremiseJSUrl + } = extractConfig(moduleConfig, reqBidsConfigObj); + logMessage('Resource key: ', resourceKey); + logMessage('On-premise JS URL: ', onPremiseJSUrl); + + // Check if 51Degrees meta is present (cloud only) + if (resourceKey) { + logMessage('Checking if 51Degrees meta is present in the document head'); + if (!is51DegreesMetaPresent()) { + logWarn('Delegate-CH meta tag is not present in the document head'); + } + } + getHighEntropyValues(['model', 'platform', 'platformVersion', 'fullVersionList']).then(hev => { + // Get 51Degrees JS URL, which is either cloud or on-premise + const scriptURL = get51DegreesJSURL({ + resourceKey, + onPremiseJSUrl, + hev + }); + logMessage('URL of the script to be injected: ', scriptURL); + + // Inject 51Degrees script, get device data and merge it into the ORTB2 object + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(scriptURL, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, MODULE_NAME, () => { + logMessage('Successfully injected 51Degrees script'); + const fod = /** @type {Object} */window.fod; + // Convert and merge device data in the callback + fod.complete(data => { + logMessage('51Degrees raw data: ', data); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global, convert51DegreesDataToOrtb2(data)); + logMessage('reqBidsConfigObj: ', reqBidsConfigObj); + callback(); + }); + }, document, { + crossOrigin: 'anonymous' + }); + }); + } catch (error) { + // In case of an error, log it and continue + logError(error); + callback(); + } +}; + +/** + * Init + * @param {Object} config Module configuration + * @param {boolean} userConsent User consent + * @returns true + */ +const init = (config, userConsent) => { + return true; +}; + +// 51Degrees RTD submodule object to be registered +const fiftyOneDegreesSubmodule = { + name: MODULE_NAME, + init, + getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', fiftyOneDegreesSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('51DegreesRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/51DegreesRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["AsteriobidPbmAnalyticsAdapter"],{ + +/***/ "./modules/AsteriobidPbmAnalyticsAdapter.js": +/*!**************************************************!*\ + !*** ./modules/AsteriobidPbmAnalyticsAdapter.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export storage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + + +/** + * prebidmanagerAnalyticsAdapter.js - analytics adapter for prebidmanager + */ +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: 'asteriobidpbm' +}); +const DEFAULT_EVENT_URL = 'https://endpt.prebidmanager.com/endpoint'; +const analyticsType = 'endpoint'; +const analyticsName = 'Asteriobid PBM Analytics'; +let ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajaxBuilder)(0); +var _VERSION = 1; +var initOptions = null; +var _pageViewId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(); +var _startAuction = 0; +var _bidRequestTimeout = 0; +let flushInterval; +var pmAnalyticsEnabled = false; +const utmTags = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; +const { + width: x, + height: y +} = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_4__.getViewportSize)(); +var _pageView = { + eventType: 'pageView', + userAgent: window.navigator.userAgent, + timestamp: Date.now(), + timezoneOffset: new Date().getTimezoneOffset(), + language: window.navigator.language, + vendor: window.navigator.vendor, + screenWidth: x, + screenHeight: y +}; +var _eventQueue = [_pageView]; +let prebidmanagerAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + url: DEFAULT_EVENT_URL, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + handleEvent(eventType, args); + } +}); +prebidmanagerAnalytics.originEnableAnalytics = prebidmanagerAnalytics.enableAnalytics; +prebidmanagerAnalytics.enableAnalytics = function (config) { + initOptions = config.options || {}; + initOptions.url = initOptions.url || DEFAULT_EVENT_URL; + initOptions.sampling = initOptions.sampling || 1; + if (Math.floor(Math.random() * initOptions.sampling) === 0) { + pmAnalyticsEnabled = true; + flushInterval = setInterval(flush, 1000); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${analyticsName} isn't enabled because of sampling`); + } + prebidmanagerAnalytics.originEnableAnalytics(config); +}; +prebidmanagerAnalytics.originDisableAnalytics = prebidmanagerAnalytics.disableAnalytics; +prebidmanagerAnalytics.disableAnalytics = function () { + if (!pmAnalyticsEnabled) { + return; + } + flush(); + clearInterval(flushInterval); + prebidmanagerAnalytics.originDisableAnalytics(); +}; +function collectUtmTagData() { + let newUtm = false; + let pmUtmTags = {}; + try { + utmTags.forEach(function (utmKey) { + let utmValue = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getParameterByName)(utmKey); + if (utmValue !== '') { + newUtm = true; + } + pmUtmTags[utmKey] = utmValue; + }); + if (newUtm === false) { + utmTags.forEach(function (utmKey) { + let itemValue = storage.getDataFromLocalStorage(`pm_${utmKey}`); + if (itemValue && itemValue.length !== 0) { + pmUtmTags[utmKey] = itemValue; + } + }); + } else { + utmTags.forEach(function (utmKey) { + storage.setDataInLocalStorage(`pm_${utmKey}`, pmUtmTags[utmKey]); + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${analyticsName} Error`, e); + pmUtmTags['error_utm'] = 1; + } + return pmUtmTags; +} +function collectPageInfo() { + const pageInfo = { + domain: window.location.hostname + }; + if (document.referrer) { + pageInfo.referrerDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseUrl)(document.referrer).hostname; + } + return pageInfo; +} +function flush() { + if (!pmAnalyticsEnabled) { + return; + } + if (_eventQueue.length > 1) { + var data = { + pageViewId: _pageViewId, + ver: _VERSION, + bundleId: initOptions.bundleId, + events: _eventQueue, + utmTags: collectUtmTagData(), + pageInfo: collectPageInfo() + }; + if ('version' in initOptions) { + data.version = initOptions.version; + } + if ('tcf_compliant' in initOptions) { + data.tcf_compliant = initOptions.tcf_compliant; + } + if ('sampling' in initOptions) { + data.sampling = initOptions.sampling; + } + ajax(initOptions.url, () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${analyticsName} sent events batch`), _VERSION + ':' + JSON.stringify(data), { + contentType: 'text/plain', + method: 'POST', + withCredentials: true + }); + _eventQueue = [_pageView]; + } +} +function trimAdUnit(adUnit) { + if (!adUnit) return adUnit; + const res = {}; + res.code = adUnit.code; + res.sizes = adUnit.sizes; + return res; +} +function trimBid(bid) { + if (!bid) return bid; + const res = {}; + res.auctionId = bid.auctionId; + res.bidder = bid.bidder; + res.bidderRequestId = bid.bidderRequestId; + res.bidId = bid.bidId; + res.crumbs = bid.crumbs; + res.cpm = bid.cpm; + res.currency = bid.currency; + res.mediaTypes = bid.mediaTypes; + res.sizes = bid.sizes; + res.transactionId = bid.transactionId; + res.adUnitCode = bid.adUnitCode; + res.bidRequestsCount = bid.bidRequestsCount; + res.serverResponseTimeMs = bid.serverResponseTimeMs; + return res; +} +function trimBidderRequest(bidderRequest) { + if (!bidderRequest) return bidderRequest; + const res = {}; + res.auctionId = bidderRequest.auctionId; + res.auctionStart = bidderRequest.auctionStart; + res.bidderRequestId = bidderRequest.bidderRequestId; + res.bidderCode = bidderRequest.bidderCode; + res.bids = bidderRequest.bids && bidderRequest.bids.map(trimBid); + return res; +} +function handleEvent(eventType, eventArgs) { + if (eventArgs) { + eventArgs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.hasNonSerializableProperty)(eventArgs) ? eventArgs : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(eventArgs); + } else { + eventArgs = {}; + } + const pmEvent = {}; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_INIT: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.timeout = eventArgs.timeout; + pmEvent.eventType = eventArgs.eventType; + pmEvent.adUnits = eventArgs.adUnits && eventArgs.adUnits.map(trimAdUnit); + pmEvent.bidderRequests = eventArgs.bidderRequests && eventArgs.bidderRequests.map(trimBidderRequest); + _startAuction = pmEvent.timestamp; + _bidRequestTimeout = pmEvent.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.end = eventArgs.end; + pmEvent.start = eventArgs.start; + pmEvent.adUnitCodes = eventArgs.adUnitCodes; + pmEvent.bidsReceived = eventArgs.bidsReceived && eventArgs.bidsReceived.map(trimBid); + pmEvent.start = _startAuction; + pmEvent.end = Date.now(); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_ADJUSTMENT: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_TIMEOUT: + { + pmEvent.bidders = eventArgs && eventArgs.map ? eventArgs.map(trimBid) : eventArgs; + pmEvent.duration = _bidRequestTimeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_REQUESTED: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.doneCbCallCount = eventArgs.doneCbCallCount; + pmEvent.start = eventArgs.start; + pmEvent.bidderRequestId = eventArgs.bidderRequestId; + pmEvent.bids = eventArgs.bids && eventArgs.bids.map(trimBid); + pmEvent.auctionStart = eventArgs.auctionStart; + pmEvent.timeout = eventArgs.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_RESPONSE: + { + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.width = eventArgs.width; + pmEvent.height = eventArgs.height; + pmEvent.adId = eventArgs.adId; + pmEvent.mediaType = eventArgs.mediaType; + pmEvent.cpm = eventArgs.cpm; + pmEvent.currency = eventArgs.currency; + pmEvent.requestId = eventArgs.requestId; + pmEvent.adUnitCode = eventArgs.adUnitCode; + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.timeToRespond = eventArgs.timeToRespond; + pmEvent.responseTimestamp = eventArgs.responseTimestamp; + pmEvent.requestTimestamp = eventArgs.requestTimestamp; + pmEvent.netRevenue = eventArgs.netRevenue; + pmEvent.size = eventArgs.size; + pmEvent.adserverTargeting = eventArgs.adserverTargeting; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_WON: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.adId = eventArgs.adId; + pmEvent.adserverTargeting = eventArgs.adserverTargeting; + pmEvent.adUnitCode = eventArgs.adUnitCode; + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.height = eventArgs.height; + pmEvent.mediaType = eventArgs.mediaType; + pmEvent.netRevenue = eventArgs.netRevenue; + pmEvent.cpm = eventArgs.cpm; + pmEvent.requestTimestamp = eventArgs.requestTimestamp; + pmEvent.responseTimestamp = eventArgs.responseTimestamp; + pmEvent.size = eventArgs.size; + pmEvent.width = eventArgs.width; + pmEvent.currency = eventArgs.currency; + pmEvent.bidder = eventArgs.bidder; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BIDDER_DONE: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.auctionStart = eventArgs.auctionStart; + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.bidderRequestId = eventArgs.bidderRequestId; + pmEvent.bids = eventArgs.bids && eventArgs.bids.map(trimBid); + pmEvent.doneCbCallCount = eventArgs.doneCbCallCount; + pmEvent.start = eventArgs.start; + pmEvent.timeout = eventArgs.timeout; + pmEvent.tid = eventArgs.tid; + pmEvent.src = eventArgs.src; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.SET_TARGETING: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.REQUEST_BIDS: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.ADD_AD_UNITS: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AD_RENDER_FAILED: + { + pmEvent.bid = eventArgs.bid; + pmEvent.message = eventArgs.message; + pmEvent.reason = eventArgs.reason; + break; + } + default: + return; + } + pmEvent.eventType = eventType; + pmEvent.timestamp = pmEvent.timestamp || Date.now(); + sendEvent(pmEvent); +} +function sendEvent(event) { + _eventQueue.push(event); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${analyticsName} Event ${event.eventType}:`, event); + if (event.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END) { + flush(); + } +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: prebidmanagerAnalytics, + code: 'prebidmanager' +}); +prebidmanagerAnalytics.getOptions = function () { + return initOptions; +}; +prebidmanagerAnalytics.flush = flush; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (prebidmanagerAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('AsteriobidPbmAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/AsteriobidPbmAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["BTBidAdapter"],{ + +/***/ "./modules/BTBidAdapter.js": +/*!*********************************!*\ + !*** ./modules/BTBidAdapter.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + +const BIDDER_CODE = 'blockthrough'; +const GVLID = 815; +const ENDPOINT_URL = 'https://pbs.btloader.com/openrtb2/auction'; +const SYNC_URL = 'https://cdn.btloader.com/user_sync.html'; +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 60 + }, + imp, + request, + bidResponse +}); + +/** + * Builds an impression object for the ORTB 2.5 request. + * + * @param {function} buildImp - The function for building an imp object. + * @param {Object} bidRequest - The bid request object. + * @param {Object} context - The context object. + * @returns {Object} The ORTB 2.5 imp object. + */ +function imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const { + params, + ortb2Imp + } = bidRequest; + if (params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext', params); + } + if (ortb2Imp?.ext?.gpid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.gpid', ortb2Imp.ext.gpid); + } + return imp; +} + +/** + * Builds a request object for the ORTB 2.5 request. + * + * @param {function} buildRequest - The function for building a request object. + * @param {Array} imps - An array of ORTB 2.5 impression objects. + * @param {Object} bidderRequest - The bidder request object. + * @param {Object} context - The context object. + * @returns {Object} The ORTB 2.5 request object. + */ +function request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.prebid.channel', { + name: 'pbjs', + version: "9.45.0-pre" + }); + if (window.location.href.includes('btServerTest=true')) { + request.test = 1; + } + return request; +} + +/** + * Processes a bid response using the provided build function, bid, and context. + * + * @param {Function} buildBidResponse - The function to build the bid response. + * @param {Object} bid - The bid object to include in the bid response. + * @param {Object} context - The context object containing additional information. + * @returns {Object} - The processed bid response. + */ +function bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + const { + seat + } = context.seatbid || {}; + bidResponse.btBidderCode = seat; + return bidResponse; +} + +/** + * Checks if a bid request is valid. + * + * @param {Object} bid - The bid request object. + * @returns {boolean} True if the bid request is valid, false otherwise. + */ +function isBidRequestValid(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(bid.params) || !Object.keys(bid.params).length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('BT Bid Adapter: bid params must be provided.'); + return false; + } + return true; +} + +/** + * Builds the bid requests for the BT Service. + * + * @param {Array} validBidRequests - An array of valid bid request objects. + * @param {Object} bidderRequest - The bidder request object. + * @returns {Array} An array of BT Service bid requests. + */ +function buildRequests(validBidRequests, bidderRequest) { + const data = CONVERTER.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + return [{ + method: 'POST', + url: ENDPOINT_URL, + data, + bids: validBidRequests + }]; +} + +/** + * Interprets the server response and maps it to bids. + * + * @param {Object} serverResponse - The server response object. + * @param {Object} request - The request object. + * @returns {Array} An array of bid objects. + */ +function interpretResponse(serverResponse, request) { + if (!serverResponse || !request) { + return []; + } + return CONVERTER.fromORTB({ + response: serverResponse.body, + request: request.data + }).bids; +} + +/** + * Generates user synchronization data based on provided options and consents. + * + * @param {Object} syncOptions - Synchronization options. + * @param {Object[]} serverResponses - An array of server responses. + * @param {Object} gdprConsent - GDPR consent information. + * @param {string} uspConsent - US Privacy consent string. + * @param {Object} gppConsent - Google Publisher Policies (GPP) consent information. + * @returns {Object[]} An array of user synchronization objects. + */ +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + if (!syncOptions.iframeEnabled || !serverResponses?.length) { + return []; + } + const bidderCodes = new Set(); + serverResponses.forEach(serverResponse => { + if (serverResponse?.body?.ext?.responsetimemillis) { + Object.keys(serverResponse.body.ext.responsetimemillis).forEach(bidderCodes.add, bidderCodes); + } + }); + if (!bidderCodes.size) { + return []; + } + const syncs = []; + const syncUrl = new URL(SYNC_URL); + syncUrl.searchParams.set('bidders', [...bidderCodes].join(',')); + if (gdprConsent) { + syncUrl.searchParams.set('gdpr', Number(gdprConsent.gdprApplies)); + syncUrl.searchParams.set('gdpr_consent', gdprConsent.consentString); + } + if (gppConsent) { + syncUrl.searchParams.set('gpp', gppConsent.gppString); + syncUrl.searchParams.set('gpp_sid', gppConsent.applicableSections); + } + if (uspConsent) { + syncUrl.searchParams.set('us_privacy', uspConsent); + } + syncs.push({ + type: 'iframe', + url: syncUrl.href + }); + return syncs; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('BTBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/BTBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["a1MediaBidAdapter"],{ + +/***/ "./modules/a1MediaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/a1MediaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +const BIDDER_CODE = 'a1media'; +const END_POINT = 'https://d11.contentsfeed.com/dsp/breq/a1'; +const DEFAULT_CURRENCY = 'JPY'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + if (!imp.bidfloor) { + imp.bidfloor = bidRequest.params.bidfloor || 0; + imp.bidfloorcur = bidRequest.params.currency || DEFAULT_CURRENCY; + } + if (bidRequest.params.battr) { + Object.keys(bidRequest.mediaTypes).forEach(mType => { + imp[mType].battr = bidRequest.params.battr; + }); + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + const bid = context.bidRequests[0]; + if (!request.cur) { + request.cur = [bid.params.currency || DEFAULT_CURRENCY]; + } + if (bid.params.bcat) { + request.bcat = bid.params.bcat; + } + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const { + bidRequest + } = context; + let resMediaType; + const reqMediaTypes = Object.keys(bidRequest.mediaTypes); + if (reqMediaTypes.length === 1) { + resMediaType = reqMediaTypes[0]; + } else { + if (bid.adm.search(/^(<\?xml| { + const parsedBid = seatbidItem.bid.map(bidItem => ({ + ...bidItem, + adm: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bidItem.adm, bidItem.price), + nurl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bidItem.nurl, bidItem.price) + })); + return { + ...seatbidItem, + bid: parsedBid + }; + }); + const responseBody = { + ...serverResponse.body, + seatbid: parsedSeatbid + }; + const bids = converter.fromORTB({ + response: responseBody, + request: bidRequest.data + }).bids; + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('a1MediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/a1MediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["a1MediaRtdProvider"],{ + +/***/ "./modules/a1MediaRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/a1MediaRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports A1_SEG_KEY, A1_AUD_KEY, storage, subModuleObj, getStorageData */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const REAL_TIME_MODULE = 'realTimeData'; +const MODULE_NAME = 'a1Media'; +const SCRIPT_URL = 'https://linkback.contentsfeed.com/src'; +const A1_SEG_KEY = '__a1tg'; +const A1_AUD_KEY = 'a1_gid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME +}); + +/** @type {RtdSubmodule} */ +const subModuleObj = { + name: MODULE_NAME, + init: init, + getBidRequestData: alterBidRequests +}; +function getStorageData(key) { + let storageValue = ''; + if (storage.getDataFromLocalStorage(key)) { + storageValue = storage.getDataFromLocalStorage(key); + } else if (storage.getCookie(key)) { + storageValue = storage.getCookie(key); + } + return storageValue; +} +function loadLbScript(tagname) { + const linkback = window.linkback = window.linkback || {}; + if (!linkback.l) { + linkback.l = true; + const scriptUrl = `${SCRIPT_URL}/${tagname}`; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(scriptUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, MODULE_NAME); + } +} +function init(config, userConsent) { + const tagId = config.params.tagId; + if (tagId && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr)(tagId)) { + loadLbScript(config.params.tagId); + return true; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr)(getStorageData(A1_SEG_KEY))) { + return true; + } + return false; +} +function alterBidRequests(reqBidsConfigObj, callback, config, userConsent) { + const a1seg = getStorageData(A1_SEG_KEY); + const a1gid = getStorageData(A1_AUD_KEY); + const a1UserSegData = { + name: 'a1mediagroup.com', + ext: { + segtax: 900 + }, + segment: a1seg.split(',').map(x => ({ + id: x + })) + }; + const a1UserEid = { + source: 'a1mediagroup.com', + uids: [{ + id: a1gid, + atype: 1 + }] + }; + const a1Ortb2 = { + user: { + data: [a1UserSegData], + ext: { + eids: [a1UserEid] + } + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global, a1Ortb2); + callback(); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)(REAL_TIME_MODULE, subModuleObj); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('a1MediaRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/a1MediaRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["a4gBidAdapter"],{ + +/***/ "./modules/a4gBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/a4gBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + +const A4G_BIDDER_CODE = 'a4g'; +const A4G_CURRENCY = 'USD'; +const A4G_DEFAULT_BID_URL = 'https://ads.ad4game.com/v1/bid'; +const A4G_TTL = 120; +const LOCATION_PARAM_NAME = 'siteurl'; +const ID_PARAM_NAME = 'id'; +const IFRAME_PARAM_NAME = 'if'; +const ZONE_ID_PARAM_NAME = 'zoneId'; +const SIZE_PARAM_NAME = 'size'; +const ARRAY_PARAM_SEPARATOR = ';'; +const ARRAY_SIZE_SEPARATOR = ','; +const SIZE_SEPARATOR = 'x'; +const spec = { + code: A4G_BIDDER_CODE, + isBidRequestValid: function (bid) { + return bid.params && !!bid.params.zoneId; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let deliveryUrl = ''; + const idParams = []; + const sizeParams = []; + const zoneIds = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(validBidRequests, function (bid) { + if (!deliveryUrl && typeof bid.params.deliveryUrl === 'string') { + deliveryUrl = bid.params.deliveryUrl; + } + idParams.push(bid.bidId); + let bidSizes = bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes || bid.sizes; + sizeParams.push(bidSizes.map(size => size.join(SIZE_SEPARATOR)).join(ARRAY_SIZE_SEPARATOR)); + zoneIds.push(bid.params.zoneId); + }); + if (!deliveryUrl) { + deliveryUrl = A4G_DEFAULT_BID_URL; + } + let data = { + [IFRAME_PARAM_NAME]: 0, + [LOCATION_PARAM_NAME]: bidderRequest.refererInfo?.page, + [SIZE_PARAM_NAME]: sizeParams.join(ARRAY_PARAM_SEPARATOR), + [ID_PARAM_NAME]: idParams.join(ARRAY_PARAM_SEPARATOR), + [ZONE_ID_PARAM_NAME]: zoneIds.join(ARRAY_PARAM_SEPARATOR) + }; + if (bidderRequest && bidderRequest.gdprConsent) { + data.gdpr = { + applies: bidderRequest.gdprConsent.gdprApplies, + consent: bidderRequest.gdprConsent.consentString + }; + } + return { + method: 'GET', + url: deliveryUrl, + data: data + }; + }, + interpretResponse: function (serverResponses, request) { + const bidResponses = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(serverResponses.body, function (response) { + if (response.cpm > 0) { + const bidResponse = { + requestId: response.id, + creativeId: response.crid || response.id, + cpm: response.cpm, + width: response.width, + height: response.height, + currency: A4G_CURRENCY, + netRevenue: true, + ttl: A4G_TTL, + ad: response.ad, + meta: { + advertiserDomains: response.adomain && response.adomain.length > 0 ? response.adomain : [] + } + }; + bidResponses.push(bidResponse); + } + }); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('a4gBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/a4gBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["aaxBlockmeterRtdProvider"],{ + +/***/ "./modules/aaxBlockmeterRtdProvider.js": +/*!*********************************************!*\ + !*** ./modules/aaxBlockmeterRtdProvider.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports _config, aaxBlockmeterRtdModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + +const _config = { + MODULE: 'aaxBlockmeter', + ADSERVER_TARGETING_KEY: 'atk', + BLOCKMETER_URL: 'c.aaxads.com/aax.js', + VERSION: '1.2' +}; +window.aax = window.aax || {}; +function loadBlockmeter(_rtdConfig) { + if (!(_rtdConfig.params && _rtdConfig.params.pub) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(_rtdConfig.params && _rtdConfig.params.pub) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(_rtdConfig.params && _rtdConfig.params.pub)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${_config.MODULE}: params.pub should be a string`); + return false; + } + const params = []; + params.push(`pub=${_rtdConfig.params.pub}`); + params.push(`dn=${window.location.hostname}`); + let url = _rtdConfig.params.url; + if (!url || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(url)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`${_config.MODULE}: params.url is missing, using default url.`); + url = `${_config.BLOCKMETER_URL}?ver=${_config.VERSION}`; + } + const scriptUrl = `https://${url}&${params.join('&')}`; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_1__.loadExternalScript)(scriptUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, _config.MODULE); + return true; +} +function markAdBlockInventory(codes, _rtdConfig, _userConsent) { + return codes.reduce((targets, code) => { + targets[code] = targets[code] || {}; + const getAaxTargets = () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(window.aax.getTargetingData) ? window.aax.getTargetingData(code, _rtdConfig, _userConsent) : {}; + targets[code] = { + [_config.ADSERVER_TARGETING_KEY]: code, + ...getAaxTargets() + }; + return targets; + }, {}); +} +const aaxBlockmeterRtdModule = { + name: _config.MODULE, + init: loadBlockmeter, + getTargetingData: markAdBlockInventory +}; +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('realTimeData', aaxBlockmeterRtdModule); +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('aaxBlockmeterRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/aaxBlockmeterRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ablidaBidAdapter"],{ + +/***/ "./modules/ablidaBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/ablidaBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'ablida'; +const ENDPOINT_URL = 'https://bidder.ablida.net/prebid'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @return Array Info describing the request to the server. + * @param validBidRequests + * @param bidderRequest + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + if (validBidRequests.length === 0) { + return []; + } + return validBidRequests.map(bidRequest => { + let sizes = []; + if (bidRequest.mediaTypes && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes) { + sizes = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + } else if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize) { + sizes = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize; + } + const jaySupported = 'atob' in window && 'currentScript' in document; + const device = getDevice(); + const payload = { + placementId: bidRequest.params.placementId, + sizes: sizes, + bidId: bidRequest.bidId, + categories: bidRequest.params.categories, + // TODO: should referer be 'ref'? + referer: bidderRequest.refererInfo.page, + jaySupported: jaySupported, + device: device, + adapterVersion: 5, + mediaTypes: bidRequest.mediaTypes, + gdprConsent: bidderRequest.gdprConsent + }; + return { + method: 'POST', + url: ENDPOINT_URL, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + response.forEach(function (bid) { + bid.ttl = 60; + bidResponses.push(bid); + }); + return bidResponses; + }, + onBidWon: function (bid) { + if (!bid['nurl']) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(bid['nurl']); + } +}; +function getDevice() { + const ua = navigator.userAgent; + if (/(ipad|xoom|sch-i800|playbook|silk|tablet|kindle)|(android(?!.*mobi))/i.test(ua)) { + return 'tablet'; + } + if (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(ua)) { + return 'connectedtv'; + } + if (/Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Windows\sCE|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/i.test(ua)) { + return 'smartphone'; + } + const { + width + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__.getViewportSize)(); + if (width > 320) { + return 'desktop'; + } + return 'other'; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('ablidaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ablidaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["acuityadsBidAdapter"],{ + +/***/ "./modules/acuityadsBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/acuityadsBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'acuityads'; +const GVLID = 231; +const AD_URL = 'https://prebid.admanmedia.com/pbjs'; +const SYNC_URL = 'https://cs.admanmedia.com'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('acuityadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/acuityadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ad2ictionBidAdapter"],{ + +/***/ "./modules/ad2ictionBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/ad2ictionBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, SUPPORTED_AD_TYPES, API_ENDPOINT, API_VERSION_NUMBER, COOKIE_NAME, storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + +const BIDDER_CODE = 'ad2iction'; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +const API_ENDPOINT = 'https://ads.ad2iction.com/html/prebid/'; +const API_VERSION_NUMBER = 3; +const COOKIE_NAME = 'ad2udid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + aliases: ['ad2'], + supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid: bid => { + return !!bid.params.id && typeof bid.params.id === 'string'; + }, + buildRequests: (validBidRequests, bidderRequest) => { + const ids = validBidRequests.map(bid => { + return { + bannerId: bid.params.id, + bidId: bid.bidId + }; + }); + const options = { + contentType: 'application/json', + withCredentials: false + }; + const udid = storage.cookiesAreEnabled() && storage.getCookie(COOKIE_NAME); + const data = { + ids: JSON.stringify(ids), + ortb2: bidderRequest.ortb2, + refererInfo: bidderRequest.refererInfo, + v: API_VERSION_NUMBER, + udid: udid || '', + _: Math.round(new Date().getTime()) + }; + return { + method: 'POST', + url: API_ENDPOINT, + data, + options + }; + }, + interpretResponse: (serverResponse, bidRequest) => { + if (!Array.isArray(serverResponse.body)) { + return []; + } + const bidResponses = serverResponse.body; + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('ad2ictionBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ad2ictionBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adWMGAnalyticsAdapter"],{ + +/***/ "./modules/adWMGAnalyticsAdapter.js": +/*!******************************************!*\ + !*** ./modules/adWMGAnalyticsAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + +const analyticsType = 'endpoint'; +const url = 'https://analytics.wmgroup.us/analytic/collection'; +const { + AUCTION_INIT, + AUCTION_END, + BID_REQUESTED, + BID_WON, + BID_TIMEOUT, + NO_BID, + BID_RESPONSE +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +let timestampInit = null; +let noBidArray = []; +let noBidObject = {}; +let isBidArray = []; +let isBidObject = {}; +let bidTimeOutArray = []; +let bidTimeOutObject = {}; +let bidWonArray = []; +let bidWonObject = {}; +let initOptions = {}; +function postAjax(url, data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, function () {}, data, { + contentType: 'application/json', + method: 'POST' + }); +} +function handleInitSizes(adUnits) { + return adUnits.map(function (adUnit) { + return adUnit.sizes.toString() || ''; + }); +} +function handleInitTypes(adUnits) { + return adUnits.map(function (adUnit) { + return Object.keys(adUnit.mediaTypes).toString(); + }); +} +function detectDevice() { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) { + return 'tablet'; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) { + return 'mobile'; + } + return 'desktop'; +} +function detectOsAndBrowser() { + var module = { + options: [], + header: [navigator.platform, navigator.userAgent, navigator.appVersion, navigator.vendor, window.opera], + dataos: [{ + name: 'Windows Phone', + value: 'Windows Phone', + version: 'OS' + }, { + name: 'Windows', + value: 'Win', + version: 'NT' + }, { + name: 'iOS', + value: 'iPhone', + version: 'OS' + }, { + name: 'iOS', + value: 'iPad', + version: 'OS' + }, { + name: 'Kindle', + value: 'Silk', + version: 'Silk' + }, { + name: 'Android', + value: 'Android', + version: 'Android' + }, { + name: 'PlayBook', + value: 'PlayBook', + version: 'OS' + }, { + name: 'BlackBerry', + value: 'BlackBerry', + version: '/' + }, { + name: 'Macintosh', + value: 'Mac', + version: 'OS X' + }, { + name: 'Linux', + value: 'Linux', + version: 'rv' + }, { + name: 'Palm', + value: 'Palm', + version: 'PalmOS' + }], + databrowser: [{ + name: 'Yandex Browser', + value: 'YaBrowser', + version: 'YaBrowser' + }, { + name: 'Opera Mini', + value: 'Opera Mini', + version: 'Opera Mini' + }, { + name: 'Amigo', + value: 'Amigo', + version: 'Amigo' + }, { + name: 'Atom', + value: 'Atom', + version: 'Atom' + }, { + name: 'Opera', + value: 'OPR', + version: 'OPR' + }, { + name: 'Edge', + value: 'Edge', + version: 'Edge' + }, { + name: 'Internet Explorer', + value: 'Trident', + version: 'rv' + }, { + name: 'Chrome', + value: 'Chrome', + version: 'Chrome' + }, { + name: 'Firefox', + value: 'Firefox', + version: 'Firefox' + }, { + name: 'Safari', + value: 'Safari', + version: 'Version' + }, { + name: 'Internet Explorer', + value: 'MSIE', + version: 'MSIE' + }, { + name: 'Opera', + value: 'Opera', + version: 'Opera' + }, { + name: 'BlackBerry', + value: 'CLDC', + version: 'CLDC' + }, { + name: 'Mozilla', + value: 'Mozilla', + version: 'Mozilla' + }], + init: function () { + var agent = this.header.join(' '); + var os = this.matchItem(agent, this.dataos); + var browser = this.matchItem(agent, this.databrowser); + return { + os: os, + browser: browser + }; + }, + getVersion: function (name, version) { + if (name === 'Windows') { + switch (parseFloat(version).toFixed(1)) { + case '5.0': + return '2000'; + case '5.1': + return 'XP'; + case '5.2': + return 'Server 2003'; + case '6.0': + return 'Vista'; + case '6.1': + return '7'; + case '6.2': + return '8'; + case '6.3': + return '8.1'; + default: + return parseInt(version) || 'other'; + } + } else return parseInt(version) || 'other'; + }, + matchItem: function (string, data) { + var i = 0; + var j = 0; + var regex, regexv, match, matches, version; + for (i = 0; i < data.length; i += 1) { + regex = new RegExp(data[i].value, 'i'); + match = regex.test(string); + if (match) { + regexv = new RegExp(data[i].version + '[- /:;]([\\d._]+)', 'i'); + matches = string.match(regexv); + version = ''; + if (matches) { + if (matches[1]) { + matches = matches[1]; + } + } + if (matches) { + matches = matches.split(/[._]+/); + for (j = 0; j < matches.length; j += 1) { + if (j === 0) { + version += matches[j] + '.'; + } else { + version += matches[j]; + } + } + } else { + version = 'other'; + } + return { + name: data[i].name, + version: this.getVersion(data[i].name, version) + }; + } + } + return { + name: 'unknown', + version: 'other' + }; + } + }; + var e = module.init(); + var result = {}; + result.os = e.os.name + ' ' + e.os.version; + result.browser = e.browser.name + ' ' + e.browser.version; + return result; +} +function handleAuctionInit(eventType, args) { + initOptions.c_timeout = args.timeout; + initOptions.ad_unit_size = handleInitSizes(args.adUnits); + initOptions.ad_unit_type = handleInitTypes(args.adUnits); + initOptions.device = detectDevice(); + initOptions.os = detectOsAndBrowser().os; + initOptions.browser = detectOsAndBrowser().browser; + timestampInit = args.timestamp; +} +function parseBidType(mediaTypes, mediaType) { + if (!mediaTypes) { + return [mediaType]; + } else { + return Object.keys(mediaTypes) || ['']; + } +} +function parseSizes(sizes, width, height) { + if (sizes !== undefined) { + return sizes.map(s => { + return s.toString(); + }); + } else { + return [`${width},${height}`]; + } +} +function mapObject(_ref) { + let { + bidder, + adUnitCode, + auctionId, + transactionId, + sizes, + size, + mediaTypes, + mediaType, + cpm, + currency, + originalCpm, + originalCurrency, + height, + width + } = _ref; + return { + bidder: bidder, + auction_id: auctionId, + ad_unit_code: adUnitCode, + transaction_id: transactionId || '', + bid_size: size || sizes || width && height !== undefined ? parseSizes(sizes, width, height) : [''], + bid_type: mediaType || mediaTypes ? parseBidType(mediaTypes, mediaType) : [''], + time_ms: Date.now() - timestampInit, + cur: originalCurrency !== undefined ? originalCurrency : currency || '', + price: cpm !== undefined ? cpm.toString().substring(0, 4) : '', + cur_native: originalCurrency || '', + price_native: originalCpm !== undefined ? originalCpm.toString().substring(0, 4) : '' + }; +} +function mapUpLevelObject(object, eventType, array) { + Object.assign(object, { + status: eventType || '', + bids: array || [] + }); +} +function handleEvent(array, object, eventType, args) { + array.push(mapObject(args)); + mapUpLevelObject(object, eventType, array); +} +function handleNoBid(eventType, args) { + handleEvent(noBidArray, noBidObject, eventType, args); +} +function handleBidResponse(eventType, args) { + handleEvent(isBidArray, isBidObject, eventType, args); +} +function handleBidTimeout(eventType, args) { + args.forEach(bid => { + bidTimeOutArray.push(mapObject(bid)); + }); + mapUpLevelObject(bidTimeOutObject, eventType, bidTimeOutArray); +} +function handleBidWon(eventType, args) { + handleEvent(bidWonArray, bidWonObject, eventType, args); + sendRequest(bidWonObject); +} +function handleBidRequested(args) {} +function sendRequest() { + for (var _len = arguments.length, objects = new Array(_len), _key = 0; _key < _len; _key++) { + objects[_key] = arguments[_key]; + } + let obj = { + publisher_id: initOptions.publisher_id.toString() || '', + site: initOptions.site || '', + ad_unit_size: initOptions.ad_unit_size || [''], + ad_unit_type: initOptions.ad_unit_type || [''], + device: initOptions.device || '', + os: initOptions.os || '', + browser: initOptions.browser || '', + c_timeout: initOptions.c_timeout || 0, + events: Object.keys(objects).length ? objects : [] + }; + postAjax(url, JSON.stringify(obj)); +} +function handleAuctionEnd() { + sendRequest(noBidObject, isBidObject, bidTimeOutObject); +} +let adWMGAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + url, + analyticsType +}), { + track(_ref2) { + let { + eventType, + args + } = _ref2; + switch (eventType) { + case AUCTION_INIT: + handleAuctionInit(eventType, args); + break; + case BID_REQUESTED: + handleBidRequested(args); + break; + case BID_RESPONSE: + handleBidResponse(eventType, args); + break; + case NO_BID: + handleNoBid(eventType, args); + break; + case BID_TIMEOUT: + handleBidTimeout(eventType, args); + break; + case BID_WON: + handleBidWon(eventType, args); + break; + case AUCTION_END: + handleAuctionEnd(); + } + } +}); +adWMGAnalyticsAdapter.originEnableAnalytics = adWMGAnalyticsAdapter.enableAnalytics; +adWMGAnalyticsAdapter.enableAnalytics = function (config) { + initOptions = config.options; + adWMGAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].registerAnalyticsAdapter({ + adapter: adWMGAnalyticsAdapter, + code: 'adWMG' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (adWMGAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('adWMGAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adWMGAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adWMGBidAdapter"],{ + +/***/ "./modules/adWMGBidAdapter.js": +/*!************************************!*\ + !*** ./modules/adWMGBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + + +const BIDDER_CODE = 'adWMG'; +const ENDPOINT = 'https://hb.adwmg.com/hb'; +let SYNC_ENDPOINT = 'https://hb.adwmg.com/cphb.html?'; +const spec = { + code: BIDDER_CODE, + aliases: ['wmg'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: bid => { + if (bid.bidder !== BIDDER_CODE) { + return false; + } + if (!bid.params.publisherId) { + return false; + } + return true; + }, + buildRequests: (validBidRequests, bidderRequest) => { + const timeout = bidderRequest.timeout || 0; + const debug = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('debug') || false; + // TODO: is 'page' the right value here? + const referrer = bidderRequest.refererInfo.page; + const locale = window.navigator.language && window.navigator.language.length > 0 ? window.navigator.language.substr(0, 2) : ''; + const domain = bidderRequest.refererInfo.domain || ''; + const ua = window.navigator.userAgent.toLowerCase(); + const additional = spec.parseUserAgent(ua); + return validBidRequests.map(bidRequest => { + const checkFloorValue = value => { + if (isNaN(parseFloat(value))) { + return 0; + } else return parseFloat(value); + }; + const adUnit = { + code: bidRequest.adUnitCode, + bids: { + bidder: bidRequest.bidder, + params: { + publisherId: bidRequest.params.publisherId, + IABCategories: bidRequest.params.IABCategories || [], + floorCPM: bidRequest.params.floorCPM ? checkFloorValue(bidRequest.params.floorCPM) : 0 + } + }, + mediaTypes: bidRequest.mediaTypes + }; + if (bidRequest.hasOwnProperty('sizes') && bidRequest.sizes.length > 0) { + adUnit.sizes = bidRequest.sizes; + } + const request = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidRequest.auctionId, + requestId: bidRequest.bidId, + bidRequestsCount: bidRequest.bidRequestsCount, + bidderRequestId: bidRequest.bidderRequestId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + referrer: referrer, + timeout: timeout, + adUnit: adUnit, + locale: locale, + domain: domain, + os: additional.os, + osv: additional.osv, + devicetype: additional.devicetype + }; + if (bidderRequest.gdprConsent) { + request.gdpr = { + applies: bidderRequest.gdprConsent.gdprApplies, + consentString: bidderRequest.gdprConsent.consentString + }; + } + + /* if (bidderRequest.uspConsent) { + request.uspConsent = bidderRequest.uspConsent; + } + */ + if (bidRequest.userId && bidRequest.userId.pubcid) { + request.userId = { + pubcid: bidRequest.userId.pubcid + }; + } + if (debug) { + request.debug = debug; + } + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(request) + }; + }); + }, + interpretResponse: serverResponse => { + const bidResponses = []; + if (serverResponse.body) { + const response = serverResponse.body; + const bidResponse = { + requestId: response.requestId, + cpm: response.cpm, + width: response.width, + height: response.height, + creativeId: response.creativeId, + currency: response.currency, + netRevenue: response.netRevenue, + ttl: response.ttl, + ad: response.ad, + meta: { + advertiserDomains: response.adomain && response.adomain.length ? response.adomain : [], + mediaType: 'banner' + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + if (gdprConsent && SYNC_ENDPOINT.indexOf('gdpr') === -1) { + SYNC_ENDPOINT = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(SYNC_ENDPOINT, 'gdpr', gdprConsent.gdprApplies ? 1 : 0); + } + if (gdprConsent && typeof gdprConsent.consentString === 'string' && SYNC_ENDPOINT.indexOf('gdpr_consent') === -1) { + SYNC_ENDPOINT = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(SYNC_ENDPOINT, 'gdpr_consent', gdprConsent.consentString); + } + if (SYNC_ENDPOINT.slice(-1) === '&') { + SYNC_ENDPOINT = SYNC_ENDPOINT.slice(0, -1); + } + + /* if (uspConsent) { + SYNC_ENDPOINT = tryAppendQueryString(SYNC_ENDPOINT, 'us_privacy', uspConsent); + } */ + let syncs = []; + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: SYNC_ENDPOINT + }); + } + return syncs; + }, + parseUserAgent: ua => { + function detectDevice() { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(ua.toLowerCase())) { + return 5; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(ua.toLowerCase())) { + return 4; + } + if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i.test(ua.toLowerCase())) { + return 3; + } + return 2; + } + function detectOs() { + const module = { + options: [], + header: [navigator.platform, ua, navigator.appVersion, navigator.vendor, window.opera], + dataos: [{ + name: 'Windows Phone', + value: 'Windows Phone', + version: 'OS' + }, { + name: 'Windows', + value: 'Win', + version: 'NT' + }, { + name: 'iOS', + value: 'iPhone', + version: 'OS' + }, { + name: 'iOS', + value: 'iPad', + version: 'OS' + }, { + name: 'Kindle', + value: 'Silk', + version: 'Silk' + }, { + name: 'Android', + value: 'Android', + version: 'Android' + }, { + name: 'PlayBook', + value: 'PlayBook', + version: 'OS' + }, { + name: 'BlackBerry', + value: 'BlackBerry', + version: '/' + }, { + name: 'Macintosh', + value: 'Mac', + version: 'OS X' + }, { + name: 'Linux', + value: 'Linux', + version: 'rv' + }, { + name: 'Palm', + value: 'Palm', + version: 'PalmOS' + }], + init: function () { + var agent = this.header.join(' '); + var os = this.matchItem(agent, this.dataos); + return { + os + }; + }, + getVersion: function (name, version) { + if (name === 'Windows') { + switch (parseFloat(version).toFixed(1)) { + case '5.0': + return '2000'; + case '5.1': + return 'XP'; + case '5.2': + return 'Server 2003'; + case '6.0': + return 'Vista'; + case '6.1': + return '7'; + case '6.2': + return '8'; + case '6.3': + return '8.1'; + default: + return version || 'other'; + } + } else return version || 'other'; + }, + matchItem: function (string, data) { + var i = 0; + var j = 0; + var regex, regexv, match, matches, version; + for (i = 0; i < data.length; i += 1) { + regex = new RegExp(data[i].value, 'i'); + match = regex.test(string); + if (match) { + regexv = new RegExp(data[i].version + '[- /:;]([\\d._]+)', 'i'); + matches = string.match(regexv); + version = ''; + if (matches) { + if (matches[1]) { + matches = matches[1]; + } + } + if (matches) { + matches = matches.split(/[._]+/); + for (j = 0; j < matches.length; j += 1) { + if (j === 0) { + version += matches[j] + '.'; + } else { + version += matches[j]; + } + } + } else { + version = 'other'; + } + return { + name: data[i].name, + version: this.getVersion(data[i].name, version) + }; + } + } + return { + name: 'unknown', + version: 'other' + }; + } + }; + var e = module.init(); + return { + os: e.os.name || '', + osv: e.os.version || '' + }; + } + return { + devicetype: detectDevice(), + os: detectOs().os, + osv: detectOs().osv + }; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('adWMGBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adWMGBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adagioAnalyticsAdapter"],{ + +/***/ "./modules/adagioAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/adagioAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export _internal */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/adagioUtils/adagioUtils.js */ "./libraries/adagioUtils/adagioUtils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + +/** + * Analytics Adapter for Adagio + */ + + + + + + + + + + +const emptyUrl = ''; +const analyticsType = 'endpoint'; +const events = Object.keys(_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS).map(key => _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS[key]); +const ADAGIO_GVLID = 617; +const VERSION = '3.0.0'; +const PREBID_VERSION = "9.45.0-pre"; +const ENDPOINT = 'https://c.4dex.io/pba.gif'; +const CURRENCY_USD = 'USD'; +const ADAGIO_CODE = 'adagio'; +const _internal = { + getAdagioNs: function () { + return _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_1__._ADAGIO; + }, + gamSlotCallback +}; +const cache = { + auctions: {}, + getAuction: function (auctionId, adUnitCode) { + return this.auctions[auctionId][adUnitCode]; + }, + getBiddersFromAuction: function (auctionId, adUnitCode) { + return this.getAuction(auctionId, adUnitCode).bdrs.split(','); + }, + getAllAdUnitCodes: function (auctionId) { + return Object.keys(this.auctions[auctionId]); + }, + updateAuction: function (auctionId, adUnitCode, values) { + this.auctions[auctionId][adUnitCode] = { + ...this.auctions[auctionId][adUnitCode], + ...values + }; + }, + // Map prebid auction id to adagio auction id + auctionIdReferences: {}, + addPrebidAuctionIdRef(auctionId, adagioAuctionId) { + this.auctionIdReferences[auctionId] = adagioAuctionId; + }, + getAdagioAuctionId(auctionId) { + return this.auctionIdReferences[auctionId]; + }, + // Map adunitcode with prebid auction ID + auctionByAdunit: {}, + getAuctionIdByAdunit(adUnitPath, adSlotElementId) { + if (cache.auctionByAdunit[adUnitPath]) { + return { + auctionId: cache.auctionByAdunit[adUnitPath], + adUnitCode: adUnitPath + }; + } + if (cache.auctionByAdunit[adSlotElementId]) { + return { + auctionId: cache.auctionByAdunit[adSlotElementId], + adUnitCode: adSlotElementId + }; + } + return { + auctionId: null, + adUnitCode: null + }; + } +}; +const enc = window.encodeURIComponent; + +/** + * UTILS FUNCTIONS + */ + +const guard = { + adagio: value => isAdagio(value), + bidTracked: (auctionId, adUnitCode) => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(cache, `auctions.${auctionId}.${adUnitCode}`, false), + auctionTracked: auctionId => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(cache, `auctions.${auctionId}`, false) +}; +function removeDuplicates(arr, getKey) { + const seen = {}; + return arr.filter(item => { + const key = getKey(item); + return seen.hasOwnProperty(key) ? false : seen[key] = true; + }); +} +; +function isAdagio(alias) { + if (!alias) { + return false; + } + return (alias + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].aliasRegistry[alias]).toLowerCase().includes(ADAGIO_CODE); +} +; +function getMediaTypeAlias(mediaType) { + const mediaTypesMap = { + banner: 'ban', + outstream: 'vidout', + instream: 'vidin', + adpod: 'vidadpod', + native: 'nat' + }; + return mediaTypesMap[mediaType] || mediaType; +} +; +function addKeyPrefix(obj, prefix) { + return Object.keys(obj).reduce((acc, key) => { + // We don't want to prefix already prefixed keys. + if (key.startsWith(prefix)) { + acc[key] = obj[key]; + return acc; + } + acc[`${prefix}${key}`] = obj[key]; + return acc; + }, {}); +} +function getUsdCpm(cpm, currency) { + let netCpm = cpm; + if (typeof currency === 'string' && currency.toUpperCase() !== CURRENCY_USD) { + if (typeof (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().convertCurrency === 'function') { + netCpm = parseFloat(Number((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().convertCurrency(cpm, currency, CURRENCY_USD))).toFixed(3); + } else { + netCpm = null; + } + } + return netCpm; +} +function getCurrencyData(bid) { + return { + netCpm: getUsdCpm(bid.cpm, bid.currency), + orginalCpm: getUsdCpm(bid.originalCpm, bid.originalCurrency) + }; +} + +/** + * sendRequest to Adagio. It filter null values and encode each query param. + * @param {Object} qp + */ +function sendRequest(qp) { + if (!qp.org_id || !qp.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logInfo)('request is missing org_id or site, skipping beacon.'); + return; + } + // Removing null values + qp = Object.keys(qp).reduce((acc, key) => { + if (qp[key] !== null) { + acc[key] = qp[key]; + } + return acc; + }, {}); + const url = `${ENDPOINT}?${Object.keys(qp).map(key => `${key}=${enc(qp[key])}`).join('&')}`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, null, null, { + method: 'GET' + }); +} +; + +/** + * Send a new beacon to Adagio. It increment the version of the beacon. + * @param {string} auctionId + * @param {string} adUnitCode + */ +function sendNewBeacon(auctionId, adUnitCode) { + cache.updateAuction(auctionId, adUnitCode, { + v: (cache.getAuction(auctionId, adUnitCode).v || 0) + 1 + }); + sendRequest(cache.getAuction(auctionId, adUnitCode)); +} +; +function getTargetedAuctionId(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'latestTargetedAuctionId') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'auctionId'); +} + +/** + * END UTILS FUNCTIONS + */ + +/** + * HANDLERS + * - handlerAuctionInit + * - handlerBidResponse + * - handlerAuctionEnd + * - handlerBidWon + * - handlerAdRender + * + * Each handler is called when the event is fired. + */ + +function handlerAuctionInit(event) { + const w = (0,_libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBestWindowForAdagio)(); + const prebidAuctionId = event.auctionId; + + // adUnitCodes come from `event.bidderRequests` to be sure to keep the ad-units that are valid and will be effectively used during the auction. + // This array can be different than `event.adUnitCodes` because of the usage of conditionnal ad-units (see: https://docs.prebid.org/dev-docs/conditional-ad-units.html) + const adUnitCodes = new Set(event.bidderRequests.map(br => br.bids.map(bid => bid.adUnitCode)).flat()); + + // Check if Adagio is on the bid requests. + const adagioBidRequest = event.bidderRequests.find(bidRequest => isAdagio(bidRequest.bidderCode)); + const rtdUid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(event.bidderRequests[0], 'ortb2.site.ext.data.adg_rtd.uid'); + cache.addPrebidAuctionIdRef(prebidAuctionId, rtdUid); + cache.auctions[prebidAuctionId] = {}; + adUnitCodes.forEach(adUnitCode => { + // event.adUnits are splitted by mediatypes + // having twin ad-unit codes is ok: https://docs.prebid.org/dev-docs/adunit-reference.html#twin-adunit-codes + const adUnits = event.adUnits.filter(adUnit => adUnit.code === adUnitCode); + + // Get all bidders configured for the ad unit. + // AdUnits with the same code can have a different bidder list, aggregate all of them. + const biddersAggregate = adUnits.reduce((bidders, adUnit) => bidders.concat(adUnit.bids.map(bid => bid.bidder)), []); + // remove duplicates + const bidders = [...new Set(biddersAggregate)]; + + // Get all media types and banner sizes configured for the ad unit. + const mediaTypes = adUnits.map(adUnit => adUnit.mediaTypes); + const mediaTypesKeys = removeDuplicates(mediaTypes.map(mediaTypeObj => Object.keys(mediaTypeObj)).flat(), mediaTypeKey => mediaTypeKey).map(mediaType => getMediaTypeAlias(mediaType)).sort(); + const bannerSizes = removeDuplicates(mediaTypes.filter(mediaType => mediaType.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.BANNER) && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.BANNER].hasOwnProperty('sizes')).map(mediaType => mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.BANNER].sizes.map(size => size.join('x'))).flat(), bannerSize => bannerSize).sort(); + const sortedBidderNames = bidders.sort(); + const bidSrcMapper = bidder => { + // bidderCode in the context of the bidderRequest is the name given to the bidder in the adunit. + // It is not always the "true" bidder code, it can also be its alias + const request = event.bidderRequests.find(br => br.bidderCode === bidder); + return request ? request.bids[0].src : null; + }; + const biddersSrc = sortedBidderNames.map(bidSrcMapper).join(','); + const biddersCode = sortedBidderNames.map(bidder => _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].resolveAlias(bidder)).join(','); + + // if adagio was involved in the auction we identified it with rtdUid, if not use the prebid auctionId + const auctionId = rtdUid || prebidAuctionId; + const adgRtdSession = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(event.bidderRequests[0], 'ortb2.site.ext.data.adg_rtd.session', {}); + const qp = { + org_id: adagioAdapter.options.organizationId, + site: adagioAdapter.options.site, + v: 0, + pbjsv: PREBID_VERSION, + pv_id: _internal.getAdagioNs().pageviewId, + auct_id: auctionId, + adu_code: adUnitCode, + url_dmn: w.location.hostname, + mts: mediaTypesKeys.join(','), + ban_szs: bannerSizes.join(','), + bdrs: sortedBidderNames.join(','), + pgtyp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(event.bidderRequests[0], 'ortb2.site.ext.data.pagetype', null), + plcmt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adUnits[0], 'ortb2Imp.ext.data.placement', null), + t_n: adgRtdSession.testName || null, + t_v: adgRtdSession.testVersion || null, + s_id: adgRtdSession.id || null, + s_new: adgRtdSession.new || null, + bdrs_src: biddersSrc, + bdrs_code: biddersCode + }; + if (adagioBidRequest && adagioBidRequest.bids) { + const adagioAdUnitBids = adagioBidRequest.bids.filter(bid => bid.adUnitCode === adUnitCode); + if (adagioAdUnitBids.length > 0) { + // Get all media types requested for Adagio. + const adagioMediaTypes = removeDuplicates(adagioAdUnitBids.map(bid => Object.keys(bid.mediaTypes)).flat(), mediaTypeKey => mediaTypeKey).flat().map(mediaType => getMediaTypeAlias(mediaType)).sort(); + qp.adg_mts = adagioMediaTypes.join(','); + // for backward compatibility: if we didn't find organizationId & site but we have a bid from adagio we might still find it in params + qp.org_id = qp.org_id || adagioAdUnitBids[0].params.organizationId; + qp.site = qp.site || adagioAdUnitBids[0].params.site; + } + } + cache.auctions[prebidAuctionId][adUnitCode] = qp; + cache.auctionByAdunit[adUnitCode] = prebidAuctionId; + sendNewBeacon(prebidAuctionId, adUnitCode); + }); +} +; + +/** + * handlerBidResponse allow to track the adagio bid response + * and to update the auction cache with the seat ID. + * No beacon is sent here. + */ +function handlerBidResponse(event) { + if (!guard.adagio(event.bidder)) { + return; + } + if (!guard.bidTracked(event.auctionId, event.adUnitCode)) { + return; + } + if (!event.pba) { + return; + } + cache.updateAuction(event.auctionId, event.adUnitCode, { + ...addKeyPrefix(event.pba, 'e_') + }); +} +; +function handlerAuctionEnd(event) { + const { + auctionId + } = event; + if (!guard.auctionTracked(auctionId)) { + return; + } + const adUnitCodes = cache.getAllAdUnitCodes(auctionId); + adUnitCodes.forEach(adUnitCode => { + const bidResponseMapper = bidder => { + const bid = event.bidsReceived.find(bid => bid.adUnitCode === adUnitCode && bid.bidder === bidder); + return bid ? '1' : '0'; + }; + const bidCpmMapper = bidder => { + const bid = event.bidsReceived.find(bid => bid.adUnitCode === adUnitCode && bid.bidder === bidder); + return bid ? getCurrencyData(bid).netCpm : null; + }; + const perfNavigation = performance.getEntriesByType('navigation')[0]; + const auction = cache.getAuction(auctionId, adUnitCode); + const bdrs = auction.bdrs.split(','); + const bdrsTimeout = auction.bdrs_timeout || []; + cache.updateAuction(auctionId, adUnitCode, { + bdrs_bid: cache.getBiddersFromAuction(auctionId, adUnitCode).map(bidResponseMapper).join(','), + bdrs_cpm: cache.getBiddersFromAuction(auctionId, adUnitCode).map(bidCpmMapper).join(','), + // check timings at the end of the auction to leave time to the browser to update it + dom_i: Math.round(perfNavigation['domInteractive']) || null, + dom_c: Math.round(perfNavigation['domComplete']) || null, + loa_e: Math.round(perfNavigation['loadEventEnd']) || null, + bdrs_timeout: bdrs.map(b => bdrsTimeout.includes(b) ? '1' : '0').join(',') + }); + sendNewBeacon(auctionId, adUnitCode); + }); +} +function handlerBidWon(event) { + let auctionId = getTargetedAuctionId(event); + if (!guard.bidTracked(auctionId, event.adUnitCode)) { + return; + } + const currencyData = getCurrencyData(event); + const adagioAuctionCacheId = event.latestTargetedAuctionId && event.latestTargetedAuctionId !== event.auctionId ? cache.getAdagioAuctionId(event.auctionId) : null; + const perfNavigation = performance.getEntriesByType('navigation')[0]; + cache.updateAuction(auctionId, event.adUnitCode, { + win_bdr: event.bidder, + win_mt: getMediaTypeAlias(event.mediaType), + win_ban_sz: event.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_7__.BANNER ? `${event.width}x${event.height}` : null, + win_net_cpm: currencyData.netCpm, + win_og_cpm: currencyData.orginalCpm, + // check timings at the end of the auction to leave time to the browser to update it + dom_i: Math.round(perfNavigation['domInteractive']) || null, + dom_c: Math.round(perfNavigation['domComplete']) || null, + loa_e: Math.round(perfNavigation['loadEventEnd']) || null, + // cache bid id + auct_id_c: adagioAuctionCacheId + }); + sendNewBeacon(auctionId, event.adUnitCode); +} +; +function handlerAdRender(event, isSuccess) { + const { + adUnitCode + } = event.bid; + let auctionId = getTargetedAuctionId(event.bid); + if (!guard.bidTracked(auctionId, adUnitCode)) { + return; + } + cache.updateAuction(auctionId, adUnitCode, { + rndr: isSuccess ? 1 : 0 + }); + sendNewBeacon(auctionId, adUnitCode); +} +; +function handlerBidTimeout(args) { + args.forEach(event => { + const auction = cache.getAuction(event.auctionId, event.adUnitCode); + if (!auction) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)(`bid timeout on auction ${event.auctionId}, with adunitCode ${event.adUnitCode}: could not retrieve auction from cache`); + return; + } + + // an array of bidder names is first created + // in AUCTION_END handler, this array is sorted + // and transformed in a comma-separated list. + const bdrsTimeout = auction.bdrs_timeout || []; + bdrsTimeout.push(event.bidder); + auction.bdrs_timeout = bdrsTimeout; + }); +} +; + +/** + * handlerPbsAnalytics add to the cache data coming from Adagio PBS AdResponse. + * The data is retrieved from an AnalyticsTag (set by a custom PBS module named `adg-pba`), + * located in the AdResponse at `response.ext.prebid.analytics.tags[].pba`. + */ +function handlerPbsAnalytics(event) { + const pbaByAdUnit = event.atag.find(e => { + return e.module === 'adg-pba'; + })?.pba; + if (!pbaByAdUnit) { + return; + } + const adUnitCodes = cache.getAllAdUnitCodes(event.auctionId); + adUnitCodes.forEach(adUnitCode => { + const pba = pbaByAdUnit[adUnitCode]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isPlainObject)(pba)) { + cache.updateAuction(event.auctionId, adUnitCode, { + ...addKeyPrefix(pba, 'e_') + }); + } + }); +} + +/** + * END HANDLERS + */ + +/** + * @param {SlotRenderEndedEvent} event + * @returns {void} + */ +function gamSlotCallback(event) { + const { + auctionId, + adUnitCode + } = cache.getAuctionIdByAdunit(event.slot.getAdUnitPath(), event.slot.getSlotElementId()); + if (!auctionId) { + const slotName = `${event.slot.getAdUnitPath()} - ${event.slot.getSlotElementId()}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Could not find configured ad unit matching GAM render of slot: ' + slotName); + return; + } + cache.updateAuction(auctionId, adUnitCode, { + adsrv: 'gam', + adsrv_empty: event.isEmpty + }); + + // This event can be triggered after AUCTION_END + // To make sure the data is sent, we must send a new beacon version. + const auction = cache.getAuction(auctionId, adUnitCode); + if (auction?.loa_e !== undefined) { + // loa_e = loadEventEnd + // It means the AUCTION_END has already been sent. + sendNewBeacon(auctionId, adUnitCode); + } +} +let adagioAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_8__["default"])({ + emptyUrl, + analyticsType +}), { + track: function (event) { + const { + eventType, + args + } = event; + try { + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_INIT: + handlerAuctionInit(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_RESPONSE: + handlerBidResponse(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_END: + handlerAuctionEnd(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON: + handlerBidWon(args); + break; + // AD_RENDER_SUCCEEDED seems redundant with BID_WON. + // case CONSTANTS.EVENTS.AD_RENDER_SUCCEEDED: + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AD_RENDER_FAILED: + handlerAdRender(args, eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AD_RENDER_SUCCEEDED); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.PBS_ANALYTICS: + handlerPbsAnalytics(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_TIMEOUT: + handlerBidTimeout(args); + break; + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Error on Adagio Analytics Adapter', error); + } + try { + if (typeof args !== 'undefined' && events.indexOf(eventType) !== -1) { + _internal.getAdagioNs().queue.push({ + action: 'pb-analytics-event', + data: { + eventName: eventType, + args + }, + ts: Date.now() + }); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Error on Adagio Analytics Adapter - adagio.js', error); + } + } +}); +adagioAdapter.originEnableAnalytics = adagioAdapter.enableAnalytics; +adagioAdapter.enableAnalytics = config => { + _internal.getAdagioNs().versions.adagioAnalyticsAdapter = VERSION; + let modules = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().installedModules; + if (modules && (!modules.length || modules.indexOf('adagioRtdProvider') === -1 || modules.indexOf('rtdModule') === -1)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Adagio Analytics Adapter requires rtdModule & adagioRtdProvider modules which are not installed. No beacon will be sent'); + return; + } + adagioAdapter.options = config.options || {}; + if (!adagioAdapter.options.organizationId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Adagio Analytics Adapter: organizationId is required and is missing will try to fallback on params.'); + } else { + adagioAdapter.options.organizationId = adagioAdapter.options.organizationId.toString(); // allows publisher to pass it as a number + } + if (!adagioAdapter.options.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Adagio Analytics Adapter: site is required and is missing will try to fallback on params.'); + } else if (typeof adagioAdapter.options.site !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Adagio Analytics Adapter: site should be a string will try to fallback on params.'); + adagioAdapter.options.site = undefined; + } + adagioAdapter.originEnableAnalytics(config); + (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_9__.subscribeToGamSlotRenderEndedEvent)(gamSlotCallback); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].registerAnalyticsAdapter({ + adapter: adagioAdapter, + code: ADAGIO_CODE, + gvlid: ADAGIO_GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (adagioAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('adagioAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","gptUtils","adagioUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adagioAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adagioBidAdapter"],{ + +/***/ "./modules/adagioBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adagioBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT, BB_RENDERER_URL, _internal, setExtraParam, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/adagioUtils/adagioUtils.js */ "./libraries/adagioUtils/adagioUtils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_userSync_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/userSync.js */ "./src/userSync.js"); + + + + + + + + + + + + + +const BIDDER_CODE = 'adagio'; +const LOG_PREFIX = 'Adagio:'; +const ENDPOINT = 'https://mp.4dex.io/prebid'; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const GVLID = 617; +const BB_PUBLICATION = 'adagio'; +const BB_RENDERER_DEFAULT = 'renderer'; +const BB_RENDERER_URL = `https://${BB_PUBLICATION}.bbvms.com/r/$RENDERER.js`; +const CURRENCY = 'USD'; + +/** + * Get device data object, with some properties + * deviated from the OpenRTB spec. + * @param {Object} ortb2Data + * @returns {Object} Device data object + */ +function getDevice(ortb2Data) { + const _device = {}; + + // Merge the device object from ORTB2 data. + if (ortb2Data?.device) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(_device, ortb2Data.device); + } + + // If the geo object is not defined, create it. + if (!_device.geo) { + _device.geo = {}; + } + const language = navigator.language ? 'language' : 'userLanguage'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(_device, { + userAgent: navigator.userAgent, + language: navigator[language], + js: 1 + }); + return _device; +} +function getSite(bidderRequest) { + const { + refererInfo + } = bidderRequest; + return { + domain: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.parseDomain)(refererInfo.topmostLocation) || '', + page: refererInfo.topmostLocation || '', + referrer: refererInfo.ref || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowSelf)().document.referrer || '', + top: refererInfo.reachedTop + }; +} +; +function autoDetectAdUnitElementIdFromGpt(adUnitCode) { + const autoDetectedAdUnit = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_3__.getGptSlotInfoForAdUnitCode)(adUnitCode); + if (autoDetectedAdUnit.divId) { + return autoDetectedAdUnit.divId; + } +} +; +function isRendererPreferredFromPublisher(bidRequest) { + // renderer defined at adUnit level + const adUnitRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'renderer'); + const hasValidAdUnitRenderer = !!(adUnitRenderer && adUnitRenderer.url && adUnitRenderer.render); + + // renderer defined at adUnit.mediaTypes level + const mediaTypeRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video.renderer'); + const hasValidMediaTypeRenderer = !!(mediaTypeRenderer && mediaTypeRenderer.url && mediaTypeRenderer.render); + return !!(hasValidAdUnitRenderer && !(adUnitRenderer.backupOnly === true) || hasValidMediaTypeRenderer && !(mediaTypeRenderer.backupOnly === true)); +} + +/** + * Check if the publisher has defined its own video player and uses it for all ad-units. + * If not or if the `backupOnly` flag is true, this means we use our own player (BlueBillywig) defined in this adapter. + */ +function getPlayerName(bidRequest) { + return _internal.isRendererPreferredFromPublisher(bidRequest) ? 'other' : 'adagio'; + ; +} +function hasRtd() { + const rtdConfigs = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('realTimeData.dataProviders') || []; + return rtdConfigs.find(provider => provider.name === 'adagio'); +} +; +const _internal = { + canAccessWindowTop: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.canAccessWindowTop, + getAdagioNs: function () { + return _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_6__._ADAGIO; + }, + getDevice, + getSite, + getRefererInfo: _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.getRefererInfo, + hasRtd, + isRendererPreferredFromPublisher +}; +function _getGdprConsent(bidderRequest) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'gdprConsent')) { + return false; + } + const { + apiVersion, + gdprApplies, + consentString, + allowAuctionWithoutConsent + } = bidderRequest.gdprConsent; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.cleanObj)({ + apiVersion, + consentString, + consentRequired: gdprApplies ? 1 : 0, + allowAuctionWithoutConsent: allowAuctionWithoutConsent ? 1 : 0 + }); +} +function _getCoppa() { + return { + required: _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa') === true ? 1 : 0 + }; +} +function _getUspConsent(bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'uspConsent') ? { + uspConsent: bidderRequest.uspConsent + } : false; +} +function _getSchain(bidRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'schain'); +} +function _getEids(bidRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'userIdAsEids')) { + return bidRequest.userIdAsEids; + } +} + +/** + * Merge and compute video params set at mediaTypes and bidder params level + * + * @param {object} bidRequest - copy of the original bidRequest object. + * @returns {void} + */ +function _buildVideoBidRequest(bidRequest) { + const videoAdUnitParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'params.video', {}); + const computedParams = {}; + + // Special case for playerSize. + // Eeach props will be overrided if they are defined in config. + if (Array.isArray(videoAdUnitParams.playerSize)) { + const tempSize = Array.isArray(videoAdUnitParams.playerSize[0]) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize; + computedParams.w = tempSize[0]; + computedParams.h = tempSize[1]; + } + const videoParams = { + ...computedParams, + ...videoAdUnitParams, + ...videoBidderParams + }; + if (videoParams.context && videoParams.context === _src_video_js__WEBPACK_IMPORTED_MODULE_7__.OUTSTREAM) { + videoParams.playerName = getPlayerName(bidRequest); + } + bidRequest.mediaTypes.video = videoParams; + (0,_src_video_js__WEBPACK_IMPORTED_MODULE_7__.validateOrtbVideoFields)(bidRequest); +} +function _parseNativeBidResponse(bid) { + if (!bid.admNative || !Array.isArray(bid.admNative.assets)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${LOG_PREFIX} Invalid native response`); + return; + } + const native = {}; + function addAssetDataValue(data) { + const map = { + 1: 'sponsoredBy', + // sponsored + 2: 'body', + // desc + 3: 'rating', + 4: 'likes', + 5: 'downloads', + 6: 'price', + 7: 'salePrice', + 8: 'phone', + 9: 'address', + 10: 'body2', + // desc2 + 11: 'displayUrl', + 12: 'cta' + }; + if (map.hasOwnProperty(data.type) && typeof data.value === 'string') { + native[map[data.type]] = data.value; + } + } + + // assets + bid.admNative.assets.forEach(asset => { + if (asset.title) { + native.title = asset.title.text; + } else if (asset.data) { + addAssetDataValue(asset.data); + } else if (asset.img) { + switch (asset.img.type) { + case 1: + native.icon = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + default: + native.image = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + } + } + }); + if (bid.admNative.link) { + if (bid.admNative.link.url) { + native.clickUrl = bid.admNative.link.url; + } + if (Array.isArray(bid.admNative.link.clicktrackers)) { + native.clickTrackers = bid.admNative.link.clicktrackers; + } + } + if (Array.isArray(bid.admNative.eventtrackers)) { + native.impressionTrackers = []; + bid.admNative.eventtrackers.forEach(tracker => { + // Only Impression events are supported. Prebid does not support Viewability events yet. + if (tracker.event !== 1) { + return; + } + + // methods: + // 1: image + // 2: js + // note: javascriptTrackers is a string. If there's more than one JS tracker in bid response, the last script will be used. + switch (tracker.method) { + case 1: + native.impressionTrackers.push(tracker.url); + break; + case 2: + const script = ``; + if (!native.javascriptTrackers) { + native.javascriptTrackers = script; + } else { + native.javascriptTrackers += `\n${script}`; + } + break; + } + }); + } else { + native.impressionTrackers = Array.isArray(bid.admNative.imptrackers) ? bid.admNative.imptrackers : []; + if (bid.admNative.jstracker) { + native.javascriptTrackers = bid.admNative.jstracker; + } + } + if (bid.admNative.privacy) { + native.privacyLink = bid.admNative.privacy; + } + if (bid.admNative.ext) { + native.ext = {}; + if (bid.admNative.ext.bvw) { + native.ext.adagio_bvw = bid.admNative.ext.bvw; + } + } + bid.native = native; +} + +// bidRequest param must be the `bidRequest` object with the original `auctionId` value. +function _getFloors(bidRequest) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.getFloor)) { + return false; + } + const floors = []; + const getAndPush = (mediaType, size) => { + const info = bidRequest.getFloor({ + currency: CURRENCY, + mediaType, + size + }); + floors.push((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.cleanObj)({ + mt: mediaType, + s: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size) ? `${size[0]}x${size[1]}` : undefined, + f: !isNaN(info?.floor) && info?.currency === CURRENCY ? info?.floor : undefined + })); + }; + Object.keys(bidRequest.mediaTypes).forEach(mediaType => { + if (SUPPORTED_MEDIA_TYPES.indexOf(mediaType) !== -1) { + const sizeProp = mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO ? 'playerSize' : 'sizes'; + if (bidRequest.mediaTypes[mediaType][sizeProp] && bidRequest.mediaTypes[mediaType][sizeProp].length) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidRequest.mediaTypes[mediaType][sizeProp][0])) { + bidRequest.mediaTypes[mediaType][sizeProp].forEach(size => { + getAndPush(mediaType, [size[0], size[1]]); + }); + } else { + getAndPush(mediaType, [bidRequest.mediaTypes[mediaType][sizeProp][0], bidRequest.mediaTypes[mediaType][sizeProp][1]]); + } + } else { + getAndPush(mediaType, '*'); + } + } + }); + return floors; +} + +/** + * Try to find the value of `paramName` and set it to adUnit.params if + * it has not already been set. + * This function will check through: + * - bidderSettings object + * - ortb2.site.ext.data FPD… + * + * @param {*} bid + * @param {String} paramName + */ +function setExtraParam(bid, paramName) { + bid.params = bid.params || {}; + + // eslint-disable-next-line + if (!!bid.params[paramName]) { + return; + } + const adgGlobalConf = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('adagio') || {}; + const ortb2Conf = bid.ortb2; + const detected = adgGlobalConf[paramName] || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(ortb2Conf, `site.ext.data.${paramName}`, null); + if (detected) { + // First Party Data can be an array. + // As we consider that params detected from FPD are fallbacks, we just keep the 1st value. + if (Array.isArray(detected)) { + if (detected.length) { + bid.params[paramName] = detected[0].toString(); + } + return; + } + bid.params[paramName] = detected.toString(); + } +} +function autoFillParams(bid) { + // adUnitElementId … + const adgGlobalConf = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('adagio') || {}; + bid.params = bid.params || {}; + + // adgGlobalConf.siteId is a shortcut to facilitate the integration for publisher. + if (adgGlobalConf.siteId) { + bid.params.organizationId = adgGlobalConf.siteId.split(':')[0]; + bid.params.site = adgGlobalConf.siteId.split(':')[1]; + } + + // `useAdUnitCodeAsPlacement` is an edge case. Useful when a Prebid Manager cannot handle properly params setting. + // In Prebid.js 9, `placement` should be defined in ortb2Imp and the `useAdUnitCodeAsPlacement` param should be removed + bid.params.placement = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.data.placement', bid.params.placement); + if (!bid.params.placement && (adgGlobalConf.useAdUnitCodeAsPlacement === true || bid.params.useAdUnitCodeAsPlacement === true)) { + bid.params.placement = bid.adUnitCode; + } + bid.params.adUnitElementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.data.divId', bid.params.adUnitElementId); + if (!bid.params.adUnitElementId) { + if (adgGlobalConf.useAdUnitCodeAsAdUnitElementId === true || bid.params.useAdUnitCodeAsAdUnitElementId === true) { + bid.params.adUnitElementId = bid.adUnitCode; + } else { + bid.params.adUnitElementId = autoDetectAdUnitElementIdFromGpt(bid.adUnitCode); + } + } + + // extra params + setExtraParam(bid, 'pagetype'); + setExtraParam(bid, 'category'); +} + +// See https://support.bluebillywig.com/developers/vast-renderer/ +const OUTSTREAM_RENDERER = { + bootstrapPlayer: function (bid) { + const rendererCode = bid.outstreamRendererCode; + const config = { + code: bid.adUnitCode + }; + if (bid.vastXml) { + config.vastXml = bid.vastXml; + } else if (bid.vastUrl) { + config.vastUrl = bid.vastUrl; + } + if (!bid.vastXml && !bid.vastUrl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${LOG_PREFIX} no vastXml or vastUrl on bid`); + return; + } + if (!window.bluebillywig || !window.bluebillywig.renderers || !window.bluebillywig.renderers.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${LOG_PREFIX} no BlueBillywig renderers found!`); + return; + } + const rendererId = this.getRendererId(BB_PUBLICATION, rendererCode); + const override = {}; + if (bid.skipOffset) { + override.skipOffset = bid.skipOffset.toString(); + } + const renderer = window.bluebillywig.renderers.find(bbr => bbr._id === rendererId); + if (!renderer) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${LOG_PREFIX} couldn't find a renderer with ID ${rendererId}`); + return; + } + const el = document.getElementById(bid.adUnitCode); + renderer.bootstrap(config, el, override); + }, + newRenderer: function (adUnitCode, rendererCode) { + const rendererUrl = BB_RENDERER_URL.replace('$RENDERER', rendererCode); + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_8__.Renderer.install({ + url: rendererUrl, + loaded: false, + adUnitCode + }); + try { + renderer.setRender(this.outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${LOG_PREFIX} error trying to setRender`, err); + } + return renderer; + }, + outstreamRender: function (bid) { + bid.renderer.push(() => { + OUTSTREAM_RENDERER.bootstrapPlayer(bid); + }); + }, + getRendererId: function (publication, renderer) { + // By convention, the RENDERER_ID is always the publication name (adagio) and the ad unit code (eg. renderer) + // joined together by a dash. It's used to identify the correct renderer instance on the page in case there's multiple. + return `${publication}-${renderer}`; + } +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid(bid) { + bid.params = bid.params || {}; + autoFillParams(bid); + + // Note: `bid.params.placement` is not related to the video param `placement`. + if (!(bid.params.organizationId && bid.params.site && bid.params.placement)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${LOG_PREFIX} at least one required param is missing.`); + return false; + } + return true; + }, + buildRequests(validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_9__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const secure = location.protocol === 'https:' ? 1 : 0; + const device = _internal.getDevice(bidderRequest?.ortb2); + const site = _internal.getSite(bidderRequest); + const pageviewId = _internal.getAdagioNs().pageviewId; + const gdprConsent = _getGdprConsent(bidderRequest) || {}; + const uspConsent = _getUspConsent(bidderRequest) || {}; + const coppa = _getCoppa(); + const { + gpp, + gpp_sid: gppSid + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.regs', {}); + const schain = _getSchain(validBidRequests[0]); + const eids = _getEids(validBidRequests[0]) || []; + const syncEnabled = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('userSync'), 'syncEnabled'); + const canSyncWithIframe = syncEnabled && _src_userSync_js__WEBPACK_IMPORTED_MODULE_10__.userSync.canBidderRegisterSync('iframe', 'adagio'); + + // We don't validate the dsa object in adapter and let our server do it. + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.regs.ext.dsa'); + + // If no session data is provided, we always generate a new one. + const sessionData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.site.ext.data.adg_rtd.session', {}); + if (!Object.keys(sessionData).length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_PREFIX, 'No session data provided. A new session is be generated.'); + sessionData.new = true; + sessionData.rnd = Math.random(); + } + const aucId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.site.ext.data.adg_rtd.uid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(); + const adUnits = validBidRequests.map(rawBidRequest => { + const bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(rawBidRequest); + + // Fix https://github.com/prebid/Prebid.js/issues/9781 + bidRequest.auctionId = aucId; + + // Force the Split Keyword to be a String + if (bidRequest.params.splitKeyword) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bidRequest.params.splitKeyword) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bidRequest.params.splitKeyword)) { + bidRequest.params.splitKeyword = bidRequest.params.splitKeyword.toString(); + } else { + delete bidRequest.params.splitKeyword; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_PREFIX, 'The splitKeyword param have been removed because the type is invalid, accepted type: number or string.'); + } + } + + // Enforce the organizationId param to be a string + bidRequest.params.organizationId = bidRequest.params.organizationId.toString(); + + // Force the Data Layer key and value to be a String + if (bidRequest.params.dataLayer) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bidRequest.params.dataLayer) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bidRequest.params.dataLayer) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidRequest.params.dataLayer) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.params.dataLayer)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_PREFIX, 'The dataLayer param is invalid, only object is accepted as a type.'); + delete bidRequest.params.dataLayer; + } else { + let invalidDlParam = false; + bidRequest.params.dl = bidRequest.params.dataLayer; + // Remove the dataLayer from the BidRequest to send the `dl` instead of the `dataLayer` + delete bidRequest.params.dataLayer; + Object.keys(bidRequest.params.dl).forEach(key => { + if (bidRequest.params.dl[key]) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bidRequest.params.dl[key]) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bidRequest.params.dl[key])) { + bidRequest.params.dl[key] = bidRequest.params.dl[key].toString(); + } else { + invalidDlParam = true; + delete bidRequest.params.dl[key]; + } + } + }); + if (invalidDlParam) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_PREFIX, 'Some parameters of the dataLayer property have been removed because the type is invalid, accepted type: number or string.'); + } + } + } + + // Handle priceFloors module + // We need to use `rawBidRequest` as param because: + // - adagioBidAdapter generates its own auctionId due to transmitTid activity limitation (see https://github.com/prebid/Prebid.js/pull/10079) + // - the priceFloors.getFloor() uses a `_floorDataForAuction` map to store the floors based on the auctionId. + const computedFloors = _getFloors(rawBidRequest); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(computedFloors) && computedFloors.length) { + bidRequest.floors = computedFloors; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.banner')) { + const bannerObj = bidRequest.mediaTypes.banner; + const computeNewSizeArray = function () { + let sizeArr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + const size = { + size: sizeArr, + floor: null + }; + const bannerFloors = bidRequest.floors.filter(floor => floor.mt === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + const BannerSizeFloor = bannerFloors.find(floor => floor.s === sizeArr.join('x')); + size.floor = bannerFloors ? BannerSizeFloor ? BannerSizeFloor.f : bannerFloors[0].f : null; + return size; + }; + + // `bannerSizes`, internal property name + bidRequest.mediaTypes.banner.bannerSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bannerObj.sizes[0]) ? bannerObj.sizes.map(sizeArr => { + return computeNewSizeArray(sizeArr); + }) : computeNewSizeArray(bannerObj.sizes); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video')) { + const videoObj = bidRequest.mediaTypes.video; + const videoFloors = bidRequest.floors.filter(floor => floor.mt === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + const playerSize = videoObj.playerSize && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(videoObj.playerSize[0]) ? videoObj.playerSize[0] : videoObj.playerSize; + const videoSizeFloor = playerSize ? videoFloors.find(floor => floor.s === playerSize.join('x')) : undefined; + bidRequest.mediaTypes.video.floor = videoFloors ? videoSizeFloor ? videoSizeFloor.f : videoFloors[0].f : null; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.native')) { + const nativeFloors = bidRequest.floors.filter(floor => floor.mt === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + if (nativeFloors.length) { + bidRequest.mediaTypes.native.floor = nativeFloors[0].f; + } + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video')) { + _buildVideoBidRequest(bidRequest); + } + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + bidRequest.gpid = gpid; + } + let instl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2Imp.instl'); + if (instl !== undefined) { + bidRequest.instl = instl === 1 || instl === '1' ? 1 : undefined; + } + let rwdd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2Imp.rwdd'); + if (rwdd !== undefined) { + bidRequest.rwdd = rwdd === 1 || rwdd === '1' ? 1 : undefined; + } + + // features are added by the adagioRtdProvider. + const rawFeatures = { + ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2.site.ext.data.adg_rtd.features', {}), + print_number: (bidRequest.bidderRequestsCount || 1).toString(), + adunit_position: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2Imp.ext.data.adg_rtd.adunit_position', null) + }; + // Clean the features object from null or undefined values. + bidRequest.features = Object.entries(rawFeatures).reduce((a, _ref) => { + let [k, v] = _ref; + return v == null ? a : (a[k] = v, a); + }, {}); + + // Remove some params that are not needed on the server side. + delete bidRequest.params.siteId; + + // whitelist the fields that are allowed to be sent to the server. + const adUnit = { + adUnitCode: bidRequest.adUnitCode, + auctionId: bidRequest.auctionId, + bidder: bidRequest.bidder, + bidId: bidRequest.bidId, + params: bidRequest.params, + features: bidRequest.features, + gpid: bidRequest.gpid, + mediaTypes: bidRequest.mediaTypes, + nativeParams: bidRequest.nativeParams, + score: bidRequest.score, + transactionId: bidRequest.transactionId, + instl: bidRequest.instl, + rwdd: bidRequest.rwdd + }; + return adUnit; + }); + + // Group ad units by organizationId + const groupedAdUnits = adUnits.reduce((groupedAdUnits, adUnit) => { + const organizationId = adUnit.params.organizationId; + groupedAdUnits[organizationId] = groupedAdUnits[organizationId] || []; + groupedAdUnits[organizationId].push(adUnit); + return groupedAdUnits; + }, {}); + + // Adding more params on the original bid object. + // Those params are not sent to the server. + // They are used for further operations on analytics adapter. + validBidRequests.forEach(rawBidRequest => { + rawBidRequest.params.pageviewId = pageviewId; + }); + + // Build one request per organizationId + const requests = Object.keys(groupedAdUnits).map(organizationId => { + return { + method: 'POST', + url: ENDPOINT, + data: { + organizationId: organizationId, + hasRtd: _internal.hasRtd() ? 1 : 0, + secure: secure, + device: device, + site: site, + pageviewId: pageviewId, + adUnits: groupedAdUnits[organizationId], + data: { + session: sessionData + }, + regs: { + gdpr: gdprConsent, + coppa: coppa, + ccpa: uspConsent, + gpp: gpp || '', + gppSid: gppSid || [], + dsa: dsa // populated if exists + }, + schain: schain, + user: { + eids: eids + }, + prebidVersion: "9.45.0-pre", + usIfr: canSyncWithIframe + }, + options: { + contentType: 'text/plain' + } + }; + }); + return requests; + }, + interpretResponse(serverResponse, bidRequest) { + let bidResponses = []; + try { + const response = serverResponse.body; + if (response) { + if (response.data) { + if (_internal.hasRtd()) { + _internal.getAdagioNs().queue.push({ + action: 'ssp-data', + ts: Date.now(), + data: response.data + }); + } + } + if (response.bids) { + response.bids.forEach(bidObj => { + const bidReq = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_11__.find)(bidRequest.data.adUnits, bid => bid.bidId === bidObj.requestId); + if (bidReq) { + // bidObj.meta is the `bidResponse.meta` object according to https://docs.prebid.org/dev-docs/bidder-adaptor.html#interpreting-the-response + bidObj.meta = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidObj, 'meta', {}); + bidObj.meta.mediaType = bidObj.mediaType; + bidObj.meta.advertiserDomains = Array.isArray(bidObj.aDomain) && bidObj.aDomain.length ? bidObj.aDomain : []; + if (bidObj.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const mediaTypeContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidReq, 'mediaTypes.video.context'); + // Adagio SSP returns a `vastXml` only. No `vastUrl` nor `videoCacheKey`. + if (!bidObj.vastUrl && bidObj.vastXml) { + bidObj.vastUrl = 'data:text/xml;charset=utf-8;base64,' + window.btoa(bidObj.vastXml.replace(/\\"/g, '"')); + } + if (mediaTypeContext === _src_video_js__WEBPACK_IMPORTED_MODULE_7__.OUTSTREAM) { + bidObj.outstreamRendererCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidReq, 'params.rendererCode', BB_RENDERER_DEFAULT); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidReq, 'mediaTypes.video.skip')) { + const skipOffset = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidReq, 'mediaTypes.video.skipafter', 5); // default 5s. + bidObj.skipOffset = skipOffset; + } + bidObj.renderer = OUTSTREAM_RENDERER.newRenderer(bidObj.adUnitCode, bidObj.outstreamRendererCode); + } + } + if (bidObj.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + _parseNativeBidResponse(bidObj); + } + bidObj.site = bidReq.params.site; + bidObj.placement = bidReq.params.placement; + bidObj.pagetype = bidReq.params.pagetype; + bidObj.category = bidReq.params.category; + } + bidResponses.push(bidObj); + }); + } + } + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(err); + } + return bidResponses; + }, + getUserSyncs(syncOptions, serverResponses) { + if (!serverResponses.length || serverResponses[0].body === '' || !serverResponses[0].body.userSyncs) { + return false; + } + const syncs = serverResponses[0].body.userSyncs.map(sync => ({ + type: sync.t === 'p' ? 'image' : 'iframe', + url: sync.u + })); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_12__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_13__.registerModule)('adagioBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","adagioUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adagioBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adagioRtdProvider"],{ + +/***/ "./modules/adagioRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/adagioRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PLACEMENT_SOURCES, storage, _internal, adagioRtdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/adagioUtils/adagioUtils.js */ "./libraries/adagioUtils/adagioUtils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + +/** + * This module adds the adagio provider to the Real Time Data module (rtdModule). + * The {@link module:modules/realTimeData} module is required. + * @module modules/adagioRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + * @typedef {import('../modules/rtdModule/index.js').adUnit} adUnit + */ +const SUBMODULE_NAME = 'adagio'; +const ADAGIO_BIDDER_CODE = 'adagio'; +const GVLID = 617; +const SCRIPT_URL = 'https://script.4dex.io/a/latest/adagio.js'; +const LATEST_ABTEST_VERSION = 2; +const PLACEMENT_SOURCES = { + ORTB: 'ortb', + // implicit default, not used atm. + ADUNITCODE: 'code', + GPID: 'gpid' +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +const { + logError, + logWarn +} = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.prefixLog)('AdagioRtdProvider:'); + +// Guard to avoid storing the same bid data several times. +const guard = new Set(); + +/** + * Store the sampling data. + * This data is used to determine if beacons should be sent to adagio. + * The sampling data + */ +const _SESSION = function () { + /** + * @type {SessionData} + */ + const data = { + session: {} + }; + return { + init: () => { + // helper function to determine if the session is new. + const isNewSession = expiry => { + return !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(expiry) || Date.now() > expiry; + }; + storage.getDataFromLocalStorage('adagio', storageValue => { + // session can be an empty object + const { + rnd, + vwSmplg, + vwSmplgNxt, + expiry, + lastActivityTime, + id, + pages, + testName: legacyTestName, + testVersion: legacyTestVersion + } = _internal.getSessionFromLocalStorage(storageValue); + const isNewSess = isNewSession(expiry); + const abTest = _internal.getAbTestFromLocalStorage(storageValue); + + // if abTest is defined it means that the website is using the new version of the snippet + const v = abTest ? LATEST_ABTEST_VERSION : undefined; + data.session = { + rnd, + pages: pages || 1, + new: isNewSess, + // legacy: `new` was used but the choosen name is not good. + // Don't use values if they are not defined. + ...(v !== undefined && { + v + }), + ...(vwSmplg !== undefined && { + vwSmplg + }), + ...(vwSmplgNxt !== undefined && { + vwSmplgNxt + }), + ...(expiry !== undefined && { + expiry + }), + ...(lastActivityTime !== undefined && { + lastActivityTime + }), + // legacy: used by older version of the snippet + ...(id !== undefined && { + id + }) + }; + if (isNewSess) { + data.session.new = true; + data.session.id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + data.session.rnd = Math.random(); + } + if (v === LATEST_ABTEST_VERSION) { + const { + testName, + testVersion, + expiry: abTestExpiry, + sessionId + } = abTest; + if (abTestExpiry && abTestExpiry > Date.now() && (!sessionId || sessionId === data.session.id)) { + // if AbTest didn't set a session id, it's probably because it's a new one and it didn't retrieve it yet, assume it's okay to get test Name and Version. + if (testName && testVersion) { + data.session.testName = testName; + data.session.testVersion = testVersion; + } + } + } else { + if (legacyTestName && legacyTestVersion) { + data.session.testName = legacyTestName; + data.session.testVersion = legacyTestVersion; + } + } + _internal.getAdagioNs().queue.push({ + action: 'session', + ts: Date.now(), + data: { + session: { + ...data.session + } + } + }); + }); + }, + get: function () { + return data.session; + } + }; +}(); +const _FEATURES = function () { + /** + * @type {Features} + */ + const features = { + initialized: false, + data: {} + }; + return { + // reset is used for testing purpose + reset: function () { + features.initialized = false; + features.data = {}; + }, + get: function () { + const w = (0,_libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_3__.getBestWindowForAdagio)(); + if (!features.initialized) { + features.data = { + page_dimensions: getPageDimensions().toString(), + viewport_dimensions: getViewPortDimensions().toString(), + user_timestamp: getTimestampUTC().toString(), + dom_loading: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDomLoadingDuration)(w).toString() + }; + features.initialized = true; + } + return { + ...features.data + }; + } + }; +}(); +const _internal = { + getAdagioNs: function () { + return _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_3__._ADAGIO; + }, + getSession: function () { + return _SESSION; + }, + getFeatures: function () { + return _FEATURES; + }, + getGuard: function () { + return guard; + }, + /** + * Ensure that the bidder is Adagio. + * + * @param {string} alias + * @returns {boolean} + */ + isAdagioBidder: function (alias) { + if (!alias) { + return false; + } + return (alias + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].aliasRegistry[alias]).toLowerCase().includes(ADAGIO_BIDDER_CODE); + }, + /** + * Returns the session data from the localStorage. + * + * @param {string} storageValue - The value stored in the localStorage. + * @returns {Session} + */ + getSessionFromLocalStorage: function (storageValue) { + const _default = { + new: true, + rnd: Math.random() + }; + const obj = this.getObjFromStorageValue(storageValue); + return !obj || !obj.session ? _default : obj.session; + }, + /** + * Returns the abTest data from the localStorage. + * + * @param {string} storageValue - The value stored in the localStorage. + * @returns {AbTest} + */ + getAbTestFromLocalStorage: function (storageValue) { + const obj = this.getObjFromStorageValue(storageValue); + return !obj || !obj.abTest ? null : obj.abTest; + }, + /** + * Returns the parsed data from the localStorage. + * + * @param {string} storageValue - The value stored in the localStorage. + * @returns {Object} + */ + getObjFromStorageValue: function (storageValue) { + return JSON.parse(storageValue, function (name, value) { + if (name.charAt(0) !== '_' || name === '') { + return value; + } + }); + } +}; +function loadAdagioScript(config) { + storage.localStorageIsEnabled(isValid => { + if (!isValid) { + return; + } + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_5__.loadExternalScript)(SCRIPT_URL, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, SUBMODULE_NAME, undefined, undefined, { + id: `adagiojs-${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifierStr)()}`, + 'data-pid': config.params.organizationId + }); + }); +} + +/** + * Initialize the Adagio RTD Module. + * @param {Object} config + * @param {Object} _userConsent + * @returns {boolean} + */ +function init(config, _userConsent) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(config.params?.organizationId) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(config.params?.site)) { + logError('organizationId is required and must be a string.'); + return false; + } + _internal.getAdagioNs().hasRtd = true; + _internal.getSession().init(); + registerEventsForAdServers(config); + loadAdagioScript(config); + return true; +} + +/** + * onBidRequest is called for each bidder during an auction and contains the bids for that bidder. + * + * @param {*} bidderRequest + * @param {*} config + * @param {*} _userConsent + */ +function onBidRequest(bidderRequest, config, _userConsent) { + // setTimeout trick to ensure that the `bidderRequest.params` values updated by a bidder adapter are taken into account. + // @todo: Check why we have to do it like this, and if there is a better way. Check how the event is dispatched in rtdModule/index.js + setTimeout(() => { + bidderRequest.bids.forEach(bid => { + const uid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'ortb2.site.ext.data.adg_rtd.uid'); + if (!uid) { + logError('The `uid` is required to store the request in the ADAGIO namespace.'); + return; + } + + // No need to store the same info several times. + // `uid` is unique as it is generated by the RTD module itself for each auction. + const key = `${bid.adUnitCode}-${uid}`; + if (_internal.getGuard().has(key)) { + return; + } + _internal.getGuard().add(key); + storeRequestInAdagioNS(bid, config); + }); + }, 1); +} + +/** + * onGetBidRequestData is called once per auction. + * Update both the `ortb2Fragments` and `ortb2Imp` objects with features computed for Adagio. + * + * @param {*} bidReqConfig + * @param {*} callback + * @param {*} config + */ +function onGetBidRequestData(bidReqConfig, callback, config) { + const configParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(config, 'params', {}); + const { + site: ortb2Site + } = bidReqConfig.ortb2Fragments.global; + const features = _internal.getFeatures().get(); + const ext = { + uid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + pageviewId: _libraries_adagioUtils_adagioUtils_js__WEBPACK_IMPORTED_MODULE_3__._ADAGIO.pageviewId, + features: { + ...features + }, + session: { + ..._SESSION.get() + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Site, `ext.data.adg_rtd`, ext); + const adUnits = bidReqConfig.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.getGlobal)().adUnits || []; + adUnits.forEach(adUnit => { + adUnit.ortb2Imp = adUnit.ortb2Imp || {}; + const ortb2Imp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, 'ortb2Imp'); + + // A divId is required to compute the slot position and later to track viewability. + // If nothing has been explicitly set, we try to get the divId from the GPT slot and fallback to the adUnit code in last resort. + let divId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Imp, 'ext.data.divId'); + if (!divId) { + divId = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_9__.getGptSlotInfoForAdUnitCode)(adUnit.code).divId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Imp, `ext.data.divId`, divId || adUnit.code); + } + const slotPosition = getSlotPosition(divId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Imp, `ext.data.adg_rtd.adunit_position`, slotPosition); + + // It is expected that the publisher set a `adUnits[].ortb2Imp.ext.data.placement` value. + // Btw, We allow fallback sources to programmatically set this value. + // The source is defined in the `config.params.placementSource` and the possible values are `code` or `gpid`. + // (Please note that this `placement` is not related to the oRTB video property.) + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Imp, 'ext.data.placement')) { + const { + placementSource = '' + } = configParams; + switch (placementSource.toLowerCase()) { + case PLACEMENT_SOURCES.ADUNITCODE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Imp, 'ext.data.placement', adUnit.code); + break; + case PLACEMENT_SOURCES.GPID: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Imp, 'ext.data.placement', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Imp, 'ext.gpid')); + break; + default: + logWarn('`ortb2Imp.ext.data.placement` is missing and `params.definePlacement` is not set in the config.'); + } + } + + // We expect that `pagetype`, `category`, `placement` are defined in FPD `ortb2.site.ext.data` and `adUnits[].ortb2Imp.ext.data` objects. + // Btw, we have to ensure compatibility with publishers that use the "legacy" adagio params at the adUnit.params level. + const adagioBid = adUnit.bids.find(bid => _internal.isAdagioBidder(bid.bidder)); + if (adagioBid) { + // ortb2 level + let mustWarnOrtb2 = false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Site, 'ext.data.pagetype') && adagioBid.params.pagetype) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Site, 'ext.data.pagetype', adagioBid.params.pagetype); + mustWarnOrtb2 = true; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Site, 'ext.data.category') && adagioBid.params.category) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Site, 'ext.data.category', adagioBid.params.category); + mustWarnOrtb2 = true; + } + + // ortb2Imp level + let mustWarnOrtb2Imp = false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Imp, 'ext.data.placement')) { + if (adagioBid.params.placement) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2Imp, 'ext.data.placement', adagioBid.params.placement); + mustWarnOrtb2Imp = true; + } + } + if (mustWarnOrtb2) { + logWarn('`pagetype` and `category` must be defined in the FPD `ortb2.site.ext.data` object. Relying on `adUnits[].bids.adagio.params` is deprecated.'); + } + if (mustWarnOrtb2Imp) { + logWarn('`placement` must be defined in the FPD `adUnits[].ortb2Imp.ext.data` object. Relying on `adUnits[].bids.adagio.params` is deprecated.'); + } + } + }); + callback(); +} +const adagioRtdSubmodule = { + name: SUBMODULE_NAME, + gvlid: GVLID, + init: init, + getBidRequestData: onGetBidRequestData, + onBidRequestEvent: onBidRequest +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_10__.submodule)('realTimeData', adagioRtdSubmodule); + +// --- +// +// internal functions moved from adagioBidAdapter.js to adagioRtdProvider.js. +// +// Several of these functions could be redistribued in Prebid.js core or in a library +// +// --- + +/** + * storeRequestInAdagioNS store ad-units in the ADAGIO namespace for further usage. + * Not all the properties are stored, only the ones that are useful for adagio.js. + * + * @param {*} bid - The bid object. Correspond to the bidRequest.bids[i] object. + * @param {*} config - The RTD module configuration. + * @returns {void} + */ +function storeRequestInAdagioNS(bid, config) { + try { + const { + bidder, + adUnitCode, + mediaTypes, + params, + auctionId, + bidderRequestsCount, + ortb2, + ortb2Imp + } = bid; + const { + organizationId, + site + } = config.params; + const ortb2Data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2, 'site.ext.data', {}); + const ortb2ImpData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Imp, 'ext.data', {}); + + // TODO: `bidderRequestsCount` must be incremented with s2s context, actually works only for `client` context + // see: https://github.com/prebid/Prebid.js/pull/11295/files#diff-d5c9b255c545e5097d1cd2f49e7dad309b731e34d788f9c28432ad43ebcd7785L114 + const data = { + bidder, + adUnitCode, + mediaTypes, + params, + auctionId, + bidderRequestsCount, + ortb2: ortb2Data, + ortb2Imp: ortb2ImpData, + localPbjs: "pbjs", + localPbjsRef: (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.getGlobal)(), + organizationId, + site + }; + _internal.getAdagioNs().queue.push({ + action: 'store', + ts: Date.now(), + data + }); + } catch (e) { + logError(e); + } +} +function getElementFromTopWindow(element, currentWindow) { + try { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)() === currentWindow) { + if (!element.getAttribute('id')) { + element.setAttribute('id', `adg-${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifierStr)()}`); + } + return element; + } else { + const frame = currentWindow.frameElement; + const frameClientRect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_11__.getBoundingClientRect)(frame); + const elementClientRect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_11__.getBoundingClientRect)(element); + if (frameClientRect.width !== elementClientRect.width || frameClientRect.height !== elementClientRect.height) { + return false; + } + return getElementFromTopWindow(frame, currentWindow.parent); + } + } catch (err) { + logWarn(err); + return false; + } +} +; +function getSlotPosition(divId) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isSafeFrameWindow)() && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.canAccessWindowTop)()) { + return ''; + } + const position = { + x: 0, + y: 0 + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isSafeFrameWindow)()) { + const { + self + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getSafeframeGeometry)() || {}; + if (!self) { + return ''; + } + position.x = Math.round(self.t); + position.y = Math.round(self.l); + } else { + try { + // window.top based computing + const wt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(); + const d = wt.document; + let domElement; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.inIframe)() === true) { + const ws = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)(); + const currentElement = ws.document.getElementById(divId); + domElement = getElementFromTopWindow(currentElement, ws); + } else { + domElement = wt.document.getElementById(divId); + } + if (!domElement) { + return ''; + } + let box = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_11__.getBoundingClientRect)(domElement); + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)(); + const body = d.body; + const clientTop = d.clientTop || body.clientTop || 0; + const clientLeft = d.clientLeft || body.clientLeft || 0; + const scrollTop = wt.pageYOffset || windowDimensions.document.documentElement.scrollTop || windowDimensions.document.body.scrollTop; + const scrollLeft = wt.pageXOffset || windowDimensions.document.documentElement.scrollLeft || windowDimensions.document.body.scrollLeft; + const elComputedStyle = wt.getComputedStyle(domElement, null); + const mustDisplayElement = elComputedStyle.display === 'none'; + if (mustDisplayElement) { + logWarn('The element is hidden. The slot position cannot be computed.'); + } + position.x = Math.round(box.left + scrollLeft - clientLeft); + position.y = Math.round(box.top + scrollTop - clientTop); + } catch (err) { + logError(err); + return ''; + } + } + return `${position.x}x${position.y}`; +} +function getPageDimensions() { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isSafeFrameWindow)() || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.canAccessWindowTop)()) { + return ''; + } + + // the page dimension can be computed on window.top only. + const wt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(); + const body = wt.document.querySelector('body'); + if (!body) { + return ''; + } + const html = wt.document.documentElement; + const pageWidth = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth); + const pageHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); + return `${pageWidth}x${pageHeight}`; +} +function getViewPortDimensions() { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isSafeFrameWindow)() && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.canAccessWindowTop)()) { + return ''; + } + const viewportDims = { + w: 0, + h: 0 + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isSafeFrameWindow)()) { + const { + win + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getSafeframeGeometry)() || {}; + if (!win) { + return ''; + } + viewportDims.w = Math.round(win.w); + viewportDims.h = Math.round(win.h); + } else { + // window.top based computing + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)(); + viewportDims.w = innerWidth; + viewportDims.h = innerHeight; + } + return `${viewportDims.w}x${viewportDims.h}`; +} +function getTimestampUTC() { + // timestamp returned in seconds + return Math.floor(new Date().getTime() / 1000) - new Date().getTimezoneOffset() * 60; +} + +/** + * registerEventsForAdServers bind adagio listeners to ad-server events. + * Theses events are used to track the viewability and attention. + * + * @param {*} config + * @returns {void} + */ +function registerEventsForAdServers(config) { + const GPT_EVENTS = new Set(['impressionViewable', 'slotRenderEnded', 'slotVisibilityChanged']); + const SAS_EVENTS = new Set(['noad', 'setHeaderBiddingWinner']); + const AST_EVENTS = new Set(['adLoaded']); + + // Listen to ad-server events in current window + // as we can be safe in a Post-Bid scenario. + const ws = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)(); + + // Keep a reference to the window on which the listener is attached. + // this is used to avoid to bind event several times. + if (!Array.isArray(_internal.getAdagioNs().windows)) { + _internal.getAdagioNs().windows = []; + } + let selfStoredWindow = _internal.getAdagioNs().windows.find(_w => _w.self === ws); + if (!selfStoredWindow) { + selfStoredWindow = { + self: ws + }; + _internal.getAdagioNs().windows.push(selfStoredWindow); + } + const register = (namespace, command, selfWindow, adserver, cb) => { + try { + if (selfWindow.adserver === adserver) { + return; + } + ws[namespace] = ws[namespace] || {}; + ws[namespace][command] = ws[namespace][command] || []; + cb(); + } catch (e) { + logError(e); + } + }; + register('googletag', 'cmd', ws, 'gpt', () => { + ws.googletag.cmd.push(() => { + GPT_EVENTS.forEach(eventName => { + ws.googletag.pubads().addEventListener(eventName, args => { + _internal.getAdagioNs().queue.push({ + action: 'gpt-event', + data: { + eventName, + args, + _window: ws + }, + ts: Date.now() + }); + }); + }); + selfStoredWindow.adserver = 'gpt'; + }); + }); + register('sas', 'cmd', ws, 'sas', () => { + ws.sas.cmd.push(() => { + SAS_EVENTS.forEach(eventName => { + ws.sas.events.on(eventName, args => { + _internal.getAdagioNs().queue.push({ + action: 'sas-event', + data: { + eventName, + args, + _window: ws + }, + ts: Date.now() + }); + }); + }); + selfStoredWindow.adserver = 'sas'; + }); + }); + + // https://learn.microsoft.com/en-us/xandr/seller-tag/on-event + register('apntag', 'anq', ws, 'ast', () => { + ws.apntag.anq.push(() => { + AST_EVENTS.forEach(eventName => { + ws.apntag.onEvent(eventName, function () { + _internal.getAdagioNs().queue.push({ + action: 'ast-event', + data: { + eventName, + args: arguments, + _window: ws + }, + ts: Date.now() + }); + }); + }); + selfStoredWindow.adserver = 'ast'; + }); + }); +} +; + +// --- end of internal functions ----- // + +/** + * @typedef {Object} AdagioWindow + * @property {Window} self + * @property {string} adserver - 'gpt', 'sas', 'ast' + */ + +/** + * @typedef {Object} AdagioGlobal + * @property {Object} adUnits + * @property {Array} pbjsAdUnits + * @property {Array} queue + * @property {Array} windows + */ + +/** + * @typedef {Object} Session + * @property {string} id - uuid of the session. + * @property {boolean} new - True if the session is new. + * @property {number} rnd - Random number used to determine if the session is new. + * @property {number} vwSmplg - View sampling rate. + * @property {number} vwSmplgNxt - Next view sampling rate. + * @property {number} expiry - Timestamp after which session should be considered expired. + * @property {number} lastActivityTime - Last activity time. + * @property {number} pages - current number of pages seen. + * @property {string} testName - The test name defined by the publisher. Legacy only present for websites with older abTest snippet. + * @property {string} testVersion - 'clt', 'srv'. Legacy only present for websites with older abTest snippet. + */ + +/** + * @typedef {Object} AbTest + * @property {string} testName - The test name defined by the publisher. + * @property {string} testVersion - 'clt', 'srv'. + * @property {string} sessionId - uuid of the session. + * @property {number} expiry - Timestamp after which session should be considered expired. + */ + +/** + * @typedef {Object} SessionData + * @property {Session} session - the session data. + */ + +/** + * @typedef {Object} Features + * @property {boolean} initialized - True if the features are initialized. + * @property {Object} data - the features data. + */ +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adagioRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","boundingClientRect","adagioUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adagioRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adbutlerBidAdapter"],{ + +/***/ "./modules/adbutlerBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/adbutlerBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'adbutler'; +function getTrackingPixelsMarkup(pixelURLs) { + return pixelURLs.map(pixelURL => ``).join(); +} +const spec = { + code: BIDDER_CODE, + pageID: Math.floor(Math.random() * 10e6), + aliases: ['divreach', 'doceree'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid(bid) { + return !!(bid.params.accountID && bid.params.zoneID); + }, + buildRequests(validBidRequests) { + const zoneCounters = {}; + return _src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map(validBidRequests, function (bidRequest) { + const zoneID = bidRequest.params?.zoneID; + zoneCounters[zoneID] ??= 0; + const domain = bidRequest.params?.domain ?? 'servedbyadbutler.com'; + const adserveBase = `https://${domain}/adserve`; + const params = { + ...(bidRequest.params?.extra ?? {}), + ID: bidRequest.params?.accountID, + type: 'hbr', + setID: zoneID, + pid: spec.pageID, + place: zoneCounters[zoneID], + kw: bidRequest.params?.keyword + }; + const paramsString = Object.entries(params).map(_ref => { + let [key, value] = _ref; + return `${key}=${value}`; + }).join(';'); + const requestURI = `${adserveBase}/;${paramsString};`; + zoneCounters[zoneID]++; + return { + method: 'GET', + url: requestURI, + data: {}, + bidRequest + }; + }); + }, + interpretResponse(serverResponse, serverRequest) { + const bidObj = serverRequest.bidRequest; + const response = serverResponse.body ?? {}; + if (!bidObj || response.status !== 'SUCCESS') { + return []; + } + const width = parseInt(response.width); + const height = parseInt(response.height); + const sizeValid = (bidObj.mediaTypes?.banner?.sizes ?? []).some(_ref2 => { + let [w, h] = _ref2; + return w === width && h === height; + }); + if (!sizeValid) { + return []; + } + const cpm = response.cpm; + const minCPM = bidObj.params?.minCPM ?? null; + const maxCPM = bidObj.params?.maxCPM ?? null; + if (minCPM !== null && cpm < minCPM) { + return []; + } + if (maxCPM !== null && cpm > maxCPM) { + return []; + } + let advertiserDomains = []; + if (response.advertiser?.domain) { + advertiserDomains.push(response.advertiser.domain); + } + const bidResponse = { + requestId: bidObj.bidId, + cpm, + currency: 'USD', + width, + height, + ad: response.ad_code + getTrackingPixelsMarkup(response.tracking_pixels), + ttl: 360, + creativeId: response.placement_id, + netRevenue: true, + meta: { + advertiserId: response.advertiser?.id, + advertiserName: response.advertiser?.name, + advertiserDomains + } + }; + return [bidResponse]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('adbutlerBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adbutlerBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["addefendBidAdapter"],{ + +/***/ "./modules/addefendBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/addefendBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + +const BIDDER_CODE = 'addefend'; +const spec = { + code: BIDDER_CODE, + hostname: 'https://addefend-platform.com', + getHostname() { + return this.hostname; + }, + isBidRequestValid: function (bid) { + return bid.sizes !== undefined && bid.bidId !== undefined && bid.params !== undefined && bid.params.pageId !== undefined && typeof bid.params.pageId === 'string' && bid.params.placementId !== undefined && typeof bid.params.placementId === 'string'; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let bid = { + v: 'v' + "9.45.0-pre", + auctionId: false, + pageId: false, + gdpr_applies: bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? bidderRequest.gdprConsent.gdprApplies : 'true', + gdpr_consent: bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString : '', + // TODO: is 'page' the correct item here? + referer: bidderRequest.refererInfo.page, + bids: [] + }; + for (var i = 0; i < validBidRequests.length; i++) { + let vb = validBidRequests[i]; + let o = vb.params; + // TODO: fix auctionId/transactionId leak: https://github.com/prebid/Prebid.js/issues/9781 + bid.auctionId = vb.auctionId; + o.bidId = vb.bidId; + o.transactionId = vb.transactionId; + o.sizes = []; + if (o.trafficTypes) { + bid.trafficTypes = o.trafficTypes; + } + delete o.trafficTypes; + bid.pageId = o.pageId; + delete o.pageId; + if (vb.sizes && Array.isArray(vb.sizes)) { + for (var j = 0; j < vb.sizes.length; j++) { + let s = vb.sizes[j]; + if (Array.isArray(s) && s.length == 2) { + o.sizes.push(s[0] + 'x' + s[1]); + } + } + } + bid.bids.push(o); + } + return [{ + method: 'POST', + url: this.getHostname() + '/bid', + options: { + withCredentials: true + }, + data: bid + }]; + }, + interpretResponse: function (serverResponse, request) { + const requiredKeys = ['requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId', 'netRevenue', 'currency', 'advertiserDomains']; + const validBidResponses = []; + serverResponse = serverResponse.body; + if (serverResponse && serverResponse.length > 0) { + serverResponse.forEach(bid => { + const bidResponse = {}; + for (const requiredKey of requiredKeys) { + if (!bid.hasOwnProperty(requiredKey)) { + return []; + } + bidResponse[requiredKey] = bid[requiredKey]; + } + validBidResponses.push(bidResponse); + }); + } + return validBidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_0__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('addefendBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/addefendBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adfBidAdapter"],{ + +/***/ "./modules/adfBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/adfBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + + +const { + getConfig +} = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config; +const BIDDER_CODE = 'adf'; +const GVLID = 50; +const BIDDER_ALIAS = [{ + code: 'adformOpenRTB', + gvlid: GVLID +}, { + code: 'adform', + gvlid: GVLID +}]; +const OUTSTREAM_RENDERER_URL = 'https://s2.adform.net/banners/scripts/video/outstream/render.js'; +const spec = { + code: BIDDER_CODE, + aliases: BIDDER_ALIAS, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: bid => { + const params = bid.params || {}; + const { + mid, + inv, + mname + } = params; + return !!(mid || inv && mname); + }, + buildRequests: (validBidRequests, bidderRequest) => { + let app, site; + const commonFpd = bidderRequest.ortb2 || {}; + let user = commonFpd.user || {}; + if (typeof getConfig('app') === 'object') { + app = getConfig('app') || {}; + if (commonFpd.app) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(app, commonFpd.app); + } + } else { + site = getConfig('site') || {}; + if (commonFpd.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(site, commonFpd.site); + } + if (!site.page) { + site.page = bidderRequest.refererInfo.page; + } + } + let device = getConfig('device') || {}; + if (commonFpd.device) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(device, commonFpd.device); + } + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)(); + device.w = device.w || innerWidth; + device.h = device.h || innerHeight; + device.ua = device.ua || navigator.userAgent; + let source = commonFpd.source || {}; + source.fd = 1; + let regs = commonFpd.regs || {}; + const adxDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'params.adxDomain') || 'adx.adform.net'; + const pt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'params.pt') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'params.priceType') || 'net'; + const test = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'params.test'); + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest); + const cur = currency && [currency]; + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'userIdAsEids'); + const schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'schain'); + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(user, 'ext.eids', eids); + } + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(source, 'ext.schain', schain); + } + const imp = validBidRequests.map((bid, id) => { + bid.netRevenue = pt; + const floorInfo = bid.getFloor ? bid.getFloor({ + currency: currency || 'USD', + size: '*', + mediaType: '*' + }) : {}; + const bidfloor = floorInfo?.floor; + const bidfloorcur = floorInfo?.currency; + const { + mid, + inv, + mname + } = bid.params; + const impExtData = bid.ortb2Imp?.ext?.data; + const imp = { + id: id + 1, + tagid: mid, + bidfloor, + bidfloorcur, + ext: { + data: impExtData, + bidder: { + inv, + mname + } + } + }; + if (bid.nativeOrtbRequest && bid.nativeOrtbRequest.assets) { + let assets = bid.nativeOrtbRequest.assets; + let requestAssets = []; + for (let i = 0; i < assets.length; i++) { + let asset = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(assets[i]); + let img = asset.img; + if (img) { + let aspectratios = img.ext && img.ext.aspectratios; + if (aspectratios) { + let ratioWidth = parseInt(aspectratios[0].split(':')[0], 10); + let ratioHeight = parseInt(aspectratios[0].split(':')[1], 10); + img.wmin = img.wmin || 0; + img.hmin = ratioHeight * img.wmin / ratioWidth | 0; + } + } + requestAssets.push(asset); + } + imp.native = { + request: { + assets: requestAssets + } + }; + } + const bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.banner'); + if (bannerParams && bannerParams.sizes) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(bannerParams.sizes); + const format = sizes.map(size => { + const [width, height] = size.split('x'); + const w = parseInt(width, 10); + const h = parseInt(height, 10); + return { + w, + h + }; + }); + imp.banner = { + format + }; + } + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video'); + if (videoParams) { + imp.video = videoParams; + } + return imp; + }); + const request = { + id: bidderRequest.bidderRequestId, + site, + app, + user, + device, + source, + ext: { + pt + }, + cur, + imp, + regs + }; + if (test) { + request.is_debug = !!test; + request.test = 1; + } + return { + method: 'POST', + url: 'https://' + adxDomain + '/adx/openrtb', + data: JSON.stringify(request), + bids: validBidRequests + }; + }, + interpretResponse: function (serverResponse, _ref) { + let { + bids + } = _ref; + if (!serverResponse.body) { + return; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidResponses = flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => { + result[bid.impid - 1] = bid; + return result; + }, []); + return bids.map((bid, id) => { + const bidResponse = bidResponses[id]; + if (bidResponse) { + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidResponse, 'ext.prebid.type'); + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidResponse, 'ext.dsa'); + const result = { + requestId: bid.bidId, + cpm: bidResponse.price, + creativeId: bidResponse.crid, + ttl: 360, + netRevenue: bid.netRevenue === 'net', + currency: cur, + mediaType, + width: bidResponse.w, + height: bidResponse.h, + dealId: bidResponse.dealid, + meta: { + mediaType, + advertiserDomains: bidResponse.adomain, + dsa, + primaryCatId: bidResponse.cat?.[0], + secondaryCatIds: bidResponse.cat?.slice(1) + } + }; + if (bidResponse.native) { + result.native = { + ortb: bidResponse.native + }; + } else { + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + result.vastXml = bidResponse.adm; + if (bidResponse.nurl) { + result.vastUrl = bidResponse.nurl; + } + } else { + result.ad = bidResponse.adm; + } + } + if (!bid.renderer && mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.context') === 'outstream') { + result.renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__.Renderer.install({ + id: bid.bidId, + url: OUTSTREAM_RENDERER_URL, + adUnitCode: bid.adUnitCode + }); + result.renderer.setRender(renderer); + } + return result; + } + }).filter(Boolean); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +function flatten(arr) { + return [].concat(...arr); +} +function renderer(bid) { + bid.renderer.push(() => { + window.Adform.renderOutstream(bid); + }); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adfBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adfBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adfusionBidAdapter"],{ + +/***/ "./modules/adfusionBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/adfusionBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports REQUEST_URL, DEFAULT_CURRENCY, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const adpterVersion = '1.0'; +const REQUEST_URL = 'https://spicyrtb.com/auction/prebid'; +const DEFAULT_CURRENCY = 'USD'; +const spec = { + code: 'adfusion', + gvlid: 844, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + isBannerBid, + isVideoBid +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: DEFAULT_CURRENCY + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const floor = getBidFloor(bidRequest); + if (floor) { + imp.bidfloor = floor; + imp.bidfloorcur = DEFAULT_CURRENCY; + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + const bid = context.bidRequests[0]; + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep(req, { + at: 1, + ext: { + prebid: { + accountid: bid.params.accountId, + adapterVersion: `${adpterVersion}` + } + } + }); + return req; + }, + response(buildResponse, bidResponses, ortbResponse, context) { + const response = buildResponse(bidResponses, ortbResponse, context); + return response.bids; + } +}); +function isBidRequestValid(bidRequest) { + const isValid = bidRequest.params.accountId; + if (!isValid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError('AdFusion adapter bidRequest has no accountId'); + return false; + } + return true; +} +function buildRequests(bids, bidderRequest) { + let videoBids = bids.filter(bid => isVideoBid(bid)); + let bannerBids = bids.filter(bid => isBannerBid(bid)); + let requests = bannerBids.length ? [createRequest(bannerBids, bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)] : []; + videoBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)); + }); + return requests; +} +function createRequest(bidRequests, bidderRequest, mediaType) { + return { + method: 'POST', + url: REQUEST_URL, + data: converter.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }) + }; +} +function isVideoBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bid, 'mediaTypes.video'); +} +function isBannerBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bid, 'mediaTypes.banner'); +} +function interpretResponse(resp, req) { + return converter.fromORTB({ + request: req.data, + response: resp.body + }); +} +function getBidFloor(bid) { + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn(bid.getFloor)) { + let floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: '*', + size: '*' + }); + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + return floor.floor; + } + } + return null; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adfusionBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adfusionBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adgenerationBidAdapter"],{ + +/***/ "./modules/adgenerationBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/adgenerationBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_htmlEscape_htmlEscape_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/htmlEscape/htmlEscape.js */ "./libraries/htmlEscape/htmlEscape.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + + +const adgLogger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)('Adgeneration: '); + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const ADG_BIDDER_CODE = 'adgeneration'; +const ADGENE_PREBID_VERSION = '1.6.4'; +const DEBUG_URL = 'https://api-test.scaleout.jp/adgen/prebid'; +const URL = 'https://d.socdm.com/adgen/prebid'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + // `netRevenue` and `ttl` are required properties of bid responses - provide a default for them + netRevenue: true, + // or false if your adapter should set bidResponse.netRevenue = false + ttl: 30 // default bidResponse.ttl (when not specified in ORTB response.seatbid[].bid[].exp) + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext.params', bidRequest.params); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext.mediaTypes', bidRequest.mediaTypes); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext.novatiqSyncResponse', bidRequest?.userId?.novatiq?.snowflake?.syncResponse); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + return request; + }, + bidResponse(buildBidResponse, bid, context) { + return buildBidResponse(bid, context); + } +}); +const spec = { + code: ADG_BIDDER_CODE, + aliases: ['adg'], + // short code + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.id; + }, + /** + * Make a server request from the list of BidRequests. + * @param validBidRequests + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const ortbObj = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + adgLogger.logInfo('ortbObj', ortbObj); + const { + imp, + ...rest + } = ortbObj; + const requests = imp.map(impObj => { + const customParams = impObj?.ext?.params; + const id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('id', customParams); + const additionalParams = JSON.parse(JSON.stringify(rest)); + + // hyperIDが有効ではない場合、パラメータから削除する + if (!impObj?.ext?.novatiqSyncResponse || impObj?.ext?.novatiqSyncResponse !== 1) { + if (additionalParams?.user?.ext?.eids && Array.isArray(additionalParams?.user?.ext?.eids)) { + additionalParams.user.ext.eids = additionalParams?.user?.ext?.eids.filter(eid => eid?.source !== 'novatiq.com'); + } + } + let urlParams = ``; + urlParams = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(urlParams, 'id', id); + urlParams = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(urlParams, 'posall', 'SSPLOC'); // not reaquired + urlParams = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(urlParams, 'sdktype', '0'); + + // remove the trailing "&" + if (urlParams.lastIndexOf('&') === urlParams.length - 1) { + urlParams = urlParams.substring(0, urlParams.length - 1); + } + const urlBase = customParams.debug ? customParams.debug_url ? customParams.debug_url : DEBUG_URL : URL; + const url = `${urlBase}?${urlParams}`; + let data = { + currency: getCurrencyType(bidderRequest), + pbver: "9.45.0-pre", + sdkname: 'prebidjs', + adapterver: ADGENE_PREBID_VERSION, + ortb: { + imp: [impObj], + ...additionalParams + } + }; + + // native以外にvideo等の対応が入った場合は要修正 + if (!impObj?.ext?.mediaTypes || !impObj?.ext?.mediaTypes.native) { + data.imark = 1; + } + return { + method: 'POST', + url: url, + data, + options: { + withCredentials: true, + crossOrigin: true + } + }; + }); + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequests + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequests) { + adgLogger.logInfo('serverResponse', JSON.parse(JSON.stringify(serverResponse))); + const body = serverResponse.body; + if (!body.results || body.results.length < 1) { + return []; + } + if (!bidRequests?.data?.ortb?.imp || bidRequests?.data?.ortb?.imp.length < 1) { + return []; + } + const adResult = body?.results[0]; + const targetImp = bidRequests?.data?.ortb?.imp[0]; + const requestId = targetImp?.id; + const bidResponse = { + requestId: requestId, + cpm: adResult.cpm || 0, + width: adResult.w ? adResult.w : 1, + height: adResult.h ? adResult.h : 1, + creativeId: adResult.creativeid || '', + dealId: adResult.dealid || '', + currency: getCurrencyType(bidRequests.bidderRequest), + netRevenue: true, + ttl: adResult.ttl || 10 + }; + if (adResult.adomain && Array.isArray(adResult.adomain) && adResult.adomain.length) { + bidResponse.meta = { + advertiserDomains: adResult.adomain + }; + } + if (isNative(adResult)) { + bidResponse.native = createNativeAd(adResult.native, adResult.beaconurl); + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE; + } else { + // banner + bidResponse.ad = createAd(adResult, body?.location_params, targetImp.ext.params, requestId); + } + return [bidResponse]; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + return syncs; + } +}; +function createAd(adResult, locationPrams, bidParams, requestId) { + adgLogger.logInfo('params', bidParams); + let ad = adResult.ad; + if (adResult.vastxml && adResult.vastxml.length > 0) { + if (isUpperBillboard(locationPrams)) { + const marginTop = bidParams.marginTop ? bidParams.marginTop : '0'; + ad = `${createADGBrowserMTag()}${insertVASTMethodForADGBrowserM(adResult.vastxml, marginTop)}`; + } else { + ad = `
${createAPVTag()}${insertVASTMethodForAPV(requestId, adResult.vastxml)}`; + } + } + ad = appendChildToBody(ad, adResult.beacon); + if (removeWrapper(ad)) return removeWrapper(ad); + return ad; +} +function isUpperBillboard(locationParams) { + if (locationParams && locationParams.option && locationParams.option.ad_type) { + return locationParams.option.ad_type === 'upper_billboard'; + } + return false; +} +function isNative(adResult) { + if (!adResult) return false; + return adResult.native && adResult.native.assets.length > 0; +} +function createNativeAd(nativeAd, beaconUrl) { + let native = {}; + if (nativeAd && nativeAd.assets.length > 0) { + const assets = nativeAd.assets; + for (let i = 0, len = assets.length; i < len; i++) { + switch (assets[i].id) { + case 1: + native.title = assets[i].title.text; + break; + case 2: + native.image = { + url: assets[i].img.url, + height: assets[i].img.h, + width: assets[i].img.w + }; + break; + case 3: + native.icon = { + url: assets[i].img.url, + height: assets[i].img.h, + width: assets[i].img.w + }; + break; + case 4: + native.sponsoredBy = assets[i].data.value; + break; + case 5: + native.body = assets[i].data.value; + break; + case 6: + native.cta = assets[i].data.value; + break; + case 502: + native.privacyLink = encodeURIComponent(assets[i].data.value); + break; + } + } + native.clickUrl = nativeAd.link.url; + native.clickTrackers = nativeAd.link.clicktrackers || []; + native.impressionTrackers = nativeAd.imptrackers || []; + if (beaconUrl && beaconUrl != '') { + native.impressionTrackers.push(beaconUrl); + } + } + return native; +} +function appendChildToBody(ad, data) { + return ad.replace(/<\/\s?body>/, `${data}`); +} + +/** + * create APVTag + * @return {string} + */ +function createAPVTag() { + const APVURL = 'https://cdn.apvdr.com/js/VideoAd.min.js'; + return ``; +} + +/** + * create ADGBrowserMTag + * @return {string} + */ +function createADGBrowserMTag() { + const ADGBrowserMURL = 'https://i.socdm.com/sdk/js/adg-browser-m.js'; + return ``; +} + +/** + * create APVTag & insertVast + * @param targetId + * @param vastXml + * @return {string} + */ +function insertVASTMethodForAPV(targetId, vastXml) { + let apvVideoAdParam = { + s: targetId + }; + return ``; +} + +/** + * create ADGBrowserMTag & insertVast + * @param vastXml + * @param marginTop + * @return {string} + */ +function insertVASTMethodForADGBrowserM(vastXml, marginTop) { + return ``; +} + +/** + * + * @param ad + */ +function removeWrapper(ad) { + const bodyIndex = ad.indexOf(''); + const lastBodyIndex = ad.lastIndexOf(''); + if (bodyIndex === -1 || lastBodyIndex === -1) return false; + return ad.substr(bodyIndex, lastBodyIndex).replace('', '').replace('', ''); +} + +/** + * @return {?string} USD or JPY + */ +function getCurrencyType(bidderRequest) { + const adServerCurrency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_6__.getCurrencyFromBidderRequest)(bidderRequest) || ''; + return adServerCurrency.toUpperCase() === 'USD' ? 'USD' : 'JPY'; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adgenerationBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","ortb2Utils","urlUtils","htmlEscape","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adgenerationBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adgridBidAdapter"],{ + +/***/ "./modules/adgridBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adgridBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports STORAGE, getLocalStorage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/nexx360Utils/index.js */ "./libraries/nexx360Utils/index.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'adgrid'; +const REQUEST_URL = 'https://fast.nexx360.io/adgrid'; +const PAGE_VIEW_ID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +const BIDDER_VERSION = '2.0'; +const ADGRID_KEY = 'adgrid'; +const ALIASES = []; + +// Define the storage manager for the Adgrid bidder +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); + +/** + * Get the agdridId from local storage + * @return {object | false } false if localstorageNotEnabled + */ +function getLocalStorage() { + if (!STORAGE.localStorageIsEnabled()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`localstorage not enabled for Adgrid`); + return false; + } + const output = STORAGE.getDataFromLocalStorage(ADGRID_KEY); + if (output === null) { + const adgridStorage = { + adgridId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)() + }; + STORAGE.setDataInLocalStorage(ADGRID_KEY, JSON.stringify(adgridStorage)); + return adgridStorage; + } + try { + return JSON.parse(output); + } catch (e) { + return false; + } +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + // or false if your adapter should set bidResponse.netRevenue = false + ttl: 90 // default bidResponse.ttl (when not specified in ORTB response.seatbid[].bid[].exp) + }, + imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + imp = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.enrichImp)(imp, bidRequest); + if (bidRequest.params.domainId) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.adgrid.domainId', bidRequest.params.domainId); + if (bidRequest.params.placement) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.adgrid.placement', bidRequest.params.placement); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + const amxId = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.getAmxId)(STORAGE, BIDDER_CODE); + request = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.enrichRequest)(request, amxId, bidderRequest, PAGE_VIEW_ID, BIDDER_VERSION); + return request; + } +}); + +/** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ +function isBidRequestValid(bid) { + if (!bid || !bid.params) return false; + if (typeof bid.params.domainId !== 'number') return false; + if (typeof bid.params.placement !== 'string') return false; + return true; +} + +/** + * Make a server request from the list of BidRequests. + * + * @return ServerRequest Info describing the request to the server. + */ +function buildRequests(bidRequests, bidderRequest) { + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: REQUEST_URL, + data + }; +} + +/** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ +function interpretResponse(serverResponse) { + const respBody = serverResponse.body; + if (!respBody || !Array.isArray(respBody.seatbid)) { + return []; + } + const responses = []; + for (let i = 0; i < respBody.seatbid.length; i++) { + const seatbid = respBody.seatbid[i]; + for (let j = 0; j < seatbid.bid.length; j++) { + const bid = seatbid.bid[j]; + const response = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.createResponse)(bid, respBody); + responses.push(response); + } + } + return responses; +} +const spec = { + code: BIDDER_CODE, + aliases: ALIASES, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs: _libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('adgridBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","ortb2Utils","nexx360Utils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adgridBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adhashBidAdapter"],{ + +/***/ "./modules/adhashBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adhashBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const VERSION = '3.6'; +const BAD_WORD_STEP = 0.1; +const BAD_WORD_MIN = 0.2; +const ADHASH_BIDDER_CODE = 'adhash'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: ADHASH_BIDDER_CODE +}); + +/** + * Function that checks the page where the ads are being served for brand safety. + * If unsafe words are found the scoring of that page increases. + * If it becomes greater than the maximum allowed score false is returned. + * The rules may vary based on the website language or the publisher. + * The AdHash bidder will not bid on unsafe pages (according to 4A's). + * @param badWords list of scoring rules to chech against + * @param maxScore maximum allowed score for that bidding + * @returns boolean flag is the page safe + */ +function brandSafety(badWords, maxScore) { + const delimiter = '~'; + + /** + * Performs the ROT13 encoding on the string argument and returns the resulting string. + * The Adhash bidder uses ROT13 so that the response is not blocked by: + * - ad blocking software + * - parental control software + * - corporate firewalls + * due to the bad words contained in the response. + * @param value The input string. + * @returns string Returns the ROT13 version of the given string. + */ + const rot13 = value => { + const input = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + const output = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'; + const index = x => input.indexOf(x); + const translate = x => index(x) > -1 ? output[index(x)] : x; + return value.split('').map(translate).join(''); + }; + + /** + * Calculates the scoring for each bad word with dimishing returns + * @param {number} points points that this word costs + * @param {number} occurrences number of occurrences + * @returns {number} final score + */ + const scoreCalculator = (points, occurrences) => { + let positive = true; + if (points < 0) { + points *= -1; + positive = false; + } + let result = 0; + for (let i = 0; i < occurrences; i++) { + result += Math.max(points - i * BAD_WORD_STEP, BAD_WORD_MIN); + } + return positive ? result : -result; + }; + + /** + * Checks what rule will match in the given array with words + * @param {string} rule rule type (full, partial, starts, ends, regexp) + * @param {string} decodedWord decoded word + * @param {string} wordsToMatch list of all words on the page separated by delimiters + * @returns {object|boolean} matched rule and occurances. If nothing is matched returns false + */ + const wordsMatchedWithRule = function (rule, decodedWord, wordsToMatch) { + if (!wordsToMatch) { + return false; + } + let occurrences; + let adjustedWordToMatch; + decodedWord = decodedWord.split(' ').join(`${delimiter}${delimiter}`); + switch (rule) { + case 'full': + adjustedWordToMatch = `${delimiter}${decodedWord}${delimiter}`; + break; + case 'partial': + adjustedWordToMatch = decodedWord; + break; + case 'starts': + adjustedWordToMatch = `${delimiter}${decodedWord}`; + break; + case 'ends': + adjustedWordToMatch = `${decodedWord}${delimiter}`; + break; + case 'combo': + const allOccurrences = []; + const paddedWordsToMatch = `${delimiter}${wordsToMatch}${delimiter}`; + const decodedWordsSplit = decodedWord.split(`${delimiter}${delimiter}`); + for (const decodedWordPart of decodedWordsSplit) { + adjustedWordToMatch = `${delimiter}${decodedWordPart}${delimiter}`; + allOccurrences.push(paddedWordsToMatch.split(adjustedWordToMatch).length - 1); + } + occurrences = Math.min(...allOccurrences); + return occurrences > 0 ? { + rule, + occurrences + } : false; + case 'regexp': + occurrences = [...wordsToMatch.matchAll(new RegExp(decodedWord, 'gi'))].length; + return occurrences > 0 ? { + rule, + occurrences + } : false; + default: + return false; + } + const paddedWordsToMatch = `${delimiter}${wordsToMatch}${delimiter}`; + occurrences = paddedWordsToMatch.split(adjustedWordToMatch).length - 1; + return occurrences > 0 ? { + rule, + occurrences + } : false; + }; + + // Default parameters if the bidder is unable to send some of them + badWords = badWords || []; + maxScore = parseInt(maxScore) || 10; + try { + let score = 0; + const decodedUrl = decodeURI(window.top.location.href.substring(window.top.location.origin.length)); + const wordsAndNumbersInUrl = decodedUrl.replaceAll(/[-,\._/\?=&#%]/g, ' ').replaceAll(/\s\s+/g, ' ').toLowerCase().trim(); + const content = window.top.document.body.textContent.toLowerCase(); + // \p{L} matches a single unicode code point in the category 'letter'. Matches any kind of letter from any language. + const regexp = new RegExp('[\\p{L}]+', 'gu'); + const wordsMatched = content.match(regexp); + const words = wordsMatched.join(`${delimiter}${delimiter}`); + const wordsInUrl = wordsAndNumbersInUrl.match(regexp).join(`${delimiter}${delimiter}`); + for (const [word, rule, points] of badWords) { + const decodedWord = rot13(word.toLowerCase()); + + // Checks the words in the url of the page only for negative words. Don't serve any ad when at least one match is found + if (points > 0) { + const matchedRuleInUrl = wordsMatchedWithRule(rule, decodedWord, wordsInUrl); + if (matchedRuleInUrl.rule) { + return false; + } + } + + // Check if site content's words match any of our brand safety rules + const matchedRule = wordsMatchedWithRule(rule, decodedWord, words); + if (matchedRule !== false) { + score += scoreCalculator(points, matchedRule.occurrences); + } + } + return score < maxScore * wordsMatched.length / 1000; + } catch (e) { + return true; + } +} +const spec = { + code: ADHASH_BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: bid => { + try { + const { + publisherId, + platformURL, + bidderURL + } = bid.params; + return ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(Object.keys(bid.mediaTypes), _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) || (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(Object.keys(bid.mediaTypes), _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO)) && typeof publisherId === 'string' && publisherId.length === 42 && typeof platformURL === 'string' && platformURL.length >= 13 && (!bidderURL || bidderURL.indexOf('https://') === 0); + } catch (error) { + return false; + } + }, + buildRequests: (validBidRequests, bidderRequest) => { + const { + gdprConsent + } = bidderRequest; + const bidRequests = []; + const body = document.body; + const html = document.documentElement; + const pageHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); + const pageWidth = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth); + for (let i = 0; i < validBidRequests.length; i++) { + const bidderURL = validBidRequests[i].params.bidderURL || 'https://bidder.adhash.com'; + const url = `${bidderURL}/rtb?version=${VERSION}&prebid=true`; + const index = Math.floor(Math.random() * validBidRequests[i].sizes.length); + const size = validBidRequests[i].sizes[index].join('x'); + const creativeData = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(Object.keys(validBidRequests[i].mediaTypes), _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) ? { + size: 'preroll', + position: validBidRequests[i].adUnitCode, + playerSize: size + } : { + size: size, + position: validBidRequests[i].adUnitCode + }; + let recentAds = []; + let recentAdsPrebid = []; + if (storage.localStorageIsEnabled()) { + const prefix = validBidRequests[i].params.prefix || 'adHash'; + recentAds = JSON.parse(storage.getDataFromLocalStorage(prefix + 'recentAds') || '[]'); + recentAdsPrebid = JSON.parse(storage.getDataFromLocalStorage(prefix + 'recentAdsPrebid') || '[]'); + } + + // Needed for the ad density calculation + const adHeight = validBidRequests[i].sizes[index][1]; + const adWidth = validBidRequests[i].sizes[index][0]; + if (!window.adsCount) { + window.adsCount = 0; + } + if (!window.adsTotalSurface) { + window.adsTotalSurface = 0; + } + window.adsTotalSurface += adHeight * adWidth; + window.adsCount++; + bidRequests.push({ + method: 'POST', + url: url + '&publisher=' + validBidRequests[i].params.publisherId, + bidRequest: validBidRequests[i], + data: { + timezone: new Date().getTimezoneOffset() / 60, + location: bidderRequest.refererInfo ? bidderRequest.refererInfo.topmostLocation : '', + publisherId: validBidRequests[i].params.publisherId, + size: { + screenWidth: window.screen.width, + screenHeight: window.screen.height + }, + navigator: { + platform: window.navigator.platform, + language: window.navigator.language, + userAgent: window.navigator.userAgent + }, + creatives: [creativeData], + blockedCreatives: [], + currentTimestamp: new Date().getTime() / 1000 | 0, + recentAds: recentAds, + recentAdsPrebid: recentAdsPrebid, + GDPRApplies: gdprConsent ? gdprConsent.gdprApplies : null, + GDPR: gdprConsent ? gdprConsent.consentString : null, + servedAdsCount: window.adsCount, + adsTotalSurface: window.adsTotalSurface, + pageHeight: pageHeight, + pageWidth: pageWidth + }, + options: { + withCredentials: false, + crossOrigin: true + } + }); + } + return bidRequests; + }, + interpretResponse: (serverResponse, request) => { + const responseBody = serverResponse ? serverResponse.body : {}; + if (!responseBody.creatives || responseBody.creatives.length === 0 || !brandSafety(responseBody.badWords, responseBody.maxScore)) { + return []; + } + if (storage.localStorageIsEnabled()) { + const prefix = request.bidRequest.params.prefix || 'adHash'; + let recentAdsPrebid = JSON.parse(storage.getDataFromLocalStorage(prefix + 'recentAdsPrebid') || '[]'); + recentAdsPrebid.push([new Date().getTime() / 1000 | 0, responseBody.creatives[0].advertiserId, responseBody.creatives[0].budgetId, responseBody.creatives[0].expectedHashes.length ? responseBody.creatives[0].expectedHashes[0] : '']); + let recentAdsPrebidFinal = JSON.stringify(recentAdsPrebid.slice(-100)); + storage.setDataInLocalStorage(prefix + 'recentAdsPrebid', recentAdsPrebidFinal); + } + const publisherURL = JSON.stringify(request.bidRequest.params.platformURL); + const bidderURL = request.bidRequest.params.bidderURL || 'https://bidder.adhash.com'; + const oneTimeId = request.bidRequest.adUnitCode + Math.random().toFixed(16).replace('0.', '.'); + const bidderResponse = JSON.stringify({ + responseText: JSON.stringify(responseBody) + }); + const requestData = JSON.stringify(request.data); + let response = { + requestId: request.bidRequest.bidId, + cpm: responseBody.creatives[0].costEUR, + width: request.bidRequest.sizes[0][0], + height: request.bidRequest.sizes[0][1], + creativeId: request.bidRequest.adUnitCode, + netRevenue: true, + currency: 'EUR', + ttl: 60, + meta: { + advertiserDomains: responseBody.advertiserDomains ? [responseBody.advertiserDomains] : [] + } + }; + if (typeof request == 'object' && typeof request.bidRequest == 'object' && typeof request.bidRequest.mediaTypes == 'object' && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(Object.keys(request.bidRequest.mediaTypes), _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER)) { + response = Object.assign({ + ad: `
+ + ` + }, response); + } else if ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(Object.keys(request.bidRequest.mediaTypes), _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO)) { + response = Object.assign({ + vastUrl: responseBody.creatives[0].vastURL, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO + }, response); + } + return [response]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('adhashBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adhashBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adheseBidAdapter"],{ + +/***/ "./modules/adheseBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adheseBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + +const BIDDER_CODE = 'adhese'; +const GVLID = 553; +const USER_SYNC_BASE_URL = 'https://user-sync.adhese.com/iframe/user_sync.html'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return !!(bid.params.account && bid.params.location && (bid.params.format || bid.mediaTypes.banner.sizes)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (validBidRequests.length === 0) { + return null; + } + const { + gdprConsent, + refererInfo + } = bidderRequest; + const adheseConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('adhese'); + const gdprParams = gdprConsent && gdprConsent.consentString ? { + xt: [gdprConsent.consentString] + } : {}; + // TODO: is 'page' the right value here? + const refererParams = refererInfo && refererInfo.page ? { + xf: [base64urlEncode(refererInfo.page)] + } : {}; + const globalCustomParams = adheseConfig && adheseConfig.globalTargets ? cleanTargets(adheseConfig.globalTargets) : {}; + const commonParams = { + ...globalCustomParams, + ...gdprParams, + ...refererParams + }; + const vastContentAsUrl = !(adheseConfig && adheseConfig.vastContentAsUrl == false); + const slots = validBidRequests.map(bid => ({ + slotname: bidToSlotName(bid), + parameters: cleanTargets(bid.params.data) + })); + const payload = { + slots: slots, + parameters: commonParams, + vastContentAsUrl: vastContentAsUrl, + user: { + ext: { + eids: getEids(validBidRequests) + } + } + }; + const account = getAccount(validBidRequests); + const uri = 'https://ads-' + account + '.adhese.com/json'; + return { + method: 'POST', + url: uri, + data: JSON.stringify(payload), + bids: validBidRequests, + options: { + contentType: 'application/json' + } + }; + }, + interpretResponse: function (serverResponse, request) { + const serverAds = serverResponse.body.reduce(function (map, ad) { + map[ad.slotName] = ad; + return map; + }, {}); + serverResponse.account = getAccount(request.bids); + return request.bids.map(bid => ({ + bid: bid, + ad: serverAds[bidToSlotName(bid)] + })).filter(item => item.ad).map(item => adResponse(item.bid, item.ad)); + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { + if (syncOptions.iframeEnabled && serverResponses.length > 0) { + const account = serverResponses[0].account; + if (account) { + let syncurl = USER_SYNC_BASE_URL + '?account=' + account; + if (gdprConsent) { + syncurl += '&gdpr=' + (gdprConsent.gdprApplies ? 1 : 0); + syncurl += '&consentString=' + encodeURIComponent(gdprConsent.consentString || ''); + } + return [{ + type: 'iframe', + url: syncurl + }]; + } + } + return []; + } +}; +function adResponse(bid, ad) { + const price = getPrice(ad); + const adDetails = getAdDetails(ad); + const markup = getAdMarkup(ad); + const bidResponse = getbaseAdResponse({ + requestId: bid.bidId, + mediaType: ad.extension.mediaType, + cpm: Number(price.amount), + currency: price.currency, + width: Number(ad.width), + height: Number(ad.height), + creativeId: adDetails.creativeId, + dealId: adDetails.dealId, + adhese: { + originData: adDetails.originData, + origin: adDetails.origin, + originInstance: adDetails.originInstance + }, + meta: { + advertiserDomains: ad.adomain || [] + } + }); + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + if (ad.cachedBodyUrl) { + bidResponse.vastUrl = ad.cachedBodyUrl; + } else { + bidResponse.vastXml = markup; + } + } else { + const counter = ad.impressionCounter ? "" : ''; + bidResponse.ad = markup + counter; + } + return bidResponse; +} +function cleanTargets(target) { + const targets = {}; + if (target) { + Object.keys(target).forEach(function (key) { + const val = target[key]; + const dirtyValues = Array.isArray(val) ? val : [val]; + const values = dirtyValues.filter(v => v === 0 || v); + if (values.length > 0) { + if (targets[key]) { + const distinctValues = values.filter(v => targets[key].indexOf(v) < 0); + targets[key].push.apply(targets[key], distinctValues); + } else { + targets[key] = values; + } + } + }); + } + return targets; +} +function bidToSlotName(bid) { + if (bid.params.format) { + return bid.params.location + '-' + bid.params.format; + } + var sizes = bid.mediaTypes.banner.sizes; + sizes.sort(); + var format = sizes.map(size => size[0] + 'x' + size[1]).join('_'); + if (format.length > 0) { + return bid.params.location + '-' + format; + } else { + return bid.params.location; + } +} +function getAccount(validBidRequests) { + return validBidRequests[0].params.account; +} +function getEids(validBidRequests) { + if (validBidRequests[0] && validBidRequests[0].userIdAsEids) { + return validBidRequests[0].userIdAsEids; + } +} +function getbaseAdResponse(response) { + return Object.assign({ + netRevenue: true, + ttl: 360 + }, response); +} +function isAdheseAd(ad) { + return !ad.origin || ad.origin === 'JERLICIA'; +} +function getAdMarkup(ad) { + if (!isAdheseAd(ad) || ad.ext === 'js' && ad.body !== undefined && ad.body !== '' && ad.body.match(/ { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adheseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adipoloBidAdapter"],{ + +/***/ "./modules/adipoloBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/adipoloBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/xeUtils/bidderUtils.js */ "./libraries/xeUtils/bidderUtils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const BIDDER_CODE = 'adipolo'; +const ENDPOINT = 'https://prebid.adipolo.live'; +function isBidRequestValid(bid) { + if (bid && typeof bid.params !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Params is not defined or is incorrect in the bidder settings'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('pid', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Pid is not present in bidder params'); + return false; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video') && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playerSize'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('mediaTypes.video.playerSize is required for video'); + return false; + } + return true; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid, + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT), + interpretResponse: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.interpretResponse, + getUserSyncs: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adipoloBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","xeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adipoloBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adkernelAdnAnalyticsAdapter"],{ + +/***/ "./modules/adkernelAdnAnalyticsAdapter.js": +/*!************************************************!*\ + !*** ./modules/adkernelAdnAnalyticsAdapter.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, getUmtSource, ExpiringQueue */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + + +const MODULE_CODE = 'adkernelAdn'; +const GVLID = 14; +const ANALYTICS_VERSION = '1.0.2'; +const DEFAULT_QUEUE_TIMEOUT = 4000; +const DEFAULT_HOST = 'tag.adkernel.com'; +const storageObj = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); +const ADK_HB_EVENTS = { + AUCTION_INIT: 'auctionInit', + BID_REQUEST: 'bidRequested', + BID_RESPONSE: 'bidResponse', + BID_WON: 'bidWon', + AUCTION_END: 'auctionEnd', + TIMEOUT: 'adapterTimedOut' +}; +function buildRequestTemplate(pubId) { + const { + loc, + ref + } = getNavigationInfo(); + return { + ver: ANALYTICS_VERSION, + domain: loc.hostname, + path: loc.pathname, + accId: pubId, + env: { + screen: { + w: window.screen.width, + h: window.screen.height + }, + lang: navigator.language + }, + user: {}, + src: getUmtSource(loc.href, ref) + }; +} +let analyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (!analyticsAdapter.context) { + return; + } + let handler = null; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_INIT: + if (analyticsAdapter.context.queue) { + analyticsAdapter.context.queue.init(); + } + initPrivacy(analyticsAdapter.context.requestTemplate, args.bidderRequests); + handler = trackAuctionInit; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_REQUESTED: + handler = trackBidRequest; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_RESPONSE: + handler = trackBidResponse; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_WON: + handler = trackBidWon; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT: + handler = trackBidTimeout; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END: + handler = trackAuctionEnd; + break; + } + if (handler) { + let events = handler(args); + if (analyticsAdapter.context.queue) { + analyticsAdapter.context.queue.push(events); + } + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END) { + sendAll(); + } + } + } +}); +analyticsAdapter.context = {}; +analyticsAdapter.originEnableAnalytics = analyticsAdapter.enableAnalytics; +analyticsAdapter.enableAnalytics = config => { + if (!config.options.pubId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('PubId is not defined. Analytics won\'t work'); + return; + } + analyticsAdapter.context = { + host: config.options.host || DEFAULT_HOST, + pubId: config.options.pubId, + requestTemplate: buildRequestTemplate(config.options.pubId), + queue: new ExpiringQueue(sendAll, config.options.queueTimeout || DEFAULT_QUEUE_TIMEOUT) + }; + analyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: analyticsAdapter, + code: MODULE_CODE, + gvlid: GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (analyticsAdapter); +function sendAll() { + let events = analyticsAdapter.context.queue.popAll(); + if (events.length !== 0) { + let req = Object.assign({}, analyticsAdapter.context.requestTemplate, { + hb_ev: events + }); + analyticsAdapter.ajaxCall(JSON.stringify(req)); + } +} +analyticsAdapter.ajaxCall = function ajaxCall(data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(`https://${analyticsAdapter.context.host}/hb-analytics`, () => {}, data); +}; +function trackAuctionInit() { + analyticsAdapter.context.auctionTimeStart = Date.now(); + const event = createHbEvent(undefined, ADK_HB_EVENTS.AUCTION_INIT); + return [event]; +} +function trackBidRequest(args) { + return args.bids.map(bid => createHbEvent(args.bidderCode, ADK_HB_EVENTS.BID_REQUEST, bid.adUnitCode)); +} +function trackBidResponse(args) { + const event = createHbEvent(args.bidderCode, ADK_HB_EVENTS.BID_RESPONSE, args.adUnitCode, args.cpm, args.timeToRespond / 1000); + return [event]; +} +function trackBidWon(args) { + const event = createHbEvent(args.bidderCode, ADK_HB_EVENTS.BID_WON, args.adUnitCode, args.cpm); + return [event]; +} +function trackAuctionEnd(args) { + const event = createHbEvent(undefined, ADK_HB_EVENTS.AUCTION_END, undefined, undefined, (Date.now() - analyticsAdapter.context.auctionTimeStart) / 1000); + return [event]; +} +function trackBidTimeout(args) { + return args.map(bidderName => createHbEvent(bidderName, ADK_HB_EVENTS.TIMEOUT)); +} +function createHbEvent(adapter, event) { + let tagid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + let value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + let time = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + let ev = { + event: event + }; + if (adapter) { + ev.adapter = adapter; + } + if (tagid) { + ev.tagid = tagid; + } + if (value) { + ev.val = value; + } + if (time) { + ev.time = time; + } + return ev; +} +const UTM_TAGS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'utm_c1', 'utm_c2', 'utm_c3', 'utm_c4', 'utm_c5']; +const ADKERNEL_PREBID_KEY = 'adk_dpt_analytics'; +const DIRECT = '(direct)'; +const REFERRAL = '(referral)'; +const ORGANIC = '(organic)'; +let storage = { + getItem: name => { + return storageObj.getDataFromLocalStorage(name); + }, + setItem: (name, value) => { + storageObj.setDataInLocalStorage(name, value); + } +}; +function getUmtSource(pageUrl, referrer) { + let prevUtm = getPreviousTrafficSource(); + let currUtm = getCurrentTrafficSource(pageUrl, referrer); + let [updated, actual] = chooseActualUtm(prevUtm, currUtm); + if (updated) { + storeUtm(actual); + } + return actual; + function getPreviousTrafficSource() { + let val = storage.getItem(ADKERNEL_PREBID_KEY); + if (!val) { + return getDirect(); + } + return JSON.parse(val); + } + function getCurrentTrafficSource(pageUrl, referrer) { + var source = getUTM(pageUrl); + if (source) { + return source; + } + if (referrer) { + let se = getSearchEngine(referrer); + if (se) { + return asUtm(se, ORGANIC, ORGANIC); + } + let parsedUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseUrl)(pageUrl); + let [refHost, refPath] = getReferrer(referrer); + if (refHost && refHost !== parsedUrl.hostname) { + return asUtm(refHost, REFERRAL, REFERRAL, '', refPath); + } + } + return getDirect(); + } + function getSearchEngine(pageUrl) { + let engines = { + 'google': /^https?\:\/\/(?:www\.)?(?:google\.(?:com?\.)?(?:com|cat|[a-z]{2})|g.cn)\//i, + 'yandex': /^https?\:\/\/(?:www\.)?ya(?:ndex\.(?:com|net)?\.?(?:asia|mobi|org|[a-z]{2})?|\.ru)\//i, + 'bing': /^https?\:\/\/(?:www\.)?bing\.com\//i, + 'duckduckgo': /^https?\:\/\/(?:www\.)?duckduckgo\.com\//i, + 'ask': /^https?\:\/\/(?:www\.)?ask\.com\//i, + 'yahoo': /^https?\:\/\/(?:[-a-z]+\.)?(?:search\.)?yahoo\.com\//i + }; + for (let engine in engines) { + if (engines.hasOwnProperty(engine) && engines[engine].test(pageUrl)) { + return engine; + } + } + } + function getReferrer(referrer) { + let ref = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseUrl)(referrer); + return [ref.hostname, ref.pathname]; + } + function getUTM(pageUrl) { + let urlParameters = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseUrl)(pageUrl).search; + if (!urlParameters['utm_campaign'] || !urlParameters['utm_source']) { + return; + } + let utmArgs = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__._each)(UTM_TAGS, utmTagName => { + let utmValue = urlParameters[utmTagName] || ''; + utmArgs.push(utmValue); + }); + return asUtm.apply(this, utmArgs); + } + function getDirect() { + return asUtm(DIRECT, DIRECT, DIRECT); + } + function storeUtm(utm) { + let val = JSON.stringify(utm); + storage.setItem(ADKERNEL_PREBID_KEY, val); + } + function asUtm(source, medium, campaign) { + let term = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + let content = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; + let c1 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : ''; + let c2 = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : ''; + let c3 = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : ''; + let c4 = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : ''; + let c5 = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : ''; + let result = { + source: source, + medium: medium, + campaign: campaign + }; + if (term) { + result.term = term; + } + if (content) { + result.content = content; + } + if (c1) { + result.c1 = c1; + } + if (c2) { + result.c2 = c2; + } + if (c3) { + result.c3 = c3; + } + if (c4) { + result.c4 = c4; + } + if (c5) { + result.c5 = c5; + } + return result; + } + function chooseActualUtm(prev, curr) { + if (ord(prev) < ord(curr)) { + return [true, curr]; + } else if (ord(prev) > ord(curr)) { + return [false, prev]; + } else { + if (prev.campaign === REFERRAL && prev.content !== curr.content) { + return [true, curr]; + } else if (prev.campaign === ORGANIC && prev.source !== curr.source) { + return [true, curr]; + } else if (isCampaignTraffic(prev) && (prev.campaign !== curr.campaign || prev.source !== curr.source)) { + return [true, curr]; + } + } + return [false, prev]; + } + function ord(utm) { + switch (utm.campaign) { + case DIRECT: + return 0; + case ORGANIC: + return 1; + case REFERRAL: + return 2; + default: + return 3; + } + } + function isCampaignTraffic(utm) { + return [DIRECT, REFERRAL, ORGANIC].indexOf(utm.campaign) === -1; + } +} + +/** + * Expiring queue implementation. Fires callback on elapsed timeout since last update or creation. + * @param callback + * @param ttl + * @class + */ +function ExpiringQueue(callback, ttl) { + let queue = []; + let timeoutId; + this.push = event => { + if (event instanceof Array) { + queue.push.apply(queue, event); + } else { + queue.push(event); + } + reset(); + }; + this.popAll = () => { + let result = queue; + queue = []; + reset(); + return result; + }; + + /** + * For test/debug purposes only + * @return {Array} + */ + this.peekAll = () => { + return queue; + }; + this.init = reset; + function reset() { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(() => { + if (queue.length) { + callback(); + } + }, ttl); + } +} + +// TODO: this should reuse logic from refererDetection +function getNavigationInfo() { + try { + return getLocationAndReferrer(self.top); + } catch (e) { + return getLocationAndReferrer(self); + } +} +function getLocationAndReferrer(win) { + return { + ref: win.document.referrer, + loc: win.location + }; +} +function initPrivacy(template, requests) { + let consent = requests[0].gdprConsent; + if (consent && consent.gdprApplies) { + template.user.gdpr = ~~consent.gdprApplies; + } + if (consent && consent.consentString) { + template.user.gdpr_consent = consent.consentString; + } + if (requests[0].uspConsent) { + template.user.us_privacy = requests[0].uspConsent; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('coppa')) { + template.user.coppa = 1; + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adkernelAdnAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adkernelAdnAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adkernelAdnBidAdapter"],{ + +/***/ "./modules/adkernelAdnBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/adkernelAdnBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_adkernelUtils_adkernelUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/adkernelUtils/adkernelUtils.js */ "./libraries/adkernelUtils/adkernelUtils.js"); + + + + + + +const DEFAULT_ADKERNEL_DSP_DOMAIN = 'tag.adkernel.com'; +const DEFAULT_MIMES = ['video/mp4', 'video/webm', 'application/x-shockwave-flash', 'application/javascript']; +const DEFAULT_PROTOCOLS = [2, 3, 5, 6]; +const DEFAULT_APIS = [1, 2]; +const GVLID = 14; +function isRtbDebugEnabled(refInfo) { + return refInfo.topmostLocation?.indexOf('adk_debug=true') !== -1; +} +function buildImp(bidRequest) { + let imp = { + id: bidRequest.bidId, + tagid: bidRequest.adUnitCode + }; + let mediaType; + let bannerReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, `mediaTypes.banner`); + let videoReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, `mediaTypes.video`); + if (bannerReq) { + let sizes = canonicalizeSizesArray(bannerReq.sizes); + imp.banner = { + format: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(sizes) + }; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + } else if (videoReq) { + let size = canonicalizeSizesArray(videoReq.playerSize)[0]; + imp.video = { + w: size[0], + h: size[1], + mimes: videoReq.mimes || DEFAULT_MIMES, + protocols: videoReq.protocols || DEFAULT_PROTOCOLS, + api: videoReq.api || DEFAULT_APIS + }; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + } + let bidFloor = (0,_libraries_adkernelUtils_adkernelUtils_js__WEBPACK_IMPORTED_MODULE_3__.getBidFloor)(bidRequest, mediaType, '*'); + if (bidFloor) { + imp.bidfloor = bidFloor; + } + return imp; +} + +/** + * Convert input array of sizes to canonical form Array[Array[Number]] + * @param sizes + * @return Array[Array[Number]] + */ +function canonicalizeSizesArray(sizes) { + if (sizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes[0])) { + return [sizes]; + } + return sizes; +} +function buildRequestParams(tags, bidderRequest) { + let { + gdprConsent, + uspConsent, + refererInfo, + ortb2 + } = bidderRequest; + let req = { + id: bidderRequest.bidderRequestId, + // TODO: root-level `tid` is not ORTB; is this intentional? + tid: ortb2?.source?.tid, + site: buildSite(refererInfo), + imp: tags + }; + if (gdprConsent) { + if (gdprConsent.gdprApplies !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req, 'user.gdpr', ~~gdprConsent.gdprApplies); + } + if (gdprConsent.consentString !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req, 'user.consent', gdprConsent.consentString); + } + } + if (uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req, 'user.us_privacy', uspConsent); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req, 'user.coppa', 1); + } + return req; +} +function buildSite(refInfo) { + const result = { + page: refInfo.page, + secure: ~~(refInfo.page && refInfo.page.startsWith('https')), + ref: refInfo.ref + }; + let keywords = document.getElementsByTagName('meta')['keywords']; + if (keywords && keywords.content) { + result.keywords = keywords.content; + } + return result; +} +function buildBid(tag) { + let bid = { + requestId: tag.impid, + cpm: tag.bid, + creativeId: tag.crid, + currency: 'USD', + ttl: 720, + netRevenue: true + }; + if (tag.w) { + bid.width = tag.w; + } + if (tag.h) { + bid.height = tag.h; + } + if (tag.tag) { + bid.ad = tag.tag; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + } else if (tag.vast_url) { + bid.vastUrl = tag.vast_url; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + } + fillBidMeta(bid, tag); + return bid; +} +function fillBidMeta(bid, tag) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(tag.agencyName)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.agencyName', tag.agencyName); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(tag.advertiserId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.advertiserId', tag.advertiserId); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(tag.advertiserName)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.advertiserName', tag.advertiserName); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(tag.advertiserDomains)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.advertiserDomains', tag.advertiserDomains); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(tag.primaryCatId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.primaryCatId', tag.primaryCatId); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(tag.secondaryCatIds)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.secondaryCatIds', tag.secondaryCatIds); + } +} +const spec = { + code: 'adkernelAdn', + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + aliases: ['engagesimply', 'adpluto_dsp'], + isBidRequestValid: function (bidRequest) { + return 'params' in bidRequest && (typeof bidRequest.params.host === 'undefined' || typeof bidRequest.params.host === 'string') && typeof bidRequest.params.pubId === 'number' && 'mediaTypes' in bidRequest && ('banner' in bidRequest.mediaTypes || 'video' in bidRequest.mediaTypes); + }, + buildRequests: function (bidRequests, bidderRequest) { + let dispatch = bidRequests.map(buildImp).reduce((acc, curr, index) => { + let bidRequest = bidRequests[index]; + let pubId = bidRequest.params.pubId; + let host = bidRequest.params.host || DEFAULT_ADKERNEL_DSP_DOMAIN; + acc[host] = acc[host] || {}; + acc[host][pubId] = acc[host][pubId] || []; + acc[host][pubId].push(curr); + return acc; + }, {}); + let requests = []; + Object.keys(dispatch).forEach(host => { + Object.keys(dispatch[host]).forEach(pubId => { + let request = buildRequestParams(dispatch[host][pubId], bidderRequest); + requests.push({ + method: 'POST', + url: `https://${host}/tag?account=${pubId}&pb=1${isRtbDebugEnabled(bidderRequest.refererInfo) ? '&debug=1' : ''}`, + data: JSON.stringify(request) + }); + }); + }); + return requests; + }, + interpretResponse: function (serverResponse) { + let response = serverResponse.body; + if (!response.tags) { + return []; + } + if (response.debug) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`ADKERNEL DEBUG:\n${response.debug}`); + } + return response.tags.map(buildBid); + }, + getUserSyncs: function (syncOptions, serverResponses) { + if (!serverResponses || serverResponses.length === 0) { + return []; + } + if (syncOptions.iframeEnabled) { + return buildSyncs(serverResponses, 'syncpages', 'iframe'); + } else if (syncOptions.pixelEnabled) { + return buildSyncs(serverResponses, 'syncpixels', 'image'); + } else { + return []; + } + } +}; +function buildSyncs(serverResponses, propName, type) { + return serverResponses.filter(rps => rps.body && rps.body[propName]).map(rsp => rsp.body[propName]).reduce((a, b) => a.concat(b), []).map(syncUrl => ({ + type: type, + url: syncUrl + })); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('adkernelAdnBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["adkernelUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adkernelAdnBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adkernelBidAdapter"],{ + +/***/ "./modules/adkernelBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/adkernelBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _libraries_adkernelUtils_adkernelUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/adkernelUtils/adkernelUtils.js */ "./libraries/adkernelUtils/adkernelUtils.js"); + + + + + + + + + +/** + * In case you're AdKernel whitelable platform's client who needs branded adapter to + * work with Adkernel platform - DO NOT COPY THIS ADAPTER UNDER NEW NAME + * + * Please contact prebid@adkernel.com and we'll add your adapter as an alias + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const VIDEO_PARAMS = ['pos', 'context', 'placement', 'plcmt', 'api', 'mimes', 'protocols', 'playbackmethod', 'minduration', 'maxduration', 'startdelay', 'linearity', 'skip', 'skipmin', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackend', 'boxingallowed']; +const VIDEO_FPD = ['battr', 'pos']; +const NATIVE_FPD = ['battr', 'api']; +const BANNER_PARAMS = ['pos']; +const BANNER_FPD = ['btype', 'battr', 'pos', 'api']; +const VERSION = '1.8'; +const SYNC_IFRAME = 1; +const SYNC_IMAGE = 2; +const SYNC_TYPES = { + 1: 'iframe', + 2: 'image' +}; +const GVLID = 14; +const MULTI_FORMAT_SUFFIX = '__mf'; +const MULTI_FORMAT_SUFFIX_BANNER = 'b' + MULTI_FORMAT_SUFFIX; +const MULTI_FORMAT_SUFFIX_VIDEO = 'v' + MULTI_FORMAT_SUFFIX; +const MULTI_FORMAT_SUFFIX_NATIVE = 'n' + MULTI_FORMAT_SUFFIX; +const MEDIA_TYPES = { + BANNER: 1, + VIDEO: 2, + NATIVE: 4 +}; + +/** + * Adapter for requesting bids from AdKernel white-label display platform + */ +const spec = { + code: 'adkernel', + gvlid: GVLID, + aliases: [{ + code: 'headbidding' + }, { + code: 'adsolut' + }, { + code: 'oftmediahb' + }, { + code: 'audiencemedia' + }, { + code: 'waardex_ak' + }, { + code: 'roqoon' + }, { + code: 'adbite' + }, { + code: 'houseofpubs' + }, { + code: 'torchad' + }, { + code: 'stringads' + }, { + code: 'bcm' + }, { + code: 'engageadx' + }, { + code: 'converge', + gvlid: 248 + }, { + code: 'adomega' + }, { + code: 'denakop' + }, { + code: 'rtbanalytica' + }, { + code: 'unibots' + }, { + code: 'ergadx' + }, { + code: 'turktelekom' + }, { + code: 'motionspots' + }, { + code: 'sonic_twist' + }, { + code: 'displayioads' + }, { + code: 'rtbdemand_com' + }, { + code: 'bidbuddy' + }, { + code: 'didnadisplay' + }, { + code: 'qortex' + }, { + code: 'adpluto' + }, { + code: 'headbidder' + }, { + code: 'digiad' + }, { + code: 'monetix' + }, { + code: 'hyperbrainz' + }, { + code: 'voisetech' + }, { + code: 'global_sun' + }, { + code: 'rxnetwork' + }, { + code: 'revbid' + }, { + code: 'spinx', + gvlid: 1308 + }, { + code: 'oppamedia' + }, { + code: 'pixelpluses', + gvlid: 1209 + }, { + code: 'urekamedia' + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Validates bid request for adunit + * @param bidRequest {BidRequest} + * @returns {boolean} + */ + isBidRequestValid: function (bidRequest) { + return 'params' in bidRequest && typeof bidRequest.params.host !== 'undefined' && 'zoneId' in bidRequest.params && !isNaN(Number(bidRequest.params.zoneId)) && bidRequest.params.zoneId > 0 && bidRequest.mediaTypes && (bidRequest.mediaTypes.banner || bidRequest.mediaTypes.video || bidRequest.mediaTypes.native && validateNativeAdUnit(bidRequest.mediaTypes.native)); + }, + /** + * Builds http request for each unique combination of adkernel host/zone + * @param bidRequests {BidRequest[]} + * @param bidderRequest {BidderRequest} + * @returns {ServerRequest[]} + */ + buildRequests: function (bidRequests, bidderRequest) { + let impGroups = groupImpressionsByHostZone(bidRequests, bidderRequest.refererInfo); + let requests = []; + let schain = bidRequests[0].schain; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(impGroups, impGroup => { + let { + host, + zoneId, + imps + } = impGroup; + const request = buildRtbRequest(imps, bidderRequest, schain); + requests.push({ + method: 'POST', + url: `https://${host}/hb?zone=${zoneId}&v=${VERSION}`, + data: JSON.stringify(request) + }); + }); + return requests; + }, + /** + * Parse response from adkernel backend + * @param serverResponse {ServerResponse} + * @param serverRequest {ServerRequest} + * @returns {Bid[]} + */ + interpretResponse: function (serverResponse, serverRequest) { + let response = serverResponse.body; + if (!response.seatbid) { + return []; + } + let rtbRequest = JSON.parse(serverRequest.data); + let rtbBids = response.seatbid.map(seatbid => seatbid.bid).reduce((a, b) => a.concat(b), []); + return rtbBids.map(rtbBid => { + let imp = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(rtbRequest.imp, imp => imp.id === rtbBid.impid); + let prBid = { + requestId: rtbBid.impid, + cpm: rtbBid.price, + creativeId: rtbBid.crid, + currency: response.cur || 'USD', + ttl: 360, + netRevenue: true + }; + if (prBid.requestId.endsWith(MULTI_FORMAT_SUFFIX)) { + prBid.requestId = stripMultiformatSuffix(prBid.requestId); + } + if (rtbBid.mtype === MEDIA_TYPES.BANNER) { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + prBid.width = rtbBid.w; + prBid.height = rtbBid.h; + prBid.ad = formatAdMarkup(rtbBid); + } else if (rtbBid.mtype === MEDIA_TYPES.VIDEO) { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + if (rtbBid.adm) { + prBid.vastXml = rtbBid.adm; + if (rtbBid.nurl) { + prBid.nurl = rtbBid.nurl; + } + } else { + prBid.vastUrl = rtbBid.nurl; + } + prBid.width = imp.video.w; + prBid.height = imp.video.h; + } else if (rtbBid.mtype === MEDIA_TYPES.NATIVE) { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + prBid.native = { + ortb: buildNativeAd(rtbBid.adm) + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(rtbBid.dealid)) { + prBid.dealId = rtbBid.dealid; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(rtbBid.adomain)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(prBid, 'meta.advertiserDomains', rtbBid.adomain); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(rtbBid.cat)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(prBid, 'meta.secondaryCatIds', rtbBid.cat); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(rtbBid.ext)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(rtbBid.ext.advertiser_id)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(prBid, 'meta.advertiserId', rtbBid.ext.advertiser_id); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(rtbBid.ext.advertiser_name)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(prBid, 'meta.advertiserName', rtbBid.ext.advertiser_name); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(rtbBid.ext.agency_name)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(prBid, 'meta.agencyName', rtbBid.ext.agency_name); + } + } + return prBid; + }); + }, + /** + * Extracts user-syncs information from server response + * @param syncOptions {SyncOptions} + * @param serverResponses {ServerResponse[]} + * @returns {UserSync[]} + */ + getUserSyncs: function (syncOptions, serverResponses) { + if (!serverResponses || serverResponses.length === 0 || !syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return []; + } + return serverResponses.filter(rsp => rsp.body && rsp.body.ext && rsp.body.ext.adk_usersync).map(rsp => rsp.body.ext.adk_usersync).reduce((a, b) => a.concat(b), []).map(_ref => { + let { + url, + type + } = _ref; + return { + type: SYNC_TYPES[type], + url: url + }; + }); + }, + /** + * Handle bid win + * @param bid {Bid} + */ + onBidWon: function (bid) { + if (bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(bid.nurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); + +/** + * Dispatch impressions by ad network host and zone + * @param bidRequests {BidRequest[]} + * @param refererInfo {refererInfo} + */ +function groupImpressionsByHostZone(bidRequests, refererInfo) { + let secure = refererInfo && refererInfo.page?.indexOf('https:') === 0; + return Object.values(bidRequests.map(bidRequest => buildImps(bidRequest, secure)).reduce((acc, curr, index) => { + let bidRequest = bidRequests[index]; + let { + zoneId, + host + } = bidRequest.params; + let key = `${host}_${zoneId}`; + acc[key] = acc[key] || { + host: host, + zoneId: zoneId, + imps: [] + }; + acc[key].imps.push(...curr); + return acc; + }, {})); +} + +/** + * Builds rtb imp object(s) for single adunit + * @param bidRequest {BidRequest} + * @param secure {boolean} + */ +function buildImps(bidRequest, secure) { + let imp = { + 'id': bidRequest.bidId, + 'tagid': bidRequest.adUnitCode + }; + if (secure) { + imp.secure = bidRequest.ortb2Imp?.secure ?? 1; + } + var sizes = []; + let mediaTypes = bidRequest.mediaTypes; + let isMultiformat = ~~!!mediaTypes?.banner + ~~!!mediaTypes?.video + ~~!!mediaTypes?.native > 1; + let result = []; + let typedImp; + if (mediaTypes?.banner) { + if (isMultiformat) { + typedImp = { + ...imp + }; + typedImp.id = imp.id + MULTI_FORMAT_SUFFIX_BANNER; + } else { + typedImp = imp; + } + sizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_5__.getAdUnitSizes)(bidRequest); + let pbBanner = mediaTypes.banner; + typedImp.banner = { + ...getDefinedParamsOrEmpty(bidRequest.ortb2Imp, BANNER_FPD), + ...getDefinedParamsOrEmpty(pbBanner, BANNER_PARAMS), + format: sizes.map(wh => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseGPTSingleSizeArrayToRtbSize)(wh)), + topframe: 0 + }; + initImpBidfloor(typedImp, bidRequest, sizes, isMultiformat ? '*' : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + result.push(typedImp); + } + if (mediaTypes?.video) { + if (isMultiformat) { + typedImp = { + ...imp + }; + typedImp.id = typedImp.id + MULTI_FORMAT_SUFFIX_VIDEO; + } else { + typedImp = imp; + } + let pbVideo = mediaTypes.video; + typedImp.video = { + ...getDefinedParamsOrEmpty(bidRequest.ortb2Imp, VIDEO_FPD), + ...getDefinedParamsOrEmpty(pbVideo, VIDEO_PARAMS) + }; + if (pbVideo.playerSize) { + sizes = pbVideo.playerSize[0]; + typedImp.video = Object.assign(typedImp.video, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseGPTSingleSizeArrayToRtbSize)(sizes) || {}); + } else if (pbVideo.w && pbVideo.h) { + typedImp.video.w = pbVideo.w; + typedImp.video.h = pbVideo.h; + } + initImpBidfloor(typedImp, bidRequest, sizes, isMultiformat ? '*' : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + result.push(typedImp); + } + if (mediaTypes?.native) { + if (isMultiformat) { + typedImp = { + ...imp + }; + typedImp.id = typedImp.id + MULTI_FORMAT_SUFFIX_NATIVE; + } else { + typedImp = imp; + } + typedImp.native = { + ...getDefinedParamsOrEmpty(bidRequest.ortb2Imp, NATIVE_FPD), + request: JSON.stringify(bidRequest.nativeOrtbRequest) + }; + initImpBidfloor(typedImp, bidRequest, sizes, isMultiformat ? '*' : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + result.push(typedImp); + } + return result; +} +function initImpBidfloor(imp, bid, sizes, mediaType) { + let bidfloor = (0,_libraries_adkernelUtils_adkernelUtils_js__WEBPACK_IMPORTED_MODULE_6__.getBidFloor)(bid, mediaType, sizes); + if (bidfloor) { + imp.bidfloor = bidfloor; + } +} +function getDefinedParamsOrEmpty(object, params) { + if (object === undefined) { + return {}; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDefinedParams)(object, params); +} + +/** + * Checks if configuration allows specified sync method + * @param syncRule {Object} + * @param bidderCode {string} + * @returns {boolean} + */ +function isSyncMethodAllowed(syncRule, bidderCode) { + if (!syncRule) { + return false; + } + let bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(syncRule.bidders) ? syncRule.bidders : [bidderCode]; + let rule = syncRule.filter === 'include'; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.contains)(bidders, bidderCode) === rule; +} + +/** + * Get preferred user-sync method based on publisher configuration + * @param bidderCode {string} + * @returns {number|undefined} + */ +function getAllowedSyncMethod(bidderCode) { + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('userSync.syncEnabled')) { + return; + } + let filterConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('userSync.filterSettings'); + if (isSyncMethodAllowed(filterConfig.all, bidderCode) || isSyncMethodAllowed(filterConfig.iframe, bidderCode)) { + return SYNC_IFRAME; + } else if (isSyncMethodAllowed(filterConfig.image, bidderCode)) { + return SYNC_IMAGE; + } +} + +/** + * Create device object from fpd and host-collected data + * @param fpd {Object} + * @returns {{device: Object}} + */ +function makeDevice(fpd) { + let device = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({ + 'ip': 'caller', + 'ipv6': 'caller', + 'ua': 'caller', + 'js': 1, + 'language': getLanguage() + }, fpd.device || {}); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)()) { + device.dnt = 1; + } + return { + device: device + }; +} + +/** + * Create site or app description object + * @param bidderRequest {BidderRequest} + * @param fpd {Object} + * @returns {{site: Object}|{app: Object}} + */ +function makeSiteOrApp(bidderRequest, fpd) { + let { + refererInfo + } = bidderRequest; + let appConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('app'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(appConfig)) { + return { + site: createSite(refererInfo, fpd) + }; + } else { + return { + app: appConfig + }; + } +} + +/** + * Create user description object + * @param bidderRequest {BidderRequest} + * @param fpd {Object} + * @returns {{user: Object} | undefined} + */ +function makeUser(bidderRequest, fpd) { + let { + gdprConsent + } = bidderRequest; + let user = fpd.user || {}; + if (gdprConsent && gdprConsent.consentString !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(user, 'ext.consent', gdprConsent.consentString); + } + let eids = getExtendedUserIds(bidderRequest); + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(user, 'ext.eids', eids); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(user)) { + return { + user: user + }; + } +} + +/** + * Create privacy regulations object + * @param bidderRequest {BidderRequest} + * @returns {{regs: Object} | undefined} + */ +function makeRegulations(bidderRequest) { + let { + gdprConsent, + uspConsent, + gppConsent + } = bidderRequest; + let regs = {}; + if (gdprConsent) { + if (gdprConsent.gdprApplies !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(regs, 'regs.ext.gdpr', ~~gdprConsent.gdprApplies); + } + } + if (gppConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(regs, 'regs.gpp', gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(regs, 'regs.gpp_sid', gppConsent.applicableSections); + } + if (uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(regs, 'regs.ext.us_privacy', uspConsent); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('coppa')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(regs, 'regs.coppa', 1); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(regs)) { + return regs; + } +} + +/** + * Create top-level request object + * @param bidderRequest {BidderRequest} + * @param imps {Object} Impressions + * @param fpd {Object} First party data + * @returns + */ +function makeBaseRequest(bidderRequest, imps, fpd) { + let request = { + 'id': bidderRequest.bidderRequestId, + 'imp': imps, + 'at': 1, + 'tmax': parseInt(bidderRequest.timeout) + }; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(fpd.bcat)) { + request.bcat = fpd.bcat; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(fpd.badv)) { + request.badv = fpd.badv; + } + return request; +} + +/** + * Initialize sync capabilities + * @param bidderRequest {BidderRequest} + */ +function makeSyncInfo(bidderRequest) { + let { + bidderCode + } = bidderRequest; + let syncMethod = getAllowedSyncMethod(bidderCode); + if (syncMethod) { + let res = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(res, 'ext.adk_usersync', syncMethod); + return res; + } +} + +/** + * Builds complete rtb request + * @param imps {Object} Collection of rtb impressions + * @param bidderRequest {BidderRequest} + * @param schain {Object=} Supply chain config + * @return {Object} Complete rtb request + */ +function buildRtbRequest(imps, bidderRequest, schain) { + let fpd = bidderRequest.ortb2 || {}; + let req = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(makeBaseRequest(bidderRequest, imps, fpd), makeDevice(fpd), makeSiteOrApp(bidderRequest, fpd), makeUser(bidderRequest, fpd), makeRegulations(bidderRequest), makeSyncInfo(bidderRequest)); + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(req, 'source.ext.schain', schain); + } + return req; +} + +/** + * Get browser language + * @returns {String} + */ +function getLanguage() { + const language = navigator.language ? 'language' : 'userLanguage'; + return navigator[language].split('-')[0]; +} + +/** + * Creates site description object + */ +function createSite(refInfo, fpd) { + let site = { + 'domain': refInfo.domain, + 'page': refInfo.page + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(site, fpd.site); + if (refInfo.ref != null) { + site.ref = refInfo.ref; + } else { + delete site.ref; + } + return site; +} +function getExtendedUserIds(bidderRequest) { + let eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidderRequest, 'bids.0.userIdAsEids'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(eids)) { + return eids; + } +} + +/** + * Format creative with optional nurl call + * @param bid rtb Bid object + */ +function formatAdMarkup(bid) { + let adm = bid.adm; + if ('nurl' in bid) { + adm += (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(`${bid.nurl}&px=1`); + } + return adm; +} + +/** + * Basic validates to comply with platform requirements + */ +function validateNativeAdUnit(adUnit) { + return validateNativeImageSize(adUnit.image) && validateNativeImageSize(adUnit.icon) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(adUnit, 'privacyLink.required') && + // not supported yet + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(adUnit, 'privacyIcon.required'); // not supported yet +} + +/** + * Validates image asset size definition + */ +function validateNativeImageSize(img) { + if (!img) { + return true; + } + if (img.sizes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(img.sizes, 2); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(img.aspect_ratios)) { + return img.aspect_ratios.length > 0 && img.aspect_ratios[0].min_height && img.aspect_ratios[0].min_width; + } + return true; +} + +/** + * Creates native ad for native 1.2 response + */ +function buildNativeAd(adm) { + let resp = JSON.parse(adm); + // temporary workaround for top-level native object wrapper + if ('native' in resp) { + resp = resp.native; + } + return resp; +} +function stripMultiformatSuffix(impid) { + return impid.substr(0, impid.length - MULTI_FORMAT_SUFFIX.length - 1); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('adkernelBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","adkernelUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adkernelBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adlooxAdServerVideo"],{ + +/***/ "./modules/adlooxAdServerVideo.js": +/*!****************************************!*\ + !*** ./modules/adlooxAdServerVideo.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export buildVideoUrl */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adServerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adServerManager.js */ "./src/adServerManager.js"); +/* harmony import */ var _adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adlooxAnalyticsAdapter.js */ "./modules/adlooxAnalyticsAdapter.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/targeting.js */ "./src/targeting.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + +/** + * This module adds [Adloox]{@link https://www.adloox.com/} Ad Server support for Video to Prebid + * @module modules/adlooxAdServerVideo + * @requires module:modules/adlooxAnalyticsAdapter + */ + +/* eslint prebid/validate-imports: "off" */ + + + + + + + +const MODULE = 'adlooxAdserverVideo'; +const URL_VAST = 'https://j.adlooxtracking.com/ads/vast/tag.php'; +function buildVideoUrl(options, callback) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(MODULE, 'buildVideoUrl', options); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(callback)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid callback'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(options)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'missing options'); + return false; + } + if (!(options.url_vast === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(options.url_vast))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid url_vast options value'); + return false; + } + if (!((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(options.adUnit) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(options.bid))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, "requires either 'adUnit' or 'bid' options value"); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(options.url)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid url options value'); + return false; + } + if (!(options.wrap === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)(options.wrap))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid wrap options value'); + return false; + } + if (!(options.blob === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)(options.blob))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid blob options value'); + return false; + } + + // same logic used in modules/dfpAdServerVideo.js + options.bid = options.bid || _src_targeting_js__WEBPACK_IMPORTED_MODULE_2__.targeting.getWinningBids(options.adUnit.code)[0]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(options.bid, 'ext.adloox.video.adserver', true); + if (options.wrap !== false) { + VASTWrapper(options, callback); + } else { + track(options, callback); + } + return true; +} +(0,_src_adServerManager_js__WEBPACK_IMPORTED_MODULE_4__.registerVideoSupport)('adloox', { + buildVideoUrl: buildVideoUrl +}); +function track(options, callback) { + callback(options.url); + const bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(options.bid); + bid.ext.adloox.video.adserver = false; + (0,_adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__.command)(_adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__.COMMAND.TRACK, { + eventType: _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.BID_WON, + args: bid + }); +} +function VASTWrapper(options, callback) { + const chain = []; + function process(result) { + function getAd(xml) { + if (!xml || xml.documentElement.tagName != 'VAST') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'not a VAST tag, using non-wrapped tracking'); + return; + } + const ads = xml.querySelectorAll('Ad'); + if (!ads.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'no VAST ads, using non-wrapped tracking'); + return; + } + + // get first Ad (VAST may be an Ad Pod so sort on sequence and pick lowest sequence number) + const ad = Array.prototype.slice.call(ads).sort(function (a, b) { + return parseInt(a.getAttribute('sequence'), 10) - parseInt(b.getAttribute('sequence'), 10); + }).shift(); + return ad; + } + function getWrapper(ad) { + return ad.querySelector('VASTAdTagURI'); + } + function durationToSeconds(duration) { + return Date.parse('1970-01-01 ' + duration + 'Z') / 1000; + } + function blobify() { + if (!(chain.length > 0 && options.blob !== false)) return; + const urls = []; + function toBlob(r) { + const text = new XMLSerializer().serializeToString(r.xml); + const url = URL.createObjectURL(new Blob([text], { + type: r.type + })); + urls.push(url); + return url; + } + let n = chain.length - 1; // do not process the linear + while (n-- > 0) { + const ad = getAd(chain[n].xml); + const wrapper = getWrapper(ad); + wrapper.textContent = toBlob(chain[n + 1]); + } + options.url = toBlob(chain[0]); + const epoch = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.timestamp)() - new Date().getTimezoneOffset() * 60 * 1000; + const expires0 = options.bid.ttl * 1000 - (epoch - options.bid.responseTimestamp); + const expires = Math.max(30 * 1000, expires0); + setTimeout(function () { + urls.forEach(u => URL.revokeObjectURL(u)); + }, expires); + } + if (!result) { + blobify(); + return track(options, callback); + } + const ad = getAd(result.xml); + if (!ad) { + blobify(); + return track(options, callback); + } + chain.push(result); + const wrapper = getWrapper(ad); + if (wrapper) { + if (chain.length > 5) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(MODULE, `got wrapped tag at depth ${chain.length}, not continuing`); + blobify(); + return track(options, callback); + } + return fetch(wrapper.textContent.trim()); + } + blobify(); + const version = chain[0].xml.documentElement.getAttribute('version'); + const vpaid = ad.querySelector("MediaFiles > MediaFile[apiFramework='VPAID'][type='application/javascript']"); + const duration = durationToSeconds(ad.querySelector('Duration').textContent.trim()); + let skip; + const skipd = ad.querySelector('Linear').getAttribute('skipoffset'); + if (skipd) skip = durationToSeconds(skipd.trim()); + const args = [['client', '%%client%%'], ['platform_id', '%%platformid%%'], ['scriptname', 'adl_%%clientid%%'], ['tag_id', '%%tagid%%'], ['fwtype', 4], ['vast', options.url], ['id11', 'video'], ['id12', '$ADLOOX_WEBSITE'], ['id18', !skip || skip >= duration ? 'fd' : 'od'], ['id19', 'na'], ['id20', 'na']]; + if (version && version != 3) args.push(['version', version]); + if (vpaid) args.push(['vpaid', 1]); + if (duration != 15) args.push(['duration', duration]); + if (skip) args.push(['skip', skip]); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(MODULE, `processed VAST tag chain of depth ${chain.depth}, running callback`); + (0,_adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__.command)(_adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__.COMMAND.URL, { + url: (options.url_vast || URL_VAST) + '?', + args: args, + bid: options.bid, + ids: true + }, callback); + } + function fetch(url, withoutcredentials) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(MODULE, `fetching VAST ${url}`); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, { + success: function (responseText, q) { + process({ + type: q.getResponseHeader('content-type'), + xml: q.responseXML + }); + }, + error: function (statusText, q) { + if (!withoutcredentials) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(MODULE, `unable to download (${statusText}), suspected CORS withCredentials problem, retrying without`); + return fetch(url, true); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, `failed to fetch (${statusText}), using non-wrapped tracking`); + process(); + } + }, undefined, { + withCredentials: !withoutcredentials + }); + } + fetch(options.url); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('adlooxAdServerVideo'); + +/***/ }), + +/***/ "./modules/adlooxAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/adlooxAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ COMMAND: () => (/* binding */ COMMAND), +/* harmony export */ command: () => (/* binding */ command) +/* harmony export */ }); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module provides [Adloox]{@link https://www.adloox.com/} Analytics + * The module will inject Adloox's verification JS tag alongside slot at bidWin + * @module modules/adlooxAnalyticsAdapter + */ + + + + + + + + + + + + +const MODULE = 'adlooxAnalyticsAdapter'; +const URL_JS = 'https://j.adlooxtracking.com/ads/js/tfav_adl_%%clientid%%.js'; +const ADLOOX_VENDOR_ID = 93; +const ADLOOX_MEDIATYPE = { + DISPLAY: 2, + VIDEO: 6 +}; +const MACRO = {}; +MACRO['client'] = function (b, c) { + return c.client; +}; +MACRO['clientid'] = function (b, c) { + return c.clientid; +}; +MACRO['tagid'] = function (b, c) { + return c.tagid; +}; +MACRO['platformid'] = function (b, c) { + return c.platformid; +}; +MACRO['targetelt'] = function (b, c) { + return c.toselector(b); +}; +MACRO['creatype'] = function (b, c) { + return b.mediaType == 'video' ? ADLOOX_MEDIATYPE.VIDEO : ADLOOX_MEDIATYPE.DISPLAY; +}; +MACRO['pageurl'] = function (b, c) { + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)(); + return (refererInfo.page || '').substr(0, 300).split(/[?#]/)[0]; +}; +MACRO['gpid'] = function (b, c) { + const adUnit = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(_src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__.auctionManager.getAdUnits(), a => b.adUnitCode === a.code); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'ortb2Imp.ext.data.pbadslot') || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(b.adUnitCode).gptSlot || b.adUnitCode; +}; +MACRO['pbAdSlot'] = MACRO['pbadslot'] = MACRO['gpid']; // legacy + +const PARAMS_DEFAULT = { + 'id1': function (b) { + return b.adUnitCode; + }, + 'id2': '%%gpid%%', + 'id3': function (b) { + return b.bidder; + }, + 'id4': function (b) { + return b.adId; + }, + 'id5': function (b) { + return b.dealId; + }, + 'id6': function (b) { + return b.creativeId; + }, + 'id7': function (b) { + return b.size; + }, + 'id11': '$ADLOOX_WEBSITE' +}; +let analyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (!analyticsAdapter[`handle_${eventType}`]) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'track', eventType, args); + analyticsAdapter[`handle_${eventType}`](args); + } +}); +analyticsAdapter.context = null; +analyticsAdapter.originEnableAnalytics = analyticsAdapter.enableAnalytics; +analyticsAdapter.enableAnalytics = function (config) { + analyticsAdapter.context = null; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'config', config); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(config.options)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'missing options'); + return; + } + if (!(config.options.js === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.js))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid js options value'); + return; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.js) && !/\.adlooxtracking\.(com|ru)$/.test((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.parseUrl)(config.options.js, { + 'noDecodeWholeURL': true + }).host)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, "invalid js options value, must be a sub-domain of 'adlooxtracking.com'"); + return; + } + if (!(config.options.toselector === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(config.options.toselector))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid toselector options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.client)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid client options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.clientid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid clientid options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.tagid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid tagid options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.platformid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid platformid options value'); + return; + } + if (!(config.options.params === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(config.options.params))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid params options value'); + return; + } + analyticsAdapter.context = { + js: config.options.js || URL_JS, + toselector: config.options.toselector || function (bid) { + let code = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(bid.adUnitCode).divId || bid.adUnitCode; + // https://mathiasbynens.be/notes/css-escapes + try { + code = CSS.escape(code); + } catch (_) { + code = code.replace(/^\d/, '\\3$& '); + } + return `#${code}`; + }, + client: config.options.client, + clientid: config.options.clientid, + tagid: config.options.tagid, + platformid: config.options.platformid, + params: [] + }; + config.options.params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.mergeDeep)({}, PARAMS_DEFAULT, config.options.params || {}); + Object.keys(config.options.params).forEach(k => { + if (!Array.isArray(config.options.params[k])) { + config.options.params[k] = [config.options.params[k]]; + } + config.options.params[k].forEach(v => analyticsAdapter.context.params.push([k, v])); + }); + Object.keys(COMMAND_QUEUE).forEach(commandProcess); + analyticsAdapter.originEnableAnalytics(config); +}; +analyticsAdapter.originDisableAnalytics = analyticsAdapter.disableAnalytics; +analyticsAdapter.disableAnalytics = function () { + analyticsAdapter.context = null; + analyticsAdapter.originDisableAnalytics(); +}; +analyticsAdapter.url = function (url, args, bid) { + // utils.formatQS outputs PHP encoded querystrings... (╯°□°)╯ ┻━┻ + function a2qs(a) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent + function fixedEncodeURIComponent(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16); + }); + } + const args = []; + let n = a.length; + while (n-- > 0) { + if (!(a[n][1] === undefined || a[n][1] === null || a[n][1] === false)) { + args.unshift(fixedEncodeURIComponent(a[n][0]) + (a[n][1] !== true ? '=' + fixedEncodeURIComponent(a[n][1]) : '')); + } + } + return args.join('&'); + } + const macros = str => { + return str.replace(/%%([a-z]+)%%/gi, (match, p1) => MACRO[p1] ? MACRO[p1](bid, analyticsAdapter.context) : match); + }; + url = macros(url); + args = args || []; + let n = args.length; + while (n-- > 0) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(args[n][1])) { + try { + args[n][1] = args[n][1](bid); + } catch (_) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'macro', args[n][0], _.message); + args[n][1] = `ERROR: ${_.message}`; + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(args[n][1])) { + args[n][1] = macros(args[n][1]); + } + } + return url + a2qs(args); +}; +const preloaded = {}; +analyticsAdapter[`handle_${_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.AUCTION_END}`] = function (auctionDetails) { + if (!(auctionDetails.auctionStatus == _src_auction_js__WEBPACK_IMPORTED_MODULE_8__.AUCTION_COMPLETED && auctionDetails.bidsReceived.length > 0)) return; + const uri = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.parseUrl)(analyticsAdapter.url(`${analyticsAdapter.context.js}#`)); + const href = `${uri.protocol}://${uri.host}${uri.pathname}`; + if (preloaded[href]) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, 'preloading verification JS'); + const link = document.createElement('link'); + link.setAttribute('href', href); + link.setAttribute('rel', 'preload'); + link.setAttribute('as', 'script'); + // TODO fix rules violation + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.insertElement)(link); + preloaded[href] = true; +}; +analyticsAdapter[`handle_${_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_WON}`] = function (bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ext.adloox.video.adserver')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, `measuring '${bid.mediaType}' ad unit code '${bid.adUnitCode}' via Ad Server module`); + return; + } + const sl = analyticsAdapter.context.toselector(bid); + let el; + try { + el = document.querySelector(sl); + } catch (_) {} + if (!el) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(MODULE, `unable to find ad unit code '${bid.adUnitCode}' slot using selector '${sl}' (use options.toselector to change), ignoring`); + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, `measuring '${bid.mediaType}' unit at '${bid.adUnitCode}'`); + const params = analyticsAdapter.context.params.concat([['tagid', '%%tagid%%'], ['platform', '%%platformid%%'], ['fwtype', 4], ['targetelt', '%%targetelt%%'], ['creatype', '%%creatype%%']]); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_9__.loadExternalScript)(analyticsAdapter.url(`${analyticsAdapter.context.js}#`, params, bid), _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_10__.MODULE_TYPE_ANALYTICS, 'adloox'); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__["default"].registerAnalyticsAdapter({ + adapter: analyticsAdapter, + code: 'adloox', + gvlid: ADLOOX_VENDOR_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (analyticsAdapter); + +// src/events.js does not support custom events or handle races... (╯°□°)╯ ┻━┻ +const COMMAND_QUEUE = {}; +const COMMAND = { + CONFIG: 'config', + TOSELECTOR: 'toselector', + URL: 'url', + TRACK: 'track' +}; +function command(cmd, data, callback0) { + const cid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getUniqueIdentifierStr)(); + const callback = function () { + delete COMMAND_QUEUE[cid]; + if (callback0) callback0.apply(null, arguments); + }; + COMMAND_QUEUE[cid] = { + cmd, + data, + callback + }; + if (analyticsAdapter.context) commandProcess(cid); +} +function commandProcess(cid) { + const { + cmd, + data, + callback + } = COMMAND_QUEUE[cid]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'command', cmd, data); + switch (cmd) { + case COMMAND.CONFIG: + const response = { + client: analyticsAdapter.context.client, + clientid: analyticsAdapter.context.clientid, + tagid: analyticsAdapter.context.tagid, + platformid: analyticsAdapter.context.platformid + }; + callback(response); + break; + case COMMAND.TOSELECTOR: + callback(analyticsAdapter.context.toselector(data.bid)); + break; + case COMMAND.URL: + if (data.ids) data.args = data.args.concat(analyticsAdapter.context.params.filter(p => /^id([1-9]|10)$/.test(p[0]))); // not >10 + callback(analyticsAdapter.url(data.url, data.args, data.bid)); + break; + case COMMAND.TRACK: + analyticsAdapter.track(data); + callback(); // drain queue + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(MODULE, 'command unknown', cmd); + // do not callback as arguments are unknown and to aid debugging + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('adlooxAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","analyticsAdapter","gptUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adlooxAdServerVideo.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adlooxAnalyticsAdapter"],{ + +/***/ "./modules/adlooxAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/adlooxAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ COMMAND: () => (/* binding */ COMMAND), +/* harmony export */ command: () => (/* binding */ command) +/* harmony export */ }); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module provides [Adloox]{@link https://www.adloox.com/} Analytics + * The module will inject Adloox's verification JS tag alongside slot at bidWin + * @module modules/adlooxAnalyticsAdapter + */ + + + + + + + + + + + + +const MODULE = 'adlooxAnalyticsAdapter'; +const URL_JS = 'https://j.adlooxtracking.com/ads/js/tfav_adl_%%clientid%%.js'; +const ADLOOX_VENDOR_ID = 93; +const ADLOOX_MEDIATYPE = { + DISPLAY: 2, + VIDEO: 6 +}; +const MACRO = {}; +MACRO['client'] = function (b, c) { + return c.client; +}; +MACRO['clientid'] = function (b, c) { + return c.clientid; +}; +MACRO['tagid'] = function (b, c) { + return c.tagid; +}; +MACRO['platformid'] = function (b, c) { + return c.platformid; +}; +MACRO['targetelt'] = function (b, c) { + return c.toselector(b); +}; +MACRO['creatype'] = function (b, c) { + return b.mediaType == 'video' ? ADLOOX_MEDIATYPE.VIDEO : ADLOOX_MEDIATYPE.DISPLAY; +}; +MACRO['pageurl'] = function (b, c) { + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)(); + return (refererInfo.page || '').substr(0, 300).split(/[?#]/)[0]; +}; +MACRO['gpid'] = function (b, c) { + const adUnit = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(_src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__.auctionManager.getAdUnits(), a => b.adUnitCode === a.code); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'ortb2Imp.ext.data.pbadslot') || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(b.adUnitCode).gptSlot || b.adUnitCode; +}; +MACRO['pbAdSlot'] = MACRO['pbadslot'] = MACRO['gpid']; // legacy + +const PARAMS_DEFAULT = { + 'id1': function (b) { + return b.adUnitCode; + }, + 'id2': '%%gpid%%', + 'id3': function (b) { + return b.bidder; + }, + 'id4': function (b) { + return b.adId; + }, + 'id5': function (b) { + return b.dealId; + }, + 'id6': function (b) { + return b.creativeId; + }, + 'id7': function (b) { + return b.size; + }, + 'id11': '$ADLOOX_WEBSITE' +}; +let analyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (!analyticsAdapter[`handle_${eventType}`]) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'track', eventType, args); + analyticsAdapter[`handle_${eventType}`](args); + } +}); +analyticsAdapter.context = null; +analyticsAdapter.originEnableAnalytics = analyticsAdapter.enableAnalytics; +analyticsAdapter.enableAnalytics = function (config) { + analyticsAdapter.context = null; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'config', config); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(config.options)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'missing options'); + return; + } + if (!(config.options.js === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.js))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid js options value'); + return; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.js) && !/\.adlooxtracking\.(com|ru)$/.test((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.parseUrl)(config.options.js, { + 'noDecodeWholeURL': true + }).host)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, "invalid js options value, must be a sub-domain of 'adlooxtracking.com'"); + return; + } + if (!(config.options.toselector === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(config.options.toselector))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid toselector options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.client)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid client options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.clientid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid clientid options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.tagid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid tagid options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.platformid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid platformid options value'); + return; + } + if (!(config.options.params === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(config.options.params))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid params options value'); + return; + } + analyticsAdapter.context = { + js: config.options.js || URL_JS, + toselector: config.options.toselector || function (bid) { + let code = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(bid.adUnitCode).divId || bid.adUnitCode; + // https://mathiasbynens.be/notes/css-escapes + try { + code = CSS.escape(code); + } catch (_) { + code = code.replace(/^\d/, '\\3$& '); + } + return `#${code}`; + }, + client: config.options.client, + clientid: config.options.clientid, + tagid: config.options.tagid, + platformid: config.options.platformid, + params: [] + }; + config.options.params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.mergeDeep)({}, PARAMS_DEFAULT, config.options.params || {}); + Object.keys(config.options.params).forEach(k => { + if (!Array.isArray(config.options.params[k])) { + config.options.params[k] = [config.options.params[k]]; + } + config.options.params[k].forEach(v => analyticsAdapter.context.params.push([k, v])); + }); + Object.keys(COMMAND_QUEUE).forEach(commandProcess); + analyticsAdapter.originEnableAnalytics(config); +}; +analyticsAdapter.originDisableAnalytics = analyticsAdapter.disableAnalytics; +analyticsAdapter.disableAnalytics = function () { + analyticsAdapter.context = null; + analyticsAdapter.originDisableAnalytics(); +}; +analyticsAdapter.url = function (url, args, bid) { + // utils.formatQS outputs PHP encoded querystrings... (╯°□°)╯ ┻━┻ + function a2qs(a) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent + function fixedEncodeURIComponent(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16); + }); + } + const args = []; + let n = a.length; + while (n-- > 0) { + if (!(a[n][1] === undefined || a[n][1] === null || a[n][1] === false)) { + args.unshift(fixedEncodeURIComponent(a[n][0]) + (a[n][1] !== true ? '=' + fixedEncodeURIComponent(a[n][1]) : '')); + } + } + return args.join('&'); + } + const macros = str => { + return str.replace(/%%([a-z]+)%%/gi, (match, p1) => MACRO[p1] ? MACRO[p1](bid, analyticsAdapter.context) : match); + }; + url = macros(url); + args = args || []; + let n = args.length; + while (n-- > 0) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(args[n][1])) { + try { + args[n][1] = args[n][1](bid); + } catch (_) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'macro', args[n][0], _.message); + args[n][1] = `ERROR: ${_.message}`; + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(args[n][1])) { + args[n][1] = macros(args[n][1]); + } + } + return url + a2qs(args); +}; +const preloaded = {}; +analyticsAdapter[`handle_${_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.AUCTION_END}`] = function (auctionDetails) { + if (!(auctionDetails.auctionStatus == _src_auction_js__WEBPACK_IMPORTED_MODULE_8__.AUCTION_COMPLETED && auctionDetails.bidsReceived.length > 0)) return; + const uri = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.parseUrl)(analyticsAdapter.url(`${analyticsAdapter.context.js}#`)); + const href = `${uri.protocol}://${uri.host}${uri.pathname}`; + if (preloaded[href]) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, 'preloading verification JS'); + const link = document.createElement('link'); + link.setAttribute('href', href); + link.setAttribute('rel', 'preload'); + link.setAttribute('as', 'script'); + // TODO fix rules violation + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.insertElement)(link); + preloaded[href] = true; +}; +analyticsAdapter[`handle_${_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_WON}`] = function (bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ext.adloox.video.adserver')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, `measuring '${bid.mediaType}' ad unit code '${bid.adUnitCode}' via Ad Server module`); + return; + } + const sl = analyticsAdapter.context.toselector(bid); + let el; + try { + el = document.querySelector(sl); + } catch (_) {} + if (!el) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(MODULE, `unable to find ad unit code '${bid.adUnitCode}' slot using selector '${sl}' (use options.toselector to change), ignoring`); + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, `measuring '${bid.mediaType}' unit at '${bid.adUnitCode}'`); + const params = analyticsAdapter.context.params.concat([['tagid', '%%tagid%%'], ['platform', '%%platformid%%'], ['fwtype', 4], ['targetelt', '%%targetelt%%'], ['creatype', '%%creatype%%']]); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_9__.loadExternalScript)(analyticsAdapter.url(`${analyticsAdapter.context.js}#`, params, bid), _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_10__.MODULE_TYPE_ANALYTICS, 'adloox'); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__["default"].registerAnalyticsAdapter({ + adapter: analyticsAdapter, + code: 'adloox', + gvlid: ADLOOX_VENDOR_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (analyticsAdapter); + +// src/events.js does not support custom events or handle races... (╯°□°)╯ ┻━┻ +const COMMAND_QUEUE = {}; +const COMMAND = { + CONFIG: 'config', + TOSELECTOR: 'toselector', + URL: 'url', + TRACK: 'track' +}; +function command(cmd, data, callback0) { + const cid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getUniqueIdentifierStr)(); + const callback = function () { + delete COMMAND_QUEUE[cid]; + if (callback0) callback0.apply(null, arguments); + }; + COMMAND_QUEUE[cid] = { + cmd, + data, + callback + }; + if (analyticsAdapter.context) commandProcess(cid); +} +function commandProcess(cid) { + const { + cmd, + data, + callback + } = COMMAND_QUEUE[cid]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'command', cmd, data); + switch (cmd) { + case COMMAND.CONFIG: + const response = { + client: analyticsAdapter.context.client, + clientid: analyticsAdapter.context.clientid, + tagid: analyticsAdapter.context.tagid, + platformid: analyticsAdapter.context.platformid + }; + callback(response); + break; + case COMMAND.TOSELECTOR: + callback(analyticsAdapter.context.toselector(data.bid)); + break; + case COMMAND.URL: + if (data.ids) data.args = data.args.concat(analyticsAdapter.context.params.filter(p => /^id([1-9]|10)$/.test(p[0]))); // not >10 + callback(analyticsAdapter.url(data.url, data.args, data.bid)); + break; + case COMMAND.TRACK: + analyticsAdapter.track(data); + callback(); // drain queue + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(MODULE, 'command unknown', cmd); + // do not callback as arguments are unknown and to aid debugging + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('adlooxAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adlooxAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adlooxRtdProvider"],{ + +/***/ "./modules/adlooxAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/adlooxAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ COMMAND: () => (/* binding */ COMMAND), +/* harmony export */ command: () => (/* binding */ command) +/* harmony export */ }); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module provides [Adloox]{@link https://www.adloox.com/} Analytics + * The module will inject Adloox's verification JS tag alongside slot at bidWin + * @module modules/adlooxAnalyticsAdapter + */ + + + + + + + + + + + + +const MODULE = 'adlooxAnalyticsAdapter'; +const URL_JS = 'https://j.adlooxtracking.com/ads/js/tfav_adl_%%clientid%%.js'; +const ADLOOX_VENDOR_ID = 93; +const ADLOOX_MEDIATYPE = { + DISPLAY: 2, + VIDEO: 6 +}; +const MACRO = {}; +MACRO['client'] = function (b, c) { + return c.client; +}; +MACRO['clientid'] = function (b, c) { + return c.clientid; +}; +MACRO['tagid'] = function (b, c) { + return c.tagid; +}; +MACRO['platformid'] = function (b, c) { + return c.platformid; +}; +MACRO['targetelt'] = function (b, c) { + return c.toselector(b); +}; +MACRO['creatype'] = function (b, c) { + return b.mediaType == 'video' ? ADLOOX_MEDIATYPE.VIDEO : ADLOOX_MEDIATYPE.DISPLAY; +}; +MACRO['pageurl'] = function (b, c) { + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)(); + return (refererInfo.page || '').substr(0, 300).split(/[?#]/)[0]; +}; +MACRO['gpid'] = function (b, c) { + const adUnit = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(_src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__.auctionManager.getAdUnits(), a => b.adUnitCode === a.code); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'ortb2Imp.ext.data.pbadslot') || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(b.adUnitCode).gptSlot || b.adUnitCode; +}; +MACRO['pbAdSlot'] = MACRO['pbadslot'] = MACRO['gpid']; // legacy + +const PARAMS_DEFAULT = { + 'id1': function (b) { + return b.adUnitCode; + }, + 'id2': '%%gpid%%', + 'id3': function (b) { + return b.bidder; + }, + 'id4': function (b) { + return b.adId; + }, + 'id5': function (b) { + return b.dealId; + }, + 'id6': function (b) { + return b.creativeId; + }, + 'id7': function (b) { + return b.size; + }, + 'id11': '$ADLOOX_WEBSITE' +}; +let analyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (!analyticsAdapter[`handle_${eventType}`]) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'track', eventType, args); + analyticsAdapter[`handle_${eventType}`](args); + } +}); +analyticsAdapter.context = null; +analyticsAdapter.originEnableAnalytics = analyticsAdapter.enableAnalytics; +analyticsAdapter.enableAnalytics = function (config) { + analyticsAdapter.context = null; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'config', config); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(config.options)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'missing options'); + return; + } + if (!(config.options.js === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.js))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid js options value'); + return; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.js) && !/\.adlooxtracking\.(com|ru)$/.test((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.parseUrl)(config.options.js, { + 'noDecodeWholeURL': true + }).host)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, "invalid js options value, must be a sub-domain of 'adlooxtracking.com'"); + return; + } + if (!(config.options.toselector === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(config.options.toselector))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid toselector options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(config.options.client)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid client options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.clientid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid clientid options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.tagid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid tagid options value'); + return; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(config.options.platformid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid platformid options value'); + return; + } + if (!(config.options.params === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(config.options.params))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'invalid params options value'); + return; + } + analyticsAdapter.context = { + js: config.options.js || URL_JS, + toselector: config.options.toselector || function (bid) { + let code = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(bid.adUnitCode).divId || bid.adUnitCode; + // https://mathiasbynens.be/notes/css-escapes + try { + code = CSS.escape(code); + } catch (_) { + code = code.replace(/^\d/, '\\3$& '); + } + return `#${code}`; + }, + client: config.options.client, + clientid: config.options.clientid, + tagid: config.options.tagid, + platformid: config.options.platformid, + params: [] + }; + config.options.params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.mergeDeep)({}, PARAMS_DEFAULT, config.options.params || {}); + Object.keys(config.options.params).forEach(k => { + if (!Array.isArray(config.options.params[k])) { + config.options.params[k] = [config.options.params[k]]; + } + config.options.params[k].forEach(v => analyticsAdapter.context.params.push([k, v])); + }); + Object.keys(COMMAND_QUEUE).forEach(commandProcess); + analyticsAdapter.originEnableAnalytics(config); +}; +analyticsAdapter.originDisableAnalytics = analyticsAdapter.disableAnalytics; +analyticsAdapter.disableAnalytics = function () { + analyticsAdapter.context = null; + analyticsAdapter.originDisableAnalytics(); +}; +analyticsAdapter.url = function (url, args, bid) { + // utils.formatQS outputs PHP encoded querystrings... (╯°□°)╯ ┻━┻ + function a2qs(a) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent + function fixedEncodeURIComponent(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16); + }); + } + const args = []; + let n = a.length; + while (n-- > 0) { + if (!(a[n][1] === undefined || a[n][1] === null || a[n][1] === false)) { + args.unshift(fixedEncodeURIComponent(a[n][0]) + (a[n][1] !== true ? '=' + fixedEncodeURIComponent(a[n][1]) : '')); + } + } + return args.join('&'); + } + const macros = str => { + return str.replace(/%%([a-z]+)%%/gi, (match, p1) => MACRO[p1] ? MACRO[p1](bid, analyticsAdapter.context) : match); + }; + url = macros(url); + args = args || []; + let n = args.length; + while (n-- > 0) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(args[n][1])) { + try { + args[n][1] = args[n][1](bid); + } catch (_) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(MODULE, 'macro', args[n][0], _.message); + args[n][1] = `ERROR: ${_.message}`; + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(args[n][1])) { + args[n][1] = macros(args[n][1]); + } + } + return url + a2qs(args); +}; +const preloaded = {}; +analyticsAdapter[`handle_${_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.AUCTION_END}`] = function (auctionDetails) { + if (!(auctionDetails.auctionStatus == _src_auction_js__WEBPACK_IMPORTED_MODULE_8__.AUCTION_COMPLETED && auctionDetails.bidsReceived.length > 0)) return; + const uri = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.parseUrl)(analyticsAdapter.url(`${analyticsAdapter.context.js}#`)); + const href = `${uri.protocol}://${uri.host}${uri.pathname}`; + if (preloaded[href]) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, 'preloading verification JS'); + const link = document.createElement('link'); + link.setAttribute('href', href); + link.setAttribute('rel', 'preload'); + link.setAttribute('as', 'script'); + // TODO fix rules violation + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.insertElement)(link); + preloaded[href] = true; +}; +analyticsAdapter[`handle_${_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_WON}`] = function (bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ext.adloox.video.adserver')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, `measuring '${bid.mediaType}' ad unit code '${bid.adUnitCode}' via Ad Server module`); + return; + } + const sl = analyticsAdapter.context.toselector(bid); + let el; + try { + el = document.querySelector(sl); + } catch (_) {} + if (!el) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(MODULE, `unable to find ad unit code '${bid.adUnitCode}' slot using selector '${sl}' (use options.toselector to change), ignoring`); + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(MODULE, `measuring '${bid.mediaType}' unit at '${bid.adUnitCode}'`); + const params = analyticsAdapter.context.params.concat([['tagid', '%%tagid%%'], ['platform', '%%platformid%%'], ['fwtype', 4], ['targetelt', '%%targetelt%%'], ['creatype', '%%creatype%%']]); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_9__.loadExternalScript)(analyticsAdapter.url(`${analyticsAdapter.context.js}#`, params, bid), _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_10__.MODULE_TYPE_ANALYTICS, 'adloox'); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__["default"].registerAnalyticsAdapter({ + adapter: analyticsAdapter, + code: 'adloox', + gvlid: ADLOOX_VENDOR_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (analyticsAdapter); + +// src/events.js does not support custom events or handle races... (╯°□°)╯ ┻━┻ +const COMMAND_QUEUE = {}; +const COMMAND = { + CONFIG: 'config', + TOSELECTOR: 'toselector', + URL: 'url', + TRACK: 'track' +}; +function command(cmd, data, callback0) { + const cid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getUniqueIdentifierStr)(); + const callback = function () { + delete COMMAND_QUEUE[cid]; + if (callback0) callback0.apply(null, arguments); + }; + COMMAND_QUEUE[cid] = { + cmd, + data, + callback + }; + if (analyticsAdapter.context) commandProcess(cid); +} +function commandProcess(cid) { + const { + cmd, + data, + callback + } = COMMAND_QUEUE[cid]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(MODULE, 'command', cmd, data); + switch (cmd) { + case COMMAND.CONFIG: + const response = { + client: analyticsAdapter.context.client, + clientid: analyticsAdapter.context.clientid, + tagid: analyticsAdapter.context.tagid, + platformid: analyticsAdapter.context.platformid + }; + callback(response); + break; + case COMMAND.TOSELECTOR: + callback(analyticsAdapter.context.toselector(data.bid)); + break; + case COMMAND.URL: + if (data.ids) data.args = data.args.concat(analyticsAdapter.context.params.filter(p => /^id([1-9]|10)$/.test(p[0]))); // not >10 + callback(analyticsAdapter.url(data.url, data.args, data.bid)); + break; + case COMMAND.TRACK: + analyticsAdapter.track(data); + callback(); // drain queue + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(MODULE, 'command unknown', cmd); + // do not callback as arguments are unknown and to aid debugging + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('adlooxAnalyticsAdapter'); + +/***/ }), + +/***/ "./modules/adlooxRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/adlooxRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export subModuleObj */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adlooxAnalyticsAdapter.js */ "./modules/adlooxAnalyticsAdapter.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + +/** + * This module adds the Adloox provider to the real time data module + * This module adds the [Adloox]{@link https://www.adloox.com/} provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch segments from Adloox's server + * @module modules/adlooxRtdProvider + * @requires module:modules/realTimeData + * @requires module:modules/adlooxAnalyticsAdapter + * @see module:modules/intersectionRtdProvider (optional) + */ + +/* eslint prebid/validate-imports: "off" */ + + + + + + + + + +const MODULE_NAME = 'adloox'; +const MODULE = `${MODULE_NAME}RtdProvider`; +const API_ORIGIN = 'https://p.adlooxtracking.com'; +const SEGMENT_HISTORIC = { + 'a': 'aud', + 'd': 'dis', + 'v': 'vid' +}; +const ADSERVER_TARGETING_PREFIX = 'adl'; +function init(config, userConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(MODULE, 'init', config, userConsent); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(config)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'missing config'); + return false; + } + if (config.params === undefined) config.params = {}; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(config.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid params'); + return false; + } + if (!(config.params.imps === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(config.params.imps) && config.params.imps > 0)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid imps params value'); + return false; + } + if (!(config.params.freqcap_ip === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(config.params.freqcap_ip) && config.params.freqcap_ip >= 0)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid freqcap_ip params value'); + return false; + } + if (!(config.params.freqcap_ipua === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(config.params.freqcap_ipua) && config.params.freqcap_ipua >= 0)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid freqcap_ipua params value'); + return false; + } + if (!(config.params.thresholds === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(config.params.thresholds) && config.params.thresholds.every(x => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(x) && x > 0 && x <= 100))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid thresholds params value'); + return false; + } + if (!(config.params.slotinpath === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)(config.params.slotinpath))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid slotinpath params value'); + return false; + } + // legacy/deprecated configuration code path + if (!(config.params.params === undefined || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(config.params.params) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(config.params.params.clientid) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(config.params.params.tagid) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(config.params.params.platformid))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'invalid subsection params block'); + return false; + } + config.params.thresholds = config.params.thresholds || [50, 60, 70, 80, 90]; + function analyticsConfigCallback(data) { + config = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(config.params, data); + } + if (config.params.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(MODULE, `legacy/deprecated configuration (please migrate to ${MODULE_NAME}AnalyticsAdapter)`); + analyticsConfigCallback(config.params.params); + } else { + (0,_adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__.command)(_adlooxAnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__.COMMAND.CONFIG, null, analyticsConfigCallback); + } + return true; +} +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + const adUnits0 = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().adUnits; + // adUnits must be ordered according to adUnitCodes for stable 's' param usage and handling the response below + const adUnits = reqBidsConfigObj.adUnitCodes.map(code => adUnits0.find(unit => unit.code == code)); + + // buildUrl creates PHP style multi-parameters and includes undefined... (╯°□°)╯ ┻━┻ + const url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)(`${API_ORIGIN}/q`), { + search: { + 'v': 'pbjs-v' + "9.45.0-pre", + 'c': config.params.clientid, + 'p': config.params.platformid, + 't': config.params.tagid, + 'imp': config.params.imps, + 'fc_ip': config.params.freqcap_ip, + 'fc_ipua': config.params.freqcap_ipua, + 'pn': ((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page || '').substr(0, 300).split(/[?#]/)[0], + 's': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(adUnits, function (unit) { + // gptPreAuction runs *after* RTD so pbadslot may not be populated... (╯°□°)╯ ┻━┻ + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(unit, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(unit, 'ortb2Imp.ext.data.pbadslot') || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__.getGptSlotInfoForAdUnitCode)(unit.code).gptSlot || unit.code; + const ref = [gpid]; + if (!config.params.slotinpath) ref.push(unit.code); + return ref.join('\t'); + }) + } + })).replace(/\[\]|[^?&]+=undefined/g, '').replace(/([?&])&+/g, '$1'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, function (responseText, q) { + function val(v, k) { + if (!(SEGMENT_HISTORIC[k] && v >= 0)) return v; + return config.params.thresholds.filter(t => t <= v); + } + const response = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.safeJSONParse)(responseText); + if (!response) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(MODULE, 'unexpected response'); + return callback(); + } + const { + site: ortb2site, + user: ortb2user + } = reqBidsConfigObj.ortb2Fragments.global; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(response, function (v0, k0) { + if (k0 == '_') return; + const k = SEGMENT_HISTORIC[k0] || k0; + const v = val(v0, k0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(k == k0 ? ortb2user : ortb2site, `ext.data.${MODULE_NAME}_rtd.${k}`, v); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(response._, function (segments, i) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(segments, function (v0, k0) { + const k = SEGMENT_HISTORIC[k0] || k0; + const v = val(v0, k0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(adUnits[i], `ortb2Imp.ext.data.${MODULE_NAME}_rtd.${k}`, v); + }); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2site, `ext.data.${MODULE_NAME}_rtd.ok`, true); + callback(); + }); +} +function getTargetingData(adUnitArray, config, userConsent, auction) { + function val(v) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(v) && v.length == 0) return undefined; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)(v)) v = ~~v; + if (!v) return undefined; // empty string and zero + return v; + } + const { + site: ortb2site, + user: ortb2user + } = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_8__.auctionManager.index.getAuction(auction).getFPD().global; + const ortb2base = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(ortb2site, ortb2user), `ext.data.${MODULE_NAME}_rtd`), function (v0, k) { + const v = val(v0); + if (v) ortb2base[`${ADSERVER_TARGETING_PREFIX}_${k}`] = v; + }); + const targeting = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(auction.adUnits.filter(unit => adUnitArray.includes(unit.code)), function (unit) { + targeting[unit.code] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(ortb2base); + const ortb2imp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(unit, `ortb2Imp.ext.data.${MODULE_NAME}_rtd`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(ortb2imp, function (v0, k) { + const v = val(v0); + if (v) targeting[unit.code][`${ADSERVER_TARGETING_PREFIX}_${k}`] = v; + }); + + // ATF results shamelessly exfiltrated from intersectionRtdProvider + const bid = unit.bids.find(bid => !!bid.intersection); + if (bid) { + const v = val(config.params.thresholds.filter(t => t <= bid.intersection.intersectionRatio * 100)); + if (v) targeting[unit.code][`${ADSERVER_TARGETING_PREFIX}_atf`] = v; + } + }); + return targeting; +} +const subModuleObj = { + name: MODULE_NAME, + init, + getBidRequestData, + getTargetingData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_9__.submodule)('realTimeData', subModuleObj); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('adlooxRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adlooxRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["admanBidAdapter"],{ + +/***/ "./modules/admanBidAdapter.js": +/*!************************************!*\ + !*** ./modules/admanBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + + + +const GVLID = 149; +const BIDDER_CODE = 'adman'; +const AD_URL = 'https://pub.admanmedia.com/?c=o&m=multi'; +const SYNC_URL = 'https://sync.admanmedia.com'; +const addCustomFieldsToPlacement = (bid, bidderRequest, placement) => { + placement.traffic = placement.adFormat; + if (placement.adFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + placement.wPlayer = placement.playerSize?.[0]?.[0]; + placement.hPlayer = placement.playerSize?.[0]?.[1]; + } +}; +const placementProcessingFunction = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildPlacementProcessingFunction)({ + addCustomFieldsToPlacement +}); +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const request = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequestsBase)({ + adUrl: AD_URL, + validBidRequests, + bidderRequest, + placementProcessingFunction + }); + const content = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.site.content', _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getAnyConfig('ortb2.site.content')); + if (content) { + request.data.content = content; + } + return request; +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['placementId']), + buildRequests, + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('admanBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/admanBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["admaruBidAdapter"],{ + +/***/ "./modules/admaruBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/admaruBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + +const ADMARU_ENDPOINT = 'https://p1.admaru.net/AdCall'; +const BIDDER_CODE = 'admaru'; +const DEFAULT_BID_TTL = 360; +const SYNC_URL = 'https://p2.admaru.net/UserSync/sync'; +function parseBid(rawBid, currency) { + const bid = {}; + bid.cpm = rawBid.price; + bid.impid = rawBid.impid; + bid.requestId = rawBid.impid; + bid.netRevenue = true; + bid.dealId = ''; + bid.creativeId = rawBid.crid; + bid.currency = currency; + bid.ad = rawBid.adm; + bid.width = rawBid.w; + bid.height = rawBid.h; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + bid.ttl = DEFAULT_BID_TTL; + return bid; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!(bid && bid.params && bid.params.pub_id && bid.params.adspace_id); + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bid => { + const payload = { + pub_id: bid.params.pub_id, + adspace_id: bid.params.adspace_id, + bidderRequestId: bid.bidderRequestId, + bidId: bid.bidId + }; + return { + method: 'GET', + url: ADMARU_ENDPOINT, + data: payload + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + let bid = null; + if (!serverResponse.hasOwnProperty('body') || !serverResponse.body.hasOwnProperty('seatbid')) { + return bidResponses; + } + const serverBody = serverResponse.body; + const seatbid = serverBody.seatbid; + for (let i = 0; i < seatbid.length; i++) { + if (!seatbid[i].hasOwnProperty('bid')) { + continue; + } + const innerBids = seatbid[i].bid; + for (let j = 0; j < innerBids.length; j++) { + bid = parseBid(innerBids[j], serverBody.cur); + bidResponses.push(bid); + } + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, responses) { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: SYNC_URL + }]; + } + if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: SYNC_URL + }]; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('admaruBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/admaruBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["admaticBidAdapter"],{ + +/***/ "./modules/admaticBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/admaticBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, resetUserSync */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/userSyncUtils/userSyncUtils.js */ "./libraries/userSyncUtils/userSyncUtils.js"); +/* harmony import */ var _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/precisoUtils/bidNativeUtils.js */ "./libraries/precisoUtils/bidNativeUtils.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +let SYNC_URL = 'https://static.cdn.admatic.com.tr/sync.html'; +const BIDDER_CODE = 'admatic'; +const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const spec = { + code: BIDDER_CODE, + gvlid: 1281, + aliases: [{ + code: 'admaticde', + gvlid: 1281 + }, { + code: 'pixad', + gvlid: 1281 + }, { + code: 'monetixads', + gvlid: 1281 + }, { + code: 'netaddiction', + gvlid: 1281 + }, { + code: 'adt', + gvlid: 779 + }, { + code: 'yobee', + gvlid: 1281 + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * f + * @param {object} bid + * @return {boolean} + */ + isBidRequestValid: bid => { + let isValid = false; + if (bid?.params) { + const isValidNetworkId = _validateId((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'networkId')); + const isValidHost = _validateString((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'host')); + isValid = isValidNetworkId && isValidHost; + } + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${bid.bidder} networkId and host parameters are required. Bid aborted.`); + } + return isValid; + }, + /** + * @param {BidRequest[]} validBidRequests + * @return {ServerRequest} + */ + buildRequests: (validBidRequests, bidderRequest) => { + const tmax = bidderRequest.timeout; + const bids = validBidRequests.map(buildRequestObject); + const ortb = bidderRequest.ortb2; + const networkId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(validBidRequests[0].params, 'networkId'); + let host = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(validBidRequests[0].params, 'host'); + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(bidderRequest) || null; + const bidderName = validBidRequests[0].bidder; + const payload = { + ortb, + site: { + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.page, + publisher: { + name: bidderRequest.refererInfo.domain, + publisherId: networkId + } + }, + imp: bids, + ext: { + bidder: bidderName + }, + schain: {}, + regs: { + ext: {} + }, + user: { + ext: {} + }, + at: 1, + tmax: parseInt(tmax) + }; + payload.ext.cur = currency; + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + const consentStr = bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') : ''; + const gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + payload.regs.ext.gdpr = gdpr; + payload.regs.ext.consent = consentStr; + } + if (bidderRequest && bidderRequest.coppa) { + payload.regs.ext.coppa = bidderRequest.coppa === true ? 1 : bidderRequest.coppa === false ? 0 : undefined; + } + if (bidderRequest && bidderRequest.ortb2?.regs?.gpp) { + payload.regs.ext.gpp = bidderRequest.ortb2?.regs?.gpp; + } + if (bidderRequest && bidderRequest.ortb2?.regs?.gpp_sid) { + payload.regs.ext.gpp_sid = bidderRequest.ortb2?.regs?.gpp_sid; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.regs.ext.uspIab = bidderRequest.uspConsent; + } + if (validBidRequests[0].schain) { + const schain = mapSchain(validBidRequests[0].schain); + if (schain) { + payload.schain = schain; + } + } + if (validBidRequests[0].userIdAsEids) { + const eids = { + eids: validBidRequests[0].userIdAsEids + }; + payload.user.ext = { + ...payload.user.ext, + ...eids + }; + } + if (payload) { + const domain = {}; + domain.parts = host.split('rtb.'); + if (domain.parts.length > 1) { + domain.url = domain.parts[1]; + } + SYNC_URL = `https://static.cdn.${domain.url}/${bidderName}/sync.html`; + host = host.replace('https://', '').replace('http://', '').replace('/', ''); + return { + method: 'POST', + url: `https://${host}/pb`, + data: payload, + options: { + contentType: 'application/json' + } + }; + } + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + if (!hasSynced && syncOptions.iframeEnabled) { + // Retrieve the sync parameters + const params = (0,_libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_3__.getUserSyncParams)(gdprConsent, uspConsent, gppConsent); + + // Create a URL object from SYNC_URL + const urlObj = new URL(SYNC_URL); + + // Append each parameter from the params object to the URL's search parameters + Object.keys(params).forEach(key => { + urlObj.searchParams.append(key, params[key]); + }); + hasSynced = true; + return { + type: 'iframe', + url: urlObj.toString() + }; + } + }, + /** + * @param {*} response + * @param {ServerRequest} request + * @return {Bid[]} + */ + interpretResponse: (response, request) => { + const body = response.body; + const bidResponses = []; + if (body && body?.data && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(body.data)) { + body.data.forEach(bid => { + const bidRequest = getAssociatedBidRequest(request.data.imp, bid); + if (bidRequest) { + const resbid = { + requestId: bid.id, + cpm: bid.price, + width: bid.width, + height: bid.height, + currency: body.cur, + netRevenue: true, + creativeId: bid.creative_id, + meta: { + model: bid.mime_type, + advertiserDomains: bid && bid.adomain ? bid.adomain : [] + }, + bidder: bid.bidder, + mediaType: bid.type, + ttl: 60 + }; + if (resbid.mediaType === 'video' && isUrl(bid.party_tag)) { + resbid.vastUrl = bid.party_tag; + } else if (resbid.mediaType === 'video') { + resbid.vastXml = bid.party_tag; + } else if (resbid.mediaType === 'banner') { + resbid.ad = bid.party_tag; + } else if (resbid.mediaType === 'native') { + resbid.native = (0,_libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_4__.interpretNativeAd)(bid.party_tag); + } + ; + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidRequest, 'mediatype.context'); + if (resbid.mediaType === 'video' && context === 'outstream') { + resbid.renderer = createOutstreamVideoRenderer(bid); + } + bidResponses.push(resbid); + } + }); + } + return bidResponses; + } +}; +var hasSynced = false; +function resetUserSync() { + hasSynced = false; +} + +/** + * @param {object} schain object set by Publisher + * @returns {object} OpenRTB SupplyChain object + */ +function mapSchain(schain) { + if (!schain) { + return null; + } + if (!validateSchain(schain)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('AdMatic: required schain params missing'); + return null; + } + return schain; +} + +/** + * @param {object} schain object set by Publisher + * @returns {object} bool + */ +function validateSchain(schain) { + if (!schain.nodes) { + return false; + } + const requiredFields = ['asi', 'sid', 'hp']; + return schain.nodes.every(node => { + return requiredFields.every(field => node[field]); + }); +} +function isUrl(str) { + try { + URL(str); + return true; + } catch (error) { + return false; + } +} +; +function outstreamRender(bid) { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + targetId: bid.adUnitCode, + adResponse: bid.adResponse + }); + }); +} +function createOutstreamVideoRenderer(bid) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__.Renderer.install({ + id: bid.bidId, + url: RENDERER_URL, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Prebid Error calling setRender on renderer' + err); + } + return renderer; +} +function getAssociatedBidRequest(bidRequests, bid) { + for (const request of bidRequests) { + if (request.id === bid.id) { + return request; + } + } + return undefined; +} +function enrichSlotWithFloors(slot, bidRequest) { + try { + const slotFloors = {}; + if (bidRequest.getFloor) { + if (bidRequest.mediaTypes?.banner) { + slotFloors.banner = {}; + const bannerSizes = parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidRequest, 'mediaTypes.banner.sizes')); + bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = bidRequest.getFloor({ + size: bannerSize, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + })); + } + if (bidRequest.mediaTypes?.video) { + slotFloors.video = {}; + const videoSizes = parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidRequest, 'mediaTypes.video.playerSize')); + videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = bidRequest.getFloor({ + size: videoSize, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO + })); + } + if (bidRequest.mediaTypes?.native) { + slotFloors.native = {}; + slotFloors.native['*'] = bidRequest.getFloor({ + size: '*', + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE + }); + } + if (Object.keys(slotFloors).length > 0) { + if (!slot) { + slot = {}; + } + Object.assign(slot, { + floors: slotFloors + }); + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Could not parse floors from Prebid: ' + e); + } +} +function parseSizes(sizes) { + let parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : s => s; + if (sizes == undefined) { + return []; + } + if (Array.isArray(sizes[0])) { + // is there several sizes ? (ie. [[728,90],[200,300]]) + return sizes.map(size => parser(size)); + } + return [parser(sizes)]; // or a single one ? (ie. [728,90]) +} +function parseSize(size) { + return size[0] + 'x' + size[1]; +} +function buildRequestObject(bid) { + const reqObj = {}; + reqObj.size = getSizes(bid); + if (bid.mediaTypes?.banner) { + reqObj.type = 'banner'; + reqObj.mediatype = {}; + } + if (bid.mediaTypes?.video) { + reqObj.type = 'video'; + reqObj.mediatype = bid.mediaTypes.video; + } + if (bid.mediaTypes?.native) { + reqObj.type = 'native'; + reqObj.size = [{ + w: 1, + h: 1 + }]; + reqObj.mediatype = bid.mediaTypes.native; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2Imp.ext')) { + reqObj.ext = bid.ortb2Imp.ext; + } + reqObj.id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidId', bid); + enrichSlotWithFloors(reqObj, bid); + return reqObj; +} +function getSizes(bid) { + return concatSizes(bid); +} +function concatSizes(bid) { + let playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.playerSize'); + let videoSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.sizes'); + let nativeSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.sizes'); + let bannerSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.banner.sizes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bannerSizes) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(playerSize) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(videoSizes)) { + let mediaTypesSizes = [bannerSizes, videoSizes, nativeSizes, playerSize]; + return mediaTypesSizes.reduce(function (acc, currSize) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(currSize)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(currSize[0])) { + currSize.forEach(function (childSize) { + acc.push({ + w: childSize[0], + h: childSize[1] + }); + }); + } + } + return acc; + }, []); + } +} +function _validateId(id) { + return parseInt(id) > 0; +} +function _validateString(str) { + return typeof str == 'string'; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('admaticBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","precisoUtils","userSyncUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/admaticBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["admediaBidAdapter"],{ + +/***/ "./modules/admediaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/admediaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'admedia'; +const ENDPOINT_URL = 'https://prebid.admedia.com/bidder/'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @return Array Info describing the request to the server. + * @param validBidRequests + * @param bidderRequest + */ + buildRequests: function (validBidRequests, bidderRequest) { + if (validBidRequests.length === 0) { + return []; + } + return validBidRequests.map(bidRequest => { + let sizes = []; + if (bidRequest.mediaTypes && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes) { + sizes = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + } + var tagData = []; + for (var i = 0, j = sizes.length; i < j; i++) { + let tag = {}; + tag.sizes = []; + tag.id = bidRequest.params.placementId; + tag.aid = bidRequest.params.aid; + tag.sizes.push(sizes[i].toString().replace(',', 'x')); + tagData.push(tag); + } + const payload = { + id: bidRequest.params.placementId, + aid: bidRequest.params.aid, + tags: tagData, + bidId: bidRequest.bidId, + referer: encodeURIComponent(bidderRequest.refererInfo.page) + }; + return { + method: 'POST', + url: ENDPOINT_URL, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const requiredKeys = ['requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId', 'netRevenue', 'currency', 'meta']; + const validBidResponses = []; + serverResponse = serverResponse.body.tags; + if (serverResponse && serverResponse.length > 0) { + serverResponse.forEach(bid => { + const bidResponse = {}; + for (const requiredKey of requiredKeys) { + if (!bid.hasOwnProperty(requiredKey)) { + return []; + } + bidResponse[requiredKey] = bid[requiredKey]; + } + if (!(typeof bid.meta.advertiserDomains !== 'undefined' && bid.meta.advertiserDomains.length > 0)) { + return []; + } + validBidResponses.push(bidResponse); + }); + } + return validBidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) {}, + onTimeout: function (timeoutData) {}, + onBidWon: function (bid) {} +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('admediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/admediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["admixerBidAdapter"],{ + +/***/ "./modules/admixerBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/admixerBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +const BIDDER_CODE = 'admixer'; +const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx'; +const ALIASES = [{ + code: 'go2net', + endpoint: 'https://ads.go2net.com.ua/prebid.1.2.aspx' +}, 'adblender', { + code: 'futureads', + endpoint: 'https://ads.futureads.io/prebid.1.2.aspx' +}, { + code: 'smn', + endpoint: 'https://ads.smn.rs/prebid.1.2.aspx' +}, { + code: 'admixeradx', + endpoint: 'https://inv-nets.admixer.net/adxprebid.1.2.aspx' +}, 'rtbstack']; +const spec = { + code: BIDDER_CODE, + aliases: ALIASES.map(val => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(val) ? val : val.code), + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + */ + isBidRequestValid: function (bid) { + return bid.bidder === 'rtbstack' ? !!bid.params.tagId : !!bid.params.zone; + }, + /** + * Make a server request from the list of BidRequests. + */ + buildRequests: function (validRequest, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validRequest = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validRequest); + let w; + let docRef; + do { + w = w ? w.parent : window; + try { + docRef = w.document.referrer; + } catch (e) { + break; + } + } while (w !== window.top); + const payload = { + imps: [], + ortb2: bidderRequest.ortb2, + docReferrer: docRef + }; + let endpointUrl; + if (bidderRequest) { + // checks if there is specified any endpointUrl in bidder config + endpointUrl = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('bidderURL'); + if (!endpointUrl && bidderRequest.bidderCode === 'rtbstack') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('The bidderUrl config is required for RTB Stack bids. Please set it with setBidderConfig() for "rtbstack".'); + return; + } + // TODO: is 'page' the right value here? + if (bidderRequest.refererInfo?.page) { + payload.referrer = encodeURIComponent(bidderRequest.refererInfo.page); + } + if (bidderRequest.gdprConsent) { + payload.gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + // will check if the gdprApplies field was populated with a boolean value (ie from page config). If it's undefined, then default to true + gdprApplies: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : true + }; + } + if (bidderRequest.uspConsent) { + payload.uspConsent = bidderRequest.uspConsent; + } + } + validRequest.forEach(bid => { + let imp = {}; + Object.keys(bid).forEach(key => imp[key] = bid[key]); + imp.ortb2 && delete imp.ortb2; + let bidFloor = getBidFloor(bid); + if (bidFloor) { + imp.bidFloor = bidFloor; + } + payload.imps.push(imp); + }); + let urlForRequest = endpointUrl || getEndpointUrl(bidderRequest.bidderCode); + return { + method: 'POST', + url: urlForRequest, + data: payload + }; + }, + /** + * Unpack the response from the server into a list of bids. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + try { + const { + body: { + ads = [] + } = {} + } = serverResponse; + ads.forEach(ad => bidResponses.push(ad)); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { + const pixels = []; + serverResponses.forEach(_ref => { + let { + body: { + cm = {} + } = {} + } = _ref; + const { + pixels: img = [], + iframes: frm = [] + } = cm; + if (syncOptions.pixelEnabled) { + img.forEach(url => pixels.push({ + type: 'image', + url + })); + } + if (syncOptions.iframeEnabled) { + frm.forEach(url => pixels.push({ + type: 'iframe', + url + })); + } + }); + return pixels; + } +}; +function getEndpointUrl(code) { + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(ALIASES, val => val.code === code)?.endpoint || ENDPOINT_URL; +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'params.bidFloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; + } catch (_) { + return 0; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('admixerBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/admixerBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["admixerIdSystem"],{ + +/***/ "./modules/admixerIdSystem.js": +/*!************************************!*\ + !*** ./modules/admixerIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, admixerIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds AdmixerId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/admixerIdSubmodule + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const NAME = 'admixerId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: NAME +}); + +/** @type {Submodule} */ +const admixerIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: NAME, + /** + * used to specify vendor id + * @type {number} + */ + gvlid: 511, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{admixerId:string}} + */ + decode(value) { + return { + 'admixerId': value + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {IdResponse|undefined} + */ + getId(config) { + let { + gdpr: consentData + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const { + e, + p, + pid + } = config && config.params || {}; + if (!pid || typeof pid !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('admixerId submodule requires partner id to be defined'); + return; + } + const gdpr = consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies ? 1 : 0; + const consentString = gdpr ? consentData.consentString : ''; + if (gdpr && !consentString) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Consent string is required to call admixer id.'); + return; + } + const url = `https://inv-nets.admixer.net/cntcm.aspx?ssp=${pid}${e ? `&e=${e}` : ''}${p ? `&p=${p}` : ''}${consentString ? `&cs=${consentString}` : ''}`; + const resp = function (callback) { + if (window.admixTMLoad && window.admixTMLoad.push) { + window.admixTMLoad.push(function () { + window.admixTM.retrieveVisitorId(function (visitorId) { + if (visitorId) { + callback(visitorId); + } else { + callback(); + } + }); + }); + } else { + retrieveVisitorId(url, callback); + } + }; + return { + callback: resp + }; + }, + eids: { + 'admixerId': { + source: 'admixer.net', + atype: 3 + } + } +}; +function retrieveVisitorId(url, callback) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, { + success: response => { + const { + setData: { + visitorid + } = {} + } = JSON.parse(response || '{}'); + if (visitorid) { + callback(visitorid); + } else { + callback(); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`admixerId: fetch encountered an error`, error); + callback(); + } + }, undefined, { + method: 'GET', + withCredentials: true + }); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', admixerIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('admixerIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/admixerIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adnowBidAdapter"],{ + +/***/ "./modules/adnowBidAdapter.js": +/*!************************************!*\ + !*** ./modules/adnowBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + +const BIDDER_CODE = 'adnow'; +const ENDPOINT = 'https://n.nnowa.com/a'; + +/** + * @typedef {object} CommonBidData + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + * + * @property {string} requestId The specific BidRequest which this bid is aimed at. + * This should match the BidRequest.bidId which this Bid targets. + * @property {string} currency The currency code for the cpm value + * @property {number} cpm The bid price, in US cents per thousand impressions. + * @property {string} creativeId The id of ad content + * @property {number} ttl Time-to-live - how long (in seconds) Prebid can use this bid. + * @property {boolean} netRevenue Boolean defining whether the bid is Net or Gross. The default is true (Net). + * @property {object} [meta] Object for storing bid meta data + * @property {string} [meta.mediaType] banner or native + */ + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * @param {object} bid + * @return {boolean} + */ + isBidRequestValid(bid) { + if (!bid || !bid.params) return false; + const codeId = parseInt(bid.params.codeId, 10); + if (!codeId) { + return false; + } + const mediaType = bid.params.mediaType || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(this.supportedMediaTypes, mediaType); + }, + /** + * @param {BidRequest[]} validBidRequests + * @param {*} bidderRequest + * @return {ServerRequest} + */ + buildRequests(validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + return validBidRequests.map(req => { + const mediaType = this._isBannerRequest(req) ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + const codeId = parseInt(req.params.codeId, 10); + const data = { + Id: codeId, + mediaType: mediaType, + out: 'prebid', + d_user_agent: navigator.userAgent, + requestid: req.bidId + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + data.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseSizesInput)(req.mediaTypes && req.mediaTypes.banner && req.mediaTypes.banner.sizes).join('|'); + } else { + data.width = data.height = 200; + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(req, 'mediaTypes.native.image.sizes', []); + if (sizes.length > 0) { + const size = Array.isArray(sizes[0]) ? sizes[0] : sizes; + data.width = size[0] || data.width; + data.height = size[1] || data.height; + } + } + + /** @type {ServerRequest} */ + return { + method: 'GET', + url: ENDPOINT, + data: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseQueryStringParameters)(data), + options: { + withCredentials: false, + crossOrigin: true + }, + bidRequest: req + }; + }); + }, + /** + * @param {*} response + * @param {ServerRequest} request + * @return {Bid[]} + */ + interpretResponse(response, request) { + const bidObj = request.bidRequest; + let bid = response.body; + if (!bid || !bid.currency || !bid.cpm) { + return []; + } + const mediaType = bid.meta.mediaType || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + if (!(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(this.supportedMediaTypes, mediaType)) { + return []; + } + bid.requestId = bidObj.bidId; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + return [this._getBannerBid(bid)]; + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + return [this._getNativeBid(bid)]; + } + return []; + }, + /** + * @private + * @param {object} bid + * @return {CommonBidData} + */ + _commonBidData(bid) { + return { + requestId: bid.requestId, + currency: bid.currency || 'USD', + cpm: bid.cpm || 0.00, + creativeId: bid.creativeId || 'undefined-creative', + netRevenue: bid.netRevenue || true, + ttl: bid.ttl || 360, + meta: bid.meta || {} + }; + }, + /** + * @param {BidRequest} req + * @return {boolean} + * @private + */ + _isBannerRequest(req) { + return !!(req.mediaTypes && req.mediaTypes.banner); + }, + /** + * @private + * @param {object} bid + * @return {Bid} + */ + _getBannerBid(bid) { + return { + ...this._commonBidData(bid), + width: bid.width || 300, + height: bid.height || 250, + ad: bid.ad || '
Empty Ad
' + }; + }, + /** + * @private + * @param {object} bid + * @return {Bid} + */ + _getNativeBid(bid) { + return { + ...this._commonBidData(bid), + native: bid.native || {} + }; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('adnowBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adnowBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adnuntiusAnalyticsAdapter"],{ + +/***/ "./modules/adnuntiusAnalyticsAdapter.js": +/*!**********************************************!*\ + !*** ./modules/adnuntiusAnalyticsAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export BID_WON_TIMEOUT */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + + + + +const URL = 'https://analytics.adnuntius.com/prebid'; +const REQUEST_SENT = 1; +const RESPONSE_SENT = 2; +const WIN_SENT = 4; +const TIMEOUT_SENT = 8; +const AD_RENDER_FAILED_SENT = 16; +let initOptions; +const BID_WON_TIMEOUT = 500; +const cache = { + auctions: {} +}; +const adnAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + url: '', + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + const time = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.timestamp)(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_EVENT:', [eventType, args]); + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AUCTION_INIT: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_AUCTION_INIT:', args); + cache.auctions[args.auctionId] = { + bids: {}, + bidAdUnits: {} + }; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_REQUESTED: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_BID_REQUESTED:', args); + cache.auctions[args.auctionId].timeStamp = args.start; + args.bids.forEach(function (bidReq) { + cache.auctions[args.auctionId].gdprApplies = args.gdprConsent ? args.gdprConsent.gdprApplies : undefined; + cache.auctions[args.auctionId].gdprConsent = args.gdprConsent ? args.gdprConsent.consentString : undefined; + const container = document.getElementById(bidReq.adUnitCode); + const containerAttr = container ? container.getAttribute('data-adunitid') : undefined; + const adUnitId = containerAttr || undefined; + cache.auctions[args.auctionId].bids[bidReq.bidId] = { + bidder: bidReq.bidder, + adUnit: bidReq.adUnitCode, + adUnitId: adUnitId, + isBid: false, + won: false, + timeout: false, + sendStatus: 0, + readyToSend: 0, + start: args.start, + auc: bidReq.auc, + buc: bidReq.buc, + lw: bidReq.lw + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(bidReq); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(adnAnalyticsAdapter.requestEvents); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_RESPONSE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_BID_RESPONSE:', args); + const bidResp = cache.auctions[args.auctionId].bids[args.requestId]; + bidResp.isBid = args.getStatusCode() === _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.STATUS.GOOD; + bidResp.width = args.width; + bidResp.height = args.height; + bidResp.cpm = args.cpm; + bidResp.currency = args.currency; + bidResp.originalCpm = args.originalCpm; + bidResp.originalCurrency = args.originalCurrency; + bidResp.ttr = args.timeToRespond; + bidResp.readyToSend = 1; + bidResp.mediaType = args.mediaType === 'native' ? 2 : args.mediaType === 'video' ? 4 : 1; + bidResp.meta = args.meta; + if (!bidResp.ttr) { + bidResp.ttr = time - bidResp.start; + } + if (!cache.auctions[args.auctionId].bidAdUnits[bidResp.adUnit]) { + cache.auctions[args.auctionId].bidAdUnits[bidResp.adUnit] = { + sent: 0, + lw: bidResp.lw, + adUnitId: bidResp.adUnitId, + timeStamp: cache.auctions[args.auctionId].timeStamp + }; + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BIDDER_DONE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_BIDDER_DONE:', args); + args.bids.forEach(doneBid => { + let bid = cache.auctions[doneBid.auctionId].bids[doneBid.bidId || doneBid.requestId]; + if (!bid.ttr) { + bid.ttr = time - bid.start; + } + bid.readyToSend = 1; + }); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_WON: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_BID_WON:', args); + const wonBid = cache.auctions[args.auctionId].bids[args.requestId]; + wonBid.won = true; + wonBid.rUp = args.rUp; + wonBid.meta = args.meta; + wonBid.dealId = args.dealId; + if (wonBid.sendStatus !== 0) { + adnAnalyticsAdapter.sendEvents(); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AD_RENDER_SUCCEEDED: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_AD_RENDER_SUCCEEDED:', args); + const adRenderSucceeded = cache.auctions[args.bid.auctionId].bids[args.bid.requestId]; + adRenderSucceeded.renderedTimestamp = Date.now(); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AD_RENDER_FAILED: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_AD_RENDER_FAILED:', args); + const adRenderFailedBid = cache.auctions[args.bid.auctionId].bids[args.bid.requestId]; + adRenderFailedBid.adRenderFailed = true; + adRenderFailedBid.reason = args.reason; + adRenderFailedBid.message = args.message; + if (adRenderFailedBid.sendStatus !== 0) { + adnAnalyticsAdapter.sendEvents(); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_TIMEOUT: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_BID_TIMEOUT:', args); + args.forEach(timeout => { + cache.auctions[timeout.auctionId].bids[timeout.bidId].timeout = true; + }); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AUCTION_END: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ADN_AUCTION_END:', args); + setTimeout(() => { + adnAnalyticsAdapter.sendEvents(); + }, BID_WON_TIMEOUT); + break; + } + } +}); + +// save the base class function +adnAnalyticsAdapter.originEnableAnalytics = adnAnalyticsAdapter.enableAnalytics; +adnAnalyticsAdapter.allRequestEvents = []; + +// override enableAnalytics so we can get access to the config passed in from the page +adnAnalyticsAdapter.enableAnalytics = function (config) { + initOptions = config.options; + adnAnalyticsAdapter.originEnableAnalytics(config); +}; +adnAnalyticsAdapter.sendEvents = function () { + const sentRequests = getSentRequests(); + const events = { + publisherId: initOptions.publisherId, + gdpr: sentRequests.gdpr, + auctionIds: sentRequests.auctionIds, + requests: sentRequests.sentRequests, + responses: getResponses(sentRequests.gdpr, sentRequests.auctionIds), + wins: getWins(sentRequests.gdpr, sentRequests.auctionIds), + timeouts: getTimeouts(sentRequests.gdpr, sentRequests.auctionIds), + bidAdUnits: getBidAdUnits(), + rf: getAdRenderFailed(sentRequests.auctionIds), + ext: initOptions.ext + }; + if (events.requests.length === 0 && events.responses.length === 0 && events.wins.length === 0 && events.timeouts.length === 0 && events.rf.length === 0) { + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(initOptions.endPoint || URL, undefined, JSON.stringify(events), { + method: 'POST' + }); +}; +function getSentRequests() { + const sentRequests = []; + const gdpr = []; + const auctionIds = []; + Object.keys(cache.auctions).forEach(auctionId => { + const auction = cache.auctions[auctionId]; + const gdprPos = getGdprPos(gdpr, auction); + const auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let bid = auction.bids[bidId]; + if (!(bid.sendStatus & REQUEST_SENT)) { + bid.sendStatus |= REQUEST_SENT; + sentRequests.push({ + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + bidder: bid.bidder, + timeStamp: auction.timeStamp, + gdpr: gdprPos, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw + }); + } + }); + }); + return { + gdpr: gdpr, + auctionIds: auctionIds, + sentRequests: sentRequests + }; +} +function getResponses(gdpr, auctionIds) { + const responses = []; + Object.keys(cache.auctions).forEach(auctionId => { + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let auction = cache.auctions[auctionId]; + let gdprPos = getGdprPos(gdpr, auction); + let auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + let bid = auction.bids[bidId]; + if (bid.readyToSend && !(bid.sendStatus & RESPONSE_SENT) && !bid.timeout) { + bid.sendStatus |= RESPONSE_SENT; + let response = getResponseObject(auction, bid, gdprPos, auctionIdPos); + responses.push(response); + } + }); + }); + return responses; +} +function getWins(gdpr, auctionIds) { + const wins = []; + Object.keys(cache.auctions).forEach(auctionId => { + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + const auction = cache.auctions[auctionId]; + const gdprPos = getGdprPos(gdpr, auction); + const auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + const bid = auction.bids[bidId]; + if (!(bid.sendStatus & WIN_SENT) && bid.won) { + bid.sendStatus |= WIN_SENT; + wins.push({ + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + bidder: bid.bidder, + timeStamp: auction.timeStamp, + width: bid.width, + height: bid.height, + cpm: bid.cpm, + currency: bid.currency, + originalCpm: bid.originalCpm, + originalCurrency: bid.originalCurrency, + mediaType: bid.mediaType, + gdpr: gdprPos, + auctionId: auctionIdPos, + auc: bid.auc, + lw: bid.lw, + buc: bid.buc, + rUp: bid.rUp, + meta: bid.meta, + dealId: bid.dealId + }); + } + }); + }); + return wins; +} +function getGdprPos(gdpr, auction) { + let gdprPos; + for (gdprPos = 0; gdprPos < gdpr.length; gdprPos++) { + if (gdpr[gdprPos].gdprApplies === auction.gdprApplies && gdpr[gdprPos].gdprConsent === auction.gdprConsent) { + break; + } + } + if (gdprPos === gdpr.length) { + gdpr[gdprPos] = { + gdprApplies: auction.gdprApplies, + gdprConsent: auction.gdprConsent + }; + } + return gdprPos; +} +function getAuctionIdPos(auIds, auId) { + let auctionIdPos; + for (auctionIdPos = 0; auctionIdPos < auIds.length; auctionIdPos++) { + if (auIds[auctionIdPos] === auId) { + break; + } + } + if (auctionIdPos === auIds.length) { + auIds[auctionIdPos] = auId; + } + return auctionIdPos; +} +function getResponseObject(auction, bid, gdprPos, auctionIdPos) { + return { + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + bidder: bid.bidder, + timeStamp: auction.timeStamp, + renderedTimestamp: bid.renderedTimestamp, + width: bid.width, + height: bid.height, + cpm: bid.cpm, + currency: bid.currency, + originalCpm: bid.originalCpm, + originalCurrency: bid.originalCurrency, + ttr: bid.ttr, + isBid: bid.isBid, + mediaType: bid.mediaType, + gdpr: gdprPos, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw, + meta: bid.meta + }; +} +function getTimeouts(gdpr, auctionIds) { + const timeouts = []; + Object.keys(cache.auctions).forEach(auctionId => { + const auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + const auction = cache.auctions[auctionId]; + const gdprPos = getGdprPos(gdpr, auction); + const bid = auction.bids[bidId]; + if (!(bid.sendStatus & TIMEOUT_SENT) && bid.timeout) { + bid.sendStatus |= TIMEOUT_SENT; + let timeout = getResponseObject(auction, bid, gdprPos, auctionIdPos); + timeouts.push(timeout); + } + }); + }); + return timeouts; +} +function getAdRenderFailed(auctionIds) { + const adRenderFails = []; + Object.keys(cache.auctions).forEach(auctionId => { + const auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + const auction = cache.auctions[auctionId]; + const bid = auction.bids[bidId]; + if (!(bid.sendStatus & AD_RENDER_FAILED_SENT) && bid.adRenderFailed) { + bid.sendStatus |= AD_RENDER_FAILED_SENT; + adRenderFails.push({ + bidder: bid.bidder, + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + timeStamp: auction.timeStamp, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw, + rsn: bid.reason, + msg: bid.message + }); + } + }); + }); + return adRenderFails; +} +function getBidAdUnits() { + const bidAdUnits = []; + Object.keys(cache.auctions).forEach(auctionId => { + const auction = cache.auctions[auctionId]; + Object.keys(auction.bidAdUnits).forEach(adUnit => { + const bidAdUnit = auction.bidAdUnits[adUnit]; + if (!bidAdUnit.sent) { + bidAdUnit.sent = 1; + bidAdUnits.push({ + adUnit: adUnit, + adUnitId: bidAdUnit.adUnitId, + timeStamp: bidAdUnit.timeStamp, + lw: bidAdUnit.lw + }); + } + }); + }); + return bidAdUnits; +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: adnAnalyticsAdapter, + code: 'adnuntius' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (adnAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adnuntiusAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adnuntiusAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adnuntiusBidAdapter"],{ + +/***/ "./modules/adnuntiusBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/adnuntiusBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports misc, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +const BIDDER_CODE = 'adnuntius'; +const BIDDER_CODE_DEAL_ALIAS_BASE = 'adndeal'; +const BIDDER_CODE_DEAL_ALIASES = [1, 2, 3, 4, 5].map(num => { + return BIDDER_CODE_DEAL_ALIAS_BASE + num; +}); +const GVLID = 855; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const MAXIMUM_DEALS_LIMIT = 5; +const VALID_BID_TYPES = ['netBid', 'grossBid']; +const METADATA_KEY = 'adn.metaData'; +const METADATA_KEY_SEPARATOR = '@@@'; +const ENVS = { + localhost: { + id: 'localhost', + as: 'localhost:8078' + }, + lcl: { + id: 'lcl', + as: 'adserver.dev.lcl.test' + }, + andemu: { + id: 'andemu', + as: '10.0.2.2:8078' + }, + dev: { + id: 'dev', + as: 'adserver.dev.adnuntius.com' + }, + staging: { + id: 'staging', + as: 'adserver.staging.adnuntius.com' + }, + production: { + id: 'production', + as: 'ads.adnuntius.delivery', + asEu: 'europe.delivery.adnuntius.com' + }, + cloudflare: { + id: 'cloudflare', + as: 'ads.adnuntius.delivery' + }, + limited: { + id: 'limited', + as: 'limited.delivery.adnuntius.com' + } +}; +const misc = { + findHighestPrice: function (arr, bidType) { + return arr.reduce((highest, cur) => { + const currentBid = cur[bidType]; + const highestBid = highest[bidType]; + return currentBid.currency === highestBid.currency && currentBid.amount > highestBid.amount ? cur : highest; + }, arr[0]); + } +}; +const storageTool = function () { + const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE + }); + let metaInternal; + const getMetaDataFromLocalStorage = function (pNetwork) { + if (!storage.localStorageIsEnabled()) { + return []; + } + let parsedJson; + try { + parsedJson = JSON.parse(storage.getDataFromLocalStorage(METADATA_KEY)); + } catch (e) { + return []; + } + let network = pNetwork; + if (Array.isArray(pNetwork)) { + network = (pNetwork.find(p => p.network) || {}).network; + } + let filteredEntries = parsedJson ? parsedJson.filter(datum => { + if (datum.key === 'voidAuIds' && Array.isArray(datum.value)) { + return true; + } + return datum.key && datum.value && datum.exp && datum.exp > (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUnixTimestampFromNow)() && (!network || network === datum.network); + }) : []; + const voidAuIdsEntry = filteredEntries.find(entry => entry.key === 'voidAuIds'); + if (voidAuIdsEntry) { + const now = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUnixTimestampFromNow)(); + voidAuIdsEntry.value = voidAuIdsEntry.value.filter(voidAuId => voidAuId.auId && voidAuId.exp > now); + if (!voidAuIdsEntry.value.length) { + filteredEntries = filteredEntries.filter(entry => entry.key !== 'voidAuIds'); + } + } + return filteredEntries; + }; + const setMetaInternal = function (apiRespMetadata, network) { + if (!storage.localStorageIsEnabled()) { + return; + } + const updateVoidAuIds = function (currentVoidAuIds, auIdsAsString) { + const newAuIds = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(auIdsAsString) ? auIdsAsString.split(';') : []; + const notNewExistingAuIds = currentVoidAuIds.filter(auIdObj => { + return newAuIds.indexOf(auIdObj.value) < -1; + }) || []; + const oneDayFromNow = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUnixTimestampFromNow)(1); + const apiIdsArray = newAuIds.map(auId => { + return { + exp: oneDayFromNow, + auId: auId + }; + }) || []; + return notNewExistingAuIds.concat(apiIdsArray) || []; + }; + + // use the metadata key separator to distinguish the same key for different networks. + const metaAsObj = getMetaDataFromLocalStorage().reduce((a, entry) => ({ + ...a, + [entry.key + METADATA_KEY_SEPARATOR + (entry.network ? entry.network : '')]: { + value: entry.value, + exp: entry.exp, + network: entry.network + } + }), {}); + for (const key in apiRespMetadata) { + if (key !== 'voidAuIds') { + metaAsObj[key + METADATA_KEY_SEPARATOR + network] = { + value: apiRespMetadata[key], + exp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUnixTimestampFromNow)(100), + network: network + }; + } + } + const currentAuIds = updateVoidAuIds(metaAsObj.voidAuIds || [], apiRespMetadata.voidAuIds); + if (currentAuIds.length > 0) { + metaAsObj.voidAuIds = { + value: currentAuIds + }; + } + const metaDataForSaving = Object.entries(metaAsObj).map(entrySet => { + if (entrySet.length !== 2) { + return {}; + } + const key = entrySet[0].split(METADATA_KEY_SEPARATOR)[0]; + if (key === 'voidAuIds') { + return { + key: key, + value: entrySet[1].value + }; + } + return { + key: key, + value: entrySet[1].value, + exp: entrySet[1].exp, + network: entrySet[1].network + }; + }).filter(entry => entry.key); + storage.setDataInLocalStorage(METADATA_KEY, JSON.stringify(metaDataForSaving)); + }; + const getFirstValidValueFromArray = function (arr, param) { + const example = (arr || []).find(b => { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(b, param); + }); + return example ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(example, param) : undefined; + }; + return { + refreshStorage: function (validBidRequests, bidderRequest) { + const bidParams = (bidderRequest.bids || []).map(b => { + return b.params ? b.params : {}; + }); + metaInternal = getMetaDataFromLocalStorage(bidParams).reduce((a, entry) => ({ + ...a, + [entry.key]: entry.value + }), {}); + const bidParamUserId = getFirstValidValueFromArray(bidParams, 'userId'); + const ortb2 = bidderRequest.ortb2 || {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(bidParamUserId)) { + metaInternal.usi = bidParamUserId; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(ortb2?.user?.id)) { + metaInternal.usi = ortb2.user.id; + } else { + const unvettedOrtb2Eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2, 'user.ext.eids'); + const vettedOrtb2Eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(unvettedOrtb2Eids) && unvettedOrtb2Eids.length > 0 ? unvettedOrtb2Eids : false; + if (vettedOrtb2Eids) { + metaInternal.eids = vettedOrtb2Eids; + } + } + if (!metaInternal.usi) { + delete metaInternal.usi; + } + if (metaInternal.voidAuIds) { + metaInternal.voidAuIdsArray = metaInternal.voidAuIds.map(voidAuId => { + return voidAuId.auId; + }); + } + }, + saveToStorage: function (serverData, network) { + setMetaInternal(serverData, network); + }, + getUrlRelatedData: function () { + // getting the URL information is theoretically not network-specific + const { + usi, + voidAuIdsArray, + eids + } = metaInternal; + return { + usi, + voidAuIdsArray, + eids + }; + }, + getPayloadRelatedData: function (network) { + // getting the payload data should be network-specific + const { + segments, + usi, + userId, + voidAuIdsArray, + voidAuIds, + ...payloadRelatedData + } = getMetaDataFromLocalStorage(network).reduce((a, entry) => ({ + ...a, + [entry.key]: entry.value + }), {}); + return payloadRelatedData; + } + }; +}(); +const targetingTool = function () { + const getSegmentsFromOrtb = function (bidderRequest) { + const userData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest.ortb2 || {}, 'user.data'); + let segments = []; + if (userData && Array.isArray(userData)) { + userData.forEach(userdat => { + if (userdat.segment) { + segments.push(...userdat.segment.map(segment => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(segment)) return segment; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(segment.id)) return segment.id; + }).filter(seg => !!seg)); + } + }); + } + return segments; + }; + const getKvsFromOrtb = function (bidderRequest, path) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest.ortb2 || {}, path); + }; + return { + addSegmentsToUrlData: function (validBids, bidderRequest, existingUrlRelatedData) { + let segments = getSegmentsFromOrtb(bidderRequest || {}); + for (let i = 0; i < validBids.length; i++) { + const bid = validBids[i]; + const targeting = bid.params.targeting || {}; + if (Array.isArray(targeting.segments)) { + segments = segments.concat(targeting.segments); + delete bid.params.targeting.segments; + } + } + existingUrlRelatedData.segments = segments; + }, + mergeKvsFromOrtb: function (bidTargeting, bidderRequest) { + const siteKvs = getKvsFromOrtb(bidderRequest || {}, 'site.ext.data'); + const userKvs = getKvsFromOrtb(bidderRequest || {}, 'user.ext.data'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(siteKvs) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(userKvs)) { + return; + } + if (bidTargeting.kv && !Array.isArray(bidTargeting.kv)) { + bidTargeting.kv = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.convertObjectToArray)(bidTargeting.kv); + } + bidTargeting.kv = bidTargeting.kv || []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(siteKvs)) { + bidTargeting.kv = bidTargeting.kv.concat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.convertObjectToArray)(siteKvs)); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(userKvs)) { + bidTargeting.kv = bidTargeting.kv.concat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.convertObjectToArray)(userKvs)); + } + } + }; +}(); +const validateBidType = function (bidTypeOption) { + return VALID_BID_TYPES.indexOf(bidTypeOption || '') > -1 ? bidTypeOption : 'bid'; +}; +const AU_ID_REGEX = new RegExp('^[0-9A-Fa-f]{1,20}$'); +const spec = { + code: BIDDER_CODE, + aliases: BIDDER_CODE_DEAL_ALIASES, + gvlid: GVLID, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bid) { + // The auId MUST be a hexadecimal string + const validAuId = AU_ID_REGEX.test(bid.params.auId); + return !!(validAuId && (bid.bidId || bid.params.member && bid.params.invCode)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const queryParamsAndValues = []; + queryParamsAndValues.push('tzo=' + new Date().getTimezoneOffset()); + queryParamsAndValues.push('format=prebid'); + const gdprApplies = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent.gdprApplies'); + const consentString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent.consentString'); + queryParamsAndValues.push('pbv=' + window.pbjs.version); + if (gdprApplies !== undefined) { + const flag = gdprApplies ? '1' : '0'; + queryParamsAndValues.push('consentString=' + consentString); + queryParamsAndValues.push('gdpr=' + flag); + } + const win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)() || window; + if (win.screen && win.screen.availHeight) { + queryParamsAndValues.push('screen=' + win.screen.availWidth + 'x' + win.screen.availHeight); + } + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)(); + if (innerWidth) { + queryParamsAndValues.push('viewport=' + innerWidth + 'x' + innerHeight); + } + const searchParams = new URLSearchParams(window.location.search); + if (searchParams.has('script-override')) { + queryParamsAndValues.push('so=' + searchParams.get('script-override')); + } + storageTool.refreshStorage(validBidRequests, bidderRequest); + const urlRelatedMetaData = storageTool.getUrlRelatedData(); + targetingTool.addSegmentsToUrlData(validBidRequests, bidderRequest, urlRelatedMetaData); + if (urlRelatedMetaData.segments.length > 0) queryParamsAndValues.push('segments=' + urlRelatedMetaData.segments.join(',')); + if (urlRelatedMetaData.usi) queryParamsAndValues.push('userId=' + urlRelatedMetaData.usi); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(urlRelatedMetaData.eids) && urlRelatedMetaData.eids.length > 0) queryParamsAndValues.push('eids=' + encodeURIComponent(JSON.stringify(urlRelatedMetaData.eids))); + const bidderConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig(); + if (bidderConfig.useCookie === false) queryParamsAndValues.push('noCookies=true'); + if (bidderConfig.advertiserTransparency === true) queryParamsAndValues.push('advertiserTransparency=true'); + if (bidderConfig.maxDeals > 0) queryParamsAndValues.push('ds=' + Math.min(bidderConfig.maxDeals, MAXIMUM_DEALS_LIMIT)); + const bidRequests = {}; + const networks = {}; + for (let i = 0; i < validBidRequests.length; i++) { + const bid = validBidRequests[i]; + if (urlRelatedMetaData.voidAuIdsArray && (urlRelatedMetaData.voidAuIdsArray.indexOf(bid.params.auId) > -1 || urlRelatedMetaData.voidAuIdsArray.indexOf(bid.params.auId.padStart(16, '0')) > -1)) { + // This auId is void. Do NOT waste time and energy sending a request to the server + continue; + } + const network = bid.params.network || 'network'; + bidRequests[network] = bidRequests[network] || []; + bidRequests[network].push(bid); + networks[network] = networks[network] || {}; + networks[network].adUnits = networks[network].adUnits || []; + const refererInfo = bidderRequest && bidderRequest.refererInfo ? bidderRequest.refererInfo : {}; + if (refererInfo.page) { + networks[network].context = bidderRequest.refererInfo.page; + } + if (refererInfo.canonicalUrl) { + networks[network].canonical = bidderRequest.refererInfo.canonicalUrl; + } + const payloadRelatedData = storageTool.getPayloadRelatedData(bid.params.network); + if (Object.keys(payloadRelatedData).length > 0) { + networks[network].metaData = payloadRelatedData; + } + const bidTargeting = { + ...(bid.params.targeting || {}) + }; + targetingTool.mergeKvsFromOrtb(bidTargeting, bidderRequest); + const mediaTypes = bid.mediaTypes || {}; + const validMediaTypes = SUPPORTED_MEDIA_TYPES.filter(mt => { + return mediaTypes[mt]; + }) || []; + if (validMediaTypes.length === 0) { + // banner ads by default if nothing specified, dimensions to be derived from the ad unit within adnuntius system + validMediaTypes.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } + const isSingleFormat = validMediaTypes.length === 1; + validMediaTypes.forEach(mediaType => { + const mediaTypeData = mediaTypes[mediaType]; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && mediaTypeData && mediaTypeData.context === 'outstream') { + return; + } + const targetId = (bid.params.targetId || bid.bidId) + (isSingleFormat || mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER ? '' : '-' + mediaType); + const adUnit = { + ...bidTargeting, + auId: bid.params.auId, + targetId: targetId + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + adUnit.adType = 'VAST'; + } else if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + adUnit.adType = 'NATIVE'; + if (!mediaTypeData.ortb) { + // assume it's using old format if ortb not specified + const legacyStyleNativeRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(mediaTypeData); + const nativeOrtb = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_5__.toOrtbNativeRequest)(legacyStyleNativeRequest); + // add explicit event tracker requests for impressions and viewable impressions, which do not exist in legacy format + nativeOrtb.eventtrackers = [{ + 'event': 1, + 'methods': [1] + }, { + 'event': 2, + 'methods': [1] + }]; + adUnit.nativeRequest = { + ortb: nativeOrtb + }; + } else { + adUnit.nativeRequest = { + ortb: mediaTypeData.ortb + }; + } + } + const maxDeals = Math.max(0, Math.min(bid.params.maxDeals || 0, MAXIMUM_DEALS_LIMIT)); + if (maxDeals > 0) { + adUnit.maxDeals = maxDeals; + } + if (mediaType !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && mediaTypeData && mediaTypeData.sizes) { + adUnit.dimensions = mediaTypeData.sizes; + } + networks[network].adUnits.push(adUnit); + }); + } + const requests = []; + const networkKeys = Object.keys(networks); + for (let j = 0; j < networkKeys.length; j++) { + const network = networkKeys[j]; + let requestURL = gdprApplies ? ENVS.production.asEu : ENVS.production.as; + if (bidderConfig.env && ENVS[bidderConfig.env]) { + requestURL = ENVS[bidderConfig.env][bidderConfig.endPointType || 'as']; + } + requestURL = (bidderConfig.protocol || 'https') + '://' + requestURL + '/i'; + requests.push({ + method: 'POST', + url: requestURL + '?' + queryParamsAndValues.join('&'), + data: JSON.stringify(networks[network]), + bid: bidRequests[network] + }); + } + return requests; + }, + interpretResponse: function (serverResponse, bidRequest) { + if (serverResponse.body.metaData) { + storageTool.saveToStorage(serverResponse.body.metaData, serverResponse.body.network); + } + const responseAdUnits = serverResponse.body.adUnits; + let validatedBidType = validateBidType(_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig().bidType); + if (bidRequest.bid) { + bidRequest.bid.forEach(b => { + if (b.params && b.params.bidType) { + validatedBidType = validateBidType(b.params.bidType); + } + }); + } + function buildAdResponse(bidderCode, ad, adUnit, dealCount, bidOnRequest) { + const advertiserDomains = ad.advertiserDomains || []; + if (advertiserDomains.length === 0) { + const destinationUrls = ad.destinationUrls || {}; + for (const value of Object.values(destinationUrls)) { + advertiserDomains.push(value.split('/')[2]); + } + } + const adResponse = { + bidderCode: bidderCode, + requestId: adUnit.targetId, + cpm: ad[validatedBidType] ? ad[validatedBidType].amount * 1000 : 0, + width: Number(ad.creativeWidth), + height: Number(ad.creativeHeight), + creativeId: ad.creativeId, + currency: ad.bid ? ad.bid.currency : 'EUR', + dealId: ad.dealId || '', + dealCount: dealCount, + meta: { + advertiserDomains: advertiserDomains + }, + netRevenue: false, + ttl: 360 + }; + // Deal bids provide the rendered ad content along with the + // bid; whereas regular bids have it stored on the ad-unit. + const isDeal = dealCount > 0; + const renderSource = isDeal ? ad : adUnit; + if (renderSource.vastXml) { + adResponse.vastXml = renderSource.vastXml; + adResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else if (renderSource.nativeJson) { + adResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + if (bidOnRequest.mediaTypes?.native && !bidOnRequest.mediaTypes?.native?.ortb) { + adResponse.native = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_5__.toLegacyResponse)(renderSource.nativeJson.ortb, (0,_src_native_js__WEBPACK_IMPORTED_MODULE_5__.toOrtbNativeRequest)(bidOnRequest.mediaTypes.native)); + } else { + adResponse.native = renderSource.nativeJson; + } + } else { + adResponse.ad = renderSource.html; + } + return adResponse; + } + const highestYieldingAdUnits = []; + if (responseAdUnits.length === 1) { + highestYieldingAdUnits.push(responseAdUnits[0]); + } else if (responseAdUnits.length > 1) { + bidRequest.bid.forEach(resp => { + const multiFormatAdUnits = []; + SUPPORTED_MEDIA_TYPES.forEach(mediaType => { + const suffix = mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER ? '' : '-' + mediaType; + const targetId = (resp?.params?.targetId || resp.bidId) + suffix; + const au = responseAdUnits.find(rAu => { + return rAu.targetId === targetId && rAu.matchedAdCount > 0; + }); + if (au) { + multiFormatAdUnits.push(au); + } + }); + if (multiFormatAdUnits.length > 0) { + const highestYield = multiFormatAdUnits.length === 1 ? multiFormatAdUnits[0] : multiFormatAdUnits.reduce((highest, cur) => { + const highestBid = misc.findHighestPrice(highest.ads, validatedBidType)[validatedBidType]; + const curBid = misc.findHighestPrice(cur.ads, validatedBidType)[validatedBidType]; + return curBid.currency === highestBid.currency && curBid.amount > highestBid.amount ? cur : highest; + }, multiFormatAdUnits[0]); + highestYield.targetId = resp.bidId; + highestYieldingAdUnits.push(highestYield); + } + }); + } + const bidRequestsById = bidRequest.bid.reduce((response, bid) => { + return { + ...response, + [bid.bidId]: bid + }; + }, {}); + const hasBidAdUnits = highestYieldingAdUnits.filter(au => { + const bid = bidRequestsById[au.targetId]; + if (bid && bid.bidder && BIDDER_CODE_DEAL_ALIASES.indexOf(bid.bidder) < 0) { + return au.matchedAdCount > 0; + } else { + // We do NOT accept bids when using this adaptor via one of the + // "deals" aliases; those requests are for ONLY getting deals from Adnuntius + return false; + } + }); + const hasDealsAdUnits = highestYieldingAdUnits.filter(au => { + return au.deals && au.deals.length > 0; + }); + const dealAdResponses = hasDealsAdUnits.reduce((response, au) => { + const selBidRequest = bidRequestsById[au.targetId]; + if (selBidRequest) { + (au.deals || []).forEach((deal, i) => { + response.push(buildAdResponse(selBidRequest.bidder, deal, au, i + 1, selBidRequest)); + }); + } + return response; + }, []); + const bidAdResponses = hasBidAdUnits.reduce((response, au) => { + const selBidRequest = bidRequestsById[au.targetId]; + if (selBidRequest) { + response.push(buildAdResponse(selBidRequest.bidder, au.ads[0], au, 0, selBidRequest)); + } + return response; + }, []); + return [...dealAdResponses, ...bidAdResponses]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('adnuntiusBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adnuntiusBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adnuntiusRtdProvider"],{ + +/***/ "./modules/adnuntiusRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/adnuntiusRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports adnuntiusSubmodule, beforeInit */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const GVLID = 855; +function init(config, userConsent) { + if (!config.params || !config.params.providers) return false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(userConsent); + return true; +} + +// Make sure that ajax has a function as callback +function prepProvider(provider) { + // Map parameter to something that adnuntius endpoint understands. + const mappedParameters = { + siteId: 's', + userId: 'browserId', + browserId: 'browserId', + folderId: 'folderId' + }; + const tzo = new Date().getTimezoneOffset(); + const URL = ['https://data.adnuntius.com/usr?tzo=' + tzo]; + Object.keys(provider).forEach(key => { + URL.push(`${mappedParameters[key]}=${provider[key]}`); + }); + return new Promise((resolve, reject) => { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(URL.join('&'), { + success: function (res) { + const response = JSON.parse(res); + resolve(response); + }, + error: function (err) { + reject(err); + } + }); + }); +} +function setGlobalConfig(config, segments) { + const ortbSegments = { + ortb2: { + user: { + data: [{ + name: 'adnuntius', + segment: segments + }] + } + } + }; + if (config.params && config.params.bidders) { + _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.mergeBidderConfig({ + bidders: config.params.bidders, + config: ortbSegments + }); + } else { + _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.mergeConfig(ortbSegments); + } +} +function alterBidRequests(reqBidsConfigObj, callback, config, userConsent) { + const gdpr = userConsent && userConsent.gdpr; + let allowedToRun = true; + if (gdpr) { + if (userConsent.gdpr.gdprApplies) { + if (gdpr.gdprApplies && !gdpr.vendorData.vendorConsents[GVLID]) allowedToRun = false; + } + } + if (allowedToRun) { + const providerRequests = config.params.providers.map(provider => prepProvider(provider)); + Promise.allSettled(providerRequests).then(values => { + const segments = values.reduce((segments, array) => array.status === 'fulfilled' ? segments.concat(array.value.segments) : [], []).map(segmentId => ({ + id: segmentId + })); + setGlobalConfig(config, segments); + callback(); + }).catch(err => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('ADN: err', err)); + } else callback(); +} + +/** @type {RtdSubmodule} */ +const adnuntiusSubmodule = { + name: 'adnuntius', + init: init, + getBidRequestData: alterBidRequests, + setGlobalConfig: setGlobalConfig +}; +function beforeInit() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('realTimeData', adnuntiusSubmodule); +} +beforeInit(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('adnuntiusRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adnuntiusRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adoceanBidAdapter"],{ + +/***/ "./modules/adoceanBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/adoceanBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +const BIDDER_CODE = 'adocean'; +const URL_SAFE_FIELDS = { + schain: true, + slaves: true +}; +function buildEndpointUrl(emiter, payloadMap) { + const payload = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(payloadMap, function (v, k) { + payload.push(k + '=' + (URL_SAFE_FIELDS[k] ? v : encodeURIComponent(v))); + }); + const randomizedPart = Math.random().toString().slice(2); + return 'https://' + emiter + '/_' + randomizedPart + '/ad.json?' + payload.join('&'); +} +function buildRequest(masterBidRequests, masterId, gdprConsent) { + let emiter; + const payload = { + id: masterId, + aosspsizes: [], + slaves: [] + }; + if (gdprConsent) { + payload.gdpr_consent = gdprConsent.consentString || undefined; + payload.gdpr = gdprConsent.gdprApplies ? 1 : 0; + } + const anyKey = Object.keys(masterBidRequests)[0]; + if (masterBidRequests[anyKey].schain) { + payload.schain = serializeSupplyChain(masterBidRequests[anyKey].schain); + } + const bidIdMap = {}; + const uniquePartLength = 10; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(masterBidRequests, function (bid, slaveId) { + if (!emiter) { + emiter = bid.params.emiter; + } + const slaveSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(bid.mediaTypes.banner.sizes).join('_'); + const rawSlaveId = bid.params.slaveId.replace('adocean', ''); + payload.aosspsizes.push(rawSlaveId + '~' + slaveSizes); + payload.slaves.push(rawSlaveId.slice(-uniquePartLength)); + bidIdMap[slaveId] = bid.bidId; + }); + payload.aosspsizes = payload.aosspsizes.join('-'); + payload.slaves = payload.slaves.join(','); + return { + method: 'GET', + url: buildEndpointUrl(emiter, payload), + data: '', + bidIdMap: bidIdMap + }; +} +const SCHAIN_FIELDS = ['asi', 'sid', 'hp', 'rid', 'name', 'domain', 'ext']; +function serializeSupplyChain(schain) { + const header = `${schain.ver},${schain.complete}!`; + const serializedNodes = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(schain.nodes, function (node) { + const serializedNode = SCHAIN_FIELDS.map(fieldName => { + if (fieldName === 'ext') { + // do not serialize ext data, just mark if it was available + return 'ext' in node ? '1' : '0'; + } + if (fieldName in node) { + return encodeURIComponent(node[fieldName]).replace(/!/g, '%21'); + } + return ''; + }).join(','); + serializedNodes.push(serializedNode); + }); + return header + serializedNodes.join('!'); +} +function assignToMaster(bidRequest, bidRequestsByMaster) { + const masterId = bidRequest.params.masterId; + const slaveId = bidRequest.params.slaveId; + const masterBidRequests = bidRequestsByMaster[masterId] = bidRequestsByMaster[masterId] || [{}]; + let i = 0; + while (masterBidRequests[i] && masterBidRequests[i][slaveId]) { + i++; + } + if (!masterBidRequests[i]) { + masterBidRequests[i] = {}; + } + masterBidRequests[i][slaveId] = bidRequest; +} +function interpretResponse(placementResponse, bidRequest, bids) { + const requestId = bidRequest.bidIdMap[placementResponse.id]; + if (!placementResponse.error && requestId) { + let adCode = '' + res.tag, + mediaType: res.mediaType.name || 'banner', + meta: { + advertiserDomains: res.adDomains && res.adDomains.length ? res.adDomains : [], + mediaType: res.mediaType.name || 'banner' + } + }; + bidResponses.push(bidResponse); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('bidResponses', bidResponses); + return bidResponses; + }, + /** + * @param {TimedOutBid} timeoutData + */ + onTimeout: timeoutData => { + if (timeoutData == null) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('onTimeout ', timeoutData); + let params = { + bidder: timeoutData.bidder, + bId: timeoutData.bidId, + adUnitCode: timeoutData.adUnitCode, + timeout: timeoutData.timeout, + auctionId: timeoutData.auctionId + }; + let adqueryRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL, + hostname: ADQUERY_BIDDER_DOMAIN, + pathname: '/prebid/eventTimeout', + search: params + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(adqueryRequestUrl); + }, + /** + * @param {Bid} bid + */ + onBidWon: bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('onBidWon', bid); + let copyOfBid = { + ...bid + }; + delete copyOfBid.ad; + const shortBidString = JSON.stringify(copyOfBid); + const encodedBuf = window.btoa(shortBidString); + let params = { + q: encodedBuf + }; + let adqueryRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL, + hostname: ADQUERY_BIDDER_DOMAIN, + pathname: '/prebid/eventBidWon', + search: params + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(adqueryRequestUrl); + }, + /** + * @param {Bid} bid + */ + onSetTargeting: bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('onSetTargeting', bid); + let params = { + bidder: bid.bidder, + width: bid.width, + height: bid.height, + bid: bid.adId, + mediaType: bid.mediaType, + cpm: bid.cpm, + requestId: bid.requestId, + adUnitCode: bid.adUnitCode + }; + let adqueryRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL, + hostname: ADQUERY_BIDDER_DOMAIN, + pathname: '/prebid/eventSetTargeting', + search: params + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(adqueryRequestUrl); + }, + /** + * Retrieves user synchronization URLs based on provided options and consents. + * + * @param {object} syncOptions - Options for synchronization. + * @param {object[]} serverResponses - Array of server responses. + * @param {object} gdprConsent - GDPR consent object. + * @param {object} uspConsent - USP consent object. + * @returns {object[]} - Array of synchronization URLs. + */ + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('getUserSyncs', syncOptions, serverResponses, gdprConsent, uspConsent); + let syncData = { + 'gdpr': gdprConsent && gdprConsent.gdprApplies ? 1 : 0, + 'gdpr_consent': gdprConsent && gdprConsent.consentString ? gdprConsent.consentString : '', + 'ccpa_consent': uspConsent && uspConsent.uspConsent ? uspConsent.uspConsent : '' + }; + if (window.qid) { + // only for new users (new qid) + syncData.qid = window.qid; + } + let syncUrlObject = { + protocol: ADQUERY_BIDDER_DOMAIN_PROTOCOL, + hostname: ADQUERY_USER_SYNC_DOMAIN, + pathname: '/prebid/userSync', + search: syncData + }; + if (syncOptions.iframeEnabled) { + syncUrlObject.protocol = ADQUERY_STATIC_DOMAIN_PROTOCOL; + syncUrlObject.hostname = ADQUERY_STATIC_DOMAIN; + syncUrlObject.pathname = '/user-sync-iframe.html'; + return [{ + type: 'iframe', + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)(syncUrlObject) + }]; + } + return [{ + type: 'image', + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)(syncUrlObject) + }]; + } +}; +function buildRequest(validBidRequests, bidderRequest) { + let bid = validBidRequests; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('buildRequest: ', bid); + let userId = null; + if (window.qid) { + userId = window.qid; + } + if (bid.userId && bid.userId.qid) { + userId = bid.userId.qid; + } + if (!userId) { + // onetime User ID + const ramdomValues = Array.from(window.crypto.getRandomValues(new Uint32Array(4))); + userId = ramdomValues.map(val => val.toString(36)).join('').substring(0, 20); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('generated onetime User ID: ', userId); + window.qid = userId; + } + let pageUrl = ''; + if (bidderRequest && bidderRequest.refererInfo) { + pageUrl = bidderRequest.refererInfo.page || ''; + } + return { + v: "9.45.0-pre", + placementCode: bid.params.placementId, + auctionId: null, + type: bid.params.type, + adUnitCode: bid.adUnitCode, + bidQid: userId, + bidId: bid.bidId, + bidder: bid.bidder, + bidPageUrl: pageUrl, + bidderRequestId: bid.bidderRequestId, + bidRequestsCount: bid.bidRequestsCount, + bidderRequestsCount: bid.bidderRequestsCount, + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bid.mediaTypes.banner.sizes).toString() + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('adqueryBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adqueryBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adqueryIdSystem"],{ + +/***/ "./modules/adqueryIdSystem.js": +/*!************************************!*\ + !*** ./modules/adqueryIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, adqueryIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds Adquery QID to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/adqueryIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'qid'; +const AU_GVLID = 902; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: 'qid' +}); + +/** + * Param or default. + * @param {String} param + * @param {String} defaultVal + */ +function paramOrDefault(param, defaultVal, arg) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(param)) { + return param(arg); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(param)) { + return param; + } + return defaultVal; +} + +/** @type {Submodule} */ +const adqueryIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * IAB TCF Vendor ID + * @type {string} + */ + gvlid: AU_GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {{value:string}} value + * @returns {{qid:Object}} + */ + decode(value) { + return { + qid: value + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('adqueryIdSubmodule getId'); + let qid = storage.getDataFromLocalStorage('qid'); + if (qid) { + return { + callback: function (callback) { + callback(qid); + } + }; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(config.params)) { + config.params = {}; + } + const url = paramOrDefault(config.params.url, `https://bidder.adquery.io/prebid/qid`, config.params.urlArg); + const resp = function (callback) { + let qid = window.qid; + if (!qid) { + const ramdomValues = Array.from(window.crypto.getRandomValues(new Uint32Array(4))); + qid = ramdomValues.map(val => val.toString(36)).join('').substring(0, 20); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('adqueryIdSubmodule ID QID GENERTAED:', qid); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('adqueryIdSubmodule ID QID:', qid); + const callbacks = { + success: response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + } + if (responseObj.qid) { + let myQid = responseObj.qid; + storage.setDataInLocalStorage('qid', myQid); + return callback(myQid); + } + callback(); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + callback(); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url + '?qid=' + qid, callbacks, undefined, { + method: 'GET' + }); + }; + return { + callback: resp + }; + }, + eids: { + 'qid': { + source: 'adquery.io', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', adqueryIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adqueryIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adqueryIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adrelevantisBidAdapter"],{ + +/***/ "./modules/adrelevantisBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/adrelevantisBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/appnexusUtils/anKeywords.js */ "./libraries/appnexusUtils/anKeywords.js"); +/* harmony import */ var _libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/chunk/chunk.js */ "./libraries/chunk/chunk.js"); + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'adrelevantis'; +const URL = 'https://ssp.adrelevantis.com/prebid'; +const VIDEO_TARGETING = ['id', 'mimes', 'minduration', 'maxduration', 'startdelay', 'skippable', 'playback_method', 'frameworks']; +const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language']; +const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately +const SOURCE = 'pbjs'; +const MAX_IMPS_PER_REQUEST = 15; +const NATIVE_MAPPING = { + body: 'description', + body2: 'desc2', + cta: 'ctatext', + image: { + serverName: 'main_image', + requiredParams: { + required: true + } + }, + icon: { + serverName: 'icon', + requiredParams: { + required: true + } + }, + sponsoredBy: 'sponsored_by', + privacyLink: 'privacy_link', + salePrice: 'saleprice', + displayUrl: 'displayurl' +}; +const spec = { + code: BIDDER_CODE, + aliases: ['adr', 'adsmart', 'compariola'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(bidRequests); + const tags = bidRequests.map(bidToTag); + const userObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasUserInfo); + let userObj; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + userObj = { + 'coppa': true + }; + } + if (userObjBid) { + userObj = {}; + Object.keys(userObjBid.params.user).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(USER_PARAMS, param)).forEach(param => userObj[param] = userObjBid.params.user[param]); + } + const appDeviceObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasAppDeviceInfo); + let appDeviceObj; + if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app) { + appDeviceObj = {}; + Object.keys(appDeviceObjBid.params.app).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(APP_DEVICE_PARAMS, param)).forEach(param => appDeviceObj[param] = appDeviceObjBid.params.app[param]); + } + const appIdObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasAppId); + let appIdObj; + if (appIdObjBid && appIdObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) { + appIdObj = { + appid: appIdObjBid.params.app.id + }; + } + const payload = { + tags: [...tags], + user: userObj, + sdk: { + source: SOURCE, + version: "9.45.0-pre" + } + }; + if (appDeviceObjBid) { + payload.device = appDeviceObj; + } + if (appIdObjBid) { + payload.app = appIdObj; + } + if (bidderRequest && bidderRequest.gdprConsent) { + // note - objects for impbus use underscore instead of camelCase + payload.gdpr_consent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + } + if (bidderRequest && bidderRequest.refererInfo) { + let refererinfo = { + // TODO: this sends everything it finds to the backend, except for canonicalUrl + rd_ref: encodeURIComponent(bidderRequest.refererInfo.topmostLocation), + rd_top: bidderRequest.refererInfo.reachedTop, + rd_ifs: bidderRequest.refererInfo.numIframes, + rd_stk: bidderRequest.refererInfo.stack.map(url => encodeURIComponent(url)).join(',') + }; + payload.referrer_detection = refererinfo; + } + const ortb2Site = bidderRequest.ortb2?.site; + if (ortb2Site) { + payload.fpd = { + keywords: ortb2Site.keywords || '', + category: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(ortb2Site, 'ext.data.category') || '' + }; + } + const request = formatRequest(payload, bidderRequest); + return request; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + const bids = []; + if (!serverResponse || serverResponse.error) { + let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`; + if (serverResponse && serverResponse.error) { + errorMessage += `: ${serverResponse.error}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(errorMessage); + return bids; + } + if (serverResponse.tags) { + serverResponse.tags.forEach(serverBid => { + const rtbBid = getRtbBid(serverBid); + if (rtbBid) { + if (rtbBid.cpm !== 0 && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(this.supportedMediaTypes, rtbBid.ad_type)) { + const bid = newBid(serverBid, rtbBid, bidderRequest); + bid.mediaType = parseMediaType(rtbBid); + bids.push(bid); + } + } + }); + } + return bids; + } +}; +function formatRequest(payload, bidderRequest) { + let request = []; + if (payload.tags.length > MAX_IMPS_PER_REQUEST) { + const clonedPayload = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.deepClone)(payload); + (0,_libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_6__.chunk)(payload.tags, MAX_IMPS_PER_REQUEST).forEach(tags => { + clonedPayload.tags = tags; + const payloadString = JSON.stringify(clonedPayload); + request.push({ + method: 'POST', + url: URL, + data: payloadString, + bidderRequest + }); + }); + } else { + const payloadString = JSON.stringify(payload); + request = { + method: 'POST', + url: URL, + data: payloadString, + bidderRequest + }; + } + return request; +} +function newRenderer(adUnitCode, rtbBid) { + let rendererOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: rtbBid.renderer_id, + url: rtbBid.renderer_url, + config: rendererOptions, + loaded: false, + adUnitCode + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Prebid Error calling setRender on renderer', err); + } + renderer.setEventHandlers({ + impression: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logMessage)('AdRelevantis outstream video impression event'), + loaded: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logMessage)('AdRelevantis outstream video loaded event'), + ended: () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logMessage)('AdRelevantis outstream renderer video event'); + document.querySelector(`#${adUnitCode}`).style.display = 'none'; + } + }); + return renderer; +} + +/** + * This function hides google div container for outstream bids to remove unwanted space on page. Appnexus renderer creates a new iframe outside of google iframe to render the outstream creative. + * @param {string} elementId element id + */ +function hidedfpContainer(elementId) { + var el = document.getElementById(elementId).querySelectorAll("div[id^='google_ads']"); + if (el[0]) { + el[0].style.setProperty('display', 'none'); + } +} +function outstreamRender(bid) { + // push to render queue because ANOutstreamVideo may not be loaded yet + hidedfpContainer(bid.adUnitCode); + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + tagId: bid.adResponse.tag_id, + sizes: [bid.getSize().split('x')], + targetId: bid.adUnitCode, + // target div id to render video + uuid: bid.adResponse.uuid, + adResponse: bid.adResponse, + rendererOptions: bid.renderer.getConfig() + }, handleOutstreamRendererEvents.bind(null, bid)); + }); +} +function handleOutstreamRendererEvents(bid, id, eventName) { + bid.renderer.handleVideoEvent({ + id, + eventName + }); +} + +/** + * Unpack the Server's Bid into a Prebid-compatible one. + * @param serverBid + * @param rtbBid + * @param bidderRequest + * @return Bid + */ +function newBid(serverBid, rtbBid, bidderRequest) { + const bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.getBidRequest)(serverBid.uuid, [bidderRequest]); + const bid = { + requestId: serverBid.uuid, + cpm: rtbBid.cpm, + creativeId: rtbBid.creative_id, + dealId: rtbBid.deal_id, + currency: 'USD', + netRevenue: true, + ttl: 300, + adUnitCode: bidRequest.adUnitCode, + adrelevantis: { + buyerMemberId: rtbBid.buyer_member_id, + dealPriority: rtbBid.deal_priority, + dealCode: rtbBid.deal_code + } + }; + if (rtbBid.advertiser_id) { + bid.meta = Object.assign({}, bid.meta, { + advertiserId: rtbBid.advertiser_id + }); + } + if (rtbBid.rtb.video) { + Object.assign(bid, { + width: rtbBid.rtb.video.player_width, + height: rtbBid.rtb.video.player_height, + vastImpUrl: rtbBid.notify_url, + ttl: 3600 + }); + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video.context'); + switch (videoContext) { + case _src_video_js__WEBPACK_IMPORTED_MODULE_8__.OUTSTREAM: + bid.adResponse = serverBid; + bid.adResponse.ad = bid.adResponse.ads[0]; + bid.adResponse.ad.video = bid.adResponse.ad.rtb.video; + bid.vastXml = rtbBid.rtb.video.content; + if (rtbBid.renderer_url) { + const videoBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidderRequest.bids, bid => bid.bidId === serverBid.uuid); + const rendererOptions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(videoBid, 'renderer.options'); + bid.renderer = newRenderer(bid.adUnitCode, rtbBid, rendererOptions); + } + break; + case _src_video_js__WEBPACK_IMPORTED_MODULE_8__.INSTREAM: + bid.vastUrl = rtbBid.notify_url + '&redir=' + encodeURIComponent(rtbBid.rtb.video.asset_url); + break; + } + } else if (rtbBid.rtb[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]) { + const nativeAd = rtbBid.rtb[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; + + // setting up the jsTracker: + // we put it as a data-src attribute so that the tracker isn't called + // until we have the adId (see onBidWon) + let jsTrackerDisarmed = rtbBid.viewability.config.replace('src=', 'data-src='); + let jsTrackers = nativeAd.javascript_trackers; + if (jsTrackers == undefined) { + jsTrackers = jsTrackerDisarmed; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isStr)(jsTrackers)) { + jsTrackers = [jsTrackers, jsTrackerDisarmed]; + } else { + jsTrackers.push(jsTrackerDisarmed); + } + bid[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE] = { + title: nativeAd.title, + body: nativeAd.desc, + body2: nativeAd.desc2, + cta: nativeAd.ctatext, + rating: nativeAd.rating, + sponsoredBy: nativeAd.sponsored, + privacyLink: nativeAd.privacy_link, + address: nativeAd.address, + downloads: nativeAd.downloads, + likes: nativeAd.likes, + phone: nativeAd.phone, + price: nativeAd.price, + salePrice: nativeAd.saleprice, + clickUrl: nativeAd.link.url, + displayUrl: nativeAd.displayurl, + clickTrackers: nativeAd.link.click_trackers, + impressionTrackers: nativeAd.impression_trackers, + javascriptTrackers: jsTrackers + }; + if (nativeAd.main_img) { + bid['native'].image = { + url: nativeAd.main_img.url, + height: nativeAd.main_img.height, + width: nativeAd.main_img.width + }; + } + if (nativeAd.icon) { + bid['native'].icon = { + url: nativeAd.icon.url, + height: nativeAd.icon.height, + width: nativeAd.icon.width + }; + } + } else { + Object.assign(bid, { + width: rtbBid.rtb.banner.width, + height: rtbBid.rtb.banner.height, + ad: rtbBid.rtb.banner.content + }); + try { + const url = rtbBid.rtb.trackers[0].impression_urls[0]; + const tracker = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.createTrackPixelHtml)(url); + bid.ad += tracker; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Error appending tracking pixel', error); + } + } + return bid; +} +function bidToTag(bid) { + const tag = {}; + tag.sizes = transformSizes(bid.sizes); + tag.primary_size = tag.sizes[0]; + tag.ad_types = []; + tag.uuid = bid.bidId; + if (bid.params.placementId) { + tag.id = parseInt(bid.params.placementId, 10); + } + if (bid.params.cpm) { + tag.cpm = bid.params.cpm; + } + tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false; + tag.use_pmt_rule = bid.params.usePaymentRule || false; + tag.prebid = true; + tag.disable_psa = true; + if (bid.params.position) { + tag.position = { + 'above': 1, + 'below': 2 + }[bid.params.position] || 0; + } else { + let mediaTypePos = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, `mediaTypes.banner.pos`) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, `mediaTypes.video.pos`); + // only support unknown, atf, and btf values for position at this time + if (mediaTypePos === 0 || mediaTypePos === 1 || mediaTypePos === 3) { + // ortb spec treats btf === 3, but our system interprets btf === 2; so converting the ortb value here for consistency + tag.position = mediaTypePos === 3 ? 2 : mediaTypePos; + } + } + if (bid.params.trafficSourceCode) { + tag.traffic_source_code = bid.params.trafficSourceCode; + } + if (bid.params.privateSizes) { + tag.private_sizes = transformSizes(bid.params.privateSizes); + } + if (bid.params.supplyType) { + tag.supply_type = bid.params.supplyType; + } + if (bid.params.pubClick) { + tag.pubclick = bid.params.pubClick; + } + if (bid.params.extInvCode) { + tag.ext_inv_code = bid.params.extInvCode; + } + if (bid.params.externalImpId) { + tag.external_imp_id = bid.params.externalImpId; + } + tag.keywords = (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_9__.getANKeywordParam)(bid.ortb2, bid.params.keywords); + if (bid.params.category) { + tag.category = bid.params.category; + } + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE}`)) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + if (tag.sizes.length === 0) { + tag.sizes = transformSizes([1, 1]); + } + if (bid.nativeParams) { + const nativeRequest = buildNativeRequest(bid.nativeParams); + tag[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE] = { + layouts: [nativeRequest] + }; + } + } + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}`); + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video.context'); + tag.hb_source = 1; + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO || videoMediaType) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + } + + // instream gets vastUrl, outstream gets vastXml + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO || videoMediaType && context !== 'outstream') { + tag.require_asset_url = true; + } + if (bid.params.video) { + tag.video = {}; + // place any valid video params on the tag + Object.keys(bid.params.video).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(VIDEO_TARGETING, param)).forEach(param => tag.video[param] = bid.params.video[param]); + } + if (bid.renderer) { + tag.video = Object.assign({}, tag.video, { + custom_renderer_present: true + }); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(bid.mediaType) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(bid.mediaTypes) || bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER || bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } + return tag; +} + +/* Turn bid request sizes into ut-compatible format */ +function transformSizes(requestSizes) { + let sizes = []; + let sizeObj = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArray)(requestSizes) && requestSizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArray)(requestSizes[0])) { + sizeObj.width = parseInt(requestSizes[0], 10); + sizeObj.height = parseInt(requestSizes[1], 10); + sizes.push(sizeObj); + } else if (typeof requestSizes === 'object') { + for (let i = 0; i < requestSizes.length; i++) { + let size = requestSizes[i]; + sizeObj = {}; + sizeObj.width = parseInt(size[0], 10); + sizeObj.height = parseInt(size[1], 10); + sizes.push(sizeObj); + } + } + return sizes; +} +function hasUserInfo(bid) { + return !!bid.params.user; +} +function hasAppDeviceInfo(bid) { + if (bid.params) { + return !!bid.params.app; + } +} +function hasAppId(bid) { + if (bid.params && bid.params.app) { + return !!bid.params.app.id; + } + return !!bid.params.app; +} +function getRtbBid(tag) { + return tag && tag.ads && tag.ads.length && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(tag.ads, ad => ad.rtb); +} +function buildNativeRequest(params) { + const request = {}; + + // map standard prebid native asset identifier to /ut parameters + // e.g., tag specifies `body` but /ut only knows `description`. + // mapping may be in form {tag: ''} or + // {tag: {serverName: '', requiredParams: {...}}} + Object.keys(params).forEach(key => { + // check if one of the forms is used, otherwise + // a mapping wasn't specified so pass the key straight through + const requestKey = NATIVE_MAPPING[key] && NATIVE_MAPPING[key].serverName || NATIVE_MAPPING[key] || key; + + // required params are always passed on request + const requiredParams = NATIVE_MAPPING[key] && NATIVE_MAPPING[key].requiredParams; + request[requestKey] = Object.assign({}, requiredParams, params[key]); + + // convert the sizes of image/icon assets to proper format (if needed) + const isImageAsset = !!(requestKey === NATIVE_MAPPING.image.serverName || requestKey === NATIVE_MAPPING.icon.serverName); + if (isImageAsset && request[requestKey].sizes) { + let sizes = request[requestKey].sizes; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArrayOfNums)(sizes) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArray)(sizes) && sizes.length > 0 && sizes.every(sz => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArrayOfNums)(sz))) { + request[requestKey].sizes = transformSizes(request[requestKey].sizes); + } + } + if (requestKey === NATIVE_MAPPING.privacyLink) { + request.privacy_supported = true; + } + }); + return request; +} +function parseMediaType(rtbBid) { + const adType = rtbBid.ad_type; + if (adType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else if (adType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('adrelevantisBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","keywords","appnexusUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adrelevantisBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adrinoBidAdapter"],{ + +/***/ "./modules/adrinoBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adrinoBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + +const BIDDER_CODE = 'adrino'; +const REQUEST_METHOD = 'POST'; +const BIDDER_HOST = 'https://prd-prebid-bidder.adrino.io'; +const GVLID = 1072; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + getBidderConfig: function (property) { + return _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(`${BIDDER_CODE}.${property}`); + }, + isBidRequestValid: function (bid) { + return !!bid.bidId && !!bid.params && !!bid.params.hash && typeof bid.params.hash === 'string' && !!bid.mediaTypes && (Object.keys(bid.mediaTypes).includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) || Object.keys(bid.mediaTypes).includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)) && bid.bidder === BIDDER_CODE; + }, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let bids = []; + for (let i = 0; i < validBidRequests.length; i++) { + let requestData = { + adUnitCode: validBidRequests[i].adUnitCode, + bidId: validBidRequests[i].bidId, + placementHash: validBidRequests[i].params.hash, + userId: validBidRequests[i].userId, + referer: bidderRequest.refererInfo.page, + userAgent: navigator.userAgent + }; + if (validBidRequests[i].sizes != null && validBidRequests[i].sizes.length > 0) { + requestData.bannerParams = { + sizes: validBidRequests[i].sizes + }; + } + if (validBidRequests[i].nativeParams != null) { + requestData.nativeParams = validBidRequests[i].nativeParams; + } + if (bidderRequest && bidderRequest.gdprConsent) { + requestData.gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + consentRequired: bidderRequest.gdprConsent.gdprApplies + }; + } + bids.push(requestData); + } + let host = this.getBidderConfig('host') || BIDDER_HOST; + let bidRequests = []; + bidRequests.push({ + method: REQUEST_METHOD, + url: host + '/bidder/bids/', + data: bids, + options: { + contentType: 'application/json', + withCredentials: false + } + }); + return bidRequests; + }, + interpretResponse: function (serverResponse, bidRequest) { + const response = serverResponse.body; + const output = []; + if (response.bidResponses) { + for (const bidResponse of response.bidResponses) { + if (!bidResponse.noAd) { + output.push(bidResponse); + } + } + } + return output; + }, + onBidWon: function (bid) { + if (bid['requestId']) { + let host = this.getBidderConfig('host') || BIDDER_HOST; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(host + '/bidder/won/' + bid['requestId']); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adrinoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adrinoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adriverBidAdapter"],{ + +/***/ "./modules/adriverBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/adriverBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + +// ADRIVER BID ADAPTER for Prebid 1.13 + + + +const BIDDER_CODE = 'adriver'; +const ADRIVER_BID_URL = 'https://pb.adriver.ru/cgi-bin/bid.cgi'; +const TIME_TO_LIVE = 3000; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.siteid; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowLocation)(); + let customID = Math.round(Math.random() * 999999999) + '-' + Math.round(new Date() / 1000) + '-1-46-'; + let siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('siteid', validBidRequests[0].params) + ''; + let currency = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('currency', validBidRequests[0].params); + currency = 'RUB'; + let timeout = null; + if (bidderRequest) { + timeout = bidderRequest.timeout; + } + const payload = { + 'at': 1, + 'cur': [currency], + 'tmax': timeout, + 'site': { + 'name': win.origin, + 'domain': win.hostname, + 'id': siteId, + 'page': win.href + }, + 'id': customID, + 'user': { + 'buyerid': 0, + 'ext': { + 'eids': getUserIdAsEids(validBidRequests) + } + }, + 'device': { + 'ip': '195.209.111.14', + 'ua': window.navigator.userAgent + }, + 'imp': [] + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(bid.sizes, sizes => { + let width; + let height; + let par; + let floorAndCurrency = _getFloor(bid, currency, sizes); + let bidFloor = floorAndCurrency.floor; + let dealId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('dealid', bid.params); + if (typeof sizes[0] === 'number' && typeof sizes[1] === 'number') { + width = sizes[0]; + height = sizes[1]; + } + par = { + 'id': bid.params.placementId, + 'ext': { + 'query': 'bn=15&custom=111=' + bid.bidId + }, + 'banner': { + 'w': width || undefined, + 'h': height || undefined + }, + 'bidfloor': bidFloor || 0, + 'bidfloorcur': floorAndCurrency.currency, + 'secure': 0 + }; + if (dealId) { + par.pmp = { + 'private_auction': 1, + 'deals': [{ + 'id': dealId, + 'bidfloor': bidFloor || 0, + 'bidfloorcur': currency + }] + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('par', par); + payload.imp.push(par); + }); + }); + let adrcidCookie = storage.getDataFromLocalStorage('adrcid') || validBidRequests[0].userId?.adrcid; + if (adrcidCookie) { + payload.user.buyerid = adrcidCookie; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ADRIVER_BID_URL, + data: payloadString + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('serverResponse.body.seatbid', serverResponse.body.seatbid); + const bidResponses = []; + let nurl = 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(serverResponse.body.seatbid, seatbid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('_each', seatbid); + var bid = seatbid.bid[0]; + if (bid.nurl !== undefined) { + nurl = bid.nurl.split('://'); + nurl = window.location.protocol + '//' + nurl[1]; + nurl = nurl.replace(/\$\{AUCTION_PRICE\}/, bid.price); + } + if (bid.price >= 0 && bid.impid !== undefined && nurl !== 0 && bid.dealid === undefined) { + let bidResponse = { + requestId: bid.ext || undefined, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.impid || undefined, + currency: serverResponse.body.cur, + netRevenue: true, + ttl: TIME_TO_LIVE, + meta: { + advertiserDomains: bid.adomain + }, + ad: '' + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('bidResponse', bidResponse); + bidResponses.push(bidResponse); + } + }); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); + +/** + * get first userId from validBidRequests + * @param validBidRequests + * @returns {Array|*} userIdAsEids + */ +function getUserIdAsEids(validBidRequests) { + if (validBidRequests && validBidRequests.length > 0 && validBidRequests[0].userIdAsEids && validBidRequests[0].userIdAsEids.length > 0) { + return validBidRequests[0].userIdAsEids; + } else { + return []; + } +} + +/** + * Gets bidfloor + * @param {Object} bid + * @param currencyPar + * @param sizes + * @returns {Object} floor + */ +function _getFloor(bid, currencyPar, sizes) { + const curMediaType = bid.mediaTypes && bid.mediaTypes.video ? 'video' : 'banner'; + let floor = 0; + const currency = currencyPar || 'RUB'; + let currencyResult = ''; + let isSize = false; + if (typeof sizes[0] === 'number' && typeof sizes[1] === 'number') { + isSize = true; + } + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: currency, + mediaType: curMediaType, + size: isSize ? sizes : '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && !isNaN(parseFloat(floorInfo?.floor))) { + floor = floorInfo.floor; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency) { + currencyResult = floorInfo.currency; + } + } + if (!currencyResult) { + currencyResult = currency; + } + if (floor == null) { + floor = 0; + } + return { + floor: floor, + currency: currencyResult + }; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('adriverBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adriverBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adriverIdSystem"],{ + +/***/ "./modules/adriverIdSystem.js": +/*!************************************!*\ + !*** ./modules/adriverIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, adriverIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds AdriverId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/adriverIdSubmodule + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'adriverId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** @type {Submodule} */ +const adriverIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{adriverId:string}} + */ + decode(value) { + return { + adrcid: value + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(config.params)) { + config.params = {}; + } + const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1&cfa=1'; + const resp = function (callback) { + let creationDate = storage.getDataFromLocalStorage('adrcid_cd') || storage.getCookie('adrcid_cd'); + let cookie = storage.getDataFromLocalStorage('adrcid') || storage.getCookie('adrcid'); + if (cookie && creationDate && new Date().getTime() - creationDate < 86400000) { + const responseObj = cookie; + callback(responseObj); + } else { + const callbacks = { + success: response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response).adrcid; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + let now = new Date(); + now.setTime(now.getTime() + 86400 * 1825 * 1000); + storage.setCookie('adrcid', responseObj, now.toUTCString(), 'Lax'); + storage.setDataInLocalStorage('adrcid', responseObj); + storage.setCookie('adrcid_cd', new Date().getTime(), now.toUTCString(), 'Lax'); + storage.setDataInLocalStorage('adrcid_cd', new Date().getTime()); + } + callback(responseObj); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + callback(); + } + }; + let newUrl = url + '&cid=' + (storage.getDataFromLocalStorage('adrcid') || storage.getCookie('adrcid')); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(newUrl, callbacks, undefined, { + method: 'GET' + }); + } + }; + return { + callback: resp + }; + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', adriverIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adriverIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adriverIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ads_interactiveBidAdapter"],{ + +/***/ "./modules/ads_interactiveBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/ads_interactiveBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'ads_interactive'; +const AD_URL = 'https://bntb.adsinteractive.com/pbjs'; +const SYNC_URL = 'https://cstb.adsinteractive.com'; +const GVLID = 1212; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('ads_interactiveBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ads_interactiveBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adsinteractiveBidAdapter"],{ + +/***/ "./modules/adsinteractiveBidAdapter.js": +/*!*********************************************!*\ + !*** ./modules/adsinteractiveBidAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const ADSINTERACTIVE_CODE = 'adsinteractive'; +const USER_SYNC_URL_IMAGE = 'https://sync.adsinteractive.com/img'; +const USER_SYNC_URL_IFRAME = 'https://sync.adsinteractive.com/sync'; +const GVLID = 1212; +const spec = { + code: ADSINTERACTIVE_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + gvlid: GVLID, + isBidRequestValid: bid => { + return !!bid.params.adUnit && !!bid.bidId && bid.bidder === 'adsinteractive'; + }, + buildRequests: (bidRequests, bidderRequest) => { + return bidRequests.map(bid => { + var gdprConsent; + if (bidderRequest && bidderRequest.gdprConsent) { + gdprConsent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + if (bidderRequest.gdprConsent.addtlConsent && bidderRequest.gdprConsent.addtlConsent.indexOf('~') !== -1) { + let ac = bidderRequest.gdprConsent.addtlConsent; + let acStr = ac.substring(ac.indexOf('~') + 1); + gdprConsent.addtl_consent = acStr.split('.').map(id => parseInt(id, 10)); + } + } + let url = 'https://pb.adsinteractive.com/prebid'; + const data = { + id: bid.bidId, + at: 1, + source: { + fd: 0 + }, + gdprConsent: gdprConsent, + site: { + page: bid.ortb2.site.page, + keywords: bid.ortb2.site.keywords, + domain: bid.ortb2.site.domain, + publisher: { + domain: bid.ortb2.site.domain + }, + ext: { + amp: Number(bidderRequest.refererInfo.isAmp) + } + }, + regs: bid.ortb2.regs, + device: bid.ortb2.device, + user: bid.ortb2.user, + imp: [{ + id: bid.params.adUnit, + banner: { + format: bid.sizes.map(size => ({ + w: size[0], + h: size[1] + })) + }, + ext: { + bidder: { + adUnit: bid.params.adUnit + } + } + }], + tmax: bidderRequest.timeout + }; + const options = { + withCredentials: true + }; + return { + method: 'POST', + url, + data, + options + }; + }); + }, + interpretResponse: (serverResponse, bidRequest) => { + let answer = []; + if (serverResponse && serverResponse.body && serverResponse.body.seatbid) { + serverResponse.body.seatbid.forEach(seatbid => { + if (seatbid.bid.length) { + answer = [...answer, ...seatbid.bid.filter(bid => bid.price > 0).map(adsinteractiveBid => { + const bid = { + id: adsinteractiveBid.id, + requestId: bidRequest.data.id, + cpm: adsinteractiveBid.price, + netRevenue: true, + ttl: 1000, + ad: adsinteractiveBid.adm, + meta: { + advertiserDomains: adsinteractiveBid && adsinteractiveBid.adomain ? adsinteractiveBid.adomain : [] + }, + width: adsinteractiveBid.w, + height: adsinteractiveBid.h, + currency: serverResponse.body.cur || 'USD', + creativeId: adsinteractiveBid.crid || 0 + }; + return bid; + })]; + } + }); + } + return answer; + }, + getUserSyncs: (syncOptions, serverResponse, gdprConsent, uspConsent) => { + if (syncOptions.iframeEnabled) { + const auid = serverResponse.filter(resp => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(resp, 'body.ext.auid')).map(resp => resp.body.ext.auid); + return [{ + type: 'iframe', + url: USER_SYNC_URL_IFRAME + '?consent=' + gdprConsent.consentString + '&auid=' + auid + }]; + } else { + return [{ + type: 'image', + url: USER_SYNC_URL_IMAGE + }]; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('adsinteractiveBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adsinteractiveBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adspiritBidAdapter"],{ + +/***/ "./modules/adspiritBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/adspiritBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const { + getWinDimensions +} = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__; +const RTB_URL = '/rtb/getbid.php?rtbprovider=prebid'; +const SCRIPT_URL = '/adasync.min.js'; +const spec = { + code: 'adspirit', + aliases: ['twiago'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid: function (bid) { + let host = spec.getBidderHost(bid); + if (!host || !bid.params.placementId) { + return false; + } + return true; + }, + getScriptUrl: function () { + return SCRIPT_URL; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let requests = []; + let prebidVersion = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().version; + const win = getWinDimensions(); + for (let i = 0; i < validBidRequests.length; i++) { + let bidRequest = validBidRequests[i]; + bidRequest.adspiritConId = spec.genAdConId(bidRequest); + let reqUrl = spec.getBidderHost(bidRequest); + let placementId = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter('placementId', bidRequest.params); + reqUrl = '//' + reqUrl + RTB_URL + '&pid=' + placementId + '&ref=' + encodeURIComponent(bidderRequest.refererInfo.topmostLocation) + '&scx=' + (win.screen?.width || 0) + '&scy=' + (win.screen?.height || 0) + '&wcx=' + win.innerWidth + '&wcy=' + win.innerHeight + '&async=' + bidRequest.adspiritConId + '&t=' + Math.round(Math.random() * 100000); + let gdprApplies = bidderRequest.gdprConsent ? bidderRequest.gdprConsent.gdprApplies ? 1 : 0 : 0; + let gdprConsentString = bidderRequest.gdprConsent ? encodeURIComponent(bidderRequest.gdprConsent.consentString) : ''; + if (bidderRequest.gdprConsent) { + reqUrl += '&gdpr=' + gdprApplies + '&gdpr_consent=' + gdprConsentString; + } + let openRTBRequest = { + id: bidderRequest.auctionId, + at: 1, + cur: ['EUR'], + imp: [{ + id: bidRequest.bidId, + bidfloor: bidRequest.params.bidfloor !== undefined ? parseFloat(bidRequest.params.bidfloor) : 0, + bidfloorcur: 'EUR', + secure: 1, + banner: bidRequest.mediaTypes.banner && bidRequest.mediaTypes.banner.sizes?.length > 0 ? { + format: bidRequest.mediaTypes.banner.sizes.map(size => ({ + w: size[0], + h: size[1] + })) + } : undefined, + native: bidRequest.mediaTypes.native ? { + request: JSON.stringify({ + ver: '1.2', + assets: bidRequest.mediaTypes.native.ortb?.assets?.length ? bidRequest.mediaTypes.native.ortb.assets : [{ + id: 1, + required: 1, + title: { + len: 100 + } + }, { + id: 2, + required: 1, + img: { + type: 3, + wmin: 1200, + hmin: 627, + mimes: ['image/png', 'image/gif', 'image/jpeg'] + } + }, { + id: 4, + required: 1, + data: { + type: 2, + len: 150 + } + }, { + id: 3, + required: 0, + data: { + type: 12, + len: 50 + } + }, { + id: 6, + required: 0, + data: { + type: 1, + len: 50 + } + }, { + id: 5, + required: 0, + img: { + type: 1, + wmin: 50, + hmin: 50, + mimes: ['image/png', 'image/gif', 'image/jpeg'] + } + }] + }) + } : undefined, + ext: { + placementId: bidRequest.params.placementId + } + }], + site: { + id: bidRequest.params.siteId || '', + domain: new URL(bidderRequest.refererInfo.topmostLocation).hostname, + page: bidderRequest.refererInfo.topmostLocation, + publisher: { + id: bidRequest.params.publisherId || '', + name: bidRequest.params.publisherName || '' + } + }, + user: { + id: bidRequest.userId || '', + data: bidRequest.userData || [], + ext: { + consent: gdprConsentString || '' + } + }, + device: { + ua: navigator.userAgent, + language: (navigator.language || '').split('-')[0], + w: win.innerWidth, + h: win.innerHeight, + geo: { + lat: bidderRequest?.geo?.lat || 0, + lon: bidderRequest?.geo?.lon || 0, + country: bidderRequest?.geo?.country || '' + } + }, + regs: { + ext: { + gdpr: gdprApplies ? 1 : 0, + gdpr_consent: gdprConsentString || '' + } + }, + ext: { + oat: 1, + prebidVersion: prebidVersion, + adUnitCode: { + prebidVersion: prebidVersion, + code: bidRequest.adUnitCode, + mediaTypes: bidRequest.mediaTypes + } + } + }; + if (bidRequest.schain) { + openRTBRequest.source = { + ext: { + schain: bidRequest.schain + } + }; + } + requests.push({ + method: 'POST', + url: reqUrl, + data: JSON.stringify(openRTBRequest), + headers: { + 'Content-Type': 'application/json' + }, + bidRequest: bidRequest + }); + } + return requests; + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const bidObj = bidRequest.bidRequest; + let host = spec.getBidderHost(bidObj); + if (!serverResponse || !serverResponse.body) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn(`adspirit: Empty response from bidder`); + return []; + } + if (serverResponse.body.seatbid) { + serverResponse.body.seatbid.forEach(seat => { + seat.bid.forEach(bid => { + const bidResponse = { + requestId: bidObj.bidId, + cpm: bid.price, + width: bid.w || 1, + height: bid.h || 1, + creativeId: bid.crid || bid.impid, + currency: serverResponse.body.cur || 'EUR', + netRevenue: true, + ttl: bid.exp || 300, + meta: { + advertiserDomains: bid.adomain || [] + } + }; + let adm = bid.adm; + if (typeof adm === 'string' && adm.trim().startsWith('{')) { + adm = JSON.parse(adm || '{}'); + if (typeof adm !== 'object') adm = null; + } + if (adm?.native?.assets) { + const getAssetValue = (id, type) => { + const assetList = adm.native.assets.filter(a => a.id === id); + if (assetList.length === 0) return ''; + return assetList[0][type]?.text || assetList[0][type]?.value || assetList[0][type]?.url || ''; + }; + const duplicateTracker = {}; + bidResponse.native = { + title: getAssetValue(1, 'title'), + body: getAssetValue(4, 'data'), + cta: getAssetValue(3, 'data'), + image: { + url: getAssetValue(2, 'img') || '' + }, + icon: { + url: getAssetValue(5, 'img') || '' + }, + sponsoredBy: getAssetValue(6, 'data'), + clickUrl: adm.native.link?.url || '', + impressionTrackers: Array.isArray(adm.native.imptrackers) ? adm.native.imptrackers : [] + }; + const predefinedAssetIds = Object.entries(bidResponse.native).filter(_ref => { + let [key, value] = _ref; + return key !== 'clickUrl' && key !== 'impressionTrackers'; + }).map(_ref2 => { + let [key, value] = _ref2; + return adm.native.assets.find(asset => typeof value === 'object' ? value.url === asset?.img?.url : value === asset?.data?.value)?.id; + }).filter(id => id !== undefined); + adm.native.assets.forEach(asset => { + const type = Object.keys(asset).find(k => k !== 'id'); + if (!duplicateTracker[asset.id]) { + duplicateTracker[asset.id] = 1; + } else { + duplicateTracker[asset.id]++; + } + if (predefinedAssetIds.includes(asset.id) && duplicateTracker[asset.id] === 1) return; + if (type && asset[type]) { + const value = asset[type].text || asset[type].value || asset[type].url || ''; + if (type === 'img') { + bidResponse.native[`image_${asset.id}_extra${duplicateTracker[asset.id] - 1}`] = { + url: value, + width: asset.img.w || null, + height: asset.img.h || null + }; + } else { + bidResponse.native[`data_${asset.id}_extra${duplicateTracker[asset.id] - 1}`] = value; + } + } + }); + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } + bidResponses.push(bidResponse); + }); + }); + } else { + let adData = serverResponse.body; + let cpm = adData.cpm; + if (!cpm) return []; + const bidResponse = { + requestId: bidObj.bidId, + cpm: cpm, + width: adData.w, + height: adData.h, + creativeId: bidObj.params.placementId, + currency: 'EUR', + netRevenue: true, + ttl: 300, + meta: { + advertiserDomains: adData.adomain || [] + } + }; + let adm = '' + adData.adm; + bidResponse.ad = adm; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getBidderHost: function (bid) { + if (bid.bidder === 'adspirit') { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter('host', bid.params); + } + if (bid.bidder === 'twiago') { + return 'a.twiago.com'; + } + return null; + }, + genAdConId: function (bid) { + return bid.bidder + Math.round(Math.random() * 100000); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('adspiritBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adspiritBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adstirBidAdapter"],{ + +/***/ "./modules/adstirBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adstirBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'adstir'; +const ENDPOINT = 'https://ad.ad-stir.com/prebid'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr(bid.params.appId) && !_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr(bid.params.appId) && _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger(bid.params.adSpaceNo)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const sua = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](validBidRequests[0], 'ortb2.device.sua', null); + const requests = validBidRequests.map(r => { + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify({ + appId: r.params.appId, + adSpaceNo: r.params.adSpaceNo, + auctionId: r.auctionId, + transactionId: r.transactionId, + bidId: r.bidId, + mediaTypes: r.mediaTypes, + sizes: r.sizes, + ref: { + page: bidderRequest.refererInfo.page, + tloc: bidderRequest.refererInfo.topmostLocation, + referrer: bidderRequest.refererInfo.ref, + topurl: _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('pageUrl') ? false : bidderRequest.refererInfo.reachedTop + }, + sua, + user: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](r, 'ortb2.user', null), + gdpr: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](bidderRequest, 'gdprConsent.gdprApplies', false), + usp: (bidderRequest.uspConsent || '1---') !== '1---', + eids: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](r, 'userIdAsEids', []), + schain: serializeSchain(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](r, 'schain', null)), + pbVersion: "9.45.0-pre" + }) + }; + }); + return requests; + }, + interpretResponse: function (serverResponse, bidRequest) { + const seatbid = serverResponse.body.seatbid; + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray(seatbid)) { + return []; + } + const bids = []; + seatbid.forEach(b => { + const bid = b.bid || null; + if (!bid) { + return; + } + bids.push(bid); + }); + return bids; + } +}; +function serializeSchain(schain) { + if (!schain) { + return null; + } + let serializedSchain = `${schain.ver},${schain.complete}`; + schain.nodes.map(node => { + serializedSchain += `!${encodeURIComponentForRFC3986(node.asi || '')},`; + serializedSchain += `${encodeURIComponentForRFC3986(node.sid || '')},`; + serializedSchain += `${encodeURIComponentForRFC3986(node.hp || '')},`; + serializedSchain += `${encodeURIComponentForRFC3986(node.rid || '')},`; + serializedSchain += `${encodeURIComponentForRFC3986(node.name || '')},`; + serializedSchain += `${encodeURIComponentForRFC3986(node.domain || '')}`; + }); + return serializedSchain; +} +function encodeURIComponentForRFC3986(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, c => `%${c.charCodeAt(0).toString(16)}`); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adstirBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adstirBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adtargetBidAdapter"],{ + +/***/ "./modules/adtargetBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/adtargetBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/chunk/chunk.js */ "./libraries/chunk/chunk.js"); +/* harmony import */ var _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/adtelligentUtils/adtelligentUtils.js */ "./libraries/adtelligentUtils/adtelligentUtils.js"); + + + + + + + + +const ENDPOINT = 'https://ghb.console.adtarget.com.tr/v2/auction/'; +const BIDDER_CODE = 'adtarget'; +const DISPLAY = 'display'; +const syncsCache = {}; +const spec = { + code: BIDDER_CODE, + gvlid: 779, + supportedMediaTypes: _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.supportedMediaTypes, + isBidRequestValid: _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.isBidRequestValid, + getUserSyncs: function (syncOptions, serverResponses) { + return (0,_libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.getUserSyncsFn)(syncOptions, serverResponses, syncsCache); + }, + buildRequests: function (bidRequests, adapterRequest) { + const adapterSettings = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(adapterRequest.bidderCode); + const chunkSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adapterSettings, 'chunkSize', 10); + const { + tag, + bids + } = bidToTag(bidRequests, adapterRequest); + const bidChunks = (0,_libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_3__.chunk)(bids, chunkSize); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__._map)(bidChunks, bids => { + return { + data: Object.assign({}, tag, { + BidRequests: bids + }), + adapterRequest, + method: 'POST', + url: ENDPOINT + }; + }); + }, + interpretResponse: function (serverResponse, _ref) { + let { + adapterRequest + } = _ref; + serverResponse = serverResponse.body; + let bids = []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(serverResponse)) { + return parseResponse(serverResponse, adapterRequest); + } + serverResponse.forEach(serverBidResponse => { + bids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.flatten)(bids, parseResponse(serverBidResponse, adapterRequest)); + }); + return bids; + } +}; +function parseResponse(serverResponse, adapterRequest) { + const isInvalidValidResp = !serverResponse || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(serverResponse.bids); + const bids = []; + if (isInvalidValidResp) { + const extMessage = serverResponse && serverResponse.ext && serverResponse.ext.message ? `: ${serverResponse.ext.message}` : ''; + const errorMessage = `in response for ${adapterRequest.bidderCode} adapter ${extMessage}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(errorMessage); + return bids; + } + serverResponse.bids.forEach(serverBid => { + const request = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(adapterRequest.bids, bidRequest => { + return bidRequest.bidId === serverBid.requestId; + }); + if (serverBid.cpm !== 0 && request !== undefined) { + const bid = createBid(serverBid, request); + bids.push(bid); + } + }); + return bids; +} +function bidToTag(bidRequests, adapterRequest) { + const tag = (0,_libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.createTag)(bidRequests, adapterRequest); + const bids = []; + for (let i = 0, length = bidRequests.length; i < length; i++) { + const bid = prepareBidRequests(bidRequests[i]); + bids.push(bid); + } + return { + tag, + bids + }; +} +function prepareBidRequests(bidReq) { + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO : DISPLAY; + const sizes = mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.playerSize') : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.banner.sizes'); + const bidReqParams = { + 'CallbackId': bidReq.bidId, + 'Aid': bidReq.params.aid, + 'AdType': mediaType, + 'Sizes': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseSizesInput)(sizes).join(',') + }; + return bidReqParams; +} +function getMediaType(bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER; +} +function createBid(bidResponse, bidRequest) { + const mediaType = getMediaType(bidRequest); + const bid = { + requestId: bidResponse.requestId, + creativeId: bidResponse.cmpId, + height: bidResponse.height, + currency: bidResponse.cur, + width: bidResponse.width, + cpm: bidResponse.cpm, + netRevenue: true, + mediaType, + ttl: 300, + meta: { + advertiserDomains: bidResponse.adomain || [] + } + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER) { + return Object.assign(bid, { + ad: bidResponse.ad + }); + } + Object.assign(bid, { + vastUrl: bidResponse.vastUrl + }); + return bid; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adtargetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","adtelligentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adtargetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adtelligentBidAdapter"],{ + +/***/ "./modules/adtelligentBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/adtelligentBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/chunk/chunk.js */ "./libraries/chunk/chunk.js"); +/* harmony import */ var _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/adtelligentUtils/adtelligentUtils.js */ "./libraries/adtelligentUtils/adtelligentUtils.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const subdomainSuffixes = ['', 1, 2]; +const AUCTION_PATH = '/v2/auction/'; +const PROTOCOL = 'https://'; +const HOST_GETTERS = { + default: function () { + let num = 0; + return function () { + return 'ghb' + subdomainSuffixes[num++ % subdomainSuffixes.length] + '.adtelligent.com'; + }; + }(), + streamkey: () => 'ghb.hb.streamkey.net', + janet: () => 'ghb.bidder.jmgads.com', + ocm: () => 'ghb.cenarius.orangeclickmedia.com', + '9dotsmedia': () => 'ghb.platform.audiodots.com', + indicue: () => 'ghb.console.indicue.com', + stellormedia: () => 'ghb.ads.stellormedia.com' +}; +const getUri = function (bidderCode) { + let bidderWithoutSuffix = bidderCode.split('_')[0]; + let getter = HOST_GETTERS[bidderWithoutSuffix] || HOST_GETTERS['default']; + return PROTOCOL + getter() + AUCTION_PATH; +}; +const OUTSTREAM_SRC = 'https://player.adtelligent.com/outstream-unit/2.01/outstream.min.js'; +const BIDDER_CODE = 'adtelligent'; +const OUTSTREAM = 'outstream'; +const DISPLAY = 'display'; +const syncsCache = {}; +const spec = { + code: BIDDER_CODE, + gvlid: 410, + aliases: ['streamkey', 'janet', { + code: 'selectmedia', + gvlid: 775 + }, { + code: 'ocm', + gvlid: 1148 + }, '9dotsmedia', 'indicue', 'stellormedia'], + supportedMediaTypes: _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.supportedMediaTypes, + isBidRequestValid: _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.isBidRequestValid, + getUserSyncs: function (syncOptions, serverResponses) { + return (0,_libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.getUserSyncsFn)(syncOptions, serverResponses, syncsCache); + }, + /** + * Make a server request from the list of BidRequests + * @param bidRequests + * @param adapterRequest + */ + buildRequests: function (bidRequests, adapterRequest) { + const adapterSettings = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(adapterRequest.bidderCode); + const chunkSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adapterSettings, 'chunkSize', 10); + const { + tag, + bids + } = bidToTag(bidRequests, adapterRequest); + const bidChunks = (0,_libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_3__.chunk)(bids, chunkSize); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__._map)(bidChunks, bids => { + return { + data: Object.assign({}, tag, { + BidRequests: bids + }), + adapterRequest, + method: 'POST', + url: getUri(adapterRequest.bidderCode) + }; + }); + }, + /** + * Unpack the response from the server into a list of bids + * @param {*} serverResponse + * @param {Object} responseArgs + * @param {*} responseArgs.adapterRequest + * @return {Bid[]} An array of bids which were nested inside the server + */ + interpretResponse: function (serverResponse, _ref) { + let { + adapterRequest + } = _ref; + serverResponse = serverResponse.body; + let bids = []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(serverResponse)) { + return parseRTBResponse(serverResponse, adapterRequest); + } + serverResponse.forEach(serverBidResponse => { + bids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.flatten)(bids, parseRTBResponse(serverBidResponse, adapterRequest)); + }); + return bids; + } +}; +function parseRTBResponse(serverResponse, adapterRequest) { + const isEmptyResponse = !serverResponse || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(serverResponse.bids); + const bids = []; + if (isEmptyResponse) { + return bids; + } + serverResponse.bids.forEach(serverBid => { + const request = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(adapterRequest.bids, bidRequest => { + return bidRequest.bidId === serverBid.requestId; + }); + if (serverBid.cpm !== 0 && request !== undefined) { + const bid = createBid(serverBid, request); + bids.push(bid); + } + }); + return bids; +} +function bidToTag(bidRequests, adapterRequest) { + // start publisher env + const tag = (0,_libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.createTag)(bidRequests, adapterRequest); + if (window.adtDmp && window.adtDmp.ready) { + tag.DMPId = window.adtDmp.getUID(); + } + if (adapterRequest.gppConsent) { + tag.GPP = adapterRequest.gppConsent.gppString; + tag.GPPSid = adapterRequest.gppConsent.applicableSections?.toString(); + } else if (adapterRequest.ortb2?.regs?.gpp) { + tag.GPP = adapterRequest.ortb2.regs.gpp; + tag.GPPSid = adapterRequest.ortb2.regs.gpp_sid; + } + + // end publisher env + const bids = []; + for (let i = 0, length = bidRequests.length; i < length; i++) { + const bid = prepareBidRequests(bidRequests[i]); + bids.push(bid); + } + return { + tag, + bids + }; +} + +/** + * Parse mediaType + * @param bidReq {object} + * @returns {object} + */ +function prepareBidRequests(bidReq) { + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO : DISPLAY; + const sizes = mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.playerSize') : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.banner.sizes'); + const bidReqParams = { + 'CallbackId': bidReq.bidId, + 'Aid': bidReq.params.aid, + 'AdType': mediaType, + 'Sizes': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseSizesInput)(sizes).join(',') + }; + bidReqParams.PlacementId = bidReq.adUnitCode; + if (bidReq.params.iframe) { + bidReqParams.AdmType = 'iframe'; + } + if (bidReq.params.vpb_placement_id) { + bidReqParams.PlacementId = bidReq.params.vpb_placement_id; + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO) { + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.context'); + if (context === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.ADPOD) { + bidReqParams.Adpod = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video'); + } + } + return bidReqParams; +} + +/** + * Prepare all parameters for request + * @param bidderRequest {object} + * @returns {object} + */ +function getMediaType(bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER; +} + +/** + * Configure new bid by response + * @param bidResponse {object} + * @param bidRequest {Object} + * @returns {object} + */ +function createBid(bidResponse, bidRequest) { + const mediaType = getMediaType(bidRequest); + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.context'); + const bid = { + requestId: bidResponse.requestId, + creativeId: bidResponse.cmpId, + height: bidResponse.height, + currency: bidResponse.cur, + width: bidResponse.width, + cpm: bidResponse.cpm, + netRevenue: true, + mediaType, + ttl: 300, + meta: { + advertiserDomains: bidResponse.adomain || [] + } + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER) { + return Object.assign(bid, { + ad: bidResponse.ad, + adUrl: bidResponse.adUrl + }); + } + if (context === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.ADPOD) { + Object.assign(bid, { + meta: { + primaryCatId: bidResponse.primaryCatId + }, + video: { + context: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.ADPOD, + durationSeconds: bidResponse.durationSeconds + } + }); + } + Object.assign(bid, { + vastUrl: bidResponse.vastUrl + }); + if (context === OUTSTREAM) { + Object.assign(bid, { + adResponse: bidResponse, + renderer: newRenderer(bidResponse.requestId, bidRequest.params) + }); + } + return bid; +} + +/** + * Create Adtelligent renderer + * @param requestId + * @param bidderParams + * @returns {*} + */ +function newRenderer(requestId, bidderParams) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: requestId, + url: OUTSTREAM_SRC, + config: bidderParams.outstream || {}, + loaded: false + }); + renderer.setRender(outstreamRender); + return renderer; +} + +/** + * Initialise Adtelligent outstream + * @param bid + */ +function outstreamRender(bid) { + bid.renderer.push(() => { + const opts = Object.assign({}, bid.renderer.getConfig(), { + width: bid.width, + height: bid.height, + vastUrl: bid.vastUrl, + elId: bid.adUnitCode + }); + window.VOutstreamAPI.initOutstreams([opts]); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('adtelligentBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","adtelligentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adtelligentBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adtelligentIdSystem"],{ + +/***/ "./modules/adtelligentIdSystem.js": +/*!****************************************!*\ + !*** ./modules/adtelligentIdSystem.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export adtelligentIdModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds Adtelligent DMP Tokens to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/adtelligentIdSystem + * @requires module:modules/userId + */ + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const gvlid = 410; +const moduleName = 'adtelligent'; +const syncUrl = 'https://idrs.adtelligent.com/get'; +function buildUrl(opts) { + const queryPairs = []; + for (let key in opts) { + queryPairs.push(`${key}=${encodeURIComponent(opts[key])}`); + } + return `${syncUrl}?${queryPairs.join('&')}`; +} +function requestRemoteIdAsync(url, cb) { + _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder()(url, { + success: response => { + const jsonResponse = JSON.parse(response); + const { + u: dmpId + } = jsonResponse; + cb(dmpId); + }, + error: () => { + cb(); + } + }, null, { + method: 'GET', + contentType: 'application/json', + withCredentials: true + }); +} + +/** @type {Submodule} */ +const adtelligentIdModule = { + /** + * used to link submodule with config + * @type {string} + */ + name: moduleName, + gvlid: gvlid, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{adtelligentId: string}} + */ + decode(uid) { + return { + adtelligentId: uid + }; + }, + /** + * get the Adtelligent Id from local storages and initiate a new user sync + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {IdResponse} + */ + getId(config) { + let { + gdpr: consentData + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const gdpr = consentData && consentData.gdprApplies ? 1 : 0; + const gdprConsent = gdpr ? consentData.consentString : ''; + const url = buildUrl({ + gdpr, + gdprConsent + }); + if (window.adtDmp && window.adtDmp.ready) { + return { + id: window.adtDmp.getUID() + }; + } + return { + callback: cb => { + requestRemoteIdAsync(url, id => { + cb(id); + }); + } + }; + }, + eids: { + 'adtelligentId': { + source: 'adtelligent.com', + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.submodule)('userId', adtelligentIdModule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('adtelligentIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adtelligentIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adtrgtmeBidAdapter"],{ + +/***/ "./modules/adtrgtmeBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/adtrgtmeBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); + + + + + + +const BIDDER_CODE = 'adtrgtme'; +const BIDDER_VERSION = '1.0.6'; +const BIDDER_URL = 'https://z.cdn.adtarget.market/ssp?prebid&s='; +const PREBIDJS_VERSION = "9.45.0-pre"; +const DEFAULT_TTL = 300; +const DEFAULT_CUR = 'USD'; +function getFormat(s) { + const parseSize = _ref => { + let [w, h] = _ref; + return { + w: parseInt(w, 10), + h: parseInt(h, 10) + }; + }; + return Array.isArray(s) && s.length === 2 && !Array.isArray(s[0]) ? [parseSize(s)] : s.map(parseSize); +} +function getType(b) { + return b?.mediaTypes?.banner ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : false; +} +function getBidfloor(b) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(b.getFloor) ? b.getFloor({ + size: '*', + currency: b?.params?.bidOverride?.cur ?? DEFAULT_CUR, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + }) : false; +} +function getTtl(b) { + const t = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('adtrgtme.ttl'); + const validate = t => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(t) && t > 0 && t < 3000 ? t : DEFAULT_TTL; + return t ? validate(t) : validate(b?.params?.ttl); +} +function createORTB(bR, bid) { + if (!bR || !bid) return; + const { + currency = bid.params?.bidOverride?.cur || DEFAULT_CUR + } = getBidfloor(bR); + const ip = bid.params?.bidOverride?.device?.ip || bid.ortb2?.device?.ip || bid.params?.ext?.ip; + const site = bid.ortb2?.site || undefined; + const user = bid.ortb2?.user || undefined; + const gdpr = bR.gdprConsent?.gdprApplies ? 1 : 0; + const consentString = gdpr ? bR.gdprConsent?.consentString : ''; + const usPrivacy = bR.uspConsent || ''; + let oR = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + cur: [currency], + imp: [], + site: { + id: String(bid.params?.sid), + page: bR.refererInfo?.page || '', + ...site + }, + device: { + dnt: bid?.params?.dnt ? 1 : 0, + ua: bid?.params?.ua || navigator.userAgent, + ip + }, + regs: { + ext: { + us_privacy: usPrivacy, + gdpr + } + }, + source: { + ext: { + hb: 1, + bidderver: BIDDER_VERSION, + prebidjsver: PREBIDJS_VERSION, + ...(bid?.schain && { + schain: bid.schain + }) + }, + fd: 1 + }, + user: { + ...user, + ext: { + consent: consentString, + ...(user?.ext || {}) + } + } + }; + if (bid?.schain) { + oR.source.ext.schain.nodes[0].rid = oR.id; + } + return oR; +} +function appendImp(bid, oRtb) { + if (!oRtb || !bid) return; + const type = getType(bid); + const { + floor: bidfloor = 0, + currency: bidfloorcur = '' + } = getBidfloor(bid); + const impObject = { + id: bid.bidId, + secure: 1, + bidfloor: bid?.params?.bidOverride?.imp?.bidfloor || bidfloor, + bidfloorcur: bid?.params?.bidOverride?.imp?.bidfloorcur || bidfloorcur, + ext: { + dfp_ad_unit_code: bid.adUnitCode, + ...(bid?.ortb2Imp?.ext?.data && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bid.ortb2Imp.ext.data) && { + data: bid.ortb2Imp.ext.data + }) + }, + ...(bid?.params?.zid && { + tagid: String(bid.params.zid) + }), + ...(bid?.ortb2Imp?.instl === 1 && { + instl: 1 + }) + }; + if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + impObject.banner = { + mimes: bid.mediaTypes.banner.mimes || ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'], + format: getFormat(bid.sizes), + ...(bid.mediaTypes.banner.pos && { + pos: bid.mediaTypes.banner.pos + }) + }; + } + oRtb.imp.push(impObject); +} +function createRequest(_ref2) { + let { + data, + options, + bidderRequest + } = _ref2; + return { + url: `${_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('adtrgtme.endpoint') || BIDDER_URL}${data.site?.id || ''}`, + method: 'POST', + data, + options, + bidderRequest + }; +} +const spec = { + code: BIDDER_CODE, + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + const params = bid.params; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(params) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(params.sid) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(params.sid) && params.sid.length > 0 && ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(params.zid) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(params.zid) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(params.zid) && !isNaN(parseInt(params.zid)))) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Adtrgtme request invalid'); + return false; + } + }, + buildRequests: function (bR, aR) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(bR) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(aR)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Adtrgtme Adapter: buildRequests called with empty request'); + return undefined; + } + const options = { + contentType: 'application/json', + withCredentials: (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_3__.hasPurpose1Consent)(aR.gdprConsent) + }; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('adtrgtme.singleRequestMode') === true) { + const data = createORTB(aR, bR[0]); + bR.forEach(bid => { + appendImp(bid, data); + }); + return createRequest({ + data, + options, + bidderRequest: aR + }); + } + return bR.map(b => { + const data = createORTB(aR, b); + appendImp(b, data); + return createRequest({ + data, + options, + bidderRequest: b + }); + }); + }, + interpretResponse: function (sR, _ref3) { + let { + data, + bidderRequest + } = _ref3; + const res = []; + if (!sR.body || !Array.isArray(sR.body.seatbid)) { + return res; + } + sR.body.seatbid.forEach(sb => { + try { + let b = sb.bid[0]; + res.push({ + adId: b?.adId ? b.adId : b.impid || b.crid, + ad: b.adm, + adUnitCode: bidderRequest.adUnitCode, + requestId: b.impid, + cpm: b.price, + width: b.w, + height: b.h, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + creativeId: b.crid || 0, + currency: b.cur || DEFAULT_CUR, + dealId: b.dealid ? b.dealid : null, + netRevenue: true, + ttl: getTtl(bidderRequest), + meta: { + advertiserDomains: b.adomain || [], + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + } + }); + } catch (e) { + return res; + } + }); + return res; + }, + getUserSyncs: function (options, res, gdprConsent, uspConsent, gppConsent) { + const s = []; + if (!options.pixelEnabled && !options.iframeEnabled) { + return s; + } + if (Array.isArray(res)) { + res.forEach(response => { + const p = response.body?.ext?.pixels; + if (Array.isArray(p)) { + p.forEach(_ref4 => { + let [stype, url] = _ref4; + const type = stype.toLowerCase(); + if (typeof url === 'string' && url.startsWith('http') && ((type === 'image' || type === 'img') && options.pixelEnabled || type === 'iframe' && options.iframeEnabled)) { + s.push({ + type, + url: addConsentParams(url) + }); + } + }); + } + }); + } + function addConsentParams(url) { + if (gdprConsent) { + url += `&gdpr=${gdprConsent.gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(gdprConsent.consentString) || ''}`; + } + if (uspConsent) { + url += `&us_privacy=${encodeURIComponent(uspConsent)}`; + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + url += `&gpp=${encodeURIComponent(gppConsent.gppString)}&gpp_sid=${encodeURIComponent(gppConsent.applicableSections?.join(','))}`; + } + return url; + } + return s; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adtrgtmeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adtrgtmeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adtrueBidAdapter"],{ + +/***/ "./modules/adtrueBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/adtrueBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +const BIDDER_CODE = 'adtrue'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const ADTRUE_CURRENCY = 'USD'; +const ENDPOINT_URL = 'https://hb.adtrue.com/prebid/auction'; +const LOG_WARN_PREFIX = 'AdTrue: '; +const AUCTION_TYPE = 1; +const UNDEFINED = undefined; +const DEFAULT_WIDTH = 0; +const DEFAULT_HEIGHT = 0; +const NET_REVENUE = false; +let publisherId = 0; +let zoneId = 0; +let NATIVE_ASSET_ID_TO_KEY_MAP = {}; +const DATA_TYPES = { + 'NUMBER': 'number', + 'STRING': 'string', + 'BOOLEAN': 'boolean', + 'ARRAY': 'array', + 'OBJECT': 'object' +}; +const SYNC_TYPES = Object.freeze({ + 1: 'iframe', + 2: 'image' +}); +const VIDEO_CUSTOM_PARAMS = { + 'mimes': DATA_TYPES.ARRAY, + 'minduration': DATA_TYPES.NUMBER, + 'maxduration': DATA_TYPES.NUMBER, + 'startdelay': DATA_TYPES.NUMBER, + 'playbackmethod': DATA_TYPES.ARRAY, + 'api': DATA_TYPES.ARRAY, + 'protocols': DATA_TYPES.ARRAY, + 'w': DATA_TYPES.NUMBER, + 'h': DATA_TYPES.NUMBER, + 'battr': DATA_TYPES.ARRAY, + 'linearity': DATA_TYPES.NUMBER, + 'placement': DATA_TYPES.NUMBER, + 'plcmt': DATA_TYPES.NUMBER, + 'minbitrate': DATA_TYPES.NUMBER, + 'maxbitrate': DATA_TYPES.NUMBER +}; +const NATIVE_ASSETS = { + 'TITLE': { + ID: 1, + KEY: 'title', + TYPE: 0 + }, + 'IMAGE': { + ID: 2, + KEY: 'image', + TYPE: 0 + }, + 'ICON': { + ID: 3, + KEY: 'icon', + TYPE: 0 + }, + 'SPONSOREDBY': { + ID: 4, + KEY: 'sponsoredBy', + TYPE: 1 + }, + // please note that type of SPONSORED is also 1 + 'BODY': { + ID: 5, + KEY: 'body', + TYPE: 2 + }, + // please note that type of DESC is also set to 2 + 'CLICKURL': { + ID: 6, + KEY: 'clickUrl', + TYPE: 0 + }, + 'VIDEO': { + ID: 7, + KEY: 'video', + TYPE: 0 + }, + 'EXT': { + ID: 8, + KEY: 'ext', + TYPE: 0 + }, + 'DATA': { + ID: 9, + KEY: 'data', + TYPE: 0 + }, + 'LOGO': { + ID: 10, + KEY: 'logo', + TYPE: 0 + }, + 'SPONSORED': { + ID: 11, + KEY: 'sponsored', + TYPE: 1 + }, + // please note that type of SPONSOREDBY is also set to 1 + 'DESC': { + ID: 12, + KEY: 'data', + TYPE: 2 + }, + // please note that type of BODY is also set to 2 + 'RATING': { + ID: 13, + KEY: 'rating', + TYPE: 3 + }, + 'LIKES': { + ID: 14, + KEY: 'likes', + TYPE: 4 + }, + 'DOWNLOADS': { + ID: 15, + KEY: 'downloads', + TYPE: 5 + }, + 'PRICE': { + ID: 16, + KEY: 'price', + TYPE: 6 + }, + 'SALEPRICE': { + ID: 17, + KEY: 'saleprice', + TYPE: 7 + }, + 'PHONE': { + ID: 18, + KEY: 'phone', + TYPE: 8 + }, + 'ADDRESS': { + ID: 19, + KEY: 'address', + TYPE: 9 + }, + 'DESC2': { + ID: 20, + KEY: 'desc2', + TYPE: 10 + }, + 'DISPLAYURL': { + ID: 21, + KEY: 'displayurl', + TYPE: 11 + }, + 'CTA': { + ID: 22, + KEY: 'cta', + TYPE: 12 + } +}; +function _getDomainFromURL(url) { + let anchor = document.createElement('a'); + anchor.href = url; + return anchor.hostname; +} +let platform = function getPlatform() { + var ua = navigator.userAgent; + if (ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1) { + return 'Android'; + } + if (ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)) { + return 'iOS'; + } + return 'windows'; +}(); +function _generateGUID() { + var d = new Date().getTime(); + var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : r & 0x3 | 0x8).toString(16); + }); + return guid; +} +function _isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +function _isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +function _parseAdSlot(bid) { + bid.params.width = 0; + bid.params.height = 0; + // check if size is mentioned in sizes array. in that case do not check for @ in adslot + if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) && bid.mediaTypes.banner.hasOwnProperty('sizes')) { + var i = 0; + var sizeArray = []; + for (; i < bid.mediaTypes.banner.sizes.length; i++) { + if (bid.mediaTypes.banner.sizes[i].length === 2) { + // sizes[i].length will not be 2 in case where size is set as fluid, we want to skip that entry + sizeArray.push(bid.mediaTypes.banner.sizes[i]); + } + } + bid.mediaTypes.banner.sizes = sizeArray; + if (bid.mediaTypes.banner.sizes.length >= 1) { + // set the first size in sizes array in bid.params.width and bid.params.height. These will be sent as primary size. + // The rest of the sizes will be sent in format array. + bid.params.width = bid.mediaTypes.banner.sizes[0][0]; + bid.params.height = bid.mediaTypes.banner.sizes[0][1]; + bid.mediaTypes.banner.sizes = bid.mediaTypes.banner.sizes.splice(1, bid.mediaTypes.banner.sizes.length - 1); + } + } +} +function _initConf(refererInfo) { + return { + // TODO: do the fallbacks make sense here? + pageURL: refererInfo?.page || window.location.href, + refURL: refererInfo?.ref || window.document.referrer + }; +} +function _getLanguage() { + const language = navigator.language ? 'language' : 'userLanguage'; + return navigator[language].split('-')[0]; +} +function _createOrtbTemplate(conf) { + var guid; + if (storage.getDataFromLocalStorage('adtrue_user_id') == null) { + storage.setDataInLocalStorage('adtrue_user_id', _generateGUID()); + } + guid = storage.getDataFromLocalStorage('adtrue_user_id'); + return { + id: '' + new Date().getTime(), + at: AUCTION_TYPE, + cur: [ADTRUE_CURRENCY], + imp: [], + site: { + page: conf.pageURL, + ref: conf.refURL, + publisher: {} + }, + device: { + ip: '', + ua: navigator.userAgent, + os: platform, + js: 1, + dnt: navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1' ? 1 : 0, + h: screen.height, + w: screen.width, + language: _getLanguage(), + devicetype: _isMobile() ? 1 : _isConnectedTV() ? 3 : 2, + geo: { + country: '{country_code}', + type: 0, + ipservice: 1, + region: '', + city: '' + } + }, + user: { + id: guid + }, + ext: {} + }; +} +function _checkParamDataType(key, value, datatype) { + var errMsg = 'Ignoring param key: ' + key + ', expects ' + datatype + ', found ' + typeof value; + var functionToExecute; + switch (datatype) { + case DATA_TYPES.BOOLEAN: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isBoolean; + break; + case DATA_TYPES.NUMBER: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber; + break; + case DATA_TYPES.STRING: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr; + break; + case DATA_TYPES.ARRAY: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray; + break; + } + if (functionToExecute(value)) { + return value; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + errMsg); + return UNDEFINED; +} +function _parseNativeResponse(bid, newBid) { + newBid.native = {}; + if (bid.hasOwnProperty('adm')) { + var adm = ''; + try { + adm = JSON.parse(bid.adm.replace(/\\/g, '')); + } catch (ex) { + // logWarn(LOG_WARN_PREFIX + 'Error: Cannot parse native reponse for ad response: ' + newBid.adm); + return; + } + if (adm && adm.native && adm.native.assets && adm.native.assets.length > 0) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + for (let i = 0, len = adm.native.assets.length; i < len; i++) { + switch (adm.native.assets[i].id) { + case NATIVE_ASSETS.TITLE.ID: + newBid.native.title = adm.native.assets[i].title && adm.native.assets[i].title.text; + break; + case NATIVE_ASSETS.IMAGE.ID: + newBid.native.image = { + url: adm.native.assets[i].img && adm.native.assets[i].img.url, + height: adm.native.assets[i].img && adm.native.assets[i].img.h, + width: adm.native.assets[i].img && adm.native.assets[i].img.w + }; + break; + case NATIVE_ASSETS.ICON.ID: + newBid.native.icon = { + url: adm.native.assets[i].img && adm.native.assets[i].img.url, + height: adm.native.assets[i].img && adm.native.assets[i].img.h, + width: adm.native.assets[i].img && adm.native.assets[i].img.w + }; + break; + case NATIVE_ASSETS.SPONSOREDBY.ID: + case NATIVE_ASSETS.BODY.ID: + case NATIVE_ASSETS.LIKES.ID: + case NATIVE_ASSETS.DOWNLOADS.ID: + case NATIVE_ASSETS.PRICE: + case NATIVE_ASSETS.SALEPRICE.ID: + case NATIVE_ASSETS.PHONE.ID: + case NATIVE_ASSETS.ADDRESS.ID: + case NATIVE_ASSETS.DESC2.ID: + case NATIVE_ASSETS.CTA.ID: + case NATIVE_ASSETS.RATING.ID: + case NATIVE_ASSETS.DISPLAYURL.ID: + newBid.native[NATIVE_ASSET_ID_TO_KEY_MAP[adm.native.assets[i].id]] = adm.native.assets[i].data && adm.native.assets[i].data.value; + break; + } + } + newBid.native.clickUrl = adm.native.link && adm.native.link.url; + newBid.native.clickTrackers = adm.native.link && adm.native.link.clicktrackers || []; + newBid.native.impressionTrackers = adm.native.imptrackers || []; + newBid.native.jstracker = adm.native.jstracker || []; + if (!newBid.width) { + newBid.width = DEFAULT_WIDTH; + } + if (!newBid.height) { + newBid.height = DEFAULT_HEIGHT; + } + } + } +} +function _createBannerRequest(bid) { + var sizes = bid.mediaTypes.banner.sizes; + var format = []; + var bannerObj; + if (sizes !== UNDEFINED && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(sizes)) { + bannerObj = {}; + if (!bid.params.width && !bid.params.height) { + if (sizes.length === 0) { + // i.e. since bid.params does not have width or height, and length of sizes is 0, need to ignore this banner imp + bannerObj = UNDEFINED; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: mediaTypes.banner.size missing for adunit: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.'); + return bannerObj; + } else { + bannerObj.w = parseInt(sizes[0][0], 10); + bannerObj.h = parseInt(sizes[0][1], 10); + sizes = sizes.splice(1, sizes.length - 1); + } + } else { + bannerObj.w = bid.params.width; + bannerObj.h = bid.params.height; + } + if (sizes.length > 0) { + format = []; + sizes.forEach(function (size) { + if (size.length > 1) { + format.push({ + w: size[0], + h: size[1] + }); + } + }); + if (format.length > 0) { + bannerObj.format = format; + } + } + bannerObj.pos = 0; + bannerObj.topframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.inIframe)() ? 0 : 1; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: mediaTypes.banner.size missing for adunit: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.'); + bannerObj = UNDEFINED; + } + return bannerObj; +} +function _createVideoRequest(bid) { + var videoData = bid.params.video; + var videoObj; + if (videoData !== UNDEFINED) { + videoObj = {}; + for (var key in VIDEO_CUSTOM_PARAMS) { + if (videoData.hasOwnProperty(key)) { + videoObj[key] = _checkParamDataType(key, videoData[key], VIDEO_CUSTOM_PARAMS[key]); + } + } + // read playersize and assign to h and w. + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.mediaTypes.video.playerSize[0])) { + videoObj.w = parseInt(bid.mediaTypes.video.playerSize[0][0], 10); + videoObj.h = parseInt(bid.mediaTypes.video.playerSize[0][1], 10); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(bid.mediaTypes.video.playerSize[0])) { + videoObj.w = parseInt(bid.mediaTypes.video.playerSize[0], 10); + videoObj.h = parseInt(bid.mediaTypes.video.playerSize[1], 10); + } + if (bid.params.video.hasOwnProperty('skippable')) { + videoObj.ext = { + 'video_skippable': bid.params.video.skippable ? 1 : 0 + }; + } + } else { + videoObj = UNDEFINED; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: Video config params missing for adunit: ' + bid.params.adUnit + ' with mediaType set as video. Ignoring video impression in the adunit.'); + } + return videoObj; +} +function _checkMediaType(adm, newBid) { + var admStr = ''; + var videoRegex = new RegExp(/VAST\s+version/); + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + if (videoRegex.test(adm)) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } else { + try { + admStr = JSON.parse(adm.replace(/\\/g, '')); + if (admStr && admStr.native) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: Cannot parse native reponse for ad response: ' + adm); + } + } +} +function _createImpressionObject(bid, conf) { + var impObj = {}; + var bannerObj; + var videoObj; + var sizes = bid.hasOwnProperty('sizes') ? bid.sizes : []; + var mediaTypes = ''; + var format = []; + impObj = { + id: bid.bidId, + tagid: String(bid.params.zoneId || undefined), + bidfloor: 0, + secure: 1, + ext: {}, + bidfloorcur: ADTRUE_CURRENCY + }; + if (bid.hasOwnProperty('mediaTypes')) { + for (mediaTypes in bid.mediaTypes) { + switch (mediaTypes) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER: + bannerObj = _createBannerRequest(bid); + if (bannerObj !== UNDEFINED) { + impObj.banner = bannerObj; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO: + videoObj = _createVideoRequest(bid); + if (videoObj !== UNDEFINED) { + impObj.video = videoObj; + } + break; + } + } + } else { + // mediaTypes is not present, so this is a banner only impression + // this part of code is required for older testcases with no 'mediaTypes' to run succesfully. + bannerObj = { + pos: 0, + w: bid.params.width, + h: bid.params.height, + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.inIframe)() ? 0 : 1 + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(sizes) && sizes.length > 1) { + sizes = sizes.splice(1, sizes.length - 1); + sizes.forEach(size => { + format.push({ + w: size[0], + h: size[1] + }); + }); + bannerObj.format = format; + } + impObj.banner = bannerObj; + } + return impObj.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) || impObj.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE) || impObj.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) ? impObj : UNDEFINED; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: ['banner', 'video'], + isBidRequestValid: function (bid) { + if (bid && bid.params) { + if (!bid.params.zoneId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: missing zoneId'); + return false; + } + if (!bid.params.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: missing publisherId'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(bid.params.publisherId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: publisherId is mandatory and cannot be numeric'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(bid.params.zoneId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Error: zoneId is mandatory and cannot be numeric'); + return false; + } + return true; + } + return false; + }, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_3__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let refererInfo; + if (bidderRequest && bidderRequest.refererInfo) { + refererInfo = bidderRequest.refererInfo; + } + let conf = _initConf(refererInfo); + let payload = _createOrtbTemplate(conf); + let bidCurrency = ''; + let bid; + validBidRequests.forEach(originalBid => { + bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(originalBid); + _parseAdSlot(bid); + conf.zoneId = conf.zoneId || bid.params.zoneId; + conf.pubId = conf.pubId || bid.params.publisherId; + conf.transactionId = bid.ortb2Imp?.ext?.tid; + if (bidCurrency === '') { + bidCurrency = bid.params.currency || UNDEFINED; + } else if (bid.params.hasOwnProperty('currency') && bidCurrency !== bid.params.currency) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_WARN_PREFIX + 'Currency specifier ignored. Only one currency permitted.'); + } + bid.params.currency = bidCurrency; + var impObj = _createImpressionObject(bid, conf); + if (impObj) { + payload.imp.push(impObj); + } + }); + if (payload.imp.length == 0) { + return; + } + publisherId = conf.pubId.trim(); + zoneId = conf.zoneId.trim(); + payload.site.publisher.id = conf.pubId.trim(); + payload.ext.wrapper = {}; + payload.ext.wrapper.transactionId = conf.transactionId; + payload.ext.wrapper.wiid = conf.wiid || bidderRequest.ortb2?.ext?.tid; + payload.ext.wrapper.wp = 'pbjs'; + payload.user.geo = {}; + payload.device.geo = payload.user.geo; + payload.site.page = conf.pageURL; + payload.site.domain = _getDomainFromURL(payload.site.page); + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('content') === 'object') { + payload.site.content = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('content'); + } + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('device') === 'object') { + payload.device = Object.assign(payload.device, _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('device')); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'source.tid', conf.transactionId); + // test bids + if (window.location.href.indexOf('adtrueTest=true') !== -1) { + payload.test = 1; + } + // adding schain object + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'source.ext.schain', validBidRequests[0].schain); + } + // Attaching GDPR Consent Params + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.coppa', 1); + } + return { + method: 'POST', + url: ENDPOINT_URL, + data: JSON.stringify(payload), + bidderRequests: bidderRequest + }; + }, + interpretResponse: function (serverResponses, bidderRequest) { + const bidResponses = []; + var respCur = ADTRUE_CURRENCY; + let parsedRequest = JSON.parse(bidderRequest.data); + let parsedReferrer = parsedRequest.site && parsedRequest.site.ref ? parsedRequest.site.ref : ''; + try { + if (serverResponses.body && serverResponses.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(serverResponses.body.seatbid)) { + // Supporting multiple bid responses for same adSize + respCur = serverResponses.body.cur || respCur; + serverResponses.body.seatbid.forEach(seatbidder => { + seatbidder.bid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(seatbidder.bid) && seatbidder.bid.forEach(bid => { + let newBid = { + requestId: bid.impid, + cpm: (parseFloat(bid.price) || 0).toFixed(2), + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.id, + dealId: bid.dealid, + currency: respCur, + netRevenue: NET_REVENUE, + ttl: 300, + referrer: parsedReferrer, + ad: bid.adm, + partnerImpId: bid.id || '' // partner impression Id + }; + if (parsedRequest.imp && parsedRequest.imp.length > 0) { + parsedRequest.imp.forEach(req => { + if (bid.impid === req.id) { + _checkMediaType(bid.adm, newBid); + switch (newBid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER: + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO: + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE: + _parseNativeResponse(bid, newBid); + break; + } + } + }); + } + newBid.meta = {}; + if (bid.ext && bid.ext.dspid) { + newBid.meta.networkId = bid.ext.dspid; + } + if (bid.ext && bid.ext.advid) { + newBid.meta.buyerId = bid.ext.advid; + } + if (bid.adomain && bid.adomain.length > 0) { + newBid.meta.advertiserDomains = bid.adomain; + newBid.meta.clickUrl = bid.adomain[0]; + } + // adserverTargeting + if (seatbidder.ext && seatbidder.ext.buyid) { + newBid.adserverTargeting = { + 'hb_buyid_adtrue': seatbidder.ext.buyid + }; + } + bidResponses.push(newBid); + }); + }); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) { + if (!responses || responses.length === 0 || !syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return []; + } + return responses.reduce((accum, rsp) => { + let cookieSyncs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(rsp, 'body.ext.cookie_sync'); + if (cookieSyncs) { + let cookieSyncObjects = cookieSyncs.map(cookieSync => { + return { + type: SYNC_TYPES[cookieSync.type], + url: cookieSync.url + '&publisherId=' + publisherId + '&zoneId=' + zoneId + '&gdpr=' + (gdprConsent && gdprConsent.gdprApplies ? 1 : 0) + '&gdpr_consent=' + encodeURIComponent(gdprConsent ? gdprConsent.consentString : '') + '&us_privacy=' + encodeURIComponent(uspConsent || '') + '&coppa=' + (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true ? 1 : 0) + }; + }); + return accum.concat(cookieSyncObjects); + } + }, []); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adtrueBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adtrueBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["aduptechBidAdapter"],{ + +/***/ "./modules/aduptechBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/aduptechBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, GVLID, ENDPOINT_URL_PUBLISHER_PLACEHOLDER, ENDPOINT_URL, ENDPOINT_METHOD, internal, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'aduptech'; +const GVLID = 647; +const ENDPOINT_URL_PUBLISHER_PLACEHOLDER = '{PUBLISHER}'; +const ENDPOINT_URL = 'https://rtb.d.adup-tech.com/prebid/' + ENDPOINT_URL_PUBLISHER_PLACEHOLDER + '_bid'; +const ENDPOINT_METHOD = 'POST'; + +/** + * Internal utitlity functions + */ +const internal = { + /** + * Extracts the GDPR information from given bidderRequest + * + * @param {BidderRequest} bidderRequest + * @returns {null|Object.} + */ + extractGdpr: bidderRequest => { + if (!bidderRequest?.gdprConsent) { + return null; + } + return { + consentString: bidderRequest.gdprConsent.consentString, + consentRequired: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBoolean)(bidderRequest.gdprConsent.gdprApplies) ? bidderRequest.gdprConsent.gdprApplies : true + }; + }, + /** + * Extracts the pageUrl from given bidderRequest.refererInfo or gobal "pageUrl" config or from (top) window location + * + * @param {BidderRequest} bidderRequest + * @returns {string} + */ + extractPageUrl: bidderRequest => { + // TODO: does it make sense to fall back here? + return bidderRequest?.refererInfo?.page || window.location.href; + }, + /** + * Extracts the referrer based on given bidderRequest.refererInfo or from (top) document referrer + * + * @param {BidderRequest} bidderRequest + * @returns {string} + */ + extractReferrer: bidderRequest => { + // TODO: does it make sense to fall back here? + return bidderRequest?.refererInfo?.ref || window.document.referrer; + }, + /** + * Extracts banner config from given bidRequest + * + * @param {BidRequest} bidRequest + * @returns {null|Object.} + */ + extractBannerConfig: bidRequest => { + const adUnitSizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__.getAdUnitSizes)(bidRequest); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(adUnitSizes) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(adUnitSizes)) { + return null; + } + const banner = { + sizes: [] + }; + adUnitSizes.forEach(adUnitSize => { + const size = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(adUnitSize); + + // try to add floor for each banner size + const floor = internal.getFloor(bidRequest, { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + size: adUnitSize + }); + if (floor) { + size.push(floor.floor); + size.push(floor.currency); + } + banner.sizes.push(size); + }); + + // try to add default floor for banner + const floor = internal.getFloor(bidRequest, { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + size: '*' + }); + if (floor) { + banner.floorPrice = floor.floor; + banner.floorCurrency = floor.currency; + } + return banner; + }, + /** + * Extracts native config from given bidRequest + * + * @param {BidRequest} bidRequest + * @returns {null|Object.} + */ + extractNativeConfig: bidRequest => { + if (!bidRequest?.mediaTypes?.native) { + return null; + } + const native = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bidRequest.mediaTypes.native); + + // try to add default floor for native + const floor = internal.getFloor(bidRequest, { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE, + size: '*' + }); + if (floor) { + native.floorPrice = floor.floor; + native.floorCurrency = floor.currency; + } + return native; + }, + /** + * Extracts the bidder params from given bidRequest + * + * @param {BidRequest} bidRequest + * @returns {null|Object.} + */ + extractParams: bidRequest => { + if (!bidRequest?.params) { + return null; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bidRequest.params); + }, + /** + * Try to get floor information via bidRequest.getFloor() + * + * @param {BidRequest} bidRequest + * @param {Object} options + * @returns {null|Object.} + */ + getFloor: (bidRequest, options) => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bidRequest?.getFloor)) { + return null; + } + try { + const floor = bidRequest.getFloor(options); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floor) && !isNaN(floor.floor)) { + return floor; + } + } catch {} + return null; + }, + /** + * Group given array of bidRequests by params.publisher + * + * @param {BidRequest[]} bidRequests + * @returns {Object.} + */ + groupBidRequestsByPublisher: bidRequests => { + const groupedBidRequests = {}; + if (!bidRequests || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(bidRequests)) { + return groupedBidRequests; + } + bidRequests.forEach(bidRequest => { + const publisher = internal.extractParams(bidRequest).publisher; + if (!publisher) { + return; + } + if (!groupedBidRequests[publisher]) { + groupedBidRequests[publisher] = []; + } + groupedBidRequests[publisher].push(bidRequest); + }); + return groupedBidRequests; + }, + /** + * Build ednpoint url based on given publisher code + * + * @param {string} publisher + * @returns {string} + */ + buildEndpointUrl: publisher => { + return ENDPOINT_URL.replace(ENDPOINT_URL_PUBLISHER_PLACEHOLDER, encodeURIComponent(publisher)); + } +}; + +/** + * The bid adapter definition + */ +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + gvlid: GVLID, + /** + * Validate given bid request + * + * @param {BidRequest[]} bidRequest + * @returns {boolean} + */ + isBidRequestValid: bidRequest => { + if (!bidRequest) { + return false; + } + + // banner or native config has to be set + if (!internal.extractBannerConfig(bidRequest) && !internal.extractNativeConfig(bidRequest)) { + return false; + } + + // publisher and placement param has to be set + const params = internal.extractParams(bidRequest); + if (!params || !params.publisher || !params.placement) { + return false; + } + return true; + }, + /** + * Build real bid requests + * + * @param {BidRequest[]} validBidRequests + * @param {BidderRequest} bidderRequest + * @returns {Object[]} + */ + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_3__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const requests = []; + + // stop here on invalid or empty data + if (!bidderRequest || !validBidRequests || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(validBidRequests)) { + return requests; + } + + // collect required data + const auctionId = bidderRequest.auctionId; + const pageUrl = internal.extractPageUrl(bidderRequest); + const referrer = internal.extractReferrer(bidderRequest); + const gdpr = internal.extractGdpr(bidderRequest); + + // group bid requests by publisher + const groupedBidRequests = internal.groupBidRequestsByPublisher(validBidRequests); + + // build requests + for (const publisher in groupedBidRequests) { + const request = { + url: internal.buildEndpointUrl(publisher), + method: ENDPOINT_METHOD, + data: { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: auctionId, + pageUrl: pageUrl, + referrer: referrer, + imp: [] + } + }; + + // add gdpr data + if (gdpr) { + request.data.gdpr = gdpr; + } + + // handle multiple bids per request + groupedBidRequests[publisher].forEach(bidRequest => { + const bid = { + bidId: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + adUnitCode: bidRequest.adUnitCode, + params: internal.extractParams(bidRequest) + }; + + // add banner config + const bannerConfig = internal.extractBannerConfig(bidRequest); + if (bannerConfig) { + bid.banner = bannerConfig; + } + + // add native config + const nativeConfig = internal.extractNativeConfig(bidRequest); + if (nativeConfig) { + bid.native = nativeConfig; + } + + // try to add default floor + const floor = internal.getFloor(bidRequest, { + mediaType: '*', + size: '*' + }); + if (floor) { + bid.floorPrice = floor.floor; + bid.floorCurrency = floor.currency; + } + request.data.imp.push(bid); + }); + requests.push(request); + } + return requests; + }, + /** + * Handle bid response + * + * @param {Object} response + * @returns {Object[]} + */ + interpretResponse: response => { + const bidResponses = []; + + // stop here on invalid or empty data + if (!response?.body?.bids || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(response.body.bids)) { + return bidResponses; + } + + // parse multiple bids per response + response.body.bids.forEach(bid => { + if (!bid || !bid.bid || !bid.creative) { + return; + } + const bidResponse = { + requestId: bid.bid.bidId, + cpm: bid.bid.price, + netRevenue: bid.bid.net, + currency: bid.bid.currency, + ttl: bid.bid.ttl, + creativeId: bid.creative.id, + meta: { + advertiserDomains: bid.creative.advertiserDomains + } + }; + if (bid.creative.html) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + bidResponse.ad = bid.creative.html; + bidResponse.width = bid.creative.width; + bidResponse.height = bid.creative.height; + } + if (bid.creative.native) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE; + bidResponse.native = bid.creative.native; + } + bidResponses.push(bidResponse); + }); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('aduptechBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/aduptechBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["advRedAnalyticsAdapter"],{ + +/***/ "./modules/advRedAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/advRedAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + +/** + * advRedAnalyticsAdapter.js - analytics adapter for AdvRed + */ +const DEFAULT_EVENT_URL = 'https://api.adv.red/api/event'; +let ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder)(10000); +let pwId; +let initOptions; +let flushInterval; +let queue = []; +let advRedAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + url: DEFAULT_EVENT_URL, + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + handleEvent(eventType, args); + } +}); +function sendEvents() { + if (queue.length > 0) { + const message = { + pwId: pwId, + publisherId: initOptions.publisherId, + events: queue, + pageUrl: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.getRefererInfo)().page + }; + queue = []; + const url = initOptions.url ? initOptions.url : DEFAULT_EVENT_URL; + ajax(url, () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('AdvRed Analytics sent ' + queue.length + ' events'), JSON.stringify(message), { + method: 'POST', + contentType: 'application/json', + withCredentials: true + }); + } +} +function convertAdUnit(adUnit) { + if (!adUnit) return adUnit; + const shortAdUnit = {}; + shortAdUnit.code = adUnit.code; + shortAdUnit.sizes = adUnit.sizes; + return shortAdUnit; +} +function convertBid(bid) { + if (!bid) return bid; + const shortBid = {}; + shortBid.adUnitCode = bid.adUnitCode; + shortBid.bidder = bid.bidder; + shortBid.cpm = bid.cpm; + shortBid.currency = bid.currency; + shortBid.mediaTypes = bid.mediaTypes; + shortBid.sizes = bid.sizes; + shortBid.serverResponseTimeMs = bid.serverResponseTimeMs; + return shortBid; +} +function convertAuctionInit(origEvent) { + let shortEvent = {}; + shortEvent.auctionId = origEvent.auctionId; + shortEvent.timeout = origEvent.timeout; + shortEvent.adUnits = origEvent.adUnits && origEvent.adUnits.map(convertAdUnit); + return shortEvent; +} +function convertBidRequested(origEvent) { + let shortEvent = {}; + shortEvent.bidderCode = origEvent.bidderCode; + shortEvent.bids = origEvent.bids && origEvent.bids.map(convertBid); + shortEvent.timeout = origEvent.timeout; + return shortEvent; +} +function convertBidTimeout(origEvent) { + let shortEvent = {}; + shortEvent.bids = origEvent && origEvent.map ? origEvent.map(convertBid) : origEvent; + return shortEvent; +} +function convertBidderError(origEvent) { + let shortEvent = {}; + shortEvent.bids = origEvent.bidderRequest && origEvent.bidderRequest.bids && origEvent.bidderRequest.bids.map(convertBid); + return shortEvent; +} +function convertAuctionEnd(origEvent) { + let shortEvent = {}; + shortEvent.adUnitCodes = origEvent.adUnitCodes; + shortEvent.bidsReceived = origEvent.bidsReceived && origEvent.bidsReceived.map(convertBid); + shortEvent.noBids = origEvent.noBids && origEvent.noBids.map(convertBid); + return shortEvent; +} +function convertBidWon(origEvent) { + let shortEvent = {}; + shortEvent.adUnitCode = origEvent.adUnitCode; + shortEvent.bidderCode = origEvent.bidderCode; + shortEvent.mediaType = origEvent.mediaType; + shortEvent.netRevenue = origEvent.netRevenue; + shortEvent.cpm = origEvent.cpm; + shortEvent.size = origEvent.size; + shortEvent.currency = origEvent.currency; + return shortEvent; +} +function handleEvent(eventType, origEvent) { + try { + origEvent = origEvent ? JSON.parse(JSON.stringify(origEvent)) : {}; + } catch (e) {} + let shortEvent; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_INIT: + { + shortEvent = convertAuctionInit(origEvent); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_REQUESTED: + { + shortEvent = convertBidRequested(origEvent); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_TIMEOUT: + { + shortEvent = convertBidTimeout(origEvent); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BIDDER_ERROR: + { + shortEvent = convertBidderError(origEvent); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END: + { + shortEvent = convertAuctionEnd(origEvent); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_WON: + { + shortEvent = convertBidWon(origEvent); + break; + } + default: + return; + } + shortEvent.eventType = eventType; + shortEvent.auctionId = origEvent.auctionId; + shortEvent.timestamp = origEvent.timestamp || Date.now(); + sendEvent(shortEvent); +} +function sendEvent(event) { + queue.push(event); + if (event.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END) { + sendEvents(); + } +} +advRedAnalytics.originEnableAnalytics = advRedAnalytics.enableAnalytics; +advRedAnalytics.enableAnalytics = function (config) { + initOptions = config.options || {}; + pwId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(); + flushInterval = setInterval(sendEvents, 1000); + advRedAnalytics.originEnableAnalytics(config); +}; +advRedAnalytics.originDisableAnalytics = advRedAnalytics.disableAnalytics; +advRedAnalytics.disableAnalytics = function () { + clearInterval(flushInterval); + sendEvents(); + advRedAnalytics.originDisableAnalytics(); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: advRedAnalytics, + code: 'advRed' +}); +advRedAnalytics.getOptions = function () { + return initOptions; +}; +advRedAnalytics.sendEvents = sendEvents; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (advRedAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('advRedAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/advRedAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["advangelistsBidAdapter"],{ + +/***/ "./modules/advangelistsBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/advangelistsBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ spec: () => (/* binding */ spec) +/* harmony export */ }); +/* unused harmony exports VIDEO_TARGETING, VIDEO_ENDPOINT, BANNER_ENDPOINT, OUTSTREAM_SRC */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/advangUtils/index.js */ "./libraries/advangUtils/index.js"); + + + + + +const ADAPTER_VERSION = '1.0'; +const BIDDER_CODE = 'advangelists'; +const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip', 'playerSize', 'context']; +const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid='; +const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid='; +const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js'; +let pubid = ''; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + aliases: ['saambaa'], + isBidRequestValid(bidRequest) { + if (typeof bidRequest !== 'undefined') { + if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { + return false; + } + if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { + return false; + } + return true; + } else { + return false; + } + }, + buildRequests(bids, bidderRequest) { + let requests = []; + let videoBids = bids.filter(bid => (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBidValid)(bid)); + let bannerBids = bids.filter(bid => (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isBannerBidValid)(bid)); + videoBids.forEach(bid => { + pubid = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidParam)(bid, 'pubid'); + requests.push({ + method: 'POST', + url: VIDEO_ENDPOINT + pubid, + data: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.createRequestData)(bid, bidderRequest, true, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidParam, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoSizes, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidFloor), + bidRequest: bid + }); + }); + bannerBids.forEach(bid => { + pubid = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidParam)(bid, 'pubid'); + requests.push({ + method: 'POST', + url: BANNER_ENDPOINT + pubid, + data: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.createRequestData)(bid, bidderRequest, false, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidParam, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerSizes, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidFloor, BIDDER_CODE, ADAPTER_VERSION), + bidRequest: bid + }); + }); + return requests; + }, + interpretResponse(serverResponse, _ref) { + let { + bidRequest + } = _ref; + let response = serverResponse.body; + if (response !== null && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(response) === false) { + if ((0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBid)(bidRequest)) { + let bidResponse = { + requestId: response.id, + cpm: response.seatbid[0].bid[0].price, + width: response.seatbid[0].bid[0].w, + height: response.seatbid[0].bid[0].h, + ttl: response.seatbid[0].bid[0].ttl || 60, + creativeId: response.seatbid[0].bid[0].crid, + currency: response.cur, + meta: { + 'advertiserDomains': response.seatbid[0].bid[0].adomain + }, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + netRevenue: true + }; + if (response.seatbid[0].bid[0].adm) { + bidResponse.vastXml = response.seatbid[0].bid[0].adm; + bidResponse.adResponse = { + content: response.seatbid[0].bid[0].adm + }; + } else { + bidResponse.vastUrl = response.seatbid[0].bid[0].nurl; + } + return bidResponse; + } else { + return { + requestId: response.id, + bidderCode: BIDDER_CODE, + cpm: response.seatbid[0].bid[0].price, + width: response.seatbid[0].bid[0].w, + height: response.seatbid[0].bid[0].h, + ad: response.seatbid[0].bid[0].adm, + ttl: response.seatbid[0].bid[0].ttl || 60, + creativeId: response.seatbid[0].bid[0].crid, + currency: response.cur, + meta: { + 'advertiserDomains': response.seatbid[0].bid[0].adomain + }, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + netRevenue: true + }; + } + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('advangelistsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["advangUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/advangelistsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adverxoBidAdapter"],{ + +/***/ "./modules/adverxoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/adverxoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/auction.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'adverxo'; +const ALIASES = [{ + code: 'adport', + skipPbsAliasing: true +}, { + code: 'bidsmind', + skipPbsAliasing: true +}, { + code: 'mobupps', + skipPbsAliasing: true +}]; +const AUCTION_URLS = { + adverxo: 'js.pbsadverxo.com', + adport: 'diclotrans.com', + bidsmind: 'egrevirda.com', + mobupps: 'traffhb.com' +}; +const ENDPOINT_URL_AD_UNIT_PLACEHOLDER = '{AD_UNIT}'; +const ENDPOINT_URL_AUTH_PLACEHOLDER = '{AUTH}'; +const ENDPOINT_URL_HOST_PLACEHOLDER = '{HOST}'; +const ENDPOINT_URL = `https://${ENDPOINT_URL_HOST_PLACEHOLDER}/pickpbs?id=${ENDPOINT_URL_AD_UNIT_PLACEHOLDER}&auth=${ENDPOINT_URL_AUTH_PLACEHOLDER}`; +const ORTB_MTYPES = { + 1: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + 2: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + 4: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE +}; +const USYNC_TYPES = { + IFRAME: 'iframe', + REDIRECT: 'image' +}; +const DEFAULT_CURRENCY = 'USD'; +const ortbConverter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 60 + }, + request: function request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset(request, 'device.ip', 'caller'); + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset(request, 'ext.avx_add_vast_url', 1); + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'bids.0.userIdAsEids'); + if (eids && eids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(request, 'user.ext.eids', eids); + } + return request; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const floor = adverxoUtils.getBidFloor(bidRequest); + if (floor) { + imp.bidfloor = floor; + imp.bidfloorcur = DEFAULT_CURRENCY; + } + return imp; + }, + bidResponse: function (buildBidResponse, bid, context) { + bid.adm = bid.adm.replaceAll(`\${AUCTION_PRICE}`, bid.price); + if ( true && ORTB_MTYPES[bid.mtype] === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + if (typeof bid?.adm === 'string') { + bid.adm = JSON.parse(bid.adm); + } + if (bid?.adm?.native) { + bid.adm = bid.adm.native; + } + } + const result = buildBidResponse(bid, context); + if (true) { + if (bid?.ext?.avx_vast_url) { + result.vastUrl = bid.ext.avx_vast_url; + } + if (bid?.ext?.avx_video_renderer_url) { + result.avxVideoRendererUrl = bid.ext.avx_video_renderer_url; + } + } + return result; + } +}); +const userSyncUtils = { + buildUsyncParams: function (gdprConsent, uspConsent, gppConsent) { + const params = []; + if (gdprConsent) { + params.push('gdpr=' + (gdprConsent.gdprApplies ? 1 : 0)); + params.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true) { + params.push('coppa=1'); + } + if (uspConsent) { + params.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + params.push('gpp=' + encodeURIComponent(gppConsent.gppString)); + params.push('gpp_sid=' + encodeURIComponent(gppConsent?.applicableSections?.join(','))); + } + return params.length ? params.join('&') : ''; + } +}; +const videoUtils = { + createOutstreamVideoRenderer: function (bid) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bid.bidId, + url: bid.avxVideoRendererUrl, + loaded: false, + adUnitCode: bid.adUnitCode + }); + try { + renderer.setRender(this.outstreamRender.bind(this)); + } catch (err) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn('Prebid Error calling setRender on renderer', err); + } + return renderer; + }, + outstreamRender: function (bid, doc) { + bid.renderer.push(() => { + const win = doc ? doc.defaultView : window; + win.adxVideoRenderer.renderAd({ + targetId: bid.adUnitCode, + adResponse: { + content: bid.vastXml + } + }); + }); + } +}; +const adverxoUtils = { + buildAuctionUrl: function (bidderCode, host, adUnitId, adUnitAuth) { + const auctionUrl = host || AUCTION_URLS[bidderCode]; + return ENDPOINT_URL.replace(ENDPOINT_URL_HOST_PLACEHOLDER, auctionUrl).replace(ENDPOINT_URL_AD_UNIT_PLACEHOLDER, adUnitId).replace(ENDPOINT_URL_AUTH_PLACEHOLDER, adUnitAuth); + }, + groupBidRequestsByAdUnit: function (bidRequests) { + const groupedBidRequests = new Map(); + bidRequests.forEach(bidRequest => { + const adUnit = { + host: bidRequest.params.host, + id: bidRequest.params.adUnitId, + auth: bidRequest.params.auth + }; + if (!groupedBidRequests.get(adUnit)) { + groupedBidRequests.set(adUnit, []); + } + groupedBidRequests.get(adUnit).push(bidRequest); + }); + return groupedBidRequests; + }, + getBidFloor: function (bid) { + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn(bid.getFloor)) { + const floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: '*', + size: '*' + }); + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + return floor.floor; + } + } + return null; + } +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + aliases: ALIASES, + /** + * Determines whether the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject(bid.params) || !Object.keys(bid.params).length) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn('Adverxo Bid Adapter: bid params must be provided.'); + return false; + } + if (!bid.params.adUnitId || typeof bid.params.adUnitId !== 'number') { + _src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn('Adverxo Bid Adapter: adUnitId bid param is required and must be a number'); + return false; + } + if (!bid.params.auth || typeof bid.params.auth !== 'string') { + _src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn('Adverxo Bid Adapter: auth bid param is required and must be a string'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest an array of bids + * @return {ServerRequest} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const result = []; + const bidRequestsByAdUnit = adverxoUtils.groupBidRequestsByAdUnit(validBidRequests); + bidRequestsByAdUnit.forEach((adUnitBidRequests, adUnit) => { + const ortbRequest = ortbConverter.toORTB({ + bidRequests: adUnitBidRequests, + bidderRequest + }); + result.push({ + method: 'POST', + url: adverxoUtils.buildAuctionUrl(bidderRequest.bidderCode, adUnit.host, adUnit.id, adUnit.auth), + data: ortbRequest, + bids: adUnitBidRequests + }); + }); + return result; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest Adverxo bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse || !bidRequest) { + return []; + } + const bids = ortbConverter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + return bids.map(bid => { + const thisRequest = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getBidRequest(bid.requestId, [bidRequest]); + const context = _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](thisRequest, 'mediaTypes.video.context'); + if ( true && bid.mediaType === 'video' && context === 'outstream') { + bid.renderer = videoUtils.createOutstreamVideoRenderer(bid); + } + return bid; + }); + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} responses List of server's responses. + * @param {*} gdprConsent + * @param {*} uspConsent + * @param {*} gppConsent + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent, gppConsent) => { + if (!responses || responses.length === 0 || !syncOptions.pixelEnabled && !syncOptions.iframeEnabled) { + return []; + } + const privacyParams = userSyncUtils.buildUsyncParams(gdprConsent, uspConsent, gppConsent); + const syncType = syncOptions.iframeEnabled ? USYNC_TYPES.IFRAME : USYNC_TYPES.REDIRECT; + const result = []; + for (const response of responses) { + const syncUrls = response.body?.ext?.avx_usync; + if (!syncUrls || syncUrls.length === 0) { + continue; + } + for (const url of syncUrls) { + let finalUrl = url; + if (!finalUrl.includes('?')) { + finalUrl += '?'; + } else { + finalUrl += '&'; + } + finalUrl += 'type=' + syncType; + if (privacyParams.length !== 0) { + finalUrl += `&${privacyParams}`; + } + result.push({ + type: syncType, + url: finalUrl + }); + } + } + return result; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('adverxoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adverxoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adxcgAnalyticsAdapter"],{ + +/***/ "./modules/adxcgAnalyticsAdapter.js": +/*!******************************************!*\ + !*** ./modules/adxcgAnalyticsAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + + +/** + * Analytics adapter from adxcg.com + * maintainer info@adxcg.com + * updated 201911 for prebid 3.0 + */ + +const emptyUrl = ''; +const analyticsType = 'endpoint'; +const adxcgAnalyticsVersion = 'v2.01'; +var adxcgAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + emptyUrl, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT: + adxcgAnalyticsAdapter.context.events.auctionInit = mapAuctionInit(args); + adxcgAnalyticsAdapter.context.auctionTimestamp = args.timestamp; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED: + adxcgAnalyticsAdapter.context.auctionId = args.auctionId; + adxcgAnalyticsAdapter.context.events.bidRequests.push(mapBidRequested(args)); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_ADJUSTMENT: + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT: + adxcgAnalyticsAdapter.context.events.bidTimeout = args.map(item => item.bidder).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.uniques); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE: + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE: + adxcgAnalyticsAdapter.context.events.bidResponses.push(mapBidResponse(args, eventType)); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON: + let outData2 = { + bidWons: mapBidWon(args) + }; + send(outData2); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_END: + send(adxcgAnalyticsAdapter.context.events); + break; + } + } +}); +function mapAuctionInit(auctionInit) { + return { + timeout: auctionInit.timeout + }; +} +function mapBidRequested(bidRequests) { + return { + bidderCode: bidRequests.bidderCode, + time: bidRequests.start, + bids: bidRequests.bids.map(function (bid) { + return { + transactionId: bid.transactionId, + adUnitCode: bid.adUnitCode, + bidId: bid.bidId, + start: bid.startTime, + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(bid.sizes).toString(), + params: bid.params + }; + }) + }; +} +function mapBidResponse(bidResponse, eventType) { + return { + bidderCode: bidResponse.bidder, + transactionId: bidResponse.transactionId, + adUnitCode: bidResponse.adUnitCode, + statusMessage: bidResponse.statusMessage, + mediaType: bidResponse.mediaType, + renderedSize: bidResponse.size, + cpm: bidResponse.cpm, + currency: bidResponse.currency, + netRevenue: bidResponse.netRevenue, + timeToRespond: bidResponse.timeToRespond, + bidId: eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT ? bidResponse.bidId : bidResponse.requestId, + dealId: bidResponse.dealId, + status: bidResponse.status, + creativeId: bidResponse.creativeId.toString() + }; +} +function mapBidWon(bidResponse) { + return [{ + bidderCode: bidResponse.bidder, + adUnitCode: bidResponse.adUnitCode, + statusMessage: bidResponse.statusMessage, + mediaType: bidResponse.mediaType, + renderedSize: bidResponse.size, + cpm: bidResponse.cpm, + currency: bidResponse.currency, + netRevenue: bidResponse.netRevenue, + timeToRespond: bidResponse.timeToRespond, + bidId: bidResponse.requestId, + dealId: bidResponse.dealId, + status: bidResponse.status, + creativeId: bidResponse.creativeId.toString() + }]; +} +function send(data) { + let adxcgAnalyticsRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + hostname: adxcgAnalyticsAdapter.context.host, + pathname: '/pbrx/v2', + search: { + pid: adxcgAnalyticsAdapter.context.initOptions.publisherId, + aid: adxcgAnalyticsAdapter.context.auctionId, + ats: adxcgAnalyticsAdapter.context.auctionTimestamp, + aav: adxcgAnalyticsVersion, + iob: intersectionObserverAvailable(window) ? '1' : '0', + pbv: "9.45.0-pre", + sz: window.screen.width + 'x' + window.screen.height + } + }); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(adxcgAnalyticsRequestUrl, undefined, JSON.stringify(data), { + contentType: 'text/plain', + method: 'POST', + withCredentials: true + }); +} +function intersectionObserverAvailable(win) { + return win && win.IntersectionObserver && win.IntersectionObserverEntry && win.IntersectionObserverEntry.prototype && 'intersectionRatio' in win.IntersectionObserverEntry.prototype; +} +adxcgAnalyticsAdapter.context = {}; +adxcgAnalyticsAdapter.originEnableAnalytics = adxcgAnalyticsAdapter.enableAnalytics; +adxcgAnalyticsAdapter.enableAnalytics = function (config) { + if (!config.options.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('PublisherId option is not defined. Analytics won\'t work'); + return; + } + adxcgAnalyticsAdapter.context = { + events: { + bidRequests: [], + bidResponses: [] + }, + initOptions: config.options, + host: config.options.host || 'hbarxs.adxcg.net' + }; + adxcgAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: adxcgAnalyticsAdapter, + code: 'adxcg' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (adxcgAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('adxcgAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adxcgAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adxcgBidAdapter"],{ + +/***/ "./modules/adxcgBidAdapter.js": +/*!************************************!*\ + !*** ./modules/adxcgBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + +// jshint esversion: 6, es3: false, node: true + + + + + +const BIDDER_CODE = 'adxcg'; +const SECURE_BID_URL = 'https://pbc.adxcg.net/rtb/ortb/pbc?adExchangeId=1'; +const DEFAULT_CURRENCY = 'EUR'; +const KNOWN_PARAMS = ['battr', 'deals']; +const DEFAULT_TMAX = 500; + +/** + * Adxcg Bid Adapter. + * + */ +const spec = { + code: BIDDER_CODE, + aliases: ['mediaopti'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('adxcg - validating isBidRequestValid'); + const params = bid.params || {}; + const { + adzoneid + } = params; + return !!adzoneid; + }, + buildRequests: (bidRequests, bidderRequest) => { + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: SECURE_BID_URL, + data, + options: { + contentType: 'application/json' + }, + bidderRequest + }; + }, + interpretResponse: (response, request) => { + if (response.body) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + } + return []; + }, + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent) => { + const syncs = []; + let syncUrl = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('adxcg.usersyncUrl'); + let query = []; + if (syncOptions.pixelEnabled && syncUrl) { + if (gdprConsent) { + query.push('gdpr=' + (gdprConsent.gdprApplies & 1)); + query.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } + if (uspConsent) { + query.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + syncs.push({ + type: 'image', + url: syncUrl + (query.length ? '?' + query.join('&') : '') + }); + } + return syncs; + }, + onBidWon: bid => { + // for native requests we put the nurl as an imp tracker, otherwise if the auction takes place on prebid server + // the server JS adapter puts the nurl in the adm as a tracking pixel and removes the attribute + if (bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(bid.nurl, bid.originalCpm)); + } + } +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: 'EUR' + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + // tagid + imp.tagid = bidRequest.params.adzoneid.toString(); + // unknown params + const unknownParams = slotUnknownParams(bidRequest); + if (imp.ext || unknownParams) { + imp.ext = Object.assign({}, imp.ext, unknownParams); + } + // battr + if (bidRequest.params.battr) { + ['banner', 'video', 'audio', 'native'].forEach(k => { + if (imp[k]) { + imp[k].battr = bidRequest.params.battr; + } + }); + } + // deals + if (bidRequest.params.deals && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidRequest.params.deals)) { + imp.pmp = { + private_auction: 0, + deals: bidRequest.params.deals + }; + } + imp.secure = bidRequest.ortb2Imp?.secure ?? 1; + if (!imp.bidfloor && bidRequest.params.bidFloor) { + imp.bidfloor = bidRequest.params.bidFloor; + imp.bidfloorcur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidFloorCur', bidRequest.params).toUpperCase() || 'USD'; + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + request.tmax = request.tmax || DEFAULT_TMAX; + request.test = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('debug') ? 1 : 0; + request.at = 1; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'ext.prebid.channel.name', 'pbjs'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'ext.prebid.channel.version', "9.45.0-pre"); + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.cur = bid.cur || DEFAULT_CURRENCY; + return bidResponse; + } +}); + +/** + * Unknown params are captured and sent on ext + */ +function slotUnknownParams(slot) { + const ext = {}; + const knownParamsMap = {}; + KNOWN_PARAMS.forEach(value => knownParamsMap[value] = 1); + Object.keys(slot.params).forEach(key => { + if (!knownParamsMap[key]) { + ext[key] = slot.params[key]; + } + }); + return Object.keys(ext).length > 0 ? { + prebid: ext + } : null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('adxcgBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adxcgBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adxpremiumAnalyticsAdapter"],{ + +/***/ "./modules/adxpremiumAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/adxpremiumAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export testSend */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +const analyticsType = 'endpoint'; +const defaultUrl = 'https://adxpremium.services/graphql'; +let reqCountry = window.reqCountry || null; + +// Events needed +const { + AUCTION_INIT, + BID_REQUESTED, + BID_TIMEOUT, + BID_RESPONSE, + BID_WON, + AUCTION_END +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +let timeoutBased = false; +let requestSent = false; +let requestDelivered = false; +let elementIds = []; + +// Memory objects +let completeObject = { + publisher_id: null, + auction_id: null, + referer: null, + screen_resolution: window.screen.width + 'x' + window.screen.height, + device_type: null, + geo: reqCountry, + events: [] +}; + +// Upgraded object +let upgradedObject = null; +let adxpremiumAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + defaultUrl, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_INIT: + auctionInit(args); + break; + case BID_REQUESTED: + bidRequested(args); + break; + case BID_RESPONSE: + bidResponse(args); + break; + case BID_WON: + bidWon(args); + break; + case BID_TIMEOUT: + bidTimeout(args); + break; + case AUCTION_END: + auctionEnd(args); + break; + default: + break; + } + } +}); + +// DFP support +let googletag = window.googletag || {}; +googletag.cmd = googletag.cmd || []; +googletag.cmd.push(function () { + googletag.pubads().addEventListener('slotRenderEnded', args => { + clearSlot(args.slot.getSlotElementId()); + }); +}); + +// Event handlers +let bidResponsesMapper = {}; +let bidRequestsMapper = {}; +let bidMapper = {}; +function auctionInit(args) { + // Clear events + completeObject.events = []; + // Allow new requests + requestSent = false; + requestDelivered = false; + // Reset mappers + bidResponsesMapper = {}; + bidRequestsMapper = {}; + bidMapper = {}; + completeObject.auction_id = args.auctionId; + completeObject.publisher_id = adxpremiumAnalyticsAdapter.initOptions.pubId; + // TODO: is 'page' the right value here? + try { + completeObject.referer = encodeURI(args.bidderRequests[0].refererInfo.page.split('?')[0]); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('AdxPremium Analytics - ' + e.message); + } + if (args.adUnitCodes && args.adUnitCodes.length > 0) { + elementIds = args.adUnitCodes; + } + completeObject.device_type = deviceType(); +} +function bidRequested(args) { + let tmpObject = { + type: 'REQUEST', + bidder_code: args.bidderCode, + event_timestamp: args.start, + bid_gpt_codes: {} + }; + args.bids.forEach(bid => { + tmpObject.bid_gpt_codes[bid.adUnitCode] = bid.sizes; + bidMapper[bid.bidId] = bid.bidderRequestId; + }); + bidRequestsMapper[args.bidderRequestId] = completeObject.events.push(tmpObject) - 1; +} +function bidResponse(args) { + let tmpObject = { + type: 'RESPONSE', + bidder_code: args.bidderCode, + event_timestamp: args.responseTimestamp, + size: args.size, + gpt_code: args.adUnitCode, + currency: args.currency, + creative_id: args.creativeId, + time_to_respond: args.timeToRespond, + cpm: args.cpm, + is_winning: false + }; + bidResponsesMapper[args.requestId] = completeObject.events.push(tmpObject) - 1; +} +function bidWon(args) { + let eventIndex = bidResponsesMapper[args.requestId]; + if (eventIndex !== undefined) { + if (requestDelivered) { + if (completeObject.events[eventIndex]) { + // do the upgrade + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Upgrading request'); + completeObject.events[eventIndex].is_winning = true; + completeObject.events[eventIndex].is_upgrade = true; + upgradedObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(completeObject); + upgradedObject.events = [completeObject.events[eventIndex]]; + sendEvent(upgradedObject); // send upgrade + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - CANNOT FIND INDEX FOR REQUEST ' + args.requestId); + } + } else { + completeObject.events[eventIndex].is_winning = true; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Response not found, creating new one.'); + let tmpObject = { + type: 'RESPONSE', + bidder_code: args.bidderCode, + event_timestamp: args.responseTimestamp, + size: args.size, + gpt_code: args.adUnitCode, + currency: args.currency, + creative_id: args.creativeId, + time_to_respond: args.timeToRespond, + cpm: args.cpm, + is_winning: true, + is_lost: true + }; + let lostObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(completeObject); + lostObject.events = [tmpObject]; + sendEvent(lostObject); // send lost object + } +} +function bidTimeout(args) { + let timeoutObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(completeObject); + timeoutObject.events = []; + let usedRequestIds = []; + args.forEach(bid => { + let pulledRequestId = bidMapper[bid.bidId]; + let eventIndex = bidRequestsMapper[pulledRequestId]; + if (eventIndex !== undefined && completeObject.events[eventIndex] && usedRequestIds.indexOf(pulledRequestId) == -1) { + // mark as timeouted + let tempEventIndex = timeoutObject.events.push(completeObject.events[eventIndex]) - 1; + timeoutObject.events[tempEventIndex]['type'] = 'TIMEOUT'; + usedRequestIds.push(pulledRequestId); // mark as used + } + }); + if (timeoutObject.events.length > 0) { + sendEvent(timeoutObject); // send timeouted + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Sending timeouted requests'); + } +} +function auctionEnd(args) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Auction Ended at ' + Date.now()); + if (timeoutBased) { + setTimeout(function () { + requestSent = true; + sendEvent(completeObject); + }, 3500); + } else { + sendEventFallback(); + } +} + +// Methods +function deviceType() { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) { + return 'tablet'; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) { + return 'mobile'; + } + return 'desktop'; +} +function clearSlot(elementId) { + if ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(elementIds, elementId)) { + elementIds.splice(elementIds.indexOf(elementId), 1); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Done with: ' + elementId); + } + if (elementIds.length == 0 && !requestSent && !timeoutBased) { + requestSent = true; + sendEvent(completeObject); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Everything ready'); + } +} +function testSend() { + sendEvent(completeObject); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Sending without any conditions, used for testing'); +} +function sendEventFallback() { + setTimeout(function () { + if (!requestSent) { + requestSent = true; + sendEvent(completeObject); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Sending event using fallback method.'); + } + }, 2000); +} +function sendEvent(completeObject) { + if (!adxpremiumAnalyticsAdapter.enabled) return; + requestDelivered = true; + try { + let responseEvents = btoa(JSON.stringify(completeObject)); + let mutation = `mutation {createEvent(input: {event: {eventData: "${responseEvents}"}}) {event {createTime } } }`; + let dataToSend = JSON.stringify({ + query: mutation + }); + let ajaxEndpoint = defaultUrl; + if (adxpremiumAnalyticsAdapter.initOptions.sid) { + ajaxEndpoint = 'https://' + adxpremiumAnalyticsAdapter.initOptions.sid + '.adxpremium.services/graphql'; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(ajaxEndpoint, function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('AdxPremium Analytics - Sending complete events at ' + Date.now()); + }, dataToSend, { + contentType: 'application/json', + method: 'POST' + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('AdxPremium Analytics - Sending event error: ' + err); + } +} + +// save the base class function +adxpremiumAnalyticsAdapter.originEnableAnalytics = adxpremiumAnalyticsAdapter.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +adxpremiumAnalyticsAdapter.enableAnalytics = function (config) { + adxpremiumAnalyticsAdapter.initOptions = config.options; + if (!config.options.pubId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('AdxPremium Analytics - Publisher ID (pubId) option is not defined. Analytics won\'t work'); + return; + } + adxpremiumAnalyticsAdapter.originEnableAnalytics(config); // call the base class function +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: adxpremiumAnalyticsAdapter, + code: 'adxpremium' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (adxpremiumAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('adxpremiumAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adxpremiumAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["adyoulikeBidAdapter"],{ + +/***/ "./modules/adyoulikeBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/adyoulikeBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const VERSION = '1.0'; +const BIDDER_CODE = 'adyoulike'; +const DEFAULT_DC = 'hb-api'; +const CURRENCY = 'USD'; +const GVLID = 259; +const NATIVE_IMAGE = { + image: { + required: true + }, + title: { + required: true + }, + sponsoredBy: { + required: true + }, + clickUrl: { + required: true + }, + body: { + required: false + }, + icon: { + required: false + }, + cta: { + required: false + } +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + aliases: ['ayl'], + // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + const sizes = getSize(getSizeArray(bid)); + const sizeValid = sizes.width > 0 && sizes.height > 0; + + // allows no size for native only + return bid.params && bid.params.placement && (sizeValid || bid.mediaTypes && bid.mediaTypes.native); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest} bidRequests is an array of AdUnits and bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(bidRequests); + let hasVideo = false; + let eids; + const payload = { + Version: VERSION, + Bids: bidRequests.reduce((accumulator, bidReq) => { + let mediatype = getMediatype(bidReq); + let sizesArray = getSizeArray(bidReq); + let size = getSize(sizesArray); + accumulator[bidReq.bidId] = {}; + accumulator[bidReq.bidId].PlacementID = bidReq.params.placement; + accumulator[bidReq.bidId].TransactionID = bidReq.ortb2Imp?.ext?.tid; + accumulator[bidReq.bidId].Width = size.width; + accumulator[bidReq.bidId].Height = size.height; + accumulator[bidReq.bidId].AvailableSizes = sizesArray.join(','); + if (typeof bidReq.getFloor === 'function') { + accumulator[bidReq.bidId].Pricing = getFloor(bidReq, size, mediatype); + } + if (bidReq.schain) { + accumulator[bidReq.bidId].SChain = bidReq.schain; + } + if (!eids && bidReq.userIdAsEids && bidReq.userIdAsEids.length) { + eids = bidReq.userIdAsEids; + } + if (mediatype === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + let nativeReq = bidReq.mediaTypes.native; + if (nativeReq.type === 'image') { + nativeReq = Object.assign({}, NATIVE_IMAGE, nativeReq); + } + // click url is always mandatory even if not specified by publisher + nativeReq.clickUrl = { + required: true + }; + accumulator[bidReq.bidId].Native = nativeReq; + } + if (mediatype === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + hasVideo = true; + accumulator[bidReq.bidId].Video = bidReq.mediaTypes.video; + const size = bidReq.mediaTypes.video.playerSize; + if (Array.isArray(size) && !Array.isArray(size[0])) { + accumulator[bidReq.bidId].Video.playerSize = [size]; + } + } + return accumulator; + }, {}), + PageRefreshed: getPageRefreshed() + }; + if (bidderRequest.gdprConsent) { + payload.gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + consentRequired: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : null + }; + } + if (bidderRequest.uspConsent) { + payload.uspConsent = bidderRequest.uspConsent; + } + if (bidderRequest.ortb2) { + payload.ortb2 = bidderRequest.ortb2; + } + if (eids) { + payload.eids = eids; + } + payload.pbjs_version = "9.45.0-pre"; + const data = JSON.stringify(payload); + const options = { + withCredentials: true + }; + return { + method: 'POST', + url: createEndpoint(bidRequests, bidderRequest, hasVideo), + data, + options + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + var bidRequests = {}; + if (!serverResponse || !serverResponse.body) { + return bidResponses; + } + try { + bidRequests = JSON.parse(request.data).Bids; + } catch (err) { + // json error initial request can't be read + } + + // For this adapter, serverResponse is a list + serverResponse.body.forEach(response => { + const bid = createBid(response, bidRequests); + if (bid) { + bidResponses.push(bid); + } + }); + return bidResponses; + }, + /** + * List user sync endpoints. + * Legal information have to be added to the request. + * Only iframe syncs are supported. + * + * @param {*} syncOptions Publisher prebid configuration. + * @param {*} serverResponses A successful response from the server. + * @return {UserSync[]} An array of syncs that should be executed. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + if (!syncOptions.iframeEnabled) { + return []; + } + let params = ''; + + // GDPR + if (gdprConsent) { + params += '&gdpr=' + (gdprConsent.gdprApplies ? 1 : 0); + params += '&gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || ''); + } + + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + params += '&coppa=1'; + } + + // CCPA + if (uspConsent) { + params += '&us_privacy=' + encodeURIComponent(uspConsent); + } + + // GPP + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + params += '&gpp=' + encodeURIComponent(gppConsent.gppString); + params += '&gpp_sid=' + encodeURIComponent(gppConsent?.applicableSections?.join(',')); + } + return [{ + type: 'iframe', + url: `https://visitor.omnitagjs.com/visitor/isync?uid=19340f4f097d16f41f34fc0274981ca4${params}` + }]; + } +}; + +/* Get hostname from bids */ +function getHostname(bidderRequest) { + let dcHostname = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidderRequest, bid => bid.params.DC); + if (dcHostname) { + return '-' + dcHostname.params.DC; + } + return ''; +} + +/* Get mediatype from bidRequest */ +function getMediatype(bidRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.banner')) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video')) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.native')) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } +} + +/* Get Floor price information */ +function getFloor(bidRequest, size, mediaType) { + const bidFloors = bidRequest.getFloor({ + currency: CURRENCY, + mediaType, + size: [size.width, size.height] + }); + if (!isNaN(bidFloors?.floor) && bidFloors?.currency === CURRENCY) { + return bidFloors.floor; + } +} + +/* Get information on page refresh */ +function getPageRefreshed() { + try { + if (performance && performance.navigation) { + return performance.navigation.type === performance.navigation.TYPE_RELOAD; + } + } catch (e) {} + return false; +} + +/* Create endpoint url */ +function createEndpoint(bidRequests, bidderRequest, hasVideo) { + let host = getHostname(bidRequests); + const endpoint = hasVideo ? '/hb-api/prebid-video/v1' : '/hb-api/prebid/v1'; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.buildUrl)({ + protocol: 'https', + host: `${DEFAULT_DC}${host}.omnitagjs.com`, + pathname: endpoint, + search: createEndpointQS(bidderRequest) + }); +} + +/* Create endpoint query string */ +function createEndpointQS(bidderRequest) { + const qs = {}; + if (bidderRequest) { + const ref = bidderRequest.refererInfo; + if (ref) { + if (ref.location) { + // RefererUrl will be removed in a future version. + qs.RefererUrl = encodeURIComponent(ref.location); + if (!ref.reachedTop) { + qs.SafeFrame = true; + } + } + qs.PageUrl = encodeURIComponent(ref.topmostLocation); + qs.PageReferrer = encodeURIComponent(ref.location); + } + + // retreive info from ortb2 object if present (prebid7) + const siteInfo = bidderRequest.ortb2?.site; + if (siteInfo) { + qs.PageUrl = encodeURIComponent(siteInfo.page || ref?.topmostLocation); + qs.PageReferrer = encodeURIComponent(siteInfo.ref || ref?.location); + } + } + const can = bidderRequest?.refererInfo?.canonicalUrl; + if (can) { + qs.CanonicalUrl = encodeURIComponent(can); + } + return qs; +} +function getSizeArray(bid) { + let inputSize = bid.sizes || []; + if (bid.mediaTypes && bid.mediaTypes.banner) { + inputSize = bid.mediaTypes.banner.sizes || []; + } + + // handle size in bid.params in formats: [w, h] and [[w,h]]. + if (bid.params && Array.isArray(bid.params.size)) { + inputSize = bid.params.size; + if (!Array.isArray(inputSize[0])) { + inputSize = [inputSize]; + } + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.parseSizesInput)(inputSize); +} + +/* Get parsed size from request size */ +function getSize(sizesArray) { + const parsed = {}; + // the main requested size is the first one + const size = sizesArray[0]; + if (typeof size !== 'string') { + return parsed; + } + const parsedSize = size.toUpperCase().split('X'); + const width = parseInt(parsedSize[0], 10); + if (width) { + parsed.width = width; + } + const height = parseInt(parsedSize[1], 10); + if (height) { + parsed.height = height; + } + return parsed; +} +function getInternalImgUrl(uid) { + if (!uid) return ''; + return 'https://blobs.omnitagjs.com/blobs/' + uid.substr(16, 2) + '/' + uid.substr(16) + '/' + uid; +} +function getImageUrl(config, resource, width, height) { + let url = ''; + if (resource && resource.Kind) { + switch (resource.Kind) { + case 'INTERNAL': + url = getInternalImgUrl(resource.Data.Internal.BlobReference.Uid); + break; + case 'EXTERNAL': + const dynPrefix = config.DynamicPrefix; + let extUrl = resource.Data.External.Url; + extUrl = extUrl.replace(/\[height\]/i, '' + height); + extUrl = extUrl.replace(/\[width\]/i, '' + width); + if (extUrl.indexOf(dynPrefix) >= 0) { + const urlmatch = /.*url=([^&]*)/gm.exec(extUrl); + url = urlmatch ? urlmatch[1] : ''; + if (!url) { + url = getInternalImgUrl(/.*key=([^&]*)/gm.exec(extUrl)[1]); + } + } else { + url = extUrl; + } + break; + } + } + return url; +} +function getTrackers(eventsArray, jsTrackers) { + const result = []; + if (!eventsArray) return result; + eventsArray.map((item, index) => { + if (jsTrackers && item.Kind === 'JAVASCRIPT_URL' || !jsTrackers && item.Kind === 'PIXEL_URL') { + result.push(item.Url); + } + }); + return result; +} +function getNativeAssets(response, nativeConfig) { + if (typeof response.Native === 'object') { + return response.Native; + } + const native = {}; + var adJson = {}; + var textsJson = {}; + if (typeof response.Ad === 'string') { + adJson = JSON.parse(response.Ad.match(/\/\*PREBID\*\/(.*)\/\*PREBID\*\//)[1]); + textsJson = adJson.Content.Preview.Text; + var impressionUrl = adJson.TrackingPrefix + '/pixel?event_kind=IMPRESSION&attempt=' + adJson.Attempt; + var insertionUrl = adJson.TrackingPrefix + '/pixel?event_kind=INSERTION&attempt=' + adJson.Attempt; + if (adJson.Campaign) { + impressionUrl += '&campaign=' + adJson.Campaign; + insertionUrl += '&campaign=' + adJson.Campaign; + } + native.clickUrl = adJson.TrackingPrefix + '/ar?event_kind=CLICK&attempt=' + adJson.Attempt + '&campaign=' + adJson.Campaign + '&url=' + encodeURIComponent(adJson.Content.Landing.Url); + if (adJson.OnEvents) { + native.clickTrackers = getTrackers(adJson.OnEvents['CLICK']); + native.impressionTrackers = getTrackers(adJson.OnEvents['IMPRESSION']); + native.javascriptTrackers = getTrackers(adJson.OnEvents['IMPRESSION'], true); + } else { + native.impressionTrackers = []; + } + native.impressionTrackers.push(impressionUrl, insertionUrl); + } + Object.keys(nativeConfig).map(function (key, index) { + switch (key) { + case 'title': + native[key] = textsJson.TITLE; + break; + case 'body': + native[key] = textsJson.DESCRIPTION; + break; + case 'cta': + native[key] = textsJson.CALLTOACTION; + break; + case 'sponsoredBy': + native[key] = adJson.Content.Preview.Sponsor.Name; + break; + case 'image': + // main image requested size + const imgSize = nativeConfig.image.sizes || []; + if (!imgSize.length) { + imgSize[0] = response.Width || 300; + imgSize[1] = response.Height || 250; + } + const url = getImageUrl(adJson, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(adJson, 'Content.Preview.Thumbnail.Image'), imgSize[0], imgSize[1]); + if (url) { + native[key] = { + url, + width: imgSize[0], + height: imgSize[1] + }; + } + break; + case 'icon': + // icon requested size + const iconSize = nativeConfig.icon.sizes || []; + if (!iconSize.length) { + iconSize[0] = 50; + iconSize[1] = 50; + } + const icurl = getImageUrl(adJson, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(adJson, 'Content.Preview.Sponsor.Logo.Resource'), iconSize[0], iconSize[1]); + if (icurl) { + native[key] = { + url: icurl, + width: iconSize[0], + height: iconSize[1] + }; + } + break; + case 'privacyIcon': + native[key] = getImageUrl(adJson, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(adJson, 'Content.Preview.Credit.Logo.Resource'), 25, 25); + break; + case 'privacyLink': + native[key] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(adJson, 'Content.Preview.Credit.Url'); + break; + } + }); + return native; +} + +/* Create bid from response */ +function createBid(response, bidRequests) { + if (!response || !response.Ad && !response.Native && !response.Vast) { + return; + } + const request = bidRequests && bidRequests[response.BidID]; + + // In case we don't retreive the size from the adserver, use the given one. + if (request) { + if (!response.Width || response.Width === '0') { + response.Width = request.Width; + } + if (!response.Height || response.Height === '0') { + response.Height = request.Height; + } + } + const bid = { + requestId: response.BidID, + ttl: 3600, + creativeId: response.CreativeID, + cpm: response.Price, + netRevenue: true, + currency: CURRENCY, + meta: response.Meta || { + advertiserDomains: [] + } + }; + + // retreive video response if present + const vast64 = response.Vast; + if (vast64) { + bid.width = response.Width; + bid.height = response.Height; + bid.vastXml = window.atob(vast64); + bid.mediaType = 'video'; + } else if (request.Native) { + // format Native response if Native was requested + bid.native = getNativeAssets(response, request.Native); + bid.mediaType = 'native'; + } else { + bid.width = response.Width; + bid.height = response.Height; + bid.ad = response.Ad; + } + return bid; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('adyoulikeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/adyoulikeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["afpBidAdapter"],{ + +/***/ "./modules/afpBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/afpBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports IS_DEV, BIDDER_CODE, SSP_ENDPOINT, REQUEST_METHOD, TEST_PAGE_URL, IN_IMAGE_BANNER_TYPE, IN_IMAGE_MAX_BANNER_TYPE, IN_CONTENT_BANNER_TYPE, IN_CONTENT_VIDEO_TYPE, OUT_CONTENT_VIDEO_TYPE, IN_CONTENT_STORY_TYPE, ACTION_SCROLLER_TYPE, ACTION_SCROLLER_LIGHT_TYPE, JUST_BANNER_TYPE, mediaTypeByPlaceType, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const IS_DEV = location.hostname === 'localhost'; +const BIDDER_CODE = 'afp'; +const SSP_ENDPOINT = 'https://ssp.afp.ai/api/prebid'; +const REQUEST_METHOD = 'POST'; +// TODO: test code should be kept in tests +const TEST_PAGE_URL = 'https://rtbinsight.ru/smiert-bolshikh-dannykh-kto-na-novienkogo/'; +const SDK_PATH = 'https://cdn.afp.ai/ssp/sdk.js?auto_initialization=false&deploy_to_parent_window=true'; +const TTL = 60; +const IN_IMAGE_BANNER_TYPE = 'In-image'; +const IN_IMAGE_MAX_BANNER_TYPE = 'In-image Max'; +const IN_CONTENT_BANNER_TYPE = 'In-content Banner'; +const IN_CONTENT_VIDEO_TYPE = 'In-content Video'; +const OUT_CONTENT_VIDEO_TYPE = 'Out-content Video'; +const IN_CONTENT_STORY_TYPE = 'In-content Stories'; +const ACTION_SCROLLER_TYPE = 'Action Scroller'; +const ACTION_SCROLLER_LIGHT_TYPE = 'Action Scroller Light'; +const JUST_BANNER_TYPE = 'Just Banner'; +const mediaTypeByPlaceType = { + [IN_IMAGE_BANNER_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [IN_IMAGE_MAX_BANNER_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [IN_CONTENT_BANNER_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [IN_CONTENT_STORY_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [ACTION_SCROLLER_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [ACTION_SCROLLER_LIGHT_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [JUST_BANNER_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + [IN_CONTENT_VIDEO_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + [OUT_CONTENT_VIDEO_TYPE]: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO +}; +const wrapAd = dataToCreatePlace => { + return ` + + + + + + + + + + `; +}; +const bidRequestMap = {}; +const createRenderer = (bid, dataToCreatePlace) => { + const renderer = new _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__.Renderer({ + targetId: bid.adUnitCode, + url: SDK_PATH, + callback() { + renderer.loaded = true; + window.afp.createPlaceByData(dataToCreatePlace); + } + }); + return renderer; +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid(_ref) { + let { + mediaTypes, + params + } = _ref; + if (typeof params !== 'object' || typeof mediaTypes !== 'object') { + return false; + } + const { + placeId, + placeType, + imageUrl, + imageWidth, + imageHeight + } = params; + const media = mediaTypes[mediaTypeByPlaceType[placeType]]; + if (placeId && media) { + if (mediaTypeByPlaceType[placeType] === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + if (!media.playerSize) { + return false; + } + } else if (mediaTypeByPlaceType[placeType] === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + if (!media.sizes) { + return false; + } + } + if ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)([IN_IMAGE_BANNER_TYPE, IN_IMAGE_MAX_BANNER_TYPE], placeType)) { + if (imageUrl && imageWidth && imageHeight) { + return true; + } + } else { + return true; + } + } + return false; + }, + buildRequests(validBidRequests, _ref2) { + let { + refererInfo, + gdprConsent + } = _ref2; + const payload = { + pageUrl: IS_DEV ? TEST_PAGE_URL : refererInfo.page, + gdprConsent: gdprConsent, + bidRequests: validBidRequests.map(validBidRequest => { + const { + bidId, + ortb2Imp, + sizes, + params: { + placeId, + placeType, + imageUrl, + imageWidth, + imageHeight + } + } = validBidRequest; + bidRequestMap[bidId] = validBidRequest; + const bidRequest = { + bidId, + transactionId: ortb2Imp?.ext?.tid, + sizes, + placeId + }; + if ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)([IN_IMAGE_BANNER_TYPE, IN_IMAGE_MAX_BANNER_TYPE], placeType)) { + Object.assign(bidRequest, { + imageUrl, + imageWidth: Math.floor(imageWidth), + imageHeight: Math.floor(imageHeight) + }); + } + return bidRequest; + }) + }; + return { + method: REQUEST_METHOD, + url: SSP_ENDPOINT, + data: payload, + options: { + contentType: 'application/json' + } + }; + }, + interpretResponse(serverResponse) { + let bids = serverResponse.body && serverResponse.body.bids; + bids = Array.isArray(bids) ? bids : []; + return bids.map((_ref3, index) => { + let { + bidId, + cpm, + width, + height, + creativeId, + currency, + netRevenue, + adSettings, + placeSettings + } = _ref3; + const bid = { + requestId: bidId, + cpm, + width, + height, + creativeId, + currency, + netRevenue, + meta: { + mediaType: mediaTypeByPlaceType[placeSettings.placeType] + }, + ttl: TTL + }; + const bidRequest = bidRequestMap[bidId]; + const placeContainer = bidRequest.params.placeContainer; + const dataToCreatePlace = { + adSettings, + placeSettings, + placeContainer, + isPrebid: true + }; + if (mediaTypeByPlaceType[placeSettings.placeType] === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + bid.ad = wrapAd(dataToCreatePlace); + } else if (mediaTypeByPlaceType[placeSettings.placeType] === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bid.vastXml = adSettings.content; + bid.renderer = createRenderer(bid, dataToCreatePlace); + } + return bid; + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('afpBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/afpBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["agmaAnalyticsAdapter"],{ + +/***/ "./modules/agmaAnalyticsAdapter.js": +/*!*****************************************!*\ + !*** ./modules/agmaAnalyticsAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getOrtb2Data, getTiming, getPayload */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + + +const GVLID = 1122; +const ModuleCode = 'agma'; +const analyticsType = 'endpoint'; +const scriptVersion = '1.9.0'; +const batchDelayInMs = 1000; +const agmaURL = 'https://pbc.agma-analytics.de/v1'; +const pageViewId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + +// Helper functions +const getScreen = () => { + try { + const { + width: x, + height: y + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_1__.getViewportSize)(); + return { + x, + y + }; + } catch (e) { + return { + x: 0, + y: 0 + }; + } +}; +const getUserIDs = () => { + try { + return (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().getUserIdsAsEids(); + } catch (e) {} + return []; +}; +const getOrtb2Data = function () { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + try { + const configData = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(); + const win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSelf)(); + return { + site: win.agma?.ortb2?.site ?? options.ortb2?.site ?? configData.ortb2?.site, + user: win.agma?.ortb2?.user ?? options.ortb2?.user ?? configData.ortb2?.user + }; + } catch (e) { + return {}; + } +}; +const getTiming = () => { + // Timing API V2 + let ttfb = 0; + try { + const entry = performance.getEntriesByType('navigation')[0]; + ttfb = Math.round(entry.responseStart - entry.startTime); + } catch (e) { + // Timing API V1 + try { + const entry = performance.timing; + ttfb = Math.round(entry.responseStart - entry.fetchStart); + } catch (e) { + // Timing API not available + return null; + } + } + const elapsedTime = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getPerformanceNow)(); + ttfb = ttfb >= 0 && ttfb <= elapsedTime ? ttfb : 0; + return { + ttfb, + elapsedTime + }; +}; +const getPayload = (auctionIds, options) => { + if (!options || !auctionIds || auctionIds.length === 0) { + return false; + } + const consentData = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.gdprDataHandler.getConsentData(); + let gdprApplies = true; // we assume gdpr applies + let useExtendedPayload = false; + if (consentData) { + gdprApplies = consentData.gdprApplies; + const consents = consentData.vendorData?.vendor?.consents || {}; + useExtendedPayload = consents[GVLID]; + } + const ortb2 = getOrtb2Data(options); + const ri = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)() || {}; + let payload = { + auctionIds: auctionIds, + triggerEvent: options.triggerEvent, + pageViewId, + domain: ri.domain, + gdprApplies, + code: options.code, + ortb2: { + site: ortb2.site + }, + pageUrl: ri.page, + prebidVersion: "9.45.0-pre", + scriptVersion, + debug: options.debug, + timing: getTiming() + }; + if (useExtendedPayload) { + const device = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('device') || {}; + const { + x, + y + } = getScreen(); + const userIdsAsEids = getUserIDs(); + payload = { + ...payload, + ortb2, + extended: true, + timestamp: Date.now(), + gdprConsentString: consentData.consentString, + timezoneOffset: new Date().getTimezoneOffset(), + language: window.navigator.language, + referrer: ri.topmostLocation, + pageUrl: ri.page, + screenWidth: x, + screenHeight: y, + deviceWidth: device.w || screen.width, + deviceHeight: device.h || screen.height, + userIdsAsEids + }; + } + return payload; +}; +const agmaAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_6__["default"])({ + analyticsType +}), { + auctionIds: [], + timer: null, + track(data) { + const { + eventType, + args + } = data; + if (eventType === this.options.triggerEvent && args && args.auctionId) { + this.auctionIds.push(args.auctionId); + if (this.timer === null) { + this.timer = setTimeout(() => { + this.processBatch(); + }, batchDelayInMs); + } + } + }, + processBatch() { + const currentBatch = [...this.auctionIds]; + const payload = getPayload(currentBatch, this.options); + this.auctionIds = []; + if (this.timer) { + clearTimeout(this.timer); + this.timer = null; + } + this.send(payload); + }, + send(payload) { + if (!payload) { + return; + } + return (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(agmaURL, () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(ModuleCode, 'flushed', payload); + }, JSON.stringify(payload), { + contentType: 'text/plain', + method: 'POST' + }); + } +}); +agmaAnalytics.originEnableAnalytics = agmaAnalytics.enableAnalytics; +agmaAnalytics.enableAnalytics = function () { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const { + options + } = config; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(options)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(ModuleCode, 'Please set options'); + return false; + } + if (options.site && !options.code) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(ModuleCode, 'Please set `code` - `site` is deprecated'); + options.code = options.site; + } + if (!options.code || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(options.code)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(ModuleCode, 'Please set `code` option - agma Analytics is disabled'); + return false; + } + agmaAnalytics.options = { + triggerEvent: _src_constants_js__WEBPACK_IMPORTED_MODULE_8__.EVENTS.AUCTION_INIT, + ...options + }; + agmaAnalytics.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_9__["default"].registerAnalyticsAdapter({ + adapter: agmaAnalytics, + code: ModuleCode, + gvlid: GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (agmaAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('agmaAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/agmaAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["aidemBidAdapter"],{ + +/***/ "./modules/aidemBidAdapter.js": +/*!************************************!*\ + !*** ./modules/aidemBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ERROR_CODES, setEndPoints, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + + +const BIDDER_CODE = 'aidem'; +const BASE_URL = 'https://zero.aidemsrv.com'; +const LOCAL_BASE_URL = 'http://127.0.0.1:8787'; +const GVLID = 1218; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const REQUIRED_VIDEO_PARAMS = ['mimes', 'protocols', 'context']; +const ERROR_CODES = { + BID_SIZE_INVALID_FORMAT: 1, + BID_SIZE_NOT_INCLUDED: 2, + PROPERTY_NOT_INCLUDED: 3, + SITE_ID_INVALID_VALUE: 4, + MEDIA_TYPE_NOT_SUPPORTED: 5, + PUBLISHER_ID_INVALID_VALUE: 6, + INVALID_RATELIMIT: 7, + PLACEMENT_ID_INVALID_VALUE: 8 +}; +const endpoints = { + request: `${BASE_URL}/prebidjs/ortb/v2.6/bid/request` + // notice: { + // win: `${BASE_URL}/notice/win`, + // timeout: `${BASE_URL}/notice/timeout`, + // error: `${BASE_URL}/notice/error`, + // } +}; +function setEndPoints() { + let env = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + switch (env) { + case 'local': + endpoints.request = `${LOCAL_BASE_URL}${path}/prebidjs/ortb/v2.6/bid/request`; + break; + case 'main': + endpoints.request = `${BASE_URL}${path}/prebidjs/ortb/v2.6/bid/request`; + break; + } + return endpoints; +} +_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('aidem', function (config) { + if (config.aidem.env) { + setEndPoints(config.aidem.env, config.aidem.path); + } +}); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + request(buildRequest, imps, bidderRequest, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Building request'); + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'at', 1); + setPrebidRequestEnvironment(request); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'regs', getRegs(bidderRequest)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'site.publisher.id', bidderRequest.bids[0].params.publisherId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'site.id', bidderRequest.bids[0].params.siteId); + return request; + }, + imp(buildImp, bidRequest, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Building imp bidRequest', bidRequest); + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'tagId', bidRequest.params.placementId); + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const { + bidRequest + } = context; + const bidResponse = buildBidResponse(bid, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Building bidResponse'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('bid', bid); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('bidRequest', bidRequest); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('bidResponse', bidResponse); + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bidResponse, 'vastUrl', bid.adm); + } + return bidResponse; + } +}); + +// AIDEM Custom FN +function recur(obj) { + var result = {}; + var _tmp; + for (var i in obj) { + // enabledPlugin is too nested, also skip functions + if (!(i === 'enabledPlugin' || typeof obj[i] === 'function')) { + if (typeof obj[i] === 'object' && obj[i] !== null) { + // get props recursively + _tmp = recur(obj[i]); + // if object is not {} + if (Object.keys(_tmp).length) { + result[i] = _tmp; + } + } else { + // string, number or boolean + result[i] = obj[i]; + } + } + } + return result; +} +function getRegs(bidderRequest) { + let regs = {}; + const euConsentManagement = bidderRequest.gdprConsent; + const usConsentManagement = bidderRequest.uspConsent; + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('coppa'); + if (euConsentManagement && euConsentManagement.consentString) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'gdpr_applies', !!euConsentManagement.consentString); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'gdpr_applies', false); + } + if (usConsentManagement) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'usp_applies', true); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'us_privacy', bidderRequest.uspConsent); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'usp_applies', false); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isBoolean)(coppa)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'coppa_applies', !!coppa); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'coppa_applies', false); + } + return regs; +} +function setPrebidRequestEnvironment(payload) { + const __navigator = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(recur(navigator)); + delete __navigator.plugins; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.ri', (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)()); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.hl', window.history.length); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.nav', __navigator); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.inp.euc', window.encodeURIComponent.name === 'encodeURIComponent' && typeof window.encodeURIComponent.prototype === 'undefined'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.inp.eu', window.encodeURI.name === 'encodeURI' && typeof window.encodeURI.prototype === 'undefined'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.inp.js', window.JSON.stringify.name === 'stringify' && typeof window.JSON.stringify.prototype === 'undefined'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.inp.jp', window.JSON.parse.name === 'parse' && typeof window.JSON.parse.prototype === 'undefined'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.inp.ofe', window.Object.fromEntries.name === 'fromEntries' && typeof window.Object.fromEntries.prototype === 'undefined'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.inp.oa', window.Object.assign.name === 'assign' && typeof window.Object.assign.prototype === 'undefined'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.wpar.innerWidth', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)().innerWidth); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'environment.wpar.innerHeight', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)().innerHeight); +} +function hasValidMediaType(bidRequest) { + const supported = hasBannerMediaType(bidRequest) || hasVideoMediaType(bidRequest); + if (!supported) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('AIDEM Bid Adapter: media type not supported', { + bidder: BIDDER_CODE, + code: ERROR_CODES.MEDIA_TYPE_NOT_SUPPORTED + }); + } + return supported; +} +function hasBannerMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.banner'); +} +function hasVideoMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.video'); +} +function hasValidBannerMediaType(bidRequest) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.banner.sizes'); + if (!sizes) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('AIDEM Bid Adapter: media type sizes missing', { + bidder: BIDDER_CODE, + code: ERROR_CODES.PROPERTY_NOT_INCLUDED + }); + return false; + } + return true; +} +function hasValidVideoMediaType(bidRequest) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.video.playerSize'); + if (!sizes) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('AIDEM Bid Adapter: media type playerSize missing', { + bidder: BIDDER_CODE, + code: ERROR_CODES.PROPERTY_NOT_INCLUDED + }); + return false; + } + return true; +} +function hasValidVideoParameters(bidRequest) { + let valid = true; + const adUnitsParameters = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.video'); + const bidderParameter = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.video'); + for (let property of REQUIRED_VIDEO_PARAMS) { + const hasAdUnitParameter = adUnitsParameters.hasOwnProperty(property); + const hasBidderParameter = bidderParameter && bidderParameter.hasOwnProperty(property); + if (!hasAdUnitParameter && !hasBidderParameter) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`AIDEM Bid Adapter: ${property} is not included in either the adunit or params level`, { + bidder: BIDDER_CODE, + code: ERROR_CODES.PROPERTY_NOT_INCLUDED + }); + valid = false; + } + } + return valid; +} +function passesRateLimit(bidRequest) { + const rateLimit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.rateLimit', 1); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(rateLimit) || rateLimit > 1 || rateLimit < 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('AIDEM Bid Adapter: invalid rateLimit (must be a number between 0 and 1)', { + bidder: BIDDER_CODE, + code: ERROR_CODES.INVALID_RATELIMIT + }); + return false; + } + if (rateLimit !== 1) { + const randomRateValue = Math.random(); + if (randomRateValue > rateLimit) { + return false; + } + } + return true; +} +function hasValidParameters(bidRequest) { + // Assigned from AIDEM to a publisher website + const siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.siteId'); + const publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.publisherId'); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(siteId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('AIDEM Bid Adapter: siteId must valid string', { + bidder: BIDDER_CODE, + code: ERROR_CODES.SITE_ID_INVALID_VALUE + }); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(publisherId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('AIDEM Bid Adapter: publisherId must valid string', { + bidder: BIDDER_CODE, + code: ERROR_CODES.PUBLISHER_ID_INVALID_VALUE + }); + return false; + } + return true; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('bid: ', bidRequest); + + // check if request has valid mediaTypes + if (!hasValidMediaType(bidRequest)) return false; + + // check if request has valid media type parameters at adUnit level + if (hasBannerMediaType(bidRequest) && !hasValidBannerMediaType(bidRequest)) { + return false; + } + if (hasVideoMediaType(bidRequest) && !hasValidVideoMediaType(bidRequest)) { + return false; + } + if (hasVideoMediaType(bidRequest) && !hasValidVideoParameters(bidRequest)) { + return false; + } + if (!hasValidParameters(bidRequest)) { + return false; + } + return passesRateLimit(bidRequest); + }, + buildRequests: function (bidRequests, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('bidRequests: ', bidRequests); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('bidderRequest: ', bidderRequest); + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('request payload', data); + return { + method: 'POST', + url: endpoints.request, + data, + options: { + withCredentials: true + } + }; + }, + interpretResponse: function (serverResponse, request) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('serverResponse body: ', serverResponse.body); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('request data: ', request.data); + const ortbBids = converter.fromORTB({ + response: serverResponse.body, + request: request.data + }).bids; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('ortbBids: ', ortbBids); + return ortbBids; + }, + onBidWon: function (bid) { + // Bidder specific code + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('onBidWon bid: ', bid); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(bid.burl); + } + + // onBidderError: function({ bidderRequest }) { + // const notice = buildErrorNotice(bidderRequest); + // ajax(endpoints.notice.error, null, JSON.stringify(notice), { method: 'POST', withCredentials: true }); + // }, +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('aidemBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/aidemBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["airgridRtdProvider"],{ + +/***/ "./modules/airgridRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/airgridRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports AG_AUDIENCE_IDS_KEY, storage, attachScriptTagToDOM, getMatchedAudiencesFromStorage, setAudiencesAsBidderOrtb2, passAudiencesToBidders, airgridSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the AirGrid provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time audience data from AirGrid + * @module modules/airgridRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'airgrid'; +const MIQ_TCF_ID = 101; +const AG_AUDIENCE_IDS_KEY = 'edkt_matched_audience_ids'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +function getModuleUrl(accountId) { + const path = accountId ?? 'sdk'; + return `https://cdn.edkt.io/${path}/edgekit.min.js`; +} + +/** + * Attach script tag to DOM + * @param {Object} rtdConfig + * @return {void} + */ +function attachScriptTagToDOM(rtdConfig) { + var edktInitializor = window.edktInitializor = window.edktInitializor || {}; + if (!edktInitializor.invoked) { + edktInitializor.accountId = rtdConfig.params.accountId; + edktInitializor.publisherId = rtdConfig.params.publisherId; + edktInitializor.apiKey = rtdConfig.params.apiKey; + edktInitializor.invoked = true; + const moduleSrc = getModuleUrl(rtdConfig.params.accountId); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(moduleSrc, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, SUBMODULE_NAME); + } +} + +/** + * Fetch audiences from localStorage + * @return {Array} + */ +function getMatchedAudiencesFromStorage() { + const audiences = storage.getDataFromLocalStorage(AG_AUDIENCE_IDS_KEY); + if (!audiences) return []; + try { + return JSON.parse(audiences); + } catch (e) { + return []; + } +} + +/** + * Pass audience data to configured bidders, using ORTB2 + * @param {Object} bidConfig + * @param {Object} rtdConfig + * @param {Array} audiences + * @return {void} + */ +function setAudiencesAsBidderOrtb2(bidConfig, rtdConfig, audiences) { + const bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(rtdConfig, 'params.bidders'); + if (!bidders || bidders.length === 0 || !audiences || audiences.length === 0) return; + const agOrtb2 = {}; + const agUserData = [{ + id: String(MIQ_TCF_ID), + ext: { + segtax: 540 + }, + name: 'airgrid', + segment: audiences.map(id => ({ + id + })) + }]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(agOrtb2, 'user.data', agUserData); + const bidderConfig = Object.fromEntries(bidders.map(bidder => [bidder, agOrtb2])); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)(bidConfig?.ortb2Fragments?.bidder, bidderConfig); +} + +/** + * Module init + * @param {Object} rtdConfig + * @param {Object} userConsent + * @return {boolean} + */ +function init(rtdConfig, userConsent) { + attachScriptTagToDOM(rtdConfig); + return true; +} + +/** + * Real-time data retrieval from AirGrid + * @param {Object} bidConfig + * @param {function} onDone + * @param {Object} rtdConfig + * @param {Object} userConsent + * @return {void} + */ +function passAudiencesToBidders(bidConfig, onDone, rtdConfig, userConsent) { + const audiences = getMatchedAudiencesFromStorage(); + if (audiences.length > 0) { + setAudiencesAsBidderOrtb2(bidConfig, rtdConfig, audiences); + } + onDone(); +} + +/** @type {RtdSubmodule} */ +const airgridSubmodule = { + name: SUBMODULE_NAME, + init: init, + getBidRequestData: passAudiencesToBidders, + gvlid: MIQ_TCF_ID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)(MODULE_NAME, airgridSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('airgridRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/airgridRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ajaBidAdapter"],{ + +/***/ "./modules/ajaBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/ajaBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +const BidderCode = 'aja'; +const URL = 'https://ad.as.amanad.adtdp.com/v2/prebid'; +const SDKType = 5; +const AdType = { + Banner: 1, + Native: 2, + Video: 3 +}; +const BannerSizeMap = { + '970x250': 1, + '300x250': 2, + '320x50': 3, + '728x90': 4, + '320x100': 6, + '336x280': 31, + '300x600': 32 +}; +const spec = { + code: BidderCode, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid has all the params needed to make a valid request. + * + * @param {BidRequest} bidRequest + * @returns {boolean} + */ + isBidRequestValid: function (bidRequest) { + return !!bidRequest.params.asi; + }, + /** + * Build the request to the Server which requests Bids for the given array of Requests. + * Each BidRequest in the argument array is guaranteed to have passed the isBidRequestValid() test. + * + * @param {BidRequest[]} validBidRequests + * @param {*} bidderRequest + * @returns {ServerRequest|ServerRequest[]} + */ + buildRequests: function (validBidRequests, bidderRequest) { + const bidRequests = []; + const pageUrl = bidderRequest?.refererInfo?.page || undefined; + for (let i = 0, len = validBidRequests.length; i < len; i++) { + const bidRequest = validBidRequests[i]; + let queryString = ''; + const asi = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('asi', bidRequest.params); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'asi', asi); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'skt', SDKType); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'gpid', bidRequest.ortb2Imp?.ext?.gpid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'tid', bidRequest.ortb2Imp?.ext?.tid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'cdep', bidRequest.ortb2?.device?.ext?.cdep); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'prebid_id', bidRequest.bidId); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'prebid_ver', "9.45.0-pre"); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'page_url', pageUrl); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'schain', spec.serializeSupplyChain(bidRequest.schain || [])); + const adFormatIDs = pickAdFormats(bidRequest); + if (adFormatIDs && adFormatIDs.length > 0) { + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'ad_format_ids', adFormatIDs.join(',')); + } + const eids = bidRequest.userIdAsEids; + if (eids && eids.length) { + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'eids', JSON.stringify({ + 'eids': eids + })); + } + const sua = bidRequest.ortb2?.device?.sua; + if (sua) { + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'sua', JSON.stringify(sua)); + } + bidRequests.push({ + method: 'GET', + url: URL, + data: queryString + }); + } + return bidRequests; + }, + interpretResponse: function (bidderResponse) { + const bidderResponseBody = bidderResponse.body; + if (!bidderResponseBody.is_ad_return) { + return []; + } + const ad = bidderResponseBody.ad; + if (AdType.Banner !== ad.ad_type) { + return []; + } + const bannerAd = bidderResponseBody.ad.banner; + const bid = { + requestId: ad.prebid_id, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + ad: bannerAd.tag, + width: bannerAd.w, + height: bannerAd.h, + cpm: ad.price, + creativeId: ad.creative_id, + dealId: ad.deal_id, + currency: ad.currency || 'USD', + netRevenue: true, + ttl: 300, + // 5 minutes + meta: { + advertiserDomains: bannerAd.adomain + } + }; + try { + bannerAd.imps.forEach(impTracker => { + const tracker = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(impTracker); + bid.ad += tracker; + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error appending tracking pixel', error); + } + return [bid]; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (!serverResponses.length) { + return syncs; + } + const bidderResponseBody = serverResponses[0].body; + if (syncOptions.pixelEnabled && bidderResponseBody.syncs) { + bidderResponseBody.syncs.forEach(sync => { + syncs.push({ + type: 'image', + url: sync + }); + }); + } + if (syncOptions.iframeEnabled && bidderResponseBody.sync_htmls) { + bidderResponseBody.sync_htmls.forEach(sync => { + syncs.push({ + type: 'iframe', + url: sync + }); + }); + } + return syncs; + }, + /** + * Serialize supply chain object + * @param {Object} supplyChain + * @returns {String | undefined} + */ + serializeSupplyChain: function (supplyChain) { + if (!supplyChain || !supplyChain.nodes) return undefined; + const { + ver, + complete, + nodes + } = supplyChain; + return `${ver},${complete}!${spec.serializeSupplyChainNodes(nodes)}`; + }, + /** + * Serialize each supply chain nodes + * @param {Array} nodes + * @returns {String} + */ + serializeSupplyChainNodes: function (nodes) { + const fields = ['asi', 'sid', 'hp', 'rid', 'name', 'domain']; + return nodes.map(n => { + return fields.map(f => { + return encodeURIComponent(n[f] || '').replace(/!/g, '%21'); + }).join(','); + }).join('!'); + } +}; +function pickAdFormats(bidRequest) { + let sizes = bidRequest.sizes || []; + sizes.push(...(bidRequest.mediaTypes?.banner?.sizes || [])); + const adFormatIDs = []; + for (const size of sizes) { + if (size.length !== 2) { + continue; + } + const adFormatID = BannerSizeMap[`${size[0]}x${size[1]}`]; + if (adFormatID) { + adFormatIDs.push(adFormatID); + } + } + return [...new Set(adFormatIDs)]; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('ajaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ajaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["akamaiDapRtdProvider"],{ + +/***/ "./modules/akamaiDapRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/akamaiDapRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports addRealTimeData, getRealTimeData, generateRealTimeData, akamaiDapRtdSubmodule, storage, dapUtils, DAP_TOKEN, DAP_MEMBERSHIP, DAP_ENCRYPTED_MEMBERSHIP, DAP_SS_ID, DAP_DEFAULT_TOKEN_TTL, DAP_MAX_RETRY_TOKENIZE, DAP_CLIENT_ENTROPY */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _symitriDapRtdProvider_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./symitriDapRtdProvider.js */ "./modules/symitriDapRtdProvider.js"); + +/** + * This module adds the Akamai DAP RTD provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time data from DAP + * @module modules/akamaiDapRtdProvider + * @requires module:modules/realTimeData + */ + + /* eslint prebid/validate-imports: "off" */ + +const { + addRealTimeData, + getRealTimeData, + generateRealTimeData, + rtdSubmodule: akamaiDapRtdSubmodule, + storage, + dapUtils, + DAP_TOKEN, + DAP_MEMBERSHIP, + DAP_ENCRYPTED_MEMBERSHIP, + DAP_SS_ID, + DAP_DEFAULT_TOKEN_TTL, + DAP_MAX_RETRY_TOKENIZE, + DAP_CLIENT_ENTROPY +} = (0,_symitriDapRtdProvider_js__WEBPACK_IMPORTED_MODULE_0__.createRtdProvider)('dap', 'akamaidap', 'Akamai'); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('akamaiDapRtdProvider'); + +/***/ }), + +/***/ "./modules/symitriDapRtdProvider.js": +/*!******************************************!*\ + !*** ./modules/symitriDapRtdProvider.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createRtdProvider: () => (/* binding */ createRtdProvider) +/* harmony export */ }); +/* unused harmony exports addRealTimeData, getRealTimeData, generateRealTimeData, symitriDapRtdSubmodule, storage, dapUtils, DAP_TOKEN, DAP_MEMBERSHIP, DAP_ENCRYPTED_MEMBERSHIP, DAP_SS_ID, DAP_DEFAULT_TOKEN_TTL, DAP_MAX_RETRY_TOKENIZE, DAP_CLIENT_ENTROPY */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the Symitri DAP RTD provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time data from DAP + * @module modules/symitriDapRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ +function createRtdProvider(moduleName, moduleCode, headerPrefix) { + const MODULE_NAME = 'realTimeData'; + const SUBMODULE_NAME = moduleName; + const MODULE_CODE = moduleCode; + const DAP_TOKEN = 'async_dap_token'; + const DAP_MEMBERSHIP = 'async_dap_membership'; + const DAP_ENCRYPTED_MEMBERSHIP = 'encrypted_dap_membership'; + const DAP_SS_ID = 'dap_ss_id'; + const DAP_DEFAULT_TOKEN_TTL = 3600; // in seconds + const DAP_MAX_RETRY_TOKENIZE = 1; + const DAP_CLIENT_ENTROPY = 'dap_client_entropy'; + const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME + }); + let dapRetryTokenize = 0; + + /** + * Lazy merge objects. + * @param {String} target + * @param {String} source + */ + function mergeLazy(target, source) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(target)) { + target = {}; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(source)) { + source = {}; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(target, source); + } + + /** + * Add real-time data & merge segments. + * @param {Object} ortb2 destination object to merge RTD into + * @param {Object} rtd + */ + function addRealTimeData(ortb2, rtd) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(addRealTimeData) - ENTER'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtd.ortb2)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('DEBUG(addRealTimeData): merging original: ', ortb2); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('DEBUG(addRealTimeData): merging in: ', rtd.ortb2); + mergeLazy(ortb2, rtd.ortb2); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(addRealTimeData) - EXIT'); + } + + /** + * Real-time data retrieval from Audigent + * @param {Object} bidConfig + * @param {function} onDone + * @param {Object} rtdConfig + * @param {Object} userConsent + */ + function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { + let entropyDict = JSON.parse(storage.getDataFromLocalStorage(DAP_CLIENT_ENTROPY)); + + // Attempt to load entroy script if no entropy object exist and entropy config settings are present. + // Else + if (!entropyDict && rtdConfig && rtdConfig.params && dapUtils.isValidHttpsUrl(rtdConfig.params.dapEntropyUrl)) { + let loadScriptPromise = new Promise((resolve, reject) => { + if (rtdConfig && rtdConfig.params && rtdConfig.params.dapEntropyTimeout && Number.isInteger(rtdConfig.params.dapEntropyTimeout)) { + setTimeout(reject, rtdConfig.params.dapEntropyTimeout, Error('DapEntropy script could not be loaded')); + } + if (entropyDict && entropyDict.expires_at > Math.round(Date.now() / 1000.0)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Using cached entropy'); + resolve(); + } else { + if (typeof window.dapCalculateEntropy === 'function') { + window.dapCalculateEntropy(resolve, reject); + } else { + if (rtdConfig && rtdConfig.params && dapUtils.isValidHttpsUrl(rtdConfig.params.dapEntropyUrl)) { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(rtdConfig.params.dapEntropyUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, MODULE_CODE, () => { + dapUtils.dapGetEntropy(resolve, reject); + }); + } else { + reject(Error('Please check if dapEntropyUrl is specified and is valid under config.params')); + } + } + } + }); + loadScriptPromise.catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Entropy could not be calculated due to: ', error.message); + }).finally(() => { + generateRealTimeData(bidConfig, onDone, rtdConfig, userConsent); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('No dapEntropyUrl is specified.'); + generateRealTimeData(bidConfig, onDone, rtdConfig, userConsent); + } + } + function generateRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(generateRealTimeData) - ENTER'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(' - apiHostname: ' + rtdConfig.params.apiHostname); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(' - apiVersion: ' + rtdConfig.params.apiVersion); + dapRetryTokenize = 0; + var jsonData = null; + if (rtdConfig && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtdConfig.params)) { + if (rtdConfig.params.segtax == 710) { + let encMembership = dapUtils.dapGetEncryptedMembershipFromLocalStorage(); + if (encMembership) { + jsonData = dapUtils.dapGetEncryptedRtdObj(encMembership, rtdConfig.params.segtax); + } + } else { + let membership = dapUtils.dapGetMembershipFromLocalStorage(); + if (membership) { + jsonData = dapUtils.dapGetRtdObj(membership, rtdConfig.params.segtax); + } + } + } + if (jsonData) { + if (jsonData.rtd) { + addRealTimeData(bidConfig.ortb2Fragments?.global, jsonData.rtd); + onDone(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(generateRealTimeData) - 1'); + // Don't return - ensure the data is always fresh. + } + } + // Calling setTimeout to release the main thread so that the bid request could be sent. + setTimeout(dapUtils.callDapAPIs, 0, bidConfig, onDone, rtdConfig, userConsent); + } + + /** + * Module init + * @param {Object} config + * @param {Object} userConsent + * @return {boolean} + */ + function init(config, userConsent) { + if (dapUtils.checkConsent(userConsent) === false) { + return false; + } + return true; + } + function onBidResponse(bidResponse, config, userConsent) { + if (bidResponse.dealId && typeof bidResponse.dealId != typeof undefined) { + let membership = dapUtils.dapGetMembershipFromLocalStorage(); // Get Membership details from Local Storage + let deals = membership.deals; // Get list of Deals the user is mapped to + deals.forEach(deal => { + deal = JSON.parse(deal); + if (bidResponse.dealId == deal.id) { + // Check if the bid response deal Id matches to the deals mapped to the user + let token = dapUtils.dapGetTokenFromLocalStorage(); + let url = config.params.pixelUrl + '?token=' + token + '&ad_id=' + bidResponse.adId + '&bidder=' + bidResponse.bidder + '&bidder_code=' + bidResponse.bidderCode + '&cpm=' + bidResponse.cpm + '&creative_id=' + bidResponse.creativeId + '&deal_id=' + bidResponse.dealId + '&media_type=' + bidResponse.mediaType + '&response_timestamp=' + bidResponse.responseTimestamp; + bidResponse.ad = `${bidResponse.ad}`; + trackedAd += tracker; + }); + } + return trackedAd; +} +function getScreenParams() { + return `${window.screen.width}x${window.screen.height}@${window.devicePixelRatio}`; +} +function getBids(bids) { + const bidArr = bids.map(bid => { + const bidId = bid.bidId; + let mediaType = ''; + const mediaTypes = Object.keys(bid.mediaTypes); + switch (mediaTypes[0]) { + case 'video': + mediaType = 'v'; + break; + case 'native': + mediaType = 'n'; + break; + case 'audio': + mediaType = 'a'; + break; + default: + mediaType = 'b'; + break; + } + let adUnitCode = `,c=${bid.adUnitCode}`; + if (bid.params.code) { + adUnitCode = `,c=${encodeURIComponent(bid.params.code)}`; + } + if (bid.params.adunitId) { + adUnitCode = `,u=${encodeURIComponent(bid.params.adunitId)}`; + } + return `${bidId}:t=${mediaType},s=${serializeSizes(bid.sizes)}${adUnitCode}`; + }); + return bidArr.join(';'); +} +; +function getEndpointsGroups(bidRequests) { + let endpoints = []; + const getEndpoint = bid => { + const publisherId = bid.params.publisherId || _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('apstream.publisherId'); + const isTestConfig = bid.params.test || _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('apstream.test'); + if (isTestConfig) { + return `https://mock-bapi.userreport.com/v2/${publisherId}/bid`; + } + if (bid.params.endpoint) { + return `${bid.params.endpoint}${publisherId}/bid`; + } + return `https://bapi.userreport.com/v2/${publisherId}/bid`; + }; + bidRequests.forEach(bid => { + const endpoint = getEndpoint(bid); + const exist = endpoints.filter(item => item.endpoint.indexOf(endpoint) > -1)[0]; + if (exist) { + exist.bids.push(bid); + } else { + endpoints.push({ + endpoint: endpoint, + bids: [bid] + }); + } + }); + return endpoints; +} +function isBidRequestValid(bid) { + const publisherId = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('apstream.publisherId'); + const isPublisherIdExist = !!(publisherId || bid.params.publisherId); + const isOneMediaType = Object.keys(bid.mediaTypes).length === 1; + return isPublisherIdExist && isOneMediaType; +} +function buildRequests(bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(bidRequests); + const data = { + med: encodeURIComponent(window.location.href), + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auid: bidderRequest.auctionId, + ref: document.referrer, + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0, + sr: getScreenParams() + }; + const consentData = getRawConsentString(bidderRequest.gdprConsent); + data.iab_consent = consentData; + const options = { + withCredentials: true + }; + const isConsent = getIabConsentString(bidderRequest); + const noDsu = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('apstream.noDsu'); + if (!isConsent || noDsu) { + data.dsu = ''; + } else { + data.dsu = dsuModule.readOrCreateDsu(); + } + if (!isConsent || isConsent === 'disabled') { + options.withCredentials = false; + } + const endpoints = getEndpointsGroups(bidRequests); + const serverRequests = endpoints.map(item => ({ + method: 'GET', + url: item.endpoint, + data: { + ...data, + bids: getBids(item.bids), + rnd: Math.random() + }, + options: options + })); + return serverRequests; +} +function interpretResponse(serverResponse) { + let bidResponses = serverResponse && serverResponse.body; + if (!bidResponses || !bidResponses.length) { + return []; + } + return bidResponses.map(x => ({ + requestId: x.bidId, + cpm: x.bidDetails.cpm, + width: x.bidDetails.width, + height: x.bidDetails.height, + creativeId: x.bidDetails.creativeId, + currency: x.bidDetails.currency || 'USD', + netRevenue: x.bidDetails.netRevenue, + dealId: x.bidDetails.dealId, + ad: injectPixels(x.bidDetails.ad, x.bidDetails.noticeUrls, x.bidDetails.impressionScripts), + ttl: x.bidDetails.ttl + })); +} +const spec = { + code: CONSTANTS.BIDDER_CODE, + gvlid: CONSTANTS.GVLID, + isBidRequestValid: isBidRequestValid, + buildRequests: buildRequests, + interpretResponse: interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('apstreamBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/apstreamBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["arcspanRtdProvider"],{ + +/***/ "./modules/arcspanRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/arcspanRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export arcspanSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** @type {string} */ +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'arcspan'; + +/** @type {RtdSubmodule} */ +const arcspanSubmodule = { + name: SUBMODULE_NAME, + init: init, + getBidRequestData: alterBidRequests +}; +function init(config, userConsent) { + if (typeof config.params.silo === 'undefined') { + return false; + } + if (typeof window.arcobj2 === 'undefined') { + var scriptUrl; + if (config.params.silo === 'test') { + scriptUrl = 'https://localhost:8080/as.js'; + } else { + scriptUrl = 'https://silo' + config.params.silo + '.p7cloud.net/as.js'; + } + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_0__.loadExternalScript)(scriptUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, SUBMODULE_NAME); + } + return true; +} +function alterBidRequests(reqBidsConfigObj, callback, config, userConsent) { + var _v1 = []; + var _v1s = []; + var _v2 = []; + var arcobj1 = window.arcobj1; + if (typeof arcobj1 != 'undefined') { + if (typeof arcobj1.page_iab_codes.text != 'undefined') { + _v1 = _v1.concat(arcobj1.page_iab_codes.text); + } + if (typeof arcobj1.page_iab_codes.images != 'undefined') { + _v1 = _v1.concat(arcobj1.page_iab_codes.images); + } + if (typeof arcobj1.page_iab.text != 'undefined') { + _v1s = _v1s.concat(arcobj1.page_iab.text); + } + if (typeof arcobj1.page_iab.images != 'undefined') { + _v1s = _v1s.concat(arcobj1.page_iab.images); + } + if (typeof arcobj1.page_iab_newcodes.text != 'undefined') { + _v2 = [...new Set([..._v2, ...arcobj1.page_iab_newcodes.text])]; + } + if (typeof arcobj1.page_iab_newcodes.images != 'undefined') { + _v2 = [...new Set([..._v2, ...arcobj1.page_iab_newcodes.images])]; + } + var _content = {}; + _content.data = []; + var p = {}; + p.name = 'arcspan'; + p.segment = []; + p.ext = { + segtax: 6 + }; + _v2.forEach(function (e) { + p.segment = p.segment.concat({ + id: e + }); + }); + _content.data = _content.data.concat(p); + var _ortb2 = { + site: { + name: 'arcspan', + domain: new URL(location.href).hostname, + cat: _v1, + sectioncat: _v1, + pagecat: _v1, + page: location.href, + ref: document.referrer, + keywords: _v1s.toString(), + content: _content + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global, _ortb2); + } + callback(); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)(MODULE_NAME, arcspanSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('arcspanRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/arcspanRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["asealBidAdapter"],{ + +/***/ "./modules/asealBidAdapter.js": +/*!************************************!*\ + !*** ./modules/asealBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, SUPPORTED_AD_TYPES, API_ENDPOINT, WEB_SESSION_ID_KEY, HEADER_AOTTER_VERSION, storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + +const BIDDER_CODE = 'aseal'; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +const API_ENDPOINT = 'https://tkprebid.aotter.net/prebid/adapter'; +const WEB_SESSION_ID_KEY = '__tkwsid'; +const HEADER_AOTTER_VERSION = 'prebid_0.0.2'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const getTrekWebSessionId = () => { + let wsid = storage.localStorageIsEnabled() && storage.getDataFromLocalStorage(WEB_SESSION_ID_KEY); + if (!wsid) { + wsid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + setTrekWebSessionId(wsid); + } + return wsid; +}; +const setTrekWebSessionId = wsid => { + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(WEB_SESSION_ID_KEY, wsid); + } +}; +const canAccessTopWindow = () => { + try { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)().location.href; + } catch (errro) { + return false; + } +}; +const spec = { + code: BIDDER_CODE, + aliases: ['aotter', 'trek'], + supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid: bid => !!bid.params.placeUid && typeof bid.params.placeUid === 'string', + buildRequests: (validBidRequests, bidderRequest) => { + if (validBidRequests.length === 0) { + return []; + } + const clientId = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('aseal.clientId') || ''; + const windowTop = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(); + const windowSelf = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)(); + const w = canAccessTopWindow() ? windowTop : windowSelf; + const data = { + bids: validBidRequests, + // TODO: please do not pass internal data structures over to the network + refererInfo: bidderRequest.refererInfo?.legacy, + device: { + webSessionId: getTrekWebSessionId() + }, + payload: { + meta: { + dr: w.document.referrer, + drs: windowSelf.document.referrer, + drt: canAccessTopWindow() && windowTop.document.referrer || '', + dt: w.document.title, + dl: w.location.href + } + } + }; + const options = { + contentType: 'application/json', + withCredentials: true, + customHeaders: { + 'x-aotter-clientid': clientId, + 'x-aotter-version': HEADER_AOTTER_VERSION + } + }; + return [{ + method: 'POST', + url: API_ENDPOINT, + data, + options + }]; + }, + interpretResponse: (serverResponse, bidRequest) => { + if (!Array.isArray(serverResponse.body)) { + return []; + } + const bidResponses = serverResponse.body; + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('asealBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/asealBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["asoBidAdapter"],{ + +/***/ "./modules/asoBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/asoBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +const BIDDER_CODE = 'aso'; +const DEFAULT_SERVER_URL = 'https://srv.aso1.net'; +const DEFAULT_SERVER_PATH = '/prebid/bidder'; +const DEFAULT_CURRENCY = 'USD'; +const VERSION = "9.45.0-pre_2.0"; +const TTL = 300; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + aliases: [{ + code: 'bcmint' + }, { + code: 'bidgency' + }, { + code: 'kuantyx' + }, { + code: 'cordless' + }], + isBidRequestValid: bid => { + return !!bid.params && !!bid.params.zone; + }, + buildRequests: (bidRequests, bidderRequest) => { + let requests = []; + bidRequests.forEach(bid => { + const data = converter.toORTB({ + bidRequests: [bid], + bidderRequest + }); + requests.push({ + method: 'POST', + url: getEndpoint(bid), + data, + options: { + withCredentials: true, + crossOrigin: true + }, + bidderRequest + }); + }); + return requests; + }, + interpretResponse: (response, request) => { + if (response.body) { + return converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + } + return []; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const urls = []; + if (serverResponses && serverResponses.length !== 0) { + let query = ''; + if (gdprConsent) { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(query, 'gdpr', gdprConsent.gdprApplies ? 1 : 0); + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(query, 'consents_str', gdprConsent.consentString); + const consentsIds = getConsentsIds(gdprConsent); + if (consentsIds) { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(query, 'consents', consentsIds); + } + } + if (uspConsent) { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(query, 'us_privacy', uspConsent); + } + if (query.slice(-1) === '&') { + query = query.slice(0, -1); + } + serverResponses.forEach(resp => { + const userSyncs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(resp, 'body.ext.user_syncs'); + if (!userSyncs) { + return; + } + userSyncs.forEach(us => { + let url = us.url; + if (query) { + url = url + (url.indexOf('?') === -1 ? '?' : '&') + query; + } + urls.push({ + type: us.type, + url: url + }); + }); + }); + } + return urls; + } +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: true, + ttl: TTL + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + imp.tagid = bidRequest.adUnitCode; + imp.secure = bidRequest.ortb2Imp?.secure ?? 1; + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + if (bidderRequest.gdprConsent) { + const consentsIds = getConsentsIds(bidderRequest.gdprConsent); + if (consentsIds) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'user.ext.consents', consentsIds); + } + } + if (!request.cur) { + request.cur = [DEFAULT_CURRENCY]; + } + return request; + }, + bidResponse(buildBidResponse, bid, context) { + context.mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.type'); + return buildBidResponse(bid, context); + }, + overrides: { + request: { + // We don't need extra data + gdprAddtlConsent(setAddtlConsent, ortbRequest, bidderRequest) {} + } + } +}); +function getEndpoint(bidRequest) { + const serverUrl = bidRequest.params.server || DEFAULT_SERVER_URL; + return serverUrl + DEFAULT_SERVER_PATH + '?zid=' + bidRequest.params.zone + '&pbjs=' + VERSION; +} +function getConsentsIds(gdprConsent) { + const consents = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(gdprConsent, 'vendorData.purpose.consents', []); + let consentsIds = []; + Object.keys(consents).forEach(key => { + if (consents[key] === true) { + consentsIds.push(key); + } + }); + return consentsIds.join(','); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('asoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","urlUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/asoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["asteriobidAnalyticsAdapter"],{ + +/***/ "./modules/asteriobidAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/asteriobidAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export storage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + + + +/** + * asteriobidAnalyticsAdapter.js - analytics adapter for AsterioBid + */ +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: 'asteriobid' +}); +const DEFAULT_EVENT_URL = 'https://endpt.asteriobid.com/endpoint'; +const analyticsType = 'endpoint'; +const analyticsName = 'AsterioBid Analytics'; +const utmTags = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; +const _VERSION = 1; +let ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajaxBuilder)(20000); +let initOptions; +let auctionStarts = {}; +let auctionTimeouts = {}; +let sampling; +let pageViewId; +let flushInterval; +let eventQueue = []; +let asteriobidAnalyticsEnabled = false; +let asteriobidAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__["default"])({ + url: DEFAULT_EVENT_URL, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + handleEvent(eventType, args); + } +}); +asteriobidAnalytics.originEnableAnalytics = asteriobidAnalytics.enableAnalytics; +asteriobidAnalytics.enableAnalytics = function (config) { + initOptions = config.options || {}; + pageViewId = initOptions.pageViewId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(); + sampling = initOptions.sampling || 1; + if (Math.floor(Math.random() * sampling) === 0) { + asteriobidAnalyticsEnabled = true; + flushInterval = setInterval(flush, 1000); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${analyticsName} isn't enabled because of sampling`); + } + asteriobidAnalytics.originEnableAnalytics(config); +}; +asteriobidAnalytics.originDisableAnalytics = asteriobidAnalytics.disableAnalytics; +asteriobidAnalytics.disableAnalytics = function () { + if (!asteriobidAnalyticsEnabled) { + return; + } + flush(); + clearInterval(flushInterval); + asteriobidAnalytics.originDisableAnalytics(); +}; +function collectUtmTagData() { + let newUtm = false; + let pmUtmTags = {}; + try { + utmTags.forEach(function (utmKey) { + let utmValue = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getParameterByName)(utmKey); + if (utmValue !== '') { + newUtm = true; + } + pmUtmTags[utmKey] = utmValue; + }); + if (newUtm === false) { + utmTags.forEach(function (utmKey) { + let itemValue = storage.getDataFromLocalStorage(`pm_${utmKey}`); + if (itemValue && itemValue.length !== 0) { + pmUtmTags[utmKey] = itemValue; + } + }); + } else { + utmTags.forEach(function (utmKey) { + storage.setDataInLocalStorage(`pm_${utmKey}`, pmUtmTags[utmKey]); + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${analyticsName} Error`, e); + pmUtmTags['error_utm'] = 1; + } + return pmUtmTags; +} +function collectPageInfo() { + const pageInfo = { + domain: window.location.hostname + }; + if (document.referrer) { + pageInfo.referrerDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseUrl)(document.referrer).hostname; + } + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)(); + pageInfo.page = refererInfo.page; + pageInfo.ref = refererInfo.ref; + return pageInfo; +} +function flush() { + if (!asteriobidAnalyticsEnabled) { + return; + } + if (eventQueue.length > 0) { + const data = { + pageViewId: pageViewId, + ver: _VERSION, + bundleId: initOptions.bundleId, + events: eventQueue, + utmTags: collectUtmTagData(), + pageInfo: collectPageInfo(), + sampling: sampling + }; + eventQueue = []; + if ('version' in initOptions) { + data.version = initOptions.version; + } + if ('tcf_compliant' in initOptions) { + data.tcf_compliant = initOptions.tcf_compliant; + } + if ('adUnitDict' in initOptions) { + data.adUnitDict = initOptions.adUnitDict; + } + if ('customParam' in initOptions) { + data.customParam = initOptions.customParam; + } + const url = initOptions.url ? initOptions.url : DEFAULT_EVENT_URL; + ajax(url, () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${analyticsName} sent events batch`), _VERSION + ':' + JSON.stringify(data), { + contentType: 'text/plain', + method: 'POST', + withCredentials: true + }); + } +} +function trimAdUnit(adUnit) { + if (!adUnit) return adUnit; + const res = {}; + res.code = adUnit.code; + res.sizes = adUnit.sizes; + return res; +} +function trimBid(bid) { + if (!bid) return bid; + const res = {}; + res.auctionId = bid.auctionId; + res.bidder = bid.bidder; + res.bidderRequestId = bid.bidderRequestId; + res.bidId = bid.bidId; + res.crumbs = bid.crumbs; + res.cpm = bid.cpm; + res.currency = bid.currency; + res.mediaTypes = bid.mediaTypes; + res.sizes = bid.sizes; + res.transactionId = bid.transactionId; + res.adUnitCode = bid.adUnitCode; + res.bidRequestsCount = bid.bidRequestsCount; + res.serverResponseTimeMs = bid.serverResponseTimeMs; + return res; +} +function trimBidderRequest(bidderRequest) { + if (!bidderRequest) return bidderRequest; + const res = {}; + res.auctionId = bidderRequest.auctionId; + res.auctionStart = bidderRequest.auctionStart; + res.bidderRequestId = bidderRequest.bidderRequestId; + res.bidderCode = bidderRequest.bidderCode; + res.bids = bidderRequest.bids && bidderRequest.bids.map(trimBid); + return res; +} +function handleEvent(eventType, eventArgs) { + if (!asteriobidAnalyticsEnabled) { + return; + } + if (eventArgs) { + eventArgs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.hasNonSerializableProperty)(eventArgs) ? eventArgs : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(eventArgs); + } else { + eventArgs = {}; + } + const pmEvent = {}; + pmEvent.timestamp = eventArgs.timestamp || Date.now(); + pmEvent.eventType = eventType; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_INIT: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.timeout = eventArgs.timeout; + pmEvent.adUnits = eventArgs.adUnits && eventArgs.adUnits.map(trimAdUnit); + pmEvent.bidderRequests = eventArgs.bidderRequests && eventArgs.bidderRequests.map(trimBidderRequest); + auctionStarts[pmEvent.auctionId] = pmEvent.timestamp; + auctionTimeouts[pmEvent.auctionId] = pmEvent.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.end = eventArgs.end; + pmEvent.start = eventArgs.start; + pmEvent.adUnitCodes = eventArgs.adUnitCodes; + pmEvent.bidsReceived = eventArgs.bidsReceived && eventArgs.bidsReceived.map(trimBid); + pmEvent.start = auctionStarts[pmEvent.auctionId]; + pmEvent.end = Date.now(); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_ADJUSTMENT: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_TIMEOUT: + { + pmEvent.bidders = eventArgs && eventArgs.map ? eventArgs.map(trimBid) : eventArgs; + pmEvent.duration = auctionTimeouts[pmEvent.auctionId]; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_REQUESTED: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.doneCbCallCount = eventArgs.doneCbCallCount; + pmEvent.start = eventArgs.start; + pmEvent.bidderRequestId = eventArgs.bidderRequestId; + pmEvent.bids = eventArgs.bids && eventArgs.bids.map(trimBid); + pmEvent.auctionStart = eventArgs.auctionStart; + pmEvent.timeout = eventArgs.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_RESPONSE: + { + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.width = eventArgs.width; + pmEvent.height = eventArgs.height; + pmEvent.adId = eventArgs.adId; + pmEvent.mediaType = eventArgs.mediaType; + pmEvent.cpm = eventArgs.cpm; + pmEvent.currency = eventArgs.currency; + pmEvent.requestId = eventArgs.requestId; + pmEvent.adUnitCode = eventArgs.adUnitCode; + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.timeToRespond = eventArgs.timeToRespond; + pmEvent.requestTimestamp = eventArgs.requestTimestamp; + pmEvent.responseTimestamp = eventArgs.responseTimestamp; + pmEvent.netRevenue = eventArgs.netRevenue; + pmEvent.size = eventArgs.size; + pmEvent.adserverTargeting = eventArgs.adserverTargeting; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_WON: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.adId = eventArgs.adId; + pmEvent.adserverTargeting = eventArgs.adserverTargeting; + pmEvent.adUnitCode = eventArgs.adUnitCode; + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.height = eventArgs.height; + pmEvent.mediaType = eventArgs.mediaType; + pmEvent.netRevenue = eventArgs.netRevenue; + pmEvent.cpm = eventArgs.cpm; + pmEvent.requestTimestamp = eventArgs.requestTimestamp; + pmEvent.responseTimestamp = eventArgs.responseTimestamp; + pmEvent.size = eventArgs.size; + pmEvent.width = eventArgs.width; + pmEvent.currency = eventArgs.currency; + pmEvent.bidder = eventArgs.bidder; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BIDDER_DONE: + { + pmEvent.auctionId = eventArgs.auctionId; + pmEvent.auctionStart = eventArgs.auctionStart; + pmEvent.bidderCode = eventArgs.bidderCode; + pmEvent.bidderRequestId = eventArgs.bidderRequestId; + pmEvent.bids = eventArgs.bids && eventArgs.bids.map(trimBid); + pmEvent.doneCbCallCount = eventArgs.doneCbCallCount; + pmEvent.start = eventArgs.start; + pmEvent.timeout = eventArgs.timeout; + pmEvent.tid = eventArgs.tid; + pmEvent.src = eventArgs.src; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.SET_TARGETING: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.REQUEST_BIDS: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.ADD_AD_UNITS: + { + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AD_RENDER_FAILED: + { + pmEvent.bid = eventArgs.bid; + pmEvent.message = eventArgs.message; + pmEvent.reason = eventArgs.reason; + break; + } + default: + return; + } + sendEvent(pmEvent); +} +function sendEvent(event) { + eventQueue.push(event); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${analyticsName} Event ${event.eventType}:`, event); + if (event.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END) { + flush(); + } +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: asteriobidAnalytics, + code: 'asteriobid' +}); +asteriobidAnalytics.getOptions = function () { + return initOptions; +}; +asteriobidAnalytics.flush = flush; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (asteriobidAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('asteriobidAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/asteriobidAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["astraoneBidAdapter"],{ + +/***/ "./modules/astraoneBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/astraoneBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'astraone'; +const SSP_ENDPOINT = 'https://ssp.astraone.io/auction/prebid'; +const TTL = 60; +function buildBidRequests(validBidRequests) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._map)(validBidRequests, function (validBidRequest) { + const params = validBidRequest.params; + const bidRequest = { + bidId: validBidRequest.bidId, + transactionId: validBidRequest.ortb2Imp?.ext?.tid, + sizes: validBidRequest.sizes, + placement: params.placement, + placeId: params.placeId, + imageUrl: params.imageUrl + }; + return bidRequest; + }); +} +function buildBid(bidData) { + const bid = { + requestId: bidData.bidId, + cpm: bidData.price, + width: bidData.width, + height: bidData.height, + creativeId: bidData.content.seanceId, + currency: bidData.currency, + netRevenue: true, + meta: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER + }, + ttl: TTL, + content: bidData.content + }; + bid.ad = wrapAd(bid, bidData); + return bid; +} +function getMediaTypeFromBid(bid) { + return bid.mediaTypes && Object.keys(bid.mediaTypes)[0]; +} +function wrapAd(bid, bidData) { + return ` + + + + + + + + +
+ + + `; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid(bid) { + return getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER && !!bid.params.placeId && !!bid.params.imageUrl && !!bid.params.placement && bid.params.placement === 'inImage'; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @return ServerRequest Info describing the request to the server. + */ + buildRequests(validBidRequests, bidderRequest) { + const payload = { + url: bidderRequest.refererInfo.page, + cmp: !!bidderRequest.gdprConsent, + bidRequests: buildBidRequests(validBidRequests) + }; + if (payload.cmp) { + const gdprApplies = bidderRequest.gdprConsent.gdprApplies; + if (gdprApplies !== undefined) payload['ga'] = gdprApplies; + payload['cs'] = bidderRequest.gdprConsent.consentString; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: SSP_ENDPOINT, + data: payloadString, + options: { + contentType: 'application/json' + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const bids = serverResponse.body && serverResponse.body.bids; + return Array.isArray(bids) ? bids.map(bid => buildBid(bid)) : []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('astraoneBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/astraoneBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["atsAnalyticsAdapter"],{ + +/***/ "./modules/atsAnalyticsAdapter.js": +/*!****************************************!*\ + !*** ./modules/atsAnalyticsAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, analyticsUrl, parseBrowser */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + + +const MODULE_CODE = 'atsAnalytics'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); + +/** + * Analytics adapter for - https://liveramp.com + * Maintainer - prebid@liveramp.com + */ + +const analyticsType = 'endpoint'; +const preflightUrl = 'https://check.analytics.rlcdn.com/check/'; +const analyticsUrl = 'https://analytics.rlcdn.com'; +let handlerRequest = []; +let handlerResponse = []; +let atsAnalyticsAdapterVersion = 3; +let browsersList = [/* Googlebot */ +{ + test: /googlebot/i, + name: 'Googlebot' +}, /* Opera < 13.0 */ +{ + test: /opera/i, + name: 'Opera' +}, /* Opera > 13.0 */ +{ + test: /opr\/|opios/i, + name: 'Opera' +}, { + test: /SamsungBrowser/i, + name: 'Samsung Internet for Android' +}, { + test: /Whale/i, + name: 'NAVER Whale Browser' +}, { + test: /MZBrowser/i, + name: 'MZ Browser' +}, { + test: /focus/i, + name: 'Focus' +}, { + test: /swing/i, + name: 'Swing' +}, { + test: /coast/i, + name: 'Opera Coast' +}, { + test: /opt\/\d+(?:.?_?\d+)+/i, + name: 'Opera Touch' +}, { + test: /yabrowser/i, + name: 'Yandex Browser' +}, { + test: /ucbrowser/i, + name: 'UC Browser' +}, { + test: /Maxthon|mxios/i, + name: 'Maxthon' +}, { + test: /epiphany/i, + name: 'Epiphany' +}, { + test: /puffin/i, + name: 'Puffin' +}, { + test: /sleipnir/i, + name: 'Sleipnir' +}, { + test: /k-meleon/i, + name: 'K-Meleon' +}, { + test: /micromessenger/i, + name: 'WeChat' +}, { + test: /qqbrowser/i, + name: /qqbrowserlite/i.test(window.navigator.userAgent) ? 'QQ Browser Lite' : 'QQ Browser' +}, { + test: /msie|trident/i, + name: 'Internet Explorer' +}, { + test: /\sedg\//i, + name: 'Microsoft Edge' +}, { + test: /edg([ea]|ios)/i, + name: 'Microsoft Edge' +}, { + test: /vivaldi/i, + name: 'Vivaldi' +}, { + test: /seamonkey/i, + name: 'SeaMonkey' +}, { + test: /sailfish/i, + name: 'Sailfish' +}, { + test: /silk/i, + name: 'Amazon Silk' +}, { + test: /phantom/i, + name: 'PhantomJS' +}, { + test: /slimerjs/i, + name: 'SlimerJS' +}, { + test: /blackberry|\bbb\d+/i, + name: 'BlackBerry' +}, { + test: /(web|hpw)[o0]s/i, + name: 'WebOS Browser' +}, { + test: /bada/i, + name: 'Bada' +}, { + test: /tizen/i, + name: 'Tizen' +}, { + test: /qupzilla/i, + name: 'QupZilla' +}, { + test: /firefox|iceweasel|fxios/i, + name: 'Firefox' +}, { + test: /electron/i, + name: 'Electron' +}, { + test: /MiuiBrowser/i, + name: 'Miui' +}, { + test: /chromium/i, + name: 'Chromium' +}, { + test: /chrome|crios|crmo/i, + name: 'Chrome' +}, { + test: /GSA/i, + name: 'Google Search' +}, /* Android Browser */ +{ + test: /android/i, + name: 'Android Browser' +}, /* PlayStation 4 */ +{ + test: /playstation 4/i, + name: 'PlayStation 4' +}, /* Safari */ +{ + test: /safari|applewebkit/i, + name: 'Safari' +}]; +let listOfSupportedBrowsers = ['Safari', 'Chrome', 'Firefox', 'Microsoft Edge']; +function bidRequestedHandler(args) { + let envelopeSourceCookieValue = storage.getCookie('_lr_env_src_ats'); + let envelopeSource = envelopeSourceCookieValue === 'true'; + let requests; + requests = args.bids.map(function (bid) { + return { + envelope_source: envelopeSource, + has_envelope: bid.userId ? !!bid.userId.idl_env : false, + bidder: bid.bidder, + bid_id: bid.bidId, + auction_id: args.auctionId, + user_browser: parseBrowser(), + user_platform: navigator.platform, + auction_start: new Date(args.auctionStart).toJSON(), + domain: window.location.hostname, + pid: atsAnalyticsAdapter.context.pid, + adapter_version: atsAnalyticsAdapterVersion, + bid_won: false + }; + }); + return requests; +} +function bidResponseHandler(args) { + return { + bid_id: args.requestId, + response_time_stamp: new Date(args.responseTimestamp).toJSON(), + currency: args.currency, + cpm: args.cpm, + net_revenue: args.netRevenue + }; +} +function parseBrowser() { + let ua = atsAnalyticsAdapter.getUserAgent(); + try { + let result = browsersList.filter(function (obj) { + return obj.test.test(ua); + }); + let browserName = result && result.length ? result[0].name : ''; + return listOfSupportedBrowsers.indexOf(browserName) >= 0 ? browserName : 'Unknown'; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('ATS Analytics - Error while checking user browser!', err); + } +} +function sendDataToAnalytic(events) { + // send data to ats analytic endpoint + try { + let dataToSend = { + 'Data': events + }; + let strJSON = JSON.stringify(dataToSend); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - tried to send analytics data!'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(analyticsUrl, function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - events sent successfully!'); + }, strJSON, { + method: 'POST', + contentType: 'application/json' + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('ATS Analytics - request encounter an error: ', err); + } +} + +// preflight request, to check did publisher have permission to send data to analytics endpoint +function preflightRequest(events) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - preflight request!'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(preflightUrl + atsAnalyticsAdapter.context.pid, { + success: function (data) { + let samplingRateObject = JSON.parse(data); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - Sampling Rate: ', samplingRateObject); + let samplingRate = samplingRateObject.samplingRate; + atsAnalyticsAdapter.setSamplingCookie(samplingRate); + let samplingRateNumber = Number(samplingRate); + if (data && samplingRate && atsAnalyticsAdapter.shouldFireRequest(samplingRateNumber)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - events to send: ', events); + sendDataToAnalytic(events); + } + }, + error: function () { + atsAnalyticsAdapter.setSamplingCookie(0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - Sampling Rate Request Error!'); + } + }, undefined, { + method: 'GET', + crossOrigin: true + }); +} +let atsAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__["default"])({ + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (typeof args !== 'undefined') { + atsAnalyticsAdapter.callHandler(eventType, args); + } + } +}); + +// save the base class function +atsAnalyticsAdapter.originEnableAnalytics = atsAnalyticsAdapter.enableAnalytics; + +// add check to not fire request every time, but instead to send 1/100 +atsAnalyticsAdapter.shouldFireRequest = function (samplingRate) { + if (samplingRate !== 0) { + let shouldFireRequestValue = Math.floor(Math.random() * 100 + 1) === 100; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - Should Fire Request: ', shouldFireRequestValue); + return shouldFireRequestValue; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - Should Fire Request: ', false); + return false; + } +}; +atsAnalyticsAdapter.getUserAgent = function () { + return window.navigator.userAgent; +}; +atsAnalyticsAdapter.setSamplingCookie = function (samplRate) { + const now = new Date(); + now.setTime(now.getTime() + 604800000); + storage.setCookie('_lr_sampling_rate', samplRate, now.toUTCString()); +}; + +// override enableAnalytics so we can get access to the config passed in from the page +atsAnalyticsAdapter.enableAnalytics = function (config) { + if (!config.options.pid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('ATS Analytics - Publisher ID (pid) option is not defined. Analytics won\'t work'); + return; + } + atsAnalyticsAdapter.context = { + events: [], + pid: config.options.pid, + bidWonTimeout: config.options.bidWonTimeout + }; + let initOptions = config.options; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - adapter enabled! '); + atsAnalyticsAdapter.originEnableAnalytics(initOptions); // call the base class function +}; +atsAnalyticsAdapter.callHandler = function (evtype, args) { + if (evtype === _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.BID_REQUESTED) { + handlerRequest = handlerRequest.concat(bidRequestedHandler(args)); + } else if (evtype === _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.BID_RESPONSE) { + handlerResponse.push(bidResponseHandler(args)); + } + if (evtype === _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.AUCTION_END) { + let bidWonTimeout = atsAnalyticsAdapter.context.bidWonTimeout ? atsAnalyticsAdapter.context.bidWonTimeout : 2000; + let events = []; + setTimeout(() => { + let winningBids = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.getGlobal)().getAllWinningBids(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - winning bids: ', winningBids); + // prepare format data for sending to analytics endpoint + if (handlerRequest.length) { + let wonEvent = {}; + if (handlerResponse.length) { + events = handlerRequest.filter(request => handlerResponse.filter(function (response) { + if (request.bid_id === response.bid_id) { + Object.assign(request, response); + } + })); + if (winningBids.length) { + events = events.filter(event => winningBids.filter(function (won) { + wonEvent.bid_id = won.requestId; + wonEvent.bid_won = true; + if (event.bid_id === wonEvent.bid_id) { + Object.assign(event, wonEvent); + } + })); + } + } else { + events = handlerRequest; + } + // check should we send data to analytics or not, check first cookie value _lr_sampling_rate + try { + let samplingRateCookie = storage.getCookie('_lr_sampling_rate'); + if (!samplingRateCookie) { + preflightRequest(events); + } else { + if (atsAnalyticsAdapter.shouldFireRequest(parseInt(samplingRateCookie))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ATS Analytics - events to send: ', events); + sendDataToAnalytic(events); + } + } + // empty events array to not send duplicate events + events = []; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('ATS Analytics - preflight request encounter an error: ', err); + } + } + }, bidWonTimeout); + } +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: atsAnalyticsAdapter, + code: MODULE_CODE, + gvlid: 97 +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (atsAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('atsAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/atsAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["audiencerunBidAdapter"],{ + +/***/ "./modules/audiencerunBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/audiencerunBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'audiencerun'; +const BASE_URL = 'https://d.audiencerun.com'; +const AUCTION_URL = `${BASE_URL}/prebid`; +const TIMEOUT_EVENT_URL = `${BASE_URL}/ps/pbtimeout`; +const ERROR_EVENT_URL = `${BASE_URL}/js_log`; +const DEFAULT_CURRENCY = 'USD'; +let requestedBids = []; + +/** + * Returns bidfloor through floors module if available. + * + * @param {Object} bid + * @returns {number} + */ +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.bidfloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + size: '*' + }); + return bidFloor?.floor; + } catch (_) { + return 0; + } +} + +/** + * Returns the most top page referer. + * + * @returns {string} + */ +function getPageReferer() { + let t, e; + do { + t = t ? t.parent : window; + try { + e = t.document.referrer; + } catch (_) { + break; + } + } while (t !== window.top); + return e; +} + +/** + * Returns bidder request page url. + * + * @param {Object} bidderRequest + * @return {string} + */ +function getPageUrl(bidderRequest) { + return bidderRequest?.refererInfo?.page; +} +const spec = { + version: '1.2.0', + code: BIDDER_CODE, + gvlid: 944, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let isValid = true; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.zoneId')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('AudienceRun zoneId parameter is required. Bid aborted.'); + isValid = false; + } + return isValid; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @param {*} bidderRequest + * @return {ServerRequest} Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const bids = bidRequests.map(bid => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner.sizes', []); + return { + zoneId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValue)(bid.params, 'zoneId'), + sizes: sizes.map(size => ({ + w: size[0], + h: size[1] + })), + bidfloor: getBidFloor(bid), + bidId: bid.bidId, + bidderRequestId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('bidderRequestId', bid), + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('adUnitCode', bid), + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('auctionId', bid), + transactionId: bid.ortb2Imp?.ext?.tid || '' + }; + }); + const payload = { + libVersion: this.version, + pageUrl: bidderRequest?.refererInfo?.page, + // TODO: does it make sense to find a half-way referer? what should these parameters pick + pageReferer: getPageReferer(), + referer: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.topmostLocation'), + // TODO: please do not send internal data structures over the network + refererInfo: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.legacy'), + currencyCode: (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest), + timeout: _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('bidderTimeout'), + bids + }; + payload.uspConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'uspConsent'); + payload.schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests, '0.schain'); + payload.userId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests, '0.userIdAsEids') || []; + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdpr = { + consent: bidderRequest.gdprConsent.consentString, + applies: bidderRequest.gdprConsent.gdprApplies, + version: bidderRequest.gdprConsent.apiVersion + }; + } else { + payload.gdpr = { + consent: '' + }; + } + requestedBids = bids; + return { + method: 'POST', + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequests, '0.params.auctionUrl', AUCTION_URL), + data: JSON.stringify(payload), + options: { + withCredentials: true + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bids = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(serverResponse.body.bid, function (bidObject) { + if (!bidObject.cpm || bidObject.cpm === null || !bidObject.adm) { + return; + } + const bid = {}; + bid.ad = bidObject.adm; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + + // Common properties + bid.requestId = bidObject.bidId; + bid.cpm = parseFloat(bidObject.cpm); + bid.creativeId = bidObject.crid; + bid.currency = bidObject.currency ? bidObject.currency.toUpperCase() : DEFAULT_CURRENCY; + bid.height = bidObject.h; + bid.width = bidObject.w; + bid.netRevenue = bidObject.isNet ? bidObject.isNet : false; + bid.ttl = 300; + bid.meta = { + advertiserDomains: bidObject.adomain && Array.isArray(bidObject.adomain) ? bidObject.adomain : [] + }; + bids.push(bid); + }); + return bids; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses) { + if (!serverResponses || !serverResponses.length) return []; + const syncs = []; + serverResponses.forEach(response => { + response.body.bid.forEach(bidObject => { + syncs.push({ + type: 'iframe', + url: bidObject.syncUrl + }); + }); + }); + return syncs; + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * + * @param {Array} timeoutData timeout specific data + */ + onTimeout: function (timeoutData) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(timeoutData)) { + return; + } + timeoutData.forEach(bid => { + const bidOnTimeout = requestedBids.find(requestedBid => requestedBid.bidId === bid.bidId); + if (bidOnTimeout) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel)(`${TIMEOUT_EVENT_URL}/${bidOnTimeout.zoneId}/${bidOnTimeout.bidId}`); + } + }); + }, + /** + * Registers bidder specific code, which will execute if the bidder responded with an error. + * @param {{bidderRequest: object}} args An object from which we extract bidderRequest object. + */ + onBidderError: function (_ref) { + let { + bidderRequest + } = _ref; + const queryString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)({ + message: `Prebid.js: Server call for ${bidderRequest.bidderCode} failed.`, + url: encodeURIComponent(getPageUrl(bidderRequest)) + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel)(`${ERROR_EVENT_URL}/?${queryString}`); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('audiencerunBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/audiencerunBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["automatadAnalyticsAdapter"],{ + +/***/ "./modules/automatadAnalyticsAdapter.js": +/*!**********************************************!*\ + !*** ./modules/automatadAnalyticsAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export self */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + + +/** Prebid Event Handlers */ + +const ADAPTER_CODE = 'automatadAnalytics'; +const trialCountMilsMapping = [1500, 3000, 5000, 10000]; +var isLoggingEnabled; +var queuePointer = 0; +var retryCount = 0; +var timer = null; +var __atmtdAnalyticsQueue = []; +var qBeingUsed; +var qTraversalComplete; +const prettyLog = function (level, text) { + let isGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let cb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : () => {}; + if (self.isLoggingEnabled === undefined) { + // TODO FIX THIS RULES VIOLATION + // eslint-disable-next-line no-restricted-properties + if (window.localStorage.getItem('__aggLoggingEnabled')) { + self.isLoggingEnabled = true; + } else { + const queryParams = new URLSearchParams(new URL(window.location.href).search); + self.isLoggingEnabled = queryParams.has('aggLoggingEnabled'); + } + } + if (self.isLoggingEnabled) { + if (isGroup) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`ATD Analytics Adapter: ${level.toUpperCase()}: ${text} --- Group Start ---`); + try { + cb(); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`ATD Analytics Adapter: ERROR: ${'Error during cb function in prettyLog'}`); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`ATD Analytics Adapter: ${level.toUpperCase()}: ${text} --- Group End ---`); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`ATD Analytics Adapter: ${level.toUpperCase()}: ${text}`); + } + } +}; +const processEvents = () => { + if (self.retryCount === trialCountMilsMapping.length) { + self.prettyLog('error', `Aggregator still hasn't loaded. Processing que stopped`, trialCountMilsMapping, self.retryCount); + return; + } + self.prettyLog('status', `Que has been inactive for a while. Adapter starting to process que now... Trial Count = ${self.retryCount + 1}`); + let shouldTryAgain = false; + while (self.queuePointer < self.__atmtdAnalyticsQueue.length) { + const eventType = self.__atmtdAnalyticsQueue[self.queuePointer][0]; + const args = self.__atmtdAnalyticsQueue[self.queuePointer][1]; + try { + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT: + if (window.atmtdAnalytics && window.atmtdAnalytics.auctionInitHandler) { + window.atmtdAnalytics.auctionInitHandler(args); + } else { + shouldTryAgain = true; + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidRequestedHandler) { + window.atmtdAnalytics.bidRequestedHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidResponseHandler) { + window.atmtdAnalytics.bidResponseHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REJECTED: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidRejectedHandler) { + window.atmtdAnalytics.bidRejectedHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidderDoneHandler) { + window.atmtdAnalytics.bidderDoneHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidWonHandler) { + window.atmtdAnalytics.bidWonHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.NO_BID: + if (window.atmtdAnalytics && window.atmtdAnalytics.noBidHandler) { + window.atmtdAnalytics.noBidHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidderTimeoutHandler) { + window.atmtdAnalytics.bidderTimeoutHandler(args); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_DEBUG: + if (window.atmtdAnalytics && window.atmtdAnalytics.auctionDebugHandler) { + window.atmtdAnalytics.auctionDebugHandler(args); + } + break; + case 'slotRenderEnded': + if (window.atmtdAnalytics && window.atmtdAnalytics.slotRenderEndedGPTHandler) { + window.atmtdAnalytics.slotRenderEndedGPTHandler(args); + } else { + shouldTryAgain = true; + } + break; + case 'impressionViewable': + if (window.atmtdAnalytics && window.atmtdAnalytics.impressionViewableHandler) { + window.atmtdAnalytics.impressionViewableHandler(args); + } else { + shouldTryAgain = true; + } + break; + } + if (shouldTryAgain) break; + } catch (error) { + self.prettyLog('error', `Unhandled Error while processing ${eventType} of ${self.queuePointer}th index in the que. Will not be retrying this raw event ...`, true, () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`The error is `, error); + }); + } + self.queuePointer = self.queuePointer + 1; + } + if (shouldTryAgain) { + if (trialCountMilsMapping[self.retryCount]) self.prettyLog('warn', `Adapter failed to process event as aggregator has not loaded. Retrying in ${trialCountMilsMapping[self.retryCount]}ms ...`); + setTimeout(self.processEvents, trialCountMilsMapping[self.retryCount]); + self.retryCount = self.retryCount + 1; + } else { + self.qBeingUsed = false; + self.qTraversalComplete = true; + } +}; +const addGPTHandlers = () => { + const googletag = window.googletag || {}; + googletag.cmd = googletag.cmd || []; + googletag.cmd.push(() => { + googletag.pubads().addEventListener('slotRenderEnded', event => { + if (window.atmtdAnalytics && window.atmtdAnalytics.slotRenderEndedGPTHandler && !self.qBeingUsed) { + window.atmtdAnalytics.slotRenderEndedGPTHandler(event); + return; + } + self.__atmtdAnalyticsQueue.push(['slotRenderEnded', event]); + self.prettyLog(`warn`, `Aggregator not initialised at auctionInit, exiting slotRenderEnded handler and pushing to que instead`); + }); + googletag.pubads().addEventListener('impressionViewable', event => { + if (window.atmtdAnalytics && window.atmtdAnalytics.impressionViewableHandler && !self.qBeingUsed) { + window.atmtdAnalytics.impressionViewableHandler(event); + return; + } + self.__atmtdAnalyticsQueue.push(['impressionViewable', event]); + self.prettyLog(`warn`, `Aggregator not initialised at auctionInit, exiting impressionViewable handler and pushing to que instead`); + }); + }); +}; +const initializeQueue = () => { + self.__atmtdAnalyticsQueue.push = args => { + self.qBeingUsed = true; + Array.prototype.push.apply(self.__atmtdAnalyticsQueue, [args]); + if (timer) { + clearTimeout(timer); + timer = null; + } + if (args[0] === _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT) { + const timeout = parseInt(_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('bidderTimeout')) + 1500; + timer = setTimeout(() => { + self.processEvents(); + }, timeout); + } else { + timer = setTimeout(() => { + self.processEvents(); + }, 1500); + } + }; +}; + +// ANALYTICS ADAPTER + +let baseAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__["default"])({ + analyticsType: 'bundle' +}); +let atmtdAdapter = Object.assign({}, baseAdapter, { + disableAnalytics() { + baseAdapter.disableAnalytics.apply(this, arguments); + }, + track(_ref) { + let { + eventType, + args + } = _ref; + const shouldNotPushToQueue = !self.qBeingUsed; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT: + if (window.atmtdAnalytics && window.atmtdAnalytics.auctionInitHandler && shouldNotPushToQueue) { + self.prettyLog('status', 'Aggregator loaded, initialising auction through handlers'); + window.atmtdAnalytics.auctionInitHandler(args); + } else { + self.prettyLog('warn', 'Aggregator not loaded, initialising auction through que ...'); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidRequestedHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.bidRequestedHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REJECTED: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidRejectedHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.bidRejectedHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidResponseHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.bidResponseHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidderDoneHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.bidderDoneHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidWonHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.bidWonHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.NO_BID: + if (window.atmtdAnalytics && window.atmtdAnalytics.noBidHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.noBidHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_DEBUG: + if (window.atmtdAnalytics && window.atmtdAnalytics.auctionDebugHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.auctionDebugHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT: + if (window.atmtdAnalytics && window.atmtdAnalytics.bidderTimeoutHandler && shouldNotPushToQueue) { + window.atmtdAnalytics.bidderTimeoutHandler(args); + } else { + self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`); + self.__atmtdAnalyticsQueue.push([eventType, args]); + } + break; + } + } +}); +atmtdAdapter.originEnableAnalytics = atmtdAdapter.enableAnalytics; +atmtdAdapter.enableAnalytics = function (configuration) { + if (configuration === undefined && typeof configuration !== 'object' || configuration.options === undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('A valid configuration must be passed to the Atmtd Analytics Adapter.'); + return; + } + const conf = configuration.options; + if (conf === undefined || typeof conf !== 'object' || conf.siteID === undefined || conf.publisherID === undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('A valid publisher ID and siteID must be passed to the Atmtd Analytics Adapter.'); + return; + } + self.initializeQueue(); + self.addGPTHandlers(); + window.__atmtdSDKConfig = { + publisherID: conf.publisherID, + siteID: conf.siteID, + collectDebugMessages: conf.logDebug ? conf.logDebug : false + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(`Automatad Analytics Adapter enabled with sdk config`, window.__atmtdSDKConfig); + atmtdAdapter.originEnableAnalytics(configuration); +}; + +/// /////////// ADAPTER REGISTRATION ///////////// + +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: atmtdAdapter, + code: ADAPTER_CODE +}); +var self = { + __atmtdAnalyticsQueue, + processEvents, + initializeQueue, + addGPTHandlers, + prettyLog, + queuePointer, + retryCount, + isLoggingEnabled, + qBeingUsed, + qTraversalComplete +}; +window.__atmtdAnalyticsGlobalObject = { + q: self.__atmtdAnalyticsQueue, + qBeingUsed: self.qBeingUsed, + qTraversalComplete: self.qTraversalComplete +}; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (atmtdAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('automatadAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/automatadAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["automatadBidAdapter"],{ + +/***/ "./modules/automatadBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/automatadBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + +const BIDDER = 'automatad'; +const ENDPOINT_URL = 'https://bid.atmtd.com'; +const DEFAULT_BID_TTL = 30; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const spec = { + code: BIDDER, + aliases: ['atd'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + // will receive request bid. check if have necessary params for bidding + return bid && bid.hasOwnProperty('params') && bid.params.hasOwnProperty('siteId') && bid.params.siteId != null && bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty('banner') && typeof bid.mediaTypes.banner == 'object'; + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (!validBidRequests || !bidderRequest) { + return; + } + const siteId = validBidRequests[0].params.siteId; + const impressions = validBidRequests.map(bidRequest => { + if (bidRequest.params.hasOwnProperty('placementId')) { + return { + id: bidRequest.bidId, + adUnitCode: bidRequest.adUnitCode, + placement: bidRequest.params.placementId, + banner: { + format: bidRequest.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1] + })) + } + }; + } else { + return { + id: bidRequest.bidId, + adUnitCode: bidRequest.adUnitCode, + banner: { + format: bidRequest.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1] + })) + } + }; + } + }); + + // params from bid request + const openrtbRequest = { + id: bidderRequest.bidderRequestId, + imp: impressions, + site: { + id: siteId, + domain: bidderRequest.refererInfo?.domain, + page: bidderRequest.refererInfo?.page, + ref: bidderRequest.refererInfo?.ref + } + }; + const payloadString = JSON.stringify(openrtbRequest); + return { + method: 'POST', + url: ENDPOINT_URL + '/request', + data: payloadString, + options: { + contentType: 'application/json', + withCredentials: true, + crossOrigin: true + } + }; + }, + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + const response = (serverResponse || {}).body; + if (response && response.seatbid && response.seatbid[0].bid && response.seatbid[0].bid.length) { + var bidid = response.bidid; + response.seatbid.forEach(bidObj => { + bidObj.bid.forEach(bid => { + bidResponses.push({ + requestId: bid.impid, + cpm: bid.price, + ad: bid.adm, + meta: { + advertiserDomains: bid.adomain + }, + currency: DEFAULT_CURRENCY, + ttl: DEFAULT_BID_TTL, + creativeId: bid.crid, + width: bid.w, + height: bid.h, + netRevenue: DEFAULT_NET_REVENUE, + nurl: bid.nurl, + bidId: bidid + }); + }); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('automatad :: no valid responses to interpret'); + } + return bidResponses; + }, + onTimeout: function (timeoutData) { + const timeoutUrl = ENDPOINT_URL + '/timeout'; + spec.ajaxCall(timeoutUrl, null, JSON.stringify(timeoutData), { + method: 'POST', + withCredentials: true + }); + }, + onBidWon: function (bid) { + if (!bid.nurl) { + return; + } + const winCpm = bid.hasOwnProperty('originalCpm') ? bid.originalCpm : bid.cpm; + const winCurr = bid.hasOwnProperty('originalCurrency') && bid.hasOwnProperty('originalCpm') ? bid.originalCurrency : bid.currency; + const winUrl = bid.nurl.replace(/\$\{AUCTION_PRICE\}/, winCpm).replace(/\$\{AUCTION_IMP_ID\}/, bid.requestId).replace(/\$\{AUCTION_CURRENCY\}/, winCurr).replace(/\$\{AUCTON_BID_ID\}/, bid.bidId).replace(/\$\{AUCTION_ID\}/, bid.auctionId); + spec.ajaxCall(winUrl, null, null, { + method: 'GET', + withCredentials: true + }); + return true; + }, + ajaxCall: function (endpoint, callback, data) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + if (data) { + options.contentType = 'application/json'; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(endpoint, callback, data, options); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('automatadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/automatadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["axisBidAdapter"],{ + +/***/ "./modules/axisBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/axisBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + + + +const BIDDER_CODE = 'axis'; +const AD_URL = 'https://prebid.axis-marketplace.com/pbjs'; +const SYNC_URL = 'https://cs.axis-marketplace.com'; +const addPlacementType = (bid, bidderRequest, placement) => { + placement.integration = bid.params.integration; + placement.token = bid.params.token; +}; +const addCustomFieldsToPlacement = (bid, bidderRequest, placement) => { + const { + mediaTypes + } = bid; + if (placement.adFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + placement.pos = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].pos; + } else if (placement.adFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + placement.pos = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].pos; + placement.context = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].context; + } +}; +const placementProcessingFunction = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildPlacementProcessingFunction)({ + addPlacementType, + addCustomFieldsToPlacement +}); +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const request = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequestsBase)({ + adUrl: AD_URL, + validBidRequests, + bidderRequest, + placementProcessingFunction + }); + request.data.iabCat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.site.cat'); + return request; +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['integration', 'token'], 'every'), + buildRequests, + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => { + let syncType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let syncUrl = SYNC_URL + `/${syncType}?pbjs=1`; + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`; + } + } + if (uspConsent && uspConsent.consentString) { + syncUrl += `&ccpa=${uspConsent.consentString}`; + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + syncUrl += '&gpp=' + gppConsent.gppString; + syncUrl += '&gpp_sid=' + gppConsent.applicableSections.join(','); + } + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') ? 1 : 0; + syncUrl += `&coppa=${coppa}`; + return [{ + type: syncType, + url: syncUrl + }]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('axisBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/axisBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["axonixBidAdapter"],{ + +/***/ "./modules/axonixBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/axonixBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + +const BIDDER_CODE = 'axonix'; +const BIDDER_VERSION = '1.0.2'; +const CURRENCY = 'USD'; +const DEFAULT_REGION = 'us-east-1'; +function getBidFloor(bidRequest) { + let floorInfo = {}; + if (typeof bidRequest.getFloor === 'function') { + floorInfo = bidRequest.getFloor({ + currency: CURRENCY, + mediaType: '*', + size: '*' + }); + } + return floorInfo?.floor || 0; +} +function getPageUrl(bidRequest, bidderRequest) { + let pageUrl; + if (bidRequest.params.referrer) { + pageUrl = bidRequest.params.referrer; + } else { + pageUrl = bidderRequest.refererInfo.page; + } + return bidRequest.params.secure ? pageUrl.replace(/^http:/i, 'https:') : pageUrl; +} +function isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +function isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +function getURL(params, path) { + let { + supplyId, + region, + endpoint + } = params; + let url; + if (endpoint) { + url = endpoint; + } else if (region) { + url = `https://openrtb-${region}.axonix.com/supply/${path}/${supplyId}`; + } else { + url = `https://openrtb-${DEFAULT_REGION}.axonix.com/supply/${path}/${supplyId}`; + } + return url; +} +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + // video bid request validation + if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)) { + if (!bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].hasOwnProperty('mimes') || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].mimes) || bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].mimes.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('mimes are mandatory for video bid request. Ad Unit: ', JSON.stringify(bid)); + return false; + } + } + return !!(bid.params && bid.params.supplyId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + // device.connectiontype + let connection = window.navigator && (window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection); + let connectionType = 'unknown'; + let effectiveType = ''; + if (connection) { + if (connection.type) { + connectionType = connection.type; + } + if (connection.effectiveType) { + effectiveType = connection.effectiveType; + } + } + const requests = validBidRequests.map(validBidRequest => { + // app/site + let app; + let site; + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('app') === 'object') { + app = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('app'); + } else { + site = { + page: getPageUrl(validBidRequest, bidderRequest) + }; + } + const data = { + app, + site, + validBidRequest, + connectionType, + effectiveType, + devicetype: isMobile() ? 1 : isConnectedTV() ? 3 : 2, + bidfloor: getBidFloor(validBidRequest), + dnt: navigator.doNotTrack === 'yes' || navigator.doNotTrack === '1' || navigator.msDoNotTrack === '1' ? 1 : 0, + language: navigator.language, + prebidVersion: "9.45.0-pre", + screenHeight: screen.height, + screenWidth: screen.width, + tmax: bidderRequest.timeout, + ua: navigator.userAgent + }; + return { + method: 'POST', + url: getURL(validBidRequest.params, 'prebid'), + options: { + withCredentials: false, + contentType: 'application/json' + }, + data + }; + }); + return requests; + }, + interpretResponse: function (serverResponse) { + const response = serverResponse ? serverResponse.body : []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response)) { + return []; + } + const responses = []; + for (const resp of response) { + if (resp.requestId) { + responses.push(Object.assign(resp, { + ttl: 60 + })); + } + } + return responses; + }, + onTimeout: function (timeoutData) { + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(timeoutData, '0.params.0'); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(params)) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(getURL(params, 'prebid/timeout'), null, timeoutData[0], { + method: 'POST', + options: { + withCredentials: false, + contentType: 'application/json' + } + }); + } + }, + onBidWon: function (bid) { + const { + nurl + } = bid || {}; + if (bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(nurl, bid.originalCpm || bid.cpm)); + } + ; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('axonixBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/axonixBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["azerionedgeRtdProvider"],{ + +/***/ "./modules/azerionedgeRtdProvider.js": +/*!*******************************************!*\ + !*** ./modules/azerionedgeRtdProvider.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports STORAGE_KEY, storage, attachScript, getAudiences, setAudiencesToBidders, getBidRequestData, azerionedgeSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the Azerion provider to the real time data module of prebid. + * + * The {@link module:modules/realTimeData} module is required + * @module modules/azerionedgeRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + +/** + * @typedef {import('./rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const REAL_TIME_MODULE = 'realTimeData'; +const SUBREAL_TIME_MODULE = 'azerionedge'; +const STORAGE_KEY = 'ht-pa-v1-a'; +const IMPROVEDIGITAL_GVLID = '253'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBREAL_TIME_MODULE +}); + +/** + * Get script url to load + * + * @param {Object} config + * + * @return {String} + */ +function getScriptURL(config) { + const VERSION = 'v1'; + const key = config.params?.key; + const publisherPath = key ? `${key}/` : ''; + return `https://edge.hyth.io/js/${VERSION}/${publisherPath}azerion-edge.min.js`; +} + +/** + * Attach script tag to DOM + * + * @param {Object} config + * @param {Object} userConsent + * + * @return {void} + */ +function attachScript(config, userConsent) { + const script = getScriptURL(config); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(script, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, SUBREAL_TIME_MODULE, () => { + if (typeof window.azerionPublisherAudiences === 'function') { + const publisherConfig = config.params?.process || {}; + window.azerionPublisherAudiences({ + ...publisherConfig, + gdprApplies: userConsent?.gdpr?.gdprApplies, + gdprConsent: userConsent?.gdpr?.consentString, + uspConsent: userConsent?.usp + }); + } + }); +} + +/** + * Fetch audiences info from localStorage. + * + * @return {Array} Audience ids. + */ +function getAudiences() { + try { + const data = storage.getDataFromLocalStorage(STORAGE_KEY); + return JSON.parse(data).map(_ref => { + let { + id + } = _ref; + return id; + }); + } catch (_) { + return []; + } +} + +/** + * Pass audience data to configured bidders, using ORTB2 + * + * @param {Object} reqBidsConfigObj + * @param {Object} config + * @param {Array} audiences + * + * @return {void} + */ +function setAudiencesToBidders(reqBidsConfigObj, config, audiences) { + const defaultBidders = ['improvedigital']; + const bidders = config.params?.bidders || defaultBidders; + bidders.forEach(bidderCode => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.bidder, { + [bidderCode]: { + user: { + data: [{ + name: 'azerionedge', + ext: { + segtax: 4 + }, + segment: audiences.map(id => ({ + id + })) + }] + } + } + })); +} + +/** + * Module initialisation. + * + * @param {Object} config + * @param {Object} userConsent + * + * @return {boolean} + */ +function init(config, userConsent) { + attachScript(config, userConsent); + return true; +} + +/** + * Real-time user audiences retrieval + * + * @param {Object} reqBidsConfigObj + * @param {function} callback + * @param {Object} config + * @param {Object} userConsent + * + * @return {void} + */ +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + const audiences = getAudiences(); + if (audiences.length > 0) { + setAudiencesToBidders(reqBidsConfigObj, config, audiences); + } + callback(); +} + +/** @type {RtdSubmodule} */ +const azerionedgeSubmodule = { + name: SUBREAL_TIME_MODULE, + init: init, + getBidRequestData: getBidRequestData, + gvlid: IMPROVEDIGITAL_GVLID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)(REAL_TIME_MODULE, azerionedgeSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('azerionedgeRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/azerionedgeRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["beachfrontBidAdapter"],{ + +/***/ "./modules/beachfrontBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/beachfrontBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports VIDEO_ENDPOINT, BANNER_ENDPOINT, OUTSTREAM_SRC, SYNC_IFRAME_ENDPOINT, SYNC_IMAGE_ENDPOINT, VIDEO_TARGETING, DEFAULT_MIMES, SUPPORTED_USER_IDS, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/advangUtils/index.js */ "./libraries/advangUtils/index.js"); + + + + + + + +const ADAPTER_VERSION = '1.21'; +const ADAPTER_NAME = 'BFIO_PREBID'; +const OUTSTREAM = 'outstream'; +const CURRENCY = 'USD'; +const VIDEO_ENDPOINT = 'https://reachms.bfmio.com/bid.json?exchange_id='; +const BANNER_ENDPOINT = 'https://display.bfmio.com/prebid_display'; +const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js'; +const SYNC_IFRAME_ENDPOINT = 'https://sync.bfmio.com/sync_iframe'; +const SYNC_IMAGE_ENDPOINT = 'https://sync.bfmio.com/syncb'; +const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'placement', 'plcmt', 'skip', 'skipmin', 'skipafter']; +const DEFAULT_MIMES = ['video/mp4', 'application/javascript']; +const SUPPORTED_USER_IDS = [{ + key: 'tdid', + source: 'adserver.org', + rtiPartner: 'TDID', + queryParam: 'tdid' +}, { + key: 'idl_env', + source: 'liveramp.com', + rtiPartner: 'idl', + queryParam: 'idl' +}, { + key: 'uid2.id', + source: 'uidapi.com', + rtiPartner: 'UID2', + queryParam: 'uid2' +}, { + key: 'hadronId', + source: 'audigent.com', + atype: 1, + queryParam: 'hadronid' +}]; +let appId = ''; +const spec = { + code: 'beachfront', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid(bid) { + if ((0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBid)(bid)) { + if (!getVideoBidParam(bid, 'appId')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Beachfront: appId param is required for video bids.'); + return false; + } + if (!getVideoBidParam(bid, 'bidfloor')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Beachfront: bidfloor param is required for video bids.'); + return false; + } + } + if ((0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isBannerBid)(bid)) { + if (!getBannerBidParam(bid, 'appId')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Beachfront: appId param is required for banner bids.'); + return false; + } + if (!getBannerBidParam(bid, 'bidfloor')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Beachfront: bidfloor param is required for banner bids.'); + return false; + } + } + return true; + }, + buildRequests(bids, bidderRequest) { + let requests = []; + let videoBids = bids.filter(bid => isVideoBidValid(bid)); + let bannerBids = bids.filter(bid => isBannerBidValid(bid)); + videoBids.forEach(bid => { + appId = getVideoBidParam(bid, 'appId'); + requests.push({ + method: 'POST', + url: VIDEO_ENDPOINT + appId, + data: createVideoRequestData(bid, bidderRequest), + bidRequest: bid + }); + }); + if (bannerBids.length) { + appId = getBannerBidParam(bannerBids[0], 'appId'); + requests.push({ + method: 'POST', + url: BANNER_ENDPOINT, + data: createBannerRequestData(bannerBids, bidderRequest), + bidRequest: bannerBids + }); + } + return requests; + }, + interpretResponse(response, _ref) { + let { + bidRequest + } = _ref; + response = response.body; + if ((0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBid)(bidRequest)) { + if (!response || !response.bidPrice) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`No valid video bids from ${spec.code} bidder`); + return []; + } + let sizes = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoSizes)(bidRequest); + let firstSize = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getFirstSize)(sizes); + let context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.context'); + let responseType = getVideoBidParam(bidRequest, 'responseType') || 'both'; + let responseMeta = Object.assign({ + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + advertiserDomains: [] + }, response.meta); + let bidResponse = { + requestId: bidRequest.bidId, + cpm: response.bidPrice, + width: firstSize.w, + height: firstSize.h, + creativeId: response.crid || response.cmpId, + meta: responseMeta, + renderer: context === OUTSTREAM ? createRenderer(bidRequest) : null, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + currency: CURRENCY, + netRevenue: true, + ttl: 300 + }; + if (responseType === 'nurl' || responseType === 'both') { + bidResponse.vastUrl = response.url; + } + if (responseType === 'adm' || responseType === 'both') { + bidResponse.vastXml = response.vast; + } + return bidResponse; + } else { + if (!response || !response.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`No valid banner bids from ${spec.code} bidder`); + return []; + } + return response.filter(bid => bid.adm).map(bid => { + let request = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(bidRequest, req => req.adUnitCode === bid.slot); + let responseMeta = Object.assign({ + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + advertiserDomains: [] + }, bid.meta); + return { + requestId: request.bidId, + bidderCode: spec.code, + ad: bid.adm, + creativeId: bid.crid, + cpm: bid.price, + width: bid.w, + height: bid.h, + meta: responseMeta, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + currency: CURRENCY, + netRevenue: true, + ttl: 300 + }; + }); + } + }, + getUserSyncs(syncOptions) { + let serverResponses = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let uspConsent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + let gppConsent = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + let { + gdprApplies, + consentString = '' + } = gdprConsent; + let { + gppString = '', + applicableSections = [] + } = gppConsent; + let bannerResponse = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(serverResponses, res => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(res.body)); + let syncs = []; + let params = { + id: appId, + gdpr: gdprApplies ? 1 : 0, + gc: consentString, + gce: 1, + us_privacy: uspConsent, + gpp: gppString, + gpp_sid: Array.isArray(applicableSections) ? applicableSections.join(',') : '' + }; + if (bannerResponse) { + if (syncOptions.iframeEnabled) { + bannerResponse.body.filter(bid => bid.sync).forEach(bid => { + syncs.push({ + type: 'iframe', + url: bid.sync + }); + }); + } + } else if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `${SYNC_IFRAME_ENDPOINT}?ifg=1&${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.formatQS)(params)}` + }); + } else if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `${SYNC_IMAGE_ENDPOINT}?pid=144&${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.formatQS)(params)}` + }); + } + return syncs; + } +}; +function createRenderer(bidRequest) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bidRequest.bidId, + url: OUTSTREAM_SRC, + loaded: false + }); + renderer.setRender(bid => { + bid.renderer.push(() => { + window.Beachfront.Player(bid.adUnitCode, { + adTagUrl: bid.vastUrl, + width: bid.width, + height: bid.height, + expandInView: getPlayerBidParam(bidRequest, 'expandInView', false), + collapseOnComplete: getPlayerBidParam(bidRequest, 'collapseOnComplete', true), + progressColor: getPlayerBidParam(bidRequest, 'progressColor'), + adPosterColor: getPlayerBidParam(bidRequest, 'adPosterColor') + }); + }); + }); + return renderer; +} +function getVideoBidParam(bid, key) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.video.' + key) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.' + key); +} +function getBannerBidParam(bid, key) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.banner.' + key) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.' + key); +} +function getPlayerBidParam(bid, key, defaultValue) { + let param = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.player.' + key); + return param === undefined ? defaultValue : param; +} +function isVideoBidValid(bid) { + return (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBid)(bid) && getVideoBidParam(bid, 'appId') && getVideoBidParam(bid, 'bidfloor'); +} +function isBannerBidValid(bid) { + return (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isBannerBid)(bid) && getBannerBidParam(bid, 'appId') && getBannerBidParam(bid, 'bidfloor'); +} +function getEids(bid) { + return SUPPORTED_USER_IDS.map(getUserId(bid)).filter(x => x); +} +function getUserId(bid) { + return _ref2 => { + let { + key, + source, + rtiPartner, + atype + } = _ref2; + let id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `userId.${key}`); + return id ? formatEid(id, source, rtiPartner, atype) : null; + }; +} +function formatEid(id, source, rtiPartner, atype) { + let uid = { + id + }; + if (rtiPartner) { + uid.ext = { + rtiPartner + }; + } + if (atype) { + uid.atype = atype; + } + return { + source, + uids: [uid] + }; +} +function createVideoRequestData(bid, bidderRequest) { + let sizes = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoSizes)(bid); + let firstSize = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getFirstSize)(sizes); + let video = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoTargetingParams)(bid, VIDEO_TARGETING); + let appId = getVideoBidParam(bid, 'appId'); + let bidfloor = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidFloor)(bid); + let tagid = getVideoBidParam(bid, 'tagid'); + let topLocation = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getTopWindowLocation)(bidderRequest); + let eids = getEids(bid); + let ortb2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(bidderRequest.ortb2); + let payload = { + isPrebid: true, + appId: appId, + domain: document.location.hostname, + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifierStr)(), + imp: [{ + video: Object.assign({ + w: firstSize.w, + h: firstSize.h, + mimes: DEFAULT_MIMES + }, video), + bidfloor: bidfloor, + tagid: tagid, + secure: topLocation.protocol.indexOf('https') === 0 ? 1 : 0, + displaymanager: ADAPTER_NAME, + displaymanagerver: ADAPTER_VERSION + }], + site: { + ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2, 'site', {}), + page: topLocation.href, + domain: topLocation.hostname + }, + device: { + ua: navigator.userAgent, + language: navigator.language, + devicetype: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isMobile)() ? 1 : (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isConnectedTV)() ? 3 : 2, + dnt: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getDoNotTrack)() ? 1 : 0, + js: 1, + geo: {} + }, + app: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2, 'app'), + user: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2, 'user'), + cur: [CURRENCY] + }; + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (bidderRequest && bidderRequest.gdprConsent) { + let { + gdprApplies, + consentString + } = bidderRequest.gdprConsent; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'regs.ext.gdpr', gdprApplies ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'user.ext.consent', consentString); + } + if (bidderRequest && bidderRequest.gppConsent) { + let { + gppString, + applicableSections + } = bidderRequest.gppConsent; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'regs.gpp', gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'regs.gpp_sid', applicableSections); + } + if (bid.schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'source.ext.schain', bid.schain); + } + if (eids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'user.ext.eids', eids); + } + let connection = navigator.connection || navigator.webkitConnection; + if (connection && connection.effectiveType) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(payload, 'device.connectiontype', connection.effectiveType); + } + return payload; +} +function createBannerRequestData(bids, bidderRequest) { + let topLocation = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getTopWindowLocation)(bidderRequest); + let topReferrer = bidderRequest.refererInfo?.ref; + let slots = bids.map(bid => { + return { + slot: bid.adUnitCode, + id: getBannerBidParam(bid, 'appId'), + bidfloor: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidFloor)(bid), + tagid: getBannerBidParam(bid, 'tagid'), + sizes: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerSizes)(bid) + }; + }); + let ortb2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(bidderRequest.ortb2); + let payload = { + slots: slots, + ortb2: ortb2, + page: topLocation.href, + domain: topLocation.hostname, + search: topLocation.search, + secure: topLocation.protocol.indexOf('https') === 0 ? 1 : 0, + referrer: topReferrer, + ua: navigator.userAgent, + deviceOs: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getOsVersion)(), + isMobile: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isMobile)() ? 1 : 0, + dnt: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getDoNotTrack)() ? 1 : 0, + adapterVersion: ADAPTER_VERSION, + adapterName: ADAPTER_NAME + }; + if (bidderRequest && bidderRequest.uspConsent) { + payload.usPrivacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.gdprConsent) { + let { + gdprApplies, + consentString + } = bidderRequest.gdprConsent; + payload.gdpr = gdprApplies ? 1 : 0; + payload.gdprConsent = consentString; + } + if (bidderRequest && bidderRequest.gppConsent) { + let { + gppString, + applicableSections + } = bidderRequest.gppConsent; + payload.gpp = gppString; + payload.gppSid = applicableSections; + } + if (bids[0] && bids[0].schain) { + payload.schain = bids[0].schain; + } + SUPPORTED_USER_IDS.forEach(_ref3 => { + let { + key, + queryParam + } = _ref3; + let id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bids, `0.userId.${key}`); + if (id) { + payload[queryParam] = id; + } + }); + return payload; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('beachfrontBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["advangUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/beachfrontBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bedigitechBidAdapter"],{ + +/***/ "./modules/bedigitechBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/bedigitechBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + +const BEDIGITECH_CODE = 'bedigitech'; +const BEDIGITECH_ENDPOINT = 'https://bid.bedigitech.com/bid/pub_bid.php'; +const BEDIGITECH_REQUEST_METHOD = 'GET'; +const BEDIGITECH_CURRENCY = 'USD'; +let requestId = ''; +function interpretResponse(placementResponse, bids) { + const bid = { + id: placementResponse.id, + requestId: requestId || placementResponse.id, + bidderCode: 'bedigitech', + cpm: placementResponse.cpm, + ad: decodeURIComponent(placementResponse.ad), + width: placementResponse.width || 0, + height: placementResponse.height || 0, + currency: placementResponse.currency || BEDIGITECH_CURRENCY, + ttl: placementResponse.ttl || 300, + creativeId: placementResponse.crid, + requestTimestamp: placementResponse.requestTime, + timeToRespond: placementResponse.timeToRespond || 300, + netRevenue: placementResponse.netRevenue, + meta: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + } + }; + bids.push(bid); +} +const spec = { + code: BEDIGITECH_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: bid => { + requestId = ''; + requestId = bid.bidId; + return !!bid.params.placementId && !!bid.bidId && bid.bidder === 'bedigitech'; + }, + buildRequests: bidRequests => { + return bidRequests.map(bid => { + let url = BEDIGITECH_ENDPOINT; + const data = { + 'pid': bid.params.placementId + }; + return { + method: BEDIGITECH_REQUEST_METHOD, + url, + data, + options: { + contentType: 'application/json', + withCredentials: false, + crossOrigin: true + } + }; + }); + }, + interpretResponse: function (serverResponse) { + let bids = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse.body)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(serverResponse.body, function (placementResponse) { + interpretResponse(placementResponse, bids); + }); + } + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('bedigitechBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bedigitechBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["beopBidAdapter"],{ + +/***/ "./modules/beopBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/beopBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/keywords/keywords.js */ "./libraries/keywords/keywords.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'beop'; +const ENDPOINT_URL = 'https://hb.collectiveaudience.co/bid'; +const COOKIE_NAME = 'beopid'; +const TCF_VENDOR_ID = 666; +const validIdRegExp = /^[0-9a-fA-F]{24}$/; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + gvlid: TCF_VENDOR_ID, + aliases: ['bp'], + /** + * Test if the bid request is valid. + * + * @param {Bid} bid The Bid params + * @return boolean true if the bid request is valid (aka contains a valid accountId or networkId and is open for BANNER), false otherwise. + */ + isBidRequestValid: function (bid) { + const id = bid.params.accountId || bid.params.networkId; + if (id === null || typeof id === 'undefined') { + return false; + } + if (!validIdRegExp.test(id)) { + return false; + } + return bid.mediaTypes.banner !== null && typeof bid.mediaTypes.banner !== 'undefined'; + }, + /** + * Create a BeOp server request from a list of BidRequest + * + * @param {validBidRequests} validBidRequests The array of validated bidRequests + * @param {BidderRequest} bidderRequest Common params for each bidRequests + * @return ServerRequest Info describing the request to the BeOp's server + */ + buildRequests: function (validBidRequests, bidderRequest) { + const slots = validBidRequests.map(bid => beOpRequestSlotsMaker(bid, bidderRequest)); + const firstPartyData = bidderRequest.ortb2 || {}; + const psegs = firstPartyData.user?.ext?.permutive || firstPartyData.user?.ext?.data?.permutive || []; + const userBpSegs = firstPartyData.user?.ext?.bpsegs || firstPartyData.user?.ext?.data?.bpsegs || []; + const siteBpSegs = firstPartyData.site?.ext?.bpsegs || firstPartyData.site?.ext?.data?.bpsegs || []; + const pageUrl = getPageUrl(bidderRequest.refererInfo, window); + const gdpr = bidderRequest.gdprConsent; + const firstSlot = slots[0]; + const kwdsFromRequest = firstSlot.kwds; + let keywords = (0,_libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_1__.getAllOrtbKeywords)(bidderRequest.ortb2, kwdsFromRequest); + let beopid = ''; + if (storage.cookiesAreEnabled) { + beopid = storage.getCookie(COOKIE_NAME, undefined); + if (!beopid) { + beopid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + let expirationDate = new Date(); + expirationDate.setTime(expirationDate.getTime() + 86400 * 183 * 1000); + storage.setCookie(COOKIE_NAME, beopid, expirationDate.toUTCString()); + } + } else { + storage.setCookie(COOKIE_NAME, '', 0); + } + const payloadObject = { + at: new Date().toString(), + nid: firstSlot.nid, + nptnid: firstSlot.nptnid, + pid: firstSlot.pid, + bpsegs: userBpSegs.concat(siteBpSegs, psegs).map(item => item.toString()), + url: pageUrl, + lang: window.navigator.language || window.navigator.languages[0], + kwds: keywords, + dbg: false, + fg: beopid, + slts: slots, + is_amp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'referrerInfo.isAmp'), + gdpr_applies: gdpr ? gdpr.gdprApplies : false, + tc_string: gdpr && gdpr.gdprApplies ? gdpr.consentString : null, + eids: firstSlot.eids, + pv: "9.45.0-pre" + }; + const payloadString = JSON.stringify(payloadObject); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + interpretResponse: function (serverResponse, request) { + if (serverResponse && serverResponse.body && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(serverResponse.body.bids) && serverResponse.body.bids.length > 0) { + return serverResponse.body.bids; + } + return []; + }, + onTimeout: function (timeoutData) { + if (timeoutData === null || typeof timeoutData === 'undefined' || Object.keys(timeoutData).length === 0) { + return; + } + let trackingParams = buildTrackingParams(timeoutData, 'timeout', timeoutData.timeout); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(BIDDER_CODE + ': timed out request'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + hostname: 't.collectiveaudience.co', + pathname: '/bid', + search: trackingParams + })); + }, + onBidWon: function (bid) { + if (bid === null || typeof bid === 'undefined' || Object.keys(bid).length === 0) { + return; + } + let trackingParams = buildTrackingParams(bid, 'won', bid.cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(BIDDER_CODE + ': won request'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + hostname: 't.collectiveaudience.co', + pathname: '/bid', + search: trackingParams + })); + }, + /** + * User syncs. + * + * @param {*} syncOptions Publisher prebid configuration. + * @param {*} serverResponses A successful response from the server. + * @return {UserSync[]} An array of syncs that should be executed. + */ + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (serverResponses.length > 0) { + const body = serverResponses[0].body; + if (syncOptions.iframeEnabled && Array.isArray(body.sync_frames)) { + body.sync_frames.forEach(url => { + syncs.push({ + type: 'iframe', + url + }); + }); + } + if (syncOptions.pixelEnabled && Array.isArray(body.sync_pixels)) { + body.sync_pixels.forEach(url => { + syncs.push({ + type: 'image', + url + }); + }); + } + } + return syncs; + } +}; +function buildTrackingParams(data, info, value) { + let params = Array.isArray(data.params) ? data.params[0] : data.params; + const pageUrl = getPageUrl(null, window); + return { + pid: params.accountId ?? data.ad?.match(/account: \“([a-f\d]{24})\“/)?.[1] ?? '', + nid: params.networkId, + nptnid: params.networkPartnerId, + bid: data.bidId || data.requestId, + sl_n: data.adUnitCode, + se_ca: 'bid', + se_ac: info, + se_va: value, + url: pageUrl, + pv: "9.45.0-pre" + }; +} +function beOpRequestSlotsMaker(bid, bidderRequest) { + const bannerSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.sizes'); + const publisherCurrency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_4__.getCurrencyFromBidderRequest)(bidderRequest) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getValue)(bid.params, 'currency') || 'EUR'; + let floor; + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: publisherCurrency, + mediaType: 'banner', + size: [1, 1] + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorInfo) && floorInfo.currency === publisherCurrency && !isNaN(parseFloat(floorInfo.floor))) { + floor = parseFloat(floorInfo.floor); + } + } + return { + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bannerSizes) ? bannerSizes : bid.sizes, + flr: floor, + pid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getValue)(bid.params, 'accountId'), + kwds: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getValue)(bid.params, 'keywords'), + nid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getValue)(bid.params, 'networkId'), + nptnid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getValue)(bid.params, 'networkPartnerId'), + bid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidId', bid), + brid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidderRequestId', bid), + name: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('adUnitCode', bid), + tid: bid.ortb2Imp?.ext?.tid || '', + brc: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidRequestsCount', bid), + bdrc: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidderRequestCount', bid), + bwc: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('bidderWinsCount', bid), + eids: bid.userIdAsEids + }; +} +const protocolRelativeRegExp = /^\/\//; +function isProtocolRelativeUrl(url) { + return url && url.match(protocolRelativeRegExp) != null; +} +const withProtocolRegExp = /[a-z]{1,}:\/\//; +function isNoProtocolUrl(url) { + return url && url.match(withProtocolRegExp) == null; +} +function ensureProtocolInUrl(url, defaultProtocol) { + if (isProtocolRelativeUrl(url)) { + return `${defaultProtocol}${url}`; + } else if (isNoProtocolUrl(url)) { + return `${defaultProtocol}//${url}`; + } + return url; +} + +/** + * sometimes trying to access a field (protected?) triggers an exception + * Ex deepAccess(window, 'top.location.href') might throw if it crosses origins + * so here is a lenient version + */ +function safeDeepAccess(obj, path) { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(obj, path); + } catch (_e) { + return null; + } +} +function getPageUrl(refererInfo, window) { + refererInfo = refererInfo || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)(); + let pageUrl = refererInfo.canonicalUrl || safeDeepAccess(window, 'top.location.href') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(window, 'location.href'); + // Ensure the protocol is present (looks like sometimes the extracted pageUrl misses it) + if (pageUrl != null) { + const defaultProtocol = safeDeepAccess(window, 'top.location.protocol') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(window, 'location.protocol'); + pageUrl = ensureProtocolInUrl(pageUrl, defaultProtocol); + } + return pageUrl; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('beopBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","keywords","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/beopBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["betweenBidAdapter"],{ + +/***/ "./modules/betweenBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/betweenBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'between'; +let ENDPOINT = 'https://ads.betweendigital.com/adjson?t=prebid'; +const CODE_TYPES = ['inpage', 'preroll', 'midroll', 'postroll']; +const spec = { + code: BIDDER_CODE, + aliases: ['btw'], + supportedMediaTypes: ['banner', 'video'], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return Boolean(bid.params.s); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let requests = []; + const gdprConsent = bidderRequest && bidderRequest.gdprConsent; + const refInfo = bidderRequest?.refererInfo; + validBidRequests.forEach(i => { + const video = i.mediaTypes && i.mediaTypes.video; + let params = { + eids: getUsersIds(i), + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)((0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__.getAdUnitSizes)(i)), + jst: 'hb', + ord: Math.random() * 10000000000000000, + tz: getTz(), + fl: getFl(), + rr: getRr(), + s: i.params && i.params.s, + bidid: i.bidId, + transactionid: i.ortb2Imp?.ext?.tid, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionid: i.auctionId + }; + if (video) { + params.mediaType = 2; + params.maxd = video.maxd; + params.mind = video.mind; + params.pos = 'atf'; + params.jst = 'pvc'; + params.codeType = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(CODE_TYPES, video.codeType) ? video.codeType : 'inpage'; + } + if (i.params.itu !== undefined) { + params.itu = i.params.itu; + } + params.cur = i.params.cur || 'USD'; + if (i.params.subid !== undefined) { + params.subid = i.params.subid; + } + if (i.params.click3rd !== undefined) { + params.click3rd = i.params.click3rd; + } + if (i.params.pubdata !== undefined) { + for (let key in i.params.pubdata) { + params['pubside_macro[' + key + ']'] = encodeURIComponent(i.params.pubdata[key]); + } + } + if (i.schain) { + params.schain = encodeToBase64WebSafe(JSON.stringify(i.schain)); + } + + // TODO: is 'page' the right value here? + if (refInfo && refInfo.page) params.ref = refInfo.page; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies !== 'undefined') { + params.gdprApplies = !!gdprConsent.gdprApplies; + } + if (typeof gdprConsent.consentString !== 'undefined') { + params.consentString = gdprConsent.consentString; + } + } + requests.push({ + data: params + }); + }); + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(requests) + }; + // return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + for (var i = 0; i < serverResponse.body.length; i++) { + let bidResponse = { + requestId: serverResponse.body[i].bidid, + cpm: serverResponse.body[i].cpm || 0, + width: serverResponse.body[i].w, + height: serverResponse.body[i].h, + vastXml: serverResponse.body[i].vastXml, + mediaType: serverResponse.body[i].mediaType, + ttl: serverResponse.body[i].ttl, + creativeId: serverResponse.body[i].creativeid, + currency: serverResponse.body[i].currency || 'USD', + netRevenue: serverResponse.body[i].netRevenue || true, + ad: serverResponse.body[i].ad, + meta: { + advertiserDomains: serverResponse.body[i].adomain ? serverResponse.body[i].adomain : [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses) { + let syncs = []; + /* console.log(syncOptions,serverResponses) + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: 'https://acdn.adnxs.com/dmp/async_usersync.html' + }); + } + if (syncOptions.pixelEnabled && serverResponses.length > 0) { + syncs.push({ + type: 'image', + url: serverResponses[0].body.userSync.url + }); + } */ + + // syncs.push({ + // type: 'iframe', + // url: 'https://acdn.adnxs.com/dmp/async_usersync.html' + // }); + syncs.push({ + type: 'iframe', + url: 'https://ads.betweendigital.com/sspmatch-iframe' + }, { + type: 'image', + url: 'https://ads.betweendigital.com/sspmatch' + }); + return syncs; + } +}; +function getUsersIds(_ref) { + let { + userIdAsEids + } = _ref; + return userIdAsEids && userIdAsEids.length !== 0 ? userIdAsEids : []; +} +function getRr() { + try { + var td = top.document; + var rr = td.referrer; + } catch (err) { + return false; + } + if (typeof rr != 'undefined' && rr.length > 0) { + return encodeURIComponent(rr); + } else if (typeof rr != 'undefined' && rr == '') { + return 'direct'; + } +} +function getFl() { + if (navigator.plugins !== undefined && navigator.plugins !== null) { + if (navigator.plugins['Shockwave Flash'] !== undefined && navigator.plugins['Shockwave Flash'] !== null && typeof navigator.plugins['Shockwave Flash'] === 'object') { + var description = navigator.plugins['Shockwave Flash'].description; + if (description && !(navigator.mimeTypes !== undefined && navigator.mimeTypes['application/x-shockwave-flash'] && !navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin)) { + description = description.replace(/^.*\s+(\S+\s+\S+$)/, '$1').replace(/^(.*)\..*$/, '$1'); + return parseInt(description, 10); + } + } + } + return 0; +} +function getTz() { + return new Date().getTimezoneOffset(); +} +function encodeToBase64WebSafe(string) { + return btoa(string).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); +} + +/* +function get_pubdata(adds) { + if (adds !== undefined && adds.pubdata !== undefined) { + let index = 0; + let url = ''; + for(var key in adds.pubdata) { + if (index == 0) { + url = url + encodeURIComponent('pubside_macro[' + key + ']') + '=' + encodeURIComponent(adds.pubdata[key]); + index++; + } else { + url = url + '&' + encodeURIComponent('pubside_macro[' + key + ']') + '=' + encodeURIComponent(adds.pubdata[key]); + } + } + return url; + } +} +*/ + +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('betweenBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/betweenBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["beyondmediaBidAdapter"],{ + +/***/ "./modules/beyondmediaBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/beyondmediaBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'beyondmedia'; +const AD_URL = 'https://backend.andbeyond.media/pbjs'; +const SYNC_URL = 'https://cookies.andbeyond.media'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['placementId']), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('beyondmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/beyondmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bidResponseFilter"],{ + +/***/ "./modules/bidResponseFilter/index.js": +/*!********************************************!*\ + !*** ./modules/bidResponseFilter/index.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MODULE_NAME, BID_CATEGORY_REJECTION_REASON, BID_ADV_DOMAINS_REJECTION_REASON, BID_ATTR_REJECTION_REASON, reset, addBidResponseHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); + + + + +const MODULE_NAME = 'bidResponseFilter'; +const BID_CATEGORY_REJECTION_REASON = 'Category is not allowed'; +const BID_ADV_DOMAINS_REJECTION_REASON = 'Adv domain is not allowed'; +const BID_ATTR_REJECTION_REASON = 'Attr is not allowed'; +let moduleConfig; +let enabled = false; +function init() { + _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig(MODULE_NAME, cfg => { + moduleConfig = cfg[MODULE_NAME]; + if (enabled && !moduleConfig) { + reset(); + } else if (!enabled && moduleConfig) { + enabled = true; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.getHook)('addBidResponse').before(addBidResponseHook); + } + }); +} +function reset() { + enabled = false; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.getHook)('addBidResponse').getHooks({ + hook: addBidResponseHook + }).remove(); +} +function addBidResponseHook(next, adUnitCode, bid, reject) { + let index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_2__.auctionManager.index; + const { + bcat = [], + badv = [] + } = index.getOrtb2(bid) || {}; + const battr = index.getBidRequest(bid)?.ortb2Imp[bid.mediaType]?.battr || index.getAdUnit(bid)?.ortb2Imp[bid.mediaType]?.battr || []; + const catConfig = { + enforce: true, + blockUnknown: true, + ...(moduleConfig?.cat || {}) + }; + const advConfig = { + enforce: true, + blockUnknown: true, + ...(moduleConfig?.adv || {}) + }; + const attrConfig = { + enforce: true, + blockUnknown: true, + ...(moduleConfig?.attr || {}) + }; + const { + primaryCatId, + secondaryCatIds = [], + advertiserDomains = [], + attr: metaAttr + } = bid.meta || {}; + + // checking if bid fulfills ortb2 fields rules + if (catConfig.enforce && bcat.some(category => [primaryCatId, ...secondaryCatIds].includes(category)) || catConfig.blockUnknown && !primaryCatId) { + reject(BID_CATEGORY_REJECTION_REASON); + } else if (advConfig.enforce && badv.some(domain => advertiserDomains.includes(domain)) || advConfig.blockUnknown && !advertiserDomains.length) { + reject(BID_ADV_DOMAINS_REJECTION_REASON); + } else if (attrConfig.enforce && battr.includes(metaAttr) || attrConfig.blockUnknown && !metaAttr) { + reject(BID_ATTR_REJECTION_REASON); + } else { + return next(adUnitCode, bid, reject); + } +} +init(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('bidResponseFilter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bidResponseFilter/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bidViewability"],{ + +/***/ "./modules/bidViewability.js": +/*!***********************************!*\ + !*** ./modules/bidViewability.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports isBidAdUnitCodeMatchingSlot, getMatchingWinningBidForGPTSlot, fireViewabilityPixels, logWinningBidNotFound, impressionViewableHandler, init */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/dfpUtils/dfpUtils.js */ "./libraries/dfpUtils/dfpUtils.js"); + +// This module, when included, will trigger a BID_VIEWABLE event which can be consumed by Bidders and Analytics adapters +// GPT API is used to find when a bid is viewable, https://developers.google.com/publisher-tag/reference#googletag.events.impressionviewableevent +// Does not work with other than GPT integration + + + + + + + + + +const MODULE_NAME = 'bidViewability'; +const CONFIG_ENABLED = 'enabled'; +const CONFIG_FIRE_PIXELS = 'firePixels'; +const CONFIG_CUSTOM_MATCH = 'customMatchFunction'; +const BID_VURL_ARRAY = 'vurls'; +const GPT_IMPRESSION_VIEWABLE_EVENT = 'impressionViewable'; +let isBidAdUnitCodeMatchingSlot = (bid, slot) => { + return slot.getAdUnitPath() === bid.adUnitCode || slot.getSlotElementId() === bid.adUnitCode; +}; +let getMatchingWinningBidForGPTSlot = (globalModuleConfig, slot) => { + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_0__.find)((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().getAllWinningBids(), + // supports custom match function from config + bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(globalModuleConfig[CONFIG_CUSTOM_MATCH]) ? globalModuleConfig[CONFIG_CUSTOM_MATCH](bid, slot) : isBidAdUnitCodeMatchingSlot(bid, slot)) || null; +}; +let fireViewabilityPixels = (globalModuleConfig, bid) => { + if (globalModuleConfig[CONFIG_FIRE_PIXELS] === true && bid.hasOwnProperty(BID_VURL_ARRAY)) { + let queryParams = (0,_libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.gdprParams)(); + const uspConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.uspDataHandler.getConsentData(); + if (uspConsent) { + queryParams.us_privacy = uspConsent; + } + const gppConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.gppDataHandler.getConsentData(); + if (gppConsent) { + // TODO - need to know what to set here for queryParams... + } + bid[BID_VURL_ARRAY].forEach(url => { + // add '?' if not present in URL + if (Object.keys(queryParams).length > 0 && url.indexOf('?') === -1) { + url += '?'; + } + // append all query params, `&key=urlEncoded(value)` + url += Object.keys(queryParams).reduce((prev, key) => prev += `&${key}=${encodeURIComponent(queryParams[key])}`, ''); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(url); + }); + } +}; +let logWinningBidNotFound = slot => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`bid details could not be found for ${slot.getSlotElementId()}, probable reasons: a non-prebid bid is served OR check the prebid.AdUnit.code to GPT.AdSlot relation.`); +}; +let impressionViewableHandler = (globalModuleConfig, slot, event) => { + let respectiveBid = getMatchingWinningBidForGPTSlot(globalModuleConfig, slot); + if (respectiveBid === null) { + logWinningBidNotFound(slot); + } else { + // if config is enabled AND VURL array is present then execute each pixel + fireViewabilityPixels(globalModuleConfig, respectiveBid); + // trigger respective bidder's onBidViewable handler + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].callBidViewableBidder(respectiveBid.adapterCode || respectiveBid.bidder, respectiveBid); + if (respectiveBid.deferBilling) { + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].triggerBilling(respectiveBid); + } + + // emit the BID_VIEWABLE event with bid details, this event can be consumed by bidders and analytics pixels + _src_events_js__WEBPACK_IMPORTED_MODULE_6__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_VIEWABLE, respectiveBid); + } +}; +let init = () => { + _src_events_js__WEBPACK_IMPORTED_MODULE_6__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.AUCTION_INIT, () => { + // read the config for the module + const globalModuleConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig(MODULE_NAME) || {}; + // do nothing if module-config.enabled is not set to true + // this way we are adding a way for bidders to know (using pbjs.getConfig('bidViewability').enabled === true) whether this module is added in build and is enabled + if (globalModuleConfig[CONFIG_ENABLED] !== true) { + return; + } + // add the GPT event listener + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(() => { + window.googletag.pubads().addEventListener(GPT_IMPRESSION_VIEWABLE_EVENT, function (event) { + impressionViewableHandler(globalModuleConfig, event.slot, event); + }); + }); + }); +}; +init(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('bidViewability'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["dfpUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bidViewability.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bidViewabilityIO"],{ + +/***/ "./modules/bidViewabilityIO.js": +/*!*************************************!*\ + !*** ./modules/bidViewabilityIO.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports IAB_VIEWABLE_DISPLAY_THRESHOLD, IAB_VIEWABLE_DISPLAY_LARGE_THRESHOLD, isSupportedMediaType, getViewableOptions, markViewed, viewCallbackFactory, init */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + +const MODULE_NAME = 'bidViewabilityIO'; +const CONFIG_ENABLED = 'enabled'; + +// IAB numbers from: https://support.google.com/admanager/answer/4524488?hl=en +const IAB_VIEWABLE_DISPLAY_TIME = 1000; +const IAB_VIEWABLE_DISPLAY_LARGE_PX = 242000; +const IAB_VIEWABLE_DISPLAY_THRESHOLD = 0.5; +const IAB_VIEWABLE_DISPLAY_LARGE_THRESHOLD = 0.3; +const CLIENT_SUPPORTS_IO = window.IntersectionObserver && window.IntersectionObserverEntry && window.IntersectionObserverEntry.prototype && 'intersectionRatio' in window.IntersectionObserverEntry.prototype; +const supportedMediaTypes = ['banner']; +let isSupportedMediaType = bid => { + return supportedMediaTypes.indexOf(bid.mediaType) > -1; +}; +let _logMessage = message => { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(`${MODULE_NAME}: ${message}`); +}; + +// returns options for the iO that detects if the ad is viewable +let getViewableOptions = bid => { + if (bid.mediaType === 'banner') { + return { + root: null, + rootMargin: '0px', + threshold: bid.width * bid.height > IAB_VIEWABLE_DISPLAY_LARGE_PX ? IAB_VIEWABLE_DISPLAY_LARGE_THRESHOLD : IAB_VIEWABLE_DISPLAY_THRESHOLD + }; + } +}; + +// markViewed returns a function what will be executed when an ad satisifes the viewable iO +let markViewed = (bid, entry, observer) => { + return () => { + observer.unobserve(entry.target); + _src_events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BID_VIEWABLE, bid); + _logMessage(`id: ${entry.target.getAttribute('id')} code: ${bid.adUnitCode} was viewed`); + }; +}; + +// viewCallbackFactory creates the callback used by the viewable IntersectionObserver. +// When an ad comes into view, it sets a timeout for a function to be executed +// when that ad would be considered viewed per the IAB specs. The bid that was rendered +// is passed into the factory, so it can pass it into markViewed, so that it can be included +// in the BID_VIEWABLE event data. If the ad leaves view before the timer goes off, the setTimeout +// is cancelled, an the bid will not be marked as viewed. There's probably some kind of race-ish +// thing going on between IO and setTimeout but this isn't going to be perfect, it's just going to +// be pretty good. +let viewCallbackFactory = bid => { + return (entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + _logMessage(`viewable timer starting for id: ${entry.target.getAttribute('id')} code: ${bid.adUnitCode}`); + entry.target.view_tracker = setTimeout(markViewed(bid, entry, observer), IAB_VIEWABLE_DISPLAY_TIME); + } else { + _logMessage(`id: ${entry.target.getAttribute('id')} code: ${bid.adUnitCode} is out of view`); + if (entry.target.view_tracker) { + clearTimeout(entry.target.view_tracker); + _logMessage(`viewable timer stopped for id: ${entry.target.getAttribute('id')} code: ${bid.adUnitCode}`); + } + } + }); + }; +}; +let init = () => { + _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(MODULE_NAME, conf => { + if (conf[MODULE_NAME][CONFIG_ENABLED] && CLIENT_SUPPORTS_IO) { + // if the module is enabled and the browser supports Intersection Observer, + // then listen to AD_RENDER_SUCCEEDED to setup IO's for supported mediaTypes + _src_events_js__WEBPACK_IMPORTED_MODULE_1__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.AD_RENDER_SUCCEEDED, _ref => { + let { + doc, + bid, + id + } = _ref; + if (isSupportedMediaType(bid)) { + let viewable = new IntersectionObserver(viewCallbackFactory(bid), getViewableOptions(bid)); + let element = document.getElementById(bid.adUnitCode); + viewable.observe(element); + } + }); + } + }); +}; +init(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('bidViewabilityIO'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bidViewabilityIO.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["biddoBidAdapter"],{ + +/***/ "./modules/biddoBidAdapter.js": +/*!************************************!*\ + !*** ./modules/biddoBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_biddoInvamiaUtils_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/biddoInvamiaUtils/index.js */ "./libraries/biddoInvamiaUtils/index.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'biddo'; +const ENDPOINT_URL = 'https://ad.adopx.net/delivery/impress'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bidRequest) { + return !!bidRequest.params.zoneId; + }, + buildRequests: function (validBidRequests) { + return validBidRequests.flatMap(bidRequest => (0,_libraries_biddoInvamiaUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.buildBannerRequests)(bidRequest, ENDPOINT_URL)); + }, + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + return (0,_libraries_biddoInvamiaUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.interpretBannerResponse)(serverResponse, bidderRequest); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('biddoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["biddoInvamiaUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/biddoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bidglassBidAdapter"],{ + +/***/ "./modules/bidglassBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/bidglassBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'bidglass'; +const spec = { + code: BIDDER_CODE, + aliases: ['bg'], + // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.adUnitId; // only adUnitId is required + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest request by bidder + * @return {ServerRequest} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + /* + Sample array entry for validBidRequests[]: + [{ + "bidder": "bidglass", + "bidId": "51ef8751f9aead", + "params": { + "adUnitId": 11, + ... + }, + "adUnitCode": "div-gpt-ad-1460505748561-0", + "transactionId": "d7b773de-ceaa-484d-89ca-d9f51b8d61ec", + "sizes": [[320,50],[300,250],[300,600]], + "bidderRequestId": "418b37f85e772c", + "auctionId": "18fd8b8b0bd757", + "bidRequestsCount": 1 + }] + */ + + let imps = []; + let getReferer = function () { + return window === window.top ? window.location.href : window.parent === window.top ? document.referrer : null; + }; + let getOrigins = function () { + var ori = [window.location.protocol + '//' + window.location.hostname]; + if (window.location.ancestorOrigins) { + for (var i = 0; i < window.location.ancestorOrigins.length; i++) { + ori.push(window.location.ancestorOrigins[i]); + } + } else if (window !== window.top) { + // Derive the parent origin + var parts = document.referrer.split('/'); + ori.push(parts[0] + '//' + parts[2]); + if (window.parent !== window.top) { + // Additional unknown origins exist + ori.push('null'); + } + } + return ori; + }; + let bidglass = window['bidglass']; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(validBidRequests, function (bid) { + bid.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.sizes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.sizes[0]) ? bid.sizes : [bid.sizes]; + bid.sizes = bid.sizes.filter(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(size)); + var adUnitId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('adUnitId', bid.params); + var options = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bid.params); + delete options.adUnitId; + + // Merge externally set targeting params + if (typeof bidglass === 'object' && bidglass.getTargeting) { + let targeting = bidglass.getTargeting(adUnitId, options.targeting); + if (targeting && Object.keys(targeting).length > 0) options.targeting = targeting; + } + + // Stuff to send: [bid id, sizes, adUnitId, options] + imps.push({ + bidId: bid.bidId, + sizes: bid.sizes, + adUnitId: adUnitId, + options: options + }); + }); + + // Consent data + const gdprConsentObj = bidderRequest && bidderRequest.gdprConsent; + const gppConsentObj = bidderRequest && bidderRequest.gppConsent; + const gppApplicableSections = gppConsentObj && gppConsentObj.applicableSections; + const ortb2Regs = bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.regs; + const ortb2Gpp = ortb2Regs && ortb2Regs.gpp; + + // Build bid request data to be sent to ad server + const bidReq = { + reqId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getUniqueIdentifierStr)(), + imps: imps, + ref: getReferer(), + ori: getOrigins(), + // GDPR applies? numeric boolean + gdprApplies: gdprConsentObj && gdprConsentObj.gdprApplies ? 1 : '', + // IAB TCF consent string + gdprConsent: gdprConsentObj && gdprConsentObj.consentString || '', + // IAB GPP consent string + gppString: gppConsentObj && gppConsentObj.gppString || ortb2Gpp || '', + // GPP Applicable Section IDs + gppSid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(gppApplicableSections) && gppApplicableSections.length ? gppApplicableSections.join(',') : ortb2Gpp && ortb2Regs.gpp_sid || '' + }; + let url = 'https://bid.glass/ad/hb.php?' + `src=prebid_prebid_9.45.0-pre`; + return { + method: 'POST', + url: url, + data: JSON.stringify(bidReq), + options: { + contentType: 'text/plain', + withCredentials: false + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {ServerRequest} serverRequest The original server request for this bid + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, serverRequest) { + const bidResponses = []; + const bidReq = JSON.parse(serverRequest.data); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(serverResponse.body.bidResponses, function (serverBid) { + const bidResponse = { + requestId: serverBid.requestId, + cpm: parseFloat(serverBid.cpm), + width: parseInt(serverBid.width, 10), + height: parseInt(serverBid.height, 10), + creativeId: serverBid.creativeId, + dealId: serverBid.dealId || null, + currency: serverBid.currency || 'USD', + mediaType: serverBid.mediaType || 'banner', + netRevenue: true, + ttl: serverBid.ttl || 10, + // Replace the &replaceme placeholder in the returned + `; + if (bid.mediaType !== 'banner') { + // in case this is a video + bid.mediaType = 'banner'; + delete bid.renderer; + delete bid.vastUrl; + delete bid.vastXml; + bid.width = 1; + bid.height = 1; + } + }); + return bids; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent) { + if (!_appnexusBidAdapter_js__WEBPACK_IMPORTED_MODULE_0__.spec.getUserSyncs) { + return []; + } + return _appnexusBidAdapter_js__WEBPACK_IMPORTED_MODULE_0__.spec.getUserSyncs(syncOptions, responses, gdprConsent); + }, + /** + * Add element selector to javascript tracker to improve native viewability + * @param {Bid} bid + */ + onBidWon: function (bid) { + if (!_appnexusBidAdapter_js__WEBPACK_IMPORTED_MODULE_0__.spec.onBidWon) { + return; + } + _appnexusBidAdapter_js__WEBPACK_IMPORTED_MODULE_0__.spec.onBidWon(bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('big-richmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","chunk","keywords","appnexusUtils","categoryTranslationMapping","transformParamsUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/big-richmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bitmediaBidAdapter"],{ + +/***/ "./modules/bitmediaBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/bitmediaBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT_URL, STORAGE, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + +const BIDDER_CODE = 'bitmedia'; +const ENDPOINT_URL = 'https://cdn.bmcdn7.com/prebid/'; +const AVAILABLE_SIZES = [[320, 100], [125, 125], [250, 250], [728, 90], [468, 60], [300, 100], [300, 250], [120, 240], [320, 1200], [200, 200], [160, 600], [336, 280], [120, 600], [300, 600], [180, 150], [320, 50], [468, 90], [970, 90], [250, 100]]; +const SIZE_SET = new Set(AVAILABLE_SIZES.map(_ref => { + let [w, h] = _ref; + return `${w}x${h}`; +})); +const DEFAULT_TTL = 30; // seconds +const DEFAULT_CURRENCY = 'USD'; +const ALLOWED_CURRENCIES = ['USD']; +const DEFAULT_NET_REVENUE = true; +const PREBID_VERSION = "9.45.0-pre"; +const ADAPTER_VERSION = '1.0'; +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const USER_FINGERPRINT_KEY = 'bitmedia_fid'; +const _handleOnBidWon = endpoint => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, `____handle bid won____`, endpoint); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(endpoint); +}; +const _getFidFromBitmediaFid = bitmediaFid => { + try { + const decoded = atob(bitmediaFid); + const parsed = JSON.parse(decoded); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Parsed bitmedia_fid', parsed); + return parsed.fid || null; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, 'Failed to parse bitmedia_fid', e); + return null; + } +}; +const _getBidFloor = (bid, size) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, '[Bid Floor] Retrieving bid floor for bid:', bid, size); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + let floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + size: size || '*' + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, '[Bid Floor] Floor data received:', floor); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, '[Bid Floor] Valid floor found:', floor); + return floor.floor; + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, '[Bid Floor] Returning null for bid floor.'); + return null; +}; +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_TTL, + currency: DEFAULT_CURRENCY, + // Only one currency available + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER + }, + imp(buildImp, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Building imp object for bidRequest', bidRequest); + const sizes = bidRequest.sizes; + const validSizes = sizes.filter(_ref2 => { + let [w, h] = _ref2; + return SIZE_SET.has(`${w}x${h}`); + }); + const imps = validSizes.map(size => { + const imp = { + id: bidRequest.bidId, + tagid: bidRequest.params.adUnitID, + banner: { + w: size[0], + h: size[1] + } + }; + const floor = _getBidFloor(bidRequest, size); + if (floor) { + imp.bidfloor = floor; + imp.bidfloorcur = DEFAULT_CURRENCY; + } + return imp; + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Result imp objects for bidRequest', imps); + // Should hasOwnProperty id. + return { + id: bidRequest.bidId, + imps + }; + }, + request(buildRequest, imps, bidderRequest, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Building request with imps and bidderRequest', imps, bidderRequest); + const requestImps = imps[0].imps; // Unpacking: each imp has the same id, but different banner size + + const reqData = { + ...bidderRequest.ortb2, + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + imp: requestImps, + cur: [context.currency], + tmax: bidderRequest.timeout, + ext: { + ...bidderRequest.ortb2.ext, + adapter_version: ADAPTER_VERSION, + prebid_version: PREBID_VERSION + } + }; + let userId = null; + let bitmediaFid = null; + if (STORAGE.hasLocalStorage()) { + bitmediaFid = STORAGE.getDataFromLocalStorage(USER_FINGERPRINT_KEY); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Fingerprint in localstorage', bitmediaFid); + } + if (!bitmediaFid && STORAGE.cookiesAreEnabled()) { + bitmediaFid = STORAGE.getCookie(USER_FINGERPRINT_KEY); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Fingerprint in cookies', bitmediaFid); + } + if (bitmediaFid) { + userId = _getFidFromBitmediaFid(bitmediaFid); + } + if (userId) { + reqData.user = reqData.user || {}; + reqData.user.id = userId; + } + return reqData; + }, + bidResponse(buildBidResponse, bid, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Processing bid response in converter', bid); + const bidResponse = { + requestId: bid.impid, + cpm: bid.price, + currency: bid.cur || context.currency, + width: bid.w, + height: bid.h, + ad: bid.adm, + ttl: bid.exp || context.ttl, + creativeId: bid.crid, + netRevenue: context.netRevenue, + meta: { + advertiserDomains: bid.adomain || [] + }, + nurl: bid.nurl || bid.burl, + mediaType: context.mediaType + }; + return bidResponse; + } +}); +const isBidRequestValid = bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Validating bid request', bid); + const { + banner + } = bid.mediaTypes || {}; + const { + adUnitID, + currency + } = bid.params || {}; + if (!banner || !Array.isArray(banner.sizes)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, 'Invalid bid: missing or malformed banner sizes', banner); + return false; + } + const hasValidSize = banner.sizes.some(_ref3 => { + let [w, h] = _ref3; + return SIZE_SET.has(`${w}x${h}`); + }); + if (!hasValidSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, 'Invalid bid: no valid sizes found', banner.sizes); + return false; + } + if (typeof adUnitID !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, 'Invalid bid: malformed adUnitId', adUnitID); + return false; + } + const isCurrencyValid = ALLOWED_CURRENCIES.includes(currency); + if (!isCurrencyValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, `Invalid currency: ${currency}. Allowed currencies are ${ALLOWED_CURRENCIES.join(', ')}`); + return false; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Bid request is valid', bid); + return true; +}; +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Building OpenRTB request', { + validBidRequests, + bidderRequest + }); + const requests = validBidRequests.map(bidRequest => { + const data = CONVERTER.toORTB({ + bidRequests: [bidRequest], + bidderRequest + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Result OpenRTB request data for bidRequest', data); + const adUnitId = bidRequest.params.adUnitID; + return { + method: 'POST', + url: `${ENDPOINT_URL}${adUnitId}`, + data: data, + bids: [bidRequest], + options: { + withCredentials: false, + crossOrigin: true + } + }; + }); + return requests; +}; +const interpretResponse = (serverResponse, bidRequest) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Interpreting server response', { + serverResponse, + bidRequest + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponse.body)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, 'Empty response'); + return []; + } + const bids = CONVERTER.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, `${bids.length} bids successfully interpreted`, bids); + return bids; +}; +const onBidWon = bid => { + const cpm = bid.adserverTargeting?.hb_pb || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, `-----Bid won-----`, { + bid, + cpm: cpm + }); + _handleOnBidWon(bid.nurl); +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse, + onBidWon +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('bitmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bitmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["blastoBidAdapter"],{ + +/***/ "./modules/blastoBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/blastoBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'blasto'; +const SOURCE_ID_MACRO = '[sourceid]'; +const ACCOUNT_ID_MACRO = '[accountid]'; +const HOST_MACRO = '[host]'; +const URL = `https://${HOST_MACRO}.blasto.ai/bid?rtb_seat_id=${SOURCE_ID_MACRO}&secret_key=${ACCOUNT_ID_MACRO}&integration_type=prebidjs`; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_HOST = 'us-e-node1'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 20 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + if (!imp.bidfloor) imp.bidfloor = bidRequest.params.bidfloor || 0; + imp.ext = { + [BIDDER_CODE]: { + accountId: bidRequest.params.accountId, + sourceId: bidRequest.params.sourceId, + host: bidRequest.params.host || DEFAULT_HOST + } + }; + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + const bid = context.bidRequests[0]; + request.test = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('debug') ? 1 : 0; + if (!request.cur) request.cur = [bid.params.currency || DEFAULT_CURRENCY]; + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.cur = bid.cur || DEFAULT_CURRENCY; + return bidResponse; + } +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + isBidRequestValid: bid => { + return Boolean(bid.params.sourceId) && Boolean(bid.params.accountId); + }, + buildRequests: (validBidRequests, bidderRequest) => { + if (validBidRequests && validBidRequests.length === 0) return []; + const { + sourceId, + accountId + } = validBidRequests[0].params; + const host = validBidRequests[0].params.host; + const endpointURL = URL.replace(HOST_MACRO, host || DEFAULT_HOST).replace(ACCOUNT_ID_MACRO, accountId).replace(SOURCE_ID_MACRO, sourceId); + const request = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + return { + method: 'POST', + url: endpointURL, + data: request + }; + }, + interpretResponse: (response, request) => { + if (response?.body) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('blastoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/blastoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bliinkBidAdapter"],{ + +/***/ "./modules/bliinkBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/bliinkBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, GVL_ID, BLIINK_ENDPOINT_ENGINE, BLIINK_ENDPOINT_COOKIE_SYNC_IFRAME, META_KEYWORDS, META_DESCRIPTION, getEffectiveConnectionType, getUserIds, getMetaList, getOneMetaValue, getMetaValue, getKeywords, buildBid, isBidRequestValid, buildRequests, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + +const BIDDER_CODE = 'bliink'; +const GVL_ID = 658; +const BLIINK_ENDPOINT_ENGINE = 'https://engine.bliink.io/prebid'; +const BLIINK_ENDPOINT_COOKIE_SYNC_IFRAME = 'https://tag.bliink.io/usersync.html'; +const META_KEYWORDS = 'keywords'; +const META_DESCRIPTION = 'description'; +const VIDEO = 'video'; +const BANNER = 'banner'; +window.bliinkBid = window.bliinkBid || {}; +const supportedMediaTypes = [BANNER, VIDEO]; +const aliasBidderCode = ['bk']; +const CURRENCY = 'EUR'; + +/** + * @description get coppa value from config + */ +function getCoppa() { + return _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('coppa') === true ? 1 : 0; +} + +/** + * Retrieves the effective connection type from the browser's Navigator API. + * @returns {string} The effective connection type or 'unsupported' if unavailable. + */ +function getEffectiveConnectionType() { + /** + * The effective connection type obtained from the browser's Navigator API. + * @type {string|undefined} + */ + const navigatorEffectiveType = navigator?.connection?.effectiveType; + if (navigatorEffectiveType) { + return navigatorEffectiveType; + } + return 'unsupported'; +} + +/** + * Retrieves the user IDs as EIDs from the first valid bid request. + * + * @param {Array} validBidRequests - Array of valid bid requests + * @returns {Array|undefined} - Array of user IDs as EIDs, or undefined if not found + */ +function getUserIds(validBidRequests) { + /** @type {Object} */ + if (validBidRequests?.[0]?.userIdAsEids) { + return validBidRequests[0].userIdAsEids; + } +} +function getMetaList(name) { + if (!name || name.length === 0) return []; + return [{ + key: 'name', + value: name + }, { + key: 'name*', + value: name + }, { + key: 'itemprop*', + value: name + }, { + key: 'property', + value: `'og:${name}'` + }, { + key: 'property', + value: `'twitter:${name}'` + }, { + key: 'property', + value: `'article:${name}'` + }]; +} +function getOneMetaValue(query) { + const metaEl = document.querySelector(query); + if (metaEl && metaEl.content) { + return metaEl.content; + } + return null; +} +function getMetaValue(name) { + const metaList = getMetaList(name); + for (let i = 0; i < metaList.length; i++) { + const meta = metaList[i]; + const metaValue = getOneMetaValue(`meta[${meta.key}=${meta.value}]`); + if (metaValue) { + return metaValue; + } + } + return ''; +} +function getKeywords() { + const metaKeywords = getMetaValue(META_KEYWORDS); + if (metaKeywords) { + const keywords = [...metaKeywords.split(',')]; + if (keywords && keywords.length > 0) { + return keywords.filter(value => value).map(value => value.trim()); + } + } + return []; +} + +/** + * @param bidResponse + * @return {({cpm, netRevenue: boolean, requestId, width: number, currency, ttl: number, creativeId, height: number}&{mediaType: string, vastXml})|null} + */ +const buildBid = bidResponse => { + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, 'creative.media_type'); + if (!mediaType) return null; + let bid; + switch (mediaType) { + case VIDEO: + const vastXml = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, 'creative.video.content'); + bid = { + vastXml, + mediaType: 'video', + vastUrl: 'data:text/xml;charset=utf-8;base64,' + btoa(vastXml.replace(/\\"/g, '"')) + }; + break; + case BANNER: + bid = { + ad: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, 'creative.banner.adm'), + mediaType: 'banner' + }; + break; + default: + return null; + } + return Object.assign(bid, { + cpm: bidResponse.price, + currency: bidResponse.currency || CURRENCY, + creativeId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, 'extras.deal_id'), + requestId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, 'extras.transaction_id'), + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, `creative.${bid.mediaType}.width`) || 1, + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidResponse, `creative.${bid.mediaType}.height`) || 1, + ttl: 300, + netRevenue: true + }); +}; + +/** + * @description Verify the the AdUnits.bids, respond with true (valid) or false (invalid). + * + * @param bid + * @return boolean + */ +const isBidRequestValid = bid => { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.tagId'); +}; + +/** + * @description Takes an array of valid bid requests, all of which are guaranteed to have passed the isBidRequestValid() test. + * + * @param validBidRequests + * @param bidderRequest + * @returns {null|{method: string, data: {gdprConsent: string, keywords: string, pageTitle: string, pageDescription: (*|string), pageUrl, gdpr: boolean, tags: *}, url: string}} + */ +const buildRequests = (validBidRequests, bidderRequest) => { + if (!validBidRequests || !bidderRequest || !bidderRequest.bids) return null; + const w = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.canAccessWindowTop)() ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)() : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)(); + const domLoadingDuration = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDomLoadingDuration)(w).toString(); + const tags = bidderRequest.bids.map(bid => { + let bidFloor; + const sizes = bid.sizes.map(size => ({ + w: size[0], + h: size[1] + })); + const mediaTypes = Object.keys(bid.mediaTypes); + if (typeof bid.getFloor === 'function') { + bidFloor = bid.getFloor({ + currency: CURRENCY, + mediaType: mediaTypes[0], + size: sizes[0] + }); + } + const id = bid.params.tagId; + const request = { + sizes: bid.sizes.map(size => ({ + w: size[0], + h: size[1] + })), + id, + // TODO: bidId is globally unique, is it a good choice for transaction ID (vs ortb2Imp.ext.tid)? + transactionId: bid.bidId, + mediaTypes: mediaTypes, + imageUrl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.imageUrl', ''), + videoUrl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.videoUrl', ''), + refresh: (window.bliinkBid[id] = (window.bliinkBid[id] ?? -1) + 1) || undefined + }; + if (bidFloor) { + request.bidFloor = bidFloor; + } + return request; + }); + let request = { + tags, + pageTitle: document.title, + pageUrl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.page').replace(/\?.*$/, ''), + pageDescription: getMetaValue(META_DESCRIPTION), + keywords: getKeywords().join(','), + ect: getEffectiveConnectionType() + }; + const schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'schain'); + const eids = getUserIds(validBidRequests); + const device = bidderRequest.ortb2?.device; + if (schain) { + request.schain = schain; + } + if (domLoadingDuration > -1) { + request.domLoadingDuration = domLoadingDuration; + } + if (device) { + request.device = device; + } + if (eids) { + request.eids = eids; + } + const gdprConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent'); + if (!!gdprConsent && gdprConsent.gdprApplies) { + request.gdpr = true; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'gdprConsent', gdprConsent.consentString); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('coppa')) { + request.coppa = 1; + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'uspConsent', bidderRequest.uspConsent); + } + return { + method: 'POST', + url: BLIINK_ENDPOINT_ENGINE, + data: request + }; +}; + +/** + * @description Parse the response (from buildRequests) and generate one or more bid objects. + * + * @param serverResponse + * @return + */ +const interpretResponse = serverResponse => { + const bodyResponse = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(serverResponse, 'body.bids'); + if (!serverResponse.body || !bodyResponse) return []; + const bidResponses = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(bodyResponse, function (response) { + return bidResponses.push(buildBid(response)); + }); + return bidResponses.filter(bid => !!bid); +}; + +/** + * @description If the publisher allows user-sync activity, the platform will call this function and the adapter may register pixels and/or iframe user syncs. For more information, see Registering User Syncs below + * @param syncOptions + * @param serverResponses + * @param gdprConsent + * @return {[{type: string, url: string}]|*[]} + */ +const getUserSyncs = (syncOptions, serverResponses, gdprConsent, uspConsent) => { + let syncs = []; + if (syncOptions.pixelEnabled && serverResponses.length > 0) { + let gdprParams = ''; + let uspConsentStr = ''; + let apiVersion; + let gdpr = false; + if (gdprConsent) { + gdprParams = `&gdprConsent=${gdprConsent.consentString}`; + apiVersion = `&apiVersion=${gdprConsent.apiVersion}`; + gdpr = Number(gdprConsent.gdprApplies); + } + if (uspConsent) { + uspConsentStr = `&uspConsent=${uspConsent}`; + } + let sync; + if (syncOptions.iframeEnabled) { + sync = [{ + type: 'iframe', + url: `${BLIINK_ENDPOINT_COOKIE_SYNC_IFRAME}?gdpr=${gdpr}&coppa=${getCoppa()}${uspConsentStr}${gdprParams}${apiVersion}` + }]; + } else { + sync = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(serverResponses[0], 'body.userSyncs'); + } + return sync; + } + return syncs; +}; + +/** + * @type {{interpretResponse: typeof interpretResponse, code: string, aliases: string[], getUserSyncs: typeof getUserSyncs, buildRequests: typeof buildRequests, isBidRequestValid: typeof isBidRequestValid}} + */ +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + aliases: aliasBidderCode, + supportedMediaTypes: supportedMediaTypes, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('bliinkBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bliinkBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["blueBidAdapter"],{ + +/***/ "./modules/blueBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/blueBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + +const BIDDER_CODE = 'blue'; +const ENDPOINT_URL = 'https://bidder-us-east-1.getblue.io/engine/?src=prebid'; +const GVLID = 620; +const DEFAULT_CURRENCY = 'USD'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function getBidFloor(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + let floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + return floor.floor; + } + } + return null; +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: true, + // Default netRevenue setting + ttl: 100 // Default time-to-live for bid responses + }, + imp, + request +}); +function request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'site.publisher.id', context.publisherId); + return request; +} +function imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + const floor = getBidFloor(bidRequest); + imp.tagid = bidRequest.params.placementId; + if (floor) { + imp.bidfloor = floor; + imp.bidfloorcur = DEFAULT_CURRENCY; + } + return imp; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + // Validate bid request + isBidRequestValid: function (bid) { + return !!bid.params.placementId && !!bid.params.publisherId; + }, + // Build OpenRTB requests using `ortbConverter` + buildRequests: function (validBidRequests, bidderRequest) { + const context = { + publisherId: validBidRequests.find(bidRequest => bidRequest.params?.publisherId)?.params.publisherId + }; + const ortbRequest = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest, + context + }); + + // Add extensions to the request + ortbRequest.ext = ortbRequest.ext || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbRequest, 'ext.gvlid', GVLID); + return [{ + method: 'POST', + url: ENDPOINT_URL, + data: ortbRequest, + options: { + contentType: 'application/json' + } + }]; + }, + interpretResponse: serverResponse => { + if (!serverResponse || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponse.body)) return []; + let bids = []; + serverResponse.body.seatbid.forEach(response => { + response.bid.forEach(bid => { + const mediaType = bid.ext?.mediaType || 'banner'; + bids.push({ + ad: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(bid.adm, bid.price), + adapterCode: BIDDER_CODE, + cpm: bid.price, + creativeId: bid.ext.blue.adId, + creative_id: bid.ext.blue.adId, + currency: serverResponse.body.cur || 'USD', + deferBilling: false, + deferRendering: false, + width: bid.w, + height: bid.h, + mediaType, + netRevenue: true, + originalCpm: bid.price, + originalCurrency: serverResponse.body.cur || 'USD', + requestId: bid.impid, + seatBidId: bid.id, + ttl: 1200 + }); + }); + }); + return bids; + }, + onBidWon: function (bid) { + const { + burl, + nurl + } = bid || {}; + if (nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(nurl, bid.originalCpm || bid.cpm)); + } + if (burl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(burl, bid.originalCpm || bid.cpm)); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('blueBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/blueBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["blueconicRtdProvider"],{ + +/***/ "./modules/blueconicRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/blueconicRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports RTD_LOCAL_NAME, storage, addRealTimeData, getRealTimeData, blueconicSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the blueconic provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time data from Blueconic + * @module modules/blueconicRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'blueconic'; +const RTD_LOCAL_NAME = 'bcPrebidData'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); + +/** + * Try parsing stringified array of data. + * @param {String} data + */ +function parseJson(data) { + try { + return JSON.parse(data); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`blueconicRtdProvider: failed to parse json:`, data); + return null; + } +} + +/** + * Add real-time data & merge segments. + * @param {Object} ortb2 + * @param {Object} rtd + */ +function addRealTimeData(ortb2, rtd) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtd.ortb2)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ortb2, rtd.ortb2); + } +} + +/** + * Real-time data retrieval from BlueConic + * @param {Object} reqBidsConfigObj + * @param {function} onDone + * @param {Object} rtdConfig + * @param {Object} userConsent + */ +function getRealTimeData(reqBidsConfigObj, onDone, rtdConfig, userConsent) { + if (rtdConfig && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtdConfig.params)) { + const jsonData = storage.getDataFromLocalStorage(RTD_LOCAL_NAME); + if (jsonData) { + const parsedData = parseJson(jsonData); + if (!parsedData) { + return; + } + const userData = { + name: 'blueconic', + ...parsedData + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('blueconicRtdProvider: userData: ', userData); + const data = { + ortb2: { + user: { + data: [userData] + } + } + }; + addRealTimeData(reqBidsConfigObj.ortb2Fragments?.global, data); + onDone(); + } + } +} + +/** + * Module init + * @param {Object} provider + * @param {Object} userConsent + * @return {boolean} + */ +function init(provider, userConsent) { + return true; +} + +/** @type {RtdSubmodule} */ +const blueconicSubmodule = { + name: SUBMODULE_NAME, + getBidRequestData: getRealTimeData, + init: init +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)(MODULE_NAME, blueconicSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('blueconicRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/blueconicRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bmsBidAdapter"],{ + +/***/ "./modules/bmsBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/bmsBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + +const BIDDER_CODE = 'bms'; +const ENDPOINT_URL = 'https://api.prebid.int.us-east-1.bluems.com/v1/bid?exchangeId=prebid'; +const GVLID = 1105; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_BID_TTL = 1200; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function getBidFloor(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + let floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + return floor.floor; + } + } + return null; +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: true, + // Default net revenue configuration + ttl: 100 // Default time-to-live for bid responses + }, + imp, + request +}); +function request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + + // Add publisher ID + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'site.publisher.id', context.publisherId); + return request; +} +function imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + const floor = getBidFloor(bidRequest); + imp.tagid = bidRequest.params.placementId; + if (floor) { + imp.bidfloor = floor; + imp.bidfloorcur = DEFAULT_CURRENCY; + } + return imp; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + // Validate bid request + isBidRequestValid: function (bid) { + return !!bid.params.placementId && !!bid.params.publisherId; + }, + // Build OpenRTB requests using `ortbConverter` + buildRequests: function (validBidRequests, bidderRequest) { + const context = { + publisherId: validBidRequests.find(bidRequest => bidRequest.params?.publisherId)?.params.publisherId + }; + const ortbRequest = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest, + context + }); + + // Add extensions to the request + ortbRequest.ext = ortbRequest.ext || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbRequest, 'ext.gvlid', GVLID); + return [{ + method: 'POST', + url: ENDPOINT_URL, + data: JSON.stringify(ortbRequest), + options: { + contentType: 'text/plain', + withCredentials: true + } + }]; + }, + interpretResponse: serverResponse => { + if (!serverResponse || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponse.body)) return []; + let bids = []; + serverResponse.body.seatbid.forEach(response => { + response.bid.forEach(bid => { + const mediaType = bid.ext?.mediaType || 'banner'; + bids.push({ + ad: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(bid.adm, bid.price), + adapterCode: BIDDER_CODE, + cpm: bid.price, + creativeId: bid.ext.bms.adId, + currency: serverResponse.body.cur || 'USD', + deferBilling: false, + deferRendering: false, + width: bid.w, + height: bid.h, + mediaType, + netRevenue: true, + originalCpm: bid.price, + originalCurrency: serverResponse.body.cur || 'USD', + requestId: bid.impid, + seatBidId: bid.id, + ttl: typeof bid.exp === 'number' ? bid.exp : DEFAULT_BID_TTL, + nurl: bid.nurl || null, + burl: bid.burl || null, + meta: { + advertiserDomains: bid.adomain || [], + networkId: bid.ext?.networkId || 1105, + networkName: bid.ext?.networkName || 'BMS' + } + }); + }); + }); + return bids; + }, + onBidWon: function (bid) { + const { + burl, + nurl + } = bid || {}; + if (nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(nurl); + } + if (burl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(burl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('bmsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bmsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["boldwinBidAdapter"],{ + +/***/ "./modules/boldwinBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/boldwinBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'boldwin'; +const AD_URL = 'https://ssp.videowalldirect.com/pbjs'; +const SYNC_URL = 'https://sync.videowalldirect.com'; +const addCustomFieldsToPlacement = (bid, bidderRequest, placement) => { + if (placement.adFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + placement.wPlayer = placement.playerSize?.[0]?.[0]; + placement.hPlayer = placement.playerSize?.[0]?.[1]; + } +}; +const placementProcessingFunction = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildPlacementProcessingFunction)({ + addCustomFieldsToPlacement +}); +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + return (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequestsBase)({ + adUrl: AD_URL, + validBidRequests, + bidderRequest, + placementProcessingFunction + }); +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests, + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('boldwinBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/boldwinBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["brainxBidAdapter"],{ + +/***/ "./modules/brainxBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/brainxBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + +// import { config } from 'src/config.js'; + + +// import { config } from '../src/config.js'; + +const BIDDER_CODE = 'brainx'; +const METHOD = 'POST'; +const TTL = 200; +const NET_REV = true; +let ENDPOINT = 'https://dsp.brainx.tech/bid'; +// let ENDPOINT = 'http://adx-engine-gray.tec-do.cn/bid' + +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + // `netRevenue` and `ttl` are required properties of bid responses - provide a default for them + netRevenue: NET_REV, + // or false if your adapter should set bidResponse.netRevenue = false + ttl: TTL // default bidResponse.ttl (when not specified in ORTB response.seatbid[].bid[].exp) + } +}); +const spec = { + code: BIDDER_CODE, + // gvlid: IAB_GVL_ID, + // aliases: [ + // { code: "myalias", gvlid: IAB_GVL_ID_IF_DIFFERENT } + // ], + isBidRequestValid: function (bid) { + if (!(hasBanner(bid) || hasVideo(bid))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required mediaTypes'); + return false; + } + if (!(bid && bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required bid data'); + return false; + } + if (!bid.params.pubId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required field pubId'); + return false; + } + return true; + }, + buildRequests(bidRequests, bidderRequest) { + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + ENDPOINT = String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequests[0], 'params.endpoint')) ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequests[0], 'params.endpoint') : ENDPOINT; + data.user = { + buyeruid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)() + }; + return { + method: METHOD, + url: `${ENDPOINT}?token=${String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequests[0], 'params.pubId'))}`, + data + }; + }, + interpretResponse(response, request) { + let bids = []; + if (response.body && response.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response.body.seatbid)) { + response.body.seatbid.forEach(function (bidder) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidder.bid)) { + bidder.bid.map(bid => { + let serverBody = response.body; + // bidRequest = request.originalBidRequest, + let mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + let currency = serverBody.cur || 'USD'; + const cpm = (parseFloat(bid.price) || 0).toFixed(2); + const categories = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'cat', []); + const bidRes = { + ad: bid.adm, + width: bid.w, + height: bid.h, + requestId: bid.impid, + cpm: cpm, + currency: currency, + mediaType: mediaType, + ttl: TTL, + creativeId: bid.crid || bid.id, + netRevenue: NET_REV, + nurl: bid.nurl, + lurl: bid.lurl, + meta: { + mediaType: mediaType, + primaryCatId: categories[0], + secondaryCatIds: categories.slice(1) + } + }; + if (bid.adomain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.adomain) && bid.adomain.length > 0) { + bidRes.meta.advertiserDomains = bid.adomain; + bidRes.meta.clickUrl = bid.adomain[0]; + } + bids.push(bidRes); + }); + } + }); + } + return bids; + }, + // getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { }, + // onTimeout: function (timeoutData) { }, + // onBidWon: function (bid) { }, + // onSetTargeting: function (bid) { }, + // onBidderError: function ({ error, bidderRequest }) { }, + // onAdRenderSucceeded: function (bid) { }, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER] +}; +function hasBanner(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner'); +} +function hasVideo(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video'); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('brainxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/brainxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["brandmetricsRtdProvider"],{ + +/***/ "./modules/brandmetricsRtdProvider.js": +/*!********************************************!*\ + !*** ./modules/brandmetricsRtdProvider.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export brandmetricsSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds brandmetrics provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will load load the brandmetrics script and set survey- targeting to ad units of specific bidders. + * @module modules/brandmetricsRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'brandmetrics'; +const MODULE_CODE = MODULE_NAME; +const RECEIVED_EVENTS = []; +const GVL_ID = 422; +const TCF_PURPOSES = [1, 7]; +let billableEventsInitialized = false; +function init(config, userConsent) { + const hasConsent = checkConsent(userConsent); + const initialize = hasConsent !== false; + if (initialize) { + const moduleConfig = getMergedConfig(config); + initializeBrandmetrics(moduleConfig.params.scriptId); + initializeBillableEvents(); + } + return initialize; +} + +/** + * Checks TCF and USP consents + * @param {Object} userConsent + * @returns {boolean} + */ +function checkConsent(userConsent) { + let consent; + if (userConsent) { + if (userConsent.gdpr && userConsent.gdpr.gdprApplies) { + const gdpr = userConsent.gdpr; + if (gdpr.vendorData) { + const vendor = gdpr.vendorData.vendor; + const purpose = gdpr.vendorData.purpose; + let vendorConsent = false; + if (vendor.consents) { + vendorConsent = vendor.consents[GVL_ID]; + } + if (vendor.legitimateInterests) { + vendorConsent = vendorConsent || vendor.legitimateInterests[GVL_ID]; + } + const purposes = TCF_PURPOSES.map(id => { + return purpose.consents && purpose.consents[id] || purpose.legitimateInterests && purpose.legitimateInterests[id]; + }); + const purposesValid = purposes.filter(p => p === true).length === TCF_PURPOSES.length; + consent = vendorConsent && purposesValid; + } + } else if (userConsent.usp) { + const usp = userConsent.usp; + consent = usp[1] !== 'N' && usp[2] !== 'Y'; + } + } + return consent; +} + +/** + * Add event- listeners to hook in to brandmetrics events + * @param {Object} reqBidsConfigObj + * @param {Object} moduleConfig + * @param {function} callback + */ +function processBrandmetricsEvents(reqBidsConfigObj, moduleConfig, callback) { + const callBidTargeting = event => { + if (event.available && event.conf) { + const targetingConf = event.conf.displayOption || {}; + if (targetingConf.type === 'pbjs') { + setBidderTargeting(reqBidsConfigObj, moduleConfig, targetingConf.targetKey || 'brandmetrics_survey', event.survey.measurementId); + } + } + callback(); + }; + if (RECEIVED_EVENTS.length > 0) { + callBidTargeting(RECEIVED_EVENTS[RECEIVED_EVENTS.length - 1]); + } else { + window._brandmetrics.push({ + cmd: '_addeventlistener', + val: { + event: 'surveyloaded', + reEmitLast: true, + handler: ev => { + RECEIVED_EVENTS.push(ev); + if (RECEIVED_EVENTS.length === 1) { + // Call bid targeting only for the first received event, if called subsequently, last event from the RECEIVED_EVENTS array is used + callBidTargeting(ev); + } + } + } + }); + } +} + +/** + * Sets bid targeting of specific bidders + * @param {Object} reqBidsConfigObj + * @param {Object} moduleConfig + * @param {string} key Targeting key + * @param {string} val Targeting value + */ +function setBidderTargeting(reqBidsConfigObj, moduleConfig, key, val) { + const bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(moduleConfig, 'params.bidders'); + if (bidders && bidders.length > 0) { + bidders.forEach(bidder => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(reqBidsConfigObj, `ortb2Fragments.bidder.${bidder}.user.ext.data.${key}`, val); + }); + } +} + +/** + * Add the brandmetrics script to the page. + * @param {string} scriptId - The script- id provided by brandmetrics or brandmetrics partner + */ +function initializeBrandmetrics(scriptId) { + window._brandmetrics = window._brandmetrics || []; + if (scriptId) { + const path = 'https://cdn.brandmetrics.com/survey/script/'; + const file = scriptId + '.js'; + const url = path + file; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(url, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_RTD, MODULE_CODE); + } +} + +/** + * Hook in to brandmetrics creative_in_view- event and emit billable- event for creatives measured by brandmetrics. + */ +function initializeBillableEvents() { + if (!billableEventsInitialized) { + window._brandmetrics.push({ + cmd: '_addeventlistener', + val: { + event: 'creative_in_view', + handler: ev => { + if (ev.source && ev.source.type === 'pbj') { + const bid = ev.source.data; + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.BILLABLE_EVENT, { + vendor: 'brandmetrics', + type: 'creative_in_view', + measurementId: ev.mid, + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.generateUUID)(), + auctionId: bid.auctionId, + transactionId: bid.transactionId + }); + } + } + } + }); + billableEventsInitialized = true; + } +} + +/** + * Merges a provided config with default values + * @param {Object} customConfig + * @returns + */ +function getMergedConfig(customConfig) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.mergeDeep)({ + waitForIt: false, + params: { + bidders: [], + scriptId: undefined + } + }, customConfig); +} + +/** @type {RtdSubmodule} */ +const brandmetricsSubmodule = { + name: MODULE_NAME, + getBidRequestData: function (reqBidsConfigObj, callback, customConfig) { + try { + const moduleConfig = getMergedConfig(customConfig); + if (moduleConfig.waitForIt) { + processBrandmetricsEvents(reqBidsConfigObj, moduleConfig, callback); + } else { + callback(); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(e); + } + }, + init +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.submodule)('realTimeData', brandmetricsSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('brandmetricsRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/brandmetricsRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["braveBidAdapter"],{ + +/***/ "./modules/braveBidAdapter.js": +/*!************************************!*\ + !*** ./modules/braveBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_braveUtils_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/braveUtils/index.js */ "./libraries/braveUtils/index.js"); +/* harmony import */ var _libraries_braveUtils_buildAndInterpret_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/braveUtils/buildAndInterpret.js */ "./libraries/braveUtils/buildAndInterpret.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'brave'; +const DEFAULT_CUR = 'USD'; +const ENDPOINT_URL = `https://point.braveglobal.tv/?t=2&partner=hash`; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: bid => !!(bid.params.placementId && bid.params.placementId.toString().length === 32), + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_braveUtils_buildAndInterpret_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT_URL, DEFAULT_CUR), + interpretResponse: serverResponse => (0,_libraries_braveUtils_buildAndInterpret_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse)(serverResponse, DEFAULT_CUR, _libraries_braveUtils_index_js__WEBPACK_IMPORTED_MODULE_2__.parseNative), + onBidWon: bid => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(bid.nurl) && bid.nurl !== '') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(bid.nurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('braveBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["braveUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/braveBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bridBidAdapter"],{ + +/***/ "./modules/bridBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/bridBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_targetVideoUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/targetVideoUtils/bidderUtils.js */ "./libraries/targetVideoUtils/bidderUtils.js"); +/* harmony import */ var _libraries_targetVideoUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/targetVideoUtils/constants.js */ "./libraries/targetVideoUtils/constants.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ +const spec = { + code: 'brid', + gvlid: _libraries_targetVideoUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid && bid.params && bid.params.placementId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @param {BidderRequest} bidderRequest bidder request object. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const requests = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(bidRequests, function (bid) { + const placementId = bid.params.placementId; + const bidId = bid.bidId; + let sizes = bid.sizes; + if (sizes && !Array.isArray(sizes[0])) sizes = [sizes]; + const site = (0,_libraries_targetVideoUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.getSiteObj)(); + const postBody = { + sdk: { + source: _libraries_targetVideoUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.SOURCE, + version: "9.45.0-pre" + }, + id: bidderRequest.bidderRequestId, + site, + imp: [] + }; + const imp = { + ext: { + prebid: { + storedrequest: { + 'id': placementId + } + } + } + }; + const video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video'); + if (video) { + imp.video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDefinedParams)(video, _libraries_targetVideoUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_PARAMS); + if (video.playerSize) { + imp.video = Object.assign(imp.video, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArrayToRtbSize)(video.playerSize[0]) || {}); + } else if (video.w && video.h) { + imp.video.w = video.w; + imp.video.h = video.h; + } + ; + } + ; + postBody.imp.push(imp); + const gdprConsent = bidderRequest && bidderRequest.gdprConsent; + const uspConsent = bidderRequest && bidderRequest.uspConsent; + if (gdprConsent || uspConsent) { + postBody.regs = { + ext: {} + }; + if (uspConsent) { + postBody.regs.ext.us_privacy = uspConsent; + } + ; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies !== 'undefined') { + postBody.regs.ext.gdpr = gdprConsent.gdprApplies ? 1 : 0; + } + ; + if (typeof gdprConsent.consentString !== 'undefined') { + postBody.user = { + ext: { + consent: gdprConsent.consentString + } + }; + } + ; + } + ; + } + ; + if (bidRequests[0].schain) { + postBody.source = { + ext: { + schain: bidRequests[0].schain + } + }; + } + const params = bid.params; + requests.push({ + method: 'POST', + url: _libraries_targetVideoUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_ENDPOINT_URL, + data: JSON.stringify(postBody), + options: { + withCredentials: true + }, + bidId, + params + }); + }); + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const response = serverResponse.body; + let highestBid = null; + if (response && response.seatbid && response.seatbid.length && response.seatbid[0].bid && response.seatbid[0].bid.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(response.seatbid, resp => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(resp.bid, bid => { + const requestId = bidRequest.bidId; + const params = bidRequest.params; + const { + ad, + adUrl, + vastUrl, + vastXml + } = (0,_libraries_targetVideoUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.getAd)(bid); + const bidResponse = { + requestId, + params, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.adid, + currency: response.cur, + netRevenue: false, + ttl: _libraries_targetVideoUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.TIME_TO_LIVE, + meta: { + advertiserDomains: bid.adomain || [] + } + }; + if (vastUrl || vastXml) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + if (vastUrl) bidResponse.vastUrl = vastUrl; + if (vastXml) bidResponse.vastXml = vastXml; + } else { + bidResponse.ad = ad; + bidResponse.adUrl = adUrl; + } + ; + if (!highestBid || highestBid.cpm < bidResponse.cpm) { + highestBid = bidResponse; + } + }); + }); + } + return highestBid ? [highestBid] : []; + }, + /** + * Determine the user sync type (either 'iframe' or 'image') based on syncOptions. + * Construct the sync URL by appending required query parameters such as gdpr, ccpa, and coppa consents. + * Return an array containing an object with the sync type and the constructed URL. + */ + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => { + return (0,_libraries_targetVideoUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.getSyncResponse)(syncOptions, gdprConsent, uspConsent, gppConsent, 'brid'); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('bridBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["targetVideoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bridBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bridgeuppBidAdapter"],{ + +/***/ "./modules/bridgeuppBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/bridgeuppBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ADAPTER_VERSION, BIDDER_CODE, GVLID, DEFAULT_CUR, SERVER_PATH_US1_BID, SERVER_PATH_US1_EVENTS, SERVER_PATH_US1_SYNC, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid + */ + +const ADAPTER_VERSION = 1.0; +const BIDDER_CODE = 'sonarads'; +const GVLID = 1300; +const DEFAULT_CUR = 'USD'; +// export const SERVER_PATH_US1_BID = 'http://localhost:8000/analyze_request/bids'; +// export const SERVER_PATH_US1_EVENTS = 'http://localhost:8000/analyze_request/events'; +// export const SERVER_PATH_US1_SYNC = 'http://localhost:8000/analyze_request/sync'; +const SERVER_PATH_US1_BID = 'https://prebidjs-bids-us1.sonar-ads.com/analyze_request/bids'; +const SERVER_PATH_US1_EVENTS = 'https://prebidjs-events-us1.sonar-ads.com/events'; +const SERVER_PATH_US1_SYNC = 'https://prebidjs-sync-us1.sonar-ads.com/sync'; + +/** + * Bridgeupp : Report events for analytics and debuging. + */ +function reportEvents(eventType, eventData) { + if (!eventData || spec?.reportEventsEnabled !== true) { + return; + } + const payload = JSON.stringify({ + domain: location.hostname, + prebidVersion: "9.45.0-pre", + eventType: eventType, + eventPayload: eventData + }); + fetch(`${SERVER_PATH_US1_EVENTS}`, { + body: payload, + keepalive: true, + credentials: 'include', + method: 'POST', + headers: { + 'Content-Type': 'application/json' + } + }).catch(_e => { + // ignore errors for now + }); +} + +/** + * Bridgeupp : Defines the core oRTB converter inherited from converter library and all customization functions. + */ +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: DEFAULT_CUR + }, + imp, + request, + bidResponse, + response +}); + +/** + * Bridgeupp : Builds an impression object for oRTB requests based on the bid request. + * + * @param {function} buildImp - Function to build the imp object. + * @param {Object} bidRequest - The request containing bid details. + * @param {Object} context - Context for the impression. + * @returns {Object} The constructed impression object. + */ +function imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + const params = bidRequest.params; + imp.tagid = bidRequest.adUnitCode; + let floorInfo = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.getFloor)) { + floorInfo = bidRequest.getFloor(); + } + + // if floor price module is not set reading from bidRequest.params or default + if (!imp.bidfloor) { + imp.bidfloor = bidRequest.params.bidfloor || 0.001; + imp.bidfloorcur = DEFAULT_CUR; + } + imp.secure = bidRequest.ortb2Imp?.secure ?? 1; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext', { + ...imp.ext, + params: bidRequest.params, + bidder: { + siteId: params?.siteId + }, + floorInfo: floorInfo + }); + return imp; +} + +/** + * Bridgeupp: Constructs the request object. + * + * @param {function} buildRequest - Function to build the request. + * @param {Array} imps - Array of impression objects. + * @param {Object} bidderRequest - Object containing bidder request information. + * @param {Object} context - Additional context. + * @returns {Object} The complete oRTB request object. + */ +function request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + const siteId = context.bidRequests[0]?.params?.siteId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(request, 'auctionStart', bidderRequest.auctionStart); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(request, 'ext.prebid.channel', { + name: 'pbjs_bridgeupp', + pbjsversion: "9.45.0-pre", + adapterversion: ADAPTER_VERSION, + siteId: siteId + }); + return request; +} +function bidResponse(buildBidResponse, bid, context) { + return buildBidResponse(bid, context); +} + +/** + * Bridgeupp bid response + * + * @param {function} buildResponse - Function to build the response. + * @param {Array} bidResponses - List of bid responses. + * @param {Object} ortbResponse - Original oRTB response data. + * @param {Object} context - Additional context. + * @returns {Object} Prebid.js compatible bid response. + */ +function response(buildResponse, bidResponses, ortbResponse, context) { + return buildResponse(bidResponses, ortbResponse, context); +} +const spec = { + reportEventsEnabled: false, + code: BIDDER_CODE, + aliases: ['bridgeupp'], + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + /** + * Bridgeupp : Determines whether the given bid request is valid. + * + * @param {Object} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + if (!bid || bid.bidder !== BIDDER_CODE || !bid.params.siteId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bridgeupp - bid is not valid, reach out to support@bridgeupp.com'); + return false; + } + return true; + }, + /** + * Bridgeupp: Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {Object} bidderRequest - Additional request details. + * @return {ServerRequest} Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + const data = CONVERTER.toORTB({ + bidderRequest: bidderRequest, + bidRequests: validBidRequests + }); + if (data) { + return { + method: 'POST', + url: SERVER_PATH_US1_BID, + data: data, + options: { + contentType: 'application/json', + crossOrigin: true, + withCredentials: true + } + }; + } + }, + /** + * Bridgeupp: Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {ServerRequest} bidRequest - Original bid request. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (typeof serverResponse?.body == 'undefined') { + return []; + } + + // reportEventsEnabled is returned from the server default false + spec.reportEventsEnabled = serverResponse.headers.get('reportEventsEnabled') > 0; + const interpretedResponse = CONVERTER.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }); + return interpretedResponse.bids || []; + }, + /** + * Bridgeupp : User sync options based on consent, support only iframe for now. + */ + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => { + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bridgeupp - Bidder ConnectAd: No User-Matching allowed'); + return []; + } + let pixelType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let syncUrl = SERVER_PATH_US1_SYNC + '?'; + syncUrl = gdprConsent ? (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(syncUrl, 'gdpr', gdprConsent.gdprApplies ? 1 : 0) : syncUrl; + syncUrl = gdprConsent?.consentString ? (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(syncUrl, 'gdpr_consent', gdprConsent.consentString) : syncUrl; + syncUrl = uspConsent ? (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(syncUrl, 'us_privacy', uspConsent) : syncUrl; + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + syncUrl = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(syncUrl, 'gpp', gppConsent.gppString); + syncUrl = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_4__.tryAppendQueryString)(syncUrl, 'gpp_sid', gppConsent.applicableSections.join(',')); + } + if (syncUrl.slice(-1) === '&' || syncUrl.slice(-1) === '?') { + syncUrl = syncUrl.slice(0, -1); + } + return [{ + type: pixelType, + url: syncUrl + }]; + }, + /** + * Bridgeupp: Callback to report timeout event. + * + * @param {TimedOutBid[]} timeoutData - Array of timeout details. + */ + onTimeout: timeoutData => { + reportEvents('onTimeout', timeoutData); + }, + /** + * Bridgeupp: Callback to report targeting event. + * + * @param {Bid} bid - The bid object + */ + onSetTargeting: bid => { + reportEvents('onSetTargeting', bid); + }, + /** + * Bridgeupp: Callback to report successful ad render event. + * + * @param {Bid} bid - The bid that successfully rendered. + */ + onAdRenderSucceeded: bid => { + reportEvents('onAdRenderSucceeded', bid); + }, + /** + * Bridgeupp: Callback to report bidder error event. + * + * @param {Object} errorData - Details about the error. + */ + onBidderError: errorData => { + reportEvents('onBidderError', errorData); + }, + /** + * Bridgeupp: Callback to report bid won event. + * + * @param {Bid} bid - The bid that won the auction. + */ + onBidWon: bid => { + reportEvents('onBidWon', bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('bridgeuppBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","urlUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bridgeuppBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bridgewellBidAdapter"],{ + +/***/ "./modules/bridgewellBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/bridgewellBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'bridgewell'; +const REQUEST_ENDPOINT = 'https://prebid.scupio.com/recweb/prebid.aspx?cb='; +const BIDDER_VERSION = '1.1.0'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let valid = false; + if (bid && bid.params) { + if (bid.params.cid && typeof bid.params.cid === 'number') { + valid = true; + } else if (bid.params.ChannelID) { + valid = true; + } + } + return valid; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const adUnits = []; + var bidderUrl = REQUEST_ENDPOINT + Math.random(); + var userIds; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(validBidRequests, function (bid) { + userIds = bid.userId; + if (bid.params.cid) { + adUnits.push({ + cid: bid.params.cid, + adUnitCode: bid.adUnitCode, + requestId: bid.bidId, + mediaTypes: bid.mediaTypes || { + banner: { + sizes: bid.sizes + } + }, + userIds: userIds || {} + }); + } else { + adUnits.push({ + ChannelID: bid.params.ChannelID, + adUnitCode: bid.adUnitCode, + requestId: bid.bidId, + mediaTypes: bid.mediaTypes || { + banner: { + sizes: bid.sizes + } + }, + userIds: userIds || {} + }); + } + }); + let topUrl = ''; + if (bidderRequest && bidderRequest.refererInfo) { + topUrl = bidderRequest.refererInfo.page; + } + return { + method: 'POST', + url: bidderUrl, + data: { + version: { + prebid: "9.45.0-pre", + bridgewell: BIDDER_VERSION + }, + inIframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.inIframe)(), + url: topUrl, + referrer: bidderRequest.refererInfo.ref, + adUnits: adUnits, + // TODO: please do not send internal data structures over the network + refererInfo: bidderRequest.refererInfo.legacy + }, + validBidRequests: validBidRequests + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {*} bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + + // map responses to requests + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(bidRequest.validBidRequests, function (req) { + const bidResponse = {}; + if (!serverResponse.body) { + return; + } + let matchedResponse = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(serverResponse.body, function (res) { + let valid = false; + if (res && !res.consumed) { + let mediaTypes = req.mediaTypes; + let adUnitCode = req.adUnitCode; + if (res.adUnitCode) { + return res.adUnitCode === adUnitCode; + } else if (res.width && res.height && mediaTypes) { + if (mediaTypes.native) { + // dont care native sizes + valid = true; + } else if (mediaTypes.banner) { + if (mediaTypes.banner.sizes) { + let width = res.width; + let height = res.height; + let sizes = mediaTypes.banner.sizes; + // check response size validation + if (typeof sizes[0] === 'number') { + // for foramt Array[Number] check + valid = width === sizes[0] && height === sizes[1]; + } else { + // for format Array[Array[Number]] check + valid = !!(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(sizes, function (size) { + return width === size[0] && height === size[1]; + }); + } + } + } + } + } + return valid; + }); + if (matchedResponse) { + matchedResponse.consumed = true; + + // check required parameters + if (typeof matchedResponse.cpm !== 'number') { + return; + } else if (typeof matchedResponse.netRevenue !== 'boolean') { + return; + } else if (typeof matchedResponse.currency !== 'string') { + return; + } else if (typeof matchedResponse.mediaType !== 'string') { + return; + } + bidResponse.requestId = req.bidId; + bidResponse.cpm = matchedResponse.cpm; + bidResponse.width = matchedResponse.width; + bidResponse.height = matchedResponse.height; + bidResponse.ttl = matchedResponse.ttl; + bidResponse.creativeId = matchedResponse.id; + bidResponse.netRevenue = matchedResponse.netRevenue; + bidResponse.currency = matchedResponse.currency; + bidResponse.mediaType = matchedResponse.mediaType; + if (matchedResponse.adomain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bidResponse, 'meta.advertiserDomains', Array.isArray(matchedResponse.adomain) ? matchedResponse.adomain : [matchedResponse.adomain]); + } + + // check required parameters by matchedResponse.mediaType + switch (matchedResponse.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + // check banner required parameters + if (typeof matchedResponse.ad !== 'string') { + return; + } + bidResponse.ad = matchedResponse.ad; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + // check native required parameters + if (!matchedResponse.native) { + return; + } + let reqNativeLayout = req.mediaTypes.native; + let resNative = matchedResponse.native; + + // check title + let title = reqNativeLayout.title; + if (title && title.required) { + if (typeof resNative.title !== 'string') { + return; + } else if (title.len && title.len < resNative.title.length) { + return; + } + } + + // check body + let body = reqNativeLayout.body; + if (body && body.required) { + if (typeof resNative.body !== 'string') { + return; + } + } + + // check image + let image = reqNativeLayout.image; + if (image && image.required) { + if (resNative.image) { + if (typeof resNative.image.url !== 'string') { + // check image url + return; + } else { + if (resNative.image.width !== image.sizes[0] || resNative.image.height !== image.sizes[1]) { + // check image sizes + return; + } + } + } else { + return; + } + } + + // check sponsoredBy + let sponsoredBy = reqNativeLayout.sponsoredBy; + if (sponsoredBy && sponsoredBy.required) { + if (typeof resNative.sponsoredBy !== 'string') { + return; + } + } + + // check icon + let icon = reqNativeLayout.icon; + if (icon && icon.required) { + if (resNative.icon) { + if (typeof resNative.icon.url !== 'string') { + // check icon url + return; + } else { + if (resNative.icon.width !== icon.sizes[0] || resNative.icon.height !== icon.sizes[0]) { + // check image sizes + return; + } + } + } else { + return; + } + } + + // check clickUrl + if (typeof resNative.clickUrl !== 'string') { + return; + } + + // check clickTracker + let clickTrackers = resNative.clickTrackers; + if (clickTrackers) { + if (clickTrackers.length === 0) { + return; + } + } else { + return; + } + + // check impressionTrackers + let impressionTrackers = resNative.impressionTrackers; + if (impressionTrackers) { + if (impressionTrackers.length === 0) { + return; + } + } else { + return; + } + bidResponse.native = matchedResponse.native; + break; + default: + // response mediaType is not supported + return; + } + bidResponses.push(bidResponse); + } + }); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('bridgewellBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bridgewellBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["brightMountainMediaBidAdapter"],{ + +/***/ "./modules/brightMountainMediaBidAdapter.js": +/*!**************************************************!*\ + !*** ./modules/brightMountainMediaBidAdapter.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + +const BIDDER_CODE = 'bmtm'; +const AD_URL = 'https://one.elitebidder.com/api/hb?sid='; +const SYNC_URL = 'https://console.brightmountainmedia.com:8443/cookieSync'; +const CURRENCY = 'USD'; +const spec = { + code: BIDDER_CODE, + aliases: ['brightmountainmedia'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: bid => { + if (bid.bidId && bid.bidder && bid.params && bid.params.placement_id) { + return true; + } + if (bid.params.placement_id == 0 && bid.params.test === 1) { + return true; + } + return false; + }, + buildRequests: (validBidRequests, bidderRequest) => { + let requestData = []; + let size = [0, 0]; + let oRTBRequest = { + at: 2, + site: buildSite(bidderRequest), + device: buildDevice(), + cur: [CURRENCY], + tmax: Math.min(1000, bidderRequest.timeout), + regs: buildRegs(bidderRequest), + user: {}, + source: {} + }; + validBidRequests.forEach(bid => { + oRTBRequest['id'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(); + oRTBRequest['imp'] = [{ + id: '1', + bidfloor: 0, + bidfloorcur: CURRENCY, + secure: document.location.protocol === 'https:' ? 1 : 0, + ext: { + placement_id: bid.params.placement_id, + prebidVersion: "9.45.0-pre" + } + }]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner')) { + if (bid.mediaTypes.banner.sizes) { + size = bid.mediaTypes.banner.sizes[0]; + } + oRTBRequest.imp[0].banner = { + h: size[0], + w: size[1] + }; + } else { + if (bid.mediaTypes.video.playerSize) { + size = bid.mediaTypes.video.playerSize[0]; + } + oRTBRequest.imp[0].video = { + h: size[0], + w: size[1], + mimes: bid.mediaTypes.video.mimes ? bid.mediaTypes.video.mimes : [], + skip: bid.mediaTypes.video.skip ? 1 : 0, + playbackmethod: bid.mediaTypes.video.playbackmethod ? bid.mediaTypes.video.playbackmethod : [], + protocols: bid.mediaTypes.video.protocols ? bid.mediaTypes.video.protocols : [], + api: bid.mediaTypes.video.api ? bid.mediaTypes.video.api : [], + minduration: bid.mediaTypes.video.minduration ? bid.mediaTypes.video.minduration : 1, + maxduration: bid.mediaTypes.video.maxduration ? bid.mediaTypes.video.maxduration : 999 + }; + } + oRTBRequest.imp[0].bidfloor = getFloor(bid, size); + oRTBRequest.user = getUserIdAsEids(bid.userIdAsEids); + oRTBRequest.source = getSchain(bid.schain); + requestData.push({ + method: 'POST', + url: `${AD_URL}${bid.params.placement_id}`, + data: JSON.stringify(oRTBRequest), + bidRequest: bid + }); + }); + return requestData; + }, + interpretResponse: (serverResponse, _ref) => { + let { + bidRequest + } = _ref; + let bidResponse = []; + let bid; + let response; + try { + response = serverResponse.body; + bid = response.seatbid[0].bid[0]; + } catch (e) { + response = null; + } + if (!response || !bid || !bid.adm || !bid.price) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Bidder ${spec.code} no valid bid`); + return []; + } + let tempResponse = { + requestId: bidRequest.bidId, + cpm: bid.price, + currency: response.cur, + width: bid.w, + height: bid.h, + creativeId: bid.crid, + mediaType: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + ttl: 3000, + netRevenue: true, + meta: { + advertiserDomains: bid.adomain + } + }; + if (tempResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + tempResponse.ad = replaceAuctionPrice(bid.adm, bid.price); + } else { + tempResponse.vastXml = replaceAuctionPrice(bid.adm, bid.price); + } + bidResponse.push(tempResponse); + return bidResponse; + }, + getUserSyncs: syncOptions => { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: SYNC_URL + }]; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +function buildSite(bidderRequest) { + // TODO: should name/domain be the domain? + let site = { + name: window.location.hostname, + publisher: { + domain: window.location.hostname + } + }; + if (bidderRequest && bidderRequest.refererInfo) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(site, 'page', bidderRequest.refererInfo.page); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(site, 'ref', bidderRequest.refererInfo.ref); + } + return site; +} +function buildDevice() { + return { + ua: navigator.userAgent, + w: window.top.screen.width, + h: window.top.screen.height, + js: 1, + language: navigator.language, + dnt: navigator.doNotTrack === 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1' ? 1 : 0 + }; +} +function buildRegs(bidderRequest) { + let regs = { + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa') == true ? 1 : 0 + }; + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'ext.gdprConsentString', bidderRequest.gdprConsent.consentString || 'ALL'); + } + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(regs, 'ext.us_privacy', bidderRequest.uspConsent); + } + return regs; +} +function replaceAuctionPrice(str, cpm) { + if (!str) return; + return str.replace(/\$\{AUCTION_PRICE\}/g, cpm); +} +function getFloor(bid, size) { + if (typeof bid.getFloor === 'function') { + let floorInfo = {}; + floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: size + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD') { + return parseFloat(floorInfo.floor); + } + } + return 0; +} +function getUserIdAsEids(userIds) { + if (userIds) { + return { + ext: { + eids: userIds + } + }; + } + ; + return {}; +} +function getSchain(schain) { + if (schain) { + return { + ext: { + schain: schain + } + }; + } + return {}; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('brightMountainMediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/brightMountainMediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["browsiAnalyticsAdapter"],{ + +/***/ "./modules/browsiAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/browsiAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getStaticData, setStaticData */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + + +const analyticsType = 'endpoint'; +const PROVIDER_NAME = 'browsi'; +const GVLID = 329; +const EVENT_SERVER_URL = `https://events.browsiprod.com/events/v2`; + +/** @type {null|Object} */ +let _staticData = null; +/** @type {string} */ +let VERSION = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().version; +/** @type {string} */ +let URL = encodeURIComponent(window.location.href); +const { + AUCTION_END, + BROWSI_INIT, + BROWSI_DATA +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS; +function getStaticData() { + return _staticData; +} +function setStaticData(data) { + _staticData = { + pvid: data.pvid, + device: data.d, + geo: data.g, + aid: data.aid, + es: data.es, + pk: data.pk, + sk: data.sk, + t: data.t + }; +} +function getTimeOffset(ts) { + if (!ts) return undefined; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() - ts; +} +function getAdUnitPathByCode(code) { + const slots = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isGptPubadsDefined)() && window.googletag.pubads().getSlots(); + if (!slots || !slots.length) return null; + const match = slots.find(slot => slot.getSlotElementId() === code); + return match?.getAdUnitPath(); +} +function getAdUnitsData(args) { + const shouldSampleRtm = !!_staticData?.es; + return args.adUnits?.map(adUnit => { + let rtm; + const pbd = adUnit.bids.filter(_ref => { + let { + ortb2Imp + } = _ref; + const brwData = ortb2Imp?.ext?.data?.browsi; + if (brwData && !rtm) rtm = brwData; + return !!brwData; + }).map(bid => bid.bidder); + return { + plid: adUnit.code, + au: getAdUnitPathByCode(adUnit.code), + pbd, + dpc: rtm ? Object.keys(rtm).length : 0, + ...(shouldSampleRtm && rtm ? { + rtm + } : {}) + }; + }); +} +function handleAuctionEnd(args) { + const event = { + et: 'auction_data_sent', + to: getTimeOffset(_staticData?.t), + pvid: _staticData?.pvid, + pk: _staticData?.pk, + sk: _staticData?.sk, + geo: _staticData?.geo, + dp: _staticData?.device, + aid: _staticData?.aid, + pbv: VERSION, + url: URL, + aucid: args.auctionId, + ad_units: getAdUnitsData(args) + }; + sendEvent(event, 'rtd_demand'); +} +function handleBrowsiData(args) { + if (args.moduleName !== 'browsi') return; + setStaticData(args); +} +function handleModuleInit(args) { + if (args.moduleName !== 'browsi') return; + const event = { + et: 'rtd_init', + to: getTimeOffset(args.t), + pvid: args.pvid, + pk: args.pk, + sk: args.sk, + pbv: VERSION, + url: URL, + ...(args.rsn ? { + rsn: args.rsn + } : {}) + }; + sendEvent(event, 'rtd_supply'); +} +function sendEvent(event, topic) { + try { + const pvid = event.pvid || _staticData?.pvid || ''; + const body = JSON.stringify([event]); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(`${EVENT_SERVER_URL}/${topic}?p=${pvid}`, () => {}, body, { + contentType: 'application/json', + method: 'POST' + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Browsi Analytics error'); + } +} +let browsiAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__["default"])({ + url: EVENT_SERVER_URL, + analyticsType +}), { + track(_ref2) { + let { + eventType, + args + } = _ref2; + switch (eventType) { + case BROWSI_INIT: + handleModuleInit(args); + break; + case BROWSI_DATA: + handleBrowsiData(args); + break; + case AUCTION_END: + handleAuctionEnd(args); + break; + default: + break; + } + } +}); +browsiAnalytics.originEnableAnalytics = browsiAnalytics.enableAnalytics; +browsiAnalytics.enableAnalytics = function (config) { + browsiAnalytics.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: browsiAnalytics, + code: PROVIDER_NAME, + gvlid: GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (browsiAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.registerModule)('browsiAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/browsiAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["browsiBidAdapter"],{ + +/***/ "./modules/browsiBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/browsiBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'browsi'; +const DATA = 'brwvidtag'; +const ADAPTER = '__bad'; +const USP_TO_REPLACE = '__USP__'; +const GDPR_STR_TO_REPLACE = '__GDPR_STR__'; +const GDPR_TO_REPLACE = '__GDPR__'; +const ENDPOINT = 'https://rtb.avantisvideo.com/api/v2/auction/getbid'; +const spec = { + code: BIDDER_CODE, + gvlid: 329, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * @param bid + * @returns {boolean} + */ + isBidRequestValid: function (bid) { + if (!bid.params) { + return false; + } + const { + pubId, + tagId + } = bid.params; + const { + mediaTypes + } = bid; + return !!(validateBrowsiIds(pubId, tagId) && mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]); + }, + /** + * Make a server request from the list of BidRequests + * @param validBidRequests + * @param bidderRequest + * @returns ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const requests = []; + const { + refererInfo, + bidderRequestId, + gdprConsent, + uspConsent + } = bidderRequest; + validBidRequests.forEach(bidRequest => { + const { + bidId, + adUnitCode, + auctionId, + ortb2Imp, + schain, + params + } = bidRequest; + const video = getVideoMediaType(bidRequest); + const request = { + method: 'POST', + url: params.endpoint || ENDPOINT, + data: { + requestId: bidderRequestId, + bidId: bidId, + timeout: getTimeout(bidderRequest), + baData: getData(), + referer: refererInfo.page || refererInfo, + gdpr: gdprConsent, + ccpa: uspConsent, + sizes: video.playerSize, + video: video, + aUCode: adUnitCode, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + aID: auctionId, + tID: ortb2Imp?.ext?.tid, + schain: schain, + params: params + } + }; + requests.push(request); + }); + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * @param serverResponse A successful response from the server. + * @param request + * @returns {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + const response = serverResponse?.body; + if (!response) { + return bidResponses; + } + const { + bidId, + w, + h, + vXml, + vUrl, + cpm, + cur, + ttl, + ...extraParams + } = response; + delete extraParams.userSyncs; + const bidResponse = { + requestId: request.data.bidId, + bidId, + vastXml: vXml, + vastUrl: vUrl, + cpm, + ttl, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + width: w, + height: h, + currency: cur, + ...extraParams + }; + bidResponses.push(bidResponse); + return bidResponses; + }, + /** + * Extracts user-syncs information from server response + * @param syncOptions {SyncOptions} + * @param serverResponses {ServerResponse[]} + * @param gdprConsent + * @param uspConsent + * @returns {UserSync[]} + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const serverResponse = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponses) ? serverResponses[0] : serverResponses; + const syncParams = serverResponse?.body?.userSyncs; + const userSyncs = []; + const allowedTypes = []; + syncOptions.iframeEnabled && allowedTypes.push('iframe'); + syncOptions.pixelEnabled && allowedTypes.push('image'); + if (syncParams && allowedTypes.length) { + syncParams.forEach(syncParam => { + let { + url, + type + } = syncParam; + if (!allowedTypes.includes(type)) { + return; + } + url = getValidUrl(url, gdprConsent, uspConsent); + userSyncs.push({ + type, + url + }); + }); + } + return userSyncs; + }, + onTimeout(timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`${BIDDER_CODE} bidder timed out`, timeoutData); + }, + onBidderError: function (_ref) { + let { + error + } = _ref; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${BIDDER_CODE} bidder error`, error); + } +}; +/** + * Replaces GdprConsent and uspConsent params in url + * @param url {String} + * @param gdprConsent + * @param uspConsent + * @returns {string} + */ +const getValidUrl = function (url, gdprConsent, uspConsent) { + let validUrl = url.replace(GDPR_TO_REPLACE, gdprConsent?.gdprApplies || '').replace(GDPR_STR_TO_REPLACE, encodeURIComponent(gdprConsent?.consentString || '')).replace(USP_TO_REPLACE, encodeURIComponent(uspConsent?.consentString || '')); + if (validUrl.indexOf('http') < 0) { + validUrl = 'http://' + validUrl; + } + return validUrl; +}; +const validateBrowsiIds = function (pubId, tagId) { + return pubId && tagId && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(pubId) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(tagId); +}; +const getData = function () { + return window[DATA]?.[ADAPTER]; +}; +const getTimeout = function (bidderRequest) { + return bidderRequest.timeout || _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('bidderTimeout'); +}; +const getVideoMediaType = function (bidRequest) { + return bidRequest.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('browsiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/browsiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["browsiRtdProvider"],{ + +/***/ "./modules/browsiRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/browsiRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports setTimestamp, initAnalytics, sendPageviewEvent, collectData, setBrowsiData, addBrowsiTag, getCurrentData, browsiSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/browsiUtils/browsiUtils.js */ "./libraries/browsiUtils/browsiUtils.js"); + +/** + * This module adds browsi provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch predictions from browsi server + * The module will place browsi bootstrap script on page + * @module modules/browsiProvider + * @requires module:modules/realTimeData + */ + +/** + * @typedef {Object} ModuleParams + * @property {string} siteKey + * @property {string} pubKey + * @property {string} url + * @property {?string} keyName + * @property {?string} splitKey + */ + + + + + + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'browsi'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME +}); +const RANDOM = Math.floor(Math.random() * 10) + 1; +const API_KEY = (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.generateRandomString)(); +let PVID = (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.getUUID)(); + +/** @type {ModuleParams} */ +let _moduleParams = {}; +/** @type {null|Object} */ +let _browsiData = null; +/** @type {null | function} */ +let _dataReadyCallback = null; +/** @type {null|Object} */ +let _ic = {}; +/** @type {null|number} */ +let TIMESTAMP = null; +function setTimestamp() { + TIMESTAMP = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.timestamp)(); +} +function initAnalytics() { + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().enableAnalytics({ + provider: 'browsi', + options: {} + }); +} +function sendPageviewEvent(eventType) { + if (eventType === 'PAGEVIEW') { + window.addEventListener('browsi_pageview', () => { + _src_events_js__WEBPACK_IMPORTED_MODULE_5__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BILLABLE_EVENT, { + vendor: 'browsi', + type: 'pageview', + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)() + }); + }); + } +} +function sendModuleInitEvent(rsn) { + _src_events_js__WEBPACK_IMPORTED_MODULE_5__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BROWSI_INIT, { + moduleName: MODULE_NAME, + sk: _moduleParams.siteKey, + pk: _moduleParams.pubKey, + t: TIMESTAMP, + pvid: PVID, + ...(rsn || {}) + }); +} +function sendBrowsiDataEvent(data) { + _src_events_js__WEBPACK_IMPORTED_MODULE_5__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BROWSI_DATA, { + moduleName: MODULE_NAME, + pvid: PVID || data.pvid, + d: data.d, + g: data.g, + aid: data.aid, + es: data.es, + sk: _moduleParams.siteKey, + pk: _moduleParams.pubKey, + t: TIMESTAMP + }); +} + +/** + * collect required data from page + * send data to browsi server to get predictions + */ +function collectData() { + const predictorData = (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.getPredictorData)(storage, _moduleParams, TIMESTAMP, PVID); + getPredictionsFromServer(`//${_moduleParams.url}/prebid/v2?${(0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.toUrlParams)(predictorData)}`); +} +function setBrowsiData(data) { + _browsiData = data; + if (!PVID) { + PVID = data.pvid; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(_dataReadyCallback)) { + _dataReadyCallback(); + _dataReadyCallback = null; + } +} + +/** + * wait for data from server + * call callback when data is ready + * @param {function} callback + */ +function waitForData(callback) { + if (_browsiData) { + _dataReadyCallback = null; + callback(); + } else { + _dataReadyCallback = callback; + } +} + +/** + * add browsi script to page + * @param {Object} data + */ +function addBrowsiTag(data) { + let script = (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_7__.loadExternalScript)(data.u, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, 'browsi'); + script.async = true; + script.setAttribute('data-sitekey', _moduleParams.siteKey); + script.setAttribute('data-pubkey', _moduleParams.pubKey); + script.setAttribute('prebidbpt', 'true'); + script.setAttribute('id', 'browsi-tag'); + script.setAttribute('src', data.u); + script.prebidData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(typeof data === 'string' ? Object(data) : data); + script.brwRandom = RANDOM; + Object.assign(script.prebidData, { + pvid: PVID || data.pvid, + t: TIMESTAMP, + apik: API_KEY + }); + if (_moduleParams.keyName) { + script.prebidData.kn = _moduleParams.keyName; + } + return script; +} + +/** + * add browsitag to window object + * @param {Object} data + */ +function setWindowBrowsiTag(data) { + if (data.eap) { + window.browsitag = window.browsitag || {}; + window.browsitag.cmd = window.browsitag.cmd || []; + window.browsitag.data = window.browsitag.data || {}; + window.browsitag.data.get = getBrowsiTagServerData; + window.dispatchEvent(new CustomEvent('browsiData', { + detail: { + isPartialData: true + } + })); + } +} +function getBrowsiTagServerData(identifier) { + const uc = identifier || 'placeholder'; + const rtd = getServerData([uc]); + return Object.assign(rtd[uc], { + isPartialData: true + }); +} +function getOnPageData(auc) { + try { + const dataMap = {}; + auc.forEach(uc => { + dataMap[uc] = window[API_KEY]?.get(uc); + }); + return dataMap; + } catch (e) { + return {}; + } +} +function getServerData(auc) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`Browsi RTD provider is fetching data for ${auc}`); + try { + const _pg = _browsiData && _browsiData.pg || {}; + const _plc = _browsiData && _browsiData.plc || {}; + return auc.reduce((rp, uc) => { + _ic[uc] = _ic[uc] || 0; + const _c = _ic[uc]; + if (!uc) { + return rp; + } + rp[uc] = {}; + Object.assign(rp[uc], _pg); + const adSlot = (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.getSlotByCode)(uc); + const identifier = adSlot ? (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.getMacroId)(_browsiData['pmd'], adSlot) : uc; + const _pd = _plc[identifier]; + if (!_pd) { + return rp; + } + Object.entries(_pd).forEach(_ref => { + let [key, value] = _ref; + const kv = getKVObject(key, getCurrentData(value, _c)); + Object.assign(rp[uc], kv); + }); + return rp; + }, {}); + } catch (e) { + return {}; + } +} + +/** + * get prediction + * return -1 if prediction not found + * @param {object} prediction + * @param {number} _c + * @return {number} + */ +function getCurrentData(prediction, _c) { + if (!prediction || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(_c)) { + return -1; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(prediction)) { + return prediction; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(prediction[_c])) { + return prediction[_c]; + } + if (Object.keys(prediction).length > 1) { + while (_c > 0) { + _c--; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(prediction[_c])) { + return prediction[_c]; + } + } + } + return -1; +} + +/** + * get prediction and return valid object for key value set + * @param {string} k + * @param {number} p + * @return {Object} key:value + */ +function getKVObject(k, p) { + if (p < 0) return {}; + return { + [k]: p + }; +} + +/** + * XMLHttpRequest to get data form browsi server + * @param {string} url server url with query params + */ +function getPredictionsFromServer(url) { + let ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_8__.ajaxBuilder)(); + ajax(url, { + success: function (response, req) { + if (req.status === 200) { + try { + const data = JSON.parse(response); + if (data) { + setBrowsiData(data); + setWindowBrowsiTag(data); + sendBrowsiDataEvent(data); + } else { + setBrowsiData({}); + } + sendPageviewEvent(data.bet); + addBrowsiTag(data); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('unable to parse data'); + setBrowsiData({}); + } + } else if (req.status === 204) { + // unrecognized site key + setBrowsiData({}); + } + }, + error: function () { + setBrowsiData({}); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('unable to get prediction data'); + } + }); +} +function mergeAdUnitData() { + let rtdData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let onPageData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const mergedData = {}; + Object.keys({ + ...rtdData, + ...onPageData + }).forEach(key => { + mergedData[key] = { + ...onPageData[key], + ...rtdData[key] + }; + }); + return mergedData; +} +function getAdUnitCodes(bidObj) { + let adUnitCodes = bidObj.adUnitCodes; + let adUnits = bidObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().adUnits || []; + if (adUnitCodes) { + adUnits = adUnits.filter(au => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_9__.includes)(adUnitCodes, au.code)); + } else { + adUnitCodes = adUnits.map(au => au.code); + } + return { + adUnitCodes, + adUnits + }; +} +function isOnPageDataApiReady() { + return !!window[API_KEY]?.get; +} +function onDataReady() { + return new Promise(resolve => { + waitForData(() => { + if (isOnPageDataApiReady()) { + return resolve(); + } + const interval = setInterval(() => { + if (isOnPageDataApiReady()) { + clearInterval(interval); + return resolve(); + } + }, 250); + }); + }); +} +function onTimeout(config, timeout) { + return new Promise(resolve => { + if (!config.waitForIt || !timeout) { + return resolve(); + } + setTimeout(() => { + return resolve(); + }, timeout * 0.7); + }); +} +function setBidRequestsData(bidObj, callback, config, userConsent, timeout) { + Promise.race([onDataReady(), onTimeout(config, timeout)]).then(() => { + const pr = _browsiData && _browsiData.pr; + if (!pr || !pr.length) return; + const { + adUnitCodes, + adUnits + } = getAdUnitCodes(bidObj); + const onPageData = getOnPageData(adUnitCodes); + const rtdData = getServerData(adUnitCodes); + const data = mergeAdUnitData(rtdData, onPageData); + adUnits.forEach(adUnit => { + const validBidders = adUnit.bids.filter(bid => pr.includes(bid.bidder)); + if (validBidders.length) { + const adUnitData = data[adUnit.code]; + if (adUnitData) { + validBidders.forEach(bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(bid, 'ortb2Imp.ext.data.browsi', adUnitData); + }); + } + } + }); + callback(); + }); +} +function getGptTargeting(uc) { + try { + const sg = !!(_browsiData && _browsiData.sg); + if (!sg) return {}; + const rtd = getServerData(uc); + const { + viewabilityKey, + scrollKey, + revenueKey + } = (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.getTargetingKeys)(_moduleParams['keyName']); + return Object.fromEntries(Object.entries(rtd).map(_ref2 => { + let [key, value] = _ref2; + const { + viewabilityValue, + scrollValue, + revenueValue + } = (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.getTargetingValues)(value); + const result = { + ...(viewabilityValue ? { + [viewabilityKey]: viewabilityValue + } : {}), + ...(scrollValue ? { + [scrollKey]: scrollValue + } : {}), + ...(revenueValue ? { + [revenueKey]: revenueValue + } : {}) + }; + return [key, result]; + })); + } catch (e) { + return {}; + } +} +function getTargetingData(uc, c, us, a) { + const targetingData = getGptTargeting(uc); + const auctionId = a.auctionId; + const sendAdRequestEvent = _browsiData && _browsiData['bet'] === 'AD_REQUEST'; + uc.forEach(auc => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(_ic[auc])) { + _ic[auc] = _ic[auc] + 1; + } + if (sendAdRequestEvent) { + const transactionId = a.adUnits.find(adUnit => adUnit.code === auc).transactionId; + _src_events_js__WEBPACK_IMPORTED_MODULE_5__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BILLABLE_EVENT, { + vendor: 'browsi', + type: 'adRequest', + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(), + transactionId: transactionId, + auctionId: auctionId + }); + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Browsi RTD provider returned targeting data', targetingData, 'for', uc); + return targetingData; +} +function init(moduleConfig) { + _moduleParams = moduleConfig.params; + _moduleParams.siteKey = moduleConfig.params.siteKey || moduleConfig.params.sitekey; + _moduleParams.pubKey = moduleConfig.params.pubKey || moduleConfig.params.pubkey; + initAnalytics(); + setTimestamp(); + if (_moduleParams && _moduleParams.siteKey && _moduleParams.pubKey && _moduleParams.url) { + sendModuleInitEvent(); + collectData(); + (0,_libraries_browsiUtils_browsiUtils_js__WEBPACK_IMPORTED_MODULE_2__.setKeyValue)(_moduleParams.splitKey, RANDOM); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('missing params for Browsi provider'); + sendModuleInitEvent('missing params'); + } + return true; +} + +/** @type {RtdSubmodule} */ +const browsiSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: MODULE_NAME, + /** + * get data and send back to realTimeData module + * @function + * @param {string[]} adUnitsCodes + */ + getTargetingData: getTargetingData, + init: init, + getBidRequestData: setBidRequestsData +}; +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_11__.submodule)('realTimeData', browsiSubmodule); +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('browsiRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","browsiUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/browsiRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["bucksenseBidAdapter"],{ + +/***/ "./modules/bucksenseBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/bucksenseBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const WHO = 'BKSHBID-005'; +const BIDDER_CODE = 'bucksense'; +const URL = 'https://directo.prebidserving.com/prebidjs/'; +const spec = { + code: BIDDER_CODE, + gvlid: 235, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' isBidRequestValid() - INPUT bid:', bid); + if (bid.bidder !== BIDDER_CODE || typeof bid.params === 'undefined') { + return false; + } + if (typeof bid.params.placementId === 'undefined') { + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' buildRequests() - INPUT validBidRequests:', validBidRequests, 'INPUT bidderRequest:', bidderRequest); + let requests = []; + const len = validBidRequests.length; + for (let i = 0; i < len; i++) { + var bid = validBidRequests[i]; + var params = {}; + for (var key in bid.params) { + if (bid.params.hasOwnProperty(key)) { + params[key] = encodeURI(bid.params[key]); + } + } + delete bid.params; + var sizes = bid.sizes; + delete bid.sizes; + var sendData = { + 'pub_id': location.host, + 'pl_id': '' + params.placementId, + 'secure': location.protocol === 'https:' ? 1 : 0, + 'href': encodeURI(location.href), + 'bid_id': bid.bidId, + 'params': params, + 'sizes': sizes, + '_bid': bidderRequest + }; + requests.push({ + method: 'POST', + url: URL, + data: sendData + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' buildRequests() - requests:', requests); + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' interpretResponse() - INPUT serverResponse:', serverResponse, 'INPUT request:', request); + const bidResponses = []; + if (serverResponse.body) { + var oResponse = serverResponse.body; + var sRequestID = oResponse.requestId || ''; + var nCPM = oResponse.cpm || 0; + var nWidth = oResponse.width || 0; + var nHeight = oResponse.height || 0; + var nTTL = oResponse.ttl || 0; + var sCreativeID = oResponse.creativeId || 0; + var sCurrency = oResponse.currency || 'USD'; + var bNetRevenue = oResponse.netRevenue || true; + var sAd = oResponse.ad || ''; + var sAdomains = oResponse.adomains || []; + if (request && sRequestID.length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' interpretResponse() - use RequestID from Placments'); + sRequestID = request.data.bid_id || ''; + } + if (request && request.data.params.hasOwnProperty('testcpm')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' interpretResponse() - use Test CPM '); + nCPM = request.data.params.testcpm; + } + let bidResponse = { + requestId: sRequestID, + cpm: nCPM, + width: nWidth, + height: nHeight, + ttl: nTTL, + creativeId: sCreativeID, + currency: sCurrency, + netRevenue: bNetRevenue, + ad: sAd, + meta: { + advertiserDomains: sAdomains + } + }; + bidResponses.push(bidResponse); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' interpretResponse() - serverResponse not valid'); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(WHO + ' interpretResponse() - return', bidResponses); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('bucksenseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/bucksenseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["buzzoolaBidAdapter"],{ + +/***/ "./modules/buzzoolaBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/buzzoolaBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'buzzoola'; +const ENDPOINT = 'https://exchange.buzzoola.com/ssp/prebidjs'; +const RENDERER_SRC = 'https://tube.buzzoola.com/new/build/buzzlibrary.js'; +const spec = { + code: BIDDER_CODE, + aliases: ['buzzoolaAdapter'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let types = bid.mediaTypes; + return !!(bid && bid.mediaTypes && (types.banner || types.video || types.native) && bid.params && bid.params.placementId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests an array of bids + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidderRequest.bids = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(bidderRequest.bids); + return { + url: ENDPOINT, + method: 'POST', + data: bidderRequest + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (_ref, _ref2) { + let { + body + } = _ref; + let { + data + } = _ref2; + let requestBids = {}; + let response; + try { + response = JSON.parse(body); + } catch (ex) { + response = body; + } + if (!Array.isArray(response)) response = []; + data.bids.forEach(bid => requestBids[bid.bidId] = bid); + return response.map(bid => { + let requestBid = requestBids[bid.requestId]; + let context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(requestBid, 'mediaTypes.video.context'); + let validBid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(bid); + if (validBid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && context === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM) { + let renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: validBid.requestId, + url: RENDERER_SRC, + loaded: false + }); + renderer.setRender(setOutstreamRenderer); + validBid.renderer = renderer; + } + return validBid; + }); + } +}; + +/** + * Initialize Buzzoola Outstream player + * + * @param bid + */ +function setOutstreamRenderer(bid) { + let adData = JSON.parse(bid.ad); + let unitSettings = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adData, 'placement.unit_settings'); + let extendedSettings = { + width: '' + bid.width, + height: '' + bid.height, + container_height: '' + bid.height + }; + adData.placement = Object.assign({}, adData.placement); + adData.placement.unit_settings = Object.assign({}, unitSettings, extendedSettings); + bid.renderer.push(() => { + window.Buzzoola.Core.install(document.querySelector(`#${bid.adUnitCode}`), { + data: adData + }); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('buzzoolaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/buzzoolaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["byDataAnalyticsAdapter"],{ + +/***/ "./modules/byDataAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/byDataAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var crypto_js_enc_base64__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/enc-base64 */ "./node_modules/crypto-js/enc-base64.js"); +/* harmony import */ var crypto_js_enc_base64__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_base64__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var crypto_js_hmac_sha512__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js/hmac-sha512 */ "./node_modules/crypto-js/hmac-sha512.js"); +/* harmony import */ var crypto_js_hmac_sha512__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js_hmac_sha512__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var crypto_js_enc_utf8__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto-js/enc-utf8 */ "./node_modules/crypto-js/enc-utf8.js"); +/* harmony import */ var crypto_js_enc_utf8__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_utf8__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + + + + + +const versionCode = '4.4.1'; +const secretKey = 'bydata@123456'; +const { + NO_BID, + BID_TIMEOUT, + AUCTION_END, + AUCTION_INIT, + BID_WON +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS; +const DEFAULT_EVENT_URL = 'https://pbjs-stream.bydata.com/topics/prebid'; +const analyticsType = 'endpoint'; +const isBydata = isKeyInUrl('bydata_debug'); +const adunitsMap = {}; +const MODULE_CODE = 'bydata'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_4__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_5__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); +let initOptions = {}; +var payload = {}; +var winPayload = {}; +var isDataSend = window.asc_data || false; +var bdNbTo = { + 'to': [], + 'nb': [] +}; + +/* method used for testing parameters */ +function isKeyInUrl(name) { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const param = urlParams.get(name); + return param; +} + +/* return ad unit full path wrt custom ad unit code */ +function getAdunitName(code) { + var name = code; + for (const [key, value] of Object.entries(adunitsMap)) { + if (key === code) { + name = value; + } + } + return name; +} + +/* EVENT: auction init */ +function onAuctionStart(t) { + /* map of ad unit code - ad unit full path */ + t.adUnits && t.adUnits.length && t.adUnits.forEach(adu => { + const { + code, + adunit + } = adu; + adunitsMap[code] = adunit; + }); +} + +/* EVENT: bid timeout */ +function onBidTimeout(t) { + if (payload['visitor_data'] && t && t.length > 0) { + bdNbTo['to'] = t; + } +} + +/* EVENT: no bid */ +function onNoBidData(t) { + if (payload['visitor_data'] && t) { + bdNbTo['nb'].push(t); + } +} + +/* EVENT: bid won */ +function onBidWon(t) { + const { + isCorrectOption + } = initOptions; + if (isCorrectOption && (isDataSend || isBydata)) { + ascAdapter.getBidWonData(t); + ascAdapter.sendPayload(winPayload); + } +} + +/* EVENT: auction end */ +function onAuctionEnd(t) { + const { + isCorrectOption + } = initOptions; + setTimeout(() => { + if (isCorrectOption && (isDataSend || isBydata)) { + ascAdapter.dataProcess(t); + ascAdapter.sendPayload(payload); + } + }, 500); +} +const ascAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_6__["default"])({ + url: DEFAULT_EVENT_URL, + analyticsType: analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_INIT: + onAuctionStart(args); + break; + case NO_BID: + onNoBidData(args); + break; + case BID_TIMEOUT: + onBidTimeout(args); + break; + case AUCTION_END: + onAuctionEnd(args); + break; + case BID_WON: + onBidWon(args); + break; + default: + break; + } + } +}); + +// save the base class function +ascAdapter.originEnableAnalytics = ascAdapter.enableAnalytics; +// override enableAnalytics so we can get access to the config passed in from the page +ascAdapter.enableAnalytics = function (config) { + if (this.initConfig(config)) { + initOptions.isCorrectOption && ascAdapter.getVisitorData(); + ascAdapter.originEnableAnalytics(config); + } +}; +ascAdapter.initConfig = function (config) { + let isCorrectOption = true; + initOptions = {}; + var rndNum = Math.floor(Math.random() * 10000 + 1); + initOptions.options = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.deepClone)(config.options); + initOptions.clientId = initOptions.options.clientId || null; + initOptions.logFrequency = initOptions.options.logFrequency; + if (!initOptions.clientId) { + _logError('"options.clientId" should not empty!!'); + isCorrectOption = false; + } + if (rndNum <= initOptions.logFrequency) { + window.asc_data = isDataSend = true; + } + initOptions.isCorrectOption = isCorrectOption; + this.initOptions = initOptions; + return isCorrectOption; +}; +ascAdapter.getBidWonData = function (t) { + const { + auctionId, + adUnitCode, + size, + requestId, + bidder, + timeToRespond, + currency, + mediaType, + cpm + } = t; + const aun = getAdunitName(adUnitCode); + winPayload['aid'] = auctionId; + winPayload['as'] = ''; + winPayload['auctionData'] = []; + var data = {}; + data['au'] = aun; + data['auc'] = adUnitCode; + data['aus'] = size; + data['bid'] = requestId; + data['bidadv'] = bidder; + data['br_pb_mg'] = cpm; + data['br_tr'] = timeToRespond; + data['bradv'] = bidder; + data['brid'] = requestId; + data['brs'] = size; + data['cur'] = currency; + data['inb'] = 0; + data['ito'] = 0; + data['ipwb'] = 1; + data['iwb'] = 1; + data['mt'] = mediaType; + winPayload['auctionData'].push(data); + return winPayload; +}; +ascAdapter.getVisitorData = function () { + let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var ua = data.uid ? data : {}; + var module = { + options: [], + header: [window.navigator.platform, window.navigator.userAgent, window.navigator.appVersion, window.navigator.vendor, window.opera], + dataos: [{ + name: 'Windows Phone', + value: 'Windows Phone', + version: 'OS' + }, { + name: 'Windows', + value: 'Win', + version: 'NT' + }, { + name: 'iPhone', + value: 'iPhone', + version: 'OS' + }, { + name: 'iPad', + value: 'iPad', + version: 'OS' + }, { + name: 'Kindle', + value: 'Silk', + version: 'Silk' + }, { + name: 'Android', + value: 'Android', + version: 'Android' + }, { + name: 'PlayBook', + value: 'PlayBook', + version: 'OS' + }, { + name: 'BlackBerry', + value: 'BlackBerry', + version: '/' + }, { + name: 'Macintosh', + value: 'Mac', + version: 'OS X' + }, { + name: 'Linux', + value: 'Linux', + version: 'rv' + }, { + name: 'Palm', + value: 'Palm', + version: 'PalmOS' + }], + databrowser: [{ + name: 'Chrome', + value: 'Chrome', + version: 'Chrome' + }, { + name: 'Firefox', + value: 'Firefox', + version: 'Firefox' + }, { + name: 'Safari', + value: 'Safari', + version: 'Version' + }, { + name: 'Internet Explorer', + value: 'MSIE', + version: 'MSIE' + }, { + name: 'Opera', + value: 'Opera', + version: 'Opera' + }, { + name: 'BlackBerry', + value: 'CLDC', + version: 'CLDC' + }, { + name: 'Mozilla', + value: 'Mozilla', + version: 'Mozilla' + }], + init: function () { + var agent = this.header.join(' '); + var os = this.matchItem(agent, this.dataos); + var browser = this.matchItem(agent, this.databrowser); + return { + os: os, + browser: browser + }; + }, + matchItem: function (string, data) { + var i = 0; + var j = 0; + var regex; + var regexv; + var match; + var matches; + var version; + for (i = 0; i < data.length; i += 1) { + regex = new RegExp(data[i].value, 'i'); + match = regex.test(string); + if (match) { + regexv = new RegExp(data[i].version + '[- /:;]([\\d._]+)', 'i'); + matches = string.match(regexv); + version = ''; + if (matches) { + if (matches[1]) { + matches = matches[1]; + } + } + if (matches) { + matches = matches.split(/[._]+/); + for (j = 0; j < matches.length; j += 1) { + if (j === 0) { + version += matches[j] + '.'; + } else { + version += matches[j]; + } + } + } else { + version = '0'; + } + return { + name: data[i].name, + version: parseFloat(version) + }; + } + } + return { + name: 'unknown', + version: 0 + }; + } + }; + function generateUid() { + try { + var buffer = new Uint8Array(16); + crypto.getRandomValues(buffer); + buffer[6] = buffer[6] & ~176 | 64; + buffer[8] = buffer[8] & ~64 | 128; + var hex = Array.prototype.map.call(new Uint8Array(buffer), function (x) { + return ('00' + x.toString(16)).slice(-2); + }).join(''); + return hex.slice(0, 5) + '-' + hex.slice(5, 9) + '-' + hex.slice(9, 13) + '-' + hex.slice(13, 18); + } catch (e) { + return ''; + } + } + function base64url(source) { + var encodedSource = crypto_js_enc_base64__WEBPACK_IMPORTED_MODULE_0___default().stringify(source); + encodedSource = encodedSource.replace(/=+$/, ''); + encodedSource = encodedSource.replace(/\+/g, '-'); + encodedSource = encodedSource.replace(/\//g, '_'); + return encodedSource; + } + function getJWToken(data) { + var header = { + 'alg': 'HS256', + 'typ': 'JWT' + }; + var stringifiedHeader = crypto_js_enc_utf8__WEBPACK_IMPORTED_MODULE_2___default().parse(JSON.stringify(header)); + var encodedHeader = base64url(stringifiedHeader); + var stringifiedData = crypto_js_enc_utf8__WEBPACK_IMPORTED_MODULE_2___default().parse(JSON.stringify(data)); + var encodedData = base64url(stringifiedData); + var token = encodedHeader + '.' + encodedData; + var signature = crypto_js_hmac_sha512__WEBPACK_IMPORTED_MODULE_1___default()(token, secretKey); + signature = base64url(signature); + var signedToken = token + '.' + signature; + return signedToken; + } + function detectWidth() { + const { + width: viewportWidth + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_8__.getViewportSize)(); + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.getWinDimensions)(); + return windowDimensions.screen.width || windowDimensions.innerWidth && windowDimensions.document.documentElement.clientWidth ? Math.min(windowDimensions.innerWidth, windowDimensions.document.documentElement.clientWidth) : viewportWidth; + } + function giveDeviceTypeOnScreenSize() { + var _dWidth = detectWidth(); + return _dWidth > 1024 ? 'Desktop' : _dWidth <= 1024 && _dWidth >= 768 ? 'Tablet' : 'Mobile'; + } + const { + clientId + } = initOptions; + var userId = storage.getDataFromLocalStorage('userId'); + if (!userId) { + userId = generateUid(); + storage.setDataInLocalStorage('userId', userId); + } + var screenSize = { + width: window.screen.width, + height: window.screen.height + }; + var deviceType = giveDeviceTypeOnScreenSize(); + var e = module.init(); + if (!ua['uid']) { + ua['uid'] = userId; + ua['cid'] = clientId; + ua['pid'] = window.location.hostname; + ua['os'] = e.os.name; + ua['osv'] = e.os.version; + ua['br'] = e.browser.name; + ua['brv'] = e.browser.version; + ua['ss'] = screenSize; + ua['de'] = deviceType; + ua['tz'] = window.Intl.DateTimeFormat().resolvedOptions().timeZone; + } + var signedToken = getJWToken(ua); + payload['visitor_data'] = signedToken; + winPayload['visitor_data'] = signedToken; + return signedToken; +}; +ascAdapter.dataProcess = function (t) { + if (isBydata) { + payload['bydata_debug'] = 'true'; + } + _logInfo('fulldata - ', t); + payload['aid'] = t.auctionId; + payload['as'] = t.timestamp; + payload['auctionData'] = []; + var bidderRequestsData = []; + var bidsReceivedData = []; + t.bidderRequests && t.bidderRequests.forEach(bidReq => { + var pObj = {}; + pObj['bids'] = []; + bidReq.bids.forEach(bid => { + var data = {}; + data['adUnitCode'] = bid.adUnitCode; + data['sizes'] = bid.sizes; + data['bidder'] = bid.bidder; + data['bidId'] = bid.bidId; + data['mediaTypes'] = []; + var mt = bid.mediaTypes.banner ? 'display' : 'video'; + data['mediaTypes'].push(mt); + pObj['bids'].push(data); + }); + bidderRequestsData.push(pObj); + }); + t.bidsReceived && t.bidsReceived.forEach(bid => { + const { + requestId, + bidder, + width, + height, + cpm, + currency, + timeToRespond, + adUnitCode + } = bid; + bidsReceivedData.push({ + requestId, + bidder, + width, + height, + cpm, + currency, + timeToRespond, + adUnitCode + }); + }); + bidderRequestsData.length > 0 && bidderRequestsData.forEach(bdObj => { + var bdsArray = bdObj['bids']; + bdsArray.forEach(bid => { + const { + adUnitCode, + sizes, + bidder, + bidId, + mediaTypes + } = bid; + sizes.forEach(size => { + var sstr = size[0] + 'x' + size[1]; + payload['auctionData'].push({ + au: getAdunitName(adUnitCode), + auc: adUnitCode, + aus: sstr, + mt: mediaTypes[0], + bidadv: bidder, + bid: bidId, + inb: 0, + ito: 0, + ipwb: 0, + iwb: 0 + }); + }); + }); + }); + bidsReceivedData.length > 0 && bidsReceivedData.forEach(bdRecived => { + const { + requestId, + bidder, + width, + height, + cpm, + currency, + timeToRespond + } = bdRecived; + payload['auctionData'].forEach(rwData => { + if (rwData['bid'] === requestId && rwData['aus'] === width + 'x' + height) { + rwData['brid'] = requestId; + rwData['bradv'] = bidder; + rwData['br_pb_mg'] = cpm; + rwData['cur'] = currency; + rwData['br_tr'] = timeToRespond; + rwData['brs'] = width + 'x' + height; + } + }); + }); + var prebidWinningBids = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_9__.auctionManager.getBidsReceived().filter(bid => bid.status === _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.BID_STATUS.BID_TARGETING_SET); + prebidWinningBids && prebidWinningBids.length > 0 && prebidWinningBids.forEach(pbbid => { + payload['auctionData'] && payload['auctionData'].forEach(rwData => { + if (rwData['bid'] === pbbid.requestId && rwData['brs'] === pbbid.size) { + rwData['ipwb'] = 1; + } + }); + }); + var winningBids = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_9__.auctionManager.getAllWinningBids(); + winningBids && winningBids.length > 0 && winningBids.forEach(wBid => { + payload['auctionData'] && payload['auctionData'].forEach(rwData => { + if (rwData['bid'] === wBid.requestId && rwData['brs'] === wBid.size) { + rwData['iwb'] = 1; + } + }); + }); + payload['auctionData'] && payload['auctionData'].length > 0 && payload['auctionData'].forEach(u => { + bdNbTo['to'].forEach(i => { + if (u.bid === i.bidId) u.ito = 1; + }); + bdNbTo['nb'].forEach(i => { + if (u.bidadv === i.bidder && u.bid === i.bidId) { + u.inb = 1; + } + }); + }); + return payload; +}; +ascAdapter.sendPayload = function (data) { + var obj = { + 'records': [{ + 'value': data + }] + }; + let strJSON = JSON.stringify(obj); + sendDataOnKf(strJSON); +}; +function sendDataOnKf(dataObj) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_10__.ajax)(DEFAULT_EVENT_URL, { + success: function () { + _logInfo('send data success'); + }, + error: function (e) { + _logInfo('send data error', e); + } + }, dataObj, { + contentType: 'application/vnd.kafka.json.v2+json', + method: 'POST', + withCredentials: true + }); +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__["default"].registerAnalyticsAdapter({ + adapter: ascAdapter, + code: MODULE_CODE +}); +function _logInfo(message, meta) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.logInfo)(buildLogMessage(message), meta); +} +function _logError(message) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.logError)(buildLogMessage(message)); +} +function buildLogMessage(message) { + return 'Bydata Prebid Analytics ' + versionCode + ':' + message; +} +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (ascAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('byDataAnalyticsAdapter'); + +/***/ }), + +/***/ "./node_modules/crypto-js/core.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/core.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(); + } + else {} +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.crypto) { + crypto = __webpack_require__.g.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && "function" === 'function') { + try { + crypto = __webpack_require__(/*! crypto */ "?9157"); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/enc-base64.js": +/*!**********************************************!*\ + !*** ./node_modules/crypto-js/enc-base64.js ***! + \**********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + return CryptoJS.enc.Base64; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/enc-utf8.js": +/*!********************************************!*\ + !*** ./node_modules/crypto-js/enc-utf8.js ***! + \********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + return CryptoJS.enc.Utf8; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/hmac-sha512.js": +/*!***********************************************!*\ + !*** ./node_modules/crypto-js/hmac-sha512.js ***! + \***********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory, undef) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js"), __webpack_require__(/*! ./x64-core */ "./node_modules/crypto-js/x64-core.js"), __webpack_require__(/*! ./sha512 */ "./node_modules/crypto-js/sha512.js"), __webpack_require__(/*! ./hmac */ "./node_modules/crypto-js/hmac.js")); + } + else {} +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA512; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/hmac.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/hmac.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/sha512.js": +/*!******************************************!*\ + !*** ./node_modules/crypto-js/sha512.js ***! + \******************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory, undef) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js"), __webpack_require__(/*! ./x64-core */ "./node_modules/crypto-js/x64-core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + return CryptoJS.SHA512; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/x64-core.js": +/*!********************************************!*\ + !*** ./node_modules/crypto-js/x64-core.js ***! + \********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + return CryptoJS; + +})); + +/***/ }), + +/***/ "?9157": +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/***/ (() => { + +/* (ignored) */ + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/byDataAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["c1xBidAdapter"],{ + +/***/ "./modules/c1xBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/c1xBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export c1xAdapter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const BIDDER_CODE = 'c1x'; +const URL = 'https://hb-stg.c1exchange.com/ht'; +// const PIXEL_ENDPOINT = '//px.c1exchange.com/pubpixel/'; +const LOG_MSG = { + invalidBid: 'C1X: [ERROR] bidder returns an invalid bid', + noSite: 'C1X: [ERROR] no site id supplied', + noBid: 'C1X: [INFO] creating a NO bid for Adunit: ', + bidWin: 'C1X: [INFO] creating a bid for Adunit: ' +}; + +/** + * Adapter for requesting bids from C1X header tag server. + * v3.1 (c) C1X Inc., 2018 + */ + +const c1xAdapter = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + // check the bids sent to c1x bidder + isBidRequestValid: function (bid) { + if (bid.bidder !== BIDDER_CODE || typeof bid.params === 'undefined') { + return false; + } + if (typeof bid.params.placementId === 'undefined') { + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let payload = {}; + let tagObj = {}; + let bidRequest = []; + const adunits = validBidRequests.length; + const rnd = new Date().getTime(); + const c1xTags = validBidRequests.map(bidToTag); + const bidIdTags = validBidRequests.map(bidToShortTag); // include only adUnitCode and bidId from request obj + + // flattened tags in a tag object + tagObj = c1xTags.reduce((current, next) => Object.assign(current, next)); + payload = { + adunits: adunits.toString(), + rnd: rnd.toString(), + response: 'json', + compress: 'gzip' + }; + + // for GDPR support + if (bidderRequest && bidderRequest.gdprConsent) { + payload['consent_string'] = bidderRequest.gdprConsent.consentString; + payload['consent_required'] = typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies.toString() : 'true'; + } + Object.assign(payload, tagObj); + let payloadString = stringifyPayload(payload); + // ServerRequest object + bidRequest.push({ + method: 'GET', + url: URL, + data: payloadString, + bids: bidIdTags + }); + return bidRequest; + }, + interpretResponse: function (serverResponse, requests) { + serverResponse = serverResponse.body; + requests = requests.bids || []; + const currency = 'USD'; + const bidResponses = []; + let netRevenue = false; + if (!serverResponse || serverResponse.error) { + let errorMessage = serverResponse.error; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(LOG_MSG.invalidBid + errorMessage); + return bidResponses; + } else { + serverResponse.forEach(bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(bid); + if (bid.bid) { + if (bid.bidType === 'NET_BID') { + netRevenue = !netRevenue; + } + const curBid = { + requestId: bid.bidId, + width: bid.width, + height: bid.height, + cpm: bid.cpm, + ad: bid.ad, + creativeId: bid.crid, + currency: currency, + ttl: 300, + netRevenue: netRevenue + }; + if (bid.dealId) { + curBid['dealId'] = bid.dealId; + } + for (let i = 0; i < requests.length; i++) { + if (bid.adId === requests[i].adUnitCode) { + curBid.requestId = requests[i].bidId; + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_MSG.bidWin + bid.adId + ' size: ' + curBid.width + 'x' + curBid.height); + bidResponses.push(curBid); + } else { + // no bid + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_MSG.noBid + bid.adId); + } + }); + } + return bidResponses; + } +}; +function bidToTag(bid, index) { + const tag = {}; + const adIndex = 'a' + (index + 1).toString(); // ad unit id for c1x + const sizeKey = adIndex + 's'; + const priceKey = adIndex + 'p'; + const dealKey = adIndex + 'd'; + // TODO: Multiple Floor Prices + + const sizesArr = bid.sizes; + const floorPriceMap = getBidFloor(bid); + const dealId = bid.params.dealId || ''; + if (dealId) { + tag[dealKey] = dealId; + } + tag[adIndex] = bid.adUnitCode; + tag[sizeKey] = sizesArr.reduce((prev, current) => prev + (prev === '' ? '' : ',') + current.join('x'), ''); + const newSizeArr = tag[sizeKey].split(','); + if (floorPriceMap) { + newSizeArr.forEach(size => { + if (size in floorPriceMap) { + tag[priceKey] = floorPriceMap[size].toString(); + } // we only accept one cpm price in floorPriceMap + }); + } + if (bid.params.pageurl) { + tag['pageurl'] = bid.params.pageurl; + } + return tag; +} +function getBidFloor(bidRequest) { + let floorInfo = {}; + if (typeof bidRequest.getFloor === 'function') { + floorInfo = bidRequest.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '*' + }); + } + let floor = floorInfo?.floor || bidRequest.params.bidfloor || bidRequest.params.floorPriceMap || 0; + return floor; +} +function bidToShortTag(bid) { + const tag = {}; + tag.adUnitCode = bid.adUnitCode; + tag.bidId = bid.bidId; + return tag; +} +function stringifyPayload(payload) { + let payloadString = []; + for (var key in payload) { + if (payload.hasOwnProperty(key)) { + payloadString.push(key + '=' + payload[key]); + } + } + return payloadString.join('&'); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(c1xAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('c1xBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/c1xBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cadentApertureMXBidAdapter"],{ + +/***/ "./modules/cadentApertureMXBidAdapter.js": +/*!***********************************************!*\ + !*** ./modules/cadentApertureMXBidAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports cadentAdapter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + +const BIDDER_CODE = 'cadent_aperture_mx'; +const ENDPOINT = 'hb.emxdgt.com'; +const RENDERER_URL = 'https://js.brealtime.com/outstream/1.30.0/bundle.js'; +const ADAPTER_VERSION = '1.5.1'; +const DEFAULT_CUR = 'USD'; +const ALIASES = [{ + code: 'emx_digital', + gvlid: 183 +}, { + code: 'cadent', + gvlid: 183 +}]; +const EIDS_SUPPORTED = [{ + key: 'idl_env', + source: 'liveramp.com', + rtiPartner: 'idl', + queryParam: 'idl' +}, { + key: 'uid2.id', + source: 'uidapi.com', + rtiPartner: 'UID2', + queryParam: 'uid2' +}]; +const cadentAdapter = { + validateSizes: sizes => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(sizes) || typeof sizes[0] === 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': Sizes should be an array'); + return false; + } + return sizes.every(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(size) && size.length === 2); + }, + checkVideoContext: bid => { + return bid && bid.mediaTypes && bid.mediaTypes.video && bid.mediaTypes.video.context && (bid.mediaTypes.video.context === 'instream' || bid.mediaTypes.video.context === 'outstream'); + }, + buildBanner: bid => { + let sizes = []; + bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes ? sizes = bid.mediaTypes.banner.sizes : sizes = bid.sizes; + if (!cadentAdapter.validateSizes(sizes)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': could not detect mediaType banner sizes. Assigning to bid sizes instead'); + sizes = bid.sizes; + } + return { + format: sizes.map(size => { + return { + w: size[0], + h: size[1] + }; + }), + w: sizes[0][0], + h: sizes[0][1] + }; + }, + formatVideoResponse: (bidResponse, cadentBid, bidRequest) => { + bidResponse.vastXml = cadentBid.adm; + if (bidRequest.bidderRequest && bidRequest.bidderRequest.bids && bidRequest.bidderRequest.bids.length > 0) { + const matchingBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(bidRequest.bidderRequest.bids, bid => bidResponse.requestId && bid.bidId && bidResponse.requestId === bid.bidId && bid.mediaTypes && bid.mediaTypes.video && bid.mediaTypes.video.context === 'outstream'); + if (matchingBid) { + bidResponse.renderer = cadentAdapter.createRenderer(bidResponse, { + id: cadentBid.id, + url: RENDERER_URL + }); + } + } + return bidResponse; + }, + isMobile: () => { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); + }, + isConnectedTV: () => { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); + }, + getDevice: () => { + return { + ua: navigator.userAgent, + js: 1, + dnt: navigator.doNotTrack === 'yes' || navigator.doNotTrack === '1' || navigator.msDoNotTrack === '1' ? 1 : 0, + h: screen.height, + w: screen.width, + devicetype: cadentAdapter.isMobile() ? 1 : cadentAdapter.isConnectedTV() ? 3 : 2, + language: navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage + }; + }, + cleanProtocols: video => { + if (video.protocols && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(video.protocols, 7)) { + // not supporting VAST protocol 7 (VAST 4.0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': VAST 4.0 is currently not supported. This protocol has been filtered out of the request.'); + video.protocols = video.protocols.filter(protocol => protocol !== 7); + } + return video; + }, + outstreamRender: bid => { + bid.renderer.push(function () { + let params = bid && bid.params && bid.params[0] && bid.params[0].video ? bid.params[0].video : {}; + window.emxVideoQueue = window.emxVideoQueue || []; + window.queueEmxVideo({ + id: bid.adUnitCode, + adsResponses: bid.vastXml, + options: params + }); + if (window.emxVideoReady && window.videojs) { + window.emxVideoReady(); + } + }); + }, + createRenderer: (bid, rendererParams) => { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_2__.Renderer.install({ + id: rendererParams.id, + url: RENDERER_URL, + loaded: false + }); + try { + renderer.setRender(cadentAdapter.outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; + }, + buildVideo: bid => { + let videoObj = Object.assign(bid.mediaTypes.video, bid.params.video); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.mediaTypes.video.playerSize[0])) { + videoObj['w'] = bid.mediaTypes.video.playerSize[0][0]; + videoObj['h'] = bid.mediaTypes.video.playerSize[0][1]; + } else { + videoObj['w'] = bid.mediaTypes.video.playerSize[0]; + videoObj['h'] = bid.mediaTypes.video.playerSize[1]; + } + return cadentAdapter.cleanProtocols(videoObj); + }, + parseResponse: bidResponseAdm => { + try { + return decodeURIComponent(bidResponseAdm.replace(/%(?![0-9][0-9a-fA-F]+)/g, '%25')); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('cadent_aperture_mxBidAdapter', 'error', err); + } + }, + getSite: refInfo => { + // TODO: do the fallbacks make sense? + return { + domain: refInfo.domain || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.parseDomain)(refInfo.topmostLocation), + page: refInfo.page || refInfo.topmostLocation, + ref: refInfo.ref || window.document.referrer + }; + }, + getGdpr: (bidRequests, cadentData) => { + if (bidRequests.gdprConsent) { + cadentData.regs = { + ext: { + gdpr: bidRequests.gdprConsent.gdprApplies === true ? 1 : 0 + } + }; + } + if (bidRequests.gdprConsent && bidRequests.gdprConsent.gdprApplies) { + cadentData.user = { + ext: { + consent: bidRequests.gdprConsent.consentString + } + }; + } + return cadentData; + }, + getGpp: (bidRequest, cadentData) => { + if (bidRequest.gppConsent) { + const { + gppString: gpp, + applicableSections: gppSid + } = bidRequest.gppConsent; + if (cadentData.regs) { + cadentData.regs.gpp = gpp; + cadentData.regs.gpp_sid = gppSid; + } else { + cadentData.regs = { + gpp: gpp, + gpp_sid: gppSid + }; + } + } + return cadentData; + }, + getSupplyChain: (bidderRequest, cadentData) => { + if (bidderRequest.bids[0] && bidderRequest.bids[0].schain) { + cadentData.source = { + ext: { + schain: bidderRequest.bids[0].schain + } + }; + } + return cadentData; + }, + // supporting eids + getEids(bidRequests) { + return EIDS_SUPPORTED.map(cadentAdapter.getUserId(bidRequests)).filter(x => x); + }, + getUserId(bidRequests) { + return _ref => { + let { + key, + source, + rtiPartner + } = _ref; + let id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequests, `userId.${key}`); + return id ? cadentAdapter.formatEid(id, source, rtiPartner) : null; + }; + }, + formatEid(id, source, rtiPartner) { + return { + source, + uids: [{ + id, + ext: { + rtiPartner + } + }] + }; + } +}; +const spec = { + code: BIDDER_CODE, + gvlid: 183, + alias: ALIASES, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO], + isBidRequestValid: function (bid) { + if (!bid || !bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': Missing bid or bid params.'); + return false; + } + if (!bid.params.tagid || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(bid.params.tagid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': Missing tagid param or tagid present and not type String.'); + return false; + } + if (bid.mediaTypes && bid.mediaTypes.banner) { + let sizes; + bid.mediaTypes.banner.sizes ? sizes = bid.mediaTypes.banner.sizes : sizes = bid.sizes; + if (!cadentAdapter.validateSizes(sizes)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': Missing sizes in bid'); + return false; + } + } else if (bid.mediaTypes && bid.mediaTypes.video) { + if (!cadentAdapter.checkVideoContext(bid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': Missing video context: instream or outstream'); + return false; + } + if (!bid.mediaTypes.video.playerSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(BIDDER_CODE + ': Missing video playerSize'); + return false; + } + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const cadentImps = []; + const timeout = bidderRequest.timeout || ''; + const timestamp = Date.now(); + const url = 'https://' + ENDPOINT + ('?t=' + timeout + '&ts=' + timestamp + '&src=pbjs'); + const secure = location.protocol.indexOf('https') > -1 ? 1 : 0; + const device = cadentAdapter.getDevice(); + const site = cadentAdapter.getSite(bidderRequest.refererInfo); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(validBidRequests, function (bid) { + let tagid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('tagid', bid.params); + let bidfloor = parseFloat(getBidFloor(bid)) || 0; + let isVideo = !!bid.mediaTypes.video; + let data = { + id: bid.bidId, + tid: bid.ortb2Imp?.ext?.tid, + tagid, + secure + }; + + // adding gpid support + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.data.adserver.adslot') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + data.ext = { + gpid: gpid.toString() + }; + } + let typeSpecifics = isVideo ? { + video: cadentAdapter.buildVideo(bid) + } : { + banner: cadentAdapter.buildBanner(bid) + }; + let bidfloorObj = bidfloor > 0 ? { + bidfloor, + bidfloorcur: DEFAULT_CUR + } : {}; + let cadentBid = Object.assign(data, typeSpecifics, bidfloorObj); + cadentImps.push(cadentBid); + }); + let cadentData = { + id: bidderRequest.auctionId ?? bidderRequest.bidderRequestId, + imp: cadentImps, + device, + site, + cur: DEFAULT_CUR, + version: ADAPTER_VERSION + }; + cadentData = cadentAdapter.getGdpr(bidderRequest, Object.assign({}, cadentData)); + cadentData = cadentAdapter.getGpp(bidderRequest, Object.assign({}, cadentData)); + cadentData = cadentAdapter.getSupplyChain(bidderRequest, Object.assign({}, cadentData)); + if (bidderRequest && bidderRequest.uspConsent) { + cadentData.us_privacy = bidderRequest.uspConsent; + } + + // adding eid support + if (bidderRequest.userId) { + let eids = cadentAdapter.getEids(bidderRequest); + if (eids.length > 0) { + if (cadentData.user && cadentData.user.ext) { + cadentData.user.ext.eids = eids; + } else { + cadentData.user = { + ext: { + eids + } + }; + } + } + } + return { + method: 'POST', + url, + data: JSON.stringify(cadentData), + options: { + withCredentials: true + }, + bidderRequest + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + let cadentBidResponses = []; + let response = serverResponse.body || {}; + if (response.seatbid && response.seatbid.length > 0 && response.seatbid[0].bid) { + response.seatbid.forEach(function (cadentBid) { + cadentBid = cadentBid.bid[0]; + let isVideo = false; + let adm = cadentAdapter.parseResponse(cadentBid.adm) || ''; + let bidResponse = { + requestId: cadentBid.id, + cpm: cadentBid.price, + width: cadentBid.w, + height: cadentBid.h, + creativeId: cadentBid.crid || cadentBid.id, + dealId: cadentBid.dealid || null, + currency: 'USD', + netRevenue: true, + ttl: cadentBid.ttl, + ad: adm + }; + if (cadentBid.adm && cadentBid.adm.indexOf(' -1) { + isVideo = true; + bidResponse = cadentAdapter.formatVideoResponse(bidResponse, Object.assign({}, cadentBid), bidRequest); + } + bidResponse.mediaType = isVideo ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER; + + // support for adomain in prebid 5.0 + if (cadentBid.adomain && cadentBid.adomain.length) { + bidResponse.meta = { + advertiserDomains: cadentBid.adomain + }; + } + cadentBidResponses.push(bidResponse); + }); + } + return cadentBidResponses; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + const syncs = []; + const consentParams = []; + if (syncOptions.iframeEnabled) { + let url = 'https://biddr.brealtime.com/check.html'; + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + // add 'gdpr' only if 'gdprApplies' is defined + if (typeof gdprConsent.gdprApplies === 'boolean') { + consentParams.push(`gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`); + } else { + consentParams.push(`?gdpr_consent=${gdprConsent.consentString}`); + } + } + if (uspConsent && typeof uspConsent.consentString === 'string') { + consentParams.push(`usp=${uspConsent.consentString}`); + } + if (gppConsent && typeof gppConsent === 'object') { + if (gppConsent.gppString && typeof gppConsent.gppString === 'string') { + consentParams.push(`gpp=${gppConsent.gppString}`); + } + if (gppConsent.applicableSections && typeof gppConsent.applicableSections === 'object') { + consentParams.push(`gpp_sid=${gppConsent.applicableSections}`); + } + } + if (consentParams.length > 0) { + url = url + '?' + consentParams.join('&'); + } + syncs.push({ + type: 'iframe', + url: url + }); + } + return syncs; + } +}; + +// support floors module in prebid 5.0 +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('bidfloor', bid.params)); + } + let floor = bid.getFloor({ + currency: DEFAULT_CUR, + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('cadentApertureMXBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/cadentApertureMXBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["carodaBidAdapter"],{ + +/***/ "./modules/carodaBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/carodaBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + +const { + getConfig +} = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config; +const BIDDER_CODE = 'caroda'; +const GVLID = 954; + +// some state info is required to synchronize with Caroda ad server +const topUsableWindow = getTopUsableWindow(); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: bid => { + const params = bid.params || {}; + const { + ctok, + placementId, + priceType + } = params; + return typeof ctok === 'string' && (typeof placementId === 'string' || typeof placementId === 'undefined') && (typeof priceType === 'undefined' || priceType === 'gross' || priceType === 'net'); + }, + buildRequests: (validBidRequests, bidderRequest) => { + topUsableWindow.carodaPageViewId = topUsableWindow.carodaPageViewId || Math.floor(Math.random() * 1e9); + const pageViewId = topUsableWindow.carodaPageViewId; + const ortbCommon = getORTBCommon(bidderRequest); + const priceType = getFirstWithKey(validBidRequests, 'params.priceType') || 'net'; + const test = getFirstWithKey(validBidRequests, 'params.test'); + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(bidderRequest); + const eids = getFirstWithKey(validBidRequests, 'userIdAsEids'); + const schain = getFirstWithKey(validBidRequests, 'schain'); + const request = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidderRequest.auctionId, + currency, + hb_version: "9.45.0-pre", + ...ortbCommon, + price_type: priceType + }; + if (test) { + request.test = 1; + } + if (schain) { + request.schain = schain; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('coppa')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'privacy.coppa', 1); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'gdprConsent.gdprApplies') !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'privacy.gdpr_consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'privacy.gdpr', bidderRequest.gdprConsent.gdprApplies & 1); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'privacy.us_privacy', bidderRequest.uspConsent); + } + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'user.eids', eids); + } + return getImps(validBidRequests, request).map(imp => ({ + method: 'POST', + url: 'https://prebid.caroda.io/api/hb?entry_id=' + pageViewId, + data: JSON.stringify(imp) + })); + }, + interpretResponse: serverResponse => { + if (!serverResponse.body) { + return; + } + const { + ok, + error + } = serverResponse.body; + if (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(BIDDER_CODE, ': server caught', error.message); + return; + } + try { + return JSON.parse(ok.value).map(bid => { + const ret = { + requestId: bid.bid_id, + cpm: bid.cpm, + creativeId: bid.creative_id, + ttl: 300, + netRevenue: true, + currency: bid.currency, + width: bid.w, + height: bid.h, + meta: { + advertiserDomains: bid.adomain || [] + }, + ad: bid.ad, + placementId: bid.placement_id + }; + if (bid.adserver_targeting) { + ret.adserverTargeting = bid.adserver_targeting; + } + return ret; + }).filter(Boolean); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(BIDDER_CODE, ': caught', e); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +function getFirstWithKey(collection, key) { + for (let i = 0, result; i < collection.length; i++) { + result = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(collection[i], key); + if (result) { + return result; + } + } +} +function getTopUsableWindow() { + let res = window; + try { + while (window.top !== res && res.parent.location.href.length) { + res = res.parent; + } + } catch (e) {} + return res; +} +function getORTBCommon(bidderRequest) { + let app, site; + const commonFpd = bidderRequest.ortb2 || {}; + let { + user + } = commonFpd; + if (typeof getConfig('app') === 'object') { + app = getConfig('app') || {}; + if (commonFpd.app) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)(app, commonFpd.app); + } + } else { + site = getConfig('site') || {}; + if (commonFpd.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)(site, commonFpd.site); + } + if (!site.page) { + site.page = bidderRequest.refererInfo.page; + } + } + const device = getConfig('device') || {}; + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.getWinDimensions)(); + device.w = device.w || innerWidth; + device.h = device.h || innerHeight; + device.ua = device.ua || navigator.userAgent; + return { + app, + site, + user, + device + }; +} +function getImps(validBidRequests, common) { + return validBidRequests.map(bid => { + const floorInfo = bid.getFloor ? bid.getFloor({ + currency: common.currency || 'EUR' + }) : {}; + const bidfloor = floorInfo?.floor; + const bidfloorcur = floorInfo?.currency; + const { + ctok, + placementId + } = bid.params; + const imp = { + bid_id: bid.bidId, + ctok, + bidfloor, + bidfloorcur, + ...common + }; + const bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.banner'); + if (bannerParams && bannerParams.sizes) { + const format = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.sizesToSizeTuples)(bannerParams.sizes).map(_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.sizeTupleToRtbSize); + imp.banner = { + format + }; + } + if (placementId) { + imp.placement_id = placementId; + } + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video'); + if (videoParams) { + imp.video = videoParams; + } + return imp; + }); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('carodaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/carodaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["categoryTranslation"],{ + +/***/ "./modules/categoryTranslation.js": +/*!****************************************!*\ + !*** ./modules/categoryTranslation.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, registerAdserver, getAdserverCategoryHook, initTranslation */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); + +/** + * This module translates iab category to freewheel industry using translation mapping file + * Publisher can set translation file by using setConfig method + * + * Example: + * config.setConfig({ + * 'brandCategoryTranslation': { + * 'translationFile': 'http://sample.com' + * } + * }); + * If publisher has not defined translation file than prebid will use default prebid translation file provided here //cdn.jsdelivr.net/gh/prebid/category-mapping-file@1/freewheel-mapping.json + */ + + + + + + + + +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getCoreStorageManager)('categoryTranslation'); +const DEFAULT_TRANSLATION_FILE_URL = 'https://cdn.jsdelivr.net/gh/prebid/category-mapping-file@1/freewheel-mapping.json'; +const DEFAULT_IAB_TO_FW_MAPPING_KEY = 'iabToFwMappingkey'; +const DEFAULT_IAB_TO_FW_MAPPING_KEY_PUB = 'iabToFwMappingkeyPub'; +const refreshInDays = 1; +const registerAdserver = (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.hook)('async', function (adServer) { + let url; + if (adServer === 'freewheel') { + url = DEFAULT_TRANSLATION_FILE_URL; + initTranslation(url, DEFAULT_IAB_TO_FW_MAPPING_KEY); + } +}, 'registerAdserver'); +_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.ready.then(() => registerAdserver()); +const getAdserverCategoryHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__.timedBidResponseHook)('categoryTranslation', function getAdserverCategoryHook(fn, adUnitCode, bid, reject) { + if (!bid) { + return fn.call(this, adUnitCode, bid, reject); // if no bid, call original and let it display warnings + } + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('adpod.brandCategoryExclusion')) { + return fn.call(this, adUnitCode, bid, reject); + } + let localStorageKey = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('brandCategoryTranslation.translationFile') ? DEFAULT_IAB_TO_FW_MAPPING_KEY_PUB : DEFAULT_IAB_TO_FW_MAPPING_KEY; + if (bid.meta && !bid.meta.adServerCatId) { + let mapping = storage.getDataFromLocalStorage(localStorageKey); + if (mapping) { + try { + mapping = JSON.parse(mapping); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Failed to parse translation mapping file'); + } + if (bid.meta.primaryCatId && mapping['mapping'] && mapping['mapping'][bid.meta.primaryCatId]) { + bid.meta.adServerCatId = mapping['mapping'][bid.meta.primaryCatId]['id']; + } else { + // This bid will be automatically ignored by adpod module as adServerCatId was not found + bid.meta.adServerCatId = undefined; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Translation mapping data not found in local storage'); + } + } + fn.call(this, adUnitCode, bid, reject); +}); +function initTranslation(url, localStorageKey) { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.setupBeforeHookFnOnce)(_src_auction_js__WEBPACK_IMPORTED_MODULE_5__.addBidResponse, getAdserverCategoryHook, 50); + let mappingData = storage.getDataFromLocalStorage(localStorageKey); + try { + mappingData = mappingData ? JSON.parse(mappingData) : undefined; + if (!mappingData || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.timestamp)() > mappingData.lastUpdated + refreshInDays * 24 * 60 * 60 * 1000) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, { + success: response => { + try { + response = JSON.parse(response); + response['lastUpdated'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.timestamp)(); + storage.setDataInLocalStorage(localStorageKey, JSON.stringify(response)); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Failed to parse translation mapping file'); + } + }, + error: () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Failed to load brand category translation file.'); + } + }); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Failed to parse translation mapping file'); + } +} +function setConfig(config) { + if (config.translationFile) { + // if publisher has defined the translation file, preload that file here + initTranslation(config.translationFile, DEFAULT_IAB_TO_FW_MAPPING_KEY_PUB); + } +} +_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('brandCategoryTranslation', config => setConfig(config.brandCategoryTranslation)); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('categoryTranslation'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/categoryTranslation.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ccxBidAdapter"],{ + +/***/ "./modules/ccxBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/ccxBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + +const BIDDER_CODE = 'ccx'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const BID_URL = 'https://delivery.clickonometrics.pl/ortb/prebid/bid'; +const GVLID = 773; +const SUPPORTED_VIDEO_PROTOCOLS = [2, 3, 5, 6]; +const SUPPORTED_VIDEO_MIMES = ['video/mp4', 'video/x-flv']; +const SUPPORTED_VIDEO_PLAYBACK_METHODS = [1, 2, 3, 4]; +function _getDeviceObj() { + let device = {}; + device.w = screen.width; + device.y = screen.height; + device.ua = navigator.userAgent; + return device; +} +function _getSiteObj(bidderRequest) { + let site = {}; + let url = bidderRequest?.refererInfo?.page || ''; + if (url.length > 0) { + url = url.split('?')[0]; + } + site.page = url; + return site; +} +function _validateSizes(sizeObj, type) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizeObj) || typeof sizeObj[0] === 'undefined') { + return false; + } + if (type === 'video' && (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizeObj[0]) || sizeObj[0].length !== 2)) { + return false; + } + let result = true; + if (type === 'banner') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(sizeObj, function (size) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size) || size.length !== 2) { + result = false; + } + }); + return result; + } + if (type === 'old') { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizeObj[0]) && sizeObj.length !== 2) { + result = false; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizeObj[0])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(sizeObj, function (size) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size) || size.length !== 2) { + result = false; + } + }); + } + return result; + } + return true; +} +function _buildBid(bid, bidderRequest) { + let placement = {}; + placement.id = bid.bidId; + placement.secure = 1; + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.playerSize') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'sizes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaType') === 'banner' || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video') && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaType')) { + placement.banner = { + 'format': [] + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes[0])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(sizes, function (size) { + placement.banner.format.push({ + 'w': size[0], + 'h': size[1] + }); + }); + } else { + placement.banner.format.push({ + 'w': sizes[0], + 'h': sizes[1] + }); + } + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaType') === 'video') { + placement.video = {}; + if (typeof sizes !== 'undefined') { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes[0])) { + placement.video.w = sizes[0][0]; + placement.video.h = sizes[0][1]; + } else { + placement.video.w = sizes[0]; + placement.video.h = sizes[1]; + } + } + placement.video.protocols = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.protocols') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.protocols') || SUPPORTED_VIDEO_PROTOCOLS; + placement.video.mimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.mimes') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.mimes') || SUPPORTED_VIDEO_MIMES; + placement.video.playbackmethod = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.playbackmethod') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.playbackmethod') || SUPPORTED_VIDEO_PLAYBACK_METHODS; + placement.video.skip = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.skip') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.skip') || 0; + if (placement.video.skip === 1 && ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.skipafter') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.skipafter'))) { + placement.video.skipafter = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.skipafter') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.skipafter'); + } + } + placement.ext = { + 'pid': bid.params.placementId + }; + if (bidderRequest.paapi?.enabled) { + placement.ext.ae = bid?.ortb2Imp?.ext?.ae; + } + return placement; +} +function _buildResponse(bid, currency, ttl) { + let resp = { + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.crid, + netRevenue: false, + ttl: ttl, + currency: currency + }; + resp.meta = {}; + if (bid.adomain && bid.adomain.length > 0) { + resp.meta.advertiserDomains = bid.adomain; + } + if (bid.ext.type === 'video') { + resp.vastXml = bid.adm; + } else { + resp.ad = bid.adm; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'dealid')) { + resp.dealId = bid.dealid; + } + return resp; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: ['banner', 'video'], + isBidRequestValid: function (bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.placementId')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('placementId param is reqeuired.'); + return false; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes')) { + let isValid = _validateSizes(bid.mediaTypes.banner.sizes, 'banner'); + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bid sizes are invalid.'); + } + return isValid; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.playerSize')) { + let isValid = _validateSizes(bid.mediaTypes.video.playerSize, 'video'); + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bid sizes are invalid.'); + } + return isValid; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'sizes')) { + let isValid = _validateSizes(bid.sizes, 'old'); + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bid sizes are invalid.'); + } + return isValid; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bid sizes are required.'); + return false; + } + }, + buildRequests: function (validBidRequests, bidderRequest) { + // check if validBidRequests is not empty + if (validBidRequests.length > 0) { + let requestBody = {}; + requestBody.imp = []; + requestBody.site = _getSiteObj(bidderRequest); + requestBody.device = _getDeviceObj(); + requestBody.id = bidderRequest.bidderRequestId; + requestBody.ext = { + 'ce': storage.cookiesAreEnabled() ? 1 : 0 + }; + + // Attaching GDPR Consent Params + if (bidderRequest && bidderRequest.gdprConsent) { + requestBody.user = { + ext: { + consent: bidderRequest.gdprConsent.consentString + } + }; + requestBody.regs = { + ext: { + gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 + } + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, function (bid) { + requestBody.imp.push(_buildBid(bid, bidderRequest)); + }); + // Return the server request + return { + 'method': 'POST', + 'url': BID_URL, + 'data': JSON.stringify(requestBody) + }; + } + }, + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + + // response is not empty (HTTP 204) + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponse.body)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(serverResponse.body.seatbid, function (seatbid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(seatbid.bid, function (bid) { + bidResponses.push(_buildResponse(bid, serverResponse.body.cur, serverResponse.body.ext.ttl)); + }); + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(serverResponses[0], 'body.ext.usersync') && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponses[0].body.ext.usersync)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(serverResponses[0].body.ext.usersync, function (match) { + if (syncOptions.iframeEnabled && match.type === 'iframe' || syncOptions.pixelEnabled && match.type === 'image') { + syncs.push({ + type: match.type, + url: match.url + }); + } + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('ccxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ccxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ceeIdSystem"],{ + +/***/ "./modules/ceeIdSystem.js": +/*!********************************!*\ + !*** ./modules/ceeIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, readId, fetchCeeIdToken, ceeIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _libraries_domainOverrideToRootDomain_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/domainOverrideToRootDomain/index.js */ "./libraries/domainOverrideToRootDomain/index.js"); + +/** + * This module adds ceeId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/ceeId + * @requires module:modules/userId + */ + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'ceeId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleName: MODULE_NAME, + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID +}); + +/** + * Reads the ID token from local storage or cookies. + * @returns {string|undefined} The ID token, or undefined if not found. + */ +const readId = tokenName => storage.getDataFromLocalStorage(tokenName) || storage.getCookie(tokenName); + +/** + * performs fetch to obtain id and return a value + * @function fetchCeeIdToken + * @param {Object} requestData The data to be sent in the request body. + * @returns {Promise} A promise that resolves to the fetched token. + */ +function fetchCeeIdToken(requestData) { + return new Promise((resolve, reject) => { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)('https://ceeid.eu/api/token/generate', { + success: response => { + try { + const responseJson = JSON.parse(response); + const newCeeIdToken = responseJson.value; + if (newCeeIdToken) { + resolve(newCeeIdToken); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: No token in response`); + reject(new Error('No token in response')); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: Server error while fetching ID`, error); + reject(error); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + reject(error); + } + }, JSON.stringify(requestData), { + method: 'POST', + contentType: 'application/json' + }); + }); +} + +/** @type {Submodule} */ +const ceeIdSubmodule = { + name: MODULE_NAME, + gvlid: 676, + /** + * decode the stored id value for passing to bid requests + * @function decode + * @param {string} value + * @returns {(Object)} + */ + decode(value) { + return typeof value === 'string' ? { + 'ceeId': value + } : undefined; + }, + /** + * performs action to obtain id and return a value + * @function getId + * @returns {(IdResponse|undefined)} + */ + getId(config, consentData) { + const { + params = {}, + storage = {} + } = config; + const { + name: storedCeeIdToken + } = storage; + const { + publisherId, + type, + value, + cookieName + } = params; + const { + consentString + } = consentData; + const ceeIdToken = readId(storedCeeIdToken) || readId(cookieName); + if (ceeIdToken) { + return { + id: ceeIdToken + }; + } + if (cookieName) return; + if (publisherId && type && value && consentString) { + const requestData = { + publisherId, + type, + value, + properties: { + consent: consentString + } + }; + const resp = function (callback) { + fetchCeeIdToken(requestData).then(id => callback(id)); + }; + return { + callback: resp + }; + } + }, + domainOverride: (0,_libraries_domainOverrideToRootDomain_index_js__WEBPACK_IMPORTED_MODULE_4__.domainOverrideToRootDomain)(storage, MODULE_NAME), + eids: { + 'ceeId': { + source: 'ceeid.eu', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('userId', ceeIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('ceeIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["domainOverrideToRootDomain","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ceeIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["chtnwBidAdapter"],{ + +/***/ "./modules/chtnwBidAdapter.js": +/*!************************************!*\ + !*** ./modules/chtnwBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + + + +const ENDPOINT_URL = 'https://prebid.cht.hinet.net/api/v1'; +const BIDDER_CODE = 'chtnw'; +const COOKIE_NAME = '__htid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const { + getConfig +} = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config; +function _isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + isBidRequestValid: function () { + let bid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return !!(bid && bid.params); + }, + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_3__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const chtnwId = storage.getCookie(COOKIE_NAME) != undefined ? storage.getCookie(COOKIE_NAME) : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(); + if (storage.cookiesAreEnabled()) { + storage.setCookie(COOKIE_NAME, chtnwId); + } + const device = getConfig('device') || {}; + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWinDimensions)(); + device.w = device.w || innerWidth; + device.h = device.h || innerHeight; + device.ua = device.ua || navigator.userAgent; + device.dnt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getDNT)() ? 1 : 0; + device.language = navigator && navigator.language ? navigator.language.split('-')[0] : ''; + const bidParams = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__._each)(validBidRequests, function (bid) { + bidParams.push({ + bidId: bid.bidId, + placement: bid.params.placementId, + sizes: bid.sizes, + adSlot: bid.adUnitCode + }); + }); + return { + method: 'POST', + url: ENDPOINT_URL + '/request/prebid.json', + data: { + bids: bidParams, + uuid: chtnwId, + device: device, + version: { + prebid: "9.45.0-pre", + adapter: '1.0.0' + }, + site: { + numIframes: bidderRequest.refererInfo?.numIframes || 0, + isAmp: bidderRequest.refererInfo?.isAmp || false, + pageUrl: bidderRequest.refererInfo?.page || '', + ref: bidderRequest.refererInfo?.ref || '' + } + }, + bids: validBidRequests + }; + }, + interpretResponse: function (serverResponse) { + const bidResponses = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__._each)(serverResponse.body, function (response, i) { + bidResponses.push({ + ...response + }); + }); + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (syncOptions.pixelEnabled) { + const chtnwId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(); + const uuid = chtnwId; + const type = _isMobile() ? 'dot' : 'pixel'; + syncs.push({ + type: 'image', + url: `https://t.ssp.hinet.net/${type}?bd=${uuid}&t=chtnw` + }); + } + return syncs; + }, + onTimeout: function (timeoutData) { + if (timeoutData === null) { + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(ENDPOINT_URL + '/trace/timeout/bid', null, JSON.stringify(timeoutData), { + method: 'POST', + withCredentials: false + }); + }, + onBidWon: function (bid) { + if (bid.nurl) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(bid.nurl, null); + } + }, + onSetTargeting: function (bid) {} +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('chtnwBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/chtnwBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cleanioRtdProvider"],{ + +/***/ "./modules/cleanioRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/cleanioRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export __TEST__ */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds clean.io provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will wrap bid responses markup in clean.io agent script for protection + * @module modules/cleanioRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +// ============================ MODULE STATE =============================== + +/** + * @type {function(): void} + * Page-wide initialization step / strategy + */ +let onModuleInit = () => {}; + +/** + * @type {function(Object): void} + * Bid response mutation step / strategy. + */ +let onBidResponse = () => {}; + +/** + * @type {number} + * 0 for unknown, 1 for preloaded, -1 for error. + */ +let preloadStatus = 0; + +// ============================ MODULE LOGIC =============================== + +/** + * Page initialization step which just preloads the script, to be available whenever we start processing the bids. + * @param {string} scriptURL The script URL to preload + */ +function pageInitStepPreloadScript(scriptURL) { + // TODO: this bypasses adLoader + const linkElement = document.createElement('link'); + linkElement.rel = 'preload'; + linkElement.as = 'script'; + linkElement.href = scriptURL; + linkElement.onload = () => { + preloadStatus = 1; + }; + linkElement.onerror = () => { + preloadStatus = -1; + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.insertElement)(linkElement); +} + +/** + * Page initialization step which adds the protector script to the whole page. With that, there is no need wrapping bids, and the coverage is better. + * @param {string} scriptURL The script URL to add to the page for protection + */ +function pageInitStepProtectPage(scriptURL) { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_1__.loadExternalScript)(scriptURL, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, 'clean.io'); +} + +/** + * Bid processing step which alters the ad HTML to contain bid-specific information, which can be used to identify the creative later. + * @param {Object} bidResponse Bid response data + */ +function bidWrapStepAugmentHtml(bidResponse) { + bidResponse.ad = `\n${bidResponse.ad}`; +} + +/** + * Bid processing step which applies creative protection by wrapping the ad HTML. + * @param {string} scriptURL + * @param {number} requiredPreload + * @param {Object} bidResponse + */ +function bidWrapStepProtectByWrapping(scriptURL, requiredPreload, bidResponse) { + // Still prepend bid info, it's always helpful to have creative data in its payload + bidWrapStepAugmentHtml(bidResponse); + + // If preloading failed, or if configuration requires us to finish preloading - + // we should not process this bid any further + if (preloadStatus < requiredPreload) { + return; + } + const sid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + bidResponse.ad = ` + + + `; +} + +/** + * Custom error class to differentiate validation errors + */ +class ConfigError extends Error {} + +/** + * The function to be called upon module init. Depending on the passed config, initializes properly init/bid steps or throws ConfigError. + * @param {Object} config + */ +function readConfig(config) { + if (!config.params) { + throw new ConfigError('Missing config parameters for clean.io RTD module provider.'); + } + if (typeof config.params.cdnUrl !== 'string' || !/^https?:\/\//.test(config.params.cdnUrl)) { + throw new ConfigError('Parameter "cdnUrl" is a required string parameter, which should start with "http(s)://".'); + } + if (typeof config.params.protectionMode !== 'string') { + throw new ConfigError('Parameter "protectionMode" is a required string parameter.'); + } + const scriptURL = config.params.cdnUrl; + switch (config.params.protectionMode) { + case 'full': + onModuleInit = () => pageInitStepProtectPage(scriptURL); + onBidResponse = bidResponse => bidWrapStepAugmentHtml(bidResponse); + break; + case 'bids': + onModuleInit = () => pageInitStepPreloadScript(scriptURL); + onBidResponse = bidResponse => bidWrapStepProtectByWrapping(scriptURL, 0, bidResponse); + break; + case 'bids-nowait': + onModuleInit = () => pageInitStepPreloadScript(scriptURL); + onBidResponse = bidResponse => bidWrapStepProtectByWrapping(scriptURL, 1, bidResponse); + break; + default: + throw new ConfigError('Parameter "protectionMode" must be one of "full" | "bids" | "bids-nowait".'); + } +} + +/** + * The function to be called upon module init + * Defined as a variable to be able to reset it naturally + */ +let startBillableEvents = function () { + // Upon clean.io submodule initialization, every winner bid is considered to be protected + // and therefore, subjected to billing + _src_events_js__WEBPACK_IMPORTED_MODULE_3__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_WON, winnerBidResponse => { + _src_events_js__WEBPACK_IMPORTED_MODULE_3__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BILLABLE_EVENT, { + vendor: 'clean.io', + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(), + type: 'impression', + auctionId: winnerBidResponse.auctionId, + transactionId: winnerBidResponse.transactionId, + bidId: winnerBidResponse.requestId + }); + }); +}; + +// ============================ MODULE REGISTRATION =============================== + +/** + * The function which performs submodule registration. + */ +function beforeInit() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', /** @type {RtdSubmodule} */{ + name: 'clean.io', + init: (config, userConsent) => { + try { + readConfig(config); + onModuleInit(); + + // Subscribing once to ensure no duplicate events + // in case module initialization code runs multiple times + // This should have been a part of submodule definition, but well... + // The assumption here is that in production init() will be called exactly once + startBillableEvents(); + startBillableEvents = () => {}; + return true; + } catch (err) { + if (err instanceof ConfigError) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(err.message); + } + return false; + } + }, + onBidResponseEvent: (bidResponse, config, userConsent) => { + onBidResponse(bidResponse); + } + }); +} + +/** + * Exporting local (and otherwise encapsulated to this module) functions + * for testing purposes + */ +const __TEST__ = { + pageInitStepPreloadScript, + pageInitStepProtectPage, + bidWrapStepAugmentHtml, + bidWrapStepProtectByWrapping, + ConfigError, + readConfig, + beforeInit +}; +beforeInit(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('cleanioRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/cleanioRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cleanmedianetBidAdapter"],{ + +/***/ "./modules/cleanmedianetBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/cleanmedianetBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports helper, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + +const ENDPOINTS = { + 'cleanmedianet': 'https://bidder.cleanmediaads.com' +}; +const DEFAULT_TTL = 360; +const helper = { + getTopFrame: function () { + try { + return window.top === window ? 1 : 0; + } catch (e) {} + return 0; + }, + startsWith: function (str, search) { + return str.substr(0, search.length) === search; + }, + getMediaType: function (bid) { + if (bid.ext) { + if (bid.ext.media_type) { + return bid.ext.media_type.toLowerCase(); + } else if (bid.ext.vast_url) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + } + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + }, + getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return bid.params.bidfloor ? bid.params.bidfloor : null; + } + let bidFloor = bid.getFloor({ + mediaType: '*', + size: '*', + currency: 'USD' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bidFloor) && !isNaN(bidFloor.floor) && bidFloor.currency === 'USD') { + return bidFloor.floor; + } + return null; + } +}; +const spec = { + code: 'cleanmedianet', + aliases: [], + supportedMediaTypes: ['banner', 'video'], + isBidRequestValid: function (bid) { + return !!bid.params.supplyPartnerId && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.supplyPartnerId) && (!bid.params['rtbEndpoint'] || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params['rtbEndpoint'])) && (!bid.params.bidfloor || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params.bidfloor)) && (!bid.params['adpos'] || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params['adpos'])) && (!bid.params['protocols'] || Array.isArray(bid.params['protocols'])) && (!bid.params.instl || bid.params.instl === 0 || bid.params.instl === 1); + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const { + adUnitCode, + bidId, + mediaTypes, + params, + sizes + } = bidRequest; + const baseEndpoint = (params['rtbEndpoint'] || ENDPOINTS['cleanmedianet']).replace(/^http:/, 'https:'); + const rtbEndpoint = `${baseEndpoint}/r/${params.supplyPartnerId}/bidr?rformat=open_rtb&reqformat=rtb_json&bidder=prebid` + (params.query ? '&' + params.query : ''); + const rtbBidRequest = { + id: bidId, + site: { + domain: bidderRequest.refererInfo.domain, + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref + }, + device: { + ua: navigator.userAgent, + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0, + h: screen.height, + w: screen.width, + language: navigator.language + }, + imp: [], + ext: {}, + user: { + ext: {} + }, + source: { + ext: {} + }, + regs: { + ext: {} + } + }; + const gdprConsent = getGdprConsent(bidderRequest); + rtbBidRequest.ext.gdpr_consent = gdprConsent; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'regs.ext.gdpr', gdprConsent.consent_required === true ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'user.ext.consent', gdprConsent.consent_string); + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'source.ext.schain', validBidRequests[0].schain); + } + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + const imp = { + id: bidId, + instl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest.ortb2Imp, 'instl') === 1 || params.instl === 1 ? 1 : 0, + tagid: adUnitCode, + bidfloor: helper.getBidFloor(bidRequest) || 0, + bidfloorcur: 'USD', + secure: 1 + }; + const hasFavoredMediaType = params.favoredMediaType && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)(this.supportedMediaTypes, params.favoredMediaType); + if (!mediaTypes || mediaTypes.banner) { + if (!hasFavoredMediaType || params.favoredMediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + const bannerImp = Object.assign({}, imp, { + banner: { + w: sizes.length ? sizes[0][0] : 300, + h: sizes.length ? sizes[0][1] : 250, + pos: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'mediaTypes.banner.pos') || params.pos || 0, + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1 + } + }); + rtbBidRequest.imp.push(bannerImp); + } + } + if (mediaTypes && mediaTypes.video) { + if (!hasFavoredMediaType || params.favoredMediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const playerSize = mediaTypes.video.playerSize || sizes; + const videoImp = Object.assign({}, imp, { + video: { + protocols: bidRequest.mediaTypes.video.protocols || params.protocols || [1, 2, 3, 4, 5, 6], + pos: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.pos') || params.pos || 0, + ext: { + context: mediaTypes.video.context + }, + mimes: bidRequest.mediaTypes.video.mimes, + maxduration: bidRequest.mediaTypes.video.maxduration, + api: bidRequest.mediaTypes.video.api, + skip: bidRequest.mediaTypes.video.skip || bidRequest.params.video.skip, + plcmt: bidRequest.mediaTypes.video.plcmt || bidRequest.params.video.plcmt, + minduration: bidRequest.mediaTypes.video.minduration || bidRequest.params.video.minduration, + playbackmethod: bidRequest.mediaTypes.video.playbackmethod || bidRequest.params.video.playbackmethod, + startdelay: bidRequest.mediaTypes.video.startdelay || bidRequest.params.video.startdelay + } + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(playerSize[0])) { + videoImp.video.w = playerSize[0][0]; + videoImp.video.h = playerSize[0][1]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(playerSize[0])) { + videoImp.video.w = playerSize[0]; + videoImp.video.h = playerSize[1]; + } else { + videoImp.video.w = 300; + videoImp.video.h = 250; + } + rtbBidRequest.imp.push(videoImp); + } + } + let eids = []; + if (bidRequest && bidRequest.userId) { + addExternalUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.id5id.uid`), 'id5-sync.com', 'ID5ID'); + addExternalUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.tdid`), 'adserver.org', 'TDID'); + addExternalUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.idl_env`), 'liveramp.com', 'idl'); + } + if (eids.length > 0) { + rtbBidRequest.user.ext.eids = eids; + } + if (rtbBidRequest.imp.length === 0) { + return; + } + return { + method: 'POST', + url: rtbEndpoint, + data: rtbBidRequest, + bidRequest + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + const response = serverResponse && serverResponse.body; + if (!response) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('empty response'); + return []; + } + const bids = response.seatbid.reduce((acc, seatBid) => acc.concat(seatBid.bid), []); + let outBids = []; + bids.forEach(bid => { + const outBid = { + requestId: bidRequest.bidRequest.bidId, + cpm: bid.price, + width: bid.w, + height: bid.h, + ttl: DEFAULT_TTL, + creativeId: bid.crid || bid.adid, + netRevenue: true, + currency: bid.cur || response.cur, + mediaType: helper.getMediaType(bid) + }; + if (bid.adomain && bid.adomain.length) { + outBid.meta = { + advertiserDomains: bid.adomain + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest.bidRequest, 'mediaTypes.' + outBid.mediaType)) { + if (outBid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + outBids.push(Object.assign({}, outBid, { + ad: bid.adm + })); + } else if (outBid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest.bidRequest, 'mediaTypes.video.context'); + outBids.push(Object.assign({}, outBid, { + vastUrl: bid.ext.vast_url, + vastXml: bid.adm, + renderer: context === 'outstream' ? newRenderer(bidRequest.bidRequest, bid) : undefined + })); + } + } + }); + return outBids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + let gdprApplies = false; + let consentString = ''; + let uspConsentString = ''; + if (gdprConsent && typeof gdprConsent.gdprApplies === 'boolean') { + gdprApplies = gdprConsent.gdprApplies; + } + let gdpr = gdprApplies ? 1 : 0; + if (gdprApplies && gdprConsent.consentString) { + consentString = encodeURIComponent(gdprConsent.consentString); + } + if (uspConsent) { + uspConsentString = encodeURIComponent(uspConsent); + } + const macroValues = { + gdpr: gdpr, + consent: consentString, + uspConsent: uspConsentString + }; + serverResponses.forEach(resp => { + if (resp.body) { + const bidResponse = resp.body; + if (bidResponse.ext && Array.isArray(bidResponse.ext['utrk'])) { + bidResponse.ext['utrk'].forEach(pixel => { + const url = replaceMacros(pixel.url, macroValues); + syncs.push({ + type: pixel.type, + url + }); + }); + } + if (Array.isArray(bidResponse.seatbid)) { + bidResponse.seatbid.forEach(seatBid => { + if (Array.isArray(seatBid.bid)) { + seatBid.bid.forEach(bid => { + if (bid.ext && Array.isArray(bid.ext['utrk'])) { + bid.ext['utrk'].forEach(pixel => { + const url = replaceMacros(pixel.url, macroValues); + syncs.push({ + type: pixel.type, + url + }); + }); + } + }); + } + }); + } + } + }); + return syncs; + } +}; +function newRenderer(bidRequest, bid) { + let rendererOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + url: bidRequest.params && bidRequest.params.rendererUrl || bid.ext && bid.ext.renderer_url || 'https://s.gamoshi.io/video/latest/renderer.js', + config: rendererOptions, + loaded: false + }); + try { + renderer.setRender(renderOutstream); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function renderOutstream(bid) { + bid.renderer.push(() => { + const unitId = bid.adUnitCode + '/' + bid.adId; + window['GamoshiPlayer'].renderAd({ + id: unitId, + debug: window.location.href.indexOf('pbjsDebug') >= 0, + placement: document.getElementById(bid.adUnitCode), + width: bid.width, + height: bid.height, + events: { + ALL_ADS_COMPLETED: () => window.setTimeout(() => { + window['GamoshiPlayer'].removeAd(unitId); + }, 300) + }, + vastUrl: bid.vastUrl, + vastXml: bid.vastXml + }); + }); +} +function addExternalUserId(eids, value, source, rtiPartner) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(value)) { + eids.push({ + source, + uids: [{ + id: value, + ext: { + rtiPartner + } + }] + }); + } +} +function replaceMacros(url, macros) { + return url.replace('[GDPR]', macros.gdpr).replace('[CONSENT]', macros.consent).replace('[US_PRIVACY]', macros.uspConsent); +} +function getGdprConsent(bidderRequest) { + const gdprConsent = bidderRequest.gdprConsent; + if (gdprConsent && gdprConsent.consentString && gdprConsent.gdprApplies) { + return { + consent_string: gdprConsent.consentString, + consent_required: gdprConsent.gdprApplies + }; + } + return { + consent_required: false, + consent_string: '' + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('cleanmedianetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/cleanmedianetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["clickforceBidAdapter"],{ + +/***/ "./modules/clickforceBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/clickforceBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'clickforce'; +const ENDPOINT_URL = 'https://ad.holmesmind.com/adserver/prebid.json?cb=' + new Date().getTime() + '&hb=1&ver=1.21'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return bid && bid.params && !!bid.params.zone; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const bidParams = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(validBidRequests, function (bid) { + bidParams.push({ + z: bid.params.zone, + bidId: bid.bidId + }); + }); + return { + method: 'POST', + url: ENDPOINT_URL, + data: bidParams, + validBidRequests: validBidRequests + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {*} bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const cfResponses = []; + const bidRequestList = []; + if (typeof bidRequest != 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(bidRequest.validBidRequests, function (req) { + bidRequestList[req.bidId] = req; + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(serverResponse.body, function (response) { + if (response.requestId != null) { + // native ad size + if (response.width == 3) { + cfResponses.push({ + requestId: response.requestId, + cpm: response.cpm, + width: response.width, + height: response.height, + creativeId: response.creativeId, + currency: response.currency, + netRevenue: response.netRevenue, + ttl: response.ttl, + native: { + title: response.tag.content.title, + body: response.tag.content.content, + image: { + url: response.tag.content.image, + height: 900, + width: 1600 + }, + icon: { + url: response.tag.content.icon, + height: 900, + width: 900 + }, + clickUrl: response.tag.cu, + cta: response.tag.content.button_text, + sponsoredBy: response.tag.content.advertiser, + impressionTrackers: response.tag.iu + }, + mediaType: 'native', + meta: { + advertiserDomains: response.adomain || [] + } + }); + } else { + // display ad + cfResponses.push({ + requestId: response.requestId, + cpm: response.cpm, + width: response.width, + height: response.height, + creativeId: response.creativeId, + currency: response.currency, + netRevenue: response.netRevenue, + ttl: response.ttl, + ad: response.tag, + mediaType: 'banner', + meta: { + advertiserDomains: response.adomain || [] + } + }); + } + } + }); + return cfResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: 'https://cdn.holmesmind.com/js/capmapping.htm' + }]; + } else if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: 'https://c.holmesmind.com/cm' + }]; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('clickforceBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/clickforceBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["codefuelBidAdapter"],{ + +/***/ "./modules/codefuelBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/codefuelBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'codefuel'; +const CURRENCY = 'USD'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + aliases: ['ex'], + // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (bid.nativeParams) { + return false; + } + return !!(bid.params.placementId || bid.params.member && bid.params.invCode); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests - an array of bids + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const page = bidderRequest.refererInfo.page; + const domain = bidderRequest.refererInfo.domain; + const ua = navigator.userAgent; + const devicetype = getDeviceType(); + const publisher = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.publisher'); + const cur = CURRENCY; + const endpointUrl = 'https://ai-p-codefuel-ds-rtb-us-east-1-k8s.seccint.com/prebid'; + const timeout = bidderRequest.timeout; + validBidRequests.forEach(bid => bid.netRevenue = 'net'); + const imps = validBidRequests.map((bid, idx) => { + const imp = { + id: idx + 1 + '' + }; + if (bid.params.tagid) { + imp.tagid = bid.params.tagid; + } + if (bid.sizes) { + imp.banner = { + format: transformSizes(bid.sizes) + }; + } + return imp; + }); + const request = { + id: bidderRequest.bidderRequestId, + site: { + page, + domain, + publisher + }, + device: { + ua, + devicetype + }, + source: { + fd: 1 + }, + cur: [cur], + tmax: timeout, + imp: imps + }; + return { + method: 'POST', + url: endpointUrl, + data: request, + bids: validBidRequests, + options: { + withCredentials: false + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (serverResponse, _ref) => { + let { + bids + } = _ref; + if (!serverResponse.body) { + return []; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidResponses = flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => { + result[bid.impid - 1] = bid; + return result; + }, []); + return bids.map((bid, id) => { + const bidResponse = bidResponses[id]; + if (bidResponse) { + const bidObject = { + requestId: bid.bidId, + cpm: bidResponse.price, + creativeId: bidResponse.crid, + ttl: 360, + netRevenue: true, + currency: cur, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + ad: bidResponse.adm, + width: bidResponse.w, + height: bidResponse.h, + meta: { + advertiserDomains: bid.adomain ? bid.adomain : [] + } + }; + return bidObject; + } + }).filter(Boolean); + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +function getDeviceType() { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) { + return 5; // 'tablet' + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) { + return 4; // 'mobile' + } + return 2; // 'desktop' +} +function flatten(arr) { + return [].concat(...arr); +} + +/* Turn bid request sizes into ut-compatible format */ +function transformSizes(requestSizes) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(requestSizes)) { + return []; + } + if (requestSizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(requestSizes[0])) { + return [{ + w: parseInt(requestSizes[0], 10), + h: parseInt(requestSizes[1], 10) + }]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(requestSizes[0])) { + return requestSizes.map(item => ({ + w: parseInt(item[0], 10), + h: parseInt(item[1], 10) + })); + } + return []; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('codefuelBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/codefuelBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cointrafficBidAdapter"],{ + +/***/ "./modules/cointrafficBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/cointrafficBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + */ + +const BIDDER_CODE = 'cointraffic'; +const ENDPOINT_URL = 'https://apps-pbd.ctraffic.io/pb/tmp'; +const DEFAULT_CURRENCY = 'EUR'; +const ALLOWED_CURRENCIES = ['EUR', 'USD', 'JPY', 'BGN', 'CZK', 'DKK', 'GBP', 'HUF', 'PLN', 'RON', 'SEK', 'CHF', 'ISK', 'NOK', 'HRK', 'RUB', 'TRY', 'AUD', 'BRL', 'CAD', 'CNY', 'HKD', 'IDR', 'ILS', 'INR', 'KRW', 'MXN', 'MYR', 'NZD', 'PHP', 'SGD', 'THB', 'ZAR']; + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param validBidRequests + * @param bidderRequest + * @return Array Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bidRequest.params.size || bidRequest.sizes); + const currency = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(`currency.bidderCurrencyDefault.${BIDDER_CODE}`) || (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CURRENCY; + if (ALLOWED_CURRENCIES.indexOf(currency) === -1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Currency is not supported - ' + currency); + return; + } + const payload = { + placementId: bidRequest.params.placementId, + currency: currency, + sizes: sizes, + bidId: bidRequest.bidId, + referer: bidderRequest.refererInfo.ref + }; + return { + method: 'POST', + url: ENDPOINT_URL, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(response)) { + return bidResponses; + } + const bidResponse = { + requestId: response.requestId, + cpm: response.cpm, + currency: response.currency, + netRevenue: response.netRevenue, + width: response.width, + height: response.height, + creativeId: response.creativeId, + ttl: response.ttl, + ad: response.ad, + meta: { + advertiserDomains: response.adomain && response.adomain.length ? response.adomain : [], + mediaType: response.mediaType + } + }; + bidResponses.push(bidResponse); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('cointrafficBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/cointrafficBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["coinzillaBidAdapter"],{ + +/***/ "./modules/coinzillaBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/coinzillaBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'coinzilla'; +const ENDPOINT_URL = 'https://request.czilladx.com/serve/request.php'; +const spec = { + code: BIDDER_CODE, + aliases: ['czlla'], + // short code + + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @return Array Info describing the request to the server. + * @param validBidRequests + * @param bidderRequest + */ + buildRequests: function (validBidRequests, bidderRequest) { + if (validBidRequests.length === 0) { + return []; + } + return validBidRequests.map(bidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(bidRequest.params.size || bidRequest.sizes)[0]; + const width = sizes.split('x')[0]; + const height = sizes.split('x')[1]; + const payload = { + placementId: bidRequest.params.placementId, + width: width, + height: height, + bidId: bidRequest.bidId, + // TODO: is 'page' the right value here? + referer: bidderRequest.refererInfo.page + }; + return { + method: 'POST', + url: ENDPOINT_URL, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + const creativeId = response.creativeId || 0; + const width = response.width || 0; + const height = response.height || 0; + const cpm = response.cpm || 0; + if (width !== 0 && height !== 0 && cpm !== 0 && creativeId !== 0) { + const dealId = response.dealid || ''; + const currency = response.currency || 'EUR'; + const netRevenue = response.netRevenue === undefined ? true : response.netRevenue; + const referrer = bidRequest.data.referer; + const bidResponse = { + requestId: response.requestId, + cpm: cpm, + width: response.width, + height: response.height, + creativeId: creativeId, + dealId: dealId, + currency: currency, + netRevenue: netRevenue, + ttl: response.timeout, + referrer: referrer, + ad: response.ad, + mediaType: response.mediaType, + meta: { + advertiserDomains: response.advertiserDomain || [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('coinzillaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/coinzillaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["colombiaBidAdapter"],{ + +/***/ "./modules/colombiaBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/colombiaBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'colombia'; +const ENDPOINT_URL = 'https://ade.clmbtech.com/cde/prebid.htm'; +const HOST_NAME = document.location.protocol + '//' + window.location.host; +const spec = { + code: BIDDER_CODE, + aliases: ['clmb'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (validBidRequests.length === 0) { + return []; + } + let payloadArr = []; + let ctr = 1; + validBidRequests = validBidRequests.map(bidRequest => { + const params = bidRequest.params; + const sizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput(bidRequest.sizes)[0]; + const width = sizes.split('x')[0]; + const height = sizes.split('x')[1]; + const placementId = params.placementId; + const cb = Math.floor(Math.random() * 99999999999); + const bidId = bidRequest.bidId; + const referrer = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer ? bidderRequest.refererInfo.referer : ''; + let mediaTypes = {}; + let payload = { + v: 'hb1', + p: placementId, + pos: '~' + ctr, + w: width, + h: height, + cb: cb, + r: referrer, + uid: bidId, + t: 'i', + d: HOST_NAME, + fpc: params.fpc, + _u: window.location.href, + mediaTypes: Object.assign({}, mediaTypes, bidRequest.mediaTypes) + }; + if (params.keywords) payload.keywords = params.keywords; + if (params.category) payload.cat = params.category; + if (params.pageType) payload.pgt = params.pageType; + if (params.incognito) payload.ic = params.incognito; + if (params.dsmi) payload.smi = params.dsmi; + if (params.optout) payload.out = params.optout; + if (bidRequest && bidRequest.hasOwnProperty('ortb2Imp') && bidRequest.ortb2Imp.hasOwnProperty('ext')) { + payload.ext = bidRequest.ortb2Imp.ext; + if (bidRequest.ortb2Imp.ext.hasOwnProperty('gpid')) payload.pubAdCode = bidRequest.ortb2Imp.ext.gpid.split('#')[0]; + } + payloadArr.push(payload); + ctr++; + }); + return [{ + method: 'POST', + url: ENDPOINT_URL, + data: payloadArr + }]; + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const res = serverResponse.body || serverResponse; + if (!res || res.length === 0) { + return bidResponses; + } + try { + res.forEach(response => { + const crid = response.creativeId || 0; + const width = response.width || 0; + const height = response.height || 0; + let cpm = response.cpm || 0; + if (cpm <= 0) { + return bidResponses; + } + if (width !== 0 && height !== 0 && cpm !== 0 && crid !== 0) { + const dealId = response.dealid || ''; + const currency = response.currency || 'USD'; + const netRevenue = response.netRevenue === undefined ? true : response.netRevenue; + const bidResponse = { + requestId: response.requestId, + cpm: cpm.toFixed(2), + width: response.width, + height: response.height, + creativeId: crid, + dealId: dealId, + currency: currency, + netRevenue: netRevenue, + ttl: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('_bidderTimeout') || 300, + referrer: bidRequest.data.r, + ad: response.ad + }; + bidResponses.push(bidResponse); + } + }); + } catch (error) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError(error); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('colombiaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/colombiaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["colossussspBidAdapter"],{ + +/***/ "./modules/colossussspBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/colossussspBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'colossusssp'; +const G_URL = 'https://colossusssp.com/?c=o&m=multi'; +const G_URL_SYNC = 'https://sync.colossusssp.com'; +function isBidResponseValid(bid) { + if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) { + return false; + } + switch (bid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + return Boolean(bid.width && bid.height && bid.ad); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + return Boolean(bid.vastUrl); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + return Boolean(bid.native); + default: + return false; + } +} +function getUserId(eids, id, source, uidExt) { + if (id) { + var uid = { + id + }; + if (uidExt) { + uid.ext = uidExt; + } + eids.push({ + source, + uids: [uid] + }); + } +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + const validPlacamentId = bid.params && !isNaN(bid.params.placement_id); + const validGroupId = bid.params && !isNaN(bid.params.group_id); + return Boolean(bid.bidId && (validPlacamentId || validGroupId)); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let deviceWidth = 0; + let deviceHeight = 0; + let winLocation; + try { + const winTop = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(); + deviceWidth = winTop.screen.width; + deviceHeight = winTop.screen.height; + winLocation = winTop.location; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(e); + winLocation = window.location; + } + const refferUrl = bidderRequest.refererInfo?.page; + let refferLocation; + try { + refferLocation = refferUrl && new URL(refferUrl); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(e); + } + const firstPartyData = bidderRequest.ortb2 || {}; + const userObj = firstPartyData.user; + const siteObj = firstPartyData.site; + const appObj = firstPartyData.app; + + // TODO: does the fallback to window.location make sense? + const location = refferLocation || winLocation; + let placements = []; + let request = { + deviceWidth, + deviceHeight, + language: navigator && navigator.language ? navigator.language : '', + secure: location.protocol === 'https:' ? 1 : 0, + host: location.host, + page: location.pathname, + userObj, + siteObj, + appObj, + placements: placements + }; + if (bidderRequest) { + if (bidderRequest.uspConsent) { + request.ccpa = bidderRequest.uspConsent; + } + if (bidderRequest.gdprConsent) { + request.gdpr_consent = bidderRequest.gdprConsent.consentString || 'ALL'; + request.gdpr_require = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + + // Add GPP consent + if (bidderRequest.gppConsent) { + request.gpp = bidderRequest.gppConsent.gppString; + request.gpp_sid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest.ortb2?.regs?.gpp) { + request.gpp = bidderRequest.ortb2.regs.gpp; + request.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + } + for (let i = 0; i < validBidRequests.length; i++) { + let bid = validBidRequests[i]; + const { + mediaTypes + } = bid; + let placement = { + placementId: bid.params.placement_id, + groupId: bid.params.group_id, + bidId: bid.bidId, + tid: bid.ortb2Imp?.ext?.tid, + eids: bid.userIdAsEids || [], + floor: {} + }; + if (bid.schain) { + placement.schain = bid.schain; + } + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + placement.gpid = gpid; + } + if (bid.userId) { + getUserId(placement.eids, bid.userId.idl_env, 'identityLink'); + getUserId(placement.eids, bid.userId.id5id, 'id5-sync.com'); + getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com'); + getUserId(placement.eids, bid.userId.tdid, 'adserver.org', { + rtiPartner: 'TDID' + }); + } + if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + placement.traffic = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + placement.sizes = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]) { + placement.traffic = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + placement.sizes = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize; + placement.playerSize = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize; + placement.minduration = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].minduration; + placement.maxduration = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].maxduration; + placement.mimes = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].mimes; + placement.protocols = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].protocols; + placement.startdelay = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].startdelay; + placement.placement = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].plcmt; + placement.skip = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].skip; + placement.skipafter = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].skipafter; + placement.minbitrate = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].minbitrate; + placement.maxbitrate = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].maxbitrate; + placement.delivery = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].delivery; + placement.playbackmethod = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playbackmethod; + placement.api = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].api; + placement.linearity = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].linearity; + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]) { + placement.traffic = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + placement.native = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; + } + if (typeof bid.getFloor === 'function') { + let tmpFloor = {}; + for (let size of placement.sizes) { + tmpFloor = bid.getFloor({ + currency: 'USD', + mediaType: placement.traffic, + size: size + }); + if (tmpFloor) { + placement.floor[`${size[0]}x${size[1]}`] = tmpFloor.floor; + } + } + } + placements.push(placement); + } + return { + method: 'POST', + url: G_URL, + data: request + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: serverResponse => { + let response = []; + try { + serverResponse = serverResponse.body; + for (let i = 0; i < serverResponse.length; i++) { + let resItem = serverResponse[i]; + if (isBidResponseValid(resItem)) { + const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : []; + resItem.meta = { + ...resItem.meta, + advertiserDomains + }; + response.push(resItem); + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(e); + } + ; + return response; + }, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + let syncType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let syncUrl = G_URL_SYNC + `/${syncType}?pbjs=1`; + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`; + } + } + if (uspConsent && uspConsent.consentString) { + syncUrl += `&ccpa_consent=${uspConsent.consentString}`; + } + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') ? 1 : 0; + syncUrl += `&coppa=${coppa}`; + return [{ + type: syncType, + url: syncUrl + }]; + }, + onBidWon: bid => { + if (bid.nurl) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(bid.nurl, null); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('colossussspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/colossussspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["compassBidAdapter"],{ + +/***/ "./modules/compassBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/compassBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'compass'; +const GVLID = 883; +const AD_URL = 'https://sa-lb.deliverimp.com/pbjs'; +const SYNC_URL = 'https://sa-cs.deliverimp.com'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('compassBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/compassBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["conceptxBidAdapter"],{ + +/***/ "./modules/conceptxBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/conceptxBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + +// import { logError, logInfo, logWarn, parseUrl } from '../src/utils.js'; + +const BIDDER_CODE = 'conceptx'; +const ENDPOINT_URL = 'https://conceptx.cncpt-central.com/openrtb'; +// const LOG_PREFIX = 'ConceptX: '; +const GVLID = 1340; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + gvlid: GVLID, + isBidRequestValid: function (bid) { + return !!(bid.bidId && bid.params.site && bid.params.adunit); + }, + buildRequests: function (validBidRequests, bidderRequest) { + // logWarn(LOG_PREFIX + 'all native assets containing URL should be sent as placeholders with sendId(icon, image, clickUrl, displayUrl, privacyLink, privacyIcon)'); + const requests = []; + let requestUrl = `${ENDPOINT_URL}`; + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + requestUrl += '?gdpr_applies=' + bidderRequest.gdprConsent.gdprApplies; + requestUrl += '&consentString=' + bidderRequest.gdprConsent.consentString; + } + for (var i = 0; i < validBidRequests.length; i++) { + const requestParent = { + adUnits: [], + meta: {} + }; + const bid = validBidRequests[i]; + const { + adUnitCode, + auctionId, + bidId, + bidder, + bidderRequestId, + ortb2 + } = bid; + requestParent.meta = { + adUnitCode, + auctionId, + bidId, + bidder, + bidderRequestId, + ortb2 + }; + const { + site, + adunit + } = bid.params; + const adUnit = { + site, + adunit, + targetId: bid.bidId + }; + if (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) adUnit.dimensions = bid.mediaTypes.banner.sizes; + requestParent.adUnits.push(adUnit); + requests.push({ + method: 'POST', + url: requestUrl, + options: { + withCredentials: false + }, + data: JSON.stringify(requestParent) + }); + } + return requests; + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const bidResponsesFromServer = serverResponse.body.bidResponses; + if (Array.isArray(bidResponsesFromServer) && bidResponsesFromServer.length === 0) { + return bidResponses; + } + const firstBid = bidResponsesFromServer[0]; + if (!firstBid) { + return bidResponses; + } + const firstSeat = firstBid.ads[0]; + if (!firstSeat) { + return bidResponses; + } + const bidResponse = { + requestId: firstSeat.requestId, + cpm: firstSeat.cpm, + width: firstSeat.width, + height: firstSeat.height, + creativeId: firstSeat.creativeId, + dealId: firstSeat.dealId, + currency: firstSeat.currency, + netRevenue: true, + ttl: firstSeat.ttl, + referrer: firstSeat.referrer, + ad: firstSeat.html + }; + bidResponses.push(bidResponse); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('conceptxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/conceptxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["concertAnalyticsAdapter"],{ + +/***/ "./modules/concertAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/concertAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + + + + +const analyticsType = 'endpoint'; + +// We only want to send about 1% of events for sampling purposes +const SAMPLE_RATE_PERCENTAGE = 1 / 100; +const pageIncludedInSample = sampleAnalytics(); +const url = 'https://bids.concert.io/analytics'; +const { + BID_RESPONSE, + BID_WON, + AUCTION_END +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +let queue = []; +let concertAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + url, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case BID_RESPONSE: + if (args.bidder !== 'concert') break; + queue.push(mapBidEvent(eventType, args)); + break; + case BID_WON: + if (args.bidder !== 'concert') break; + queue.push(mapBidEvent(eventType, args)); + break; + case AUCTION_END: + // Set a delay, as BID_WON events will come after AUCTION_END events + setTimeout(() => sendEvents(), 3000); + break; + default: + break; + } + } +}); +function mapBidEvent(eventType, args) { + const { + adId, + auctionId, + cpm, + creativeId, + width, + height, + timeToRespond + } = args; + const [gamCreativeId, concertRequestId] = getConcertRequestId(creativeId); + const payload = { + event: eventType, + concert_rid: concertRequestId, + adId, + auctionId, + creativeId: gamCreativeId, + position: args.adUnitCode, + url: window.location.href, + cpm, + width, + height, + timeToRespond + }; + return payload; +} + +/** + * In order to pass back the concert_rid from CBS, it is tucked into the `creativeId` + * slot in the bid response and combined with a pipe `|`. This method splits the creative ID + * and the concert_rid. + * + * @param {string} creativeId + */ +function getConcertRequestId(creativeId) { + if (!creativeId || creativeId.indexOf('|') < 0) return [null, null]; + return creativeId.split('|'); +} +function sampleAnalytics() { + return Math.random() <= SAMPLE_RATE_PERCENTAGE; +} +function sendEvents() { + concertAnalytics.eventsStorage = queue; + if (!queue.length) return; + if (!pageIncludedInSample) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Page not included in sample for Concert Analytics'); + return; + } + try { + const body = JSON.stringify(queue); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, () => queue = [], body, { + contentType: 'application/json', + method: 'POST' + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Concert Analytics error'); + } +} + +// save the base class function +concertAnalytics.originEnableAnalytics = concertAnalytics.enableAnalytics; +concertAnalytics.eventsStorage = []; + +// override enableAnalytics so we can get access to the config passed in from the page +concertAnalytics.enableAnalytics = function (config) { + concertAnalytics.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: concertAnalytics, + code: 'concert' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (concertAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('concertAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/concertAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["concertBidAdapter"],{ + +/***/ "./modules/concertBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/concertBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, storage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'concert'; +const CONCERT_ENDPOINT = 'https://bids.concert.io'; +const spec = { + code: BIDDER_CODE, + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (!bid.params.partnerId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Missing partnerId bid parameter'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(validBidRequests); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(bidderRequest); + const eids = []; + let payload = { + meta: { + prebidVersion: "9.45.0-pre", + pageUrl: bidderRequest.refererInfo.page, + screen: [window.screen.width, window.screen.height].join('x'), + browserLanguage: window.navigator.language, + debug: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.debugTurnedOn)(), + uid: getUid(bidderRequest, validBidRequests), + optedOut: hasOptedOutOfPersonalization(), + adapterVersion: '1.2.0', + uspConsent: bidderRequest.uspConsent, + gdprConsent: bidderRequest.gdprConsent, + gppConsent: bidderRequest.gppConsent, + tdid: getTdid(bidderRequest, validBidRequests) + } + }; + if (!payload.meta.gppConsent && bidderRequest.ortb2?.regs?.gpp) { + payload.meta.gppConsent = { + gppString: bidderRequest.ortb2.regs.gpp, + applicableSections: bidderRequest.ortb2.regs.gpp_sid + }; + } + payload.slots = validBidRequests.map(bidRequest => { + collectEid(eids, bidRequest); + const adUnitElement = document.getElementById(bidRequest.adUnitCode); + const coordinates = getOffset(adUnitElement); + let slot = { + name: bidRequest.adUnitCode, + bidId: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + sizes: bidRequest.params.sizes || bidRequest.sizes, + partnerId: bidRequest.params.partnerId, + slotType: bidRequest.params.slotType, + adSlot: bidRequest.params.slot || bidRequest.adUnitCode, + placementId: bidRequest.params.placementId || '', + site: bidRequest.params.site || bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref, + offsetCoordinates: { + x: coordinates?.left, + y: coordinates?.top + } + }; + return slot; + }); + payload.meta.eids = eids.filter(Boolean); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(payload); + return { + method: 'POST', + url: `${CONCERT_ENDPOINT}/bids/prebid`, + data: JSON.stringify(payload) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(serverResponse); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(bidRequest); + const serverBody = serverResponse.body; + if (!serverBody || typeof serverBody !== 'object') { + return []; + } + let bidResponses = []; + bidResponses = serverBody.bids.map(bid => { + return { + requestId: bid.bidId, + cpm: bid.cpm, + width: bid.width, + height: bid.height, + ad: bid.ad, + ttl: bid.ttl, + meta: { + advertiserDomains: bid && bid.adomain ? bid.adomain : [] + }, + creativeId: bid.creativeId, + netRevenue: bid.netRevenue, + currency: bid.currency, + ...(bid.dealid && { + dealId: bid.dealid + }) + }; + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.debugTurnedOn)() && serverBody.debug) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(`CONCERT`, serverBody.debug); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(bidResponses); + return bidResponses; + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {Object} data Containing timeout specific data + */ + onTimeout: function (data) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('concert bidder timed out'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(data); + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Bid} bid The bid that won the auction + */ + onBidWon: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('concert bidder won bid'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_2__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); + +/** + * Check or generate a UID for the current user. + */ +function getUid(bidderRequest, validBidRequests) { + if (hasOptedOutOfPersonalization() || !consentAllowsPpid(bidderRequest)) { + return false; + } + + /** + * check for shareId or pubCommonId before generating a new one + * sharedId: @see https://docs.prebid.org/dev-docs/modules/userId.html + * pubCid (no longer supported): @see https://docs.prebid.org/dev-docs/modules/pubCommonId.html#adapter-integration + */ + const sharedId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'userId.sharedid.id') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'userId.pubcid'); + const pubCid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'crumbs.pubcid'); + if (sharedId) return sharedId; + if (pubCid) return pubCid; + const LEGACY_CONCERT_UID_KEY = 'c_uid'; + const CONCERT_UID_KEY = 'vmconcert_uid'; + const legacyUid = storage.getDataFromLocalStorage(LEGACY_CONCERT_UID_KEY); + let uid = storage.getDataFromLocalStorage(CONCERT_UID_KEY); + if (legacyUid) { + uid = legacyUid; + storage.setDataInLocalStorage(CONCERT_UID_KEY, uid); + storage.removeDataFromLocalStorage(LEGACY_CONCERT_UID_KEY); + } + if (!uid) { + uid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + storage.setDataInLocalStorage(CONCERT_UID_KEY, uid); + } + return uid; +} + +/** + * Whether the user has opted out of personalization. + */ +function hasOptedOutOfPersonalization() { + const CONCERT_NO_PERSONALIZATION_KEY = 'c_nap'; + return storage.getDataFromLocalStorage(CONCERT_NO_PERSONALIZATION_KEY) === 'true'; +} + +/** + * Whether the privacy consent strings allow personalization. + * + * @param {BidderRequest} bidderRequest Object which contains any data consent signals + */ +function consentAllowsPpid(bidderRequest) { + let uspConsentAllows = true; + + // if a us privacy string was provided, but they explicitly opted out + if (typeof bidderRequest?.uspConsent === 'string' && bidderRequest?.uspConsent[0] === '1' && bidderRequest?.uspConsent[2].toUpperCase() === 'Y' // user has opted-out + ) { + uspConsentAllows = false; + } + + /* + * True if the gdprConsent is null-y; or GDPR does not apply; or if purpose 1 consent was given. + * Much more nuanced GDPR requirements are tested on the bid server using the @iabtcf/core npm module; + */ + const gdprConsentAllows = (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__.hasPurpose1Consent)(bidderRequest?.gdprConsent); + return uspConsentAllows && gdprConsentAllows; +} +function collectEid(eids, bid) { + if (bid.userId) { + const eid = getUserId(bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com', undefined, 3); + eids.push(eid); + } +} +function getUserId(id, source, uidExt, atype) { + if (id) { + const uid = { + id, + atype + }; + if (uidExt) { + uid.ext = uidExt; + } + return { + source, + uids: [uid] + }; + } +} +function getOffset(el) { + if (el) { + const rect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_5__.getBoundingClientRect)(el); + return { + left: rect.left + window.scrollX, + top: rect.top + window.scrollY + }; + } +} +function getTdid(bidderRequest, validBidRequests) { + if (hasOptedOutOfPersonalization() || !consentAllowsPpid(bidderRequest)) { + return null; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'userId.tdid') || null; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('concertBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","boundingClientRect","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/concertBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["condorxBidAdapter"],{ + +/***/ "./modules/condorxBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/condorxBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export bidderSpec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + +const BIDDER_CODE = 'condorx'; +const API_URL = 'https://api.condorx.io/cxb/get.json'; +const REQUEST_METHOD = 'GET'; +const MAX_SIZE_DEVIATION = 0.05; +const SUPPORTED_AD_SIZES = [[100, 100], [200, 200], [300, 250], [336, 280], [400, 200], [300, 200], [600, 600], [236, 202], [1080, 1920], [300, 374]]; +function getBidRequestUrl(bidRequest, bidderRequest) { + if (bidRequest.params.url && bidRequest.params.url !== 'current url') { + return bidRequest.params.url; + } + return getBidderRequestUrl(bidderRequest); +} +function getBidderRequestUrl(bidderRequest) { + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + return bidderRequest.refererInfo.page; + } + const pageUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.inIframe)() && document.referrer ? document.referrer : window.location.href; + return encodeURIComponent(pageUrl); +} +function getTileImageUrl(tile) { + return tile.imageUrl.indexOf('http') === -1 ? 'https:' + tile.imageUrl : tile.imageUrl; +} +function collectImpressionTrackers(tile, response) { + const trackers = [response.widgetViewPixel]; + if (!tile.trackers) return trackers; + const impressionTrackers = tile.trackers.impressionPixels || []; + const viewTrackers = tile.trackers.viewPixels || []; + return [...impressionTrackers, ...viewTrackers, ...trackers]; +} +function parseNativeAdResponse(tile, response) { + return { + title: tile.title, + body: '', + image: { + url: getTileImageUrl(tile), + width: response.imageWidth, + height: response.imageHeight + }, + privacyLink: '', + clickUrl: tile.clickUrl, + displayUrl: tile.url, + cta: '', + sponsoredBy: tile.displayName, + impressionTrackers: collectImpressionTrackers(tile, response) + }; +} +function parseBannerAdResponse(tile, response) { + if (tile.tag) { + return tile.tag; + } + let style = ''; + try { + const config = JSON.parse(response.widget.config); + const css = config.css || ''; + style = css ? `` : ''; + } catch (e) { + style = ''; + } + const title = tile.title && tile.title.trim() ? `` : ''; + const displayName = tile.displayName && title ? `` : ''; + const trackers = collectImpressionTrackers(tile, response).map(url => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.createTrackPixelHtml)(url)).join(''); + return `${style}`; +} +function getValidAdSize(bidRequest) { + const sizes = getBidderAdSizes(bidRequest); + return sizes.find(isValidAdSize); +} +function getBidderAdSizes(bidRequest) { + if (bidRequest.sizes && bidRequest.sizes.length > 0) { + return bidRequest.sizes; + } else if (bidRequest.nativeParams && bidRequest.nativeParams.image && bidRequest.nativeParams.image.sizes) { + return [bidRequest.nativeParams.image.sizes]; + } + return [[-1, -1]]; +} +function isValidAdSize(_ref) { + let [width, height] = _ref; + if (!width || !height) { + return false; + } + return SUPPORTED_AD_SIZES.some(_ref2 => { + let [supportedWidth, supportedHeight] = _ref2; + if (supportedWidth === width && supportedHeight === height) { + return true; + } + const supportedRatio = supportedWidth / supportedHeight; + const ratioDeviation = supportedRatio / width * height; + return Math.abs(ratioDeviation - 1) <= MAX_SIZE_DEVIATION && (supportedWidth > width || (width - supportedWidth) / width <= MAX_SIZE_DEVIATION); + }); +} +const bidderSpec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid: function (bidRequest) { + return bidRequest && bidRequest.params && bidRequest.params.hasOwnProperty('widget') && bidRequest.params.hasOwnProperty('website') && !isNaN(bidRequest.params.widget) && !isNaN(bidRequest.params.website) && !!getValidAdSize(bidRequest); + }, + buildRequests: function (validBidRequests, bidderRequest) { + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + if (!validBidRequests) { + return []; + } + return validBidRequests.map(bidRequest => { + if (bidRequest.params) { + const mediaType = bidRequest.hasOwnProperty('nativeParams') ? 1 : 2; + const [imageWidth, imageHeight] = getValidAdSize(bidRequest); + const widgetId = bidRequest.params.widget; + const websiteId = bidRequest.params.website; + const pageUrl = getBidRequestUrl(bidRequest, bidderRequest); + let subid; + try { + let url; + try { + url = new URL(pageUrl); + } catch (e) { + url = new URL(getBidderRequestUrl(bidderRequest)); + } + subid = url.hostname; + } catch (e) { + subid = widgetId; + } + const bidId = bidRequest.bidId; + let apiUrl = `${API_URL}?w=${websiteId}&wg=${widgetId}&u=${pageUrl}&s=${subid}&p=0&ireqid=${bidId}&prebid=${mediaType}&imgw=${imageWidth}&imgh=${imageHeight}`; + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprApplies && bidderRequest.consentString) { + apiUrl += `&g=1&gc=${bidderRequest.consentString}`; + } + return { + url: apiUrl, + method: REQUEST_METHOD, + data: '' + }; + } + }).filter(Boolean); + }, + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse.body || !serverResponse.body.tiles || !serverResponse.body.tiles.length) { + return []; + } + const response = serverResponse.body; + const isNative = response.pbtypeId === 1; + return response.tiles.map(tile => { + let bid = { + requestId: response.ireqId, + width: response.imageWidth, + height: response.imageHeight, + creativeId: tile.postId, + cpm: tile.pcpm || tile.ecpm / 100, + currency: 'USD', + netRevenue: !!tile.pcpm, + ttl: 360, + meta: { + advertiserDomains: tile.domain ? [tile.domain] : [] + } + }; + if (isNative) { + bid.native = parseNativeAdResponse(tile, response); + } else { + bid.ad = parseBannerAdResponse(tile, response); + } + return bid; + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(bidderSpec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('condorxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/condorxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["confiantRtdProvider"],{ + +/***/ "./modules/confiantRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/confiantRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module provides comprehensive detection of security, quality, and privacy threats by Confiant Inc, + * the industry leader in real-time detecting and blocking of bad ads + * + * The {@link module:modules/realTimeData} module is required + * The module will inject a Confiant Inc. script into the page to monitor ad impressions + * @module modules/confiantRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** + * Injects the Confiant Inc. configuration script into the page, based on proprtyId provided + * @param {string} propertyId + */ +function injectConfigScript(propertyId) { + const scriptSrc = `https://cdn.confiant-integrations.net/${propertyId}/gpt_and_prebid/config.js`; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_0__.loadExternalScript)(scriptSrc, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, 'confiant', () => {}); +} + +/** + * Set up page with Confiant integration + * @param {Object} config + */ +function setupPage(config) { + const propertyId = config?.params?.propertyId; + if (!propertyId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Confiant pbjs module: no propertyId provided'); + return false; + } + const confiant = window.confiant || Object.create(null); + confiant[propertyId] = confiant[propertyId] || Object.create(null); + confiant[propertyId].clientSettings = confiant[propertyId].clientSettings || Object.create(null); + confiant[propertyId].clientSettings.isMGBL = true; + confiant[propertyId].clientSettings.prebidExcludeBidders = config?.params?.prebidExcludeBidders; + confiant[propertyId].clientSettings.prebidNameSpace = config?.params?.prebidNameSpace; + if (config?.params?.shouldEmitBillableEvent) { + if (window.frames['cnftComm']) { + subscribeToConfiantCommFrame(window, propertyId); + } else { + setUpMutationObserver(); + } + } + injectConfigScript(propertyId); + return true; +} + +/** + * Subscribe to window's message events to report Billable events + * @param {Window} targetWindow window instance to subscribe to + */ +function subscribeToConfiantCommFrame(targetWindow, propertyId) { + targetWindow.addEventListener('message', getEventHandlerFunction(propertyId)); +} +let mutationObserver; +/** + * Set up mutation observer to subscribe to Confiant's communication channel ASAP + */ +function setUpMutationObserver() { + mutationObserver = new MutationObserver(mutations => { + mutations.forEach(mutation => { + mutation.addedNodes.forEach(addedNode => { + if (addedNode.nodeName === 'IFRAME' && addedNode.name === 'cnftComm' && !addedNode.pbjsModuleSubscribed) { + addedNode.pbjsModuleSubscribed = true; + mutationObserver.disconnect(); + mutationObserver = null; + const iframeWindow = addedNode.contentWindow; + subscribeToConfiantCommFrame(iframeWindow); + } + }); + }); + }); + mutationObserver.observe(document.head, { + childList: true, + subtree: true + }); +} + +/** + * Emit billable event when Confiant integration reports that it has monitored an impression + */ +function getEventHandlerFunction(propertyId) { + return function reportBillableEvent(e) { + if (e.data.type.indexOf('cnft:reportBillableEvent:' + propertyId) > -1) { + _src_events_js__WEBPACK_IMPORTED_MODULE_3__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BILLABLE_EVENT, { + auctionId: e.data.auctionId, + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + transactionId: e.data.transactionId, + type: 'impression', + vendor: 'confiant' + }); + } + }; +} + +/** + * Confiant submodule registration + */ +function registerConfiantSubmodule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', { + name: 'confiant', + init: config => { + try { + return setupPage(config); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err.message); + if (mutationObserver) { + mutationObserver.disconnect(); + } + return false; + } + } + }); +} +registerConfiantSubmodule(); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = ({ + injectConfigScript, + setupPage, + subscribeToConfiantCommFrame, + setUpMutationObserver, + registerConfiantSubmodule +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('confiantRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/confiantRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["connatixBidAdapter"],{ + +/***/ "./modules/connatixBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/connatixBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, getBidFloor, validateBanner, validateVideo, _getMinSize, _canSelectViewabilityContainer, _isViewabilityMeasurable, _getViewability, detectViewability, _getBidRequests, hasQueryParams, saveOnAllStorages, readFromAllStorages, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/percentInView/percentInView.js */ "./libraries/percentInView/percentInView.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + + + + +const BIDDER_CODE = 'connatix'; +const AD_URL = 'https://capi.connatix.com/rtb/hba'; +const DEFAULT_MAX_TTL = '3600'; +const DEFAULT_CURRENCY = 'USD'; +const CNX_IDS_LOCAL_STORAGE_COOKIES_KEY = 'cnx_user_ids'; +const CNX_IDS_EXPIRY = 24 * 30 * 60 * 60 * 1000; // 30 days +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const ALL_PROVIDERS_RESOLVED_EVENT = 'cnx_all_identity_providers_resolved'; +const IDENTITY_PROVIDER_COLLECTION_UPDATED_EVENT = 'cnx_identity_provider_collection_updated'; +let cnxIdsValues; +const EVENTS_URL = 'https://capi.connatix.com/tr/am'; +let context = {}; + +/* + * Get the bid floor value from the bid object, either using the getFloor function or by accessing the 'params.bidfloor' property. + * If the bid floor cannot be determined, return 0 as a fallback value. + */ +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidfloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(err); + return 0; + } +} +function validateBanner(mediaTypes) { + if (!mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER]) { + return true; + } + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(mediaTypes, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, {}); + return Boolean(banner.sizes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER].sizes) && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER].sizes.length > 0; +} +function validateVideo(mediaTypes) { + const video = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO]; + if (!video) { + return true; + } + return video.context !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.ADPOD; +} +function _getMinSize(sizes) { + if (!sizes || sizes.length === 0) return undefined; + return sizes.reduce((minSize, currentSize) => { + const minArea = minSize.w * minSize.h; + const currentArea = currentSize.w * currentSize.h; + return currentArea < minArea ? currentSize : minSize; + }); +} +function _canSelectViewabilityContainer() { + try { + window.top.document.querySelector('#viewability-container'); + return true; + } catch (e) { + return false; + } +} +function _isViewabilityMeasurable(element) { + if (!element) return false; + return _canSelectViewabilityContainer(element); +} +function _getViewability(element, topWin) { + let { + w, + h + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return topWin.document.visibilityState === 'visible' ? (0,_libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_4__.percentInView)(element, { + w, + h + }) : 0; +} +function detectViewability(bid) { + const { + params, + adUnitCode + } = bid; + const viewabilityContainerIdentifier = params.viewabilityContainerIdentifier; + let element = null; + let bidParamSizes = null; + let minSize = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(viewabilityContainerIdentifier)) { + try { + element = document.querySelector(viewabilityContainerIdentifier) || window.top.document.querySelector(viewabilityContainerIdentifier); + if (element) { + bidParamSizes = [element.offsetWidth, element.offsetHeight]; + minSize = _getMinSize(bidParamSizes); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Error while trying to find viewability container element: ${viewabilityContainerIdentifier}`); + } + } + if (!element) { + // Get the sizes from the mediaTypes object if it exists, otherwise use the sizes array from the bid object + bidParamSizes = bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes ? bid.mediaTypes.banner.sizes : bid.sizes; + bidParamSizes = typeof bidParamSizes === 'undefined' && bid.mediaType && bid.mediaType.video && bid.mediaType.video.playerSize ? bid.mediaType.video.playerSize : bidParamSizes; + bidParamSizes = typeof bidParamSizes === 'undefined' && bid.mediaType && bid.mediaType.video && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.mediaType.video.w) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.mediaType.h) ? [bid.mediaType.video.w, bid.mediaType.video.h] : bidParamSizes; + minSize = _getMinSize(bidParamSizes ?? []); + element = document.getElementById(adUnitCode); + } + if (_isViewabilityMeasurable(element)) { + const minSizeObj = { + w: minSize[0], + h: minSize[1] + }; + return Math.round(_getViewability(element, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(), minSizeObj)); + } + return null; +} +function _getBidRequests(validBidRequests) { + return validBidRequests.map(bid => { + const { + bidId, + mediaTypes, + params, + sizes + } = bid; + const { + placementId, + viewabilityContainerIdentifier + } = params; + let detectedViewabilityPercentage = detectViewability(bid); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(detectedViewabilityPercentage)) { + detectedViewabilityPercentage = detectedViewabilityPercentage / 100; + } + return { + bidId, + mediaTypes, + sizes, + placementId, + floor: getBidFloor(bid), + hasViewabilityContainerId: Boolean(viewabilityContainerIdentifier), + declaredViewabilityPercentage: bid.params.viewabilityPercentage ?? null, + detectedViewabilityPercentage + }; + }); +} + +/** + * Get ids from Prebid User ID Modules and add them to the payload + */ +function _handleEids(payload, validBidRequests) { + let bidUserIdAsEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests, '0.userIdAsEids'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidUserIdAsEids) && bidUserIdAsEids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'userIdList', bidUserIdAsEids); + } +} +function hasQueryParams(url) { + try { + const urlObject = new URL(url); + return !!urlObject.search; + } catch (e) { + return false; + } +} +function saveOnAllStorages(name, value, expirationTimeMs) { + const date = new Date(); + date.setTime(date.getTime() + expirationTimeMs); + const expires = `expires=${date.toUTCString()}`; + storage.setCookie(name, JSON.stringify(value), expires); + storage.setDataInLocalStorage(name, JSON.stringify(value)); + cnxIdsValues = value; +} +function readFromAllStorages(name) { + const fromCookie = storage.getCookie(name); + const fromLocalStorage = storage.getDataFromLocalStorage(name); + const parsedCookie = fromCookie ? JSON.parse(fromCookie) : undefined; + const parsedLocalStorage = fromLocalStorage ? JSON.parse(fromLocalStorage) : undefined; + return parsedCookie || parsedLocalStorage || undefined; +} +const spec = { + code: BIDDER_CODE, + gvlid: 143, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + /* + * Validate the bid request. + * If the request is valid, Connatix is trying to obtain at least one bid. + * Otherwise, the request to the Connatix server is not made + */ + isBidRequestValid: function () { + let bid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const bidId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'bidId'); + const mediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes', {}); + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params', {}); + const hasBidId = Boolean(bidId); + const hasMediaTypes = Boolean(mediaTypes) && (Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER]) || Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO])); + const isValidBanner = validateBanner(mediaTypes); + const isValidVideo = validateVideo(mediaTypes); + const isValidViewability = typeof params.viewabilityPercentage === 'undefined' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(params.viewabilityPercentage) && params.viewabilityPercentage >= 0 && params.viewabilityPercentage <= 1; + const hasRequiredBidParams = Boolean(params.placementId); + const isValid = hasBidId && hasMediaTypes && isValidBanner && isValidVideo && hasRequiredBidParams && isValidViewability; + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Invalid bid request: + hasBidId: ${hasBidId}, + hasMediaTypes: ${hasMediaTypes}, + isValidBanner: ${isValidBanner}, + isValidVideo: ${isValidVideo}, + hasRequiredBidParams: ${hasRequiredBidParams}`); + } + return isValid; + }, + /* + * Build the request payload by processing valid bid requests and extracting the necessary information. + * Determine the host and page from the bidderRequest's refferUrl, and include ccpa and gdpr consents. + * Return an object containing the request method, url, and the constructed payload. + */ + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const bidRequests = _getBidRequests(validBidRequests); + let userIds; + try { + userIds = readFromAllStorages(CNX_IDS_LOCAL_STORAGE_COOKIES_KEY) || cnxIdsValues; + } catch (error) { + userIds = cnxIdsValues; + } + const requestPayload = { + ortb2: bidderRequest.ortb2, + gdprConsent: bidderRequest.gdprConsent, + uspConsent: bidderRequest.uspConsent, + gppConsent: bidderRequest.gppConsent, + refererInfo: bidderRequest.refererInfo, + identityProviderData: userIds, + bidRequests + }; + _handleEids(requestPayload, validBidRequests); + context = requestPayload; + return { + method: 'POST', + url: AD_URL, + data: context + }; + }, + /* + * Interpret the server response and create an array of bid responses by extracting and formatting + * relevant information such as requestId, cpm, ttl, width, height, creativeId, referrer and ad + * Returns an array of bid responses by extracting and formatting the server response + */ + interpretResponse: serverResponse => { + const responseBody = serverResponse.body; + const bids = responseBody.Bids; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bids)) { + return []; + } + const referrer = responseBody.Referrer; + return bids.map(bidResponse => ({ + requestId: bidResponse.RequestId, + cpm: bidResponse.Cpm, + ttl: bidResponse.Ttl || DEFAULT_MAX_TTL, + currency: 'USD', + mediaType: bidResponse.VastXml ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, + netRevenue: true, + width: bidResponse.Width, + height: bidResponse.Height, + creativeId: bidResponse.CreativeId, + ad: bidResponse.Ad, + vastXml: bidResponse.VastXml, + referrer: referrer + })); + }, + /* + * Determine the user sync type (either 'iframe' or 'image') based on syncOptions. + * Construct the sync URL by appending required query parameters such as gdpr, ccpa, and coppa consents. + * Return an array containing an object with the sync type and the constructed URL. + */ + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => { + if (!syncOptions.iframeEnabled) { + return []; + } + if (!serverResponses || !serverResponses.length) { + return []; + } + const params = {}; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params['gdpr'] = Number(gdprConsent.gdprApplies); + } else { + params['gdpr'] = 0; + } + if (typeof gdprConsent.consentString === 'string') { + params['gdpr_consent'] = encodeURIComponent(gdprConsent.consentString); + } + } + if (typeof uspConsent === 'string') { + params['us_privacy'] = encodeURIComponent(uspConsent); + } + window.addEventListener('message', function handler(event) { + if (!event.data || event.origin !== 'https://cds.connatix.com' || !event.data.cnx) { + return; + } + const { + message, + data + } = event.data.cnx; + if (message === ALL_PROVIDERS_RESOLVED_EVENT) { + this.removeEventListener('message', handler); + event.stopImmediatePropagation(); + } + if (message === ALL_PROVIDERS_RESOLVED_EVENT || message === IDENTITY_PROVIDER_COLLECTION_UPDATED_EVENT) { + if (data) { + saveOnAllStorages(CNX_IDS_LOCAL_STORAGE_COOKIES_KEY, data, CNX_IDS_EXPIRY); + } + } + }, true); + const syncUrl = serverResponses[0].body.UserSyncEndpoint; + const queryParams = Object.keys(params).length > 0 ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(params) : ''; + let url = syncUrl; + if (queryParams) { + url += hasQueryParams(syncUrl) ? `&${queryParams}` : `?${queryParams}`; + } + return [{ + type: 'iframe', + url + }]; + }, + isConnatix: aliasName => { + if (!aliasName) { + return false; + } + const originalBidderName = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].aliasRegistry[aliasName] || aliasName; + return originalBidderName === BIDDER_CODE; + }, + /** + * Register bidder specific code, which will execute if the server response time is greater than auction timeout + */ + onTimeout: timeoutData => { + const connatixBidRequestTimeout = timeoutData.find(bidderRequest => spec.isConnatix(bidderRequest.bidder)); + + // Log only it is a timeout for Connatix + // Otherwise it is not relevant for us + if (!connatixBidRequestTimeout) { + return; + } + const requestTimeout = connatixBidRequestTimeout.timeout; + const timeout = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(requestTimeout) ? requestTimeout : _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('bidderTimeout'); + spec.triggerEvent({ + type: 'Timeout', + timeout, + context + }); + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + */ + onBidWon(bidWinData) { + if (bidWinData == null) { + return; + } + const { + bidder, + cpm, + requestId, + bidId, + adUnitCode, + timeToRespond, + auctionId + } = bidWinData; + spec.triggerEvent({ + type: 'BidWon', + bestBidBidder: bidder, + bestBidPrice: cpm, + requestId, + bidId, + adUnitCode, + timeToRespond, + auctionId, + context + }); + }, + triggerEvent(data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_8__.ajax)(EVENTS_URL, null, JSON.stringify(data), { + method: 'POST', + withCredentials: false + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('connatixBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","percentInView","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/connatixBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["connectIdSystem"],{ + +/***/ "./modules/connectIdSystem.js": +/*!************************************!*\ + !*** ./modules/connectIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, connectIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds support for Yahoo ConnectID to the user ID module system. + * The {@link module:modules/userId} module is required + * @module modules/connectIdSystem + * @requires module:modules/userId + */ + + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'connectId'; +const STORAGE_EXPIRY_DAYS = 365; +const STORAGE_DURATION = 60 * 60 * 24 * 1000 * STORAGE_EXPIRY_DAYS; +const ID_EXPIRY_DAYS = 14; +const VALID_ID_DURATION = 60 * 60 * 24 * 1000 * ID_EXPIRY_DAYS; +const PUID_EXPIRY_DAYS = 30; +const PUID_EXPIRY = 60 * 60 * 24 * 1000 * PUID_EXPIRY_DAYS; +const VENDOR_ID = 25; +const PLACEHOLDER = '__PIXEL_ID__'; +const UPS_ENDPOINT = `https://ups.analytics.yahoo.com/ups/${PLACEHOLDER}/fed`; +const OVERRIDE_OPT_OUT_KEY = 'connectIdOptOut'; +const INPUT_PARAM_KEYS = ['pixelId', 'he', 'puid']; +const O_AND_O_DOMAINS = ['yahoo.com', 'aol.com', 'aol.ca', 'aol.de', 'aol.co.uk', 'engadget.com', 'techcrunch.com', 'autoblog.com']; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** + * @function + * @param {Object} obj + */ +function storeObject(obj) { + const expires = Date.now() + STORAGE_DURATION; + if (storage.cookiesAreEnabled()) { + setEtldPlusOneCookie(MODULE_NAME, JSON.stringify(obj), new Date(expires), getSiteHostname()); + } + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(MODULE_NAME, JSON.stringify(obj)); + } +} + +/** + * Attempts to store a cookie on eTLD + 1 + * + * @function + * @param {String} key + * @param {String} value + * @param {Date} expirationDate + * @param {String} hostname + */ +function setEtldPlusOneCookie(key, value, expirationDate, hostname) { + const subDomains = hostname.split('.'); + for (let i = 0; i < subDomains.length; ++i) { + const domain = subDomains.slice(subDomains.length - i - 1, subDomains.length).join('.'); + try { + storage.setCookie(key, value, expirationDate.toUTCString(), null, '.' + domain); + const storedCookie = storage.getCookie(key); + if (storedCookie && storedCookie === value) { + break; + } + } catch (error) {} + } +} +function getIdFromCookie() { + if (storage.cookiesAreEnabled()) { + try { + return JSON.parse(storage.getCookie(MODULE_NAME)); + } catch {} + } + return null; +} +function getIdFromLocalStorage() { + if (storage.localStorageIsEnabled()) { + let storedIdData = storage.getDataFromLocalStorage(MODULE_NAME); + if (storedIdData) { + try { + storedIdData = JSON.parse(storedIdData); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME} module: error while reading the local storage data.`); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(storedIdData) && storedIdData.__expires && storedIdData.__expires <= Date.now()) { + storage.removeDataFromLocalStorage(MODULE_NAME); + return null; + } + return storedIdData; + } + } + return null; +} +function syncLocalStorageToCookie() { + if (!storage.cookiesAreEnabled()) { + return; + } + const value = getIdFromLocalStorage(); + const newCookieExpireTime = Date.now() + STORAGE_DURATION; + setEtldPlusOneCookie(MODULE_NAME, JSON.stringify(value), new Date(newCookieExpireTime), getSiteHostname()); +} +function isStale(storedIdData) { + if (isOAndOTraffic()) { + return true; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(storedIdData) && storedIdData.lastSynced) { + const validTTL = storedIdData.ttl || VALID_ID_DURATION; + return storedIdData.lastSynced + validTTL <= Date.now(); + } + return false; +} +function getStoredId() { + let storedId = getIdFromCookie(); + if (!storedId) { + storedId = getIdFromLocalStorage(); + if (storedId && !isStale(storedId)) { + syncLocalStorageToCookie(); + } + } + return storedId; +} +function getSiteHostname() { + const pageInfo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page); + return pageInfo.hostname; +} +function isOAndOTraffic() { + let referer = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().ref; + if (referer) { + referer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(referer).hostname; + const subDomains = referer.split('.'); + referer = subDomains.slice(subDomains.length - 2, subDomains.length).join('.'); + } + return O_AND_O_DOMAINS.indexOf(referer) >= 0; +} + +/** @type {Submodule} */ +const connectIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * @type {Number} + */ + gvlid: VENDOR_ID, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{connectId: string} | undefined} + */ + decode(value) { + if (connectIdSubmodule.userHasOptedOut()) { + return undefined; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(value) && (value.connectId || value.connectid) ? { + connectId: value.connectId || value.connectid + } : undefined; + }, + /** + * Gets the Yahoo ConnectID + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {IdResponse|undefined} + */ + getId(config, consentData) { + if (connectIdSubmodule.userHasOptedOut()) { + return; + } + const params = config.params || {}; + if (!params || typeof params.pixelId === 'undefined' && typeof params.endpoint === 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME} module: configuration requires the 'pixelId'.`); + return; + } + const storedId = getStoredId(); + let shouldResync = isStale(storedId); + if (storedId) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(storedId) && storedId.puid && storedId.lastUsed && !params.puid && storedId.lastUsed + PUID_EXPIRY <= Date.now()) { + delete storedId.puid; + shouldResync = true; + } + if (params.he && params.he !== storedId.he || params.puid && params.puid !== storedId.puid) { + shouldResync = true; + } + if (!shouldResync) { + storedId.lastUsed = Date.now(); + storeObject(storedId); + return { + id: storedId + }; + } + } + const uspString = consentData.usp || ''; + const data = { + v: '1', + '1p': (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)([1, '1', true], params['1p']) ? '1' : '0', + gdpr: connectIdSubmodule.isEUConsentRequired(consentData?.gdpr) ? '1' : '0', + gdpr_consent: connectIdSubmodule.isEUConsentRequired(consentData?.gdpr) ? consentData.gdpr.consentString : '', + us_privacy: uspString + }; + const gppConsent = consentData.gpp; + if (gppConsent) { + data.gpp = `${gppConsent.gppString ? gppConsent.gppString : ''}`; + if (Array.isArray(gppConsent.applicableSections)) { + data.gpp_sid = gppConsent.applicableSections.join(','); + } + } + let topmostLocation = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().topmostLocation; + if (typeof topmostLocation === 'string') { + data.url = topmostLocation.split('?')[0]; + } + INPUT_PARAM_KEYS.forEach(key => { + if (typeof params[key] != 'undefined') { + data[key] = params[key]; + } + }); + const hashedEmail = params.he || storedId?.he; + if (hashedEmail) { + data.he = hashedEmail; + } + if (!data.puid && storedId?.puid) { + data.puid = storedId.puid; + } + const resp = function (callback) { + const callbacks = { + success: response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(responseObj) && Object.keys(responseObj).length > 0 && (!!responseObj.connectId || !!responseObj.connectid)) { + responseObj.he = params.he; + responseObj.puid = params.puid || responseObj.puid; + responseObj.lastSynced = Date.now(); + responseObj.lastUsed = Date.now(); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(responseObj.ttl)) { + let validTTLMiliseconds = responseObj.ttl * 60 * 60 * 1000; + if (validTTLMiliseconds > VALID_ID_DURATION) { + validTTLMiliseconds = VALID_ID_DURATION; + } + responseObj.ttl = validTTLMiliseconds; + } + storeObject(responseObj); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME} module: UPS response returned an invalid payload ${response}`); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + } + callback(responseObj); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME} module: ID fetch encountered an error`, error); + callback(); + } + }; + const endpoint = UPS_ENDPOINT.replace(PLACEHOLDER, params.pixelId); + let url = `${params.endpoint || endpoint}?${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.formatQS)(data)}`; + connectIdSubmodule.getAjaxFn()(url, callbacks, null, { + method: 'GET', + withCredentials: true + }); + }; + const result = { + callback: resp + }; + if (shouldResync && storedId) { + result.id = storedId; + } + return result; + }, + /** + * Utility function that returns a boolean flag indicating if the opportunity + * is subject to GDPR + * @returns {Boolean} + */ + isEUConsentRequired(consentData) { + return !!consentData?.gdprApplies; + }, + /** + * Utility function that returns a boolean flag indicating if the user + * has opted out via the Yahoo easy-opt-out mechanism. + * @returns {Boolean} + */ + userHasOptedOut() { + try { + if (storage.localStorageIsEnabled()) { + return storage.getDataFromLocalStorage(OVERRIDE_OPT_OUT_KEY) === '1'; + } else { + return true; + } + } catch { + return false; + } + }, + /** + * Return the function used to perform XHR calls. + * Utilised for each of testing. + * @returns {Function} + */ + getAjaxFn() { + return _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax; + }, + eids: { + 'connectId': { + source: 'yahoo.com', + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('userId', connectIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('connectIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/connectIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["connectadBidAdapter"],{ + +/***/ "./modules/connectadBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/connectadBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + +const BIDDER_CODE = 'connectad'; +const BIDDER_CODE_ALIAS = 'connectadrealtime'; +const ENDPOINT_URL = 'https://i.connectad.io/api/v2'; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +const spec = { + code: BIDDER_CODE, + gvlid: 138, + aliases: [BIDDER_CODE_ALIAS], + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bid) { + return !!(bid.params.networkId && bid.params.siteId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + let ret = { + method: 'POST', + url: '', + data: '', + bidRequest: [] + }; + if (validBidRequests.length < 1) { + return ret; + } + const sellerDefinedAudience = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.user.data', _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getAnyConfig('ortb2.user.data')); + const sellerDefinedContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.site.content.data', _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getAnyConfig('ortb2.site.content.data')); + const data = Object.assign({ + placements: [], + time: Date.now(), + url: bidderRequest.refererInfo?.page, + referrer: bidderRequest.refererInfo?.ref, + screensize: getScreenSize(), + dnt: navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1' ? 1 : 0, + language: navigator.language, + ua: navigator.userAgent, + pversion: "9.45.0-pre", + cur: 'USD', + user: {}, + regs: {}, + source: {}, + site: {}, + sda: sellerDefinedAudience, + sdc: sellerDefinedContext + }); + const ortb2Params = bidderRequest?.ortb2 || {}; + ['site', 'user', 'device', 'bcat', 'badv', 'regs'].forEach(entry => { + const ortb2Param = ortb2Params[entry]; + if (ortb2Param) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(data, { + [entry]: ortb2Param + }); + } + }); + + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.coppa', 1); + } + + // adding schain object + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'source.ext.schain', validBidRequests[0].schain); + } + + // Attaching GDPR Consent Params + if (bidderRequest.gdprConsent) { + let gdprApplies; + if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { + gdprApplies = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.gdpr', gdprApplies); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + + // CCPA + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.us_privacy', bidderRequest.uspConsent); + } + + // GPP Support + if (bidderRequest?.gppConsent?.gppString) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections); + } else if (bidderRequest?.ortb2?.regs?.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.gpp', bidderRequest.ortb2.regs.gpp); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid); + } + + // DSA Support + if (bidderRequest?.ortb2?.regs?.ext?.dsa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.ext.dsa', bidderRequest.ortb2.regs.ext.dsa); + } + + // EIDS Support + if (validBidRequests[0].userIdAsEids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.eids', validBidRequests[0].userIdAsEids); + } + const tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.source.tid'); + if (tid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'source.tid', tid); + } + data.tmax = bidderRequest.timeout; + validBidRequests.map(bid => { + const placement = Object.assign({ + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(), + divName: bid.bidId, + tagId: bid.adUnitCode, + pisze: bid.mediaTypes.banner.sizes[0] || bid.sizes[0], + sizes: bid.mediaTypes.banner.sizes, + bidfloor: getBidFloor(bid), + siteId: bid.params.siteId, + networkId: bid.params.networkId, + tid: bid.ortb2Imp?.ext?.tid + }); + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + placement.gpid = gpid; + } + if (placement.networkId && placement.siteId) { + data.placements.push(placement); + } + }); + ret.data = JSON.stringify(data); + ret.bidRequest = validBidRequests; + ret.url = ENDPOINT_URL; + return ret; + }, + interpretResponse: function (serverResponse, bidRequest, bidderRequest) { + let bid; + let bids; + let bidId; + let bidObj; + let bidResponses = []; + bids = bidRequest.bidRequest; + serverResponse = (serverResponse || {}).body; + for (let i = 0; i < bids.length; i++) { + bid = {}; + bidObj = bids[i]; + bidId = bidObj.bidId; + if (serverResponse) { + const decision = serverResponse.decisions && serverResponse.decisions[bidId]; + const price = decision && decision.pricing && decision.pricing.clearPrice; + if (decision && price) { + bid.requestId = bidId; + bid.cpm = price; + bid.width = decision.width; + bid.height = decision.height; + bid.dealid = decision.dealid || null; + bid.meta = { + advertiserDomains: decision && decision.adomain ? decision.adomain : [] + }; + bid.ad = retrieveAd(decision); + bid.currency = 'USD'; + bid.creativeId = decision.adId; + bid.ttl = 360; + bid.netRevenue = true; + if (decision.dsa) { + bid.meta = Object.assign({}, bid.meta, { + dsa: decision.dsa + }); + } + if (decision.category) { + bid.meta = Object.assign({}, bid.meta, { + primaryCatId: decision.category + }); + } + bidResponses.push(bid); + } + } + } + return bidResponses; + }, + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent, gppConsent) => { + let pixelType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let syncEndpoint; + if (pixelType == 'iframe') { + syncEndpoint = 'https://sync.connectad.io/iFrameSyncer?'; + } else { + syncEndpoint = 'https://sync.connectad.io/ImageSyncer?'; + } + if (gdprConsent) { + syncEndpoint = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(syncEndpoint, 'gdpr', gdprConsent.gdprApplies ? 1 : 0); + } + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + syncEndpoint = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(syncEndpoint, 'gdpr_consent', gdprConsent.consentString); + } + if (uspConsent) { + syncEndpoint = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(syncEndpoint, 'us_privacy', uspConsent); + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + syncEndpoint = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(syncEndpoint, 'gpp', gppConsent.gppString); + syncEndpoint = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(syncEndpoint, 'gpp_sid', gppConsent?.applicableSections?.join(',')); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + syncEndpoint = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(syncEndpoint, 'coppa', 1); + } + if (syncOptions.iframeEnabled || syncOptions.pixelEnabled) { + return [{ + type: pixelType, + url: syncEndpoint + }]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Bidder ConnectAd: No User-Matching allowed'); + } + } +}; +function getBidFloor(bidRequest) { + let floorInfo = {}; + if (typeof bidRequest.getFloor === 'function') { + floorInfo = bidRequest.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '*' + }); + } + let floor = floorInfo?.floor || bidRequest.params.bidfloor || bidRequest.params.floorprice || 0; + return floor; +} +function retrieveAd(decision) { + return decision.contents && decision.contents[0] && decision.contents[0].body; +} +function getScreenSize() { + return [window.screen.width, window.screen.height].join('x'); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('connectadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/connectadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["consentManagementGpp"],{ + +/***/ "./modules/consentManagementGpp.js": +/*!*****************************************!*\ + !*** ./modules/consentManagementGpp.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports consentConfig, GPPClient, toConsentData, resetConsentData, setConsentConfig, enrichFPDHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/fpd/enrichment.js */ "./src/fpd/enrichment.js"); +/* harmony import */ var _libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/cmp/cmpClient.js */ "./libraries/cmp/cmpClient.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _libraries_consentManagement_cmUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/consentManagement/cmUtils.js */ "./libraries/consentManagement/cmUtils.js"); + +/** + * This module adds GPP consentManagement support to prebid.js. It interacts with + * supported CMPs (Consent Management Platforms) to grab the user's consent information + * and make it available for any GPP supported adapters to read/pass this information to + * their system and for various other features/modules in Prebid.js. + */ + + + + + + + +let consentConfig = {}; +class GPPError { + constructor(message, arg) { + this.message = message; + this.args = arg == null ? [] : [arg]; + } +} +class GPPClient { + apiVersion = '1.1'; + static INST; + static get() { + let mkCmp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_0__.cmpClient; + if (this.INST == null) { + const cmp = mkCmp({ + apiName: '__gpp', + apiArgs: ['command', 'callback', 'parameter'], + // do not pass version - not clear what it's for (or what we should use), + mode: _libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_0__.MODE_CALLBACK + }); + if (cmp == null) { + throw new GPPError('GPP CMP not found'); + } + this.INST = new this(cmp); + } + return this.INST; + } + #resolve; + #reject; + #pending = []; + initialized = false; + constructor(cmp) { + this.cmp = cmp; + [this.#resolve, this.#reject] = ['resolve', 'reject'].map(slot => result => { + while (this.#pending.length) { + this.#pending.pop()[slot](result); + } + }); + } + + /** + * initialize this client - update consent data if already available, + * and set up event listeners to also update on CMP changes + * + * @param pingData + * @returns {Promise<{}>} a promise to GPP consent data + */ + init(pingData) { + const ready = this.updateWhenReady(pingData); + if (!this.initialized) { + if (pingData.gppVersion !== this.apiVersion) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Unrecognized GPP CMP version: ${pingData.apiVersion}. Continuing using GPP API version ${this.apiVersion}...`); + } + this.initialized = true; + this.cmp({ + command: 'addEventListener', + callback: (event, success) => { + if (success != null && !success) { + this.#reject(new GPPError('Received error response from CMP', event)); + } else if (event?.pingData?.cmpStatus === 'error') { + this.#reject(new GPPError('CMP status is "error"; please check CMP setup', event)); + } else if (this.isCMPReady(event?.pingData || {}) && ['sectionChange', 'signalStatus'].includes(event?.eventName)) { + this.#resolve(this.updateConsent(event.pingData)); + } + // NOTE: according to https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md, + // > [signalStatus] Event is called whenever the display status of the CMP changes (e.g. the CMP shows the consent layer). + // + // however, from real world testing, at least some CMPs only trigger 'cmpDisplayStatus' + // other CMPs may do something else yet; here we just look for 'signalStatus: not ready' on any event + // to decide if consent data is likely to change + if (_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData() != null && event?.pingData != null && !this.isCMPReady(event.pingData)) { + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.setConsentData(null); + } + } + }); + } + return ready; + } + refresh() { + return this.cmp({ + command: 'ping' + }).then(this.init.bind(this)); + } + + /** + * Retrieve and store GPP consent data. + * + * @param pingData + * @returns {Promise<{}>} a promise to GPP consent data + */ + updateConsent(pingData) { + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_3__.PbPromise(resolve => { + if (pingData == null || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(pingData)) { + throw new GPPError('Received empty response from CMP', pingData); + } + const consentData = parseConsentData(pingData); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Retrieved GPP consent from CMP:', consentData); + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.setConsentData(consentData); + resolve(consentData); + }); + } + + /** + * Return a promise to GPP consent data, to be retrieved the next time the CMP signals it's ready. + * + * @returns {Promise<{}>} + */ + nextUpdate() { + const def = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_3__.defer)(); + this.#pending.push(def); + return def.promise; + } + + /** + * Return a promise to GPP consent data, to be retrieved immediately if the CMP is ready according to `pingData`, + * or as soon as it signals that it's ready otherwise. + * + * @param pingData + * @returns {Promise<{}>} + */ + updateWhenReady(pingData) { + return this.isCMPReady(pingData) ? this.updateConsent(pingData) : this.nextUpdate(); + } + isCMPReady(pingData) { + return pingData.signalStatus === 'ready'; + } +} +function lookupIabConsent() { + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_3__.PbPromise(resolve => resolve(GPPClient.get().refresh())); +} + +// add new CMPs here, with their dedicated lookup function +const cmpCallMap = { + 'iab': lookupIabConsent +}; +function parseConsentData(cmpData) { + if (cmpData?.applicableSections != null && !Array.isArray(cmpData.applicableSections) || cmpData?.gppString != null && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(cmpData.gppString) || cmpData?.parsedSections != null && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(cmpData.parsedSections)) { + throw new GPPError('CMP returned unexpected value during lookup process.', cmpData); + } + ['usnatv1', 'uscav1'].forEach(section => { + if (cmpData?.parsedSections?.[section]) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Received invalid section from cmp: '${section}'. Some functionality may not work as expected`, cmpData); + } + }); + return toConsentData(cmpData); +} +function toConsentData() { + let gppData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return { + gppString: gppData?.gppString, + applicableSections: gppData?.applicableSections || [], + parsedSections: gppData?.parsedSections || {}, + gppData: gppData + }; +} + +/** + * Simply resets the module's consentData variable back to undefined, mainly for testing purposes + */ +function resetConsentData() { + consentConfig = {}; + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.reset(); + GPPClient.INST = null; +} +const parseConfig = (0,_libraries_consentManagement_cmUtils_js__WEBPACK_IMPORTED_MODULE_4__.configParser)({ + namespace: 'gpp', + displayName: 'GPP', + consentDataHandler: _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler, + parseConsentData, + getNullConsent: () => toConsentData(null), + cmpHandlers: cmpCallMap +}); +function setConsentConfig(config) { + consentConfig = parseConfig(config); + return consentConfig.loadConsentData?.()?.catch?.(() => null); +} +_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('consentManagement', config => setConsentConfig(config.consentManagement)); +function enrichFPDHook(next, fpd) { + return next(fpd.then(ortb2 => { + const consent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData(); + if (consent) { + if (Array.isArray(consent.applicableSections)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(ortb2, 'regs.gpp_sid', consent.applicableSections); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(ortb2, 'regs.gpp', consent.gppString); + } + return ortb2; + })); +} +_src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_7__.enrichFPD.before(enrichFPDHook); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('consentManagementGpp'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["cmp","consentManagement","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/consentManagementGpp.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["consentManagementTcf"],{ + +/***/ "./modules/consentManagementTcf.js": +/*!*****************************************!*\ + !*** ./modules/consentManagementTcf.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports consentConfig, gdprScope, resetConsentData, setConsentConfig, enrichFPDHook, setOrtbAdditionalConsent */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/fpd/enrichment.js */ "./src/fpd/enrichment.js"); +/* harmony import */ var _libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/cmp/cmpClient.js */ "./libraries/cmp/cmpClient.js"); +/* harmony import */ var _libraries_consentManagement_cmUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/consentManagement/cmUtils.js */ "./libraries/consentManagement/cmUtils.js"); + +/** + * This module adds GDPR consentManagement support to prebid.js. It interacts with + * supported CMPs (Consent Management Platforms) to grab the user's consent information + * and make it available for any GDPR supported adapters to read/pass this information to + * their system. + */ + + + + + + + +let consentConfig = {}; +let gdprScope; +let dsaPlatform; +const CMP_VERSION = 2; + +// add new CMPs here, with their dedicated lookup function +const cmpCallMap = { + 'iab': lookupIabConsent +}; + +/** + * This function handles interacting with an IAB compliant CMP to obtain the consent information of the user. + */ +function lookupIabConsent(setProvisionalConsent) { + return new Promise((resolve, reject) => { + function cmpResponseCallback(tcfData, success) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Received a response from CMP', tcfData); + if (success) { + try { + setProvisionalConsent(parseConsentData(tcfData)); + } catch (e) {} + if (tcfData.gdprApplies === false || tcfData.eventStatus === 'tcloaded' || tcfData.eventStatus === 'useractioncomplete') { + try { + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__.gdprDataHandler.setConsentData(parseConsentData(tcfData)); + resolve(); + } catch (e) { + reject(e); + } + } + } else { + reject(Error('CMP unable to register callback function. Please check CMP setup.')); + } + } + const cmp = (0,_libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_2__.cmpClient)({ + apiName: '__tcfapi', + apiVersion: CMP_VERSION, + apiArgs: ['command', 'version', 'callback', 'parameter'] + }); + if (!cmp) { + reject(new Error('TCF2 CMP not found.')); + } + if (cmp.isDirect) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Detected CMP API is directly accessible, calling it now...'); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Detected CMP is outside the current iframe where Prebid.js is located, calling it now...'); + } + cmp({ + command: 'addEventListener', + callback: cmpResponseCallback + }); + }); +} +function parseConsentData(consentObject) { + function checkData() { + // if CMP does not respond with a gdprApplies boolean, use defaultGdprScope (gdprScope) + const gdprApplies = consentObject && typeof consentObject.gdprApplies === 'boolean' ? consentObject.gdprApplies : gdprScope; + const tcString = consentObject && consentObject.tcString; + return !!(typeof gdprApplies !== 'boolean' || gdprApplies === true && (!tcString || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(tcString))); + } + if (checkData()) { + throw Object.assign(new Error(`CMP returned unexpected value during lookup process.`), { + args: [consentObject] + }); + } else { + return toConsentData(consentObject); + } +} +function toConsentData(cmpConsentObject) { + const consentData = { + consentString: cmpConsentObject ? cmpConsentObject.tcString : undefined, + vendorData: cmpConsentObject || undefined, + gdprApplies: cmpConsentObject && typeof cmpConsentObject.gdprApplies === 'boolean' ? cmpConsentObject.gdprApplies : gdprScope + }; + if (cmpConsentObject && cmpConsentObject.addtlConsent && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(cmpConsentObject.addtlConsent)) { + consentData.addtlConsent = cmpConsentObject.addtlConsent; + } + consentData.apiVersion = CMP_VERSION; + return consentData; +} + +/** + * Simply resets the module's consentData variable back to undefined, mainly for testing purposes + */ +function resetConsentData() { + consentConfig = {}; + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__.gdprDataHandler.reset(); +} +const parseConfig = (0,_libraries_consentManagement_cmUtils_js__WEBPACK_IMPORTED_MODULE_3__.configParser)({ + namespace: 'gdpr', + displayName: 'TCF', + consentDataHandler: _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__.gdprDataHandler, + cmpHandlers: cmpCallMap, + parseConsentData, + getNullConsent: () => toConsentData(null) +}); +/** + * A configuration function that initializes some module variables, as well as add a hook into the requestBids function + * @param {{cmp:string, timeout:number, defaultGdprScope:boolean}} config required; consentManagement module config settings; cmp (string), timeout (int)) + */ +function setConsentConfig(config) { + // if `config.gdpr`, `config.usp` or `config.gpp` exist, assume new config format. + // else for backward compatability, just use `config` + config = config && (config.gdpr || config.usp || config.gpp ? config.gdpr : config); + if (config?.consentData?.getTCData != null) { + config.consentData = config.consentData.getTCData; + } + gdprScope = config?.defaultGdprScope === true; + dsaPlatform = !!config?.dsaPlatform; + consentConfig = parseConfig({ + gdpr: config + }); + return consentConfig.loadConsentData?.()?.catch?.(() => null); +} +_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('consentManagement', config => setConsentConfig(config.consentManagement)); +function enrichFPDHook(next, fpd) { + return next(fpd.then(ortb2 => { + const consent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__.gdprDataHandler.getConsentData(); + if (consent) { + if (typeof consent.gdprApplies === 'boolean') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortb2, 'regs.ext.gdpr', consent.gdprApplies ? 1 : 0); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortb2, 'user.ext.consent', consent.consentString); + } + if (dsaPlatform) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortb2, 'regs.ext.dsa.dsarequired', 3); + } + return ortb2; + })); +} +_src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_6__.enrichFPD.before(enrichFPDHook); +function setOrtbAdditionalConsent(ortbRequest, bidderRequest) { + // this is not a standardized name for addtlConsent, so keep this as an ORTB library processor rather than an FPD enrichment + const addtl = bidderRequest.gdprConsent?.addtlConsent; + if (addtl && typeof addtl === 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortbRequest, 'user.ext.ConsentedProvidersSettings.consented_providers', addtl); + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_7__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_7__.REQUEST, + name: 'gdprAddtlConsent', + fn: setOrtbAdditionalConsent +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('consentManagementTcf'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","cmp","consentManagement","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/consentManagementTcf.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["consentManagementUsp"],{ + +/***/ "./modules/consentManagementUsp.js": +/*!*****************************************!*\ + !*** ./modules/consentManagementUsp.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports consentAPI, consentTimeout, staticConsentData, requestBidsHook, resetConsentData, setConsentConfig, enrichFPDHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/fpd/enrichment.js */ "./src/fpd/enrichment.js"); +/* harmony import */ var _libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/cmp/cmpClient.js */ "./libraries/cmp/cmpClient.js"); + +/** + * This module adds USPAPI (CCPA) consentManagement support to prebid.js. It + * interacts with supported USP Consent APIs to grab the user's consent + * information and make it available for any USP (CCPA) supported adapters to + * read/pass this information to their system. + */ + + + + + + + +const DEFAULT_CONSENT_API = 'iab'; +const DEFAULT_CONSENT_TIMEOUT = 50; +const USPAPI_VERSION = 1; +let consentAPI = DEFAULT_CONSENT_API; +let consentTimeout = DEFAULT_CONSENT_TIMEOUT; +let staticConsentData; +let consentData; +let enabled = false; + +// consent APIs +const uspCallMap = { + 'iab': lookupUspConsent, + 'static': lookupStaticConsentData +}; + +/** + * This function reads the consent string from the config to obtain the consent information of the user. + */ +function lookupStaticConsentData(_ref) { + let { + onSuccess, + onError + } = _ref; + processUspData(staticConsentData, { + onSuccess, + onError + }); +} + +/** + * This function handles interacting with an USP compliant consent manager to obtain the consent information of the user. + * Given the async nature of the USP's API, we pass in acting success/error callback functions to exit this function + * based on the appropriate result. + */ +function lookupUspConsent(_ref2) { + let { + onSuccess, + onError + } = _ref2; + function handleUspApiResponseCallbacks() { + const uspResponse = {}; + function afterEach() { + if (uspResponse.usPrivacy) { + processUspData(uspResponse, { + onSuccess, + onError + }); + } else { + onError('Unable to get USP consent string.'); + } + } + return { + consentDataCallback: (consentResponse, success) => { + if (success && consentResponse.uspString) { + uspResponse.usPrivacy = consentResponse.uspString; + } + afterEach(); + } + }; + } + let callbackHandler = handleUspApiResponseCallbacks(); + const cmp = (0,_libraries_cmp_cmpClient_js__WEBPACK_IMPORTED_MODULE_0__.cmpClient)({ + apiName: '__uspapi', + apiVersion: USPAPI_VERSION, + apiArgs: ['command', 'version', 'callback'] + }); + if (!cmp) { + return onError('USP CMP not found.'); + } + if (cmp.isDirect) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Detected USP CMP is directly accessible, calling it now...'); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Detected USP CMP is outside the current iframe where Prebid.js is located, calling it now...'); + } + cmp({ + command: 'getUSPData', + callback: callbackHandler.consentDataCallback + }); + cmp({ + command: 'registerDeletion', + callback: (res, success) => (success == null || success) && _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].callDataDeletionRequest(res) + }).catch(e => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error invoking CMP `registerDeletion`:', e); + }); +} + +/** + * Lookup consent data and store it in the `consentData` global as well as `adapterManager.js`' uspDataHanlder. + * + * @param cb a callback that takes an error message and extra error arguments; all args will be undefined if consent + * data was retrieved successfully. + */ +function loadConsentData(cb) { + let timer = null; + let isDone = false; + function done(consentData, errMsg) { + if (timer != null) { + clearTimeout(timer); + } + isDone = true; + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.uspDataHandler.setConsentData(consentData); + if (cb != null) { + for (var _len = arguments.length, extraArgs = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + extraArgs[_key - 2] = arguments[_key]; + } + cb(errMsg, ...extraArgs); + } + } + if (!uspCallMap[consentAPI]) { + done(null, `USP framework (${consentAPI}) is not a supported framework. Aborting consentManagement module and resuming auction.`); + return; + } + const callbacks = { + onSuccess: done, + onError: function (errMsg) { + for (var _len2 = arguments.length, extraArgs = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + extraArgs[_key2 - 1] = arguments[_key2]; + } + done(null, `${errMsg} Resuming auction without consent data as per consentManagement config.`, ...extraArgs); + } + }; + uspCallMap[consentAPI](callbacks); + if (!isDone) { + if (consentTimeout === 0) { + processUspData(undefined, callbacks); + } else { + timer = setTimeout(callbacks.onError.bind(null, 'USPAPI workflow exceeded timeout threshold.'), consentTimeout); + } + } +} + +/** + * If consentManagementUSP module is enabled (ie included in setConfig), this hook function will attempt to fetch the + * user's encoded consent string from the supported USPAPI. Once obtained, the module will store this + * data as part of a uspConsent object which gets transferred to adapterManager's uspDataHandler object. + * This information is later added into the bidRequest object for any supported adapters to read/pass along to their system. + * @param {object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + * @param {function} fn required; The next function in the chain, used by hook.js + */ +const requestBidsHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_4__.timedAuctionHook)('usp', function requestBidsHook(fn, reqBidsConfigObj) { + var _this = this; + if (!enabled) { + enableConsentManagement(); + } + loadConsentData(function (errMsg) { + if (errMsg != null) { + for (var _len3 = arguments.length, extraArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + extraArgs[_key3 - 1] = arguments[_key3]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(errMsg, ...extraArgs); + } + fn.call(_this, reqBidsConfigObj); + }); +}); + +/** + * This function checks the consent data provided by USPAPI to ensure it's in an expected state. + * If it's bad, we exit the module depending on config settings. + * If it's good, then we store the value and exit the module. + * + * @param {Object} consentObject - The object returned by USPAPI that contains the user's consent choices. + * @param {Object} callbacks - An object containing the callback functions. + * @param {function(string): void} callbacks.onSuccess - Callback accepting the resolved USP consent string. + * @param {function(string, ...Object?): void} callbacks.onError - Callback accepting an error message and any extra error arguments (used purely for logging). + */ +function processUspData(consentObject, _ref3) { + let { + onSuccess, + onError + } = _ref3; + const valid = !!(consentObject && consentObject.usPrivacy); + if (!valid) { + onError(`USPAPI returned unexpected value during lookup process.`, consentObject); + return; + } + storeUspConsentData(consentObject); + onSuccess(consentData); +} + +/** + * Stores USP data locally in module and then invokes uspDataHandler.setConsentData() to make information available in adaptermanger.js for later in the auction + * @param {object} consentObject required; an object representing user's consent choices (can be undefined in certain use-cases for this function only) + */ +function storeUspConsentData(consentObject) { + if (consentObject && consentObject.usPrivacy) { + consentData = consentObject.usPrivacy; + } +} + +/** + * Simply resets the module's consentData variable back to undefined, mainly for testing purposes + */ +function resetConsentData() { + consentData = undefined; + consentAPI = undefined; + consentTimeout = undefined; + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.uspDataHandler.reset(); + enabled = false; +} + +/** + * A configuration function that initializes some module variables, as well as add a hook into the requestBids function + * @param {object} config required; consentManagementUSP module config settings; usp (string), timeout (int) + */ +function setConsentConfig(config) { + config = config && config.usp; + if (!config || typeof config !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('consentManagement.usp config not defined, using defaults'); + } + if (config && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(config.cmpApi)) { + consentAPI = config.cmpApi; + } else { + consentAPI = DEFAULT_CONSENT_API; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`consentManagement.usp config did not specify cmpApi. Using system default setting (${DEFAULT_CONSENT_API}).`); + } + if (config && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(config.timeout)) { + consentTimeout = config.timeout; + } else { + consentTimeout = DEFAULT_CONSENT_TIMEOUT; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`consentManagement.usp config did not specify timeout. Using system default setting (${DEFAULT_CONSENT_TIMEOUT}).`); + } + if (consentAPI === 'static') { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(config.consentData) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(config.consentData.getUSPData)) { + if (config.consentData.getUSPData.uspString) staticConsentData = { + usPrivacy: config.consentData.getUSPData.uspString + }; + consentTimeout = 0; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`consentManagement config with cmpApi: 'static' did not specify consentData. No consents will be available to adapters.`); + } + } + enableConsentManagement(true); +} +function enableConsentManagement() { + let configFromUser = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (!enabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`USPAPI consentManagement module has been activated${configFromUser ? '' : ` using default values (api: '${consentAPI}', timeout: ${consentTimeout}ms)`}`); + enabled = true; + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.uspDataHandler.enable(); + } + loadConsentData(); // immediately look up consent data to make it available without requiring an auction +} +_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('consentManagement', config => setConsentConfig(config.consentManagement)); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('requestBids').before(requestBidsHook, 50); +function enrichFPDHook(next, fpd) { + return next(fpd.then(ortb2 => { + const consent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.uspDataHandler.getConsentData(); + if (consent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(ortb2, 'regs.ext.us_privacy', consent); + } + return ortb2; + })); +} +_src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_8__.enrichFPD.before(enrichFPDHook); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('consentManagementUsp'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["cmp","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/consentManagementUsp.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["consumableBidAdapter"],{ + +/***/ "./modules/consumableBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/consumableBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'consumable'; +const BASE_URI = 'https://e.serverbid.com/api/v2'; +let siteId = 0; +let bidder = 'consumable'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.networkId && bid.params.siteId && bid.params.unitId && bid.params.unitName); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests An array of bids + * @param {Object} bidderRequest The bidder's request info. + * @return ServerRequest Info describing the request to the server. + */ + + buildRequests: function (validBidRequests, bidderRequest) { + let ret = { + method: 'POST', + url: '', + data: '', + bidRequest: [] + }; + if (validBidRequests.length < 1) { + return ret; + } + + // These variables are used in creating the user sync URL. + siteId = validBidRequests[0].params.siteId; + bidder = validBidRequests[0].bidder; + const data = Object.assign({ + placements: [], + time: Date.now(), + url: bidderRequest.refererInfo.page, + referrer: bidderRequest.refererInfo.ref, + source: [{ + 'name': 'prebidjs', + 'version': "9.45.0-pre" + }], + lang: bidderRequest.ortb2.device.language + }, validBidRequests[0].params); + if (bidderRequest && bidderRequest.gdprConsent) { + data.gdpr = { + consent: bidderRequest.gdprConsent.consentString, + applies: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : true + }; + } + if (bidderRequest && bidderRequest.gppConsent && bidderRequest.gppConsent.gppString) { + data.gpp = bidderRequest.gppConsent.gppString; + data.gpp_sid = bidderRequest.gppConsent.applicableSections; + } + if (bidderRequest && bidderRequest.uspConsent) { + data.ccpa = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.schain) { + data.schain = bidderRequest.schain; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('coppa')) { + data.coppa = true; + } + validBidRequests.map(bid => { + const sizes = bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes || bid.sizes || []; + const placement = Object.assign({ + divName: bid.bidId, + adTypes: bid.adTypes || getSize(sizes) + }, bid.params); + placement.bidfloor = getBidFloor(bid, sizes); + if (bid.mediaTypes.video && bid.mediaTypes.video.playerSize) { + placement.video = bid.mediaTypes.video; + } + if (placement.networkId && placement.siteId && placement.unitId && placement.unitName) { + data.placements.push(placement); + } + }); + handleEids(data, validBidRequests); + ret.data = JSON.stringify(data); + ret.bidRequest = validBidRequests; + ret.bidderRequest = bidderRequest; + ret.url = BASE_URI; + return ret; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bid; + let bids; + let bidId; + let bidObj; + let bidResponses = []; + bids = bidRequest.bidRequest; + serverResponse = (serverResponse || {}).body; + for (let i = 0; i < bids.length; i++) { + bid = {}; + bidObj = bids[i]; + bidId = bidObj.bidId; + if (serverResponse) { + const decision = serverResponse.decisions && serverResponse.decisions[bidId]; + const price = decision && decision.pricing && decision.pricing.clearPrice; + if (decision && price) { + bid.requestId = bidId; + bid.cpm = price; + bid.width = decision.width; + bid.height = decision.height; + bid.unitId = bidObj.params.unitId; + bid.unitName = bidObj.params.unitName; + bid.ad = retrieveAd(decision, bid.unitId, bid.unitName); + bid.currency = 'USD'; + bid.creativeId = decision.adId; + bid.ttl = 30; + bid.netRevenue = true; + bid.referrer = bidRequest.bidderRequest.refererInfo.page; + bid.meta = { + advertiserDomains: decision.adomain || [] + }; + if (decision.cats) { + if (decision.cats.length > 0) { + bid.meta.primaryCatId = decision.cats[0]; + if (decision.cats.length > 1) { + bid.meta.secondaryCatIds = decision.cats.slice(1); + } + } + } + if (decision.networkId) { + bid.meta.networkId = decision.networkId; + } + if (decision.mediaType) { + bid.meta.mediaType = decision.mediaType; + if (decision.mediaType === 'video') { + bid.mediaType = 'video'; + bid.vastUrl = decision.vastUrl || undefined; + bid.vastXml = decision.vastXml || undefined; + bid.videoCacheKey = decision.uuid || undefined; + } + } + bidResponses.push(bid); + } + } + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + let syncUrl = 'https://sync.serverbid.com/ss/' + siteId + '.html'; + if (syncOptions.iframeEnabled) { + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + syncUrl = appendUrlParam(syncUrl, `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${encodeURIComponent(gdprConsent.consentString) || ''}`); + } else { + syncUrl = appendUrlParam(syncUrl, `gdpr=0&gdpr_consent=${encodeURIComponent(gdprConsent.consentString) || ''}`); + } + } + if (gppConsent && gppConsent.gppString) { + syncUrl = appendUrlParam(syncUrl, `gpp=${encodeURIComponent(gppConsent.gppString)}`); + if (gppConsent.applicableSections && gppConsent.applicableSections.length > 0) { + syncUrl = appendUrlParam(syncUrl, `gpp_sid=${encodeURIComponent(gppConsent.applicableSections.join(','))}`); + } + } + if (uspConsent) { + syncUrl = appendUrlParam(syncUrl, `us_privacy=${encodeURIComponent(uspConsent)}`); + } + if (!serverResponses || serverResponses.length === 0 || !serverResponses[0].body.bdr || serverResponses[0].body.bdr !== 'cx') { + return [{ + type: 'iframe', + url: syncUrl + }]; + } + } + if (syncOptions.pixelEnabled && serverResponses && serverResponses.length > 0) { + return serverResponses[0].body.pixels; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(bidder + ': Please enable iframe based user syncing.'); + } + } +}; +const sizeMap = [null, '120x90', '120x90', '468x60', '728x90', '300x250', '160x600', '120x600', '300x100', '180x150', '336x280', '240x400', '234x60', '88x31', '120x60', '120x240', '125x125', '220x250', '250x250', '250x90', '0x0', '200x90', '300x50', '320x50', '320x480', '185x185', '620x45', '300x125', '800x250']; +sizeMap[77] = '970x90'; +sizeMap[123] = '970x250'; +sizeMap[43] = '300x600'; +sizeMap[286] = '970x66'; +sizeMap[3230] = '970x280'; +sizeMap[429] = '486x60'; +sizeMap[374] = '700x500'; +sizeMap[934] = '300x1050'; +sizeMap[1578] = '320x100'; +sizeMap[331] = '320x250'; +sizeMap[3301] = '320x267'; +sizeMap[2730] = '728x250'; +function getSize(sizes) { + const result = []; + sizes.forEach(function (size) { + const index = sizeMap.indexOf(size[0] + 'x' + size[1]); + if (index >= 0) { + result.push(index); + } + }); + return result; +} +function retrieveAd(decision, unitId, unitName) { + let ad; + if (decision.contents && decision.contents[0]) { + ad = decision.contents[0].body; + } + if (decision.vastXml) { + ad = decision.vastXml; + } + return ad; +} +function handleEids(data, validBidRequests) { + let bidUserIdAsEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests, '0.userIdAsEids'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidUserIdAsEids) && bidUserIdAsEids.length > 0) { + bidUserIdAsEids = bidUserIdAsEids.filter(e => typeof e === 'object'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.eids', bidUserIdAsEids); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.eids', undefined); + } +} +function getBidFloor(bid, sizes) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bid.getFloor)) { + return bid.params.bidFloor ? bid.params.bidFloor : null; + } + let floor; + let floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: bid.mediaTypes.video ? 'video' : 'banner', + size: sizes.length === 1 ? sizes[0] : '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = parseFloat(floorInfo.floor); + } + return floor; +} +function appendUrlParam(url, queryString) { + return `${url}${url.indexOf('?') > -1 ? '&' : '?'}${queryString}`; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('consumableBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/consumableBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["contentexchangeBidAdapter"],{ + +/***/ "./modules/contentexchangeBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/contentexchangeBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'contentexchange'; +const AD_URL = 'https://eu2.adnetwork.agency/pbjs'; +const SYNC_URL = 'https://sync2.adnetwork.agency'; +const GVLID = 864; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('contentexchangeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/contentexchangeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["contxtfulBidAdapter"],{ + +/***/ "./modules/contxtfulBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/contxtfulBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + + + +// Constants +const BIDDER_CODE = 'contxtful'; +const BIDDER_ENDPOINT = 'prebid.receptivity.io'; +const MONITORING_ENDPOINT = 'monitoring.receptivity.io'; +const DEFAULT_NET_REVENUE = true; +const DEFAULT_TTL = 300; +const DEFAULT_SAMPLING_RATE = 1.0; +const PREBID_VERSION = "9.45.0-pre"; + +// ORTB conversion +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_TTL + }, + imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const reqData = buildRequest(imps, bidderRequest, context); + return reqData; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + return bidResponse; + } +}); + +// Get Bid Floor +const _getRequestBidFloor = (mediaTypes, paramsBidFloor, bid) => { + const bidMediaType = Object.keys(mediaTypes)[0] || 'banner'; + const bidFloor = { + floor: 0, + currency: 'USD' + }; + if (typeof bid.getFloor === 'function') { + const { + currency, + floor + } = bid.getFloor({ + mediaType: bidMediaType, + size: '*' + }); + floor && (bidFloor.floor = floor); + currency && (bidFloor.currency = currency); + } else if (paramsBidFloor) { + bidFloor.floor = paramsBidFloor; + } + return bidFloor; +}; + +// Get Parameters from the config. +const extractParameters = config => { + const version = config?.contxtful?.version; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(version) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr)(version)) { + throw Error(`contxfulBidAdapter: contxtful.version should be a non-empty string`); + } + const customer = config?.contxtful?.customer; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(customer) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr)(customer)) { + throw Error(`contxfulBidAdapter: contxtful.customer should be a non-empty string`); + } + return { + version, + customer + }; +}; + +// Construct the Payload towards the Bidding endpoint +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const ortb2 = converter.toORTB({ + bidderRequest: bidderRequest, + bidRequests: validBidRequests + }); + const bidRequests = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, bidRequest => { + const { + mediaTypes = {}, + params = {} + } = bidRequest; + bidRequest.bidFloor = _getRequestBidFloor(mediaTypes, params.bidfloor, bidRequest); + bidRequests.push(bidRequest); + }); + const config = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(); + config.pbjsVersion = PREBID_VERSION; + const { + version, + customer + } = extractParameters(config); + const adapterUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: 'https', + host: BIDDER_ENDPOINT, + pathname: `/${version}/prebid/${customer}/bid` + }); + + // See https://docs.prebid.org/dev-docs/bidder-adaptor.html + let req = { + url: adapterUrl, + method: 'POST', + data: { + ortb2, + bidRequests, + bidderRequest, + config + } + }; + return req; +}; + +// Prepare a sync object compatible with getUserSyncs. +const constructUrl = (userSyncsDefault, userSyncServer) => { + const urlSyncServer = (userSyncServer?.url ?? '').split('?'); + const userSyncUrl = userSyncsDefault?.url || ''; + const baseSyncUrl = urlSyncServer[0] || ''; + let url = `${baseSyncUrl}${userSyncUrl}`; + if (urlSyncServer.length > 1) { + const urlParams = urlSyncServer[1]; + url += url.includes('?') ? `&${urlParams}` : `?${urlParams}`; + } + return { + ...userSyncsDefault, + url + }; +}; + +// Returns the list of user synchronization objects. +const getUserSyncs = (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => { + // Get User Sync Defaults from pbjs lib + const userSyncsDefaultLib = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.getUserSyncs)('')(syncOptions, null, gdprConsent, uspConsent, gppConsent); + const userSyncsDefault = userSyncsDefaultLib?.find(item => item.url !== undefined); + + // Map Server Responses to User Syncs list + const serverSyncsData = serverResponses?.flatMap(response => response.body || []).map(data => data.syncs).find(syncs => Array.isArray(syncs) && syncs.length > 0) || []; + const userSyncs = serverSyncsData.map(sync => constructUrl(userSyncsDefault, sync)).filter(Boolean); // Filter out nulls + return userSyncs; +}; + +// Retrieve the sampling rate for events +const getSamplingRate = (bidderConfig, eventType) => { + const entry = Object.entries(bidderConfig?.contxtful?.sampling ?? {}).find(_ref => { + let [key, value] = _ref; + return key.toLowerCase() === eventType.toLowerCase(); + }); + return entry ? entry[1] : DEFAULT_SAMPLING_RATE; +}; +const logBidderError = _ref2 => { + let { + error, + bidderRequest + } = _ref2; + if (error) { + let jsonReason = { + message: error.reason?.message, + stack: error.reason?.stack + }; + error.reason = jsonReason; + } + logEvent('onBidderError', { + error, + bidderRequest + }); +}; + +// Handles the logging of events +const logEvent = (eventType, data) => { + try { + // Log event + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, `[${eventType}] ${JSON.stringify(data)}`); + + // Get Config + const bidderConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(); + const { + version, + customer + } = extractParameters(bidderConfig); + + // Sampled monitoring + if (['onBidBillable', 'onAdRenderSucceeded'].includes(eventType)) { + const randomNumber = Math.random(); + const samplingRate = getSamplingRate(bidderConfig, eventType); + if (!(randomNumber <= samplingRate)) { + return; // Don't sample + } + } else if (!['onTimeout', 'onBidderError', 'onBidWon'].includes(eventType)) { + // Unsupported event type. + return; + } + const payload = { + type: eventType, + data + }; + const eventUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: 'https', + host: MONITORING_ENDPOINT, + pathname: `/${version}/prebid/${customer}/log/${eventType}` + }); + + // Try sending a beacon + if ((0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.sendBeacon)(eventUrl, JSON.stringify(payload))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, `[${eventType}] Logging data sent using Beacon and payload: ${JSON.stringify(data)}`); + } else { + // Fallback to using ajax + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(eventUrl, null, JSON.stringify(payload), { + method: 'POST', + contentType: 'application/json', + withCredentials: true + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(BIDDER_CODE, `[${eventType}] Logging data sent using Ajax and payload: ${JSON.stringify(data)}`); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, `Failed to log event: ${eventType}`); + } +}; + +// Bidder public specification +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE], + isBidRequestValid: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.isBidRequestValid, + buildRequests, + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_3__.interpretResponse, + getUserSyncs, + onBidWon: function (bid) { + logEvent('onBidWon', bid); + }, + onBidBillable: function (bid) { + logEvent('onBidBillable', bid); + }, + onAdRenderSucceeded: function (bid) { + logEvent('onAdRenderSucceeded', bid); + }, + onSetTargeting: function (bid) {}, + onTimeout: function (timeoutData) { + logEvent('onTimeout', timeoutData); + }, + onBidderError: logBidderError +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('contxtfulBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","teqblazeUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/contxtfulBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["contxtfulRtdProvider"],{ + +/***/ "./modules/contxtfulRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/contxtfulRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports extractParameters, contxtfulSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + +/** + * Contxtful Technologies Inc. + * This RTD module provides receptivity that can be accessed using the + * getTargetingData and getBidRequestData functions. The receptivity enriches ad units + * and bid requests. + */ + + + + + + + + + +// Constants +const MODULE_NAME = 'contxtful'; +const MODULE = `${MODULE_NAME}RtdProvider`; +const CONTXTFUL_HOSTNAME_DEFAULT = 'api.receptivity.io'; +const CONTXTFUL_DEFER_DEFAULT = 0; + +// Functions +let _sm; +function sm() { + return _sm ??= (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +} +const storageManager = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME +}); +let rxApi = null; + +/** + * Return current receptivity value for the requester. + * @param { String } requester + * @return { { Object } } + */ +function getRxEngineReceptivity(requester) { + return rxApi?.receptivity(requester); +} +function getItemFromSessionStorage(key) { + try { + return storageManager.getDataFromSessionStorage(key); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(MODULE, error); + } +} +function loadSessionReceptivity(requester) { + let sessionStorageValue = getItemFromSessionStorage(requester); + if (!sessionStorageValue) { + return null; + } + try { + // Check expiration of the cached value + let sessionStorageReceptivity = JSON.parse(sessionStorageValue); + let expiration = parseInt(sessionStorageReceptivity?.exp); + if (expiration < new Date().getTime()) { + return null; + } + let rx = sessionStorageReceptivity?.rx; + return rx; + } catch { + return null; + } +} + +/** + * Prepare a receptivity batch + * @param {Array.} requesters + * @param {Function} method + * @returns A batch + */ +function prepareBatch(requesters, method) { + return requesters.reduce((acc, requester) => { + const receptivity = method(requester); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(receptivity)) { + return { + ...acc, + [requester]: receptivity + }; + } else { + return acc; + } + }, {}); +} + +/** + * Init function used to start sub module + * @param { { params: { version: String, customer: String, hostname: String } } } config + * @return { Boolean } + */ +function init(config) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(MODULE, 'init', config); + rxApi = null; + try { + initCustomer(config); + observeLastCursorPosition(); + return true; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(MODULE, error); + return false; + } +} + +/** + * Extract required configuration for the sub module. + * validate that all required configuration are present and are valid. + * Throws an error if any config is missing of invalid. + * @param { { params: { version: String, customer: String, hostname: String } } } config + * @return { { version: String, customer: String, hostname: String } } + * @throws params.{name} should be a non-empty string + */ +function extractParameters(config) { + const version = config?.params?.version; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(version) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(version)) { + throw Error(`${MODULE}: params.version should be a non-empty string`); + } + const customer = config?.params?.customer; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(customer) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(customer)) { + throw Error(`${MODULE}: params.customer should be a non-empty string`); + } + const hostname = config?.params?.hostname || CONTXTFUL_HOSTNAME_DEFAULT; + const defer = config?.params?.defer || CONTXTFUL_DEFER_DEFAULT; + return { + version, + customer, + hostname, + defer + }; +} + +/** + * Initialize sub module for a customer. + * This will load the external resources for the sub module. + * @param { String } config + */ +function initCustomer(config) { + const { + version, + customer, + hostname, + defer + } = extractParameters(config); + const CONNECTOR_URL = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.buildUrl)({ + protocol: 'https', + host: hostname, + pathname: `/${version}/prebid/${customer}/connector/rxConnector.js` + }); + addConnectorEventListener(customer, config); + const loadScript = () => (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(CONNECTOR_URL, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, MODULE_NAME, undefined, undefined, { + 'data-sm': sm() + }); + // Optionally defer the loading of the script + if (Number.isFinite(defer) && defer > 0) { + setTimeout(loadScript, defer); + } else { + loadScript(); + } +} + +/** + * Add event listener to the script tag for the expected events from the external script. + * @param { String } tagId + * @param { String } prebidConfig + */ +function addConnectorEventListener(tagId, prebidConfig) { + window.addEventListener('rxConnectorIsReady', async _ref => { + let { + detail: { + [tagId]: rxConnector + } + } = _ref; + if (!rxConnector) { + return; + } + // Fetch the customer configuration + const { + rxApiBuilder, + fetchConfig + } = rxConnector; + let config = await fetchConfig(tagId); + if (!config) { + return; + } + config['prebid'] = prebidConfig || {}; + rxApi = await rxApiBuilder(config); + + // Remove listener now that we can use rxApi. + removeListeners(); + }); +} + +/** + * Set targeting data for ad server + * @param { [String] } adUnits + * @param {*} config + * @param {*} _userConsent + * @return {{ code: { ReceptivityState: String } }} + */ +function getTargetingData(adUnits, config, _userConsent) { + try { + if (String(config?.params?.adServerTargeting) === 'false') { + return {}; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(MODULE, 'getTargetingData'); + const requester = config?.params?.customer; + const rx = getRxEngineReceptivity(requester) || loadSessionReceptivity(requester) || {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(rx)) { + return {}; + } + return adUnits.reduce((targets, code) => { + targets[code] = rx; + return targets; + }, {}); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(MODULE, error); + return {}; + } +} +function getVisibilityStateElement(domElement, windowTop) { + if ('checkVisibility' in domElement) { + return domElement.checkVisibility(); + } + const elementCss = windowTop.getComputedStyle(domElement, null); + return elementCss.display !== 'none'; +} +function getElementFromTopWindowRecurs(element, currentWindow) { + try { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)() === currentWindow) { + return element; + } else { + const frame = currentWindow.frameElement; + const frameClientRect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__.getBoundingClientRect)(frame); + const elementClientRect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__.getBoundingClientRect)(element); + if (frameClientRect.width !== elementClientRect.width || frameClientRect.height !== elementClientRect.height) { + return undefined; + } + return getElementFromTopWindowRecurs(frame, currentWindow.parent); + } + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(MODULE, err); + return undefined; + } +} +function getDivIdPosition(divId) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isSafeFrameWindow)() && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.canAccessWindowTop)()) { + return {}; + } + const position = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isSafeFrameWindow)()) { + const { + self + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getSafeframeGeometry)() ?? {}; + if (!self) { + return {}; + } + position.x = Math.round(self.t); + position.y = Math.round(self.l); + } else { + try { + // window.top based computing + const wt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)(); + const d = wt.document; + let domElement; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.inIframe)() === true) { + const ws = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSelf)(); + const currentElement = ws.document.getElementById(divId); + domElement = getElementFromTopWindowRecurs(currentElement, ws); + } else { + domElement = wt.document.getElementById(divId); + } + if (!domElement) { + return {}; + } + let box = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__.getBoundingClientRect)(domElement); + const docEl = d.documentElement; + const body = d.body; + const clientTop = d.clientTop ?? body.clientTop ?? 0; + const clientLeft = d.clientLeft ?? body.clientLeft ?? 0; + const scrollTop = wt.scrollY ?? docEl.scrollTop ?? body.scrollTop; + const scrollLeft = wt.scrollX ?? docEl.scrollLeft ?? body.scrollLeft; + position.visibility = getVisibilityStateElement(domElement, wt); + position.x = Math.round(box.left + scrollLeft - clientLeft); + position.y = Math.round(box.top + scrollTop - clientTop); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(MODULE, err); + return {}; + } + } + return position; +} +function tryGetDivIdPosition(divIdMethod) { + let divId = divIdMethod(); + if (divId) { + const divIdPosition = getDivIdPosition(divId); + if (divIdPosition.x !== undefined && divIdPosition.y !== undefined) { + return divIdPosition; + } + } + return undefined; +} +function tryMultipleDivIdPositions(adUnit) { + let divMethods = [ + // ortb2\ + () => { + adUnit.ortb2Imp = adUnit.ortb2Imp || {}; + const ortb2Imp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(adUnit, 'ortb2Imp'); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(ortb2Imp, 'ext.data.divId'); + }, + // gpt + () => (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.getGptSlotInfoForAdUnitCode)(adUnit.code).divId, + // adunit code + () => adUnit.code]; + for (const divMethod of divMethods) { + let divPosition = tryGetDivIdPosition(divMethod); + if (divPosition) { + return divPosition; + } + } +} +function tryGetAdUnitPosition(adUnit) { + let adUnitPosition = {}; + adUnit.ortb2Imp = adUnit.ortb2Imp || {}; + + // try to get position with the divId + const divIdPosition = tryMultipleDivIdPositions(adUnit); + if (divIdPosition) { + adUnitPosition.p = { + x: divIdPosition.x, + y: divIdPosition.y + }; + adUnitPosition.v = divIdPosition.visibility; + adUnitPosition.t = 'div'; + return adUnitPosition; + } + + // try to get IAB position + const iabPos = adUnit?.mediaTypes?.banner?.pos; + if (iabPos !== undefined) { + adUnitPosition.p = iabPos; + adUnitPosition.t = 'iab'; + return adUnitPosition; + } + return undefined; +} +function getAdUnitPositions(bidReqConfig) { + const adUnits = bidReqConfig.adUnits || []; + let adUnitPositions = {}; + for (const adUnit of adUnits) { + let adUnitPosition = tryGetAdUnitPosition(adUnit); + if (adUnitPosition) { + adUnitPositions[adUnit.code] = adUnitPosition; + } + } + return adUnitPositions; +} + +/** + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Function} onDone Called on completion + * @param {Object} config Configuration for Contxtful RTD module + * @param {Object} userConsent + */ +function getBidRequestData(reqBidsConfigObj, onDone, config, userConsent) { + function onReturn() { + onDone(); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(MODULE, 'getBidRequestData'); + const bidders = config?.params?.bidders || []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(bidders) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bidders)) { + onReturn(); + return; + } + let ortb2Fragment; + let getContxtfulOrtb2Fragment = rxApi?.getOrtb2Fragment; + if (typeof getContxtfulOrtb2Fragment == 'function') { + ortb2Fragment = getContxtfulOrtb2Fragment(bidders, reqBidsConfigObj); + } else { + const adUnitsPositions = getAdUnitPositions(reqBidsConfigObj); + let fromApi = rxApi?.receptivityBatched?.(bidders) || {}; + let fromStorage = prepareBatch(bidders, bidder => loadSessionReceptivity(`${config?.params?.customer}_${bidder}`)); + let sources = [fromStorage, fromApi]; + let rxBatch = Object.assign(...sources); + let singlePointEvents = btoa(JSON.stringify({ + ui: getUiEvents() + })); + ortb2Fragment = {}; + ortb2Fragment.bidder = Object.fromEntries(bidders.map(bidderCode => { + return [bidderCode, { + user: { + data: [{ + name: MODULE_NAME, + ext: { + rx: rxBatch[bidderCode], + events: singlePointEvents, + pos: btoa(JSON.stringify(adUnitsPositions)), + sm: sm(), + params: { + ev: config.params?.version, + ci: config.params?.customer + } + } + }] + } + }]; + })); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfigObj.ortb2Fragments, ortb2Fragment); + onReturn(); +} +function getUiEvents() { + return { + position: lastCursorPosition, + screen: getScreen() + }; +} +function getScreen() { + function getInnerSize() { + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)(); + let w = innerWidth; + let h = innerHeight; + if (w && h) { + return [w, h]; + } + } + function getDocumentSize() { + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)(); + let w = windowDimensions.document.body.clientWidth; + let h = windowDimensions.document.body.clientHeight; + if (w && h) { + return [w, h]; + } + } + + // If we cannot access or cast the window dimensions, we get None. + // If we cannot collect the size from the window we try to use the root document dimensions + let [width, height] = getInnerSize() || getDocumentSize() || [0, 0]; + let topLeft = { + x: window.scrollX, + y: window.scrollY + }; + return { + topLeft, + width, + height, + timestampMs: performance.now() + }; +} +let lastCursorPosition; +function observeLastCursorPosition() { + function pointerEventToPosition(event) { + lastCursorPosition = { + x: event.clientX, + y: event.clientY, + timestampMs: performance.now() + }; + } + function touchEventToPosition(event) { + let touch = event.touches.item(0); + if (!touch) { + return; + } + lastCursorPosition = { + x: touch.clientX, + y: touch.clientY, + timestampMs: performance.now() + }; + } + addListener('pointermove', pointerEventToPosition); + addListener('touchmove', touchEventToPosition); +} +let listeners = {}; +function addListener(name, listener) { + listeners[name] = listener; + window.addEventListener(name, listener); +} +function removeListeners() { + for (const name in listeners) { + window.removeEventListener(name, listeners[name]); + delete listeners[name]; + } +} +const contxtfulSubmodule = { + name: MODULE_NAME, + init, + getTargetingData, + getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.submodule)('realTimeData', contxtfulSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('contxtfulRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/contxtfulRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["conversantAnalyticsAdapter"],{ + +/***/ "./modules/conversantAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/conversantAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports CNVR_CONSTANTS, cnvrHelper */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + +// Maintainer: mediapsr@epsilon.com + +const { + AUCTION_END, + AD_RENDER_FAILED, + BID_TIMEOUT, + BID_WON, + BIDDER_ERROR +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +// STALE_RENDER, TCF2_ENFORCEMENT would need to add extra calls for these as they likely occur after AUCTION_END? +const GVLID = 24; +const ANALYTICS_TYPE = 'endpoint'; + +// for local testing set domain to 127.0.0.1:8290 +const DOMAIN = 'https://web.hb.ad.cpe.dotomi.com/'; +const ANALYTICS_URL = DOMAIN + 'cvx/event/prebidanalytics'; +const ERROR_URL = DOMAIN + 'cvx/event/prebidanalyticerrors'; +const ANALYTICS_CODE = 'conversant'; +const ANALYTICS_ALIASES = [ANALYTICS_CODE, 'epsilon', 'cnvr']; +const CNVR_CONSTANTS = { + LOG_PREFIX: 'Conversant analytics adapter: ', + ERROR_MISSING_DATA_PREFIX: 'Parsing method failed because of missing data: ', + // Maximum time to keep an item in the cache before it gets purged + MAX_MILLISECONDS_IN_CACHE: 30000, + // How often cache cleanup will run + CACHE_CLEANUP_TIME_IN_MILLIS: 30000, + // Should be float from 0-1, 0 is turned off, 1 is sample every instance + DEFAULT_SAMPLE_RATE: 1, + // BID STATUS CODES + WIN: 10, + BID: 20, + NO_BID: 30, + TIMEOUT: 40, + RENDER_FAILED: 50 +}; + +// Saves passed in options from the bid adapter +const initOptions = {}; + +// Simple flag to help handle any tear down needed on disable +let conversantAnalyticsEnabled = false; +const cnvrHelper = { + // Turns on sampling for an instance of prebid analytics. + doSample: true, + doSendErrorData: false, + /** + * Used to hold data for RENDER FAILED events so we can send a payload back that will match our original auction data. + * Contains the following key/value data: + * => { + * 'bidderCode': , + * 'adUnitCode': , + * 'auctionId': , + * 'timeReceived': Date.now() //For cache cleaning + * } + */ + adIdLookup: {}, + /** + * Time out events happen before AUCTION END so we can save them in a cache and report them at the same time as the + * AUCTION END event. Has the following data and key is based off of auctionId, adUnitCode, bidderCode from + * keyStr = getLookupKey(auctionId, adUnitCode, bidderCode); + * => { + * timeReceived: Date.now() //so cache can be purged in case it doesn't get cleaned out at auctionEnd + * } + */ + timeoutCache: {}, + /** + * Lookup of auction IDs to auction start timestamps + */ + auctionIdTimestampCache: {}, + /** + * Capture any bidder errors and bundle them with AUCTION_END + */ + bidderErrorCache: {} +}; + +/** + * Cleanup timer for the adIdLookup and timeoutCache caches. If all works properly then the caches are self-cleaning + * but in case something goes sideways we poll periodically to cleanup old values to prevent a memory leak + */ +let cacheCleanupInterval; +let conversantAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + URL: ANALYTICS_URL, + ANALYTICS_TYPE +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + try { + if (cnvrHelper.doSample) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(CNVR_CONSTANTS.LOG_PREFIX + ' track(): ' + eventType, args); + switch (eventType) { + case AUCTION_END: + onAuctionEnd(args); + break; + case AD_RENDER_FAILED: + onAdRenderFailed(args); + break; + case BID_WON: + onBidWon(args); + break; + case BID_TIMEOUT: + onBidTimeout(args); + break; + case BIDDER_ERROR: + onBidderError(args); + } // END switch + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(CNVR_CONSTANTS.LOG_PREFIX + ' - ' + eventType + ': skipped due to sampling'); + } // END IF(cnvrHelper.doSample) + } catch (e) { + // e = {stack:"...",message:"..."} + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(CNVR_CONSTANTS.LOG_PREFIX + 'Caught error in handling ' + eventType + ' event: ' + e.message); + cnvrHelper.sendErrorData(eventType, e); + } + } // END track() +}); + +// ================================================== EVENT HANDLERS =================================================== + +/** + * Handler for BIDDER_ERROR events, tries to capture as much data, save it in cache which is then picked up by + * AUCTION_END event and included in that payload. Was not able to see an easy way to get adUnitCode in this event + * so not including it for now. + * https://docs.prebid.org/dev-docs/bidder-adaptor.html#registering-on-bidder-error + * Trigger when the HTTP response status code is not between 200-299 and not equal to 304. + { + error: XMLHttpRequest, https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest + bidderRequest: { https://docs.prebid.org/dev-docs/bidder-adaptor.html#registering-on-bidder-error + { + auctionId: "b06c5141-fe8f-4cdf-9d7d-54415490a917", + auctionStart: 1579746300522, + bidderCode: "myBidderCode", + bidderRequestId: "15246a574e859f", + bids: [{...}], + gdprConsent: {consentString: "BOtmiBKOtmiBKABABAENAFAAAAACeAAA", vendorData: {...}, gdprApplies: true}, + refererInfo: { + canonicalUrl: null, + page: "http://mypage.org?pbjs_debug=true", + domain: "mypage.org", + ref: null, + numIframes: 0, + reachedTop: true, + isAmp: false, + stack: ["http://mypage.org?pbjs_debug=true"] + } + } + } +} + */ +function onBidderError(args) { + if (!cnvrHelper.doSendErrorData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(CNVR_CONSTANTS.LOG_PREFIX + 'Skipping bidder error parsing due to config disabling error logging, bidder error status = ' + args.error.status + ', Message = ' + args.error.statusText); + return; + } + let error = args.error; + let bidRequest = args.bidderRequest; + let auctionId = bidRequest.auctionId; + let bidderCode = bidRequest.bidderCode; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(CNVR_CONSTANTS.LOG_PREFIX + 'onBidderError(): error received from bidder ' + bidderCode + '. Status = ' + error.status + ', Message = ' + error.statusText); + let errorObj = { + status: error.status, + message: error.statusText, + bidderCode: bidderCode, + url: cnvrHelper.getPageUrl() + }; + if (cnvrHelper.bidderErrorCache[auctionId]) { + cnvrHelper.bidderErrorCache[auctionId]['errors'].push(errorObj); + } else { + cnvrHelper.bidderErrorCache[auctionId] = { + errors: [errorObj], + timeReceived: Date.now() + }; + } +} + +/** + * We get the list of timeouts before the endAution, cache them temporarily in a global cache and the endAuction event + * will pick them up. Uses getLookupKey() to create the key to the entry from auctionId, adUnitCode and bidderCode. + * Saves a single value of timeReceived so we can do cache purging periodically. + * + * Current assumption is that the timeout will always be an array even if it is just one object in the array. + * @param args [{ + "bidId": "80882409358b8a8", + "bidder": "conversant", + "adUnitCode": "MedRect", + "auctionId": "afbd6e0b-e45b-46ab-87bf-c0bac0cb8881" + }, { + "bidId": "9da4c107a6f24c8", + "bidder": "conversant", + "adUnitCode": "Leaderboard", + "auctionId": "afbd6e0b-e45b-46ab-87bf-c0bac0cb8881" + } + ] + */ +function onBidTimeout(args) { + args.forEach(timedOutBid => { + const timeoutCacheKey = cnvrHelper.getLookupKey(timedOutBid.auctionId, timedOutBid.adUnitCode, timedOutBid.bidder); + cnvrHelper.timeoutCache[timeoutCacheKey] = { + timeReceived: Date.now() + }; + }); +} + +/** + * Bid won occurs after auctionEnd so we need to send this separately. We also save an entry in the adIdLookup cache + * so that if the render fails we can match up important data so we can send a valid RENDER FAILED event back. + * @param args bidWon args + */ +function onBidWon(args) { + const bidderCode = args.bidderCode; + const adUnitCode = args.adUnitCode; + const auctionId = args.auctionId; + let timestamp = args.requestTimestamp ? args.requestTimestamp : Date.now(); + + // Make sure we have all the data we need + if (!bidderCode || !adUnitCode || !auctionId) { + let errorReason = 'auction id'; + if (!bidderCode) { + errorReason = 'bidder code'; + } else if (!adUnitCode) { + errorReason = 'ad unit code'; + } + throw new Error(CNVR_CONSTANTS.ERROR_MISSING_DATA_PREFIX + errorReason); + } + if (cnvrHelper.auctionIdTimestampCache[auctionId]) { + timestamp = cnvrHelper.auctionIdTimestampCache[auctionId].timeReceived; // Don't delete, could be multiple winners/auction, allow cleanup to handle + } + const bidWonPayload = cnvrHelper.createPayload('bid_won', auctionId, timestamp); + const adUnitPayload = cnvrHelper.createAdUnit(); + bidWonPayload.adUnits[adUnitCode] = adUnitPayload; + const bidPayload = cnvrHelper.createBid(CNVR_CONSTANTS.WIN, args.timeToRespond); + bidPayload.adSize = cnvrHelper.createAdSize(args.width, args.height); + bidPayload.cpm = args.cpm; + bidPayload.originalCpm = args.originalCpm; + bidPayload.currency = args.currency; + bidPayload.mediaType = args.mediaType; + adUnitPayload.bids[bidderCode] = [bidPayload]; + if (!cnvrHelper.adIdLookup[args.adId]) { + cnvrHelper.adIdLookup[args.adId] = { + 'bidderCode': bidderCode, + 'adUnitCode': adUnitCode, + 'auctionId': auctionId, + 'timeReceived': Date.now() // For cache cleaning + }; + } + sendData(bidWonPayload); +} + +/** + * RENDER FAILED occurs after AUCTION END and BID WON, the payload does not have all the data we need so we use + * adIdLookup to pull data from a BID WON event to populate our payload + * @param args = { + * reason: + * message: + * adId: --optional + * bid: {object?} --optional: unsure what this looks like but guessing it is {bidder: , params: {object}} + * } + */ +function onAdRenderFailed(args) { + const adId = args.adId; + // Make sure we have all the data we need, adId is optional so it's not guaranteed, without that we can't match it up + // to our adIdLookup data. + if (!adId || !cnvrHelper.adIdLookup[adId]) { + let errorMsg = 'ad id'; + if (adId) { + errorMsg = 'no lookup data for ad id'; + } + // Either no adId to match against a bidWon event, or no data saved from a bidWon event that matches the adId + throw new Error(CNVR_CONSTANTS.ERROR_MISSING_DATA_PREFIX + errorMsg); + } + const adIdObj = cnvrHelper.adIdLookup[adId]; + const adUnitCode = adIdObj['adUnitCode']; + const bidderCode = adIdObj['bidderCode']; + const auctionId = adIdObj['auctionId']; + delete cnvrHelper.adIdLookup[adId]; // cleanup our cache + + if (!bidderCode || !adUnitCode || !auctionId) { + let errorReason = 'auction id'; + if (!bidderCode) { + errorReason = 'bidder code'; + } else if (!adUnitCode) { + errorReason = 'ad unit code'; + } + throw new Error(CNVR_CONSTANTS.ERROR_MISSING_DATA_PREFIX + errorReason); + } + let timestamp = Date.now(); + if (cnvrHelper.auctionIdTimestampCache[auctionId]) { + timestamp = cnvrHelper.auctionIdTimestampCache[auctionId].timeReceived; // Don't delete, could be multiple winners/auction, allow cleanup to handle + } + const renderFailedPayload = cnvrHelper.createPayload('render_failed', auctionId, timestamp); + const adUnitPayload = cnvrHelper.createAdUnit(); + adUnitPayload.bids[bidderCode] = [cnvrHelper.createBid(CNVR_CONSTANTS.RENDER_FAILED, 0)]; + adUnitPayload.bids[bidderCode][0].message = 'REASON: ' + args.reason + '. MESSAGE: ' + args.message; + renderFailedPayload.adUnits[adUnitCode] = adUnitPayload; + sendData(renderFailedPayload); +} + +/** + * AUCTION END contains bid and no bid info and all of the auction info we need. This sends the bulk of the information + * about the auction back to the servers. It will also check the timeoutCache for any matching bids, if any are found + * then they will be removed from the cache and send back with this payload. + * @param args AUCTION END payload, fairly large data structure, main objects are 'adUnits[]', 'bidderRequests[]', + * 'noBids[]', 'bidsReceived[]'... 'winningBids[]' seems to be always blank. + */ +function onAuctionEnd(args) { + const auctionId = args.auctionId; + if (!auctionId) { + throw new Error(CNVR_CONSTANTS.ERROR_MISSING_DATA_PREFIX + 'auction id'); + } + const auctionTimestamp = args.timestamp ? args.timestamp : Date.now(); + cnvrHelper.auctionIdTimestampCache[auctionId] = { + timeReceived: auctionTimestamp + }; + const auctionEndPayload = cnvrHelper.createPayload('auction_end', auctionId, auctionTimestamp); + // Get bid request information from adUnits + if (!Array.isArray(args.adUnits)) { + throw new Error(CNVR_CONSTANTS.ERROR_MISSING_DATA_PREFIX + 'no adUnits in event args'); + } + + // Write out any bid errors + if (cnvrHelper.bidderErrorCache[auctionId]) { + auctionEndPayload.bidderErrors = cnvrHelper.bidderErrorCache[auctionId].errors; + delete cnvrHelper.bidderErrorCache[auctionId]; + } + args.adUnits.forEach(adUnit => { + const cnvrAdUnit = cnvrHelper.createAdUnit(); + // Initialize bids with bidderCode + adUnit.bids.forEach(bid => { + cnvrAdUnit.bids[bid.bidder] = []; // support multiple bids from a bidder for different sizes/media types //cnvrHelper.initializeBidDefaults(); + + // Check for cached timeout responses + const timeoutKey = cnvrHelper.getLookupKey(auctionId, adUnit.code, bid.bidder); + if (cnvrHelper.timeoutCache[timeoutKey]) { + cnvrAdUnit.bids[bid.bidder].push(cnvrHelper.createBid(CNVR_CONSTANTS.TIMEOUT, args.timeout)); + delete cnvrHelper.timeoutCache[timeoutKey]; + } + }); + + // Ad media types for the ad slot + if (cnvrHelper.keyExistsAndIsObject(adUnit, 'mediaTypes')) { + Object.entries(adUnit.mediaTypes).forEach(_ref2 => { + let [mediaTypeName] = _ref2; + cnvrAdUnit.mediaTypes.push(mediaTypeName); + }); + } + + // Ad sizes listed under the size key + if (Array.isArray(adUnit.sizes) && adUnit.sizes.length >= 1) { + adUnit.sizes.forEach(size => { + if (!Array.isArray(size) || size.length !== 2) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(CNVR_CONSTANTS.LOG_PREFIX + 'Unknown object while retrieving adUnit sizes.', adUnit); + return; // skips to next item + } + cnvrAdUnit.sizes.push(cnvrHelper.createAdSize(size[0], size[1])); + }); + } + + // If the Ad Slot is not unique then ad sizes and media types merge them together + if (auctionEndPayload.adUnits[adUnit.code]) { + // Merge ad sizes + Array.prototype.push.apply(auctionEndPayload.adUnits[adUnit.code].sizes, cnvrAdUnit.sizes); + // Merge mediaTypes + Array.prototype.push.apply(auctionEndPayload.adUnits[adUnit.code].mediaTypes, cnvrAdUnit.mediaTypes); + } else { + auctionEndPayload.adUnits[adUnit.code] = cnvrAdUnit; + } + }); + if (Array.isArray(args.noBids)) { + args.noBids.forEach(noBid => { + const bidPayloadArray = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(auctionEndPayload, 'adUnits.' + noBid.adUnitCode + '.bids.' + noBid.bidder); + if (bidPayloadArray) { + bidPayloadArray.push(cnvrHelper.createBid(CNVR_CONSTANTS.NO_BID, 0)); // no time to respond info for this, would have to capture event and save it there + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(CNVR_CONSTANTS.LOG_PREFIX + 'Unable to locate bid object via adUnitCode/bidderCode in payload for noBid reply in END_AUCTION', Object.assign({}, noBid)); + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(CNVR_CONSTANTS.LOG_PREFIX + 'onAuctionEnd(): noBids not defined in arguments.'); + } + + // Get bid data from bids sent + if (Array.isArray(args.bidsReceived)) { + args.bidsReceived.forEach(bid => { + const bidPayloadArray = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(auctionEndPayload, 'adUnits.' + bid.adUnitCode + '.bids.' + bid.bidderCode); + if (bidPayloadArray) { + const bidPayload = cnvrHelper.createBid(CNVR_CONSTANTS.BID, bid.timeToRespond); + bidPayload.originalCpm = bid.originalCpm; + bidPayload.cpm = bid.cpm; + bidPayload.currency = bid.currency; + bidPayload.mediaType = bid.mediaType; + bidPayload.adSize = { + 'w': bid.width, + 'h': bid.height + }; + bidPayloadArray.push(bidPayload); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(CNVR_CONSTANTS.LOG_PREFIX + 'Unable to locate bid object via adUnitCode/bidderCode in payload for bid reply in END_AUCTION', Object.assign({}, bid)); + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(CNVR_CONSTANTS.LOG_PREFIX + 'onAuctionEnd(): bidsReceived not defined in arguments.'); + } + // We need to remove any duplicate ad sizes from merging ad-slots or overlap in different media types and also + // media-types from merged ad-slots in twin bids. + Object.keys(auctionEndPayload.adUnits).forEach(function (adCode) { + auctionEndPayload.adUnits[adCode].sizes = cnvrHelper.deduplicateArray(auctionEndPayload.adUnits[adCode].sizes); + auctionEndPayload.adUnits[adCode].mediaTypes = cnvrHelper.deduplicateArray(auctionEndPayload.adUnits[adCode].mediaTypes); + }); + sendData(auctionEndPayload); +} + +// =============================================== START OF HELPERS =================================================== + +/** + * Helper to verify a key exists and is a data type of Object (not a function, or array) + * @param parent The parent that we want to check the key for + * @param key The key which we want to check + * @returns {boolean} True if it's an object and exists, false otherwise (null, array, primitive, function) + */ +cnvrHelper.keyExistsAndIsObject = function (parent, key) { + if (!parent.hasOwnProperty(key)) { + return false; + } + return typeof parent[key] === 'object' && !Array.isArray(parent[key]) && parent[key] !== null; +}; + +/** + * De-duplicate an array that could contain primitives or objects/associative arrays. + * A temporary array is used to store a string representation of each object that we look at. If an object matches + * one found in the temp array then it is ignored. + * @param array An array + * @returns {*} A de-duplicated array. + */ +cnvrHelper.deduplicateArray = function (array) { + if (!array || !Array.isArray(array)) { + return array; + } + const tmpArray = []; + return array.filter(function (tmpObj) { + if (tmpArray.indexOf(JSON.stringify(tmpObj)) < 0) { + tmpArray.push(JSON.stringify(tmpObj)); + return tmpObj; + } + }); +}; + +/** + * Generic method to look at each key/value pair of a cache object and looks at the 'timeReceived' key, if more than + * the max wait time has passed then just delete the key. + * @param cacheObj one of our cache objects [adIdLookup or timeoutCache] + * @param currTime the current timestamp at the start of the most recent timer execution. + */ +cnvrHelper.cleanCache = function (cacheObj, currTime) { + Object.keys(cacheObj).forEach(key => { + const timeInCache = currTime - cacheObj[key].timeReceived; + if (timeInCache >= CNVR_CONSTANTS.MAX_MILLISECONDS_IN_CACHE) { + delete cacheObj[key]; + } + }); +}; + +/** + * Helper to create an object lookup key for our timeoutCache + * @param auctionId id of the auction + * @param adUnitCode ad unit code + * @param bidderCode bidder code + * @returns string concatenation of all the params into a string key for timeoutCache + */ +cnvrHelper.getLookupKey = function (auctionId, adUnitCode, bidderCode) { + return auctionId + '-' + adUnitCode + '-' + bidderCode; +}; + +/** + * Creates our root payload object that gets sent back to the server + * @param payloadType string type of payload (AUCTION_END, BID_WON, RENDER_FAILED) + * @param auctionId id for the auction + * @param timestamp timestamp in milliseconds of auction start time. + * @returns + * {{ + * requestType: *, + * adUnits: {}, + * auction: { + * auctionId: *, + * preBidVersion: *, + * sid: *} + * }} Basic structure of our object that we return to the server. + */ +cnvrHelper.createPayload = function (payloadType, auctionId, timestamp) { + return { + requestType: payloadType, + globalSampleRate: initOptions.global_sample_rate, + cnvrSampleRate: initOptions.cnvr_sample_rate, + auction: { + auctionId: auctionId, + preBidVersion: "9.45.0-pre", + sid: initOptions.site_id, + auctionTimestamp: timestamp + }, + adUnits: {}, + bidderErrors: [] + }; +}; + +/** + * Helper to create an adSize object, if the value passed in is not an int then set it to -1 + * @param width in pixels (must be an int) + * @param height in peixl (must be an int) + * @returns {{w: *, h: *}} a fully valid adSize object + */ +cnvrHelper.createAdSize = function (width, height) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isInteger)(width)) { + width = -1; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isInteger)(height)) { + height = -1; + } + return { + 'w': width, + 'h': height + }; +}; + +/** + * Helper to create the basic structure of our adUnit payload + * @returns {{sizes: [], bids: {}}} Basic adUnit payload structure as follows + */ +cnvrHelper.createAdUnit = function () { + return { + sizes: [], + mediaTypes: [], + bids: {} + }; +}; + +/** + * Helper to create a basic bid payload object. + */ +cnvrHelper.createBid = function (eventCode, timeToRespond) { + return { + 'eventCodes': [eventCode], + 'timeToRespond': timeToRespond + }; +}; + +/** + * Helper to get the sampling rates from an object and validate the result. + * @param parentObj Parent object that has the sampling property + * @param propNm Name of the sampling property + * @param defaultSampleRate A default value to apply if there is a problem + * @returns {number} returns a float number from 0 (always off) to 1 (always on) + */ +cnvrHelper.getSampleRate = function (parentObj, propNm, defaultSampleRate) { + let sampleRate = defaultSampleRate; + if (parentObj && typeof parentObj[propNm] !== 'undefined') { + sampleRate = parseFloat(parentObj[propNm]); + if (Number.isNaN(sampleRate) || sampleRate > 1) { + sampleRate = defaultSampleRate; + } else if (sampleRate < 0) { + sampleRate = 0; + } + } + return sampleRate; +}; + +/** + * Helper to encapsulate logic for getting best known page url. Small but helpful in debugging/testing and if we ever want + * to add more logic to this. + * + * From getRefererInfo(): page = the best candidate for the current page URL: `canonicalUrl`, falling back to `location` + * @returns {*} Best guess at top URL based on logic from RefererInfo. + */ +cnvrHelper.getPageUrl = function () { + return (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)().page; +}; + +/** + * Packages up an error that occured in analytics handling and sends it back to our servers for logging + * @param eventType = original event that was fired + * @param exception = {stack:"...",message:"..."}, exception that was triggered + */ +cnvrHelper.sendErrorData = function (eventType, exception) { + if (!cnvrHelper.doSendErrorData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(CNVR_CONSTANTS.LOG_PREFIX + 'Skipping sending error data due to config disabling error logging, error thrown = ' + exception); + return; + } + let error = { + event: eventType, + siteId: initOptions.site_id, + message: exception.message, + stack: exception.stack, + prebidVersion: "prebid_prebid_9.45.0-pre", + // testing val sample: prebid_prebid_7.27.0-pre' + userAgent: navigator.userAgent, + url: cnvrHelper.getPageUrl() + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(ERROR_URL, function () {}, JSON.stringify(error), { + contentType: 'text/plain' + }); +}; + +/** + * Helper function to send data back to server. Need to make sure we don't trigger a CORS preflight by not adding + * extra header params. + * @param payload our JSON payload from either AUCTION END, BID WIN, RENDER FAILED + */ +function sendData(payload) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(ANALYTICS_URL, function () {}, JSON.stringify(payload), { + contentType: 'text/plain' + }); +} + +// =============================== BOILERPLATE FOR PRE-BID ANALYTICS SETUP ============================================ +// save the base class function +conversantAnalytics.originEnableAnalytics = conversantAnalytics.enableAnalytics; +conversantAnalytics.originDisableAnalytics = conversantAnalytics.disableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +conversantAnalytics.enableAnalytics = function (config) { + if (!config || !config.options || !config.options.site_id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(CNVR_CONSTANTS.LOG_PREFIX + 'siteId is required.'); + return; + } + cacheCleanupInterval = setInterval(function () { + const currTime = Date.now(); + cnvrHelper.cleanCache(cnvrHelper.adIdLookup, currTime); + cnvrHelper.cleanCache(cnvrHelper.timeoutCache, currTime); + cnvrHelper.cleanCache(cnvrHelper.auctionIdTimestampCache, currTime); + cnvrHelper.cleanCache(cnvrHelper.bidderErrorCache, currTime); + }, CNVR_CONSTANTS.CACHE_CLEANUP_TIME_IN_MILLIS); + Object.assign(initOptions, config.options); + initOptions.global_sample_rate = cnvrHelper.getSampleRate(initOptions, 'sampling', 1); + initOptions.cnvr_sample_rate = cnvrHelper.getSampleRate(initOptions, 'cnvr_sampling', CNVR_CONSTANTS.DEFAULT_SAMPLE_RATE); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(CNVR_CONSTANTS.LOG_PREFIX + 'Conversant sample rate set to ' + initOptions.cnvr_sample_rate); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(CNVR_CONSTANTS.LOG_PREFIX + 'Global sample rate set to ' + initOptions.global_sample_rate); + // Math.random() pseudo-random number in the range 0 to less than 1 (inclusive of 0, but not 1) + cnvrHelper.doSample = Math.random() < initOptions.cnvr_sample_rate; + if (initOptions.send_error_data !== undefined && initOptions.send_error_data !== null) { + cnvrHelper.doSendErrorData = !!initOptions.send_error_data; // Forces data into boolean type + } + conversantAnalyticsEnabled = true; + conversantAnalytics.originEnableAnalytics(config); // call the base class function +}; + +/** + * Cleanup code for any timers and caches. + */ +conversantAnalytics.disableAnalytics = function () { + if (!conversantAnalyticsEnabled) { + return; + } + + // Cleanup our caches and disable our timer + clearInterval(cacheCleanupInterval); + cnvrHelper.timeoutCache = {}; + cnvrHelper.adIdLookup = {}; + cnvrHelper.auctionIdTimestampCache = {}; + cnvrHelper.bidderErrorCache = {}; + conversantAnalyticsEnabled = false; + conversantAnalytics.originDisableAnalytics(); +}; +ANALYTICS_ALIASES.forEach(alias => { + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: conversantAnalytics, + code: alias, + gvlid: GVLID + }); +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (conversantAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('conversantAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/conversantAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["conversantBidAdapter"],{ + +/***/ "./modules/conversantBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/conversantBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/ortbConverter/processors/mediaType.js */ "./libraries/ortbConverter/processors/mediaType.js"); + + + + + + + + +// Maintainer: mediapsr@epsilon.com + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').Device} Device + */ + +const GVLID = 24; +const BIDDER_CODE = 'conversant'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + gvlid: GVLID, + bidderCode: BIDDER_CODE +}); +const URL = 'https://web.hb.ad.cpe.dotomi.com/cvx/client/hb/ortb/25'; +function setSiteId(bidRequest, request) { + if (bidRequest.params.site_id) { + if (request.site) { + request.site.id = bidRequest.params.site_id; + } + if (request.app) { + request.app.id = bidRequest.params.site_id; + } + } +} +function setPubcid(bidRequest, request) { + // Add common id if available + const pubcid = getPubcid(bidRequest); + if (pubcid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'user.ext.fpc', pubcid); + } +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300 + }, + request: function (buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + request.at = 1; + request.cur = ['USD']; + if (context.bidRequests) { + const bidRequest = context.bidRequests[0]; + setSiteId(bidRequest, request); + setPubcid(bidRequest, request); + } + return request; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const data = { + secure: 1, + bidfloor: getBidFloor(bidRequest) || 0, + displaymanager: 'Prebid.js', + displaymanagerver: "9.45.0-pre" + }; + copyOptProperty(bidRequest.params.tag_id, data, 'tagid'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(imp, data, imp); + return imp; + }, + bidResponse: function (buildBidResponse, bid, context) { + if (!bid.price) return; + + // ensure that context.mediaType is set to banner or video otherwise + if (!context.mediaType && context.bidRequest.mediaTypes) { + const [type] = Object.keys(context.bidRequest.mediaTypes); + if (Object.values(_libraries_ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_4__.ORTB_MTYPES).includes(type)) { + context.mediaType = type; + } + } + const bidResponse = buildBidResponse(bid, context); + return bidResponse; + }, + response(buildResponse, bidResponses, ortbResponse, context) { + const response = buildResponse(bidResponses, ortbResponse, context); + return response; + }, + overrides: { + imp: { + banner(fillBannerImp, imp, bidRequest, context) { + if (bidRequest.mediaTypes && !bidRequest.mediaTypes.banner) return; + if (bidRequest.params.position) { + // fillBannerImp looks for mediaTypes.banner.pos so put it under the right name here + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(bidRequest, { + mediaTypes: { + banner: { + pos: bidRequest.params.position + } + } + }); + } + fillBannerImp(imp, bidRequest, context); + }, + video(fillVideoImp, imp, bidRequest, context) { + if (bidRequest.mediaTypes && !bidRequest.mediaTypes.video) return; + const videoData = {}; + copyOptProperty(bidRequest.params?.position, videoData, 'pos'); + copyOptProperty(bidRequest.params?.mimes, videoData, 'mimes'); + copyOptProperty(bidRequest.params?.maxduration, videoData, 'maxduration'); + copyOptProperty(bidRequest.params?.protocols, videoData, 'protocols'); + copyOptProperty(bidRequest.params?.api, videoData, 'api'); + imp.video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(videoData, imp.video); + fillVideoImp(imp, bidRequest, context); + } + } + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: ['cnvr', 'epsilon'], + // short code + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid - The bid params to validate. + * @return {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (!bid || !bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(BIDDER_CODE + ': Missing bid parameters'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(bid.params.site_id)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(BIDDER_CODE + ': site_id must be specified as a string'); + return false; + } + if (isVideoRequest(bid)) { + const mimes = bid.params.mimes || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.video.mimes'); + if (!mimes) { + // Give a warning but let it pass + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(BIDDER_CODE + ': mimes should be specified for videos'); + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(mimes) || !mimes.every(s => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(s))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(BIDDER_CODE + ': mimes must be an array of strings'); + return false; + } + } + return true; + }, + buildRequests: function (bidRequests, bidderRequest) { + const payload = converter.toORTB({ + bidderRequest, + bidRequests + }); + const result = { + method: 'POST', + url: makeBidUrl(bidRequests[0]), + data: payload + }; + return result; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const ortbBids = converter.fromORTB({ + request: bidRequest.data, + response: serverResponse.body + }); + return ortbBids; + }, + /** + * Register User Sync. + */ + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) { + let params = {}; + const syncs = []; + + // Attaching GDPR Consent Params in UserSync url + if (gdprConsent) { + params.gdpr = gdprConsent.gdprApplies ? 1 : 0; + params.gdpr_consent = encodeURIComponent(gdprConsent.consentString || ''); + } + + // CCPA + if (uspConsent) { + params.us_privacy = encodeURIComponent(uspConsent); + } + if (responses && responses.ext) { + const pixels = [{ + urls: responses.ext.fsyncs, + type: 'iframe' + }, { + urls: responses.ext.psyncs, + type: 'image' + }].filter(entry => { + return entry.urls && (entry.type === 'iframe' && syncOptions.iframeEnabled || entry.type === 'image' && syncOptions.pixelEnabled); + }).map(entry => { + return entry.urls.map(endpoint => { + let urlInfo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseUrl)(endpoint); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(urlInfo.search, params); + if (Object.keys(urlInfo.search).length === 0) { + delete urlInfo.search; // empty search object causes buildUrl to add a trailing ? to the url + } + return { + type: entry.type, + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.buildUrl)(urlInfo) + }; + }).reduce((x, y) => x.concat(y), []); + }).reduce((x, y) => x.concat(y), []); + syncs.push(...pixels); + } + return syncs; + } +}; +function getPubcid(bidRequest) { + let pubcid = null; + if (bidRequest.userId && bidRequest.userId.pubcid) { + pubcid = bidRequest.userId.pubcid; + } else if (bidRequest.crumbs && bidRequest.crumbs.pubcid) { + pubcid = bidRequest.crumbs.pubcid; + } + if (!pubcid) { + const pubcidName = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter)('pubcid_name', bidRequest.params) || '_pubcid'; + pubcid = readStoredValue(pubcidName); + } + return pubcid; +} + +/** + * Check if it's a video bid request + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {boolean} True if it's a video bid + */ +function isVideoRequest(bid) { + return bid.mediaType === 'video' || !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.video'); +} + +/** + * Copy property if exists from src to dst + * + * @param {object} src - source object + * @param {object} dst - destination object + * @param {string} dstName - destination property name + */ +function copyOptProperty(src, dst, dstName) { + if (src) { + dst[dstName] = src; + } +} + +/** + * Look for a stored value from both cookie and local storage and return the first value found. + * @param key Key for the search + * @return {string} Stored value + */ +function readStoredValue(key) { + let storedValue; + try { + // check cookies first + storedValue = storage.getCookie(key); + if (!storedValue) { + // check expiration time before reading local storage + const storedValueExp = storage.getDataFromLocalStorage(`${key}_exp`); + if (storedValueExp === '' || storedValueExp && new Date(storedValueExp).getTime() - Date.now() > 0) { + storedValue = storage.getDataFromLocalStorage(key); + storedValue = storedValue ? decodeURIComponent(storedValue) : storedValue; + } + } + + // deserialize JSON if needed + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(storedValue) && storedValue.charAt(0) === '{') { + storedValue = JSON.parse(storedValue); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(e); + } + return storedValue; +} + +/** + * Get the floor price from bid.params for backward compatibility. + * If not found, then check floor module. + * @param bid A valid bid object + * @returns {*|number} floor price + */ +function getBidFloor(bid) { + let floor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter)('bidfloor', bid.params); + if (!floor && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(bid.getFloor)) { + const floorObj = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(floorObj) && !isNaN(floorObj.floor) && floorObj.currency === 'USD') { + floor = floorObj.floor; + } + } + return floor; +} +function makeBidUrl(bid) { + let bidurl = URL; + if (bid.params.white_label_url) { + bidurl = bid.params.white_label_url; + } + return bidurl; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('conversantBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/conversantBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["copper6sspBidAdapter"],{ + +/***/ "./modules/copper6sspBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/copper6sspBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'copper6ssp'; +const AD_URL = 'https://endpoint.copper6.com/pbjs'; +const SYNC_URL = 'https://сsync.copper6.com'; +const GVLID = 1356; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('copper6sspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/copper6sspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cpmstarBidAdapter"],{ + +/***/ "./modules/cpmstarBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/cpmstarBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +const BIDDER_CODE = 'cpmstar'; +const ENDPOINT_DEV = 'https://dev.server.cpmstar.com/view.aspx'; +const ENDPOINT_STAGING = 'https://staging.server.cpmstar.com/view.aspx'; +const ENDPOINT_PRODUCTION = 'https://server.cpmstar.com/view.aspx'; +const DEFAULT_TTL = 300; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + ttl: DEFAULT_TTL, + netRevenue: DEFAULT_NET_REVENUE + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: 1317, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + pageID: Math.floor(Math.random() * 10e6), + getMediaType: function (bidRequest) { + if (bidRequest == null) return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + return !_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](bidRequest, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + }, + getPlayerSize: function (bidRequest) { + var playerSize = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](bidRequest, 'mediaTypes.video.playerSize'); + if (playerSize == null) return [640, 440]; + if (playerSize[0] != null) playerSize = playerSize[0]; + if (playerSize == null || playerSize[0] == null || playerSize[1] == null) return [640, 440]; + return playerSize; + }, + isBidRequestValid: function (bid) { + return typeof bid.params.placementId === 'string' && !!bid.params.placementId.length || typeof bid.params.placementId === 'number'; + }, + buildRequests: function (validBidRequests, bidderRequest) { + var requests = []; + for (var i = 0; i < validBidRequests.length; i++) { + var bidRequest = validBidRequests[i]; + const referer = bidderRequest.refererInfo.page ? bidderRequest.refererInfo.page : bidderRequest.refererInfo.domain; + const e = _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter('endpoint', bidRequest.params); + const ENDPOINT = e == 'dev' ? ENDPOINT_DEV : e == 'staging' ? ENDPOINT_STAGING : ENDPOINT_PRODUCTION; + const url = new URL(ENDPOINT); + const body = {}; + const mediaType = spec.getMediaType(bidRequest); + const playerSize = spec.getPlayerSize(bidRequest); + url.searchParams.set('media', mediaType); + if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + url.searchParams.set('fv', 0); + if (playerSize) { + url.searchParams.set('w', playerSize?.[0]); + url.searchParams.set('h', playerSize?.[1]); + } + } + url.searchParams.set('json', 'c_b'); + url.searchParams.set('mv', 1); + url.searchParams.set('poolid', _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter('placementId', bidRequest.params)); + url.searchParams.set('reachedTop', bidderRequest.refererInfo.reachedTop); + url.searchParams.set('requestid', bidRequest.bidId); + url.searchParams.set('referer', referer); + if (bidRequest.schain && bidRequest.schain.nodes) { + var schain = bidRequest.schain; + var schainString = ''; + schainString += schain.ver + ',' + schain.complete; + for (var i2 = 0; i2 < schain.nodes.length; i2++) { + var node = schain.nodes[i2]; + schainString += '!' + (node.asi || '') + ',' + (node.sid || '') + ',' + (node.hp || '') + ',' + (node.rid || '') + ',' + (node.name || '') + ',' + (node.domain || ''); + } + url.searchParams.set('schain', schainString); + } + if (bidderRequest.gdprConsent) { + if (bidderRequest.gdprConsent.consentString != null) { + url.searchParams.set('gdpr_consent', bidderRequest.gdprConsent.consentString); + } + if (bidderRequest.gdprConsent.gdprApplies != null) { + url.searchParams.set('gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + } + if (bidderRequest.uspConsent != null) { + url.searchParams.set('us_privacy', bidderRequest.uspConsent); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa')) { + url.searchParams.set('tfcd', _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') ? 1 : 0); + } + let adUnitCode = bidRequest.adUnitCode; + if (adUnitCode) { + body.adUnitCode = adUnitCode; + } + if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + body.video = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](bidRequest, 'mediaTypes.video'); + } else if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + body.banner = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"](bidRequest, 'mediaTypes.banner'); + } + const ortb = converter.toORTB({ + bidderRequest, + bidRequests: [bidRequest] + }); + Object.assign(body, ortb); + requests.push({ + method: 'POST', + url: url.toString(), + bidRequest: bidRequest, + data: body + }); + } + return requests; + }, + interpretResponse: function (serverResponse, request) { + var bidRequest = request.bidRequest; + var mediaType = spec.getMediaType(bidRequest); + var bidResponses = []; + if (!Array.isArray(serverResponse.body)) { + serverResponse.body = [serverResponse.body]; + } + for (var i = 0; i < serverResponse.body.length; i++) { + var raw = serverResponse.body[i]; + var rawBid = raw.creatives[0]; + if (!rawBid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn('cpmstarBidAdapter: server response failed check'); + return; + } + var cpm = parseFloat(rawBid.cpm) || 0; + if (!cpm) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn('cpmstarBidAdapter: server response failed check. Missing cpm'); + return; + } + var bidResponse = { + requestId: rawBid.requestid, + cpm: cpm, + width: rawBid.width || 0, + height: rawBid.height || 0, + currency: rawBid.currency ? rawBid.currency : DEFAULT_CURRENCY, + netRevenue: rawBid.netRevenue ? rawBid.netRevenue : DEFAULT_NET_REVENUE, + ttl: rawBid.ttl ? rawBid.ttl : DEFAULT_TTL, + creativeId: rawBid.creativeid || 0, + meta: { + advertiserDomains: rawBid.adomain ? rawBid.adomain : [] + } + }; + if (rawBid.hasOwnProperty('dealId')) { + bidResponse.dealId = rawBid.dealId; + } + if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER && rawBid.code) { + bidResponse.ad = rawBid.code + (rawBid.px_cr ? "\n" : ''); + } else if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO && rawBid.creativemacros && rawBid.creativemacros.HTML5VID_VASTSTRING) { + var playerSize = spec.getPlayerSize(bidRequest); + if (playerSize != null) { + bidResponse.width = playerSize[0]; + bidResponse.height = playerSize[1]; + } + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + bidResponse.vastXml = rawBid.creativemacros.HTML5VID_VASTSTRING; + } else { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError('bad response', rawBid); + } + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (serverResponses.length == 0 || !serverResponses[0].body) return syncs; + var usersyncs = serverResponses[0].body[0].syncs; + if (!usersyncs || usersyncs.length < 0) return syncs; + for (var i = 0; i < usersyncs.length; i++) { + var us = usersyncs[i]; + if (us.type === 'image' && syncOptions.pixelEnabled || us.type == 'iframe' && syncOptions.iframeEnabled) { + syncs.push(us); + } + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('cpmstarBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/cpmstarBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["craftBidAdapter"],{ + +/***/ "./modules/craftBidAdapter.js": +/*!************************************!*\ + !*** ./modules/craftBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/appnexusUtils/anKeywords.js */ "./libraries/appnexusUtils/anKeywords.js"); +/* harmony import */ var _libraries_interpretResponseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/interpretResponseUtils/index.js */ "./libraries/interpretResponseUtils/index.js"); + + + + + + + + + + + +const BIDDER_CODE = 'craft'; +const URL_BASE = 'https://gacraft.jp/prebid-v3'; +const TTL = 360; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + aliases: ['craft'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.sitekey && !!bid.params.placementId && !isAmp(); + }, + buildRequests: function (bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(bidRequests); + const bidRequest = bidRequests[0]; + const tags = bidRequests.map(bidToTag); + const schain = bidRequest.schain; + const payload = { + tags: [...tags], + ua: navigator.userAgent, + sdk: { + version: "9.45.0-pre" + }, + schain: schain + }; + if (bidderRequest) { + if (bidderRequest.gdprConsent) { + payload.gdpr_consent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + } + if (bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest.refererInfo) { + let refererinfo = { + // TODO: this collects everything it finds, except for the canonical URL + rd_ref: bidderRequest.refererInfo.topmostLocation, + rd_top: bidderRequest.refererInfo.reachedTop, + rd_ifs: bidderRequest.refererInfo.numIframes + }; + if (bidderRequest.refererInfo.stack) { + refererinfo.rd_stk = bidderRequest.refererInfo.stack.join(','); + } + payload.referrer_detection = refererinfo; + } + if (bidRequest.userId) { + payload.userId = bidRequest.userId; + } + } + const request = formatRequest(payload, bidderRequest); + return request; + }, + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + try { + const bids = (0,_libraries_interpretResponseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.interpretResponseUtil)(serverResponse, { + bidderRequest + }, serverBid => { + const rtbBid = getRtbBid(serverBid); + if (rtbBid && rtbBid.cpm !== 0 && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)(this.supportedMediaTypes, rtbBid.ad_type)) { + const bid = newBid(serverBid, rtbBid, bidderRequest); + bid.mediaType = parseMediaType(rtbBid); + return bid; + } + }); + return bids; + } catch (e) { + return []; + } + }, + onBidWon: function (bid) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(bid._prebidWon, null, null, { + method: 'POST', + contentType: 'application/json' + }); + } +}; +function formatRequest(payload, bidderRequest) { + let options = {}; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_6__.hasPurpose1Consent)(bidderRequest?.gdprConsent)) { + options = { + withCredentials: false + }; + } + const baseUrl = payload.tags[0].url || URL_BASE; + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: `${baseUrl}/${payload.tags[0].sitekey}`, + data: payloadString, + bidderRequest, + options + }; +} +function newBid(serverBid, rtbBid, bidderRequest) { + const bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.getBidRequest)(serverBid.uuid, [bidderRequest]); + const bid = { + requestId: serverBid.uuid, + cpm: rtbBid.cpm, + currency: 'JPY', + width: rtbBid.rtb.banner.width, + height: rtbBid.rtb.banner.height, + ad: rtbBid.rtb.banner.content, + ttl: TTL, + creativeId: rtbBid.creative_id, + netRevenue: true, + dealId: rtbBid.deal_id, + meta: null, + _adUnitCode: bidRequest.adUnitCode, + _bidKey: serverBid.bid_key, + _prebidWon: serverBid.won_url + }; + return bid; +} +function bidToTag(bid) { + const tag = {}; + for (var k in bid.params) { + tag[k] = bid.params[k]; + } + try { + if (storage.hasLocalStorage()) { + tag.uid = JSON.parse(storage.getDataFromLocalStorage(`${bid.params.sitekey}_uid`)); + } + } catch (e) {} + tag.sizes = bid.sizes; + tag.primary_size = tag.sizes[0]; + tag.ad_types = []; + tag.uuid = bid.bidId; + const keywords = (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_8__.getANKeywordParam)(bid.ortb2, bid.params.keywords); + if (keywords.length) { + tag.keywords = keywords; + } + if (bid.mediaTypes?.banner) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER); + } + if (tag.ad_types.length === 0) { + delete tag.ad_types; + } + return tag; +} +function getRtbBid(tag) { + return tag && tag.ads && tag.ads.length && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(tag.ads, ad => ad.rtb); +} +function parseMediaType(rtbBid) { + const adType = rtbBid.ad_type; + if (adType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } else if (adType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } +} +function isAmp() { + try { + const ampContext = window.context || window.parent.context; + if (ampContext && ampContext.pageViewId) { + return ampContext; + } + return false; + } catch (e) { + return false; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('craftBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","keywords","appnexusUtils","interpretResponseUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/craftBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["criteoBidAdapter"],{ + +/***/ "./modules/criteoBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/criteoBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ADAPTER_VERSION, storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_ortb2_5Translator_translator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortb2.5Translator/translator.js */ "./libraries/ortb2.5Translator/translator.js"); + + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid + */ + +const GVLID = 91; +const ADAPTER_VERSION = 37; +const BIDDER_CODE = 'criteo'; +const CDB_ENDPOINT = 'https://grid-bidder.criteo.com/openrtb_2_5/pbjs/auction/request'; +const PROFILE_ID_INLINE = 207; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const LOG_PREFIX = 'Criteo: '; +const TRANSLATOR = (0,_libraries_ortb2_5Translator_translator_js__WEBPACK_IMPORTED_MODULE_1__.ortb25Translator)(); +const PUBLISHER_TAG_OUTSTREAM_SRC = 'https://static.criteo.net/js/ld/publishertag.renderer.js'; +const OPTOUT_COOKIE_NAME = 'cto_optout'; +const BUNDLE_COOKIE_NAME = 'cto_bundle'; +const GUID_RETENTION_TIME_HOUR = 24 * 30 * 13; // 13 months +const OPTOUT_RETENTION_TIME_HOUR = 5 * 12 * 30 * 24; // 5 years + +/** + * Defines the generic oRTB converter and all customization functions. + */ +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 60 + }, + imp, + request, + bidResponse, + response +}); + +/** + * Builds an impression object for the ORTB 2.5 request. + * + * @param {function} buildImp - The function for building an imp object. + * @param {Object} bidRequest - The bid request object. + * @param {Object} context - The context object. + * @returns {Object} The ORTB 2.5 imp object. + */ +function imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + const params = bidRequest.params; + imp.tagid = bidRequest.adUnitCode; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext', { + ...bidRequest.params.ext, + ...imp.ext, + rwdd: imp.rwdd, + floors: getFloors(bidRequest), + bidder: { + publishersubid: params?.publisherSubId, + zoneid: params?.zoneId, + uid: params?.uid + } + }); + delete imp.rwdd; // oRTB 2.6 field moved to ext + + if (!context.fledgeEnabled && imp.ext.igs?.ae) { + delete imp.ext.igs.ae; + } + if (hasVideoMediaType(bidRequest)) { + const paramsVideo = bidRequest.params.video; + if (paramsVideo !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'video', { + ...imp.video, + skip: imp.video.skip || paramsVideo.skip || 0, + placement: imp.video.placement || paramsVideo.placement, + minduration: imp.video.minduration || paramsVideo.minduration, + playbackmethod: imp.video.playbackmethod || paramsVideo.playbackmethod, + startdelay: imp.video.startdelay || paramsVideo.startdelay || 0 + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'video.ext', { + context: bidRequest.mediaTypes.video.context, + playersizes: parseSizes(bidRequest?.mediaTypes?.video?.playerSize, parseSize), + plcmt: bidRequest.mediaTypes.video.plcmt, + poddur: bidRequest.mediaTypes.video.adPodDurationSec, + rqddurs: bidRequest.mediaTypes.video.durationRangeSec + }); + } + if (imp.native && typeof imp.native.request !== 'undefined') { + let requestNative = JSON.parse(imp.native.request); + + // We remove the native asset requirements if we used the bypass to generate the imp + const hasAssetRequirements = requestNative.assets && (requestNative.assets.length !== 1 || Object.keys(requestNative.assets[0]).length); + if (!hasAssetRequirements) { + delete requestNative.assets; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'native.request_native', requestNative); + delete imp.native.request; + } + return imp; +} + +/** + * Builds a request object for the ORTB 2.5 request. + * + * @param {function} buildRequest - The function for building a request object. + * @param {Array} imps - An array of ORTB 2.5 impression objects. + * @param {Object} bidderRequest - The bidder request object. + * @param {Object} context - The context object. + * @returns {Object} The ORTB 2.5 request object. + */ +function request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + + // params.pubid should override publisher id + if (typeof context.publisherId !== 'undefined') { + if (typeof request.app !== 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'app.publisher.id', context.publisherId); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'site.publisher.id', context.publisherId); + } + } + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'regs.ext.gdprversion', bidderRequest.gdprConsent.apiVersion); + } + + // Translate 2.6 OpenRTB request into 2.5 OpenRTB request + request = TRANSLATOR(request); + return request; +} + +/** + * Build bid from oRTB 2.5 bid. + * + * @param buildBidResponse + * @param bid + * @param context + * @returns {*} + */ +function bidResponse(buildBidResponse, bid, context) { + context.mediaType = bid?.ext?.mediatype; + if (context.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE && typeof bid.adm_native !== 'undefined') { + bid.adm = bid.adm_native; + delete bid.adm_native; + } + let bidResponse = buildBidResponse(bid, context); + const { + bidRequest + } = context; + bidResponse.currency = bid?.ext?.cur; + if (typeof bid?.ext?.meta !== 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidResponse, 'meta', { + ...bidResponse.meta, + ...bid.ext.meta + }); + } + if (typeof bid?.ext?.paf?.content_id !== 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidResponse, 'meta.paf.content_id', bid.ext.paf.content_id); + } + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO) { + bidResponse.vastUrl = bid.ext?.displayurl; + // if outstream video, add a default render for it. + if (bidRequest?.mediaTypes?.video?.context === _src_video_js__WEBPACK_IMPORTED_MODULE_5__.OUTSTREAM) { + bidResponse.renderer = createOutstreamVideoRenderer(bid); + } + } + return bidResponse; +} + +/** + * Builds bid response from the oRTB 2.5 bid response. + * + * @param buildResponse + * @param bidResponses + * @param ortbResponse + * @param context + * @returns * + */ +function response(buildResponse, bidResponses, ortbResponse, context) { + let response = buildResponse(bidResponses, ortbResponse, context); + const pafTransmission = ortbResponse?.ext?.paf?.transmission; + response.bids.forEach(bid => { + if (typeof pafTransmission !== 'undefined' && typeof bid?.meta?.paf?.content_id !== 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'meta.paf.transmission', pafTransmission); + } else { + delete bid.meta.paf; + } + }); + return response; +} + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE], + getUserSyncs: function (syncOptions, _, gdprConsent, uspConsent) { + let gppConsent = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + let { + gppString = '', + applicableSections = [] + } = gppConsent; + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_6__.getRefererInfo)(); + const origin = 'criteoPrebidAdapter'; + if (syncOptions.iframeEnabled && (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__.hasPurpose1Consent)(gdprConsent)) { + const queryParams = []; + queryParams.push(`origin=${origin}`); + queryParams.push(`topUrl=${refererInfo.domain}`); + if (gdprConsent) { + if (gdprConsent.gdprApplies) { + queryParams.push(`gdpr=${gdprConsent.gdprApplies == true ? 1 : 0}`); + } + if (gdprConsent.consentString) { + queryParams.push(`gdpr_consent=${gdprConsent.consentString}`); + } + } + if (uspConsent) { + queryParams.push(`us_privacy=${uspConsent}`); + } + queryParams.push(`gpp=${gppString}`); + if (Array.isArray(applicableSections)) { + for (const applicableSection of applicableSections) { + queryParams.push(`gpp_sid=${applicableSection}`); + } + } + const requestId = Math.random().toString(); + const jsonHash = { + bundle: readFromAllStorages(BUNDLE_COOKIE_NAME), + cw: storage.cookiesAreEnabled(), + lsw: storage.localStorageIsEnabled(), + optoutCookie: readFromAllStorages(OPTOUT_COOKIE_NAME), + origin: origin, + requestId: requestId, + tld: refererInfo.domain, + topUrl: refererInfo.domain, + version: "9.45.0-pre".replace(/\./g, '_') + }; + window.addEventListener('message', function handler(event) { + if (!event.data || event.origin != 'https://gum.criteo.com') { + return; + } + if (event.data.requestId !== requestId) { + return; + } + this.removeEventListener('message', handler); + event.stopImmediatePropagation(); + const response = event.data; + if (response.optout) { + deleteFromAllStorages(BUNDLE_COOKIE_NAME); + saveOnAllStorages(OPTOUT_COOKIE_NAME, true, OPTOUT_RETENTION_TIME_HOUR, refererInfo.domain); + } else { + if (response.bundle) { + saveOnAllStorages(BUNDLE_COOKIE_NAME, response.bundle, GUID_RETENTION_TIME_HOUR, refererInfo.domain); + } + response?.callbacks?.forEach?.(_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.triggerPixel); + } + }, true); + const jsonHashSerialized = JSON.stringify(jsonHash).replace(/"/g, '%22'); + return [{ + type: 'iframe', + url: `https://gum.criteo.com/syncframe?${queryParams.join('&')}#${jsonHashSerialized}` + }]; + } else if (syncOptions.pixelEnabled && (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__.hasPurpose1Consent)(gdprConsent)) { + const queryParams = []; + queryParams.push(`profile=207`); + if (gdprConsent) { + if (gdprConsent.gdprApplies === true) { + queryParams.push(`gdprapplies=true`); + } + if (gdprConsent.consentString) { + queryParams.push(`gdpr=${gdprConsent.consentString}`); + } + } + if (uspConsent) { + queryParams.push(`ccpa=${uspConsent}`); + } + queryParams.push(`gpp=${gppString}`); + if (Array.isArray(applicableSections)) { + for (const applicableSection of applicableSections) { + queryParams.push(`gpp_sid=${applicableSection}`); + } + } + // gpp + // gpp_sid + return [{ + type: 'image', + url: `https://ssp-sync.criteo.com/user-sync/redirect?${queryParams.join('&')}` + }]; + } + return []; + }, + /** + * f + * @param {object} bid + * @return {boolean} + */ + isBidRequestValid: bid => { + // either one of zoneId or networkId should be set + if (!(bid && bid.params && (bid.params.zoneId || bid.params.networkId))) { + return false; + } + + // video media types requires some mandatory params + if (hasVideoMediaType(bid)) { + if (!hasValidVideoMediaType(bid)) { + return false; + } + } + return true; + }, + /** + * @param {BidRequest[]} bidRequests + * @param {*} bidderRequest + * @return {ServerRequest} + */ + buildRequests: (bidRequests, bidderRequest) => { + bidRequests.forEach(bidRequest => { + if (hasNativeMediaType(bidRequest)) { + if (!checkNativeSendId(bidRequest)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logWarn)(LOG_PREFIX + 'all native assets containing URL should be sent as placeholders with sendId(icon, image, clickUrl, displayUrl, privacyLink, privacyIcon)'); + } + + // We support native request without assets requirements because we can fill them later on. + // This is a trick to fool oRTB converter isOpenRTBBidRequestValid(ortb) fn because it needs + // nativeOrtbRequest.assets to be non-empty. + if (bidRequest?.nativeOrtbRequest?.assets == null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logWarn)(LOG_PREFIX + 'native asset requirements are missing'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidRequest, 'nativeOrtbRequest.assets', [{}]); + } + } + }); + const context = buildContext(bidRequests, bidderRequest); + const url = buildCdbUrl(context); + const data = CONVERTER.toORTB({ + bidderRequest, + bidRequests, + context + }); + if (data) { + return { + method: 'POST', + url, + data, + bidRequests + }; + } + }, + /** + * @param {*} response + * @param {ServerRequest} request + * @return {Bid[] | {bids: Bid[], fledgeAuctionConfigs: object[]}} + */ + interpretResponse: (response, request) => { + if (typeof response?.body == 'undefined') { + return []; // no bid + } + const interpretedResponse = CONVERTER.fromORTB({ + response: response.body, + request: request.data + }); + const bids = interpretedResponse.bids || []; + const fledgeAuctionConfigs = response.body?.ext?.igi?.filter(igi => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.isArray)(igi?.igs)).flatMap(igi => igi.igs); + if (fledgeAuctionConfigs?.length) { + return { + bids, + paapi: fledgeAuctionConfigs + }; + } + return bids; + }, + /** + * @param {BidRequest[]} bidRequests + */ + onDataDeletionRequest: bidRequests => { + const id = readFromAllStorages(BUNDLE_COOKIE_NAME); + if (id) { + deleteFromAllStorages(BUNDLE_COOKIE_NAME); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_9__.ajax)('https://privacy.criteo.com/api/privacy/datadeletionrequest', null, JSON.stringify({ + publisherUserId: id + }), { + contentType: 'application/json', + method: 'POST' + }); + } + } +}; +function readFromAllStorages(name) { + const fromCookie = storage.getCookie(name); + const fromLocalStorage = storage.getDataFromLocalStorage(name); + return fromCookie || fromLocalStorage || undefined; +} +function saveOnAllStorages(name, value, expirationTimeHours, domain) { + const date = new Date(); + date.setTime(date.getTime() + expirationTimeHours * 60 * 60 * 1000); + const expires = `expires=${date.toUTCString()}`; + const subDomains = domain.split('.'); + for (let i = 0; i < subDomains.length; ++i) { + // Try to write the cookie on this subdomain (we want it to be stored only on the TLD+1) + const domain = subDomains.slice(subDomains.length - i - 1, subDomains.length).join('.'); + try { + storage.setCookie(name, value, expires, null, '.' + domain); + + // Try to read the cookie to check if we wrote it + const check = storage.getCookie(name); + if (check && check === value) { + break; + } + } catch (error) {} + } + storage.setDataInLocalStorage(name, value); +} +function deleteFromAllStorages(name) { + storage.setCookie(name, '', 0); + storage.removeDataFromLocalStorage(name); +} + +/** + * @param {BidRequest[]} bidRequests + * @param bidderRequest + */ +function buildContext(bidRequests, bidderRequest) { + const queryString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.parseUrl)(bidderRequest?.refererInfo?.topmostLocation).search; + return { + url: bidderRequest?.refererInfo?.page || '', + debug: queryString['pbt_debug'] === '1', + noLog: queryString['pbt_nolog'] === '1', + fledgeEnabled: bidderRequest.paapi?.enabled, + amp: bidRequests.some(bidRequest => bidRequest.params.integrationMode === 'amp'), + networkId: bidRequests.find(bidRequest => bidRequest.params?.networkId)?.params.networkId, + publisherId: bidRequests.find(bidRequest => bidRequest.params?.pubid)?.params.pubid + }; +} + +/** + * @param {Object} context + * @return {string} + */ +function buildCdbUrl(context) { + let url = CDB_ENDPOINT; + url += '?profileId=' + PROFILE_ID_INLINE; + url += '&av=' + String(ADAPTER_VERSION); + url += '&wv=' + encodeURIComponent("9.45.0-pre"); + url += '&cb=' + String(Math.floor(Math.random() * 99999999999)); + if (storage.localStorageIsEnabled()) { + url += '&lsavail=1'; + } else { + url += '&lsavail=0'; + } + if (context.amp) { + url += '&im=1'; + } + if (context.debug) { + url += '&debug=1'; + } + if (context.noLog) { + url += '&nolog=1'; + } + const bundle = readFromAllStorages(BUNDLE_COOKIE_NAME); + if (bundle) { + url += `&bundle=${bundle}`; + } + const optout = readFromAllStorages(OPTOUT_COOKIE_NAME); + if (optout) { + url += `&optout=1`; + } + if (context.networkId) { + url += `&networkId=` + context.networkId; + } + return url; +} +function checkNativeSendId(bidRequest) { + return !(bidRequest.nativeParams && (bidRequest.nativeParams.image && (bidRequest.nativeParams.image.sendId !== true || bidRequest.nativeParams.image.sendTargetingKeys === true) || bidRequest.nativeParams.icon && (bidRequest.nativeParams.icon.sendId !== true || bidRequest.nativeParams.icon.sendTargetingKeys === true) || bidRequest.nativeParams.clickUrl && (bidRequest.nativeParams.clickUrl.sendId !== true || bidRequest.nativeParams.clickUrl.sendTargetingKeys === true) || bidRequest.nativeParams.displayUrl && (bidRequest.nativeParams.displayUrl.sendId !== true || bidRequest.nativeParams.displayUrl.sendTargetingKeys === true) || bidRequest.nativeParams.privacyLink && (bidRequest.nativeParams.privacyLink.sendId !== true || bidRequest.nativeParams.privacyLink.sendTargetingKeys === true) || bidRequest.nativeParams.privacyIcon && (bidRequest.nativeParams.privacyIcon.sendId !== true || bidRequest.nativeParams.privacyIcon.sendTargetingKeys === true))); +} +function parseSizes(sizes) { + let parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : s => s; + if (sizes == undefined) { + return []; + } + if (Array.isArray(sizes[0])) { + // is there several sizes ? (ie. [[728,90],[200,300]]) + return sizes.map(size => parser(size)); + } + return [parser(sizes)]; // or a single one ? (ie. [728,90]) +} +function parseSize(size) { + return size[0] + 'x' + size[1]; +} +function hasVideoMediaType(bidRequest) { + return bidRequest?.mediaTypes?.video !== undefined; +} +function hasNativeMediaType(bidRequest) { + return bidRequest?.mediaTypes?.native !== undefined; +} +function hasValidVideoMediaType(bidRequest) { + let isValid = true; + var requiredMediaTypesParams = ['mimes', 'playerSize', 'maxduration', 'protocols', 'api', 'skip', 'placement', 'playbackmethod']; + requiredMediaTypesParams.forEach(function (param) { + if (param === 'placement') { + if (bidRequest?.mediaTypes?.video?.[param] === undefined && bidRequest?.params?.video?.[param] === undefined && bidRequest?.mediaTypes?.video?.plcmt === undefined && bidRequest?.params?.video?.plcmt === undefined) { + isValid = false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logError)('Criteo Bid Adapter: mediaTypes.video.' + param + ' or mediaTypes.video.plcmt is required'); + } + } else { + if (bidRequest?.mediaTypes?.video?.[param] === undefined && bidRequest?.params?.video?.[param] === undefined) { + isValid = false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logError)('Criteo Bid Adapter: mediaTypes.video.' + param + ' is required'); + } + } + }); + return isValid; +} +function pickAvailableGetFloorFunc(bidRequest) { + if (bidRequest.getFloor) { + return bidRequest.getFloor; + } + if (bidRequest.params.bidFloor && bidRequest.params.bidFloorCur) { + try { + const floor = parseFloat(bidRequest.params.bidFloor); + return () => { + return { + currency: bidRequest.params.bidFloorCur, + floor: floor + }; + }; + } catch {} + } + return undefined; +} +function getFloors(bidRequest) { + try { + const floors = {}; + const getFloor = pickAvailableGetFloorFunc(bidRequest); + if (getFloor) { + if (bidRequest.mediaTypes?.banner) { + floors.banner = {}; + const bannerSizes = parseSizes(bidRequest?.mediaTypes?.banner?.sizes); + bannerSizes.forEach(bannerSize => floors.banner[parseSize(bannerSize).toString()] = getFloor.call(bidRequest, { + size: bannerSize, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER + })); + } + if (bidRequest.mediaTypes?.video) { + floors.video = {}; + const videoSizes = parseSizes(bidRequest?.mediaTypes?.video?.playerSize); + videoSizes.forEach(videoSize => floors.video[parseSize(videoSize).toString()] = getFloor.call(bidRequest, { + size: videoSize, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO + })); + } + if (bidRequest.mediaTypes?.native) { + floors.native = {}; + floors.native['*'] = getFloor.call(bidRequest, { + size: '*', + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE + }); + } + return floors; + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logError)('Could not parse floors from Prebid: ' + e); + } +} +function createOutstreamVideoRenderer(bid) { + if (bid.ext?.videoPlayerConfig === undefined || bid.ext?.videoPlayerType === undefined) { + return undefined; + } + const config = { + documentResolver: (_, sourceDocument, renderDocument) => { + return renderDocument ?? sourceDocument; + } + }; + const render = (_, renderDocument) => { + let payload = { + slotid: bid.id, + vastUrl: bid.ext?.displayurl, + vastXml: bid.adm, + documentContext: renderDocument + }; + let outstreamConfig = bid.ext.videoPlayerConfig; + window.CriteoOutStream[bid.ext.videoPlayerType].play(payload, outstreamConfig); + }; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_10__.Renderer.install({ + url: PUBLISHER_TAG_OUTSTREAM_SRC, + config: config + }); + renderer.setRender(render); + return renderer; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('criteoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","ortb2.5Translator","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/criteoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["criteoIdSystem"],{ + +/***/ "./modules/criteoIdSystem.js": +/*!***********************************!*\ + !*** ./modules/criteoIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, criteoIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); + +/** + * This module adds Criteo Real Time User Sync to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/criteoIdSystem + * @requires module:modules/userId + */ + + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + */ + +const gvlid = 91; +const bidderCode = 'criteo'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: bidderCode +}); +const bididStorageKey = 'cto_bidid'; +const bundleStorageKey = 'cto_bundle'; +const dnaBundleStorageKey = 'cto_dna_bundle'; +const cookiesMaxAge = 13 * 30 * 24 * 60 * 60 * 1000; +const STORAGE_TYPE_LOCALSTORAGE = 'html5'; +const STORAGE_TYPE_COOKIES = 'cookie'; +const pastDateString = new Date(0).toString(); +const expirationString = new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + cookiesMaxAge).toString(); +function extractProtocolHost(url) { + let returnOnlyHost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + const parsedUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(url, { + noDecodeWholeURL: true + }); + return returnOnlyHost ? `${parsedUrl.hostname}` : `${parsedUrl.protocol}://${parsedUrl.hostname}${parsedUrl.port ? ':' + parsedUrl.port : ''}/`; +} +function getFromStorage(submoduleConfig, key) { + if (submoduleConfig?.storage?.type === STORAGE_TYPE_LOCALSTORAGE) { + return storage.getDataFromLocalStorage(key); + } else if (submoduleConfig?.storage?.type === STORAGE_TYPE_COOKIES) { + return storage.getCookie(key); + } + return storage.getCookie(key) || storage.getDataFromLocalStorage(key); +} +function saveOnStorage(submoduleConfig, key, value, hostname) { + if (key && value) { + if (submoduleConfig?.storage?.type === STORAGE_TYPE_LOCALSTORAGE) { + storage.setDataInLocalStorage(key, value); + } else if (submoduleConfig?.storage?.type === STORAGE_TYPE_COOKIES) { + setCookieOnAllDomains(key, value, expirationString, hostname, true); + } else { + storage.setDataInLocalStorage(key, value); + setCookieOnAllDomains(key, value, expirationString, hostname, true); + } + } +} +function setCookieOnAllDomains(key, value, expiration, hostname, stopOnSuccess) { + const subDomains = hostname.split('.'); + for (let i = 0; i < subDomains.length; ++i) { + // Try to write the cookie on this subdomain (we want it to be stored only on the TLD+1) + const domain = subDomains.slice(subDomains.length - i - 1, subDomains.length).join('.'); + try { + storage.setCookie(key, value, expiration, null, '.' + domain); + if (stopOnSuccess) { + // Try to read the cookie to check if we wrote it + const ck = storage.getCookie(key); + if (ck && ck === value) { + break; + } + } + } catch (error) {} + } +} +function deleteFromAllStorages(key, hostname) { + setCookieOnAllDomains(key, '', pastDateString, hostname, true); + storage.removeDataFromLocalStorage(key); +} +function getCriteoDataFromStorage(submoduleConfig) { + return { + bundle: getFromStorage(submoduleConfig, bundleStorageKey), + dnaBundle: getFromStorage(submoduleConfig, dnaBundleStorageKey), + bidId: getFromStorage(submoduleConfig, bididStorageKey) + }; +} +function buildCriteoUsersyncUrl(topUrl, domain, bundle, dnaBundle, areCookiesWriteable, isLocalStorageWritable, isPublishertagPresent) { + let url = 'https://gum.criteo.com/sid/json?origin=prebid' + `${topUrl ? '&topUrl=' + encodeURIComponent(topUrl) : ''}` + `${domain ? '&domain=' + encodeURIComponent(domain) : ''}` + `${bundle ? '&bundle=' + encodeURIComponent(bundle) : ''}` + `${dnaBundle ? '&info=' + encodeURIComponent(dnaBundle) : ''}` + `${areCookiesWriteable ? '&cw=1' : ''}` + `${isPublishertagPresent ? '&pbt=1' : ''}` + `${isLocalStorageWritable ? '&lsw=1' : ''}`; + const usPrivacyString = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.uspDataHandler.getConsentData(); + if (usPrivacyString) { + url = url + `&us_privacy=${encodeURIComponent(usPrivacyString)}`; + } + const gdprConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.gdprDataHandler.getConsentData(); + if (gdprConsent) { + url = url + `${gdprConsent.consentString ? '&gdprString=' + encodeURIComponent(gdprConsent.consentString) : ''}`; + url = url + `&gdpr=${gdprConsent.gdprApplies === true ? 1 : 0}`; + } + const gppConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__.gppDataHandler.getConsentData(); + if (gppConsent) { + url = url + `${gppConsent.gppString ? '&gpp=' + encodeURIComponent(gppConsent.gppString) : ''}`; + url = url + `${gppConsent.applicableSections ? '&gpp_sid=' + encodeURIComponent(gppConsent.applicableSections) : ''}`; + } + return url; +} +function callSyncPixel(submoduleConfig, domain, pixel) { + if (pixel.writeBundleInStorage && pixel.bundlePropertyName && pixel.storageKeyName) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(pixel.pixelUrl, { + success: response => { + if (response) { + const jsonResponse = JSON.parse(response); + if (jsonResponse && jsonResponse[pixel.bundlePropertyName]) { + saveOnStorage(submoduleConfig, pixel.storageKeyName, jsonResponse[pixel.bundlePropertyName], domain); + } + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`criteoIdSystem: unable to sync user id`, error); + } + }, undefined, { + method: 'GET', + withCredentials: true + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(pixel.pixelUrl); + } +} +function callCriteoUserSync(submoduleConfig, parsedCriteoData, callback) { + const cw = (submoduleConfig?.storage?.type === undefined || submoduleConfig?.storage?.type === STORAGE_TYPE_COOKIES) && storage.cookiesAreEnabled(); + const lsw = (submoduleConfig?.storage?.type === undefined || submoduleConfig?.storage?.type === STORAGE_TYPE_LOCALSTORAGE) && storage.localStorageIsEnabled(); + const topUrl = extractProtocolHost((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)().page); + // TODO: should domain really be extracted from the current frame? + const domain = extractProtocolHost(document.location.href, true); + const isPublishertagPresent = typeof criteo_pubtag !== 'undefined'; // eslint-disable-line camelcase + + const url = buildCriteoUsersyncUrl(topUrl, domain, parsedCriteoData.bundle, parsedCriteoData.dnaBundle, cw, lsw, isPublishertagPresent); + const callbacks = { + success: response => { + const jsonResponse = JSON.parse(response); + if (jsonResponse.pixels) { + jsonResponse.pixels.forEach(pixel => callSyncPixel(submoduleConfig, domain, pixel)); + } + if (jsonResponse.acwsUrl) { + const urlsToCall = typeof jsonResponse.acwsUrl === 'string' ? [jsonResponse.acwsUrl] : jsonResponse.acwsUrl; + urlsToCall.forEach(url => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(url)); + } else if (jsonResponse.bundle) { + saveOnStorage(submoduleConfig, bundleStorageKey, jsonResponse.bundle, domain); + } + if (jsonResponse.bidId) { + saveOnStorage(submoduleConfig, bididStorageKey, jsonResponse.bidId, domain); + const criteoId = { + criteoId: jsonResponse.bidId + }; + callback(criteoId); + } else { + deleteFromAllStorages(bididStorageKey, domain); + callback(); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`criteoIdSystem: unable to sync user id`, error); + callback(); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, callbacks, undefined, { + method: 'GET', + contentType: 'application/json', + withCredentials: true + }); +} + +/** @type {Submodule} */ +const criteoIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: bidderCode, + gvlid: gvlid, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{criteoId: string} | undefined} + */ + decode(bidId) { + return bidId; + }, + /** + * get the Criteo Id from local storages and initiate a new user sync + * @function + * @param {SubmoduleConfig} [submoduleConfig] + * @returns {{id: {criteoId: string} | undefined}}} + */ + getId(submoduleConfig) { + let localData = getCriteoDataFromStorage(submoduleConfig); + const result = callback => callCriteoUserSync(submoduleConfig, localData, callback); + return { + id: localData.bidId ? { + criteoId: localData.bidId + } : undefined, + callback: result + }; + }, + eids: { + 'criteoId': { + source: 'criteo.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('userId', criteoIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('criteoIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/criteoIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["currency"],{ + +/***/ "./modules/currency.js": +/*!*****************************!*\ + !*** ./modules/currency.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports currencySupportEnabled, currencyRates, responseReady, setConfig, resetCurrency, addBidResponseHook, setOrtbCurrency, requestBidsHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/fpd/enrichment.js */ "./src/fpd/enrichment.js"); +/* harmony import */ var _libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/timeoutQueue/timeoutQueue.js */ "./libraries/timeoutQueue/timeoutQueue.js"); + + + + + + + + + + + + + +const DEFAULT_CURRENCY_RATE_URL = 'https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json?date=$$TODAY$$'; +const CURRENCY_RATE_PRECISION = 4; +const MODULE_NAME = 'currency'; +let ratesURL; +let bidResponseQueue = []; +let conversionCache = {}; +let currencyRatesLoaded = false; +let needToCallForCurrencyFile = true; +let adServerCurrency = 'USD'; +var currencySupportEnabled = false; +var currencyRates = {}; +let bidderCurrencyDefault = {}; +let defaultRates; +let responseReady = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.defer)(); +const delayedAuctions = (0,_libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__.timeoutQueue)(); +let auctionDelay = 0; + +/** + * Configuration function for currency + * @param {object} config + * @param {string} [config.adServerCurrency = 'USD'] + * ISO 4217 3-letter currency code that represents the target currency. (e.g. 'EUR'). If this value is present, + * the currency conversion feature is activated. + * @param {number} [config.granularityMultiplier = 1] + * A decimal value representing how mcuh to scale the price granularity calculations. + * @param {object} config.bidderCurrencyDefault + * An optional argument to specify bid currencies for bid adapters. This option is provided for the transitional phase + * before every bid adapter will specify its own bid currency. If the adapter specifies a bid currency, this value is + * ignored for that bidder. + * + * example: + * { + * rubicon: 'USD' + * } + * @param {string} [config.conversionRateFile = 'URL pointing to conversion file'] + * Optional path to a file containing currency conversion data. Prebid.org hosts a file that is used as the default, + * if not specified. + * @param {object} [config.rates] + * This optional argument allows you to specify the rates with a JSON object, subverting the need for a external + * config.conversionRateFile parameter. If this argument is specified, the conversion rate file will not be loaded. + * + * example: + * { + * 'GBP': { 'CNY': 8.8282, 'JPY': 141.7, 'USD': 1.2824 }, + * 'USD': { 'CNY': 6.8842, 'GBP': 0.7798, 'JPY': 110.49 } + * } + * @param {object} [config.defaultRates] + * This optional currency rates definition follows the same format as config.rates, however it is only utilized if + * there is an error loading the config.conversionRateFile. + */ +function setConfig(config) { + ratesURL = DEFAULT_CURRENCY_RATE_URL; + if (config.rates !== null && typeof config.rates === 'object') { + currencyRates.conversions = config.rates; + currencyRatesLoaded = true; + needToCallForCurrencyFile = false; // don't call if rates are already specified + } + if (config.defaultRates !== null && typeof config.defaultRates === 'object') { + defaultRates = config.defaultRates; + + // set up the default rates to be used if the rate file doesn't get loaded in time + currencyRates.conversions = defaultRates; + currencyRatesLoaded = true; + } + if (typeof config.adServerCurrency === 'string') { + auctionDelay = config.auctionDelay; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('enabling currency support', arguments); + adServerCurrency = config.adServerCurrency; + if (config.conversionRateFile) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('currency using override conversionRateFile:', config.conversionRateFile); + ratesURL = config.conversionRateFile; + } + + // see if the url contains a date macro + // this is a workaround to the fact that jsdelivr doesn't currently support setting a 24-hour HTTP cache header + // So this is an approach to let the browser cache a copy of the file each day + // We should remove the macro once the CDN support a day-level HTTP cache setting + const macroLocation = ratesURL.indexOf('$$TODAY$$'); + if (macroLocation !== -1) { + // get the date to resolve the macro + const d = new Date(); + let month = `${d.getMonth() + 1}`; + let day = `${d.getDate()}`; + if (month.length < 2) month = `0${month}`; + if (day.length < 2) day = `0${day}`; + const todaysDate = `${d.getFullYear()}${month}${day}`; + + // replace $$TODAY$$ with todaysDate + ratesURL = `${ratesURL.substring(0, macroLocation)}${todaysDate}${ratesURL.substring(macroLocation + 9, ratesURL.length)}`; + } + initCurrency(); + } else { + // currency support is disabled, setting defaults + auctionDelay = 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('disabling currency support'); + resetCurrency(); + } + if (typeof config.bidderCurrencyDefault === 'object') { + bidderCurrencyDefault = config.bidderCurrencyDefault; + } +} +_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('currency', config => setConfig(config.currency)); +function errorSettingsRates(msg) { + if (defaultRates) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(msg); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Currency failed loading rates, falling back to currency.defaultRates'); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(msg); + } +} +function loadRates() { + if (needToCallForCurrencyFile) { + needToCallForCurrencyFile = false; + currencyRatesLoaded = false; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(ratesURL, { + success: function (response) { + try { + currencyRates = JSON.parse(response); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('currencyRates set to ' + JSON.stringify(currencyRates)); + conversionCache = {}; + currencyRatesLoaded = true; + processBidResponseQueue(); + delayedAuctions.resume(); + } catch (e) { + errorSettingsRates('Failed to parse currencyRates response: ' + response); + } + }, + error: function () { + errorSettingsRates(...arguments); + currencyRatesLoaded = true; + processBidResponseQueue(); + delayedAuctions.resume(); + needToCallForCurrencyFile = true; + } + }); + } else { + processBidResponseQueue(); + } +} +function initCurrency() { + conversionCache = {}; + if (!currencySupportEnabled) { + currencySupportEnabled = true; + // Adding conversion function to prebid global for external module and on page use + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)().convertCurrency = (cpm, fromCurrency, toCurrency) => parseFloat(cpm) * getCurrencyConversion(fromCurrency, toCurrency); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('addBidResponse').before(addBidResponseHook, 100); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('responsesReady').before(responsesReadyHook); + _src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_7__.enrichFPD.before(enrichFPDHook); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('requestBids').before(requestBidsHook, 50); + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_8__.on)(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.EVENTS.AUCTION_TIMEOUT, rejectOnAuctionTimeout); + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_8__.on)(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.EVENTS.AUCTION_INIT, loadRates); + loadRates(); + } +} +function resetCurrency() { + if (currencySupportEnabled) { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('addBidResponse').getHooks({ + hook: addBidResponseHook + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('responsesReady').getHooks({ + hook: responsesReadyHook + }).remove(); + _src_fpd_enrichment_js__WEBPACK_IMPORTED_MODULE_7__.enrichFPD.getHooks({ + hook: enrichFPDHook + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('requestBids').getHooks({ + hook: requestBidsHook + }).remove(); + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_8__.off)(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.EVENTS.AUCTION_TIMEOUT, rejectOnAuctionTimeout); + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_8__.off)(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.EVENTS.AUCTION_INIT, loadRates); + delete (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)().convertCurrency; + adServerCurrency = 'USD'; + conversionCache = {}; + currencySupportEnabled = false; + currencyRatesLoaded = false; + needToCallForCurrencyFile = true; + currencyRates = {}; + bidderCurrencyDefault = {}; + responseReady = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_0__.defer)(); + } +} +function responsesReadyHook(next, ready) { + next(ready.then(() => responseReady.promise)); +} +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_10__.timedBidResponseHook)('currency', function addBidResponseHook(fn, adUnitCode, bid, reject) { + if (!bid) { + return fn.call(this, adUnitCode, bid, reject); // if no bid, call original and let it display warnings + } + let bidder = bid.bidderCode || bid.bidder; + if (bidderCurrencyDefault[bidder]) { + let currencyDefault = bidderCurrencyDefault[bidder]; + if (bid.currency && currencyDefault !== bid.currency) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`Currency default '${bidder}: ${currencyDefault}' ignored. adapter specified '${bid.currency}'`); + } else { + bid.currency = currencyDefault; + } + } + + // default to USD if currency not set + if (!bid.currency) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Currency not specified on bid. Defaulted to "USD"'); + bid.currency = 'USD'; + } + + // used for analytics + bid.getCpmInNewCurrency = function (toCurrency) { + return (parseFloat(this.cpm) * getCurrencyConversion(this.currency, toCurrency)).toFixed(3); + }; + + // execute immediately if the bid is already in the desired currency + if (bid.currency === adServerCurrency) { + return fn.call(this, adUnitCode, bid, reject); + } + bidResponseQueue.push([fn, this, adUnitCode, bid, reject]); + if (!currencySupportEnabled || currencyRatesLoaded) { + processBidResponseQueue(); + } +}); +function rejectOnAuctionTimeout(_ref) { + let { + auctionId + } = _ref; + bidResponseQueue = bidResponseQueue.filter(_ref2 => { + let [fn, ctx, adUnitCode, bid, reject] = _ref2; + if (bid.auctionId === auctionId) { + reject(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.REJECTION_REASON.CANNOT_CONVERT_CURRENCY); + } else { + return true; + } + }); +} +function processBidResponseQueue() { + while (bidResponseQueue.length > 0) { + const [fn, ctx, adUnitCode, bid, reject] = bidResponseQueue.shift(); + if (bid !== undefined && 'currency' in bid && 'cpm' in bid) { + let fromCurrency = bid.currency; + try { + let conversion = getCurrencyConversion(fromCurrency); + if (conversion !== 1) { + bid.cpm = (parseFloat(bid.cpm) * conversion).toFixed(4); + bid.currency = adServerCurrency; + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('getCurrencyConversion threw error: ', e); + reject(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.REJECTION_REASON.CANNOT_CONVERT_CURRENCY); + continue; + } + } + fn.call(ctx, adUnitCode, bid, reject); + } + responseReady.resolve(); +} +function getCurrencyConversion(fromCurrency) { + let toCurrency = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : adServerCurrency; + var conversionRate = null; + var rates; + let cacheKey = `${fromCurrency}->${toCurrency}`; + if (cacheKey in conversionCache) { + conversionRate = conversionCache[cacheKey]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Using conversionCache value ' + conversionRate + ' for ' + cacheKey); + } else if (currencySupportEnabled === false) { + if (fromCurrency === 'USD') { + conversionRate = 1; + } else { + throw new Error('Prebid currency support has not been enabled and fromCurrency is not USD'); + } + } else if (fromCurrency === toCurrency) { + conversionRate = 1; + } else { + if (fromCurrency in currencyRates.conversions) { + // using direct conversion rate from fromCurrency to toCurrency + rates = currencyRates.conversions[fromCurrency]; + if (!(toCurrency in rates)) { + // bid should fail, currency is not supported + throw new Error('Specified adServerCurrency in config \'' + toCurrency + '\' not found in the currency rates file'); + } + conversionRate = rates[toCurrency]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getCurrencyConversion using direct ' + fromCurrency + ' to ' + toCurrency + ' conversionRate ' + conversionRate); + } else if (toCurrency in currencyRates.conversions) { + // using reciprocal of conversion rate from toCurrency to fromCurrency + rates = currencyRates.conversions[toCurrency]; + if (!(fromCurrency in rates)) { + // bid should fail, currency is not supported + throw new Error('Specified fromCurrency \'' + fromCurrency + '\' not found in the currency rates file'); + } + conversionRate = roundFloat(1 / rates[fromCurrency], CURRENCY_RATE_PRECISION); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getCurrencyConversion using reciprocal ' + fromCurrency + ' to ' + toCurrency + ' conversionRate ' + conversionRate); + } else { + // first defined currency base used as intermediary + var anyBaseCurrency = Object.keys(currencyRates.conversions)[0]; + if (!(fromCurrency in currencyRates.conversions[anyBaseCurrency])) { + // bid should fail, currency is not supported + throw new Error('Specified fromCurrency \'' + fromCurrency + '\' not found in the currency rates file'); + } + var toIntermediateConversionRate = 1 / currencyRates.conversions[anyBaseCurrency][fromCurrency]; + if (!(toCurrency in currencyRates.conversions[anyBaseCurrency])) { + // bid should fail, currency is not supported + throw new Error('Specified adServerCurrency in config \'' + toCurrency + '\' not found in the currency rates file'); + } + var fromIntermediateConversionRate = currencyRates.conversions[anyBaseCurrency][toCurrency]; + conversionRate = roundFloat(toIntermediateConversionRate * fromIntermediateConversionRate, CURRENCY_RATE_PRECISION); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getCurrencyConversion using intermediate ' + fromCurrency + ' thru ' + anyBaseCurrency + ' to ' + toCurrency + ' conversionRate ' + conversionRate); + } + } + if (!(cacheKey in conversionCache)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Adding conversionCache value ' + conversionRate + ' for ' + cacheKey); + conversionCache[cacheKey] = conversionRate; + } + return conversionRate; +} +function roundFloat(num, dec) { + var d = 1; + for (let i = 0; i < dec; i++) { + d += '0'; + } + return Math.round(num * d) / d; +} +function setOrtbCurrency(ortbRequest, bidderRequest, context) { + if (currencySupportEnabled) { + ortbRequest.cur = ortbRequest.cur || [context.currency || adServerCurrency]; + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_11__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_11__.REQUEST, + name: 'currency', + fn: setOrtbCurrency +}); +function enrichFPDHook(next, fpd) { + return next(fpd.then(ortb2 => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_12__.dset)(ortb2, 'ext.prebid.adServerCurrency', adServerCurrency); + return ortb2; + })); +} +const requestBidsHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_10__.timedAuctionHook)('currency', function requestBidsHook(fn, reqBidsConfigObj) { + const continueAuction = (that => () => fn.call(that, reqBidsConfigObj))(this); + if (!currencyRatesLoaded && auctionDelay > 0) { + delayedAuctions.submit(auctionDelay, continueAuction, () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Fetch attempt did not return in time for auction ${reqBidsConfigObj.auctionId}`); + continueAuction(); + }); + } else { + continueAuction(); + } +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('currency'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","timeoutQueue","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/currency.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["cwireBidAdapter"],{ + +/***/ "./modules/cwireBidAdapter.js": +/*!************************************!*\ + !*** ./modules/cwireBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BID_ENDPOINT, EVENT_ENDPOINT, GVL_ID, pageViewId, storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +// ------------------------------------ +const BIDDER_CODE = 'cwire'; +const CWID_KEY = 'cw_cwid'; +const BID_ENDPOINT = 'https://prebid.cwi.re/v1/bid'; +const EVENT_ENDPOINT = 'https://prebid.cwi.re/v1/event'; +const GVL_ID = 1081; + +/** + * Allows limiting ad impressions per site render. Unique per prebid instance ID. + */ +const pageViewId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); + +/** + * Retrieve dimensions and CSS max height/width from a given slot and attach the properties to the bidRequest. + * @param bid + * @returns {*&{cwExt: {dimensions: {width: number, height: number}, style: {maxWidth: number, maxHeight: number}}}} + */ +function slotDimensions(bid) { + let adUnitCode = bid.adUnitCode; + let slotEl = document.getElementById(adUnitCode); + if (slotEl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Slot element found: ${adUnitCode}`); + const slotW = slotEl.offsetWidth; + const slotH = slotEl.offsetHeight; + const cssMaxW = slotEl.style?.maxWidth; + const cssMaxH = slotEl.style?.maxHeight; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Slot dimensions (w/h): ${slotW} / ${slotH}`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Slot Styles (maxW/maxH): ${cssMaxW} / ${cssMaxH}`); + bid = { + ...bid, + cwExt: { + dimensions: { + width: slotW, + height: slotH + }, + style: { + ...(cssMaxW && { + maxWidth: cssMaxW + }), + ...(cssMaxH && { + maxHeight: cssMaxH + }) + } + } + }; + } + return bid; +} + +/** + * Extracts feature flags from a comma-separated url parameter `cwfeatures`. + * + * @returns *[] + */ +function getFeatureFlags() { + let ffParam = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)('cwfeatures'); + if (ffParam) { + return ffParam.split(','); + } + return []; +} +function getRefGroups() { + const groups = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)('cwgroups'); + if (groups) { + return groups.split(','); + } + return []; +} + +/** + * Reads the CWID from local storage. + */ +function getCwid() { + return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(CWID_KEY) : null; +} +function hasCwid() { + return storage.localStorageIsEnabled() && storage.getDataFromLocalStorage(CWID_KEY); +} + +/** + * Store the CWID to local storage. + */ +function updateCwid(cwid) { + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(CWID_KEY, cwid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Could not set CWID ${cwid} in localstorage`); + } +} + +/** + * Extract and collect cwire specific extensions. + */ +function getCwExtension() { + const cwId = getCwid(); + const cwCreative = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)('cwcreative'); + const cwGroups = getRefGroups(); + const cwFeatures = getFeatureFlags(); + // Enable debug flag by passing ?cwdebug=true as url parameter. + // Note: pbjs_debug=true enables it on prebid level + // More info: https://docs.prebid.org/troubleshooting/troubleshooting-guide.html#turn-on-prebidjs-debug-messages + const debug = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)('cwdebug'); + return { + ...(cwId && { + cwid: cwId + }), + ...(cwGroups.length > 0 && { + refgroups: cwGroups + }), + ...(cwFeatures.length > 0 && { + featureFlags: cwFeatures + }), + ...(cwCreative && { + cwcreative: cwCreative + }), + ...(debug && { + debug: true + }) + }; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + /** + * Determines whether the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (!bid.params?.domainId || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.params.domainId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('domainId not provided or not a number'); + if (!bid.params?.placementId || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.params.placementId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('placementId not provided or not a number'); + return false; + } + if (!bid.params?.pageId || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.params.pageId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('pageId not provided or not a number'); + return false; + } + return true; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests An array of bids. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // There are more fields on the refererInfo object + let referrer = bidderRequest?.refererInfo?.page; + + // process bid requests + let processed = validBidRequests.map(bid => slotDimensions(bid)) + // Flattens the pageId, domainId and placement Id for backwards compatibility. + .map(bid => ({ + ...bid, + pageId: bid.params?.pageId, + domainId: bid.params?.domainId, + placementId: bid.params?.placementId + })); + const extensions = getCwExtension(); + const payload = { + slots: processed, + httpRef: referrer, + // TODO: Verify whether the auctionId and the usage of pageViewId make sense. + pageViewId: pageViewId, + sdk: { + version: "9.45.0-pre" + }, + ...extensions + }; + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: BID_ENDPOINT, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!hasCwid()) { + const cwid = serverResponse.body?.cwid; + if (cwid) { + updateCwid(cwid); + } + } + + // Rename `html` response property to `ad` as used by prebid. + const bids = serverResponse.body?.bids.map(_ref => { + let { + html, + ...rest + } = _ref; + return { + ...rest, + ad: html + }; + }); + return bids || []; + }, + onBidWon: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Bid won.`); + const event = { + type: 'BID_WON', + payload: { + bid: bid + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.sendBeacon)(EVENT_ENDPOINT, JSON.stringify(event)); + }, + onBidderError: function (error, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Bidder error: ${error}`); + const event = { + type: 'BID_ERROR', + payload: { + error: error, + bidderRequest: bidderRequest + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.sendBeacon)(EVENT_ENDPOINT, JSON.stringify(event)); + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Collecting user-syncs: ', JSON.stringify({ + syncOptions, + gdprConsent, + uspConsent, + serverResponses + })); + const syncs = []; + if ((0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__.hasPurpose1Consent)(gdprConsent)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('GDPR purpose 1 consent was given, adding user-syncs'); + let type = syncOptions.pixelEnabled ? 'image' : null ?? syncOptions.iframeEnabled ? 'iframe' : null; + if (type) { + syncs.push({ + type: type, + url: 'https://ib.adnxs.com/getuid?https://prebid.cwi.re/v1/cookiesync?xandrId=$UID' + }); + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Collected user-syncs: ', JSON.stringify({ + syncs + })); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('cwireBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/cwireBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["czechAdIdSystem"],{ + +/***/ "./modules/czechAdIdSystem.js": +/*!************************************!*\ + !*** ./modules/czechAdIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, czechAdIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds 'caid' to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/czechAdIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +// Returns StorageManager +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: 'czechAdId' +}); + +// Returns the id string from either cookie or localstorage +const readId = () => { + return storage.getCookie('czaid') || storage.getDataFromLocalStorage('czaid'); +}; + +/** @type {Submodule} */ +const czechAdIdSubmodule = { + version: '0.1.0', + /** + * used to link submodule with config + * @type {string} + */ + name: 'czechAdId', + /** + * Vendor ID of Czech Publisher Exchange + * @type {Number} + */ + gvlid: 570, + /** + * decode the stored id value for passing to bid requests + * @function decode + * @returns {(Object|undefined)} + */ + decode() { + return { + czechAdId: readId() + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @returns {IdResponse|undefined} + */ + getId() { + const id = readId(); + return id ? { + id: id + } : undefined; + }, + eids: { + 'czechAdId': { + source: 'czechadid.cz', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', czechAdIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('czechAdIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/czechAdIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dacIdSystem"],{ + +/***/ "./modules/dacIdSystem.js": +/*!********************************!*\ + !*** ./modules/dacIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, FUUID_COOKIE_NAME, AONEID_COOKIE_NAME, API_URL, dacIdSystemSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds dacId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/dacIdSystem + * @requires module:modules/userId + */ + + + + + + +const MODULE_NAME = 'dacId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const FUUID_COOKIE_NAME = '_a1_f'; +const AONEID_COOKIE_NAME = '_a1_d'; +const API_URL = 'https://penta.a.one.impact-ad.jp/aud'; +const COOKIES_EXPIRES = 60 * 60 * 24 * 1000; // 24h +const LOG_PREFIX = 'User ID - dacId submodule: '; + +/** + * @returns {{fuuid: string, uid: string}} - + */ +function getCookieId() { + return { + fuuid: storage.getCookie(FUUID_COOKIE_NAME), + uid: storage.getCookie(AONEID_COOKIE_NAME) + }; +} + +/** + * set uid to cookie. + * @param {string} uid - + * @returns {void} - + */ +function setAoneidToCookie(uid) { + if (uid) { + const expires = new Date(Date.now() + COOKIES_EXPIRES).toUTCString(); + storage.setCookie(AONEID_COOKIE_NAME, uid, expires, 'none'); + } +} + +/** + * @param {string} oid - + * @param {string} fuuid - + * @returns {string} - + */ +function getApiUrl(oid, fuuid) { + return `${API_URL}?oid=${oid}&fu=${fuuid}`; +} + +/** + * @param {string} oid - + * @param {string} fuuid - + * @returns {{callback: function}} - + */ +function fetchAoneId(oid, fuuid) { + return { + callback: callback => { + const ret = { + fuuid, + uid: undefined + }; + const callbacks = { + success: response => { + if (response) { + try { + const responseObj = JSON.parse(response); + if (responseObj.error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_PREFIX + 'There is no permission to use API: ' + responseObj.error); + return callback(ret); + } + if (!responseObj.uid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_PREFIX + 'AoneId is null'); + return callback(ret); + } + ret.uid = responseObj.uid; + setAoneidToCookie(ret.uid); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + error); + } + } + callback(ret); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + error); + callback(ret); + } + }; + const apiUrl = getApiUrl(oid, fuuid); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(apiUrl, callbacks, undefined, { + method: 'GET', + withCredentials: true + }); + } + }; +} +const dacIdSystemSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @param { {fuuid: string, uid: string} } id + * @returns { {dacId: {fuuid: string, dacId: string} } | undefined } + */ + decode(id) { + if (id && typeof id === 'object') { + return { + dacId: { + fuuid: id.fuuid, + id: id.uid + } + }; + } + }, + /** + * performs action to obtain id + * @function + * @returns { {id: {fuuid: string, uid: string}} | undefined } + */ + getId(config) { + const cookie = getCookieId(); + if (!cookie.fuuid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'There is no fuuid in cookie'); + return undefined; + } + if (cookie.fuuid && cookie.uid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'There is fuuid and AoneId in cookie'); + return { + id: { + fuuid: cookie.fuuid, + uid: cookie.uid + } + }; + } + const configParams = config && config.params || {}; + if (!configParams || typeof configParams.oid !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_PREFIX + 'oid is not defined'); + return { + id: { + fuuid: cookie.fuuid, + uid: undefined + } + }; + } + return fetchAoneId(configParams.oid, cookie.fuuid); + }, + eids: { + 'dacId': { + source: 'impact-ad.jp', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', dacIdSystemSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('dacIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dacIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dailyhuntBidAdapter"],{ + +/***/ "./modules/dailyhuntBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/dailyhuntBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getProtocols, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + +const BIDDER_CODE = 'dailyhunt'; +const BIDDER_ALIAS = 'dh'; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const PROD_PREBID_ENDPOINT_URL = 'https://pbs.dailyhunt.in/openrtb2/auction?partner='; +const PROD_PREBID_TEST_ENDPOINT_URL = 'https://qa-pbs-van.dailyhunt.in/openrtb2/auction?partner='; +const ORTB_NATIVE_TYPE_MAPPING = { + img: { + '3': 'image', + '1': 'icon' + }, + data: { + '1': 'sponsoredBy', + '2': 'body', + '3': 'rating', + '4': 'likes', + '5': 'downloads', + '6': 'price', + '7': 'salePrice', + '8': 'phone', + '9': 'address', + '10': 'body2', + '11': 'displayUrl', + '12': 'cta' + } +}; +const ORTB_NATIVE_PARAMS = { + title: { + id: 0, + name: 'title' + }, + icon: { + id: 1, + type: 1, + name: 'img' + }, + image: { + id: 2, + type: 3, + name: 'img' + }, + sponsoredBy: { + id: 3, + name: 'data', + type: 1 + }, + body: { + id: 4, + name: 'data', + type: 2 + }, + cta: { + id: 5, + type: 12, + name: 'data' + }, + body2: { + id: 4, + name: 'data', + type: 10 + } +}; + +// Encode URI. +const _encodeURIComponent = function (a) { + let b = window.encodeURIComponent(a); + b = b.replace(/'/g, '%27'); + return b; +}; + +// Extract key from collections. +const extractKeyInfo = (collection, key) => { + for (let i = 0, result; i < collection.length; i++) { + result = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(collection[i].params, key); + if (result) { + return result; + } + } + return undefined; +}; + +// Flattern Array. +const flatten = arr => { + return [].concat(...arr); +}; +const createOrtbRequest = (validBidRequests, bidderRequest) => { + let device = createOrtbDeviceObj(validBidRequests); + let user = createOrtbUserObj(validBidRequests); + let site = createOrtbSiteObj(validBidRequests, bidderRequest.refererInfo.page); + return { + id: bidderRequest.bidderRequestId, + imp: [], + site, + device, + user + }; +}; +const createOrtbDeviceObj = validBidRequests => { + let device = { + ...extractKeyInfo(validBidRequests, `device`) + }; + device.ua = navigator.userAgent; + return device; +}; +const createOrtbUserObj = validBidRequests => ({ + ...extractKeyInfo(validBidRequests, `user`) +}); +const createOrtbSiteObj = (validBidRequests, page) => { + let site = { + ...extractKeyInfo(validBidRequests, `site`), + page + }; + let publisher = createOrtbPublisherObj(validBidRequests); + if (!site.publisher) { + site.publisher = publisher; + } + return site; +}; +const createOrtbPublisherObj = validBidRequests => ({ + ...extractKeyInfo(validBidRequests, `publisher`) +}); + +// get bidFloor Function for different creatives +function getBidFloor(bid, creative) { + let floorInfo = typeof bid.getFloor == 'function' ? bid.getFloor({ + currency: 'USD', + mediaType: creative, + size: '*' + }) : {}; + return Math.floor(floorInfo?.floor || (bid.params.bidfloor ? bid.params.bidfloor : 0.0)); +} +const createOrtbImpObj = bid => { + let params = bid.params; + let testMode = !!bid.params.test_mode; + + // Validate Banner Request. + let bannerObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid.mediaTypes, `banner`); + let nativeObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid.mediaTypes, `native`); + let videoObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid.mediaTypes, `video`); + let imp = { + id: bid.bidId, + ext: { + dailyhunt: { + placement_id: params.placement_id, + publisher_id: params.publisher_id, + partner: params.partner_name + } + } + }; + + // Test Mode Campaign. + if (testMode) { + imp.ext.test_mode = testMode; + } + if (bannerObj) { + imp.banner = { + ...createOrtbImpBannerObj(bid, bannerObj) + }; + imp.bidfloor = getBidFloor(bid, 'banner'); + } else if (nativeObj) { + imp.native = { + ...createOrtbImpNativeObj(bid, nativeObj) + }; + imp.bidfloor = getBidFloor(bid, 'native'); + } else if (videoObj) { + imp.video = { + ...createOrtbImpVideoObj(bid, videoObj) + }; + imp.bidfloor = getBidFloor(bid, 'video'); + } + return imp; +}; +const createOrtbImpBannerObj = (bid, bannerObj) => { + let format = []; + bannerObj.sizes.forEach(size => format.push({ + w: size[0], + h: size[1] + })); + return { + id: 'banner-' + bid.bidId, + format + }; +}; +const createOrtbImpNativeObj = (bid, nativeObj) => { + const assets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._map)(bid.nativeParams, (bidParams, key) => { + const props = ORTB_NATIVE_PARAMS[key]; + const asset = { + required: bidParams.required & 1 + }; + if (props) { + let h = 0; + let w = 0; + asset.id = props.id; + if (bidParams.sizes) { + const sizes = flatten(bidParams.sizes); + w = sizes[0]; + h = sizes[1]; + } + asset[props.name] = { + len: bidParams.len ? bidParams.len : 20, + type: props.type, + w, + h + }; + return asset; + } + }).filter(Boolean); + let request = { + assets, + ver: '1,0' + }; + return { + request: JSON.stringify(request) + }; +}; +const createOrtbImpVideoObj = (bid, videoObj) => { + let obj = {}; + let params = bid.params; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(bid.params.video)) { + obj = { + topframe: 1, + skip: params.video.skippable || 0, + linearity: params.video.linearity || 1, + minduration: params.video.minduration || 5, + maxduration: params.video.maxduration || 60, + mimes: params.video.mimes || ['video/mp4'], + protocols: getProtocols(params.video), + w: params.video.playerSize[0][0], + h: params.video.playerSize[0][1] + }; + } else { + obj = { + mimes: ['video/mp4'] + }; + } + obj.ext = { + ...videoObj + }; + return obj; +}; +function getProtocols(_ref) { + let { + protocols + } = _ref; + let defaultValue = [2, 3, 5, 6, 7, 8]; + let listProtocols = [{ + key: 'VAST_1_0', + value: 1 + }, { + key: 'VAST_2_0', + value: 2 + }, { + key: 'VAST_3_0', + value: 3 + }, { + key: 'VAST_1_0_WRAPPER', + value: 4 + }, { + key: 'VAST_2_0_WRAPPER', + value: 5 + }, { + key: 'VAST_3_0_WRAPPER', + value: 6 + }, { + key: 'VAST_4_0', + value: 7 + }, { + key: 'VAST_4_0_WRAPPER', + value: 8 + }]; + if (protocols) { + return listProtocols.filter(p => { + return protocols.indexOf(p.key) !== -1; + }).map(p => p.value); + } else { + return defaultValue; + } +} +const createServerRequest = function (ortbRequest, validBidRequests) { + let isTestMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'false'; + return { + method: 'POST', + url: isTestMode === 'true' ? PROD_PREBID_TEST_ENDPOINT_URL + validBidRequests[0].params.partner_name : PROD_PREBID_ENDPOINT_URL + validBidRequests[0].params.partner_name, + data: JSON.stringify(ortbRequest), + options: { + contentType: 'application/json', + withCredentials: true + }, + bids: validBidRequests + }; +}; +const createPrebidBannerBid = (bid, bidResponse) => ({ + requestId: bid.bidId, + cpm: bidResponse.price.toFixed(2), + creativeId: bidResponse.crid, + width: bidResponse.w, + height: bidResponse.h, + ttl: 360, + netRevenue: bid.netRevenue === 'net', + currency: 'USD', + ad: bidResponse.adm, + mediaType: 'banner', + winUrl: bidResponse.nurl, + adomain: bidResponse.adomain +}); +const createPrebidNativeBid = (bid, bidResponse) => ({ + requestId: bid.bidId, + cpm: bidResponse.price.toFixed(2), + creativeId: bidResponse.crid, + currency: 'USD', + ttl: 360, + netRevenue: bid.netRevenue === 'net', + native: parseNative(bidResponse), + mediaType: 'native', + winUrl: bidResponse.nurl, + width: bidResponse.w, + height: bidResponse.h, + adomain: bidResponse.adomain +}); +const parseNative = bid => { + let adm = JSON.parse(bid.adm); + const { + assets, + link, + imptrackers, + jstracker + } = adm.native; + const result = { + clickUrl: _encodeURIComponent(link.url), + clickTrackers: link.clicktrackers || [], + impressionTrackers: imptrackers || [], + javascriptTrackers: jstracker ? [jstracker] : [] + }; + assets.forEach(asset => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(asset.title)) { + result.title = asset.title.text; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(asset.img)) { + result[ORTB_NATIVE_TYPE_MAPPING.img[asset.img.type]] = { + url: asset.img.url, + height: asset.img.h, + width: asset.img.w + }; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(asset.data)) { + result[ORTB_NATIVE_TYPE_MAPPING.data[asset.data.type]] = asset.data.value; + } + }); + return result; +}; +const createPrebidVideoBid = (bid, bidResponse) => { + let videoBid = { + requestId: bid.bidId, + cpm: bidResponse.price.toFixed(2), + creativeId: bidResponse.crid, + width: bidResponse.w, + height: bidResponse.h, + ttl: 360, + netRevenue: bid.netRevenue === 'net', + currency: 'USD', + mediaType: 'video', + winUrl: bidResponse.nurl, + adomain: bidResponse.adomain + }; + let videoContext = bid.mediaTypes.video.context; + switch (videoContext) { + case _src_video_js__WEBPACK_IMPORTED_MODULE_3__.OUTSTREAM: + videoBid.vastXml = bidResponse.adm; + break; + case _src_video_js__WEBPACK_IMPORTED_MODULE_3__.INSTREAM: + videoBid.videoCacheKey = bidResponse.ext.bidder.cacheKey; + videoBid.vastUrl = bidResponse.ext.bidder.vastUrl; + break; + } + return videoBid; +}; +const getQueryVariable = variable => { + let query = window.location.search.substring(1); + let vars = query.split('&'); + for (var i = 0; i < vars.length; i++) { + let pair = vars[i].split('='); + if (decodeURIComponent(pair[0]) == variable) { + return decodeURIComponent(pair[1]); + } + } + return false; +}; +const spec = { + code: BIDDER_CODE, + aliases: [BIDDER_ALIAS], + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: bid => !!bid.params.placement_id && !!bid.params.publisher_id && !!bid.params.partner_name, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let serverRequests = []; + + // ORTB Request. + let ortbReq = createOrtbRequest(validBidRequests, bidderRequest); + validBidRequests.forEach(bid => { + let imp = createOrtbImpObj(bid); + ortbReq.imp.push(imp); + }); + serverRequests.push({ + ...createServerRequest(ortbReq, validBidRequests, getQueryVariable('dh_test')) + }); + return serverRequests; + }, + interpretResponse: function (serverResponse, request) { + const { + seatbid + } = serverResponse.body; + let bids = request.bids; + let prebidResponse = []; + let seatBids = seatbid[0].bid; + seatBids.forEach(ortbResponseBid => { + let bidId = ortbResponseBid.impid; + let actualBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(bids, bid => bid.bidId === bidId); + let bidMediaType = ortbResponseBid.ext.prebid.type; + switch (bidMediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + prebidResponse.push(createPrebidBannerBid(actualBid, ortbResponseBid)); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + prebidResponse.push(createPrebidNativeBid(actualBid, ortbResponseBid)); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + prebidResponse.push(createPrebidVideoBid(actualBid, ortbResponseBid)); + break; + } + }); + return prebidResponse; + }, + onBidWon: function (bid) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(bid.winUrl, null, null, { + method: 'GET' + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('dailyhuntBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dailyhuntBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dailymotionBidAdapter"],{ + +/***/ "./modules/dailymotionBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/dailymotionBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_userSync_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/userSync.js */ "./src/userSync.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const DAILYMOTION_VENDOR_ID = 573; +const dailymotionOrtbConverter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 600 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + if (typeof bidRequest.getFloor === 'function') { + const size = imp.w > 0 && imp.h > 0 ? [imp.w, imp.h] : '*'; + const floorInfo = bidRequest.getFloor({ + currency: 'USD', + mediaType: 'video', + // or '*' for all the mediaType + size + }) || {}; + if (floorInfo.floor && floorInfo.currency) { + imp.bidfloor = floorInfo.floor; + imp.bidfloorcur = floorInfo.currency; + } + } + return imp; + } +}); +function isArrayFilled(_array) { + return _array && Array.isArray(_array) && _array.length > 0; +} + +/** + * Get video metadata from bid request + * + * @param {BidRequest} bidRequest A valid bid requests that should be sent to the Server. + * @return video metadata + */ +function getVideoMetadata(bidRequest, bidderRequest) { + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.video', {}); + + // As per oRTB 2.5 spec, "A bid request must not contain both an App and a Site object." + // See section 3.2.14 + const siteOrAppObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.site') ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.site') : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.app'); + // Content object is either from Object: Site or Object: App + const contentObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(siteOrAppObj, 'content'); + const contentCattax = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'cattax', 0); + const isContentCattaxV1 = contentCattax === 1; + const isContentCattaxV2 = [2, 5, 6].includes(contentCattax); + const parsedContentData = { + // Store as object keys to ensure uniqueness + iabcat1: {}, + iabcat2: {} + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'data', []).forEach(data => { + if ([4, 5, 6, 7].includes(data?.ext?.segtax)) { + (Array.isArray(data.segment) ? data.segment : []).forEach(segment => { + if (typeof segment.id === 'string') { + // See https://docs.prebid.org/features/firstPartyData.html#segments-and-taxonomy + // Only take IAB cats of taxonomy V1 + if (data.ext.segtax === 4) { + parsedContentData.iabcat1[segment.id] = 1; + } else { + // Only take IAB cats of taxonomy V2 or higher + parsedContentData.iabcat2[segment.id] = 1; + } + } + }); + } + }); + const videoMetadata = { + description: videoParams.description || '', + duration: videoParams.duration || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'len', 0), + iabcat1: isArrayFilled(videoParams.iabcat1) ? videoParams.iabcat1 : isArrayFilled((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'cat')) && isContentCattaxV1 ? contentObj.cat : Object.keys(parsedContentData.iabcat1), + iabcat2: isArrayFilled(videoParams.iabcat2) ? videoParams.iabcat2 : isArrayFilled((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'cat')) && isContentCattaxV2 ? contentObj.cat : Object.keys(parsedContentData.iabcat2), + id: videoParams.id || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'id', ''), + lang: videoParams.lang || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'language', ''), + livestream: typeof videoParams.livestream === 'number' ? !!videoParams.livestream : !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'livestream', 0), + private: videoParams.private || false, + tags: videoParams.tags || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'keywords', ''), + title: videoParams.title || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'title', ''), + url: videoParams.url || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'url', ''), + topics: videoParams.topics || '', + isCreatedForKids: typeof videoParams.isCreatedForKids === 'boolean' ? videoParams.isCreatedForKids : null, + context: { + siteOrAppCat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(siteOrAppObj, 'cat', []), + siteOrAppContentCat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'cat', []), + videoViewsInSession: typeof videoParams.videoViewsInSession === 'number' && videoParams.videoViewsInSession >= 0 ? videoParams.videoViewsInSession : null, + autoplay: typeof videoParams.autoplay === 'boolean' ? videoParams.autoplay : null, + playerName: videoParams.playerName || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(contentObj, 'playerName', ''), + playerVolume: typeof videoParams.playerVolume === 'number' && videoParams.playerVolume >= 0 && videoParams.playerVolume <= 10 ? videoParams.playerVolume : null + } + }; + return videoMetadata; +} + +/** + * Check if user sync is enabled for Dailymotion + * + * @return boolean True if user sync is enabled + */ +function isUserSyncEnabled() { + const syncEnabled = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('userSync'), 'syncEnabled'); + if (!syncEnabled) return false; + const canSyncWithIframe = _src_userSync_js__WEBPACK_IMPORTED_MODULE_3__.userSync.canBidderRegisterSync('iframe', 'dailymotion'); + const canSyncWithPixel = _src_userSync_js__WEBPACK_IMPORTED_MODULE_3__.userSync.canBidderRegisterSync('image', 'dailymotion'); + return !!(canSyncWithIframe || canSyncWithPixel); +} +const spec = { + code: 'dailymotion', + gvlid: DAILYMOTION_VENDOR_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * The only mandatory parameter for a bid to be valid is the API key. + * Other parameters are optional. + * + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (bid?.params) { + // We only accept video adUnits + if (!bid?.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]) return false; + + // As `context`, `placement` & `plcmt` are optional (although recommended) + // values, we check the 3 of them to see if we are in an instream video context + const isInstream = bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO].context === 'instream' || bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO].placement === 1 || bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO].plcmt === 1; + + // We only accept instream video context + if (!isInstream) return false; + + // We need API key + return typeof bid.params.apiKey === 'string' && bid.params.apiKey.length > 10; + } + return false; + }, + /** + * Make a server request from the list of valid BidRequests (that already passed the isBidRequestValid call) + * + * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server. + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + const ortbData = dailymotionOrtbConverter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + // check consent to be able to read user cookie + const allowCookieReading = + // No GDPR applies + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.gdprApplies') || + // OR GDPR applies and we have global consent + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.vendorData.hasGlobalConsent') === true || + // Vendor consent + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.vendor.consents.${DAILYMOTION_VENDOR_ID}`) === true && + // Purposes with legal basis "consent". These are not flexible, so if publisher requires legitimate interest (2) it cancels them + [1, 3, 4].every(v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.publisher.restrictions.${v}.${DAILYMOTION_VENDOR_ID}`) !== 0 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.publisher.restrictions.${v}.${DAILYMOTION_VENDOR_ID}`) !== 2 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.purpose.consents.${v}`) === true) && + // Purposes with legal basis "legitimate interest" (default) or "consent" (when specified as such by publisher) + [2, 7, 9, 10].every(v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.publisher.restrictions.${v}.${DAILYMOTION_VENDOR_ID}`) !== 0 && ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.publisher.restrictions.${v}.${DAILYMOTION_VENDOR_ID}`) === 1 ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.purpose.consents.${v}`) === true : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, `gdprConsent.vendorData.purpose.legitimateInterests.${v}`) === true)); + return validBidRequests.map(bid => ({ + method: 'POST', + url: 'https://pb.dmxleo.com', + data: { + pbv: "9.45.0-pre", + ortb: ortbData, + bidder_request: { + gdprConsent: { + apiVersion: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.apiVersion', 1), + consentString: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.consentString', ''), + // Cast boolean in any case (eg: if value is int) to ensure type + gdprApplies: !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.gdprApplies') + }, + refererInfo: { + page: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.page', '') + }, + uspConsent: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'uspConsent', ''), + gppConsent: { + gppString: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gppConsent.gppString') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.regs.gpp', ''), + applicableSections: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gppConsent.applicableSections') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'ortb2.regs.gpp_sid', []) + } + }, + config: { + api_key: bid.params.apiKey, + ts: bid.params.dmTs + }, + userSyncEnabled: isUserSyncEnabled(), + request: { + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'adUnitCode', ''), + auctionId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'auctionId', ''), + bidId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'bidId', ''), + mediaTypes: { + video: { + api: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.api || [], + mimes: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.mimes || [], + minduration: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.minduration || 0, + maxduration: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.maxduration || 0, + playbackmethod: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.playbackmethod || [], + plcmt: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.plcmt, + protocols: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.protocols || [], + skip: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.skip || 0, + skipafter: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.skipafter || 0, + skipmin: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.skipmin || 0, + startdelay: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.startdelay, + w: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.w || 0, + h: bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO]?.h || 0 + } + }, + sizes: bid.sizes || [] + }, + video_metadata: getVideoMetadata(bid, bidderRequest) + }, + options: { + withCredentials: allowCookieReading, + crossOrigin: true + } + })); + }, + /** + * Map the response from the server into a list of bids. + * As dailymotion prebid server returns an entry with the correct Prebid structure, + * we directly include it as the only bid in the response. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: serverResponse => serverResponse?.body?.cpm ? [serverResponse.body] : [], + /** + * Retrieves user synchronization URLs based on provided options and consents. + * + * @param {object} syncOptions - Options for synchronization. + * @param {object[]} serverResponses - Array of server responses. + * @returns {object[]} - Array of synchronization URLs. + */ + getUserSyncs: (syncOptions, serverResponses) => { + if (!!serverResponses?.length && (syncOptions.iframeEnabled || syncOptions.pixelEnabled)) { + const iframeSyncs = []; + const pixelSyncs = []; + serverResponses.forEach(response => { + (response?.body?.userSyncs || []).forEach(syncUrl => { + if (syncUrl.type === 'image') { + pixelSyncs.push({ + url: syncUrl.url, + type: 'image' + }); + } + if (syncUrl.type === 'iframe') { + iframeSyncs.push({ + url: syncUrl.url, + type: 'iframe' + }); + } + }); + }); + if (syncOptions.iframeEnabled) return iframeSyncs; + return pixelSyncs; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('dailymotionBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dailymotionBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dataControllerModule"],{ + +/***/ "./modules/dataControllerModule/index.js": +/*!***********************************************!*\ + !*** ./modules/dataControllerModule/index.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports filterBidData, init */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/prebid.js */ "./src/prebid.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); + +/** + * This module validates the configuration and filters data accordingly + * @module modules/dataController + */ + + + + + +const LOG_PRE_FIX = 'Data_Controller : '; +const ALL = '*'; +const MODULE_NAME = 'dataController'; +const GLOBAL = {}; +let _dataControllerConfig; +const _logger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.prefixLog)(LOG_PRE_FIX); + +/** + * BidderRequests hook to intiate module and reset data object + */ +const filterBidData = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__.timedAuctionHook)('dataController', function filterBidData(fn, req) { + if (_dataControllerConfig.filterEIDwhenSDA) { + filterEIDs(req.adUnits, req.ortb2Fragments); + } + if (_dataControllerConfig.filterSDAwhenEID) { + filterSDA(req.adUnits, req.ortb2Fragments); + } + fn.call(this, req); + return req; +}); +function containsConfiguredEIDS(eidSourcesMap, bidderCode) { + if (_dataControllerConfig.filterSDAwhenEID.includes(ALL)) { + return true; + } + let bidderEIDs = eidSourcesMap.get(bidderCode); + if (bidderEIDs == undefined) { + return false; + } + let containsEIDs = false; + _dataControllerConfig.filterSDAwhenEID.some(source => { + if (bidderEIDs.has(source)) { + containsEIDs = true; + } + }); + return containsEIDs; +} +function containsConfiguredSDA(segementMap, bidderCode) { + if (_dataControllerConfig.filterEIDwhenSDA.includes(ALL)) { + return true; + } + return hasValue(segementMap.get(bidderCode)) || hasValue(segementMap.get(GLOBAL)); +} +function hasValue(bidderSegement) { + let containsSDA = false; + if (bidderSegement == undefined) { + return false; + } + _dataControllerConfig.filterEIDwhenSDA.some(segment => { + if (bidderSegement.has(segment)) { + containsSDA = true; + } + }); + return containsSDA; +} +function getSegmentConfig(ortb2Fragments) { + let bidderSDAMap = new Map(); + let globalObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Fragments, 'global') || {}; + collectSegments(bidderSDAMap, GLOBAL, globalObject); + if (ortb2Fragments.bidder) { + for (const [key, value] of Object.entries(ortb2Fragments.bidder)) { + collectSegments(bidderSDAMap, key, value); + } + } + return bidderSDAMap; +} +function collectSegments(bidderSDAMap, key, data) { + let segmentSet = constructSegment((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(data, 'user.data') || []); + if (segmentSet && segmentSet.size > 0) bidderSDAMap.set(key, segmentSet); +} +function constructSegment(userData) { + let segmentSet; + if (userData) { + segmentSet = new Set(); + for (let i = 0; i < userData.length; i++) { + let segments = userData[i].segment; + let segmentPrefix = ''; + if (userData[i].name) { + segmentPrefix = userData[i].name + ':'; + } + if (userData[i].ext && userData[i].ext.segtax) { + segmentPrefix += userData[i].ext.segtax + ':'; + } + for (let j = 0; j < segments.length; j++) { + segmentSet.add(segmentPrefix + segments[j].id); + } + } + } + return segmentSet; +} +function getEIDsSource(adUnits) { + let bidderEIDSMap = new Map(); + adUnits.forEach(adUnit => { + (adUnit.bids || []).forEach(bid => { + let userEIDs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'userIdAsEids') || []; + if (userEIDs) { + let sourceSet = new Set(); + for (let i = 0; i < userEIDs.length; i++) { + let source = userEIDs[i].source; + sourceSet.add(source); + } + bidderEIDSMap.set(bid.bidder, sourceSet); + } + }); + }); + return bidderEIDSMap; +} +function filterSDA(adUnits, ortb2Fragments) { + let bidderEIDSMap = getEIDsSource(adUnits); + let resetGlobal = false; + for (const [key, value] of Object.entries(ortb2Fragments.bidder)) { + let resetSDA = containsConfiguredEIDS(bidderEIDSMap, key); + if (resetSDA) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(value, 'user.data', []); + resetGlobal = true; + } + } + if (resetGlobal) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortb2Fragments, 'global.user.data', []); + } +} +function filterEIDs(adUnits, ortb2Fragments) { + let segementMap = getSegmentConfig(ortb2Fragments); + let globalEidUpdate = false; + adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + let resetEID = containsConfiguredSDA(segementMap, bid.bidder); + if (resetEID) { + globalEidUpdate = true; + bid.userIdAsEids = []; + bid.userId = {}; + if (ortb2Fragments.bidder) { + let bidderFragment = ortb2Fragments.bidder[bid.bidder]; + let userExt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderFragment, 'user.ext.eids') || []; + if (userExt) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bidderFragment, 'user.ext.eids', []); + } + } + } + }); + }); + if (globalEidUpdate) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortb2Fragments, 'global.user.ext.eids', []); + } + return adUnits; +} +function init() { + const confListener = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig(MODULE_NAME, dataControllerConfig => { + const dataController = dataControllerConfig && dataControllerConfig.dataController; + if (!dataController) { + _logger.logInfo(`Data Controller is not configured`); + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.getHooks({ + hook: filterBidData + }).remove(); + return; + } + if (dataController.filterEIDwhenSDA && dataController.filterSDAwhenEID) { + _logger.logInfo(`Data Controller can be configured with either filterEIDwhenSDA or filterSDAwhenEID`); + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.getHooks({ + hook: filterBidData + }).remove(); + return; + } + confListener(); // unsubscribe config listener + _dataControllerConfig = dataController; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('startAuction').before(filterBidData); + }); +} +init(); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.module)(MODULE_NAME, init); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('dataControllerModule'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dataControllerModule/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["datablocksAnalyticsAdapter"],{ + +/***/ "./modules/datablocksAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/datablocksAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + +/** + * Analytics Adapter for Datablocks + */ + + + +var datablocksAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + global: 'datablocksAnalytics', + handler: 'on', + analyticsType: 'bundle' +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: datablocksAdapter, + code: 'datablocks' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (datablocksAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('datablocksAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/datablocksAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["datablocksBidAdapter"],{ + +/***/ "./modules/datablocksBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/datablocksBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec, BotClientTests */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); + + + + + + + + + +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: 'datablocks' +}); +const NATIVE_ID_MAP = {}; +const NATIVE_PARAMS = { + title: { + id: 1, + name: 'title' + }, + icon: { + id: 2, + type: 1, + name: 'img' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + body: { + id: 4, + name: 'data', + type: 2 + }, + sponsoredBy: { + id: 5, + name: 'data', + type: 1 + }, + cta: { + id: 6, + type: 12, + name: 'data' + }, + body2: { + id: 7, + name: 'data', + type: 10 + }, + rating: { + id: 8, + name: 'data', + type: 3 + }, + likes: { + id: 9, + name: 'data', + type: 4 + }, + downloads: { + id: 10, + name: 'data', + type: 5 + }, + displayUrl: { + id: 11, + name: 'data', + type: 11 + }, + price: { + id: 12, + name: 'data', + type: 6 + }, + salePrice: { + id: 13, + name: 'data', + type: 7 + }, + address: { + id: 14, + name: 'data', + type: 9 + }, + phone: { + id: 15, + name: 'data', + type: 8 + } +}; +Object.keys(NATIVE_PARAMS).forEach(key => { + NATIVE_ID_MAP[NATIVE_PARAMS[key].id] = key; +}); + +// DEFINE THE PREBID BIDDER SPEC +const spec = { + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + code: 'datablocks', + // DATABLOCKS SCOPED OBJECT + db_obj: { + metrics_host: 'prebid.dblks.net', + metrics: [], + metrics_timer: null, + metrics_queue_time: 1000, + vis_optout: false, + source_id: 0 + }, + // STORE THE DATABLOCKS BUYERID IN STORAGE + store_dbid: function (dbid) { + let stored = false; + + // CREATE 1 YEAR EXPIRY DATE + let d = new Date(); + d.setTime(Date.now() + 365 * 24 * 60 * 60 * 1000); + + // TRY TO STORE IN COOKIE + if (storage.cookiesAreEnabled) { + storage.setCookie('_db_dbid', dbid, d.toUTCString(), 'None', null); + stored = true; + } + + // TRY TO STORE IN LOCAL STORAGE + if (storage.localStorageIsEnabled) { + storage.setDataInLocalStorage('_db_dbid', dbid); + stored = true; + } + return stored; + }, + // FETCH DATABLOCKS BUYERID FROM STORAGE + get_dbid: function () { + let dbId = ''; + if (storage.cookiesAreEnabled) { + dbId = storage.getCookie('_db_dbid') || ''; + } + if (!dbId && storage.localStorageIsEnabled) { + dbId = storage.getDataFromLocalStorage('_db_dbid') || ''; + } + return dbId; + }, + // STORE SYNCS IN STORAGE + store_syncs: function (syncs) { + if (storage.localStorageIsEnabled) { + let syncObj = {}; + syncs.forEach(sync => { + syncObj[sync.id] = sync.uid; + }); + + // FETCH EXISTING SYNCS AND MERGE NEW INTO STORAGE + let storedSyncs = this.get_syncs(); + storage.setDataInLocalStorage('_db_syncs', JSON.stringify(Object.assign(storedSyncs, syncObj))); + return true; + } + }, + // GET SYNCS FROM STORAGE + get_syncs: function () { + if (storage.localStorageIsEnabled) { + let syncData = storage.getDataFromLocalStorage('_db_syncs'); + if (syncData) { + return JSON.parse(syncData); + } else { + return {}; + } + } else { + return {}; + } + }, + // ADD METRIC DATA TO THE METRICS RESPONSE QUEUE + queue_metric: function (metric) { + if (typeof metric === 'object') { + // PUT METRICS IN THE QUEUE + this.db_obj.metrics.push(metric); + + // RESET PREVIOUS TIMER + if (this.db_obj.metrics_timer) { + clearTimeout(this.db_obj.metrics_timer); + } + + // SETUP THE TIMER TO FIRE BACK THE DATA + let scope = this; + this.db_obj.metrics_timer = setTimeout(function () { + scope.send_metrics(); + }, this.db_obj.metrics_queue_time); + return true; + } else { + return false; + } + }, + // POST CONSOLIDATED METRICS BACK TO SERVER + send_metrics: function () { + // POST TO SERVER + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(`https://${this.db_obj.metrics_host}/a/pb/`, null, JSON.stringify(this.db_obj.metrics), { + method: 'POST', + withCredentials: true + }); + + // RESET THE QUEUE OF METRIC DATA + this.db_obj.metrics = []; + return true; + }, + // GET BASIC CLIENT INFORMATION + get_client_info: function () { + let botTest = new BotClientTests(); + let win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWindowTop)(); + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)(); + return { + 'wiw': windowDimensions.innerWidth, + 'wih': windowDimensions.innerHeight, + 'saw': windowDimensions.screen.availWidth, + 'sah': windowDimensions.screen.availHeight, + 'scd': screen ? screen.colorDepth : null, + 'sw': windowDimensions.screen.width, + 'sh': windowDimensions.screen.height, + 'whl': win.history.length, + 'wxo': win.pageXOffset, + 'wyo': win.pageYOffset, + 'wpr': win.devicePixelRatio, + 'is_bot': botTest.doTests(), + 'is_hid': win.document.hidden, + 'vs': win.document.visibilityState + }; + }, + // LISTEN FOR GPT VIEWABILITY EVENTS + get_viewability: function (bid) { + // ONLY RUN ONCE IF PUBLISHER HAS OPTED IN + if (!this.db_obj.vis_optout && !this.db_obj.vis_run) { + this.db_obj.vis_run = true; + + // ADD GPT EVENT LISTENERS + let scope = this; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isGptPubadsDefined)()) { + if (typeof window['googletag'].pubads().addEventListener == 'function') { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + window['googletag'].pubads().addEventListener('impressionViewable', function (event) { + scope.queue_metric({ + type: 'slot_view', + source_id: scope.db_obj.source_id, + auction_id: bid.auctionId, + div_id: event.slot.getSlotElementId(), + slot_id: event.slot.getSlotId().getAdUnitPath() + }); + }); + window['googletag'].pubads().addEventListener('slotRenderEnded', function (event) { + scope.queue_metric({ + type: 'slot_render', + source_id: scope.db_obj.source_id, + auction_id: bid.auctionId, + div_id: event.slot.getSlotElementId(), + slot_id: event.slot.getSlotId().getAdUnitPath() + }); + }); + } + } + } + }, + // VALIDATE THE BID REQUEST + isBidRequestValid: function (bid) { + // SET GLOBAL VARS FROM BIDDER CONFIG + this.db_obj.source_id = bid.params.source_id; + if (bid.params.vis_optout) { + this.db_obj.vis_optout = true; + } + return !!(bid.params.source_id && bid.mediaTypes && (bid.mediaTypes.banner || bid.mediaTypes.native)); + }, + // GENERATE THE RTB REQUEST + buildRequests: function (validRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(validRequests); + + // RETURN EMPTY IF THERE ARE NO VALID REQUESTS + if (!validRequests.length) { + return []; + } + + // CONVERT PREBID NATIVE REQUEST OBJ INTO RTB OBJ + function createNativeRequest(bid) { + const assets = []; + if (bid.nativeParams) { + Object.keys(bid.nativeParams).forEach(key => { + if (NATIVE_PARAMS[key]) { + const { + name, + type, + id + } = NATIVE_PARAMS[key]; + const assetObj = type ? { + type + } : {}; + let { + len, + sizes, + required, + aspect_ratios: aRatios + } = bid.nativeParams[key]; + if (len) { + assetObj.len = len; + } + if (aRatios && aRatios[0]) { + aRatios = aRatios[0]; + let wmin = aRatios.min_width || 0; + let hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0; + assetObj.wmin = wmin; + assetObj.hmin = hmin; + } + if (sizes && sizes.length) { + sizes = [].concat(...sizes); + assetObj.w = sizes[0]; + assetObj.h = sizes[1]; + } + const asset = { + required: required ? 1 : 0, + id + }; + asset[name] = assetObj; + assets.push(asset); + } + }); + } + return { + ver: '1.2', + request: { + assets: assets, + context: 1, + plcmttype: 1, + ver: '1.2' + } + }; + } + let imps = []; + // ITERATE THE VALID REQUESTS AND GENERATE IMP OBJECT + validRequests.forEach(bidRequest => { + // BUILD THE IMP OBJECT + let imp = { + id: bidRequest.bidId, + tagid: bidRequest.params.tagid || bidRequest.adUnitCode, + placement_id: bidRequest.params.placement_id || 0, + secure: window.location.protocol == 'https:', + ortb2: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidRequest, `ortb2Imp`) || {}, + floor: {} + }; + + // CHECK FOR FLOORS + if (typeof bidRequest.getFloor === 'function') { + imp.floor = bidRequest.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + } + + // BUILD THE SIZES + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidRequest, `mediaTypes.banner`)) { + let sizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_6__.getAdUnitSizes)(bidRequest); + if (sizes.length) { + imp.banner = { + w: sizes[0][0], + h: sizes[0][1], + format: sizes.map(size => ({ + w: size[0], + h: size[1] + })) + }; + + // ADD TO THE LIST OF IMP REQUESTS + imps.push(imp); + } + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidRequest, `mediaTypes.native`)) { + // ADD TO THE LIST OF IMP REQUESTS + imp.native = createNativeRequest(bidRequest); + imps.push(imp); + } + }); + + // RETURN EMPTY IF THERE WERE NO PROPER ADUNIT REQUESTS TO BE MADE + if (!imps.length) { + return []; + } + + // GENERATE SITE OBJECT + let site = { + domain: window.location.host, + // TODO: is 'page' the right value here? + page: bidderRequest.refererInfo.page, + schain: validRequests[0].schain || {}, + ext: { + p_domain: bidderRequest.refererInfo.domain, + rt: bidderRequest.refererInfo.reachedTop, + frames: bidderRequest.refererInfo.numIframes, + stack: bidderRequest.refererInfo.stack, + timeout: _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('bidderTimeout') + } + }; + + // ADD REF URL IF FOUND + if (self === top && document.referrer) { + site.ref = document.referrer; + } + + // ADD META KEYWORDS IF FOUND + let keywords = document.getElementsByTagName('meta')['keywords']; + if (keywords && keywords.content) { + site.keywords = keywords.content; + } + + // GENERATE DEVICE OBJECT + let device = { + ip: 'peer', + ua: window.navigator.userAgent, + js: 1, + language: (navigator.language || navigator.userLanguage || '').split('-')[0] || 'en', + buyerid: this.get_dbid() || 0, + ext: { + pb_eids: validRequests[0].userIdAsEids || {}, + syncs: this.get_syncs() || {}, + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('coppa') || 0, + gdpr: bidderRequest.gdprConsent || {}, + usp: bidderRequest.uspConsent || {}, + client_info: this.get_client_info(), + ortb2: bidderRequest.ortb2 || {} + } + }; + let sourceId = validRequests[0].params.source_id || 0; + let host = validRequests[0].params.host || 'prebid.dblks.net'; + + // RETURN WITH THE REQUEST AND PAYLOAD + return { + method: 'POST', + url: `https://${host}/openrtb/?sid=${sourceId}`, + data: { + id: bidderRequest.bidderRequestId, + imp: imps, + site: site, + device: device + }, + options: { + withCredentials: true + } + }; + }, + // INITIATE USER SYNCING + getUserSyncs: function (options, rtbResponse, gdprConsent) { + const syncs = []; + let bidResponse = rtbResponse?.[0]?.body ?? null; + let scope = this; + + // LISTEN FOR SYNC DATA FROM IFRAME TYPE SYNC + window.addEventListener('message', function (event) { + if (event.data.sentinel && event.data.sentinel === 'dblks_syncData') { + // STORE FOUND SYNCS + if (event.data.syncs) { + scope.store_syncs(event.data.syncs); + } + } + }); + + // POPULATE GDPR INFORMATION + let gdprData = { + gdpr: 0, + gdprConsent: '' + }; + if (typeof gdprConsent === 'object') { + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdprData.gdpr = Number(gdprConsent.gdprApplies); + gdprData.gdprConsent = gdprConsent.consentString; + } else { + gdprData.gdprConsent = gdprConsent.consentString; + } + } + + // EXTRACT BUYERID COOKIE VALUE FROM BID RESPONSE AND PUT INTO STORAGE + let dbBuyerId = this.get_dbid() || ''; + if (bidResponse.ext && bidResponse.ext.buyerid) { + dbBuyerId = bidResponse.ext.buyerid; + this.store_dbid(dbBuyerId); + } + + // EXTRACT USERSYNCS FROM BID RESPONSE + if (bidResponse.ext && bidResponse.ext.syncs) { + bidResponse.ext.syncs.forEach(sync => { + if (checkValid(sync)) { + syncs.push(addParams(sync)); + } + }); + } + + // APPEND PARAMS TO SYNC URL + function addParams(sync) { + // PARSE THE URL + try { + let url = new URL(sync.url); + let urlParams = {}; + for (const [key, value] of url.searchParams.entries()) { + urlParams[key] = value; + } + ; + + // APPLY EXTRA VARS + urlParams.gdpr = gdprData.gdpr; + urlParams.gdprConsent = gdprData.gdprConsent; + urlParams.bidid = bidResponse.bidid; + urlParams.id = bidResponse.id; + urlParams.uid = dbBuyerId; + + // REBUILD URL + sync.url = `${url.origin}${url.pathname}?${Object.keys(urlParams).map(key => key + '=' + encodeURIComponent(urlParams[key])).join('&')}`; + } catch (e) {} + ; + + // RETURN THE REBUILT URL + return sync; + } + + // ENSURE THAT THE SYNC TYPE IS VALID AND HAS PERMISSION + function checkValid(sync) { + if (!sync.type || !sync.url) { + return false; + } + switch (sync.type) { + case 'iframe': + return options.iframeEnabled; + case 'image': + return options.pixelEnabled; + default: + return false; + } + } + return syncs; + }, + // DATABLOCKS WON THE AUCTION - REPORT SUCCESS + onBidWon: function (bid) { + this.queue_metric({ + type: 'bid_won', + source_id: bid.params[0].source_id, + req_id: bid.requestId, + slot_id: bid.adUnitCode, + auction_id: bid.auctionId, + size: bid.size, + cpm: bid.cpm, + pb: bid.adserverTargeting.hb_pb, + rt: bid.timeToRespond, + ttl: bid.ttl + }); + }, + // TARGETING HAS BEEN SET + onSetTargeting: function (bid) { + // LISTEN FOR VIEWABILITY EVENTS + this.get_viewability(bid); + }, + // PARSE THE RTB RESPONSE AND RETURN FINAL RESULTS + interpretResponse: function (rtbResponse, bidRequest) { + // CONVERT NATIVE RTB RESPONSE INTO PREBID RESPONSE + function parseNative(native) { + const { + assets, + link, + imptrackers, + jstracker + } = native; + const result = { + clickUrl: link.url, + clickTrackers: link.clicktrackers || [], + impressionTrackers: imptrackers || [], + javascriptTrackers: jstracker ? [jstracker] : [] + }; + (assets || []).forEach(asset => { + const { + id, + img, + data, + title + } = asset; + const key = NATIVE_ID_MAP[id]; + if (key) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(title)) { + result.title = title.text; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(img)) { + result[key] = { + url: img.url, + height: img.h, + width: img.w + }; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(data)) { + result[key] = data.value; + } + } + }); + return result; + } + let bids = []; + let resBids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(rtbResponse, 'body.seatbid') || []; + resBids.forEach(bid => { + let resultItem = { + requestId: bid.id, + cpm: bid.price, + creativeId: bid.crid, + currency: bid.currency || 'USD', + netRevenue: true, + ttl: bid.ttl || 360, + meta: { + advertiserDomains: bid.adomain + } + }; + let mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ext.mtype') || ''; + switch (mediaType) { + case 'banner': + bids.push(Object.assign({}, resultItem, { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, + width: bid.w, + height: bid.h, + ad: bid.adm + })); + break; + case 'native': + let nativeResult = JSON.parse(bid.adm); + bids.push(Object.assign({}, resultItem, { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, + native: parseNative(nativeResult.native) + })); + break; + default: + break; + } + }); + return bids; + } +}; + +// DETECT BOTS +class BotClientTests { + constructor() { + this.tests = { + headless_chrome: function () { + if (self.navigator) { + if (self.navigator.webdriver) { + return true; + } + } + return false; + }, + selenium: function () { + let response = false; + if (window && document) { + let results = ['webdriver' in window, '_Selenium_IDE_Recorder' in window, 'callSelenium' in window, '_selenium' in window, '__webdriver_script_fn' in document, '__driver_evaluate' in document, '__webdriver_evaluate' in document, '__selenium_evaluate' in document, '__fxdriver_evaluate' in document, '__driver_unwrapped' in document, '__webdriver_unwrapped' in document, '__selenium_unwrapped' in document, '__fxdriver_unwrapped' in document, '__webdriver_script_func' in document, document.documentElement.getAttribute('selenium') !== null, document.documentElement.getAttribute('webdriver') !== null, document.documentElement.getAttribute('driver') !== null]; + results.forEach(result => { + if (result === true) { + response = true; + } + }); + } + return response; + } + }; + } + doTests() { + let response = false; + for (const i of Object.keys(this.tests)) { + if (this.tests[i]() === true) { + response = true; + } + } + return response; + } +} + +// INIT OUR BIDDER WITH PREBID +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('datablocksBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/datablocksBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["datawrkzBidAdapter"],{ + +/***/ "./modules/datawrkzBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/datawrkzBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/bidfactory.js */ "./src/bidfactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'datawrkz'; +const ALIASES = []; +const ENDPOINT_URL = 'https://at.datawrkz.com/exchange/openrtb23/'; +const RENDERER_URL = 'https://js.datawrkz.com/prebid/osRenderer.min.js'; +const OUTSTREAM_TYPES = ['inline', 'slider_top_left', 'slider_top_right', 'slider_bottom_left', 'slider_bottom_right', 'interstitial_close', 'listicle']; +const OUTSTREAM_MIMES = ['video/mp4']; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const spec = { + code: BIDDER_CODE, + aliases: ALIASES, + supportedMediaTypes: SUPPORTED_AD_TYPES, + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.site_id && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.context') != 'adpod'); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests A non-empty list of bid requests which should be sent to the Server. + * @param {*} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let requests = []; + if (validBidRequests.length > 0) { + validBidRequests.forEach(bidRequest => { + if (!bidRequest.mediaTypes) return; + if (bidRequest.mediaTypes.banner && (bidRequest.mediaTypes.banner.sizes && bidRequest.mediaTypes.banner.sizes.length != 0 || bidRequest.sizes)) { + requests.push(buildBannerRequest(bidRequest, bidderRequest)); + } else if (bidRequest.mediaTypes.native) { + requests.push(buildNativeRequest(bidRequest, bidderRequest)); + } else if (bidRequest.mediaTypes.video) { + requests.push(buildVideoRequest(bidRequest, bidderRequest)); + } + }); + } + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + var bidResponses = []; + let bidRequest = request.bidRequest; + let bidResponse = serverResponse.body; + + // valid object? + if (!bidResponse || !bidResponse.id || !bidResponse.seatbid || bidResponse.seatbid.length === 0 || !bidResponse.seatbid[0].bid || bidResponse.seatbid[0].bid.length === 0) { + return []; + } + if (getMediaTypeOfResponse(bidRequest) == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + bidResponses = buildBannerResponse(bidRequest, bidResponse); + } else if (getMediaTypeOfResponse(bidRequest) == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + bidResponses = buildNativeResponse(bidRequest, bidResponse); + } else if (getMediaTypeOfResponse(bidRequest) == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bidResponses = buildVideoResponse(bidRequest, bidResponse); + } + return bidResponses; + } +}; + +/* Generate bid request for banner adunit */ +function buildBannerRequest(bidRequest, bidderRequest) { + let bidFloor = getBidFloor(bidRequest); + let adW = 0; + let adH = 0; + let bannerSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.sizes'); + let bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bannerSizes) ? bannerSizes : bidRequest.sizes; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidSizes)) { + if (bidSizes.length === 2 && typeof bidSizes[0] === 'number' && typeof bidSizes[1] === 'number') { + adW = parseInt(bidSizes[0]); + adH = parseInt(bidSizes[1]); + } else { + adW = parseInt(bidSizes[0][0]); + adH = parseInt(bidSizes[0][1]); + } + } + var deals = []; + if (bidRequest.params.deals && bidRequest.params.deals.length > 0) { + deals = bidRequest.params.deals; + } + const imp = [{ + id: bidRequest.bidId, + banner: { + w: adW, + h: adH + }, + bidfloor: bidFloor, + pmp: { + deals: deals + } + }]; + bidRequest.requestedMediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + const scriptUrl = generateScriptUrl(bidRequest); + const payloadString = generatePayload(imp, bidderRequest); + return { + method: 'POST', + url: scriptUrl, + data: payloadString, + bidRequest + }; +} + +/* Generate bid request for native adunit */ +function buildNativeRequest(bidRequest, bidderRequest) { + let counter = 0; + let assets = []; + let bidFloor = getBidFloor(bidRequest); + let title = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.native.title'); + if (title && title.len) { + assets.push(generateNativeTitleObj(title, ++counter)); + } + let image = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.native.image'); + if (image) { + assets.push(generateNativeImgObj(image, 'image', ++counter)); + } + let icon = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.native.icon'); + if (icon) { + assets.push(generateNativeImgObj(icon, 'icon', ++counter)); + } + let sponsoredBy = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.native.sponsoredBy'); + if (sponsoredBy) { + assets.push(generateNativeDataObj(sponsoredBy, 'sponsored', ++counter)); + } + let cta = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.native.cta'); + if (cta) { + assets.push(generateNativeDataObj(cta, 'cta', ++counter)); + } + let body = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.native.body'); + if (body) { + assets.push(generateNativeDataObj(body, 'desc', ++counter)); + } + let request = JSON.stringify({ + assets: assets + }); + const native = { + request: request + }; + var deals = []; + if (bidRequest.params.deals && bidRequest.params.deals.length > 0) { + deals = bidRequest.params.deals; + } + const imp = [{ + id: bidRequest.bidId, + native: native, + bidfloor: bidFloor, + pmp: { + deals: deals + } + }]; + bidRequest.requestedMediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + bidRequest.assets = assets; + const scriptUrl = generateScriptUrl(bidRequest); + const payloadString = generatePayload(imp, bidderRequest); + return { + method: 'POST', + url: scriptUrl, + data: payloadString, + bidRequest + }; +} + +/* Generate bid request for video adunit */ +function buildVideoRequest(bidRequest, bidderRequest) { + let bidFloor = getBidFloor(bidRequest); + let sizeObj = getVideoAdUnitSize(bidRequest); + const video = { + w: sizeObj.adW, + h: sizeObj.adH, + api: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.api'), + mimes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.mimes'), + protocols: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.protocols'), + playbackmethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.playbackmethod'), + minduration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.minduration'), + maxduration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.maxduration'), + startdelay: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.startdelay'), + minbitrate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.minbitrate'), + maxbitrate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.maxbitrate'), + delivery: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.delivery'), + linearity: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.linearity'), + skip: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.skip'), + skipafter: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.skipafter') + }; + let context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.context'); + if (context == 'outstream' && !bidRequest.renderer) video.mimes = OUTSTREAM_MIMES; + var imp = []; + var deals = []; + if (bidRequest.params.deals && bidRequest.params.deals.length > 0) { + deals = bidRequest.params.deals; + } + if (context != 'adpod') { + imp.push({ + id: bidRequest.bidId, + video: video, + bidfloor: bidFloor, + pmp: { + deals: deals + } + }); + } + bidRequest.requestedMediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + const scriptUrl = generateScriptUrl(bidRequest); + const payloadString = generatePayload(imp, bidderRequest); + return { + method: 'POST', + url: scriptUrl, + data: payloadString, + bidRequest + }; +} + +/* Convert video player size to bid request compatible format */ +function getVideoAdUnitSize(bidRequest) { + var adH = 0; + var adW = 0; + let playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.playerSize'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(playerSize)) { + if (playerSize.length === 2 && typeof playerSize[0] === 'number' && typeof playerSize[1] === 'number') { + adW = parseInt(playerSize[0]); + adH = parseInt(playerSize[1]); + } else { + adW = parseInt(playerSize[0][0]); + adH = parseInt(playerSize[0][1]); + } + } + return { + adH: adH, + adW: adW + }; +} + +/* Get mediatype of the adunit from request */ +function getMediaTypeOfResponse(bidRequest) { + if (bidRequest.requestedMediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER;else if (bidRequest.requestedMediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE;else if (bidRequest.requestedMediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO;else return ''; +} + +/* Generate endpoint url */ +function generateScriptUrl(bidRequest) { + let queryParams = 'hb=1'; + let siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('site_id', bidRequest.params); + return ENDPOINT_URL + siteId + '?' + queryParams; +} + +/* Generate request payload for the adunit */ +function generatePayload(imp, bidderRequest) { + let domain = window.location.host; + let page = window.location.host + window.location.pathname + location.search + location.hash; + const site = { + domain: domain, + page: page, + publisher: {} + }; + let regs = { + ext: {} + }; + if (bidderRequest.uspConsent) { + regs.ext.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest.gdprConsent && typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { + regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? '1' : '0'; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + regs.coppa = '1'; + } + const device = { + ua: window.navigator.userAgent + }; + const payload = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getUniqueIdentifierStr)(), + imp: imp, + site: site, + device: device, + regs: regs + }; + return JSON.stringify(payload); +} + +/* Generate image asset object */ +function generateNativeImgObj(obj, type, id) { + let adW = 0; + let adH = 0; + let bidSizes = obj.sizes; + var typeId; + if (type == 'icon') typeId = 1;else if (type == 'image') typeId = 3; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidSizes)) { + if (bidSizes.length === 2 && typeof bidSizes[0] === 'number' && typeof bidSizes[1] === 'number') { + adW = parseInt(bidSizes[0]); + adH = parseInt(bidSizes[1]); + } else { + adW = parseInt(bidSizes[0][0]); + adH = parseInt(bidSizes[0][1]); + } + } + let required = obj.required ? 1 : 0; + let image = { + type: parseInt(typeId), + w: adW, + h: adH + }; + return { + id: id, + required: required, + img: image + }; +} + +/* Generate title asset object */ +function generateNativeTitleObj(obj, id) { + let required = obj.required ? 1 : 0; + let title = { + len: obj.len + }; + return { + id: id, + required: required, + title: title + }; +} + +/* Generate data asset object */ +function generateNativeDataObj(obj, type, id) { + var typeId; + switch (type) { + case 'sponsored': + typeId = 1; + break; + case 'desc': + typeId = 2; + break; + case 'cta': + typeId = 12; + break; + } + let required = obj.required ? 1 : 0; + let data = { + type: typeId + }; + if (typeId == 2 && obj.len) { + data.len = parseInt(obj.len); + } + return { + id: id, + required: required, + data: data + }; +} + +/* Convert banner bid response to compatible format */ +function buildBannerResponse(bidRequest, bidResponse) { + const bidResponses = []; + bidResponse.seatbid[0].bid.forEach(function (bidderBid) { + let responseCPM; + let placementCode = ''; + if (bidRequest) { + let bidResponse = (0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid)(1); + placementCode = bidRequest.placementCode; + bidRequest.status = _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.STATUS.GOOD; + responseCPM = parseFloat(bidderBid.price); + if (responseCPM === 0 || isNaN(responseCPM)) { + let bid = (0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid)(2); + bid.requestId = bidRequest.bidId; + bid.bidderCode = bidRequest.bidder; + bidResponses.push(bid); + return; + } + let bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.sizes') ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.sizes') : bidRequest.sizes; + bidResponse.requestId = bidRequest.bidId; + bidResponse.placementCode = placementCode; + bidResponse.cpm = responseCPM; + bidResponse.size = bidSizes; + bidResponse.width = parseInt(bidderBid.w); + bidResponse.height = parseInt(bidderBid.h); + let responseAd = bidderBid.adm; + let responseNurl = ''; + bidResponse.ad = decodeURIComponent(responseAd + responseNurl); + bidResponse.creativeId = bidderBid.id; + bidResponse.bidderCode = bidRequest.bidder; + bidResponse.ttl = 300; + bidResponse.netRevenue = true; + bidResponse.currency = 'USD'; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + bidResponses.push(bidResponse); + } + }); + return bidResponses; +} + +/* Convert native bid response to compatible format */ +function buildNativeResponse(bidRequest, response) { + const bidResponses = []; + response.seatbid[0].bid.forEach(function (bidderBid) { + let responseCPM; + let placementCode = ''; + if (bidRequest) { + let bidResponse = (0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid)(1); + placementCode = bidRequest.placementCode; + bidRequest.status = _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.STATUS.GOOD; + responseCPM = parseFloat(bidderBid.price); + if (responseCPM === 0 || isNaN(responseCPM)) { + let bid = (0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid)(2); + bid.requestId = bidRequest.bidId; + bid.bidderCode = bidRequest.bidder; + bidResponses.push(bid); + return; + } + bidResponse.requestId = bidRequest.bidId; + bidResponse.placementCode = placementCode; + bidResponse.cpm = responseCPM; + let nativeResponse = JSON.parse(bidderBid.adm).native; + const native = { + clickUrl: nativeResponse.link.url, + impressionTrackers: nativeResponse.imptrackers + }; + nativeResponse.assets.forEach(function (asset) { + let keyVal = getNativeAssestObj(asset, bidRequest.assets); + native[keyVal.key] = keyVal.value; + }); + bidResponse.creativeId = bidderBid.id; + bidResponse.bidderCode = bidRequest.bidder; + bidResponse.ttl = 300; + if (bidRequest.sizes) { + bidResponse.size = bidRequest.sizes; + } + bidResponse.netRevenue = true; + bidResponse.currency = 'USD'; + bidResponse.native = native; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + bidResponses.push(bidResponse); + } + }); + return bidResponses; +} + +/* Convert video bid response to compatible format */ +function buildVideoResponse(bidRequest, response) { + const bidResponses = []; + response.seatbid[0].bid.forEach(function (bidderBid) { + let responseCPM; + let placementCode = ''; + if (bidRequest) { + let bidResponse = (0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid)(1); + placementCode = bidRequest.placementCode; + bidRequest.status = _src_constants_js__WEBPACK_IMPORTED_MODULE_5__.STATUS.GOOD; + responseCPM = parseFloat(bidderBid.price); + if (responseCPM === 0 || isNaN(responseCPM)) { + let bid = (0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid)(2); + bid.requestId = bidRequest.bidId; + bid.bidderCode = bidRequest.bidder; + bidResponses.push(bid); + return; + } + let context = bidRequest.mediaTypes.video.context; + bidResponse.requestId = bidRequest.bidId; + bidResponse.placementCode = placementCode; + bidResponse.cpm = responseCPM; + let vastXml = decodeURIComponent(bidderBid.adm); + bidResponse.creativeId = bidderBid.id; + bidResponse.bidderCode = bidRequest.bidder; + bidResponse.ttl = 300; + bidResponse.netRevenue = true; + bidResponse.currency = 'USD'; + var ext = bidderBid.ext; + var vastUrl = ''; + if (ext) { + vastUrl = ext.vast_url; + } + var adUnitCode = bidRequest.adUnitCode; + var sizeObj = getVideoAdUnitSize(bidRequest); + bidResponse.height = sizeObj.adH; + bidResponse.width = sizeObj.adW; + switch (context) { + case _src_video_js__WEBPACK_IMPORTED_MODULE_6__.OUTSTREAM: + var outstreamType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.contains)(OUTSTREAM_TYPES, bidRequest.params.outstreamType) ? bidRequest.params.outstreamType : ''; + bidResponse.outstreamType = outstreamType; + bidResponse.ad = vastXml; + if (!bidRequest.renderer) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: bidderBid.id, + url: RENDERER_URL, + config: bidRequest.params.outstreamConfig || {}, + loaded: false, + adUnitCode + }); + renderer.setRender(outstreamRender); + bidResponse.renderer = renderer; + } else { + bidResponse.adResponse = vastXml; + } + break; + case _src_video_js__WEBPACK_IMPORTED_MODULE_6__.INSTREAM: + bidResponse.vastUrl = vastUrl; + bidResponse.adserverTargeting = setTargeting(vastUrl); + break; + } + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bidResponses.push(bidResponse); + } + }); + return bidResponses; +} + +/* Generate renderer for outstream ad unit */ +function outstreamRender(bid) { + bid.renderer.push(() => { + window.osRenderer({ + adResponse: bid.ad, + height: bid.height, + width: bid.width, + targetId: bid.adUnitCode, + // target div id to render video + outstreamType: bid.outstreamType, + options: bid.renderer.getConfig() + }); + }); +} + +/* Set targeting params used for instream video that is required to generate cache url */ +function setTargeting(query) { + var targeting = {}; + var hash; + var hashes = query.slice(query.indexOf('?') + 1).split('&'); + for (var i = 0; i < hashes.length; i++) { + hash = hashes[i].split('='); + targeting['hb_' + hash[0]] = hash[1]; + } + return targeting; +} + +/* Get image type with respect to the id */ +function getAssetImageType(id, assets) { + for (var i = 0; i < assets.length; i++) { + if (assets[i].id == id) { + if (assets[i].img.type == 1) { + return 'icon'; + } else if (assets[i].img.type == 3) { + return 'image'; + } + } + } + return ''; +} + +/* Get type of data asset with respect to the id */ +function getAssetDataType(id, assets) { + for (var i = 0; i < assets.length; i++) { + if (assets[i].id == id) { + if (assets[i].data.type == 1) { + return 'sponsored'; + } else if (assets[i].data.type == 2) { + return 'desc'; + } else if (assets[i].data.type == 12) { + return 'cta'; + } + } + } + return ''; +} + +/* Convert response assests to compatible format */ +function getNativeAssestObj(obj, assets) { + if (obj.title) { + return { + key: 'title', + value: obj.title.text + }; + } + if (obj.data) { + return { + key: getAssetDataType(obj.id, assets), + value: obj.data.value + }; + } + if (obj.img) { + return { + key: getAssetImageType(obj.id, assets), + value: { + url: obj.img.url, + height: obj.img.h, + width: obj.img.w + } + }; + } +} + +// BUILD REQUESTS: BIDFLOORS +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bid.getFloor)) { + return bid.params.bidfloor ? bid.params.bidfloor : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('datawrkzBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/datawrkzBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dchain"],{ + +/***/ "./modules/dchain.js": +/*!***************************!*\ + !*** ./modules/dchain.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports checkDchainSyntax, addBidResponseHook, init */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); + + + + + + +const shouldBeAString = ' should be a string'; +const shouldBeAnObject = ' should be an object'; +const shouldBeAnArray = ' should be an Array'; +const shouldBeValid = ' is not a valid dchain property'; +const MODE = { + STRICT: 'strict', + RELAXED: 'relaxed', + OFF: 'off' +}; +const MODES = []; // an array of modes +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(MODE, mode => MODES.push(mode)); +function checkDchainSyntax(bid, mode) { + let dchainObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bid.meta.dchain); + let failPrefix = 'Detected something wrong in bid.meta.dchain object for bid:'; + let failMsg = ''; + const dchainPropList = ['ver', 'complete', 'nodes', 'ext']; + function appendFailMsg(msg) { + failMsg += '\n' + msg; + } + function printFailMsg() { + if (mode === MODE.STRICT) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(failPrefix, bid, '\n', dchainObj, failMsg); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(failPrefix, bid, `\n`, dchainObj, failMsg); + } + } + let dchainProps = Object.keys(dchainObj); + dchainProps.forEach(prop => { + if (!(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(dchainPropList, prop)) { + appendFailMsg(`dchain.${prop}` + shouldBeValid); + } + }); + if (dchainObj.complete !== 0 && dchainObj.complete !== 1) { + appendFailMsg(`dchain.complete should be 0 or 1`); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(dchainObj.ver)) { + appendFailMsg(`dchain.ver` + shouldBeAString); + } + if (dchainObj.hasOwnProperty('ext')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(dchainObj.ext)) { + appendFailMsg(`dchain.ext` + shouldBeAnObject); + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(dchainObj.nodes)) { + appendFailMsg(`dchain.nodes` + shouldBeAnArray); + printFailMsg(); + if (mode === MODE.STRICT) return false; + } else { + const nodesPropList = ['asi', 'bsid', 'rid', 'name', 'domain', 'ext']; + dchainObj.nodes.forEach((node, index) => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(node)) { + appendFailMsg(`dchain.nodes[${index}]` + shouldBeAnObject); + } else { + let nodeProps = Object.keys(node); + nodeProps.forEach(prop => { + if (!(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(nodesPropList, prop)) { + appendFailMsg(`dchain.nodes[${index}].${prop}` + shouldBeValid); + } + if (prop === 'ext') { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(node.ext)) { + appendFailMsg(`dchain.nodes[${index}].ext` + shouldBeAnObject); + } + } else { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(node[prop])) { + appendFailMsg(`dchain.nodes[${index}].${prop}` + shouldBeAString); + } + } + }); + } + }); + } + if (failMsg.length > 0) { + printFailMsg(); + if (mode === MODE.STRICT) { + return false; + } + } + return true; +} +function isValidDchain(bid) { + let mode = MODE.STRICT; + const dchainConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('dchain'); + if (dchainConfig && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(dchainConfig.validation) && MODES.indexOf(dchainConfig.validation) != -1) { + mode = dchainConfig.validation; + } + if (mode === MODE.OFF) { + return true; + } else { + return checkDchainSyntax(bid, mode); + } +} +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__.timedBidResponseHook)('dchain', function addBidResponseHook(fn, adUnitCode, bid, reject) { + const basicDchain = { + ver: '1.0', + complete: 0, + nodes: [] + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'meta.networkId') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'meta.networkName')) { + basicDchain.nodes.push({ + name: bid.meta.networkName, + bsid: bid.meta.networkId.toString() + }); + } + basicDchain.nodes.push({ + name: bid.bidderCode + }); + let bidDchain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'meta.dchain'); + if (bidDchain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(bidDchain)) { + let result = isValidDchain(bid); + if (result) { + // extra check in-case mode is OFF and there is a setup issue + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bidDchain.nodes)) { + bid.meta.dchain.nodes.push({ + asi: bid.bidderCode + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('bid.meta.dchain.nodes did not exist or was not an array; did not append prebid dchain.', bid); + } + } else { + // remove invalid dchain + delete bid.meta.dchain; + } + } else { + bid.meta.dchain = basicDchain; + } + fn(adUnitCode, bid, reject); +}); +function init() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.getHook)('addBidResponse').before(addBidResponseHook, 35); +} +init(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('dchain'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dchain.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["debugging"],{ + +/***/ "./modules/debugging/bidInterceptor.js": +/*!*********************************************!*\ + !*** ./modules/debugging/bidInterceptor.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ BidInterceptor: () => (/* binding */ BidInterceptor) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _responses_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./responses.js */ "./modules/debugging/responses.js"); + + + + +/** + * @typedef {Number|String|boolean|null|undefined} Scalar + */ + +function BidInterceptor() { + let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + ({ + setTimeout: this.setTimeout = window.setTimeout.bind(window) + } = opts); + this.logger = opts.logger; + this.rules = []; +} +Object.assign(BidInterceptor.prototype, { + DEFAULT_RULE_OPTIONS: { + delay: 0 + }, + serializeConfig(ruleDefs) { + const isSerializable = (ruleDef, i) => { + const serializable = !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.hasNonSerializableProperty)(ruleDef); + if (!serializable && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(ruleDef, 'options.suppressWarnings')) { + this.logger.logWarn(`Bid interceptor rule definition #${i + 1} contains non-serializable properties and will be lost after a refresh. Rule definition: `, ruleDef); + } + return serializable; + }; + return ruleDefs.filter(isSerializable); + }, + updateConfig(config) { + this.rules = (config.intercept || []).map((ruleDef, i) => this.rule(ruleDef, i + 1)); + }, + /** + * @typedef {Object} RuleOptions + * @property {Number} [delay=0] delay between bid interception and mocking of response (to simulate network delay) + * @property {boolean} [suppressWarnings=false] if enabled, do not warn about unserializable rules + * + * @typedef {Object} Rule + * @property {Number} no rule number (used only as an identifier for logging) + * @property {function({}, {}): boolean} match a predicate function that tests a bid against this rule + * @property {ReplacerFn} replacer generator function for mock bid responses + * @property {RuleOptions} options + */ + + /** + * @param {{}} ruleDef + * @param {Number} ruleNo + * @returns {Rule} + */ + rule(ruleDef, ruleNo) { + return { + no: ruleNo, + match: this.matcher(ruleDef.when, ruleNo), + replace: this.replacer(ruleDef.then, ruleNo), + options: Object.assign({}, this.DEFAULT_RULE_OPTIONS, ruleDef.options), + paapi: this.paapiReplacer(ruleDef.paapi || [], ruleNo) + }; + }, + /** + * @typedef {Function} MatchPredicate + * @param {*} candidate a bid to match, or a portion of it if used inside an ObjectMather. + * e.g. matcher((bid, bidRequest) => ....) or matcher({property: (property, bidRequest) => ...}) + * @param {Object} bidRequest the request `candidate` belongs to + * @returns {boolean} + * + * @typedef {Object.} ObjectMatcher + */ + + /** + * @param {MatchPredicate|ObjectMatcher} matchDef matcher definition + * @param {Number} ruleNo + * @returns {MatchPredicate} a predicate function that matches a bid against the given `matchDef` + */ + matcher(matchDef, ruleNo) { + if (typeof matchDef === 'function') { + return matchDef; + } + if (typeof matchDef !== 'object') { + this.logger.logError(`Invalid 'when' definition for debug bid interceptor (in rule #${ruleNo})`); + return () => false; + } + function matches(candidate, _ref) { + let { + ref = matchDef, + args = [] + } = _ref; + return Object.entries(ref).map(_ref2 => { + let [key, val] = _ref2; + const cVal = candidate[key]; + if (val instanceof RegExp) { + return val.exec(cVal) != null; + } + if (typeof val === 'function') { + return !!val(cVal, ...args); + } + if (typeof val === 'object') { + return matches(cVal, { + ref: val, + args + }); + } + return cVal === val; + }).every(i => i); + } + return function (candidate) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return matches(candidate, { + args + }); + }; + }, + /** + * @typedef {Function} ReplacerFn + * @param {*} bid a bid that was intercepted + * @param {Object} bidRequest the request `bid` belongs to + * @returns {*} the response to mock for `bid`, or a portion of it if used inside an ObjectReplacer. + * e.g. replacer((bid, bidRequest) => mockResponse) or replacer({property: (bid, bidRequest) => mockProperty}) + * + * @typedef {Object.} ObjectReplacer + */ + + /** + * @param {ReplacerFn|ObjectReplacer} replDef replacer definition + * @param ruleNo + * @return {ReplacerFn} + */ + replacer(replDef, ruleNo) { + var _this = this; + if (replDef === null) { + return () => null; + } + replDef = replDef || {}; + let replFn; + if (typeof replDef === 'function') { + replFn = _ref3 => { + let { + args + } = _ref3; + return replDef(...args); + }; + } else if (typeof replDef !== 'object') { + this.logger.logError(`Invalid 'then' definition for debug bid interceptor (in rule #${ruleNo})`); + replFn = () => ({}); + } else { + replFn = _ref4 => { + let { + args, + ref = replDef + } = _ref4; + const result = Array.isArray(ref) ? [] : {}; + Object.entries(ref).forEach(_ref5 => { + let [key, val] = _ref5; + if (typeof val === 'function') { + result[key] = val(...args); + } else if (val != null && typeof val === 'object') { + result[key] = replFn({ + args, + ref: val + }); + } else { + result[key] = val; + } + }); + return result; + }; + } + return function (bid) { + const response = _this.responseDefaults(bid); + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(response, replFn({ + args: [bid, ...args] + })); + const resolver = _responses_js__WEBPACK_IMPORTED_MODULE_2__["default"][response.mediaType]; + resolver && resolver(bid, response); + response.isDebug = true; + return response; + }; + }, + paapiReplacer(paapiDef, ruleNo) { + function wrap() { + let configs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + return configs.map(config => { + return Object.keys(config).some(k => !['config', 'igb'].includes(k)) ? { + config + } : config; + }); + } + if (Array.isArray(paapiDef)) { + return () => wrap(paapiDef); + } else if (typeof paapiDef === 'function') { + return function () { + return wrap(paapiDef(...arguments)); + }; + } else { + this.logger.logError(`Invalid 'paapi' definition for debug bid interceptor (in rule #${ruleNo})`); + } + }, + responseDefaults(bid) { + const response = { + requestId: bid.bidId, + cpm: 3.5764, + currency: 'EUR', + ttl: 360, + creativeId: 'mock-creative-id', + netRevenue: false, + meta: {} + }; + if (!bid.mediaType) { + response.mediaType = Object.keys(bid.mediaTypes ?? {})[0] ?? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + } + let size; + if (response.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + size = bid.mediaTypes?.banner?.sizes?.[0] ?? [300, 250]; + } else if (response.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + size = bid.mediaTypes?.video?.playerSize?.[0] ?? [600, 500]; + } + if (Array.isArray(size)) { + [response.width, response.height] = size; + } + return response; + }, + /** + * Match a candidate bid against all registered rules. + * + * @param {{}} candidate + * @param args + * @returns {Rule|undefined} the first matching rule, or undefined if no match was found. + */ + match(candidate) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return this.rules.find(rule => rule.match(candidate, ...args)); + }, + /** + * Match a set of bids against all registered rules. + * + * @param bids + * @param bidRequest + * @returns {[{bid: *, rule: Rule}[], *[]]} a 2-tuple for matching bids (decorated with the matching rule) and + * non-matching bids. + */ + matchAll(bids, bidRequest) { + const [matches, remainder] = [[], []]; + bids.forEach(bid => { + const rule = this.match(bid, bidRequest); + if (rule != null) { + matches.push({ + rule: rule, + bid: bid + }); + } else { + remainder.push(bid); + } + }); + return [matches, remainder]; + }, + /** + * Run a set of bids against all registered rules, filter out those that match, + * and generate mock responses for them. + * + * @param {Object} params + * @param {Object[]} [params.bids] + * @param {Object} params.bidRequest + * @param {function(Object):void} params.addBid called once for each mock response + * @param {function(Object):void} [params.addPaapiConfig] called once for each mock PAAPI config + * @param {function():void} params.done called once after all mock responses have been run through `addBid` + * @returns {{bids: Object[], bidRequest: Object}} remaining bids that did not match any rule (this applies also to bidRequest.bids) + */ + intercept(_ref6) { + let { + bids, + bidRequest, + addBid, + addPaapiConfig, + done + } = _ref6; + if (bids == null) { + bids = bidRequest.bids; + } + const [matches, remainder] = this.matchAll(bids, bidRequest); + if (matches.length > 0) { + const callDone = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.delayExecution)(done, matches.length); + matches.forEach(match => { + const mockResponse = match.rule.replace(match.bid, bidRequest); + const mockPaapi = match.rule.paapi(match.bid, bidRequest); + const delay = match.rule.options.delay; + this.logger.logMessage(`Intercepted bid request (matching rule #${match.rule.no}), mocking response in ${delay}ms. Request, response, PAAPI configs:`, match.bid, mockResponse, mockPaapi); + this.setTimeout(() => { + mockResponse && addBid(mockResponse, match.bid); + mockPaapi.forEach(cfg => addPaapiConfig(cfg, match.bid, bidRequest)); + callDone(); + }, delay); + }); + bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bidRequest); + bids = bidRequest.bids = remainder; + } else { + this.setTimeout(done, 0); + } + return { + bids, + bidRequest + }; + } +}); + +/***/ }), + +/***/ "./modules/debugging/debugging.js": +/*!****************************************!*\ + !*** ./modules/debugging/debugging.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ install: () => (/* binding */ install) +/* harmony export */ }); +/* unused harmony exports disableDebugging, getConfig, sessionLoader, bidderBidInterceptor */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _bidInterceptor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bidInterceptor.js */ "./modules/debugging/bidInterceptor.js"); +/* harmony import */ var _pbsInterceptor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pbsInterceptor.js */ "./modules/debugging/pbsInterceptor.js"); +/* harmony import */ var _legacy_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./legacy.js */ "./modules/debugging/legacy.js"); + + + + +const interceptorHooks = []; +let bidInterceptor; +let enabled = false; +function enableDebugging(debugConfig, _ref) { + let { + fromSession = false, + config, + hook, + logger + } = _ref; + config.setConfig({ + debug: true + }); + bidInterceptor.updateConfig(debugConfig); + resetHooks(true); + // also enable "legacy" overrides + (0,_legacy_js__WEBPACK_IMPORTED_MODULE_0__.removeHooks)({ + hook + }); + (0,_legacy_js__WEBPACK_IMPORTED_MODULE_0__.addHooks)(debugConfig, { + hook, + logger + }); + if (!enabled) { + enabled = true; + logger.logMessage(`Debug overrides enabled${fromSession ? ' from session' : ''}`); + } +} +function disableDebugging(_ref2) { + let { + hook, + logger + } = _ref2; + bidInterceptor.updateConfig({}); + resetHooks(false); + // also disable "legacy" overrides + (0,_legacy_js__WEBPACK_IMPORTED_MODULE_0__.removeHooks)({ + hook + }); + if (enabled) { + enabled = false; + logger.logMessage('Debug overrides disabled'); + } +} + +// eslint-disable-next-line no-restricted-properties +function saveDebuggingConfig(debugConfig) { + let { + sessionStorage = window.sessionStorage, + DEBUG_KEY + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!debugConfig.enabled) { + try { + sessionStorage.removeItem(DEBUG_KEY); + } catch (e) {} + } else { + if (debugConfig.intercept) { + debugConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(debugConfig); + debugConfig.intercept = bidInterceptor.serializeConfig(debugConfig.intercept); + } + try { + sessionStorage.setItem(DEBUG_KEY, JSON.stringify(debugConfig)); + } catch (e) {} + } +} + +// eslint-disable-next-line no-restricted-properties +function getConfig(debugging) { + let { + getStorage = () => window.sessionStorage, + DEBUG_KEY, + config, + hook, + logger + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (debugging == null) return; + let sessionStorage; + try { + sessionStorage = getStorage(); + } catch (e) { + logger.logError(`sessionStorage is not available: debugging configuration will not persist on page reload`, e); + } + if (sessionStorage != null) { + saveDebuggingConfig(debugging, { + sessionStorage, + DEBUG_KEY + }); + } + if (!debugging.enabled) { + disableDebugging({ + hook, + logger + }); + } else { + enableDebugging(debugging, { + config, + hook, + logger + }); + } +} +function sessionLoader(_ref3) { + let { + DEBUG_KEY, + storage, + config, + hook, + logger + } = _ref3; + let overrides; + try { + // eslint-disable-next-line no-restricted-properties + storage = storage || window.sessionStorage; + overrides = JSON.parse(storage.getItem(DEBUG_KEY)); + } catch (e) {} + if (overrides) { + enableDebugging(overrides, { + fromSession: true, + config, + hook, + logger + }); + } +} +function resetHooks(enable) { + interceptorHooks.forEach(_ref4 => { + let [getHookFn, interceptor] = _ref4; + getHookFn().getHooks({ + hook: interceptor + }).remove(); + }); + if (enable) { + interceptorHooks.forEach(_ref5 => { + let [getHookFn, interceptor] = _ref5; + getHookFn().before(interceptor); + }); + } +} +function registerBidInterceptor(getHookFn, interceptor) { + const interceptBids = function () { + return bidInterceptor.intercept(...arguments); + }; + interceptorHooks.push([getHookFn, function (next) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + interceptor(next, interceptBids, ...args); + }]); +} +function bidderBidInterceptor(next, interceptBids, spec, bids, bidRequest, ajax, wrapCallback, cbs) { + const done = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.delayExecution)(cbs.onCompletion, 2); + ({ + bids, + bidRequest + } = interceptBids({ + bids, + bidRequest, + addBid: wrapCallback(cbs.onBid), + addPaapiConfig: wrapCallback((config, bidRequest) => cbs.onPaapi({ + bidId: bidRequest.bidId, + ...config + })), + done + })); + if (bids.length === 0) { + cbs.onResponse?.({}); // trigger onResponse so that the bidder may be marked as "timely" if necessary + done(); + } else { + next(spec, bids, bidRequest, ajax, wrapCallback, { + ...cbs, + onCompletion: done + }); + } +} +function install(_ref6) { + let { + DEBUG_KEY, + config, + hook, + createBid, + logger + } = _ref6; + bidInterceptor = new _bidInterceptor_js__WEBPACK_IMPORTED_MODULE_2__.BidInterceptor({ + logger + }); + const pbsBidInterceptor = (0,_pbsInterceptor_js__WEBPACK_IMPORTED_MODULE_3__.makePbsInterceptor)({ + createBid + }); + registerBidInterceptor(() => hook.get('processBidderRequests'), bidderBidInterceptor); + registerBidInterceptor(() => hook.get('processPBSRequest'), pbsBidInterceptor); + sessionLoader({ + DEBUG_KEY, + config, + hook, + logger + }); + config.getConfig('debugging', _ref7 => { + let { + debugging + } = _ref7; + return getConfig(debugging, { + DEBUG_KEY, + config, + hook, + logger + }); + }, { + init: true + }); +} + +/***/ }), + +/***/ "./modules/debugging/index.js": +/*!************************************!*\ + !*** ./modules/debugging/index.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _debugging_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debugging.js */ "./modules/debugging/debugging.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/bidfactory.js */ "./src/bidfactory.js"); +/* harmony import */ var _src_debugging_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/debugging.js */ "./src/debugging.js"); + + + + + + + +(0,_debugging_js__WEBPACK_IMPORTED_MODULE_0__.install)({ + DEBUG_KEY: _src_debugging_js__WEBPACK_IMPORTED_MODULE_1__.DEBUG_KEY, + config: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config, + hook: _src_hook_js__WEBPACK_IMPORTED_MODULE_3__.hook, + createBid: _src_bidfactory_js__WEBPACK_IMPORTED_MODULE_4__.createBid, + logger: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.prefixLog)('DEBUG:') +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('debugging'); + +/***/ }), + +/***/ "./modules/debugging/legacy.js": +/*!*************************************!*\ + !*** ./modules/debugging/legacy.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ addHooks: () => (/* binding */ addHooks), +/* harmony export */ removeHooks: () => (/* binding */ removeHooks) +/* harmony export */ }); +/* unused harmony exports addBidResponseBound, addBidderRequestsBound, bidExcluded, bidderExcluded, applyBidOverrides, addBidResponseHook, addBidderRequestsHook */ +let addBidResponseBound; +let addBidderRequestsBound; +function addHooks(overrides, _ref) { + let { + hook, + logger + } = _ref; + addBidResponseBound = addBidResponseHook.bind({ + overrides, + logger + }); + hook.get('addBidResponse').before(addBidResponseBound, 5); + addBidderRequestsBound = addBidderRequestsHook.bind({ + overrides, + logger + }); + hook.get('addBidderRequests').before(addBidderRequestsBound, 5); +} +function removeHooks(_ref2) { + let { + hook + } = _ref2; + hook.get('addBidResponse').getHooks({ + hook: addBidResponseBound + }).remove(); + hook.get('addBidderRequests').getHooks({ + hook: addBidderRequestsBound + }).remove(); +} + +/** + * @param {{bidder:string, adUnitCode:string}} overrideObj + * @param {string} bidderCode + * @param {string} adUnitCode + * @returns {boolean} + */ +function bidExcluded(overrideObj, bidderCode, adUnitCode) { + if (overrideObj.bidder && overrideObj.bidder !== bidderCode) { + return true; + } + if (overrideObj.adUnitCode && overrideObj.adUnitCode !== adUnitCode) { + return true; + } + return false; +} + +/** + * @param {string[]} bidders + * @param {string} bidderCode + * @returns {boolean} + */ +function bidderExcluded(bidders, bidderCode) { + return Array.isArray(bidders) && bidders.indexOf(bidderCode) === -1; +} + +/** + * @param {Object} overrideObj + * @param {Object} bidObj + * @param {Object} bidType + * @returns {Object} bidObj with overridden properties + */ +function applyBidOverrides(overrideObj, bidObj, bidType, logger) { + return Object.keys(overrideObj).filter(key => ['adUnitCode', 'bidder'].indexOf(key) === -1).reduce(function (result, key) { + logger.logMessage(`bidder overrides changed '${result.adUnitCode}/${result.bidderCode}' ${bidType}.${key} from '${result[key]}.js' to '${overrideObj[key]}'`); + result[key] = overrideObj[key]; + result.isDebug = true; + return result; + }, bidObj); +} +function addBidResponseHook(next, adUnitCode, bid, reject) { + const { + overrides, + logger + } = this; + if (bidderExcluded(overrides.bidders, bid.bidderCode)) { + logger.logWarn(`bidder '${bid.bidderCode}' excluded from auction by bidder overrides`); + return; + } + if (Array.isArray(overrides.bids)) { + overrides.bids.forEach(function (overrideBid) { + if (!bidExcluded(overrideBid, bid.bidderCode, adUnitCode)) { + applyBidOverrides(overrideBid, bid, 'bidder', logger); + } + }); + } + next(adUnitCode, bid, reject); +} +function addBidderRequestsHook(next, bidderRequests) { + const { + overrides, + logger + } = this; + const includedBidderRequests = bidderRequests.filter(function (bidderRequest) { + if (bidderExcluded(overrides.bidders, bidderRequest.bidderCode)) { + logger.logWarn(`bidRequest '${bidderRequest.bidderCode}' excluded from auction by bidder overrides`); + return false; + } + return true; + }); + if (Array.isArray(overrides.bidRequests)) { + includedBidderRequests.forEach(function (bidderRequest) { + overrides.bidRequests.forEach(function (overrideBid) { + bidderRequest.bids.forEach(function (bid) { + if (!bidExcluded(overrideBid, bidderRequest.bidderCode, bid.adUnitCode)) { + applyBidOverrides(overrideBid, bid, 'bidRequest', logger); + } + }); + }); + }); + } + next(includedBidderRequests); +} + +/***/ }), + +/***/ "./modules/debugging/pbsInterceptor.js": +/*!*********************************************!*\ + !*** ./modules/debugging/pbsInterceptor.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ makePbsInterceptor: () => (/* binding */ makePbsInterceptor) +/* harmony export */ }); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); + + +function makePbsInterceptor(_ref) { + let { + createBid + } = _ref; + return function pbsBidInterceptor(next, interceptBids, s2sBidRequest, bidRequests, ajax, _ref2) { + let { + onResponse, + onError, + onBid, + onFledge + } = _ref2; + let responseArgs; + const done = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.delayExecution)(() => onResponse(...responseArgs), bidRequests.length + 1); + function signalResponse() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + responseArgs = args; + done(); + } + function addBid(bid, bidRequest) { + onBid({ + adUnit: bidRequest.adUnitCode, + bid: Object.assign(createBid(_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.STATUS.GOOD, bidRequest), { + requestBidder: bidRequest.bidder + }, bid) + }); + } + bidRequests = bidRequests.map(req => interceptBids({ + bidRequest: req, + addBid, + addPaapiConfig(config, bidRequest, bidderRequest) { + onFledge({ + adUnitCode: bidRequest.adUnitCode, + ortb2: bidderRequest.ortb2, + ortb2Imp: bidRequest.ortb2Imp, + ...config + }); + }, + done + }).bidRequest).filter(req => req.bids.length > 0); + if (bidRequests.length > 0) { + const bidIds = new Set(); + bidRequests.forEach(req => req.bids.forEach(bid => bidIds.add(bid.bidId))); + s2sBidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(s2sBidRequest); + s2sBidRequest.ad_units.forEach(unit => { + unit.bids = unit.bids.filter(bid => bidIds.has(bid.bid_id)); + }); + s2sBidRequest.ad_units = s2sBidRequest.ad_units.filter(unit => unit.bids.length > 0); + next(s2sBidRequest, bidRequests, ajax, { + onResponse: signalResponse, + onError, + onBid + }); + } else { + signalResponse(true, []); + } + }; +} + +/***/ }), + +/***/ "./modules/debugging/responses.js": +/*!****************************************!*\ + !*** ./modules/debugging/responses.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + + + +const ORTB_NATIVE_ASSET_TYPES = ['img', 'video', 'link', 'data', 'title']; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]: (bid, bidResponse) => { + if (!bidResponse.hasOwnProperty('ad') && !bidResponse.hasOwnProperty('adUrl')) { + let [size, repeat] = (bidResponse.width ?? bidResponse.wratio) < (bidResponse.height ?? bidResponse.hratio) ? [bidResponse.width, 'repeat-y'] : [bidResponse.height, 'repeat-x']; + size = size == null ? '100%' : `${size}px`; + bidResponse.ad = `
`; + } + }, + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]: (bid, bidResponse) => { + if (!bidResponse.hasOwnProperty('vastXml') && !bidResponse.hasOwnProperty('vastUrl')) { + bidResponse.vastXml = 'GDFPDemo00:00:11'; + bidResponse.renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__.Renderer.install({ + url: 'https://cdn.jwplayer.com/libraries/l5MchIxB.js' + }); + bidResponse.renderer.setRender(function (bid, doc) { + const parentId = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_2__.getGptSlotInfoForAdUnitCode)(bid.adUnitCode).divId ?? bid.adUnitCode; + const div = doc.createElement('div'); + div.id = `${parentId}-video-player`; + doc.getElementById(parentId).appendChild(div); + const player = window.jwplayer(div.id).setup({ + debug: true, + width: bidResponse.width, + height: bidResponse.height, + advertising: { + client: 'vast', + outstream: true, + endstate: 'close' + } + }); + player.on('ready', async function () { + if (bid.vastUrl) { + player.loadAdTag(bid.vastUrl); + } else { + player.loadAdXml(bid.vastXml); + } + }); + }); + } + }, + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]: (bid, bidResponse) => { + if (!bidResponse.hasOwnProperty('native')) { + bidResponse.native = { + ortb: { + link: { + url: 'https://www.link.example', + clicktrackers: ['https://impression.example'] + }, + assets: bid.nativeOrtbRequest.assets.map(mapDefaultNativeOrtbAsset) + } + }; + } + } +}); +function mapDefaultNativeOrtbAsset(asset) { + const assetType = ORTB_NATIVE_ASSET_TYPES.find(type => asset.hasOwnProperty(type)); + switch (assetType) { + case 'img': + return { + ...asset, + img: { + type: 3, + w: 600, + h: 500, + url: 'https://vcdn.adnxs.com/p/creative-image/27/c0/52/67/27c05267-5a6d-4874-834e-18e218493c32.png' + } + }; + case 'video': + return { + ...asset, + video: { + vasttag: 'GDFPDemo00:00:11' + } + }; + case 'data': + { + return { + ...asset, + data: { + value: '5 stars' + } + }; + } + case 'title': + { + return { + ...asset, + title: { + text: 'Prebid Native Example' + } + }; + } + } +} + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/debugging/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["deepintentBidAdapter"],{ + +/***/ "./modules/deepintentBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/deepintentBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ORTB_VIDEO_PARAMS, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/deepintentUtils/index.js */ "./libraries/deepintentUtils/index.js"); + + + + + +const BIDDER_CODE = 'deepintent'; +const GVL_ID = 541; +const BIDDER_ENDPOINT = 'https://prebid.deepintent.com/prebid'; +const USER_SYNC_URL = 'https://cdn.deepintent.com/syncpixel.html'; +const DI_M_V = '1.0.0'; +const ORTB_VIDEO_PARAMS = { + ..._libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.COMMON_ORTB_VIDEO_PARAMS, + 'plcmt': value => Array.isArray(value) && value.every(v => v >= 1 && v <= 5), + 'delivery': value => [1, 2, 3].indexOf(value) !== -1, + 'pos': value => [0, 1, 2, 3, 4, 5, 6, 7].indexOf(value) !== -1 +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + aliases: [], + // tagId is mandatory param + isBidRequestValid: bid => { + let valid = false; + if (bid && bid.params && bid.params.tagId) { + if (typeof bid.params.tagId === 'string' || bid.params.tagId instanceof String) { + if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO)) { + if (bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].hasOwnProperty('context')) { + valid = true; + } + } else { + valid = true; + } + } + } + return valid; + }, + interpretResponse: function (bidResponse, bidRequest) { + let responses = []; + if (bidResponse && bidResponse.body) { + try { + let bids = bidResponse.body.seatbid && bidResponse.body.seatbid[0] ? bidResponse.body.seatbid[0].bid : []; + if (bids) { + bids.forEach(bidObj => { + let newBid = (0,_libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.formatResponse)(bidObj); + let mediaType = _checkMediaType(bidObj); + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } else if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + newBid.vastXml = bidObj.adm; + } + responses.push(newBid); + }); + } + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err); + } + } + return responses; + }, + buildRequests: function (validBidRequests, bidderRequest) { + var user = validBidRequests.map(bid => buildUser(bid)); + clean(user); + const openRtbBidRequest = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + at: 1, + imp: validBidRequests.map(bid => buildImpression(bid)), + site: buildSite(bidderRequest), + device: buildDevice(), + user: user && user.length === 1 ? user[0] : {} + }; + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // GPP Consent + if (bidderRequest?.gppConsent?.gppString) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections); + } else if (bidderRequest?.ortb2?.regs?.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.gpp', bidderRequest.ortb2.regs.gpp); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid); + } + + // coppa compliance + if (bidderRequest?.ortb2?.regs?.coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'regs.coppa', 1); + } + injectEids(openRtbBidRequest, validBidRequests); + return { + method: 'POST', + url: BIDDER_ENDPOINT, + data: JSON.stringify(openRtbBidRequest), + options: { + contentType: 'application/json' + } + }; + }, + /** + * Register User Sync. + */ + getUserSyncs: syncOptions => { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: USER_SYNC_URL + }]; + } + } +}; +function _checkMediaType(bid) { + let videoRegex = new RegExp(/VAST\s+version/); + let mediaType; + if (bid.adm && bid.adm.indexOf('deepintent_wrapper') >= 0) { + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } else if (videoRegex.test(bid.adm)) { + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } + return mediaType; +} +function clean(obj) { + for (let propName in obj) { + if (obj[propName] === null || obj[propName] === undefined) { + delete obj[propName]; + } + } +} +function buildImpression(bid) { + let impression = {}; + const floor = getFloor(bid); + impression = { + id: bid.bidId, + tagid: bid.params.tagId || '', + ...(!isNaN(floor) && { + bidfloor: floor + }), + secure: window.location.protocol === 'https:' ? 1 : 0, + displaymanager: 'di_prebid', + displaymanagerver: DI_M_V, + ext: buildCustomParams(bid) + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.banner')) { + impression['banner'] = buildBanner(bid); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video')) { + impression['video'] = _buildVideo(bid); + } + return impression; +} +function getFloor(bidRequest) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bidRequest.getFloor)) { + return bidRequest.params?.bidfloor; + } + let floor = bidRequest.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +function _buildVideo(bid) { + const videoObj = {}; + const videoAdUnitParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'params.video', {}); + const computedParams = {}; + if (Array.isArray(videoAdUnitParams.playerSize)) { + const tempSize = Array.isArray(videoAdUnitParams.playerSize[0]) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize; + computedParams.w = tempSize[0]; + computedParams.h = tempSize[1]; + } + const videoParams = { + ...computedParams, + ...videoAdUnitParams, + ...videoBidderParams + }; + Object.keys(ORTB_VIDEO_PARAMS).forEach(paramName => { + if (videoParams.hasOwnProperty(paramName)) { + if (ORTB_VIDEO_PARAMS[paramName](videoParams[paramName])) { + videoObj[paramName] = videoParams[paramName]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`The OpenRTB video param ${paramName} has been skipped due to misformating. Please refer to OpenRTB 2.5 spec.`); + } + } + }); + return videoObj; +} +; +function buildCustomParams(bid) { + if (bid.params && bid.params.custom) { + return { + deepintent: bid.params.custom + }; + } else { + return {}; + } +} +function buildUser(bid) { + if (bid && bid.params && bid.params.user) { + return { + id: bid.params.user.id && typeof bid.params.user.id == 'string' ? bid.params.user.id : undefined, + buyeruid: bid.params.user.buyeruid && typeof bid.params.user.buyeruid == 'string' ? bid.params.user.buyeruid : undefined, + yob: bid.params.user.yob && typeof bid.params.user.yob == 'number' ? bid.params.user.yob : null, + gender: bid.params.user.gender && typeof bid.params.user.gender == 'string' ? bid.params.user.gender : undefined, + keywords: bid.params.user.keywords && typeof bid.params.user.keywords == 'string' ? bid.params.user.keywords : undefined, + customdata: bid.params.user.customdata && typeof bid.params.user.customdata == 'string' ? bid.params.user.customdata : undefined + }; + } +} +function injectEids(openRtbBidRequest, validBidRequests) { + const bidUserIdAsEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(validBidRequests, '0.userIdAsEids'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidUserIdAsEids) && bidUserIdAsEids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'user.eids', bidUserIdAsEids); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbBidRequest, 'user.ext.eids', bidUserIdAsEids); + } +} +function buildBanner(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.banner')) { + // Get Sizes from MediaTypes Object, Will always take first size, will be overrided by params for exact w,h + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.banner.sizes') && !bid.params.height && !bid.params.width) { + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.banner.sizes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(sizes) && sizes.length > 0) { + return { + h: sizes[0][1], + w: sizes[0][0], + pos: bid && bid.params && bid.params.pos ? bid.params.pos : 0 + }; + } + } else { + return { + h: bid.params.height, + w: bid.params.width, + pos: bid && bid.params && bid.params.pos ? bid.params.pos : 0 + }; + } + } +} +function buildSite(bidderRequest) { + let site = {}; + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + site.page = bidderRequest.refererInfo.page; + site.domain = bidderRequest.refererInfo.domain; + } + return site; +} +function buildDevice() { + return { + ua: navigator.userAgent, + js: 1, + dnt: navigator.doNotTrack == 'yes' || navigator.doNotTrack === '1' ? 1 : 0, + h: screen.height, + w: screen.width, + language: navigator.language + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('deepintentBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["deepintentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/deepintentBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["deepintentDpesIdSystem"],{ + +/***/ "./modules/deepintentDpesIdSystem.js": +/*!*******************************************!*\ + !*** ./modules/deepintentDpesIdSystem.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, deepintentDpesSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/** + * This module adds DPES to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/deepintentDpesSystem + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + */ + +const MODULE_NAME = 'deepintentId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** @type {Submodule} */ +const deepintentDpesSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {{value:string}} value + * @returns {{deepintentId:Object}} + */ + decode(value, config) { + return value ? { + 'deepintentId': value + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} config + * @param {ConsentData|undefined} consentData + * @param {Object} cacheIdObj - existing id, if any + * @return {{id: string | undefined} | undefined} + */ + getId(config, consentData, cacheIdObj) { + return cacheIdObj; + }, + eids: { + 'deepintentId': { + source: 'deepintent.com', + atype: 3, + getValue: userIdData => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(userIdData) && userIdData?.id) { + return userIdData.id; + } + return userIdData; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', deepintentDpesSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('deepintentDpesIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/deepintentDpesIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["deltaprojectsBidAdapter"],{ + +/***/ "./modules/deltaprojectsBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/deltaprojectsBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, BIDDER_ENDPOINT_URL, USERSYNC_URL, getBidFloor, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +const BIDDER_CODE = 'deltaprojects'; +const BIDDER_ENDPOINT_URL = 'https://d5p.de17a.com/dogfight/prebid'; +const USERSYNC_URL = 'https://userservice.de17a.com/getuid/prebid'; + +/** -- isBidRequestValid -- */ +function isBidRequestValid(bid) { + if (!bid) return false; + if (bid.bidder !== BIDDER_CODE) return false; + + // publisher id is required + const publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.publisherId'); + if (!publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Invalid bid request, missing publisher id in params'); + return false; + } + return true; +} + +/** -- Build requests -- */ +function buildRequests(validBidRequests, bidderRequest) { + /** == shared == */ + // -- build id + const id = bidderRequest.bidderRequestId; + + // -- build site + const publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.publisherId'); + const siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.siteId'); + const site = { + id: siteId, + domain: bidderRequest.refererInfo.domain, + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref, + publisher: { + id: publisherId + } + }; + + // -- build device + const ua = navigator.userAgent; + const device = { + ua, + w: screen.width, + h: screen.height + }; + + // -- build user, reg + let user = { + ext: {} + }; + const regs = { + ext: {} + }; + const gdprConsent = bidderRequest && bidderRequest.gdprConsent; + if (gdprConsent) { + user.ext = { + consent: gdprConsent.consentString + }; + if (typeof gdprConsent.gdprApplies == 'boolean') { + regs.ext.gdpr = gdprConsent.gdprApplies ? 1 : 0; + } + } + + // -- build tmax + let tmax = bidderRequest && bidderRequest.timeout > 0 ? bidderRequest.timeout : undefined; + + // build bid specific + return validBidRequests.map(validBidRequest => { + const openRTBRequest = buildOpenRTBRequest(validBidRequest, bidderRequest, id, site, device, user, tmax, regs); + return { + method: 'POST', + url: BIDDER_ENDPOINT_URL, + data: openRTBRequest, + options: { + contentType: 'application/json' + }, + bids: [validBidRequest] + }; + }); +} +function buildOpenRTBRequest(validBidRequest, bidderRequest, id, site, device, user, tmax, regs) { + // build cur + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(bidderRequest) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(validBidRequest, 'params.currency'); + const cur = currency && [currency]; + + // build impression + const impression = buildImpression(validBidRequest, currency); + + // build test + const test = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(validBidRequest, 'params.test') ? 1 : 0; + const at = 1; + + // build source + const source = { + tid: validBidRequest.auctionId, + fd: 1 + }; + return { + id, + at, + imp: [impression], + site, + device, + user, + test, + tmax, + cur, + source, + regs, + ext: {} + }; +} +function buildImpression(bid, currency) { + const impression = { + id: bid.bidId, + tagid: bid.params.tagId, + ext: {} + }; + const bannerMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER}`); + impression.banner = buildImpressionBanner(bid, bannerMediaType); + + // bid floor + const bidFloor = getBidFloor(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, '*', currency); + if (bidFloor) { + impression.bidfloor = bidFloor.floor; + impression.bidfloorcur = bidFloor.currency; + } + return impression; +} +function buildImpressionBanner(bid, bannerMediaType) { + const bannerSizes = bannerMediaType && bannerMediaType.sizes || bid.sizes; + return { + format: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(bannerSizes, _ref => { + let [width, height] = _ref; + return { + w: width, + h: height + }; + }) + }; +} + +/** -- Interpret response -- */ +function interpretResponse(serverResponse) { + if (!serverResponse.body) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Response body is invalid, return !!'); + return []; + } + const { + body: { + id, + seatbid, + cur + } + } = serverResponse; + if (!id || !seatbid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Id / seatbid of response is invalid, return !!'); + return []; + } + const bidResponses = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(seatbid, seatbid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(seatbid.bid, bid => { + const bidObj = { + requestId: bid.impid, + cpm: parseFloat(bid.price), + width: parseInt(bid.w), + height: parseInt(bid.h), + creativeId: bid.crid || bid.id, + dealId: bid.dealid || null, + currency: cur, + netRevenue: true, + ttl: 60 + }; + bidObj.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + bidObj.ad = bid.adm; + if (bid.nurl) { + bidObj.ad += (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(decodeURIComponent(bid.nurl)); + } + if (bid.ext) { + bidObj[BIDDER_CODE] = bid.ext; + } + bidResponses.push(bidObj); + }); + }); + return bidResponses; +} + +/** -- On Bid Won -- */ +function onBidWon(bid) { + let cpm = bid.cpm; + if (bid.currency && bid.currency !== bid.originalCurrency && typeof bid.getCpmInNewCurrency === 'function') { + cpm = bid.getCpmInNewCurrency(bid.originalCurrency); + } + const wonPrice = Math.round(cpm * 1000000); + const wonPriceMacroPatten = /\$\{AUCTION_PRICE:B64\}/g; + bid.ad = bid.ad.replace(wonPriceMacroPatten, wonPrice); +} + +/** -- Get user syncs -- */ +function getUserSyncs(syncOptions, serverResponses, gdprConsent) { + const syncs = []; + if (syncOptions.pixelEnabled) { + let gdprParams; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdprParams = `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdprParams = `?gdpr_consent=${gdprConsent.consentString}`; + } + } else { + gdprParams = ''; + } + syncs.push({ + type: 'image', + url: USERSYNC_URL + gdprParams + }); + } + return syncs; +} + +/** -- Get bid floor -- */ +function getBidFloor(bid, mediaType, size, currency) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + const bidFloorCurrency = currency || 'USD'; + const bidFloor = bid.getFloor({ + currency: bidFloorCurrency, + mediaType: mediaType, + size: size + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bidFloor?.floor)) { + return bidFloor; + } + } +} + +/** -- Register -- */ +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse, + onBidWon, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('deltaprojectsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/deltaprojectsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dexertoBidAdapter"],{ + +/***/ "./modules/dexertoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/dexertoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/audUtils/bidderUtils.js */ "./libraries/audUtils/bidderUtils.js"); + + + + +const ENDPOINT_URL = 'https://rtb.dexerto.media/hb/dexerto'; +// Export const spec +const spec = { + code: 'dexerto', + supportedMediaTypes: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + // Determines whether or not the given bid request is valid + isBidRequestValid: bid => { + return !!bid.params.placement_id; + }, + // Make a server request from the list of BidRequests + buildRequests: (bidRequests, bidderRequest) => { + return (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerRequest)(bidRequests, bidderRequest, ENDPOINT_URL); + }, + // Unpack the response from the server into a list of bids. + interpretResponse: (bidResponse, bidRequest) => { + return (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerResponse)(bidResponse, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('dexertoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["audUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dexertoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dfpAdServerVideo"],{ + +/***/ "./modules/dfpAdServerVideo.js": +/*!*************************************!*\ + !*** ./modules/dfpAdServerVideo.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports dep, VAST_TAG_URI_TAGNAME, buildDfpVideoUrl, notifyTranslationModule, getVastXml, getBase64BlobContent */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_adServerManager_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/adServerManager.js */ "./src/adServerManager.js"); +/* harmony import */ var _src_adserver_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adserver.js */ "./src/adserver.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/targeting.js */ "./src/targeting.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/dfpUtils/dfpUtils.js */ "./libraries/dfpUtils/dfpUtils.js"); +/* harmony import */ var _src_videoCache_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/videoCache.js */ "./src/videoCache.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_xmlUtils_xmlUtils_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../libraries/xmlUtils/xmlUtils.js */ "./libraries/xmlUtils/xmlUtils.js"); + +/** + * This module adds [DFP support]{@link https://www.doubleclickbygoogle.com/} for Video to Prebid. + */ + + + + + + + + + + + + + + + + +/** + * @typedef {Object} DfpVideoParams + * + * This object contains the params needed to form a URL which hits the + * [DFP API]{@link https://support.google.com/dfp_premium/answer/1068325?hl=en}. + * + * All params (except iu, mentioned below) should be considered optional. This module will choose reasonable + * defaults for all of the other required params. + * + * The cust_params property, if present, must be an object. It will be merged with the rest of the + * standard Prebid targeting params (hb_adid, hb_bidder, etc). + * + * @param {string} iu This param *must* be included, in order for us to create a valid request. + * @param [string] description_url This field is required if you want Ad Exchange to bid on our ad unit... + * but otherwise optional + */ + +/** + * @typedef {Object} DfpVideoOptions + * + * @param {Object} adUnit The adUnit which this bid is supposed to help fill. + * @param [Object] bid The bid which should be considered alongside the rest of the adserver's demand. + * If this isn't defined, then we'll use the winning bid for the adUnit. + * + * @param {DfpVideoParams} [params] Query params which should be set on the DFP request. + * These will override this module's defaults whenever they conflict. + * @param {string} [url] video adserver url + */ + +const dep = { + ri: _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo +}; +const VAST_TAG_URI_TAGNAME = 'VASTAdTagURI'; + +/** + * Merge all the bid data and publisher-supplied options into a single URL, and then return it. + * + * @see [The DFP API]{@link https://support.google.com/dfp_premium/answer/1068325?hl=en#env} for details. + * + * @param {DfpVideoOptions} options Options which should be used to construct the URL. + * + * @return {string} A URL which calls DFP, letting options.bid + * (or the auction's winning bid for this adUnit, if undefined) compete alongside the rest of the + * demand in DFP. + */ +function buildDfpVideoUrl(options) { + if (!options.params && !options.url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`A params object or a url is required to use pbjs.adServers.dfp.buildVideoUrl`); + return; + } + const adUnit = options.adUnit; + const bid = options.bid || _src_targeting_js__WEBPACK_IMPORTED_MODULE_2__.targeting.getWinningBids(adUnit.code)[0]; + let urlComponents = {}; + if (options.url) { + // when both `url` and `params` are given, parsed url will be overwriten + // with any matching param components + urlComponents = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)(options.url, { + noDecodeWholeURL: true + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(options.params)) { + return buildUrlFromAdserverUrlComponents(urlComponents, bid, options); + } + } + const derivedParams = { + correlator: Date.now(), + sz: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(adUnit?.mediaTypes?.video?.playerSize).join('|'), + url: encodeURIComponent(location.href) + }; + const urlSearchComponent = urlComponents.search; + const urlSzParam = urlSearchComponent && urlSearchComponent.sz; + if (urlSzParam) { + derivedParams.sz = urlSzParam + '|' + derivedParams.sz; + } + let encodedCustomParams = getCustParams(bid, options, urlSearchComponent && urlSearchComponent.cust_params); + const queryParams = Object.assign({}, _libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_DFP_PARAMS, urlComponents.search, derivedParams, options.params, { + cust_params: encodedCustomParams + }, (0,_libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.gdprParams)()); + const descriptionUrl = getDescriptionUrl(bid, options, 'params'); + if (descriptionUrl) { + queryParams.description_url = descriptionUrl; + } + if (!queryParams.ppid) { + const ppid = (0,_src_adserver_js__WEBPACK_IMPORTED_MODULE_4__.getPPID)(); + if (ppid != null) { + queryParams.ppid = ppid; + } + } + const video = options.adUnit?.mediaTypes?.video; + Object.entries({ + plcmt: () => video?.plcmt, + min_ad_duration: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(video?.minduration) ? video.minduration * 1000 : null, + max_ad_duration: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(video?.maxduration) ? video.maxduration * 1000 : null, + vpos() { + const startdelay = video?.startdelay; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(startdelay)) { + if (startdelay === -2) return 'postroll'; + if (startdelay === -1 || startdelay > 0) return 'midroll'; + return 'preroll'; + } + }, + vconp: () => Array.isArray(video?.playbackmethod) && video.playbackmethod.some(m => m === 7) ? '2' : undefined, + vpa() { + // playbackmethod = 3 is play on click; 1, 2, 4, 5, 6 are autoplay + if (Array.isArray(video?.playbackmethod)) { + const click = video.playbackmethod.some(m => m === 3); + const auto = video.playbackmethod.some(m => [1, 2, 4, 5, 6].includes(m)); + if (click && !auto) return 'click'; + if (auto && !click) return 'auto'; + } + }, + vpmute() { + // playbackmethod = 2, 6 are muted; 1, 3, 4, 5 are not + if (Array.isArray(video?.playbackmethod)) { + const muted = video.playbackmethod.some(m => [2, 6].includes(m)); + const talkie = video.playbackmethod.some(m => [1, 3, 4, 5].includes(m)); + if (muted && !talkie) return '1'; + if (talkie && !muted) return '0'; + } + } + }).forEach(_ref => { + let [param, getter] = _ref; + if (!queryParams.hasOwnProperty(param)) { + const val = getter(); + if (val != null) { + queryParams[param] = val; + } + } + }); + const fpd = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.index.getBidRequest(options.bid || {})?.ortb2 ?? _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.index.getAuction(options.bid || {})?.getFPD()?.global; + const signals = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.getSignals)(fpd); + if (signals.length) { + queryParams.ppsj = btoa(JSON.stringify({ + PublisherProvidedTaxonomySignals: signals + })); + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)(Object.assign({}, _libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.DFP_ENDPOINT, urlComponents, { + search: queryParams + })); +} +function notifyTranslationModule(fn) { + fn.call(this, 'dfp'); +} +if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('brandCategoryTranslation.translationFile')) { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.getHook)('registerAdserver').before(notifyTranslationModule); +} + +/** + * Builds a video url from a base dfp video url and a winning bid, appending + * Prebid-specific key-values. + * @param {Object} components base video adserver url parsed into components object + * @param {Object} bid winning bid object to append parameters from + * @param {Object} options Options which should be used to construct the URL (used for custom params). + * @return {string} video url + */ +function buildUrlFromAdserverUrlComponents(components, bid, options) { + const descriptionUrl = getDescriptionUrl(bid, components, 'search'); + if (descriptionUrl) { + components.search.description_url = descriptionUrl; + } + components.search.cust_params = getCustParams(bid, options, components.search.cust_params); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)(components); +} + +/** + * Returns the encoded vast url if it exists on a bid object, only if prebid-cache + * is disabled, and description_url is not already set on a given input + * @param {Object} bid object to check for vast url + * @param {Object} components the object to check that description_url is NOT set on + * @param {string} prop the property of components that would contain description_url + * @return {string | undefined} The encoded vast url if it exists, or undefined + */ +function getDescriptionUrl(bid, components, prop) { + return components?.[prop]?.description_url || encodeURIComponent(dep.ri().page); +} + +/** + * Returns the encoded `cust_params` from the bid.adserverTargeting and adds the `hb_uuid`, and `hb_cache_id`. Optionally the options.params.cust_params + * @param {Object} bid + * @param {Object} options this is the options passed in from the `buildDfpVideoUrl` function + * @return {Object} Encoded key value pairs for cust_params + */ +function getCustParams(bid, options, urlCustParams) { + const adserverTargeting = bid && bid.adserverTargeting || {}; + let allTargetingData = {}; + const adUnit = options && options.adUnit; + if (adUnit) { + let allTargeting = _src_targeting_js__WEBPACK_IMPORTED_MODULE_2__.targeting.getAllTargeting(adUnit.code); + allTargetingData = allTargeting ? allTargeting[adUnit.code] : {}; + } + const prebidTargetingSet = Object.assign({}, + // Why are we adding standard keys here ? Refer https://github.com/prebid/Prebid.js/issues/3664 + { + hb_uuid: bid && bid.videoCacheKey + }, + // hb_cache_id became optional in prebid 5.0 after 4.x enabled the concept of optional keys. Discussion led to reversing the prior expectation of deprecating hb_uuid + { + hb_cache_id: bid && bid.videoCacheKey + }, allTargetingData, adserverTargeting); + + // TODO: WTF is this? just firing random events, guessing at the argument, hoping noone notices? + _src_events_js__WEBPACK_IMPORTED_MODULE_9__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_10__.EVENTS.SET_TARGETING, { + [adUnit.code]: prebidTargetingSet + }); + + // merge the prebid + publisher targeting sets + const publisherTargetingSet = options?.params?.cust_params; + const targetingSet = Object.assign({}, prebidTargetingSet, publisherTargetingSet); + let encodedParams = encodeURIComponent((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(targetingSet)); + if (urlCustParams) { + encodedParams = urlCustParams + '%26' + encodedParams; + } + return encodedParams; +} +async function getVastForLocallyCachedBids(gamVastWrapper, localCacheMap) { + try { + const xmlUtil = (0,_libraries_xmlUtils_xmlUtils_js__WEBPACK_IMPORTED_MODULE_11__["default"])(); + const xmlDoc = xmlUtil.parse(gamVastWrapper); + const vastAdTagUriElement = xmlDoc.querySelectorAll(VAST_TAG_URI_TAGNAME)[0]; + if (!vastAdTagUriElement || !vastAdTagUriElement.textContent) { + return gamVastWrapper; + } + const uuidExp = new RegExp(`[A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}`, 'gi'); + const matchResult = Array.from(vastAdTagUriElement.textContent.matchAll(uuidExp)); + const uuidCandidates = matchResult.map(_ref2 => { + let [uuid] = _ref2; + return uuid; + }).filter(uuid => localCacheMap.has(uuid)); + if (uuidCandidates.length != 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Unable to determine unique uuid in ${VAST_TAG_URI_TAGNAME}`); + return gamVastWrapper; + } + const uuid = uuidCandidates[0]; + const blobUrl = localCacheMap.get(uuid); + const base64BlobContent = await getBase64BlobContent(blobUrl); + const cdata = xmlDoc.createCDATASection(base64BlobContent); + vastAdTagUriElement.textContent = ''; + vastAdTagUriElement.appendChild(cdata); + return xmlUtil.serialize(xmlDoc); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Unable to process xml', error); + return gamVastWrapper; + } +} +; +async function getVastXml(options) { + let localCacheMap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _src_videoCache_js__WEBPACK_IMPORTED_MODULE_12__.vastLocalCache; + const vastUrl = buildDfpVideoUrl(options); + const response = await (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_13__.fetch)(vastUrl); + if (!response.ok) { + throw new Error('Unable to fetch GAM VAST wrapper'); + } + const gamVastWrapper = await response.text(); + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('cache.useLocal')) { + const vastXml = await getVastForLocallyCachedBids(gamVastWrapper, localCacheMap); + return vastXml; + } + return gamVastWrapper; +} +async function getBase64BlobContent(blobUrl) { + const response = await (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_13__.fetch)(blobUrl); + if (!response.ok) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Unable to fetch blob'); + throw new Error('Blob not found'); + } + // Mechanism to handle cases where VAST tags are fetched + // from a context where the blob resource is not accessible. + // like IMA SDK iframe + const blobContent = await response.text(); + const dataUrl = `data://text/xml;base64,${btoa(blobContent)}`; + return dataUrl; +} +(0,_src_adServerManager_js__WEBPACK_IMPORTED_MODULE_14__.registerVideoSupport)('dfp', { + buildVideoUrl: buildDfpVideoUrl, + getVastXml +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_15__.registerModule)('dfpAdServerVideo'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","gptUtils","dfpUtils","xmlUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dfpAdServerVideo.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dfpAdpod"],{ + +/***/ "./modules/dfpAdpod.js": +/*!*****************************!*\ + !*** ./modules/dfpAdpod.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports adpodUtils, buildAdpodVideoUrl */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/dfpUtils/dfpUtils.js */ "./libraries/dfpUtils/dfpUtils.js"); +/* harmony import */ var _src_adServerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adServerManager.js */ "./src/adServerManager.js"); + + + + + + +const adpodUtils = {}; + +/** + * @typedef {Object} DfpAdpodOptions + * + * @param {string} code Ad Unit code + * @param {Object} params Query params which should be set on the DFP request. + * These will override this module's defaults whenever they conflict. + * @param {function} callback Callback function to execute when master tag is ready + */ + +/** + * Creates master tag url for long-form + * @param {DfpAdpodOptions} options + * @returns {string} A URL which calls DFP with custom adpod targeting key values to compete with rest of the demand in DFP + */ +function buildAdpodVideoUrl() { + let { + code, + params, + callback + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + // TODO: the public API for this does not take in enough info to fill all DFP params (adUnit/bid), + // and is marked "alpha": https://docs.prebid.org/dev-docs/publisher-api-reference/adServers.dfp.buildAdpodVideoUrl.html + if (!params || !callback) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`A params object and a callback is required to use pbjs.adServers.dfp.buildAdpodVideoUrl`); + return; + } + const derivedParams = { + correlator: Date.now(), + sz: getSizeForAdUnit(code), + url: encodeURIComponent(location.href) + }; + function getSizeForAdUnit(code) { + let adUnit = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.getAdUnits().filter(adUnit => adUnit.code === code); + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adUnit[0], 'mediaTypes.video.playerSize'); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(sizes).join('|'); + } + adpodUtils.getTargeting({ + 'codes': [code], + 'callback': createMasterTag + }); + function createMasterTag(err, targeting) { + if (err) { + callback(err, null); + return; + } + let initialValue = { + [adpodUtils.TARGETING_KEY_PB_CAT_DUR]: undefined, + [adpodUtils.TARGETING_KEY_CACHE_ID]: undefined + }; + let customParams = {}; + if (targeting[code]) { + customParams = targeting[code].reduce((acc, curValue) => { + if (Object.keys(curValue)[0] === adpodUtils.TARGETING_KEY_PB_CAT_DUR) { + acc[adpodUtils.TARGETING_KEY_PB_CAT_DUR] = typeof acc[adpodUtils.TARGETING_KEY_PB_CAT_DUR] !== 'undefined' ? acc[adpodUtils.TARGETING_KEY_PB_CAT_DUR] + ',' + curValue[adpodUtils.TARGETING_KEY_PB_CAT_DUR] : curValue[adpodUtils.TARGETING_KEY_PB_CAT_DUR]; + } else if (Object.keys(curValue)[0] === adpodUtils.TARGETING_KEY_CACHE_ID) { + acc[adpodUtils.TARGETING_KEY_CACHE_ID] = curValue[adpodUtils.TARGETING_KEY_CACHE_ID]; + } + return acc; + }, initialValue); + } + let encodedCustomParams = encodeURIComponent((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)(customParams)); + const queryParams = Object.assign({}, _libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_DFP_PARAMS, derivedParams, params, { + cust_params: encodedCustomParams + }, (0,_libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.gdprParams)()); + const masterTag = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.buildUrl)({ + ..._libraries_dfpUtils_dfpUtils_js__WEBPACK_IMPORTED_MODULE_3__.DFP_ENDPOINT, + search: queryParams + }); + callback(null, masterTag); + } +} +(0,_src_adServerManager_js__WEBPACK_IMPORTED_MODULE_4__.registerVideoSupport)('dfp', { + buildAdpodVideoUrl: buildAdpodVideoUrl, + getAdpodTargeting: args => adpodUtils.getTargeting(args) +}); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('adpod', adpodUtils); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('dfpAdpod'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","dfpUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dfpAdpod.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dgkeywordRtdProvider"],{ + +/***/ "./modules/dgkeywordRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/dgkeywordRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getDgKeywordsAndSet, getProfileApiUrl, readFpidFromLocalStrage, getTargetBidderOfDgKeywords, dgkeywordSubmodule, convertKeywordsToString */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds dgkeyword provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will get keywords from 1plux profile api. + * This module can work only with AppNexusBidAdapter. + * @module modules/dgkeywordProvider + * @requires module:modules/realTimeData + */ + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** + * get keywords from api server. and set keywords. + * @param {Object} reqBidsConfigObj + * @param {function} callback + * @param {Object} moduleConfig + * @param {Object} userConsent + */ +function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, userConsent) { + const PROFILE_TIMEOUT_MS = 1000; + const timeout = moduleConfig && moduleConfig.params && moduleConfig.params.timeout && Number(moduleConfig.params.timeout) > 0 ? Number(moduleConfig.params.timeout) : PROFILE_TIMEOUT_MS; + const adUnits = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().adUnits; + callback = function (cb) { + let done = false; + return function () { + if (!done) { + done = true; + return cb.apply(this, arguments); + } + }; + }(callback); + let isFinish = false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('[dgkeyword sub module]', adUnits, timeout); + let setKeywordTargetBidders = getTargetBidderOfDgKeywords(adUnits); + if (setKeywordTargetBidders.length <= 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('[dgkeyword sub module] no dgkeyword targets.'); + callback(); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('[dgkeyword sub module] dgkeyword targets:', setKeywordTargetBidders); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('[dgkeyword sub module] get targets from profile api start.'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(getProfileApiUrl(moduleConfig?.params?.url, moduleConfig?.params?.enableReadFpid), { + success: function (response) { + const res = JSON.parse(response); + if (!isFinish) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('[dgkeyword sub module] get targets from profile api end.'); + if (res) { + let keywords = {}; + if (res['s'] != null && res['s'].length > 0) { + keywords['opeaud'] = res['s']; + } + if (res['t'] != null && res['t'].length > 0) { + keywords['opectx'] = res['t']; + } + if (Object.keys(keywords).length > 0) { + const targetBidKeys = {}; + for (let bid of setKeywordTargetBidders) { + // set keywords to ortb2Imp + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'ortb2Imp.ext.data.keywords', convertKeywordsToString(keywords)); + if (!targetBidKeys[bid.bidder]) { + targetBidKeys[bid.bidder] = true; + } + } + } + } + isFinish = true; + } + callback(); + }, + error: function (errorStatus) { + // error occur + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[dgkeyword sub module] profile api access error.', errorStatus); + callback(); + } + }, null, { + withCredentials: true + }); + setTimeout(function () { + if (!isFinish) { + // profile api timeout + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[dgkeyword sub module] profile api timeout. [timeout: ' + timeout + 'ms]'); + isFinish = true; + } + callback(); + }, timeout); + } +} +function getProfileApiUrl(customeUrl, enableReadFpid) { + const URL = 'https://mediaconsortium.profiles.tagger.opecloud.com/api/v1'; + const fpid = enableReadFpid ? readFpidFromLocalStrage() : ''; + let url = customeUrl || URL; + url = url + '?url=' + encodeURIComponent(window.location.href) + (fpid ? `&fpid=${fpid}` : ''); + return url; +} +function readFpidFromLocalStrage() { + try { + // TODO: use storageManager + // eslint-disable-next-line no-restricted-properties + const fpid = window.localStorage.getItem('ope_fpid'); + if (fpid) { + return fpid; + } + return null; + } catch (error) { + return null; + } +} + +/** + * get all bidder which hava {dgkeyword: true} in params + * @param {Object} adUnits + */ +function getTargetBidderOfDgKeywords(adUnits) { + let setKeywordTargetBidders = []; + for (let adUnit of adUnits) { + for (let bid of adUnit.bids) { + if (bid.params && bid.params['dgkeyword'] === true) { + delete bid.params['dgkeyword']; + setKeywordTargetBidders.push(bid); + } + } + } + return setKeywordTargetBidders; +} + +/** @type {RtdSubmodule} */ +const dgkeywordSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: 'dgkeyword', + /** + * get data and send back to realTimeData module + * @function + * @param {string[]} adUnitsCodes + */ + getBidRequestData: getDgKeywordsAndSet, + init: init +}; +function init(moduleConfig) { + return true; +} +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('realTimeData', dgkeywordSubmodule); +} + +// keywords: { 'genre': ['rock', 'pop'], 'pets': ['dog'] } goes to 'genre=rock,genre=pop,pets=dog' +function convertKeywordsToString(keywords) { + let result = ''; + Object.keys(keywords).forEach(key => { + // if 'text' or '' + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(keywords[key])) { + if (keywords[key] !== '') { + result += `${key}=${keywords[key]},`; + } else { + result += `${key},`; + } + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(keywords[key])) { + let isValSet = false; + keywords[key].forEach(val => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(val) && val) { + result += `${key}=${val},`; + isValSet = true; + } + }); + if (!isValSet) { + result += `${key},`; + } + } else { + result += `${key},`; + } + }); + + // remove last trailing comma + result = result.substring(0, result.length - 1); + return result; +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.registerModule)('dgkeywordRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dgkeywordRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dianomiBidAdapter"],{ + +/***/ "./modules/dianomiBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/dianomiBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/userSyncUtils/userSyncUtils.js */ "./libraries/userSyncUtils/userSyncUtils.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + + + + +const { + getConfig +} = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config; +const BIDDER_CODE = 'dianomi'; +const GVLID = 885; +const BIDDER_ALIAS = [{ + code: 'dia', + gvlid: GVLID +}]; +const NATIVE_ASSET_IDS = { + 0: 'title', + 2: 'icon', + 3: 'image', + 5: 'sponsoredBy', + 4: 'body', + 1: 'cta' +}; +const NATIVE_PARAMS = { + title: { + id: 0, + name: 'title' + }, + icon: { + id: 2, + type: 1, + name: 'img' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + sponsoredBy: { + id: 5, + name: 'data', + type: 1 + }, + body: { + id: 4, + name: 'data', + type: 2 + }, + cta: { + id: 1, + type: 12, + name: 'data' + } +}; +let endpoint = 'www-prebid.dianomi.com'; +const OUTSTREAM_RENDERER_URL = hostname => `https://${hostname}/prebid/outstream/renderer.js`; +const spec = { + code: BIDDER_CODE, + aliases: BIDDER_ALIAS, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: bid => { + const params = bid.params || {}; + const { + smartadId + } = params; + return !!smartadId; + }, + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let app, site; + const commonFpd = bidderRequest.ortb2 || {}; + let { + user + } = commonFpd; + if (typeof getConfig('app') === 'object') { + app = getConfig('app') || {}; + if (commonFpd.app) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(app, commonFpd.app); + } + } else { + site = getConfig('site') || {}; + if (commonFpd.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(site, commonFpd.site); + } + if (!site.page) { + site.page = bidderRequest.refererInfo.page; + } + } + const device = getConfig('device') || {}; + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)(); + device.w = device.w || innerWidth; + device.h = device.h || innerHeight; + device.ua = device.ua || navigator.userAgent; + const paramsEndpoint = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.setOnAny)(validBidRequests, 'params.endpoint'); + if (paramsEndpoint) { + endpoint = paramsEndpoint; + } + const pt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.setOnAny)(validBidRequests, 'params.pt') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.setOnAny)(validBidRequests, 'params.priceType') || 'net'; + const tid = bidderRequest.ortb2?.source?.tid; + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_4__.getCurrencyFromBidderRequest)(bidderRequest); + const cur = currency && [currency]; + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.setOnAny)(validBidRequests, 'userIdAsEids'); + const schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.setOnAny)(validBidRequests, 'schain'); + const imp = validBidRequests.map((bid, id) => { + bid.netRevenue = pt; + const floorInfo = bid.getFloor ? bid.getFloor({ + currency: currency || 'USD' + }) : {}; + const bidfloor = floorInfo?.floor; + const bidfloorcur = floorInfo?.currency; + const { + smartadId + } = bid.params; + const imp = { + id: id + 1, + tagid: smartadId, + bidfloor, + bidfloorcur, + ext: { + bidder: { + smartadId: smartadId + } + } + }; + const assets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__._map)(bid.nativeParams, (bidParams, key) => { + const props = NATIVE_PARAMS[key]; + const asset = { + required: bidParams.required & 1 + }; + if (props) { + asset.id = props.id; + let wmin, hmin, w, h; + let aRatios = bidParams.aspect_ratios; + if (aRatios && aRatios[0]) { + aRatios = aRatios[0]; + wmin = aRatios.min_width || 0; + hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0; + } + if (bidParams.sizes) { + const sizes = flatten(bidParams.sizes); + w = sizes[0]; + h = sizes[1]; + } + asset[props.name] = { + len: bidParams.len, + type: props.type, + wmin, + hmin, + w, + h + }; + return asset; + } + }).filter(Boolean); + if (assets.length) { + imp.native = { + assets + }; + } + const bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.banner'); + if (bannerParams && bannerParams.sizes) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseSizesInput)(bannerParams.sizes); + const format = sizes.map(size => { + const [width, height] = size.split('x'); + const w = parseInt(width, 10); + const h = parseInt(height, 10); + return { + w, + h + }; + }); + imp.banner = { + format + }; + } + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video'); + if (videoParams) { + imp.video = videoParams; + } + return imp; + }); + const request = { + id: bidderRequest.auctionId, + site, + app, + user, + device, + source: { + tid, + fd: 1 + }, + ext: { + pt + }, + cur, + imp + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidderRequest, 'gdprConsent.gdprApplies') !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies & 1); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.eids', eids); + } + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'source.ext.schain', schain); + } + return { + method: 'POST', + url: 'https://' + endpoint + '/cgi-bin/smartads_prebid.pl', + data: JSON.stringify(request), + bids: validBidRequests + }; + }, + interpretResponse: function (serverResponse, _ref) { + let { + bids + } = _ref; + if (!serverResponse.body || serverResponse?.body?.nbr) { + return; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidResponses = flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => { + result[bid.impid - 1] = bid; + return result; + }, []); + return bids.map((bid, id) => { + const bidResponse = bidResponses[id]; + if (bidResponse) { + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidResponse, 'ext.prebid.type'); + const result = { + requestId: bid.bidId, + cpm: bidResponse.price, + creativeId: bidResponse.crid, + ttl: 360, + netRevenue: bid.netRevenue === 'net', + currency: cur, + mediaType, + width: bidResponse.w, + height: bidResponse.h, + dealId: bidResponse.dealid, + meta: { + mediaType, + advertiserDomains: bidResponse.adomain + } + }; + if (bidResponse.native) { + result.native = parseNative(bidResponse); + } else { + result[mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO ? 'vastXml' : 'ad'] = bidResponse.adm; + } + if (!bid.renderer && mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.context') === 'outstream') { + result.renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: bid.bidId, + url: OUTSTREAM_RENDERER_URL(endpoint), + adUnitCode: bid.adUnitCode + }); + result.renderer.setRender(renderer); + } + return result; + } + }).filter(Boolean); + }, + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent) => { + const params = (0,_libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_8__.getUserSyncParams)(gdprConsent, uspConsent); + if (syncOptions.iframeEnabled) { + // data is only assigned if params are available to pass to syncEndpoint + return { + type: 'iframe', + url: `https://${endpoint}/prebid/usersync/index.html?${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.formatQS)(params)}` + }; + } else if (syncOptions.pixelEnabled) { + return { + type: 'image', + url: `https://${endpoint.includes('dev') ? 'dev-' : ''}data.dianomi.com/frontend/usync?${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.formatQS)(params)}` + }; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +function parseNative(bid) { + const { + assets, + link, + imptrackers, + jstracker + } = bid.native; + const result = { + clickUrl: link.url, + clickTrackers: link.clicktrackers || undefined, + impressionTrackers: imptrackers || undefined, + javascriptTrackers: jstracker ? [jstracker] : undefined + }; + assets.forEach(asset => { + const kind = NATIVE_ASSET_IDS[asset.id]; + const content = kind && asset[NATIVE_PARAMS[kind].name]; + if (content) { + result[kind] = content.text || content.value || { + url: content.url, + width: content.w, + height: content.h + }; + } + }); + return result; +} +function flatten(arr) { + return [].concat(...arr); +} +function renderer(bid) { + bid.renderer.push(() => { + window.Dianomi.renderOutstream(bid); + }); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('dianomiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","userSyncUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dianomiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["digitalMatterBidAdapter"],{ + +/***/ "./modules/digitalMatterBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/digitalMatterBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); + + + + + + +const BIDDER_CODE = 'digitalMatter'; +const GVLID = 1345; +const ENDPOINT_URL = 'https://adx.digitalmatter.services/'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + aliases: ['dichange', 'digitalmatter'], + bidParameters: ['accountId', 'siteId'], + isBidRequestValid: function (bid) { + if (typeof bid.params !== 'object') { + return false; + } + if (!hasBannerMediaType(bid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request: missing required mediaType - banner'); + return false; + } + return !!(bid.params.accountId && bid.params.siteId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const common = bidderRequest.ortb2 || {}; + const site = common.site; + const tid = common?.source?.tid; + const { + user + } = common || {}; + if (!site.page) { + site.page = bidderRequest.refererInfo.page; + } + const device = getDevice(common.device); + const schain = getByKey(validBidRequests, 'schain'); + const eids = getByKey(validBidRequests, 'userIdAsEids'); + const currency = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('currency'); + const cur = currency && [currency]; + const imp = validBidRequests.map((bid, id) => { + const { + accountId, + siteId + } = bid.params; + const bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner'); + const position = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.pos') ?? 0; + return { + id: bid.adUnitCode, + bidId: bid.bidId, + accountId: accountId, + adUnitCode: bid.adUnitCode, + siteId: siteId, + banner: { + pos: position, + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1, + format: bannerParams.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1] + })) + }, + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bannerParams.sizes) + }; + }); + const ext = { + prebid: { + targeting: { + includewinners: true, + includebidderkeys: false + } + } + }; + const payload = { + id: bidderRequest.bidderRequestId, + tid, + site, + device, + user, + cur, + imp, + test: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('debug') ? 1 : 0, + tmax: bidderRequest.timeout, + start: bidderRequest.auctionStart, + ext + }; + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'source.ext.schain', schain); + } + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'user.ext.eids', eids); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent.gdprApplies') !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies & 1); + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL + 'openrtb2/auction', + data: payloadString + }; + }, + interpretResponse: function (serverResponse) { + const body = serverResponse.body || serverResponse; + const { + cur + } = body; + const bids = []; + if (body && body.bids && Array.isArray(body.bids)) { + body.bids.forEach(bidItem => { + const bid = { + requestId: bidItem.bidid, + adomain: bidItem.adomain, + cpm: bidItem.cpm, + currency: cur, + netRevenue: true, + ttl: bidItem.ttl || 300, + creativeId: bidItem.creativeid, + width: bidItem.width, + height: bidItem.height, + dealId: bidItem.dealid, + ad: bidItem.ad, + meta: bidItem.meta + }; + bids.push(bid); + }); + } + return bids; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + if (usersSynced) { + return []; + } + const userSyncs = []; + function checkGppStatus(gppConsent) { + if (gppConsent && Array.isArray(gppConsent.applicableSections)) { + return gppConsent.applicableSections.every(sec => typeof sec === 'number' && sec <= 5); + } + return true; + } + if ((0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__.hasPurpose1Consent)(gdprConsent) && checkGppStatus(gppConsent)) { + responses.forEach(response => { + if (response.body.ext && response.body.ext.usersync) { + try { + const userSync = response.body.ext.usersync; + userSync.forEach(element => { + let url = element.url; + let type = element.type; + if (url) { + if ((type === 'image' || type === 'redirect') && syncOptions.pixelEnabled) { + userSyncs.push({ + type: 'image', + url: url + }); + } else if (type === 'iframe' && syncOptions.iframeEnabled) { + userSyncs.push({ + type: 'iframe', + url: url + }); + } + } + }); + } catch (e) { + // + } + } + }); + } + return userSyncs; + } +}; +let usersSynced = false; +function hasBannerMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner'); +} +function getDevice(data) { + let dnt = data.dnt; + if (!dnt) { + dnt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0; + } + const { + innerWidth, + innerHeight + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)(); + return { + w: data.w || innerWidth, + h: data.h || innerHeight, + ua: data.ua || navigator.userAgent, + dnt: dnt, + language: data.language || navigator.language + }; +} +function getByKey(collection, key) { + for (let i = 0, result; i < collection.length; i++) { + result = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection[i], key); + if (result) { + return result; + } + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('digitalMatterBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/digitalMatterBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["discoveryBidAdapter"],{ + +/***/ "./modules/discoveryBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/discoveryBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, COOKIE_KEY_MGUID, THIRD_PARTY_COOKIE_ORIGIN, getPmgUID, getCookieTimeToUTCString, buildUTMTagData, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/fpdUtils/pageInfo.js */ "./libraries/fpdUtils/pageInfo.js"); +/* harmony import */ var _libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/fpdUtils/deviceInfo.js */ "./libraries/fpdUtils/deviceInfo.js"); +/* harmony import */ var _libraries_currencyUtils_floor_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/currencyUtils/floor.js */ "./libraries/currencyUtils/floor.js"); +/* harmony import */ var _libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/sizeUtils/tranformSize.js */ "./libraries/sizeUtils/tranformSize.js"); +/* harmony import */ var _libraries_navigatorData_navigatorData_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/navigatorData/navigatorData.js */ "./libraries/navigatorData/navigatorData.js"); +/* harmony import */ var _libraries_cookieSync_cookieSync_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/cookieSync/cookieSync.js */ "./libraries/cookieSync/cookieSync.js"); + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'discovery'; +const ENDPOINT_URL = 'https://rtb-jp.mediago.io/api/bid?tn='; +const TIME_TO_LIVE = 500; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +let globals = {}; +let itemMaps = {}; +const MEDIATYPE = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE]; + +/* ----- _ss_pp_id:start ------ */ +const COOKIE_KEY_SSPPID = '_ss_pp_id'; +const COOKIE_KEY_MGUID = '__mguid_'; +const COOKIE_KEY_PMGUID = '__pmguid_'; +const COOKIE_KEY_PBUID = 'pub_pp_tag'; +const STORAGE_KEY_FTUID = 'fluct_ppUUIDv4'; +const STORAGE_KEY_IMUID = '__im_ppid'; +const COOKIE_RETENTION_TIME = 365 * 24 * 60 * 60 * 1000; // 1 year +const COOKY_SYNC_IFRAME_URL = 'https://asset.popin.cc/js/cookieSync.html'; +const THIRD_PARTY_COOKIE_ORIGIN = 'https://asset.popin.cc'; +const UTM_KEY = '_ss_pp_utm'; +let UTMValue = {}; +const NATIVERET = { + id: 'id', + bidfloor: 0, + // TODO Dynamic parameters + native: { + ver: '1.2', + plcmtcnt: 1, + assets: [{ + id: 1, + required: 1, + img: { + type: 3, + w: 300, + wmin: 300, + h: 174, + hmin: 174 + } + }, { + id: 2, + required: 1, + title: { + len: 75 + } + }], + plcmttype: 1, + privacy: 1, + eventtrackers: [{ + event: 1, + methods: [1, 2] + }] + }, + ext: {} +}; + +/** + * get pmg uid + * 获取并生成用户的id + * @return {string} + */ +const getPmgUID = () => { + if (!storage.cookiesAreEnabled()) return; + let pmgUid = storage.getCookie(COOKIE_KEY_PMGUID); + if (!pmgUid) { + pmgUid = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID(); + } + // Extend the expiration time of pmguid + try { + storage.setCookie(COOKIE_KEY_PMGUID, pmgUid, getCookieTimeToUTCString()); + } catch (e) {} + return pmgUid; +}; + +/* ----- _ss_pp_id:end ------ */ + +/** + * get object key -> value + * @param {Object} obj 对象 + * @param {...string} keys 键名 + * @return {any} + */ +function getKv(obj) { + let o = obj; + for (var _len = arguments.length, keys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + keys[_key - 1] = arguments[_key]; + } + for (let key of keys) { + if (o && o[key]) { + o = o[key]; + } else { + return ''; + } + } + return o; +} + +// Support sizes +const popInAdSize = _libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_3__.normalAdSize; + +/** + * get cookie time to UTC string + * @returns utc string + */ +function getCookieTimeToUTCString() { + const date = new Date(); + date.setTime(date.getTime() + COOKIE_RETENTION_TIME); + return date.toUTCString(); +} + +/** + * format imp ad test ext params + * + * @param {Object} bidRequest sigleBidRequest + * @param {Object} bidderRequest + */ +function addImpExtParams() { + let bidRequest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const { + deepAccess + } = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__; + const { + params = {}, + adUnitCode, + bidId + } = bidRequest; + const ext = { + bidId: bidId || '', + adUnitCode: adUnitCode || '', + token: params.token || '', + siteId: params.siteId || '', + zoneId: params.zoneId || '', + publisher: params.publisher || '', + p_pos: params.position || '', + screenSize: (0,_libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_4__.getScreenSize)(), + referrer: (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getReferrer)(bidRequest, bidderRequest), + stack: deepAccess(bidRequest, 'refererInfo.stack', []), + b_pos: deepAccess(bidRequest, 'mediaTypes.banner.pos', '', ''), + ortbUser: deepAccess(bidRequest, 'ortb2.user', {}, {}), + ortbSite: deepAccess(bidRequest, 'ortb2.site', {}, {}), + tid: deepAccess(bidRequest, 'ortb2Imp.ext.tid', '', ''), + browsiViewability: deepAccess(bidRequest, 'ortb2Imp.ext.data.browsi.browsiViewability', '', ''), + adserverName: deepAccess(bidRequest, 'ortb2Imp.ext.data.adserver.name', '', ''), + adslot: deepAccess(bidRequest, 'ortb2Imp.ext.data.adserver.adslot', '', ''), + keywords: deepAccess(bidRequest, 'ortb2Imp.ext.data.keywords', '', ''), + gpid: deepAccess(bidRequest, 'ortb2Imp.ext.gpid', '', ''), + pbadslot: deepAccess(bidRequest, 'ortb2Imp.ext.data.pbadslot', '', '') + }; + return ext; +} + +/** + * get aditem setting + * @param {Array} validBidRequests an an array of bids + * @param {Object} bidderRequest The master bidRequest object + * @return {Object} + */ +function getItems(validBidRequests, bidderRequest) { + let items = []; + items = validBidRequests.map((req, i) => { + let ret = {}; + let mediaTypes = getKv(req, 'mediaTypes'); + const bidFloor = (0,_libraries_currencyUtils_floor_js__WEBPACK_IMPORTED_MODULE_6__.getBidFloor)(req); + let id = '' + (i + 1); + if (mediaTypes.native) { + ret = { + ...NATIVERET, + ...{ + id, + bidFloor + } + }; + } + // banner + if (mediaTypes.banner) { + let sizes = (0,_libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_3__.transformSizes)(getKv(req, 'sizes')); + let matchSize; + for (let size of sizes) { + matchSize = popInAdSize.find(item => size.width === item.w && size.height === item.h); + if (matchSize) { + break; + } + } + if (!matchSize) { + const { + height = 0, + width = 0 + } = sizes[0] || {}; + matchSize = { + h: height, + w: width + }; + } + ret = { + id: id, + bidfloor: bidFloor, + banner: { + h: matchSize.h, + w: matchSize.w, + pos: 1, + format: sizes + }, + ext: {}, + tagid: req.params && req.params.tagid + }; + } + try { + ret.ext = addImpExtParams(req, bidderRequest); + } catch (e) {} + itemMaps[id] = { + req, + ret + }; + return ret; + }); + return items; +} +const buildUTMTagData = url => { + if (!storage.cookiesAreEnabled()) return; + const urlParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl(url).search || {}; + const UTMParams = {}; + Object.keys(urlParams).forEach(key => { + if (/^utm_/.test(key)) { + UTMParams[key] = urlParams[key]; + } + }); + UTMValue = JSON.parse(storage.getCookie(UTM_KEY) || '{}'); + Object.assign(UTMValue, UTMParams); + storage.setCookie(UTM_KEY, JSON.stringify(UTMValue), getCookieTimeToUTCString()); +}; + +/** + * get rtb qequest params + * + * @param {Array} validBidRequests an an array of bids + * @param {Object} bidderRequest The master bidRequest object + * @return {Object} + */ +function getParam(validBidRequests, bidderRequest) { + const sharedid = _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](validBidRequests[0], 'userId.sharedid.id') || _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](validBidRequests[0], 'userId.pubcid') || _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](validBidRequests[0], 'crumbs.pubcid'); + const eids = validBidRequests[0].userIdAsEids || validBidRequests[0].userId; + let isMobile = (0,_libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_4__.getDevice)() ? 1 : 0; + // input test status by Publisher. more frequently for test true req + let isTest = validBidRequests[0].params.test || 0; + let auctionId = getKv(bidderRequest, 'auctionId'); + let items = getItems(validBidRequests, bidderRequest); + const timeout = bidderRequest.timeout || 2000; + const domain = _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](bidderRequest, 'refererInfo.domain') || document.domain; + const location = _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](bidderRequest, 'refererInfo.referer'); + const page = _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](bidderRequest, 'refererInfo.page'); + const referer = _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](bidderRequest, 'refererInfo.ref'); + const firstPartyData = bidderRequest.ortb2; + const tpData = _src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"](bidderRequest, 'ortb2.user.data') || undefined; + const title = (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getPageTitle)(); + const desc = (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getPageDescription)(); + const keywords = (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getPageKeywords)(); + let ext = {}; + try { + ext = { + eids, + firstPartyData, + ssppid: storage.getCookie(COOKIE_KEY_SSPPID) || undefined, + pmguid: getPmgUID(), + ssftUid: storage.getDataFromLocalStorage(STORAGE_KEY_FTUID) || undefined, + ssimUid: storage.getDataFromLocalStorage(STORAGE_KEY_IMUID) || undefined, + sspbid: storage.getCookie(COOKIE_KEY_PBUID) || undefined, + tpData, + utm: storage.getCookie(UTM_KEY), + page: { + title: title ? title.slice(0, 150) : undefined, + desc: desc ? desc.slice(0, 300) : undefined, + keywords: keywords ? keywords.slice(0, 100) : undefined, + hLen: (0,_libraries_navigatorData_navigatorData_js__WEBPACK_IMPORTED_MODULE_8__.getHLen)() + }, + device: { + nbw: (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getConnectionDownLink)() + } + }; + } catch (error) {} + try { + buildUTMTagData(page); + } catch (error) {} + if (items && items.length) { + let c = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + id: 'pp_hbjs_' + auctionId, + test: +isTest, + at: 1, + bcat: globals['bcat'], + badv: globals['adv'], + cur: ['USD'], + device: { + connectiontype: 0, + js: 1, + os: navigator.platform || '', + ua: navigator.userAgent, + language: /en/.test(navigator.language) ? 'en' : navigator.language + }, + ext, + user: { + buyeruid: storage.getCookie(COOKIE_KEY_MGUID) || undefined, + id: sharedid + }, + tmax: timeout, + site: { + name: domain, + domain: domain, + page: page || location, + ref: referer, + mobile: isMobile, + cat: [], + // todo + publisher: { + id: globals['publisher'] + // todo + // name: xxx + } + }, + imp: items + }; + return c; + } else { + return null; + } +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: MEDIATYPE, + // aliases: ['ex'], // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (bid.params.token) { + globals['token'] = bid.params.token; + } + if (bid.params.publisher) { + globals['publisher'] = bid.params.publisher; + } + if (bid.params.tagid) { + globals['tagid'] = bid.params.tagid; + } + if (bid.params.bcat) { + globals['bcat'] = Array.isArray(bid.params.bcat) ? bid.params.bcat : []; + } + if (bid.params.badv) { + globals['badv'] = Array.isArray(bid.params.badv) ? bid.params.badv : []; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests an an array of bids + * @param {Object} bidderRequest The master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const pbToken = globals['token']; + if (!pbToken) return; + let payload = getParam(validBidRequests, bidderRequest); + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: `${ENDPOINT_URL}${pbToken}`, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bids = getKv(serverResponse, 'body', 'seatbid', 0, 'bid'); + const cur = getKv(serverResponse, 'body', 'cur'); + const bidResponses = []; + for (let bid of bids) { + let impid = getKv(bid, 'impid'); + if (itemMaps[impid]) { + let bidId = getKv(itemMaps[impid], 'req', 'bidId'); + const mediaType = getKv(bid, 'w') ? 'banner' : 'native'; + let bidResponse = { + requestId: bidId, + cpm: getKv(bid, 'price'), + creativeId: getKv(bid, 'cid'), + mediaType, + currency: cur, + netRevenue: true, + nurl: getKv(bid, 'nurl'), + ttl: TIME_TO_LIVE, + meta: { + advertiserDomains: getKv(bid, 'adomain') || [] + } + }; + if (mediaType === 'native') { + const adm = getKv(bid, 'adm'); + const admObj = JSON.parse(adm); + var native = {}; + admObj.assets.forEach(asset => { + if (asset.title) { + native.title = asset.title.text; + } else if (asset.data) { + native.data = asset.data.value; + } else if (asset.img) { + switch (asset.img.type) { + case 1: + native.icon = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + default: + native.image = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + } + } + }); + if (admObj.link) { + if (admObj.link.url) { + native.clickUrl = admObj.link.url; + } + } + if (Array.isArray(admObj.eventtrackers)) { + native.impressionTrackers = []; + admObj.eventtrackers.forEach(tracker => { + if (tracker.event !== 1) { + return; + } + switch (tracker.method) { + case 1: + native.impressionTrackers.push(tracker.url); + break; + // case 2: + // native.javascriptTrackers = ``; + // break; + } + }); + } + if (admObj.purl) { + native.purl = admObj.purl; + } + bidResponse['native'] = native; + } else { + bidResponse['width'] = getKv(bid, 'w'); + bidResponse['height'] = getKv(bid, 'h'); + bidResponse['ad'] = getKv(bid, 'adm'); + } + bidResponses.push(bidResponse); + } + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponse, gdprConsent, uspConsent, gppConsent) { + return (0,_libraries_cookieSync_cookieSync_js__WEBPACK_IMPORTED_MODULE_9__.cookieSync)(syncOptions, gdprConsent, uspConsent, BIDDER_CODE, THIRD_PARTY_COOKIE_ORIGIN, COOKY_SYNC_IFRAME_URL, getCookieTimeToUTCString()); + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {Object} data Containing timeout specific data + */ + onTimeout: function (data) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError('DiscoveryDSP adapter timed out for the auction.'); + // TODO send request timeout to serve, the interface is not ready + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Object} bid The bid that won the auction + */ + onBidWon: function (bid) { + if (bid['nurl']) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel(bid['nurl']); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('discoveryBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","currencyUtils","navigatorData","fpdUtils","cookieSync","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/discoveryBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["displayioBidAdapter"],{ + +/***/ "./modules/displayioBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/displayioBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/keywords/keywords.js */ "./libraries/keywords/keywords.js"); + + + + + + + +const ADAPTER_VERSION = '1.1.0'; +const BIDDER_CODE = 'displayio'; +const BID_TTL = 300; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const DEFAULT_CURRENCY = 'USD'; +const US_KEY = '_dio_us'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.placementId && bid.params.siteId && bid.params.adsSrvDomain && bid.params.cdnDomain); + }, + buildRequests: function (bidRequests, bidderRequest) { + return bidRequests.map(bid => { + let url = '//' + bid.params.adsSrvDomain + '/srv?method=getPlacement&app=' + bid.params.siteId + '&placement=' + bid.params.placementId; + const data = getPayload(bid, bidderRequest); + return { + method: 'POST', + headers: { + 'Content-Type': 'application/json;charset=utf-8' + }, + url, + data + }; + }); + }, + interpretResponse: function (serverResponse, serverRequest) { + const ads = serverResponse.body.data.ads; + const bidResponses = []; + const { + data + } = serverRequest.data; + if (ads.length) { + const adData = ads[0].ad.data; + const bidResponse = { + requestId: data.id, + cpm: adData.ecpm, + width: adData.w, + height: adData.h, + netRevenue: true, + ttl: BID_TTL, + creativeId: adData.adId || 1, + currency: adData.cur || DEFAULT_CURRENCY, + referrer: data.data.ref, + mediaType: ads[0].ad.subtype === 'videoVast' ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + ad: adData.markup, + adUnitCode: data.adUnitCode, + renderURL: data.renderURL, + adData: adData + }; + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bidResponse.vastUrl = adData.videos[0] && adData.videos[0].url; + } + if (bidResponse.renderURL) { + bidResponse.renderer = newRenderer(bidResponse); + } + bidResponses.push(bidResponse); + } + return bidResponses; + } +}; +function getPayload(bid, bidderRequest) { + const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection; + const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE + }); + const userSession = (() => { + let us = storage.getDataFromLocalStorage(US_KEY); + if (!us) { + us = 'us_web_xxxxxxxxxxxx'.replace(/[x]/g, c => { + let r = Math.random() * 16 | 0; + let v = c === 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); + storage.setDataInLocalStorage(US_KEY, us); + } + return us; + })(); + const { + params, + adUnitCode, + bidId + } = bid; + const { + siteId, + placementId, + renderURL, + pageCategory, + keywords + } = params; + const { + refererInfo, + uspConsent, + gdprConsent + } = bidderRequest; + const mediation = { + gdprConsent: '', + gdpr: '-1' + }; + if (gdprConsent && 'gdprApplies' in gdprConsent) { + if (gdprConsent.consentString !== undefined) { + mediation.gdprConsent = gdprConsent.consentString; + } + if (gdprConsent.gdprApplies !== undefined) { + mediation.gdpr = gdprConsent.gdprApplies ? '1' : '0'; + } + } + return { + userSession, + data: { + id: bidId, + action: 'getPlacement', + app: siteId, + placement: placementId, + adUnitCode, + renderURL, + data: { + pagecat: pageCategory ? pageCategory.split(',').map(k => k.trim()) : [], + keywords: (0,_libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_2__.getAllOrtbKeywords)(bidderRequest.ortb2, keywords), + lang_content: document.documentElement.lang, + lang: window.navigator.language, + domain: refererInfo.domain, + page: refererInfo.page, + ref: refererInfo.referer, + userids: bid.userIdAsEids || {}, + geo: '' + }, + complianceData: { + child: '-1', + us_privacy: uspConsent, + dnt: window.doNotTrack === '1' || window.navigator.doNotTrack === '1' || false, + iabConsent: {}, + mediation: { + gdprConsent: mediation.gdprConsent, + gdpr: mediation.gdpr + } + }, + integration: 'JS', + omidpn: 'Displayio', + mediationPlatform: 0, + prebidVersion: ADAPTER_VERSION, + device: { + w: window.screen.width, + h: window.screen.height, + connection_type: connection ? connection.effectiveType : '' + } + } + }; +} +function newRenderer(bid) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: bid.requestId, + url: bid.renderURL, + adUnitCode: bid.adUnitCode + }); + try { + renderer.setRender(webisRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function webisRender(bid, doc) { + bid.renderer.push(() => { + const win = doc?.defaultView || window; + win.webis.init(bid.adData, bid.adUnitCode, bid.params); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('displayioBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["keywords","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/displayioBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["distroscaleBidAdapter"],{ + +/***/ "./modules/distroscaleBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/distroscaleBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'distroscale'; +const SHORT_CODE = 'ds'; +const LOG_WARN_PREFIX = 'DistroScale: '; +const ENDPOINT = 'https://hb.jsrdn.com/hb?from=pbjs'; +const DEFAULT_CURRENCY = 'USD'; +const AUCTION_TYPE = 1; +const GVLID = 754; +const UNDEF = undefined; +const SUPPORTED_MEDIATYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +function _getHost(url) { + let a = document.createElement('a'); + a.href = url; + return a.hostname; +} +function _getBidFloor(bid, mType, sz) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + let floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: mType || '*', + size: sz || '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + return floor.floor; + } + } + return null; +} +function _createImpressionObject(bid) { + var impObj = UNDEF; + var i; + var sizes = {}; + var sizesCount = 0; + function addSize(arr) { + var w, h; + if (arr && arr.length > 1) { + w = parseInt(arr[0]); + h = parseInt(arr[1]); + } + sizes[w + 'x' + h] = { + w: w, + h: h, + area: w * h, + idx: { + '970x250': 1, + '300x250': 2 + }[w + 'x' + h] || Math.max(w * h, 200) + }; + sizesCount++; + } + + // Gather all sizes + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.sizes)) { + for (i = 0; i < bid.sizes.length; i++) { + addSize(bid.sizes[i]); + } + } + if (bid.params && bid.params.width && bid.params.height) { + addSize([bid.params.width, bid.params.height]); + } + if (bid.mediaTypes && _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER in bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes) { + for (i = 0; i < bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes.length; i++) { + addSize(bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes[i]); + } + } + if (sizesCount == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_WARN_PREFIX + 'Error: missing sizes: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.'); + } else { + // Use the first preferred size + var keys = Object.keys(sizes); + keys.sort(function (a, b) { + return sizes[a].idx - sizes[b].idx; + }); + var bannerObj = { + pos: 0, + w: sizes[keys[0]].w, + h: sizes[keys[0]].h, + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1, + format: [{ + 'w': sizes[keys[0]].w, + 'h': sizes[keys[0]].h + }] + }; + impObj = { + id: bid.bidId, + tagid: bid.params.zoneid || '', + secure: 1, + ext: { + pubid: bid.params.pubid || '', + zoneid: bid.params.zoneid || '' + } + }; + var floor = _getBidFloor(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, [sizes[keys[0]].w, sizes[keys[0]].h]); + if (floor > 0) { + impObj.bidfloor = floor; + impObj.bidfloorcur = DEFAULT_CURRENCY; + } + impObj[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] = bannerObj; + } + return impObj; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: SUPPORTED_MEDIATYPES, + aliases: [SHORT_CODE], + isBidRequestValid: bid => { + if (bid && bid.params && bid.params.pubid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.pubid)) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_WARN_PREFIX + 'Error: pubid is mandatory and cannot be numeric'); + } + return false; + }, + buildRequests: (validBidRequests, bidderRequest) => { + // TODO: does the fallback to window.location make sense? + var pageUrl = bidderRequest?.refererInfo?.page || window.location.href; + + // check if dstag is already loaded in ancestry tree + var dsloaded = 0; + try { + var win = window; + while (true) { + if (win.vx.cs_loaded) { + dsloaded = 1; + } + if (win != win.parent) { + win = win.parent; + } else { + break; + } + } + } catch (error) { + // ignore exception + } + var payload = { + id: '' + new Date().getTime(), + at: AUCTION_TYPE, + cur: [DEFAULT_CURRENCY], + site: { + page: pageUrl + }, + device: { + ua: navigator.userAgent, + js: 1, + h: screen.height, + w: screen.width, + language: navigator.language && navigator.language.replace(/-.*/, '') || 'en', + dnt: navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1' || navigator.doNotTrack == 'yes' ? 1 : 0 + }, + imp: [], + user: {}, + ext: { + dsloaded: dsloaded + } + }; + validBidRequests.forEach(b => { + var bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(b); + var impObj = _createImpressionObject(bid); + if (impObj) { + payload.imp.push(impObj); + } + }); + if (payload.imp.length == 0) { + return; + } + payload.site.domain = _getHost(payload.site.page); + + // add the content object from config in request + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('content') === 'object') { + payload.site.content = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('content'); + } + + // merge the device from config.getConfig('device') + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('device') === 'object') { + payload.device = Object.assign(payload.device, _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('device')); + } + + // adding schain object + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'source.schain', validBidRequests[0].schain); + } + + // Attaching GDPR Consent Params + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'user.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'regs.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'regs.us_privacy', bidderRequest.uspConsent); + } + + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'regs.coppa', 1); + } + + // First Party Data + const commonFpd = bidderRequest.ortb2 || {}; + if (commonFpd.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(payload, { + site: commonFpd.site + }); + } + if (commonFpd.user) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(payload, { + user: commonFpd.user + }); + } + + // User IDs + if (validBidRequests[0].userIdAsEids && validBidRequests[0].userIdAsEids.length > 0) { + // Standard ORTB structure + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'user.eids', validBidRequests[0].userIdAsEids); + } else if (validBidRequests[0].userId && Object.keys(validBidRequests[0].userId).length > 0) { + // Fallback to non-ortb structure + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'user.ext.userId', validBidRequests[0].userId); + } + return { + method: 'POST', + url: ENDPOINT, + data: payload, + bidderRequest: bidderRequest + }; + }, + interpretResponse: (response, request) => { + const bidResponses = []; + try { + if (response.body && response.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response.body.seatbid)) { + // Supporting multiple bid responses for same adSize + response.body.seatbid.forEach(seatbidder => { + seatbidder.bid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(seatbidder.bid) && seatbidder.bid.forEach(bid => { + let newBid = { + requestId: bid.impid, + cpm: parseFloat(bid.price) || 0, + currency: DEFAULT_CURRENCY, + width: parseInt(bid.w), + height: parseInt(bid.h), + creativeId: bid.crid || bid.id, + netRevenue: true, + ttl: 300, + ad: bid.adm, + meta: { + advertiserDomains: [] + } + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.adomain) && bid.adomain.length > 0) { + newBid.meta.advertiserDomains = bid.adomain; + } + bidResponses.push(newBid); + }); + }); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(error); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('distroscaleBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/distroscaleBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["djaxBidAdapter"],{ + +/***/ "./modules/djaxBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/djaxBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const BIDDER_CODE = 'djax'; +const DOMAIN = 'https://revphpe.djaxbidder.com/header_bidding_vast/'; +const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +function outstreamRender(bidAd) { + bidAd.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [bidAd.width, bidAd.height], + width: bidAd.width, + height: bidAd.height, + targetId: bidAd.adUnitCode, + adResponse: bidAd.adResponse, + rendererOptions: { + showVolume: false, + allowFullscreen: false + } + }); + }); +} +function createRenderer(bidAd, rendererParams, adUnitCode) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__.Renderer.install({ + id: rendererParams.id, + url: rendererParams.url, + loaded: false, + config: { + 'player_height': bidAd.height, + 'player_width': bidAd.width + }, + adUnitCode + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function sendResponseToServer(data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(DOMAIN + 'www/admin/plugins/Prebid/tracking/track.php', null, JSON.stringify(data), { + withCredentials: false, + method: 'POST', + crossOrigin: true + }); +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid: function (bid) { + return typeof bid.params !== 'undefined' && parseInt(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getValue(bid.params, 'publisherId')) > 0; + }, + buildRequests: function (validBidRequests) { + return { + method: 'POST', + url: DOMAIN + 'www/admin/plugins/Prebid/getAd.php', + options: { + withCredentials: false, + crossOrigin: true + }, + data: validBidRequests + }; + }, + interpretResponse: function (serverResponse, request) { + const response = serverResponse.body; + const bidResponses = []; + var bidRequestResponses = []; + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each(response, function (bidAd) { + bidAd.adResponse = { + content: bidAd.vastXml, + height: bidAd.height, + width: bidAd.width + }; + bidAd.renderer = bidAd.context === 'outstream' ? createRenderer(bidAd, { + id: bidAd.adUnitCode, + url: RENDERER_URL + }, bidAd.adUnitCode) : undefined; + bidResponses.push(bidAd); + }); + bidRequestResponses.push({ + function: 'saveResponses', + request: request, + response: bidResponses + }); + sendResponseToServer(bidRequestResponses); + return bidResponses; + }, + onBidWon: function (bid) { + let wonBids = []; + wonBids.push(bid); + wonBids[0].function = 'onBidWon'; + sendResponseToServer(wonBids); + }, + onTimeout: function (details) { + details.unshift({ + 'function': 'onTimeout' + }); + sendResponseToServer(details); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('djaxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/djaxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dmdIdSystem"],{ + +/***/ "./modules/dmdIdSystem.js": +/*!********************************!*\ + !*** ./modules/dmdIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export dmdIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + +/** + * This module adds dmdId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/dmdIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'dmdId'; + +/** @type {Submodule} */ +const dmdIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function decode + * @param {(Object|string)} value + * @returns {(Object|undefined)} + */ + decode(value) { + return value && typeof value === 'string' ? { + 'dmdId': value + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function getId + * @param {SubmoduleConfig} [config] + * @param {ConsentData} consentData + * @param {Object} cacheIdObj - existing id, if any + * @returns {IdResponse|undefined} + */ + getId(config, consentData, cacheIdObj) { + const configParams = config && config.params || {}; + if (!configParams || !configParams.api_key || typeof configParams.api_key !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('dmd submodule requires an api_key.'); + return; + } + // If cahceIdObj is null or undefined - calling AIX-API + if (cacheIdObj) { + return cacheIdObj; + } else { + const url = configParams && configParams.api_url ? configParams.api_url : `https://aix.hcn.health/api/v1/auths`; + // Setting headers + const headers = {}; + headers['x-api-key'] = configParams.api_key; + headers['x-domain'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowLocation)(); + // Response callbacks + const resp = function (callback) { + const callbacks = { + success: response => { + let responseObj; + let responseId; + try { + responseObj = JSON.parse(response); + if (responseObj && responseObj.dgid) { + responseId = responseObj.dgid; + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(error); + } + callback(responseId); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + callback(); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, callbacks, undefined, { + method: 'GET', + withCredentials: true, + customHeaders: headers + }); + }; + return { + callback: resp + }; + } + }, + eids: { + 'dmdId': { + source: 'hcn.health', + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', dmdIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('dmdIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dmdIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["docereeAdManagerBidAdapter"],{ + +/***/ "./modules/docereeAdManagerBidAdapter.js": +/*!***********************************************!*\ + !*** ./modules/docereeAdManagerBidAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, getPageUrl, getPayload */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'docereeadmanager'; +const END_POINT = 'https://dai.doceree.com/drs/quest'; +const GVLID = 1063; +const spec = { + code: BIDDER_CODE, + url: '', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + gvlid: GVLID, + isBidRequestValid: bid => { + const { + placementId + } = bid.params; + return !!placementId; + }, + isGdprConsentPresent: bid => { + const { + gdpr, + gdprconsent + } = bid.params; + if (gdpr == '1') { + return !!gdprconsent; + } + return true; + }, + buildRequests: (validBidRequests, bidderRequest) => { + const serverRequests = []; + const { + data + } = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('docereeadmanager.user') || {}; + validBidRequests.forEach(function (validBidRequest) { + const payload = getPayload(validBidRequest, data, bidderRequest); + if (!payload) { + return; + } + serverRequests.push({ + method: 'POST', + url: END_POINT, + data: JSON.stringify(payload.data), + options: { + contentType: 'application/json', + withCredentials: true + } + }); + }); + return serverRequests; + }, + interpretResponse: serverResponse => { + const responseJson = serverResponse ? serverResponse.body : {}; + const bidResponse = { + ad: responseJson.ad, + width: Number(responseJson.width), + height: Number(responseJson.height), + requestId: responseJson.requestId, + netRevenue: true, + ttl: 30, + cpm: responseJson.cpm, + currency: responseJson.currency, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + creativeId: responseJson.creativeId, + meta: { + advertiserDomains: Array.isArray(responseJson.meta.advertiserDomains) && responseJson.meta.advertiserDomains.length > 0 ? responseJson.meta.advertiserDomains : [] + } + }; + return [bidResponse]; + } +}; +function getPageUrl() { + let url = ''; + try { + url = window.location.href; + } catch (error) {} + return url; +} +const handleConsent = consentValue => { + try { + if (consentValue === 0 || consentValue === '0') { + consentValue = '0'; + } + } catch (error) {} + return consentValue; +}; +function getPayload(bid, userData, bidderRequest) { + if (!userData || !bid) { + return false; + } + const { + bidId, + params + } = bid; + const { + placementId, + publisherUrl + } = params; + const { + userid, + email, + firstname, + lastname, + hcpid, + dob, + specialization, + gender, + city, + state, + zipcode, + hashedhcpid, + hashedemail, + hashedmobile, + country, + hashedNPI, + organization, + platformUid, + mobile, + userconsent + } = userData; + const data = { + userid: platformUid || userid || '', + email: email || '', + firstname: firstname || '', + lastname: lastname || '', + specialization: specialization || '', + hcpid: hcpid || '', + gender: gender || '', + city: city || '', + state: state || '', + zipcode: zipcode || '', + pb: 1, + adunit: placementId || '', + requestId: bidId || '', + hashedhcpid: hashedhcpid || hashedNPI || '', + hashedemail: hashedemail || '', + hashedmobile: hashedmobile || '', + country: country || '', + organization: organization || '', + dob: dob || '', + upref: handleConsent(userconsent) || '', + mobile: mobile || '', + pageurl: getPageUrl() || publisherUrl || '' + }; + try { + if (bidderRequest && bidderRequest.gdprConsent) { + const { + gdprApplies, + consentString + } = bidderRequest.gdprConsent; + data['consent'] = { + 'gdpr': gdprApplies ? 1 : 0, + 'gdprstr': consentString || '' + }; + } + } catch (error) {} + return { + data + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('docereeAdManagerBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/docereeAdManagerBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["docereeBidAdapter"],{ + +/***/ "./modules/docereeBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/docereeBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + +const BIDDER_CODE = 'doceree'; +const END_POINT = 'https://bidder.doceree.com'; +const TRACKING_END_POINT = 'https://tracking.doceree.com'; +const spec = { + code: BIDDER_CODE, + url: '', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: bid => { + const { + placementId + } = bid.params; + return !!placementId; + }, + isGdprConsentPresent: bid => { + const { + gdpr, + gdprConsent + } = bid.params; + if (gdpr == '1') { + return !!gdprConsent; + } + return true; + }, + buildRequests: validBidRequests => { + const serverRequests = []; + const { + data + } = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('doceree.user'); + // TODO: this should probably look at refererInfo + const { + page, + domain, + token + } = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('doceree.context'); + const encodedUserInfo = window.btoa(encodeURIComponent(JSON.stringify(data))); + validBidRequests.forEach(function (validBidRequest) { + const { + publisherUrl, + placementId, + gdpr, + gdprConsent + } = validBidRequest.params; + const url = publisherUrl || page; + let queryString = ''; + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'id', placementId); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'publisherDomain', domain); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'pubRequestedURL', encodeURIComponent(url)); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'loggedInUser', encodedUserInfo); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'currentUrl', url); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'prebidjs', true); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'token', token); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'requestId', validBidRequest.bidId); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'gdpr', gdpr); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'gdpr_consent', gdprConsent); + serverRequests.push({ + method: 'GET', + url: END_POINT + '/v1/adrequest?' + queryString + }); + }); + return serverRequests; + }, + interpretResponse: (serverResponse, request) => { + const responseJson = serverResponse ? serverResponse.body : {}; + const placementId = responseJson.DIVID; + const bidResponse = { + ad: responseJson.sourceHTML, + width: Number(responseJson.width), + height: Number(responseJson.height), + requestId: responseJson.guid, + netRevenue: true, + ttl: 30, + cpm: responseJson.cpmBid, + currency: responseJson.currency, + mediaType: 'banner', + creativeId: placementId, + meta: { + advertiserDomains: [responseJson.advertiserDomain] + } + }; + return [bidResponse]; + }, + onTimeout: function (timeoutData) { + if (timeoutData == null || !timeoutData.length) { + return; + } + timeoutData.forEach(td => { + const encodedBuf = window.btoa(encodeURIComponent(JSON.stringify({ + bidId: td.bidId, + timeout: td.timeout + }))); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(TRACKING_END_POINT + '/v1/hbTimeout?adp=prebidjs&data=' + encodedBuf); + }); + }, + onBidWon: function (bidWon) { + if (bidWon == null) { + return; + } + const encodedBuf = window.btoa(encodeURIComponent(JSON.stringify({ + requestId: bidWon.requestId, + cpm: bidWon.cpm, + adId: bidWon.adId, + currency: bidWon.currency, + netRevenue: bidWon.netRevenue, + status: bidWon.status, + hb_pb: bidWon.adserverTargeting && bidWon.adserverTargeting.hb_pb + }))); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(TRACKING_END_POINT + '/v1/hbBidWon?adp=prebidjs&data=' + encodedBuf); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('docereeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/docereeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dochaseBidAdapter"],{ + +/***/ "./modules/dochaseBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/dochaseBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/audUtils/bidderUtils.js */ "./libraries/audUtils/bidderUtils.js"); + + + + +const URL = 'https://rtb.dochaseadx.com/hb'; +// Export const spec +const spec = { + code: 'dochase', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + // Determines whether given bid request is valid or not + isBidRequestValid: bidRParam => { + return !!bidRParam.params.placement_id; + }, + // Make a server request from the list of BidRequests + buildRequests: (bidRq, serverRq) => { + // Get Requests based on media types + return (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerRequest)(bidRq, serverRq, URL); + }, + // Unpack the response from the server into a list of bids. + interpretResponse: (bidRes, bidReq) => { + let Response = {}; + const media = JSON.parse(bidReq.data)[0].MediaType; + if (media == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + Response = (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerResponse)(bidRes, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } else if (media == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + Response = (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getNativeResponse)(bidRes, bidReq, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + } + return Response; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('dochaseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["audUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dochaseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["driftpixelBidAdapter"],{ + +/***/ "./modules/driftpixelBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/driftpixelBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/xeUtils/bidderUtils.js */ "./libraries/xeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'driftpixel'; +const ENDPOINT = 'https://pbjs.driftpixel.live'; +const spec = { + code: BIDDER_CODE, + aliases: ['driftpixel'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT), + interpretResponse: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('driftpixelBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","xeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/driftpixelBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dsaControl"],{ + +/***/ "./modules/dsaControl.js": +/*!*******************************!*\ + !*** ./modules/dsaControl.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports addBidResponseHook, reset */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +let expiryHandle; +let dsaAuctions = {}; +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_0__.timedBidResponseHook)('dsa', function (fn, adUnitCode, bid, reject) { + if (!dsaAuctions.hasOwnProperty(bid.auctionId)) { + dsaAuctions[bid.auctionId] = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.index.getAuction(bid)?.getFPD?.()?.global?.regs?.ext?.dsa; + } + const dsaRequest = dsaAuctions[bid.auctionId]; + let rejectReason; + if (dsaRequest) { + if (!bid.meta?.dsa) { + if (dsaRequest.dsarequired === 1) { + // request says dsa is supported; response does not have dsa info; warn about it + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`dsaControl: ${_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.REJECTION_REASON.DSA_REQUIRED}; will still be accepted as regs.ext.dsa.dsarequired = 1`, bid); + } else if ([2, 3].includes(dsaRequest.dsarequired)) { + // request says dsa is required; response does not have dsa info; reject it + rejectReason = _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.REJECTION_REASON.DSA_REQUIRED; + } + } else { + if (dsaRequest.pubrender === 0 && bid.meta.dsa.adrender === 0) { + // request says publisher can't render; response says advertiser won't; reject it + rejectReason = _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.REJECTION_REASON.DSA_MISMATCH; + } else if (dsaRequest.pubrender === 2 && bid.meta.dsa.adrender === 1) { + // request says publisher will render; response says advertiser will; reject it + rejectReason = _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.REJECTION_REASON.DSA_MISMATCH; + } + } + } + if (rejectReason) { + reject(rejectReason); + } else { + return fn.call(this, adUnitCode, bid, reject); + } +}); +function toggleHooks(enabled) { + if (enabled && expiryHandle == null) { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.getHook)('addBidResponse').before(addBidResponseHook); + expiryHandle = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.onExpiry(auction => { + delete dsaAuctions[auction.getAuctionId()]; + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('dsaControl: DSA bid validation is enabled'); + } else if (!enabled && expiryHandle != null) { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.getHook)('addBidResponse').getHooks({ + hook: addBidResponseHook + }).remove(); + expiryHandle(); + expiryHandle = null; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('dsaControl: DSA bid validation is disabled'); + } +} +function reset() { + toggleHooks(false); + dsaAuctions = {}; +} +toggleHooks(true); +_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('consentManagement', cfg => { + toggleHooks(cfg.consentManagement?.dsa?.validateBids ?? true); +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('dsaControl'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dsaControl.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dsp_genieeBidAdapter"],{ + +/***/ "./modules/dsp_genieeBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/dsp_genieeBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'dsp_geniee'; +const ENDPOINT_URL = 'https://rt.gsspat.jp/prebid_auction'; +const ENDPOINT_URL_UNCOMFORTABLE = 'https://rt.gsspat.jp/prebid_uncomfortable'; +const ENDPOINT_USERSYNC = 'https://rt.gsspat.jp/prebid_cs'; +const VALID_CURRENCIES = ['USD', 'JPY']; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + ttl: 300, + netRevenue: true + }, + // set optional parameters + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext', bidRequest.params); + return imp; + } +}); +function USPConsent(consent) { + return typeof consent === 'string' && consent[0] === '1' && consent.toUpperCase()[2] === 'Y'; +} +function invalidCurrency(currency) { + return typeof currency === 'string' && VALID_CURRENCIES.indexOf(currency.toUpperCase()) === -1; +} +function hasTest(imp) { + if (typeof imp !== 'object') { + return false; + } + for (let i = 0; i < imp.length; i++) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(imp[i], 'ext.test') === 1) { + return true; + } + } + return false; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} _ The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (_) { + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests - an array of bids + * @param {BidderRequest} bidderRequest - the master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gdprConsent.gdprApplies') || + // gdpr + USPConsent(bidderRequest.uspConsent) || + // usp + _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') || + // coppa + invalidCurrency((0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_5__.getCurrencyFromBidderRequest)(bidderRequest)) // currency validation + ) { + return { + method: 'GET', + url: ENDPOINT_URL_UNCOMFORTABLE + }; + } + const payload = converter.toORTB({ + validBidRequests, + bidderRequest + }); + if (hasTest((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(payload, 'imp'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'test', 1); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'at', 1); // first price auction only + + return { + method: 'POST', + url: ENDPOINT_URL, + data: payload + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest - the master bidRequest object + * @return {Array} - An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse.body) { + // empty response (no bids) + return []; + } + const bids = converter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + return bids; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + // gdpr & usp + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(gdprConsent, 'gdprApplies') || USPConsent(uspConsent)) { + return syncs; + } + if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: ENDPOINT_USERSYNC + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('dsp_genieeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","ortb2Utils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dsp_genieeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dspxBidAdapter"],{ + +/***/ "./modules/dspxBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/dspxBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/dspxUtils/bidderUtils.js */ "./libraries/dspxUtils/bidderUtils.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ +const BIDDER_CODE = 'dspx'; +const ENDPOINT_URL = 'https://buyer.dspx.tv/request/'; +const ENDPOINT_URL_DEV = 'https://dcbuyer.dspx.tv/request/'; +const GVLID = 602; +const VIDEO_ORTB_PARAMS = ['mimes', 'minduration', 'maxduration', 'protocols', 'w', 'h', 'startdelay', 'placement', 'plcmt', 'linearity', 'skip', 'skipmin', 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate', 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend', 'delivery', 'pos', 'companionad', 'api', 'companiontype', 'ext']; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return !!bid.params.placement; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let payload = {}; + return validBidRequests.map(bidRequest => { + const params = bidRequest.params; + const rnd = Math.floor(Math.random() * 99999999999); + const referrer = bidderRequest.refererInfo.page; + const bidId = bidRequest.bidId; + const pbcode = bidRequest.adUnitCode || false; // div id + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + const auctionId = bidRequest.auctionId || false; + const isDev = params.devMode || false; + let endpoint = isDev ? ENDPOINT_URL_DEV : ENDPOINT_URL; + let placementId = params.placement; + + // dev config + if (isDev && params.dev) { + endpoint = params.dev.endpoint || endpoint; + placementId = params.dev.placement || placementId; + if (params.dev.pfilter !== undefined) { + params.pfilter = params.dev.pfilter; + } + } + let mediaTypesInfo = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getMediaTypesInfo)(bidRequest); + let type = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBannerRequest)(bidRequest) ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + let sizes = mediaTypesInfo[type]; + payload = { + _f: 'auto', + alternative: 'prebid_js', + inventory_item_id: placementId, + srw: sizes ? sizes[0].width : 0, + srh: sizes ? sizes[0].height : 0, + idt: 100, + rnd: rnd, + ref: referrer, + bid_id: bidId, + pbver: "9.45.0-pre" + }; + payload.pfilter = {}; + if (params.pfilter !== undefined) { + payload.pfilter = params.pfilter; + } + if (bidderRequest && bidderRequest.gdprConsent) { + if (!payload.pfilter.gdpr_consent) { + payload.pfilter.gdpr_consent = bidderRequest.gdprConsent.consentString; + payload.pfilter.gdpr = bidderRequest.gdprConsent.gdprApplies; + } + } + if (params.bcat !== undefined) { + payload.bcat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2Imp, 'bcat') || params.bcat; + } + if (params.dvt !== undefined) { + payload.dvt = params.dvt; + } + if (isDev) { + payload.prebidDevMode = 1; + } + if (!payload.pfilter.floorprice) { + let bidFloor = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBidFloor)(bidRequest); + if (bidFloor > 0) { + payload.pfilter.floorprice = bidFloor; + } + } + if (auctionId) { + payload.auctionId = auctionId; + } + if (pbcode) { + payload.pbcode = pbcode; + } + + // media types + payload.media_types = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.convertMediaInfoForRequest)(mediaTypesInfo); + if (mediaTypesInfo[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] !== undefined) { + payload.vctx = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getVideoContext)(bidRequest); + if (params.vastFormat !== undefined) { + payload.vf = params.vastFormat; + } + payload.vpl = {}; + let videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video'); + Object.keys(videoParams).filter(key => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(VIDEO_ORTB_PARAMS, key)).forEach(key => payload.vpl[key] = videoParams[key]); + } + + // iab content + let content = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.site.content'); + if (content) { + let stringContent = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.siteContentToString)(content); + if (stringContent) { + payload.pfilter.iab_content = stringContent; + } + } + + // Google Topics + const segments = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.extractUserSegments)(bidderRequest); + if (segments) { + (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.assignDefinedValues)(payload, { + segtx: segments.segtax, + segcl: segments.segclass, + segs: segments.segments + }); + } + + // schain + if (bidRequest.schain) { + payload.schain = bidRequest.schain; + } + + // fill userId params + (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.fillUsersIds)(bidRequest, payload); + return { + method: 'GET', + url: endpoint, + data: (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.objectToQueryString)(payload) + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('DSPx: serverResponse', serverResponse); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('DSPx: bidRequest', bidRequest); + return (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse)(serverResponse, bidRequest, (bidRequest, response) => newRenderer(bidRequest, response)); + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + return (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.handleSyncUrls)(syncOptions, serverResponses, gdprConsent); + } +}; + +/** + * Outstream Render Function + * + * @param bid + */ +function outstreamRender(bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('[DSPx][outstreamRender] bid:', bid); + const embedCode = createOutstreamEmbedCode(bid); + try { + const inIframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getBidIdParameter)('iframe', bid.renderer.config); + if (inIframe && window.document.getElementById(inIframe).nodeName === 'IFRAME') { + const iframe = window.document.getElementById(inIframe); + let framedoc = iframe.contentDocument || iframe.contentWindow && iframe.contentWindow.document; + framedoc.body.appendChild(embedCode); + if (typeof window.dspxRender === 'function') { + window.dspxRender(bid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('[DSPx][outstreamRender] Error: dspxRender function is not found'); + } + return; + } + const slot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getBidIdParameter)('slot', bid.renderer.config) || bid.adUnitCode; + if (slot && window.document.getElementById(slot)) { + window.document.getElementById(slot).appendChild(embedCode); + if (typeof window.dspxRender === 'function') { + window.dspxRender(bid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('[DSPx][outstreamRender] Error: dspxRender function is not found'); + } + } else if (slot) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('[DSPx][outstreamRender] Error: slot not found'); + } + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('[DSPx][outstreamRender] Error:' + err.message); + } +} + +/** + * create Outstream Embed Code Node + * + * @param bid + * @returns {DocumentFragment} + */ +function createOutstreamEmbedCode(bid) { + const fragment = window.document.createDocumentFragment(); + let div = window.document.createElement('div'); + div.innerHTML = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'renderer.config.code', ''); + fragment.appendChild(div); + + // run scripts + var scripts = div.getElementsByTagName('script'); + var scriptsClone = []; + for (var idx = 0; idx < scripts.length; idx++) { + scriptsClone.push(scripts[idx]); + } + for (var i = 0; i < scriptsClone.length; i++) { + var currentScript = scriptsClone[i]; + var s = document.createElement('script'); + for (var j = 0; j < currentScript.attributes.length; j++) { + var a = currentScript.attributes[j]; + s.setAttribute(a.name, a.value); + } + s.appendChild(document.createTextNode(currentScript.innerHTML)); + currentScript.parentNode.replaceChild(s, currentScript); + } + return fragment; +} + +/** + * Create a new renderer + * + * @param bidRequest + * @param response + * @returns {Renderer} + */ +function newRenderer(bidRequest, response) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('[DSPx] newRenderer', bidRequest, response); + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: response.renderer.id || response.bid_id, + url: bidRequest.params && bidRequest.params.rendererUrl || response.renderer.url, + config: response.renderer.options || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'renderer.options'), + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('[DSPx]Prebid Error calling setRender on renderer', err); + } + return renderer; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('dspxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["dspxUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dspxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dvgroupBidAdapter"],{ + +/***/ "./modules/dvgroupBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/dvgroupBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +const BIDDER_CODE = 'dvgroup'; +const DEFAULT_ENDPOINT = 'rtb.dvgroup.com'; +const SYNC_ENDPOINT = 'sync.dvgroup.com'; +const SSP_PREBID_UID = 'prebidssp'; +const TIME_TO_LIVE = 360; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.adm = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(bidResponse.adm, bidResponse.price); + bidResponse.burl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(bidResponse.burl, bidResponse.price); + bidResponse.nurl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(bidResponse.nurl, bidResponse.price); + return bidResponse; + } +}); +const spec = { + code: BIDDER_CODE, + buildRequests: function (bids, bidderRequest) { + return bids.map(bid => { + let endpoint = bid.params.endpoint || DEFAULT_ENDPOINT; + let bidMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); + return { + method: 'POST', + url: `https://${endpoint}/bid?sspuid=${SSP_PREBID_UID}`, + data: converter.toORTB({ + bidRequests: [bid], + bidderRequest: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(bidderRequest), + context: { + mediaType: bidMediaType ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER + } + }) + }; + }); + }, + interpretResponse: function (response, request) { + if (!response?.body) { + return []; + } + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + bids.forEach(bid => { + bid.meta = bid.meta || {}; + bid.ttl = bid.ttl || TIME_TO_LIVE; + bid.meta.advertiserDomains = bid.meta.advertiserDomains || []; + if (bid.meta.advertiserDomains.length == 0) { + bid.meta.advertiserDomains.push('dvgroup.com'); + } + }); + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__.hasPurpose1Consent)(gdprConsent)) { + return syncs; + } + if (syncOptions.pixelEnabled) { + let params = `us_privacy=${uspConsent || ''}&gdpr_consent=${gdprConsent?.consentString ? gdprConsent.consentString : ''}`; + if (typeof gdprConsent?.gdprApplies === 'boolean') { + params += `&gdpr=${Number(gdprConsent.gdprApplies)}`; + } + syncs.push({ + type: 'image', + url: `//${SYNC_ENDPOINT}/match/sp?${params}` + }); + } + return syncs; + }, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('dvgroupBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dvgroupBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dxkultureBidAdapter"],{ + +/***/ "./modules/dxkultureBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/dxkultureBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'dxkulture'; +const DEFAULT_BID_TTL = 300; +const DEFAULT_NET_REVENUE = true; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_OUTSTREAM_RENDERER_URL = 'https://cdn.dxkulture.com/players/dxOutstreamPlayer.js'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + if (!imp.bidfloor) { + imp.bidfloor = bidRequest.params.bidfloor || 0; + imp.bidfloorcur = bidRequest.params.currency || DEFAULT_CURRENCY; + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(req, { + ext: { + hb: 1, + prebidver: "9.45.0-pre", + adapterver: '1.0.0' + } + }); + + // Attaching GDPR Consent Params + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(req, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(req, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + return req; + }, + bidResponse(buildBidResponse, bid, context) { + let resMediaType; + const { + bidRequest + } = context; + if (bid.adm?.trim().startsWith(' { + const userSync = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(resp, 'body.ext.usersync'); + if (userSync) { + let syncDetails = []; + Object.keys(userSync).forEach(key => { + const value = userSync[key]; + if (value.syncs && value.syncs.length) { + syncDetails = syncDetails.concat(value.syncs); + } + }); + syncDetails.forEach(syncDetails => { + let queryParamStrings = []; + let syncUrl = syncDetails.url; + if (syncDetails.type === 'iframe') { + if (gdprConsent) { + queryParamStrings.push('gdpr=' + (gdprConsent.gdprApplies ? 1 : 0)); + queryParamStrings.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } + if (uspConsent) { + queryParamStrings.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + syncUrl = `${syncDetails.url}${queryParamStrings.length > 0 ? '?' + queryParamStrings.join('&') : ''}`; + } + syncs.push({ + type: syncDetails.type === 'iframe' ? 'iframe' : 'image', + url: syncUrl + }); + }); + if (syncOptions.iframeEnabled) { + syncs = syncs.filter(s => s.type == 'iframe'); + } else if (syncOptions.pixelEnabled) { + syncs = syncs.filter(s => s.type == 'image'); + } + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('dxkulture.getUserSyncs result=%o', syncs); + return syncs; + } +}; +function outstreamRenderer(bid) { + const rendererConfig = { + width: bid.width, + height: bid.height, + vastTimeout: 5000, + maxAllowedVastTagRedirects: 3, + allowVpaid: false, + autoPlay: true, + preload: true, + mute: false + }; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bid.adId, + url: DEFAULT_OUTSTREAM_RENDERER_URL, + config: rendererConfig, + loaded: false, + targetId: bid.adUnitCode, + adUnitCode: bid.adUnitCode + }); + try { + renderer.setRender(function (bid) { + bid.renderer.push(() => { + const { + id, + config + } = bid.renderer; + window.dxOutstreamPlayer(bid, id, config); + }); + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('dxkulture: Prebid Error calling setRender on renderer', err); + } + return renderer; +} + +/* ======================================= + * Util Functions + *======================================= */ + +function hasBannerMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.banner'); +} +function hasVideoMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video'); +} +function _validateParams(bidRequest) { + if (!bidRequest.params) { + return false; + } + if (bidRequest.params.e2etest) { + return true; + } + if (!bidRequest.params.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: publisherId not declared'); + return false; + } + if (!bidRequest.params.placementId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: placementId not declared'); + return false; + } + const mediaTypesExists = hasVideoMediaType(bidRequest) || hasBannerMediaType(bidRequest); + if (!mediaTypesExists) { + return false; + } + return true; +} + +/** + * Validates banner bid request. If it is not banner media type returns true. + * @param {BidRequest} bidRequest bid to validate + * @return boolean, true if valid, otherwise false + */ +function _validateBanner(bidRequest) { + // If there's no banner no need to validate + if (!hasBannerMediaType(bidRequest)) { + return true; + } + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.banner'); + if (!Array.isArray(banner.sizes)) { + return false; + } + return true; +} + +/** + * Validates video bid request. If it is not video media type returns true. + * @param {Object} bidRequest bid to validate + * @return {boolean} true if valid, otherwise false + */ +function _validateVideo(bidRequest) { + // If there's no video no need to validate + if (!hasVideoMediaType(bidRequest)) { + return true; + } + const videoPlacement = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'params.video', {}); + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'params', {}); + if (params && params.e2etest) { + return true; + } + const videoParams = { + ...videoPlacement, + ...videoBidderParams // Bidder Specific overrides + }; + if (!Array.isArray(videoParams.mimes) || videoParams.mimes.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: mimes are invalid'); + return false; + } + if (!Array.isArray(videoParams.protocols) || videoParams.protocols.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: protocols are invalid'); + return false; + } + if (!videoParams.context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: context id not declared'); + return false; + } + if (videoParams.context !== 'instream') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: only context instream is supported '); + return false; + } + if (typeof videoParams.playerSize === 'undefined' || !Array.isArray(videoParams.playerSize) || !Array.isArray(videoParams.playerSize[0])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('dxkulture: Validation failed: player size not declared or is not in format [[w,h]]'); + return false; + } + return true; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('dxkultureBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dxkultureBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["dynamicAdBoostRtdProvider"],{ + +/***/ "./modules/dynamicAdBoostRtdProvider.js": +/*!**********************************************!*\ + !*** ./modules/dynamicAdBoostRtdProvider.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export subModuleObj */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * The {@link module:modules/realTimeData} module is required + * @module modules/dynamicAdBoost + * @requires module:modules/realTimeData + */ + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'dynamicAdBoost'; +const SCRIPT_URL = 'https://adxbid.info'; +const CLIENT_SUPPORTS_IO = window.IntersectionObserver && window.IntersectionObserverEntry && window.IntersectionObserverEntry.prototype && 'intersectionRatio' in window.IntersectionObserverEntry.prototype; +// Options for the Intersection Observer +const dabOptions = { + threshold: 0.5 // Trigger callback when 50% of the element is visible +}; +let observer; +let dabStartDate; +let dabStartTime; + +// Array of div IDs to track +let dynamicAdBoostAdUnits = {}; +function init(config, userConsent) { + dabStartDate = new Date(); + dabStartTime = dabStartDate.getTime(); + if (!CLIENT_SUPPORTS_IO) { + return false; + } + // Create an Intersection Observer instance + observer = new IntersectionObserver(dabHandleIntersection, dabOptions); + if (config.params.keyId) { + let keyId = config.params.keyId; + if (keyId && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(keyId)) { + let dabDivIdsToTrack = config.params.adUnits; + let dabInterval = setInterval(function () { + // Observe each div by its ID + dabDivIdsToTrack.forEach(divId => { + let div = document.getElementById(divId); + if (div) { + observer.observe(div); + } + }); + let dabDateNow = new Date(); + let dabTimeNow = dabDateNow.getTime(); + let dabElapsedSeconds = Math.floor((dabTimeNow - dabStartTime) / 1000); + let elapsedThreshold = 30; + if (config.params.threshold) { + elapsedThreshold = config.params.threshold; + } + if (dabElapsedSeconds >= elapsedThreshold) { + clearInterval(dabInterval); // Stop + loadLmScript(keyId); + } + }, 1000); + return true; + } + } + return false; +} +function loadLmScript(keyId) { + let viewableAdUnits = Object.keys(dynamicAdBoostAdUnits); + let viewableAdUnitsCSV = viewableAdUnits.join(','); + const scriptUrl = `${SCRIPT_URL}/${keyId}.js?viewableAdUnits=${viewableAdUnitsCSV}`; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_1__.loadExternalScript)(scriptUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, MODULE_NAME); + observer.disconnect(); +} +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + const reqAdUnits = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().adUnits; + if (Array.isArray(reqAdUnits)) { + reqAdUnits.forEach(adunit => { + let gptCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(adunit, 'code'); + if (dynamicAdBoostAdUnits.hasOwnProperty(gptCode)) { + // AdUnits has reached target viewablity at some point + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(adunit, `ortb2Imp.ext.data.${MODULE_NAME}.${gptCode}`, dynamicAdBoostAdUnits[gptCode]); + } + }); + } + callback(); +} +let markViewed = (entry, observer) => { + return () => { + observer.unobserve(entry.target); + }; +}; + +// Callback function when an observed element becomes visible +function dabHandleIntersection(entries) { + entries.forEach(entry => { + if (entry.isIntersecting && entry.intersectionRatio > 0.5) { + dynamicAdBoostAdUnits[entry.target.id] = entry.intersectionRatio; + markViewed(entry, observer); + } + }); +} + +/** @type {RtdSubmodule} */ +const subModuleObj = { + name: MODULE_NAME, + init, + getBidRequestData, + markViewed +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('realTimeData', subModuleObj); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('dynamicAdBoostRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/dynamicAdBoostRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["e_volutionBidAdapter"],{ + +/***/ "./modules/e_volutionBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/e_volutionBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'e_volution'; +const GVLID = 957; +const AD_URL = 'https://service.e-volution.ai/?c=o&m=multi'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('e_volutionBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/e_volutionBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["eclickadsBidAdapter"],{ + +/***/ "./modules/eclickadsBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/eclickadsBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, ENDPOINT, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/fpdUtils/deviceInfo.js */ "./libraries/fpdUtils/deviceInfo.js"); + + + + + + +// ***** ECLICKADS ADAPTER ***** +const BIDDER_CODE = 'eclickads'; +const DEFAULT_CURRENCY = ['USD']; +const DEFAULT_TTL = 1000; +const ENDPOINT = 'https://g.eclick.vn/rtb_hb_request?fosp_uid='; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: bid => { + return !!bid && !!bid.params && !!bid.bidder && !!bid.params.zid; + }, + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const ortb2ConfigFPD = bidderRequest.ortb2.site.ext?.data || {}; + const ortb2Device = bidderRequest.ortb2.device; + const ortb2Site = bidderRequest.ortb2.site; + const isMobile = (0,_libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_2__.getDevice)(); + const imp = []; + const fENDPOINT = ENDPOINT + (ortb2ConfigFPD.fosp_uid || ''); + const request = { + deviceWidth: ortb2Device.w, + deviceHeight: ortb2Device.h, + ua: ortb2Device.ua, + language: ortb2Device.language, + device: isMobile ? 'mobile' : 'desktop', + host: ortb2Site.domain, + page: ortb2Site.page, + imp, + myvne_id: ortb2ConfigFPD.myvne_id || '', + orig_aid: ortb2ConfigFPD.orig_aid, + fosp_aid: ortb2ConfigFPD.fosp_aid, + fosp_uid: ortb2ConfigFPD.fosp_uid, + id: ortb2ConfigFPD.id + }; + validBidRequests.map(bid => { + imp.push({ + requestId: bid.bidId, + adUnitCode: bid.adUnitCode, + zid: bid.params.zid + }); + }); + return { + method: 'POST', + url: fENDPOINT, + data: request + }; + }, + interpretResponse: serverResponse => { + const seatbid = serverResponse.body?.seatbid || []; + return seatbid.reduce((bids, bid) => { + return [...bids, { + id: bid.id, + impid: bid.impid, + adUnitCode: bid.adUnitCode, + cpm: bid.cpm, + ttl: bid.ttl || DEFAULT_TTL, + requestId: bid.requestId, + creativeId: bid.creativeId, + netRevenue: bid.netRevenue, + currency: bid.currency || DEFAULT_CURRENCY, + adserverTargeting: { + hb_ad_eclickads: bid.ad + } + }]; + }, []); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('eclickadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["fpdUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/eclickadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["edge226BidAdapter"],{ + +/***/ "./modules/edge226BidAdapter.js": +/*!**************************************!*\ + !*** ./modules/edge226BidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'edge226'; +const AD_URL = 'https://ssp.dauup.com/pbjs'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('edge226BidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/edge226BidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ehealthcaresolutionsBidAdapter"],{ + +/***/ "./modules/ehealthcaresolutionsBidAdapter.js": +/*!***************************************************!*\ + !*** ./modules/ehealthcaresolutionsBidAdapter.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/audUtils/bidderUtils.js */ "./libraries/audUtils/bidderUtils.js"); + + + + +const ENDPOINT_URL = 'https://rtb.ehealthcaresolutions.com/hb'; +// Export const spec +const spec = { + code: 'ehealthcaresolutions', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + // Determines whether or not the given bid request is valid + isBidRequestValid: bParam => { + return !!bParam.params.placement_id; + }, + // Make a server request from the list of BidRequests + buildRequests: (bidRequests, serverRequest) => { + // Get Requests based on media types + return (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerRequest)(bidRequests, serverRequest, ENDPOINT_URL); + }, + // Unpack the response from the server into a list of bids. + interpretResponse: (bResponse, bRequest) => { + let Response = {}; + const mediaType = JSON.parse(bRequest.data)[0].MediaType; + if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + Response = (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerResponse)(bResponse, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } else if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + Response = (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getNativeResponse)(bResponse, bRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + } + return Response; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('ehealthcaresolutionsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["audUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ehealthcaresolutionsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["eightPodAnalyticsAdapter"],{ + +/***/ "./modules/eightPodAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/eightPodAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, queue, trackEvent */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + + + +const analyticsType = 'endpoint'; +const MODULE_NAME = `eightPod`; +const MODULE = `${MODULE_NAME}AnalyticProvider`; + +/** + * Custom tracking server that gets internal events from EightPod's ad unit + */ +const trackerUrl = 'https://demo.8pod.com/tracker/track'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_NAME +}); +const { + BID_WON +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS; +let queue = []; +let context = {}; + +/** + * Create eightPod Analytic adapter + */ +let eightPodAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__["default"])({ + url: trackerUrl, + analyticsType +}), { + /** + * Execute on bid won - setup basic settings, save context about EightPod's bid. We will send it with our events later + */ + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case BID_WON: + if (args.bidder === 'eightPod') { + context[args.adUnitCode] = makeContext(args); + eightPodAnalytics.setupPage(args); + break; + } + } + }, + /** + * Execute on bid won upload events from local storage + */ + setupPage() { + queue = this.getEventFromLocalStorage(); + }, + /** + * Subscribe on internal ad unit tracking events + */ + eventSubscribe() { + window.addEventListener('message', async event => { + const data = event.data; + const frameElement = event.source?.frameElement; + const parentElement = frameElement?.parentElement; + const adUnitCode = parentElement?.id; + trackEvent(data, adUnitCode); + }); + if (!this._interval) { + this._interval = setInterval(sendEvents, 10_000); + } + }, + resetQueue() { + queue = []; + }, + getContext() { + return context; + }, + resetContext() { + context = {}; + }, + getEventFromLocalStorage +}); + +/** + * Create context of event, who emits it + */ +function makeContext(args) { + const params = args?.params?.[0]; + return { + bidId: args.seatBidId, + variantId: args.creativeId || '', + campaignId: args.cid || '', + publisherId: params.publisherId, + placementId: params.placementId + }; +} + +/** + * Create event, add context and push it to queue + */ +function trackEvent(event, adUnitCode) { + if (!event.detail) { + return; + } + const fullEvent = { + context: eightPodAnalytics.getContext()[adUnitCode], + eventType: event.detail.type, + eventClass: 'adunit', + timestamp: new Date().getTime(), + eventName: event.detail.name, + payload: event.detail.payload + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)(fullEvent); + addEvent(fullEvent); +} + +/** + * Push event to queue, save event list in local storage + */ +function addEvent(eventPayload) { + queue.push(eventPayload); + storage.setDataInLocalStorage(`EIGHT_POD_EVENTS`, JSON.stringify(queue), null); +} + +/** + * Gets previously saved event that has not been sent + */ +function getEventFromLocalStorage() { + const storedEvents = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage('EIGHT_POD_EVENTS') : null; + if (storedEvents) { + return JSON.parse(storedEvents); + } else { + return []; + } +} + +/** + * Send event to our custom tracking server and reset queue + */ +function sendEvents() { + eightPodAnalytics.eventsStorage = queue; + if (queue.length) { + try { + sendEventsApi(queue, { + success: () => { + resetLocalStorage(); + eightPodAnalytics.resetQueue(); + }, + error: e => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(MODULE, 'Cant send events', e); + } + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(MODULE, 'Cant send events', e); + } + } +} + +/** + * Send event to our custom tracking server + */ +function sendEventsApi(eventList, callbacks) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(trackerUrl, callbacks, JSON.stringify(eventList), { + keepalive: true + }); +} + +/** + * Remove saved events in success scenario + */ +const resetLocalStorage = () => { + storage.setDataInLocalStorage(`EIGHT_POD_EVENTS`, JSON.stringify([]), null); +}; + +// save the base class function +eightPodAnalytics.originEnableAnalytics = eightPodAnalytics.enableAnalytics; +eightPodAnalytics.eventsStorage = []; + +// override enableAnalytics so we can get access to the config passed in from the page +// Subscribe on events from adUnit +eightPodAnalytics.enableAnalytics = function (config) { + eightPodAnalytics.originEnableAnalytics(config); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(MODULE, 'init', config); + eightPodAnalytics.eventSubscribe(); +}; +eightPodAnalytics.disableAnalytics = (orig => { + return function () { + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + return orig.apply(this, arguments); + }; +})(eightPodAnalytics.disableAnalytics); + +/** + * Register Analytics Adapter + */ +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: eightPodAnalytics, + code: MODULE_NAME +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (eightPodAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('eightPodAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/eightPodAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["eightPodBidAdapter"],{ + +/***/ "./modules/eightPodBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/eightPodBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, spec, parseUserAgent, getPageKeywords */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const BIDDER_CODE = 'eightPod'; +const url = 'https://demo.8pod.com/bidder/rtb/eightpod_exchange/bid'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse, + isBannerBid, + isVideoBid, + onBidWon +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300 + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + return req; + }, + response(buildResponse, bidResponses, ortbResponse, context) { + const response = buildResponse(bidResponses, ortbResponse, context); + return response.bids; + }, + imp(buildImp, bidRequest, context) { + return buildImp(bidRequest, context); + }, + bidResponse +}); +function hasRequiredParams(bidRequest) { + return !!bidRequest?.params?.placementId; +} +function isBidRequestValid(bidRequest) { + return hasRequiredParams(bidRequest); +} +function buildRequests(bids, bidderRequest) { + let bannerBids = bids.filter(bid => isBannerBid(bid)); + let requests = bannerBids.length ? createRequest(bannerBids, bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) : []; + return requests; +} +function bidResponse(buildBidResponse, bid, context) { + bid.nurl = replacePriceInUrl(bid.nurl, bid.price); + const bidResponse = buildBidResponse(bid, context); + bidResponse.height = context?.imp?.banner?.format?.[0].h; + bidResponse.width = context?.imp?.banner?.format?.[0].w; + bidResponse.cid = bid.cid; + bidResponse.burl = replacePriceInUrl(bid.burl, bidResponse.originalCpm || bidResponse.cpm); + return bidResponse; +} +function onBidWon(bid) { + if (bid.burl) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel(bid.burl); + } +} +function replacePriceInUrl(url, price) { + return url.replace(/\${AUCTION_PRICE}/, price); +} +function parseUserAgent() { + const ua = navigator.userAgent.toLowerCase(); + + // Check if it's iOS + if (/iphone|ipad|ipod/.test(ua)) { + // Extract iOS version and device type + const iosInfo = /(iphone|ipad|ipod) os (\d+[._]\d+)|((iphone|ipad|ipod)(\D+cpu) os (\d+(?:[._\s]\d+)?))/.exec(ua); + return { + platform: 'ios', + version: iosInfo ? iosInfo[1] : '', + device: iosInfo ? iosInfo[2].replace('_', '.') : '' + }; + } else if (/android/.test(ua)) { + // Check if it's Android + // Extract Android version + const androidVersion = /android (\d+([._]\d+)?)/.exec(ua); + return { + platform: 'android', + version: androidVersion ? androidVersion[1].replace('_', '.') : '', + device: '' + }; + } else { + // If neither iOS nor Android, return unknown + return { + platform: 'Unknown', + version: '', + device: '' + }; + } +} +function getPageKeywords() { + let win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + let element; + try { + element = win.top.document.querySelector('meta[name="keywords"]'); + } catch (e) { + element = document.querySelector('meta[name="keywords"]'); + } + return (element && element.content || '').replaceAll(' ', ''); +} +function createRequest(bidRequests, bidderRequest, mediaType) { + const requests = bidRequests.map(bidRequest => { + const data = converter.toORTB({ + bidRequests: [bidRequest], + bidderRequest, + context: { + mediaType + } + }); + data.adSlotPositionOnScreen = 'ABOVE_THE_FOLD'; + data.at = 1; + const userId = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidRequest, 'userId.unifiedId.id') || _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidRequest, 'userId.id5id.uid') || _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidRequest, 'userId.idl_env'); + const params = getBidderParams(bidRequest); + data.device = { + ...data.device, + devicetype: 4, + geo: { + country: params.country || 'GRB' + }, + language: params.language || data.device.language + }; + data.site = { + ...data.site, + keywords: getPageKeywords(window), + publisher: { + id: params.publisherId + } + }; + data.imp = [{ + ...data.imp?.[0], + secure: 1, + pmp: params.dealId ? { + ...data.pmp, + deals: [{ + id: params.dealId + }], + private_auction: 1 + } : data.pmp + }]; + data.adSlotPlacementId = params.placementId; + if (userId) { + data.user = { + id: userId + }; + } + const req = { + method: 'POST', + url: url && params.trace ? url + '?trace=true' : url, + options: { + withCredentials: false + }, + data + }; + return req; + }); + return requests; +} +function getBidderParams(bid) { + return bid?.params ? bid.params : undefined; +} +function isVideoBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bid, 'mediaTypes.video'); +} +function isBannerBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bid, 'mediaTypes.banner'); +} +function interpretResponse(resp, req) { + const impressionId = resp.body.seatbid[0].bid[0].impid; + const bidResponses = converter.fromORTB({ + request: req.data, + response: resp.body + }); + const ad = bidResponses[0].ad; + const trackingTag = ` + + + + + `; + bidResponses[0].ad = ad.replace('', trackingTag + ''); + return bidResponses; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('eightPodBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/eightPodBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["emtvBidAdapter"],{ + +/***/ "./modules/emtvBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/emtvBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'emtv'; +const AD_URL = 'https://us-east-ep.engagemedia.tv/pbjs'; +const SYNC_URL = 'https://cs.engagemedia.tv'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('emtvBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/emtvBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["engageyaBidAdapter"],{ + +/***/ "./modules/engageyaBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/engageyaBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + +const BIDDER_CODE = 'engageya'; +const ENDPOINT_URL = 'https://recs.engageya.com/rec-api/getrecs.json'; +const ENDPOINT_METHOD = 'GET'; +const MAX_DEVIATION = 0.05; +const SUPPORTED_SIZES = [[100, 75], [236, 202], [100, 100], [130, 130], [200, 200], [250, 250], [300, 272], [300, 250], [300, 230], [300, 214], [300, 187], [300, 166], [300, 150], [300, 133], [300, 120], [400, 200], [300, 200], [250, 377], [620, 410], [207, 311], [310, 166], [310, 333], [190, 106], [228, 132], [300, 174], [80, 60], [600, 500], [600, 600], [1080, 610], [1080, 610], [624, 350], [650, 1168], [1080, 1920], [300, 374], [336, 280]]; +function getPageUrl(bidRequest, bidderRequest) { + if (bidRequest.params.pageUrl && bidRequest.params.pageUrl != '[PAGE_URL]') { + return bidRequest.params.pageUrl; + } + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + return bidderRequest.refererInfo.page; + } + // TODO: does this fallback make sense? + const pageUrl = isInIframe() && document.referrer ? document.referrer : window.location.href; + return encodeURIComponent(pageUrl); +} +function isInIframe() { + try { + var isInIframe = window.self !== window.top; + } catch (e) { + isInIframe = true; + } + return isInIframe; +} +function getImageSrc(rec) { + return rec.thumbnail_path.indexOf('http') === -1 ? 'https:' + rec.thumbnail_path : rec.thumbnail_path; +} +function getImpressionTrackers(rec, response) { + const responseTrackers = [response.viewPxl]; + if (!rec.trackers) { + return responseTrackers; + } + const impressionTrackers = rec.trackers.impressionPixels || []; + const viewTrackers = rec.trackers.viewPixels || []; + return [...impressionTrackers, ...viewTrackers, ...responseTrackers]; +} +function parseNativeResponse(rec, response) { + return { + title: rec.title, + body: '', + image: { + url: getImageSrc(rec), + width: response.imageWidth, + height: response.imageHeight + }, + privacyLink: '', + clickUrl: rec.clickUrl, + displayUrl: rec.url, + cta: '', + sponsoredBy: rec.displayName, + impressionTrackers: getImpressionTrackers(rec, response) + }; +} +function parseBannerResponse(rec, response) { + if (rec.tag) { + return rec.tag; + } + let style; + try { + let additionalData = JSON.parse(response.widget.additionalData); + const css = additionalData.css || ''; + style = css ? `` : ''; + } catch (e) { + style = ''; + } + const title = rec.title && rec.title.trim() ? `` : ''; + const displayName = rec.displayName && title ? `` : ''; + const trackers = getImpressionTrackers(rec, response).map(url => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.createTrackPixelHtml)(url)).join(''); + return `${style}`; +} +function getImageSize(bidRequest) { + if (bidRequest.sizes && bidRequest.sizes.length > 0) { + return bidRequest.sizes[0]; + } else if (bidRequest.nativeParams && bidRequest.nativeParams.image && bidRequest.nativeParams.image.sizes) { + return bidRequest.nativeParams.image.sizes; + } + return [-1, -1]; +} +function isValidSize(_ref) { + let [width, height] = _ref; + if (!width || !height) { + return false; + } + return SUPPORTED_SIZES.some(_ref2 => { + let [supportedWidth, supportedHeight] = _ref2; + if (supportedWidth === width && supportedHeight === height) { + return true; + } + const supportedRatio = supportedWidth / supportedHeight; + const ratioDeviation = supportedRatio / width * height; + if (Math.abs(ratioDeviation - 1) > MAX_DEVIATION) { + return false; + } + return supportedWidth > width || (width - supportedWidth) / width <= MAX_DEVIATION; + }); +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid: function (bidRequest) { + return bidRequest && bidRequest.params && bidRequest.params.hasOwnProperty('widgetId') && bidRequest.params.hasOwnProperty('websiteId') && !isNaN(bidRequest.params.widgetId) && !isNaN(bidRequest.params.websiteId) && isValidSize(getImageSize(bidRequest)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + if (!validBidRequests) { + return []; + } + return validBidRequests.map(bidRequest => { + if (bidRequest.params) { + const mediaType = bidRequest.hasOwnProperty('nativeParams') ? 1 : 2; + const [imageWidth, imageHeight] = getImageSize(bidRequest); + const widgetId = bidRequest.params.widgetId; + const websiteId = bidRequest.params.websiteId; + const pageUrl = getPageUrl(bidRequest, bidderRequest); + const bidId = bidRequest.bidId; + let finalUrl = ENDPOINT_URL + '?pubid=0&webid=' + websiteId + '&wid=' + widgetId + '&url=' + pageUrl + '&ireqid=' + bidId + '&pbtpid=' + mediaType + '&imw=' + imageWidth + '&imh=' + imageHeight; + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprApplies && bidderRequest.consentString) { + finalUrl += '&is_gdpr=1&gdpr_consent=' + bidderRequest.consentString; + } + return { + url: finalUrl, + method: ENDPOINT_METHOD, + data: '' + }; + } + }).filter(Boolean); + }, + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse.body || !serverResponse.body.recs || !serverResponse.body.recs.length) { + return []; + } + var response = serverResponse.body; + var isNative = response.pbtypeId == 1; + return response.recs.map(rec => { + let bid = { + requestId: response.ireqId, + width: response.imageWidth, + height: response.imageHeight, + creativeId: rec.postId, + cpm: rec.pecpm || rec.ecpm / 100, + currency: 'USD', + netRevenue: !!rec.pecpm, + ttl: 360, + meta: { + advertiserDomains: rec.domain ? [rec.domain] : [] + } + }; + if (isNative) { + bid.native = parseNativeResponse(rec, response); + } else { + bid.ad = parseBannerResponse(rec, response); + } + return bid; + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('engageyaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/engageyaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["enrichmentLiftMeasurement"],{ + +/***/ "./modules/enrichmentLiftMeasurement/index.js": +/*!****************************************************!*\ + !*** ./modules/enrichmentLiftMeasurement/index.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports STORAGE_KEY, suppressionMethod, storeSplitsMethod, init, reset, compareConfigs, getCalculatedSubmodules, getStoredTestConfig, storeTestConfig, internals */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_activities_params_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/activities/params.js */ "./src/activities/params.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/consentHandler.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + + + + + + + + +const MODULE_NAME = 'enrichmentLiftMeasurement'; +const MODULE_TYPE = _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_0__.MODULE_TYPE_ANALYTICS; +const STORAGE_KEY = `${MODULE_NAME}Config`; +const suppressionMethod = { + SUBMODULES: 'submodules', + EIDS: 'eids' +}; +const storeSplitsMethod = { + MEMORY: 'memory', + SESSION_STORAGE: 'sessionStorage', + LOCAL_STORAGE: 'localStorage' +}; +let moduleConfig; +let rules = []; +function init() { + let storageManager = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: MODULE_TYPE, + moduleName: MODULE_NAME + }); + moduleConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(MODULE_NAME) || {}; + const { + suppression, + testRun, + storeSplits + } = moduleConfig; + let modules; + if (testRun && storeSplits && storeSplits !== storeSplitsMethod.MEMORY) { + const testConfig = getStoredTestConfig(storeSplits, storageManager); + if (!testConfig || !compareConfigs(testConfig, moduleConfig)) { + modules = internals.getCalculatedSubmodules(); + storeTestConfig(testRun, modules, storeSplits, storageManager); + } else { + modules = testConfig.modules; + } + } + modules = modules ?? internals.getCalculatedSubmodules(); + const bannedModules = new Set(modules.filter(_ref => { + let { + enabled + } = _ref; + return !enabled; + }).map(_ref2 => { + let { + name + } = _ref2; + return name; + })); + if (bannedModules.size) { + const init = suppression === suppressionMethod.SUBMODULES; + rules.push((0,_src_activities_rules_js__WEBPACK_IMPORTED_MODULE_3__.registerActivityControl)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_4__.ACTIVITY_ENRICH_EIDS, MODULE_NAME, userIdSystemBlockRule(bannedModules, init))); + } + if (testRun) { + (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__.setLabels)({ + [testRun]: modules + }); + } +} +function reset() { + rules.forEach(unregister => unregister()); + (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__.setLabels)({}); + rules = []; +} +function compareConfigs(old, current) { + const { + modules: newModules, + testRun: newTestRun + } = current; + const { + modules: oldModules, + testRun: oldTestRun + } = old; + const getModulesObject = modules => modules.reduce((acc, curr) => ({ + ...acc, + [curr.name]: curr.percentage + }), {}); + const percentageEqual = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepEqual)(getModulesObject(oldModules), getModulesObject(newModules)); + const testRunEqual = newTestRun === oldTestRun; + return percentageEqual && testRunEqual; +} +function userIdSystemBlockRule(bannedModules, init) { + return params => { + if ((params.init ?? true) === init && params[_src_activities_params_js__WEBPACK_IMPORTED_MODULE_7__.ACTIVITY_PARAM_COMPONENT_TYPE] === _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_0__.MODULE_TYPE_UID && bannedModules.has(params[_src_activities_params_js__WEBPACK_IMPORTED_MODULE_7__.ACTIVITY_PARAM_COMPONENT_NAME])) { + return { + allow: false, + reason: 'disabled due to AB testing' + }; + } + }; +} +; +function getCalculatedSubmodules() { + const { + modules = [] + } = moduleConfig; + return modules.map(_ref3 => { + let { + name, + percentage + } = _ref3; + const enabled = Math.random() < percentage; + return { + name, + percentage, + enabled + }; + }); +} +; +function getStoredTestConfig(storeSplits, storageManager) { + const [checkMethod, getMethod] = { + [storeSplitsMethod.SESSION_STORAGE]: [storageManager.sessionStorageIsEnabled, storageManager.getDataFromSessionStorage], + [storeSplitsMethod.LOCAL_STORAGE]: [storageManager.localStorageIsEnabled, storageManager.getDataFromLocalStorage] + }[storeSplits]; + if (!checkMethod()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(`${MODULE_NAME} Unable to save testing module config - storage is not enabled`); + return null; + } + try { + return JSON.parse(getMethod(STORAGE_KEY)); + } catch { + return null; + } +} +; +function storeTestConfig(testRun, modules, storeSplits, storageManager) { + const [checkMethod, storeMethod] = { + [storeSplitsMethod.SESSION_STORAGE]: [storageManager.sessionStorageIsEnabled, storageManager.setDataInSessionStorage], + [storeSplitsMethod.LOCAL_STORAGE]: [storageManager.localStorageIsEnabled, storageManager.setDataInLocalStorage] + }[storeSplits]; + if (!checkMethod()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(`${MODULE_NAME} Unable to save testing module config - storage is not enabled`); + return; + } + const configToStore = { + testRun, + modules + }; + storeMethod(STORAGE_KEY, JSON.stringify(configToStore)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(`${MODULE_NAME}: AB test config successfully saved to ${storeSplits} storage`); +} +; +const internals = { + getCalculatedSubmodules +}; +_src_consentHandler_js__WEBPACK_IMPORTED_MODULE_8__.GDPR_GVLIDS.register(MODULE_TYPE, MODULE_NAME, _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_8__.VENDORLESS_GVLID); +init(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('enrichmentLiftMeasurement'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/enrichmentLiftMeasurement/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["eplanningBidAdapter"],{ + +/***/ "./modules/eplanningBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/eplanningBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_schainSerializer_schainSerializer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/schainSerializer/schainSerializer.js */ "./libraries/schainSerializer/schainSerializer.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + + + + + + + + + +const BIDDER_CODE = 'eplanning'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const rnd = Math.random(); +const DEFAULT_SV = 'pbjs.e-planning.net'; +const DEFAULT_ISV = 'i.e-planning.net'; +const PARAMS = ['ci', 'sv', 't', 'ml', 'sn']; +const DOLLAR_CODE = 'USD'; +const NET_REVENUE = true; +const TTL = 120; +const NULL_SIZE = '1x1'; +const FILE = 'file'; +const STORAGE_RENDER_PREFIX = 'pbsr_'; +const STORAGE_VIEW_PREFIX = 'pbvi_'; +const mobileUserAgent = isMobileUserAgent(); +const PRIORITY_ORDER_FOR_MOBILE_SIZES_ASC = ['1x1', '300x50', '320x50', '300x250']; +const PRIORITY_ORDER_FOR_DESKTOP_SIZES_ASC = ['1x1', '970x90', '970x250', '160x600', '300x600', '728x90', '300x250']; +const VAST_INSTREAM = 1; +const VAST_OUTSTREAM = 2; +const VAST_VERSION_DEFAULT = 3; +const DEFAULT_SIZE_VAST = '640x480'; +const MAX_LEN_URL = 255; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: function (bid) { + return Boolean(bid.params.ci) || Boolean(bid.params.t); + }, + buildRequests: function (bidRequests, bidderRequest) { + const method = 'GET'; + const dfpClientId = '1'; + const sec = 'ROS'; + const schain = bidRequests[0].schain; + let url; + let params; + const urlConfig = getUrlConfig(bidRequests); + const pcrs = getCharset(); + const spaces = getSpaces(bidRequests, urlConfig.ml); + // TODO: do the fallbacks make sense here? + const pageUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation; + const domain = bidderRequest.refererInfo.domain || window.location.host; + if (urlConfig.t) { + url = 'https://' + urlConfig.isv + '/layers/t_pbjs_2.json'; + params = {}; + } else { + url = 'https://' + (urlConfig.sv || DEFAULT_SV) + '/pbjs/1/' + urlConfig.ci + '/' + dfpClientId + '/' + domain + '/' + sec; + // TODO: does the fallback make sense here? + const referrerUrl = bidderRequest.refererInfo.ref || bidderRequest.refererInfo.topmostLocation; + if (storage.hasLocalStorage()) { + registerViewabilityAllBids(bidRequests); + } + params = { + rnd: rnd, + e: spaces.str, + ur: cutUrl(pageUrl || FILE), + pbv: "9.45.0-pre", + ncb: '1', + vs: spaces.vs + }; + if (pcrs) { + params.crs = pcrs; + } + if (schain && schain.nodes.length <= 2) { + params.sch = (0,_libraries_schainSerializer_schainSerializer_js__WEBPACK_IMPORTED_MODULE_2__.serializeSupplyChain)(schain, ['asi', 'sid', 'hp', 'rid', 'name', 'domain']); + } + if (referrerUrl) { + params.fr = cutUrl(referrerUrl); + } + if (bidderRequest && bidderRequest.gdprConsent) { + if (typeof bidderRequest.gdprConsent.gdprApplies !== 'undefined') { + params.gdpr = bidderRequest.gdprConsent.gdprApplies ? '1' : '0'; + if (typeof bidderRequest.gdprConsent.consentString !== 'undefined') { + params.gdprcs = bidderRequest.gdprConsent.consentString; + } + } + } + if (bidderRequest && bidderRequest.uspConsent) { + params.ccpa = bidderRequest.uspConsent; + } + if ((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().getUserIds && typeof (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().getUserIds === 'function') { + const userIds = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().getUserIds(); + for (var id in userIds) { + params['e_' + id] = typeof userIds[id] === 'object' ? encodeURIComponent(JSON.stringify(userIds[id])) : encodeURIComponent(userIds[id]); + } + } + if (spaces.impType) { + params.vctx = spaces.impType & VAST_INSTREAM ? VAST_INSTREAM : VAST_OUTSTREAM; + params.vv = VAST_VERSION_DEFAULT; + } + } + return { + method: method, + url: url, + data: params, + adUnitToBidId: spaces.map + }; + }, + interpretResponse: function (serverResponse, request) { + const response = serverResponse.body; + let bidResponses = []; + if (response && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(response.sp)) { + response.sp.forEach(space => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(space.a)) { + space.a.forEach(ad => { + const bidResponse = { + requestId: request.adUnitToBidId[space.k], + cpm: ad.pr, + width: ad.w, + height: ad.h, + ttl: TTL, + creativeId: ad.crid, + netRevenue: NET_REVENUE, + currency: DOLLAR_CODE + }; + if (ad.adom) { + bidResponse.meta = { + advertiserDomains: ad.adom + }; + } + if (request && request.data && request.data.vv) { + bidResponse.vastXml = ad.adm; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } else { + bidResponse.ad = ad.adm; + } + bidResponses.push(bidResponse); + }); + } + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + const response = !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(serverResponses) && serverResponses[0].body; + if (response && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(response.cs)) { + const responseSyncs = response.cs; + responseSyncs.forEach(sync => { + if (typeof sync === 'string' && syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: sync + }); + } else if (typeof sync === 'object' && sync.ifr && syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: sync.u + }); + } + }); + } + return syncs; + } +}; +function getUserAgent() { + return window.navigator.userAgent; +} +function getInnerWidth() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWinDimensions)().innerWidth; +} +function isMobileUserAgent() { + return getUserAgent().match(/(mobile)|(ip(hone|ad))|(android)|(blackberry)|(nokia)|(phone)|(opera\smini)/i); +} +function isMobileDevice() { + return getInnerWidth() <= 1024 || window.orientation || mobileUserAgent; +} +function getUrlConfig(bidRequests) { + if (isTestRequest(bidRequests)) { + return getTestConfig(bidRequests.filter(br => br.params.t)); + } + let config = {}; + bidRequests.forEach(bid => { + PARAMS.forEach(param => { + if (bid.params[param] && !config[param]) { + config[param] = bid.params[param]; + } + }); + }); + return config; +} +function isTestRequest(bidRequests) { + for (let i = 0; i < bidRequests.length; i++) { + if (bidRequests[i].params.t) { + return true; + } + } + return false; +} +function getTestConfig(bidRequests) { + let isv; + bidRequests.forEach(br => isv = isv || br.params.isv); + return { + t: true, + isv: isv || DEFAULT_ISV + }; +} +function compareSizesByPriority(size1, size2) { + var priorityOrderForSizesAsc = isMobileDevice() ? PRIORITY_ORDER_FOR_MOBILE_SIZES_ASC : PRIORITY_ORDER_FOR_DESKTOP_SIZES_ASC; + var index1 = priorityOrderForSizesAsc.indexOf(size1); + var index2 = priorityOrderForSizesAsc.indexOf(size2); + if (index1 > -1) { + if (index2 > -1) { + return index1 < index2 ? 1 : -1; + } else { + return -1; + } + } else { + return index2 > -1 ? 1 : 0; + } +} +function getSizesSortedByPriority(sizes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseSizesInput)(sizes).sort(compareSizesByPriority); +} +function getSize(bid, first) { + var arraySizes = bid.sizes && bid.sizes.length ? getSizesSortedByPriority(bid.sizes) : []; + if (arraySizes.length) { + return first ? arraySizes[0] : arraySizes.join(','); + } else { + return NULL_SIZE; + } +} +function getSpacesStruct(bids) { + let e = {}; + bids.forEach(bid => { + let size = getSize(bid, true); + e[size] = e[size] ? e[size] : []; + e[size].push(bid); + }); + return e; +} +function getFirstSizeVast(sizes) { + if (sizes == undefined || !Array.isArray(sizes)) { + return undefined; + } + let size = Array.isArray(sizes[0]) ? sizes[0] : sizes; + return Array.isArray(size) && size.length == 2 ? size : undefined; +} +function cleanName(name) { + return name.replace(/_|\.|-|\//g, '').replace(/\)\(|\(|\)|:/g, '_').replace(/^_+|_+$/g, ''); +} +function getFloorStr(bid) { + if (typeof bid.getFloor === 'function') { + let bidFloor = bid.getFloor({ + currency: DOLLAR_CODE, + mediaType: '*', + size: '*' + }) || {}; + if (bidFloor.floor) { + return '|' + encodeURIComponent(bidFloor.floor); + } + } + return ''; +} +function getSpaces(bidRequests, ml) { + let impType = bidRequests.reduce((previousBits, bid) => bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO] ? bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].context == 'outstream' ? previousBits | 2 : previousBits | 1 : previousBits, 0); + // Only one type of auction is supported at a time + if (impType) { + bidRequests = bidRequests.filter(bid => bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO] && (impType & VAST_INSTREAM ? !bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].context || bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].context == 'instream' : bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].context == 'outstream')); + } + let spacesStruct = getSpacesStruct(bidRequests); + let es = { + str: '', + vs: '', + map: {}, + impType: impType + }; + es.str = Object.keys(spacesStruct).map(size => spacesStruct[size].map((bid, i) => { + es.vs += getVs(bid); + let name; + if (impType) { + let firstSize = getFirstSizeVast(bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].playerSize); + let sizeVast = firstSize ? firstSize.join('x') : DEFAULT_SIZE_VAST; + name = 'video_' + sizeVast + '_' + i; + es.map[name] = bid.bidId; + return name + ':' + sizeVast + ';1' + getFloorStr(bid); + } + if (ml) { + name = cleanName(bid.adUnitCode); + } else { + name = bid.params && bid.params.sn || getSize(bid, true) + '_' + i; + } + es.map[name] = bid.bidId; + return name + ':' + getSize(bid) + getFloorStr(bid); + }).join('+')).join('+'); + return es; +} +function getVs(bid) { + let s; + let vs = ''; + if (storage.hasLocalStorage()) { + s = getViewabilityData(bid); + vs += s.render >= 4 ? s.ratio.toString(16) : 'F'; + } else { + vs += 'F'; + } + return vs; +} +function getViewabilityData(bid) { + let r = storage.getDataFromLocalStorage(STORAGE_RENDER_PREFIX + bid.adUnitCode) || 0; + let v = storage.getDataFromLocalStorage(STORAGE_VIEW_PREFIX + bid.adUnitCode) || 0; + let ratio = r > 0 ? v / r : 0; + return { + render: r, + ratio: window.parseInt(ratio * 10, 10) + }; +} +function getCharset() { + try { + return window.top.document.charset || window.top.document.characterSet; + } catch (e) { + return document.charset || document.characterSet; + } +} +function waitForElementsPresent(elements) { + const observer = new MutationObserver(function (mutationList, observer) { + let index; + let adView; + if (mutationList && Array.isArray(mutationList)) { + mutationList.forEach(mr => { + if (mr && mr.addedNodes && Array.isArray(mr.addedNodes)) { + mr.addedNodes.forEach(ad => { + index = elements.indexOf(ad.id); + adView = ad; + if (index < 0) { + elements.forEach(code => { + let div = _getAdSlotHTMLElement(code); + if (div && div.contains(ad) && (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_5__.getBoundingClientRect)(div).width > 0) { + index = elements.indexOf(div.id); + adView = div; + } + }); + } + if (index >= 0) { + registerViewability(adView, elements[index]); + elements.splice(index, 1); + if (!elements.length) { + observer.disconnect(); + } + } + }); + } + }); + } + }); + document.addEventListener('DOMContentLoaded', function (event) { + var config = { + childList: true, + subtree: true, + characterData: true + }; + observer.observe(document.body, config); + }); +} +function registerViewability(div, name) { + visibilityHandler({ + name: name, + div: div + }); +} +function _mapAdUnitPathToElementId(adUnitCode) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isGptPubadsDefined)()) { + // eslint-disable-next-line no-undef + const adSlots = googletag.pubads().getSlots(); + const isMatchingAdSlot = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.isSlotMatchingAdUnitCode)(adUnitCode); + for (let i = 0; i < adSlots.length; i++) { + if (isMatchingAdSlot(adSlots[i])) { + const id = adSlots[i].getSlotElementId(); + return id; + } + } + } + return null; +} +function _getAdSlotHTMLElement(adUnitCode) { + return document.getElementById(adUnitCode) || document.getElementById(_mapAdUnitPathToElementId(adUnitCode)); +} +function registerViewabilityAllBids(bids) { + let elementsNotPresent = []; + bids.forEach(bid => { + let div = _getAdSlotHTMLElement(bid.adUnitCode); + if (div) { + registerViewability(div, bid.adUnitCode); + } else { + elementsNotPresent.push(bid.adUnitCode); + } + }); + if (elementsNotPresent.length) { + waitForElementsPresent(elementsNotPresent); + } +} +function getViewabilityTracker() { + let TIME_PARTITIONS = 5; + let VIEWABILITY_TIME = 1000; + let VIEWABILITY_MIN_RATIO = 0.5; + let publicApi; + let observer; + let visibilityAds = {}; + function intersectionCallback(entries) { + entries.forEach(function (entry) { + var adBox = entry.target; + if (entry.isIntersecting) { + if (entry.intersectionRatio >= VIEWABILITY_MIN_RATIO && entry.boundingClientRect && entry.boundingClientRect.height > 0 && entry.boundingClientRect.width > 0) { + visibilityAds[adBox.id] = true; + } + } else { + visibilityAds[adBox.id] = false; + } + }); + } + function observedElementIsVisible(element) { + return visibilityAds[element.id] && document.visibilityState && document.visibilityState === 'visible'; + } + function defineObserver() { + if (!observer) { + var observerConfig = { + root: null, + rootMargin: '0px', + threshold: [VIEWABILITY_MIN_RATIO] + }; + observer = new IntersectionObserver(intersectionCallback.bind(this), observerConfig); + } + } + function processIntervalVisibilityStatus(elapsedVisibleIntervals, element, callback) { + let visibleIntervals = observedElementIsVisible(element) ? elapsedVisibleIntervals + 1 : 0; + if (visibleIntervals === TIME_PARTITIONS) { + stopObserveViewability(element); + callback(); + } else { + setTimeout(processIntervalVisibilityStatus.bind(this, visibleIntervals, element, callback), VIEWABILITY_TIME / TIME_PARTITIONS); + } + } + function stopObserveViewability(element) { + delete visibilityAds[element.id]; + observer.unobserve(element); + } + function observeAds(element) { + observer.observe(element); + } + function initAndVerifyVisibility(element, callback) { + if (element) { + defineObserver(); + observeAds(element); + processIntervalVisibilityStatus(0, element, callback); + } + } + publicApi = { + onView: initAndVerifyVisibility.bind(this) + }; + return publicApi; +} +; +function visibilityHandler(obj) { + if (obj.div) { + registerAuction(STORAGE_RENDER_PREFIX + obj.name); + getViewabilityTracker().onView(obj.div, registerAuction.bind(undefined, STORAGE_VIEW_PREFIX + obj.name)); + } +} +function cutUrl(url) { + if (url.length > MAX_LEN_URL) { + url = url.split('?')[0]; + if (url.length > MAX_LEN_URL) { + url = url.slice(0, MAX_LEN_URL); + } + } + return url; +} +function registerAuction(storageID) { + let value; + try { + value = storage.getDataFromLocalStorage(storageID); + value = value ? window.parseInt(value, 10) + 1 : 1; + storage.setDataInLocalStorage(storageID, value); + } catch (exc) { + return false; + } + return true; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('eplanningBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","boundingClientRect","schainSerializer","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/eplanningBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["epomDspBidAdapter"],{ + +/***/ "./modules/epomDspBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/epomDspBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + +/** + * @name epomDspBidAdapter + * @version 1.0.0 + * @description Adapter for Epom DSP and AdExchange + * @module modules/epomDspBidAdapter + */ + + + + +const BIDDER_CODE = 'epom_dsp'; +const spec = { + code: BIDDER_CODE, + isBidRequestValid(bid) { + const globalSettings = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getBidderConfig()[BIDDER_CODE]?.epomSettings || {}; + const endpoint = bid.params?.endpoint || globalSettings.endpoint; + if (!endpoint || typeof endpoint !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`[${BIDDER_CODE}] Invalid endpoint: expected a non-empty string.`); + return false; + } + if (!endpoint.startsWith('https://')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`[${BIDDER_CODE}] Invalid endpoint: must start with "https://".`); + return false; + } + return true; + }, + buildRequests(bidRequests, bidderRequest) { + try { + const bidderConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getBidderConfig(); + const globalSettings = bidderConfig[BIDDER_CODE]?.epomSettings || {}; + return bidRequests.map(bid => { + const endpoint = bid.params?.endpoint || globalSettings.endpoint; + if (!endpoint) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`[${BIDDER_CODE}] Missing endpoint for bid request.`); + return null; + } + const payload = { + ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(bid), + id: bid.bidId || 'default-id', + imp: [{ + id: bid.bidId, + tagid: bid.adUnitCode, + bidfloor: getBidFloor(bid), + banner: { + w: bid.sizes[0][0], + h: bid.sizes[0][1] + } + }], + site: { + domain: bidderRequest?.refererInfo?.domain || 'unknown.com', + page: bidderRequest?.refererInfo?.referer || 'https://unknown.com', + publisher: { + id: 'unknown-publisher' + } + }, + device: { + ua: navigator.userAgent || '', + ip: '0.0.0.0', + devicetype: 2 + }, + referer: bidderRequest?.refererInfo?.referer, + gdprConsent: bidderRequest?.gdprConsent, + uspConsent: bidderRequest?.uspConsent, + bidfloor: getBidFloor(bid), + sizes: bid.sizes[0] || [] + }; + return { + method: 'POST', + url: endpoint, + data: payload, + options: { + contentType: 'application/json', + withCredentials: false + } + }; + }).filter(request => request !== null); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`[${BIDDER_CODE}] Error in buildRequests:`, error); + return []; + } + }, + interpretResponse(serverResponse) { + const bidResponses = []; + const response = serverResponse.body; + if (response && Array.isArray(response.bids)) { + response.bids.forEach(bid => { + if (bid.cpm && bid.ad && bid.width && bid.height) { + bidResponses.push({ + requestId: bid.requestId, + cpm: bid.cpm, + currency: bid.currency, + width: bid.width, + height: bid.height, + ad: bid.ad, + creativeId: bid.creativeId || bid.requestId, + ttl: typeof bid.ttl === 'number' ? bid.ttl : 300, + netRevenue: bid.netRevenue !== false + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`[${BIDDER_CODE}] Invalid bid response:`, bid); + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`[${BIDDER_CODE}] Empty or invalid server response:`, serverResponse); + } + return bidResponses; + }, + getUserSyncs(syncOptions, serverResponses) { + const syncs = []; + if (syncOptions.iframeEnabled && serverResponses.length > 0) { + serverResponses.forEach(response => { + if (response.body?.userSync?.iframe) { + syncs.push({ + type: 'iframe', + url: response.body.userSync.iframe + }); + } + }); + } + if (syncOptions.pixelEnabled && serverResponses.length > 0) { + serverResponses.forEach(response => { + if (response.body?.userSync?.pixel) { + syncs.push({ + type: 'image', + url: response.body.userSync.pixel + }); + } + }); + } + return syncs; + } +}; +function getBidFloor(bid) { + let floor = parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidfloor', bid.params)) || null; + let floorcur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidfloorcur', bid.params) || 'USD'; + if (!floor && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + try { + const floorObj = bid.getFloor({ + currency: floorcur, + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorObj) && !isNaN(parseFloat(floorObj.floor)) && floorObj.currency === floorcur) { + floor = parseFloat(floorObj.floor); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error retrieving floor price:', e); + } + } + return floor || 0; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('epomDspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/epomDspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["equativBidAdapter"],{ + +/***/ "./modules/equativBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/equativBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getImpIdMap, storage, spec, converter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +const BIDDER_CODE = 'equativ'; +const COOKIE_SYNC_ORIGIN = 'https://apps.smartadserver.com'; +const COOKIE_SYNC_URL = `${COOKIE_SYNC_ORIGIN}/diff/templates/asset/csync.html`; +const DEFAULT_TTL = 300; +const LOG_PREFIX = 'Equativ:'; +const PID_STORAGE_NAME = 'eqt_pid'; +let feedbackArray = []; +let impIdMap = {}; +let nwid = 0; +let tokens = {}; + +/** + * Assigns values to new properties, removes temporary ones from an object + * and remove temporary default bidfloor of -1 + * @param {*} obj An object + * @param {string} key A name of the new property + * @param {string} tempKey A name of the temporary property to be removed + * @returns {*} An updated object + */ +function cleanObject(obj, key, tempKey) { + const newObj = {}; + for (const prop in obj) { + if (prop === key) { + if (Object.prototype.hasOwnProperty.call(obj, tempKey)) { + newObj[key] = obj[tempKey]; + } + } else if (prop !== tempKey) { + newObj[prop] = obj[prop]; + } + } + newObj.bidfloor === -1 && delete newObj.bidfloor; + return newObj; +} + +/** + * Returns a floor price provided by the Price Floors module or the floor price set in the publisher parameters + * @param {*} bid + * @param {string} mediaType A media type + * @param {number} width A width of the ad + * @param {number} height A height of the ad + * @param {string} currency A floor price currency + * @returns {number} Floor price + */ +function getFloor(bid, mediaType, width, height, currency) { + return bid.getFloor?.({ + currency, + mediaType, + size: [width, height] + }).floor || bid.params.bidfloor || -1; +} + +/** + * Gets value of the local variable impIdMap + * @returns {*} Value of impIdMap + */ +function getImpIdMap() { + return impIdMap; +} +; + +/** + * Evaluates impressions for validity. The entry evaluated is considered valid if NEITHER of these conditions are met: + * 1) it has a `video` property defined for `mediaTypes.video` which is an empty object + * 2) it has a `native` property defined for `mediaTypes.native` which is an empty object + * @param {*} bidReq A bid request object to evaluate + * @returns boolean + */ +function isValid(bidReq) { + return !(bidReq.mediaTypes.video && JSON.stringify(bidReq.mediaTypes.video) === '{}') && !(bidReq.mediaTypes.native && JSON.stringify(bidReq.mediaTypes.native) === '{}'); +} + +/** + * Generates a 14-char string id + * @returns {string} + */ +function makeId() { + const length = 14; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let counter = 0; + let str = ''; + while (counter++ < length) { + str += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return str; +} + +/** + * Updates bid request with data from previous auction + * @param {*} req A bid request object to be updated + * @returns {*} Updated bid request object + */ +function updateFeedbackData(req) { + if (req?.ext?.prebid?.previousauctioninfo) { + req.ext.prebid.previousauctioninfo.forEach(info => { + if (tokens[info?.bidId]) { + feedbackArray.push({ + feedback_token: tokens[info.bidId], + loss: info.bidderCpm == info.highestBidCpm ? 0 : 102, + price: info.highestBidCpm + }); + delete tokens[info.bidId]; + } + }); + delete req.ext.prebid; + } + if (feedbackArray.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'ext.bid_feedback', feedbackArray[0]); + feedbackArray.shift(); + } + return req; +} +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + gvlid: 45, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + /** + * @param bidRequests + * @param bidderRequest + * @returns {ServerRequest[]} + */ + buildRequests: (bidRequests, bidderRequest) => { + if (bidRequests.filter(isValid).length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${LOG_PREFIX} No useful bid requests to process. No requests will be sent.`, bidRequests); + return undefined; + } + const requests = []; + bidRequests.forEach(bid => { + const data = converter.toORTB({ + bidRequests: [bid], + bidderRequest + }); + requests.push({ + data, + method: 'POST', + url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169' + }); + }); + return requests; + }, + /** + * @param serverResponse + * @param bidRequest + * @returns {Bid[]} + */ + interpretResponse: (serverResponse, bidRequest) => { + if (bidRequest.data?.imp?.length) { + bidRequest.data.imp.forEach(imp => imp.id = impIdMap[imp.id]); + } + if (serverResponse.body?.seatbid?.length) { + serverResponse.body.seatbid.filter(seat => seat?.bid?.length).forEach(seat => seat.bid.forEach(bid => { + bid.impid = impIdMap[bid.impid]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ext.feedback_token')) { + tokens[bid.impid] = bid.ext.feedback_token; + } + bid.ttl = typeof bid.exp === 'number' && bid.exp > 0 ? bid.exp : DEFAULT_TTL; + })); + } + return converter.fromORTB({ + request: bidRequest.data, + response: serverResponse.body + }); + }, + /** + * @param bidRequest + * @returns {boolean} + */ + isBidRequestValid: bidRequest => { + return !!((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'params.networkId') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2.site.publisher.id') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2.app.publisher.id') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2.dooh.publisher.id')); + }, + /** + * @param syncOptions + * @returns {{type: string, url: string}[]} + */ + getUserSyncs: (syncOptions, serverResponses, gdprConsent) => { + if (syncOptions.iframeEnabled) { + window.addEventListener('message', function handler(event) { + if (event.origin === COOKIE_SYNC_ORIGIN && event.data.action === 'getConsent') { + event.source.postMessage({ + action: 'consentResponse', + id: event.data.id, + consents: gdprConsent.vendorData.vendor.consents + }, event.origin); + if (event.data.pid) { + storage.setDataInLocalStorage(PID_STORAGE_NAME, event.data.pid); + } + this.removeEventListener('message', handler); + } + }); + let url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(COOKIE_SYNC_URL + '?', 'nwid', nwid); + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(url, 'gdpr', gdprConsent.gdprApplies ? '1' : '0'); + return [{ + type: 'iframe', + url + }]; + } + return []; + } +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_6__.ortbConverter)({ + context: { + netRevenue: true, + ttl: DEFAULT_TTL + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const { + siteId, + pageId, + formatId + } = bidRequest.params; + delete imp.dt; + imp.secure = 1; + imp.tagid = bidRequest.adUnitCode; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'ortb2Imp.rwdd') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video.ext.rewarded')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(imp, { + rwdd: bidRequest.mediaTypes.video.ext.rewarded + }); + } + const bidder = { + ...(siteId && { + siteId + }), + ...(pageId && { + pageId + }), + ...(formatId && { + formatId + }) + }; + if (Object.keys(bidder).length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(imp.ext, { + bidder + }); + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const bid = context.bidRequests[0]; + const currency = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('currency.adServerCurrency') || 'USD'; + const splitImps = []; + imps.forEach(item => { + const floorMap = {}; + const updateFloorMap = function (type, name) { + let width = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + let height = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + const floor = getFloor(bid, type, width, height, currency); + if (!floorMap[floor]) { + floorMap[floor] = { + ...item, + bidfloor: floor + }; + } + if (!floorMap[floor][name]) { + floorMap[floor][name] = type === 'banner' ? { + format: [] + } : item[type]; + } + if (type === 'banner') { + floorMap[floor][name].format.push({ + w: width, + h: height + }); + } + }; + if (item.banner?.format?.length) { + item.banner.format.forEach(format => updateFloorMap('banner', 'bannerTemp', format?.w, format?.h)); + } + updateFloorMap('native', 'nativeTemp'); + updateFloorMap('video', 'videoTemp', item.video?.w, item.video?.h); + Object.values(floorMap).forEach(obj => { + [['banner', 'bannerTemp'], ['native', 'nativeTemp'], ['video', 'videoTemp']].forEach(_ref => { + let [name, tempName] = _ref; + return obj = cleanObject(obj, name, tempName); + }); + if (obj.banner || obj.video || obj.native) { + const id = makeId(); + impIdMap[id] = obj.id; + obj.id = id; + splitImps.push(obj); + } + }); + }); + let req = buildRequest(splitImps, bidderRequest, context); + let env = ['ortb2.site.publisher', 'ortb2.app.publisher', 'ortb2.dooh.publisher'].find(propPath => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, propPath)) || 'ortb2.site.publisher'; + nwid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, env + '.id') || bid.params.networkId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, env.replace('ortb2.', '') + '.id', nwid); + [{ + path: 'mediaTypes.video', + props: ['mimes', 'placement'] + }, { + path: 'ortb2Imp.audio', + props: ['mimes'] + }, { + path: 'mediaTypes.native.ortb', + props: ['privacy', 'plcmttype', 'eventtrackers'] + }].forEach(_ref2 => { + let { + path, + props + } = _ref2; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, path)) { + props.forEach(prop => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, `${path}.${prop}`)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`${LOG_PREFIX} Property "${path}.${prop}" is missing from request. Request will proceed, but the use of "${prop}" is strongly encouraged.`, bid); + } + }); + } + }); + const pid = storage.getDataFromLocalStorage(PID_STORAGE_NAME); + if (pid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'user.buyeruid', pid); + } + req = updateFeedbackData(req); + return req; + } +}); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('equativBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","urlUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/equativBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["escalaxBidAdapter"],{ + +/***/ "./modules/escalaxBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/escalaxBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'escalax'; +const ESCALAX_SOURCE_ID_MACRO = '[sourceId]'; +const ESCALAX_ACCOUNT_ID_MACRO = '[accountId]'; +const ESCALAX_SUBDOMAIN_MACRO = '[subdomain]'; +const ESCALAX_URL = `https://${ESCALAX_SUBDOMAIN_MACRO}.escalax.io/bid?type=pjs&partner=${ESCALAX_SOURCE_ID_MACRO}&token=${ESCALAX_ACCOUNT_ID_MACRO}`; +const ESCALAX_DEFAULT_CURRENCY = 'USD'; +const ESCALAX_DEFAULT_SUBDOMAIN = 'bidder_us'; +function createImp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + imp.ext = { + [BIDDER_CODE]: { + sourceId: bidRequest.params.sourceId, + accountId: bidRequest.params.accountId + } + }; + if (!imp.bidfloor) imp.bidfloor = bidRequest.params.bidfloor; + return imp; +} +function createRequest(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + const bid = context.bidRequests[0]; + request.test = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('debug') ? 1 : 0; + if (!request.cur) request.cur = [bid.params.currency || ESCALAX_DEFAULT_CURRENCY]; + return request; +} +function createBidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.cur = 'USD'; + return bidResponse; +} +function getSubdomain() { + const regionMap = { + 'Europe': 'bidder_eu', + 'Africa': 'bidder_eu', + 'Atlantic': 'bidder_eu', + 'Arctic': 'bidder_eu', + 'Asia': 'bidder_apac', + 'Australia': 'bidder_apac', + 'Antarctica': 'bidder_apac', + 'Pacific': 'bidder_apac', + 'Indian': 'bidder_apac', + 'America': 'bidder_us' + }; + try { + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const region = timezone.split('/')[0]; + return regionMap[region] || 'bidder_us'; + } catch (err) { + return 'bidder_us'; + } +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 20 + }, + imp: createImp, + request: createRequest, + bidResponse: createBidResponse +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + isBidRequestValid: bid => { + return Boolean(bid.params.sourceId) && Boolean(bid.params.accountId); + }, + buildRequests: (validBidRequests, bidderRequest) => { + if (validBidRequests && validBidRequests.length === 0) return []; + const { + sourceId, + accountId + } = validBidRequests[0].params; + const subdomain = getSubdomain(); + const endpointURL = ESCALAX_URL.replace(ESCALAX_SUBDOMAIN_MACRO, subdomain || ESCALAX_DEFAULT_SUBDOMAIN).replace(ESCALAX_SOURCE_ID_MACRO, sourceId).replace(ESCALAX_ACCOUNT_ID_MACRO, accountId); + const request = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + return { + method: 'POST', + url: endpointURL, + data: request + }; + }, + interpretResponse: (response, request) => { + if (response?.body) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('escalaxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/escalaxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["eskimiBidAdapter"],{ + +/***/ "./modules/eskimiBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/eskimiBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'eskimi'; +const DEFAULT_BID_TTL = 30; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const GVLID = 814; +const VIDEO_ORTB_PARAMS = ['mimes', 'minduration', 'maxduration', 'plcmt', 'protocols', 'startdelay', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity', 'battr']; +const BANNER_ORTB_PARAMS = ['battr']; +const REGION_SUBDOMAIN_SUFFIX = { + EU: '', + US: '-us-e', + APAC: '-asia' +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Bid} bid The bid that won the auction + */ + onBidWon: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Bid won: ', bid); + if (bid.burl) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(bid.burl); + } + }, + onTimeout: function (timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Timeout: ', timeoutData); + }, + onBidderError: function (_ref) { + let { + error, + bidderRequest + } = _ref; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Error: ', error, bidderRequest); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL, + currency: DEFAULT_CURRENCY + }, + imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + imp.secure = bidRequest.ortb2Imp?.secure ?? 1; + if (!imp.bidfloor && bidRequest.params.bidFloor) { + imp.bidfloor = bidRequest.params.bidFloor; + imp.bidfloorcur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidFloorCur', bidRequest.params).toUpperCase() || 'USD'; + } + if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]) { + imp = buildVideoImp(bidRequest, imp); + } else if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + imp = buildBannerImp(bidRequest, imp); + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(req, { + at: 1, + ext: { + pv: "9.45.0-pre" + } + }); + const bid = context.bidRequests[0]; + if (bid.params.coppa) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'regs.coppa', 1); + } + if (bid.params.test) { + req.test = 1; + } + return req; + } +}); +function isBidRequestValid(bidRequest) { + return isPlacementIdValid(bidRequest) && (isValidBannerRequest(bidRequest) || isValidVideoRequest(bidRequest)); +} +function isPlacementIdValid(bidRequest) { + return !!parseInt(bidRequest.params.placementId); +} +function isValidBannerRequest(bidRequest) { + const bannerSizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER}.sizes`); + return _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray(bannerSizes) && bannerSizes.length > 0 && bannerSizes.every(size => _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber(size[0]) && _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber(size[1])); +} +function isValidVideoRequest(bidRequest) { + const videoSizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}.playerSize`); + return _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray(videoSizes) && videoSizes.length > 0 && videoSizes.every(size => _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber(size[0]) && _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber(size[1])); +} + +/** + * Takes an array of valid bid requests, all of which are guaranteed to have passed the isBidRequestValid() test. + * Make a server request from the list of BidRequests. + * + * @param {*} validBidRequests + * @param {*} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ +function buildRequests(validBidRequests, bidderRequest) { + let videoBids = validBidRequests.filter(bid => isVideoBid(bid)); + let bannerBids = validBidRequests.filter(bid => isBannerBid(bid)); + let requests = []; + bannerBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)); + }); + videoBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)); + }); + return requests; +} +function interpretResponse(response, request) { + return CONVERTER.fromORTB({ + request: request.data, + response: response.body + }).bids; +} +function buildVideoImp(bidRequest, imp) { + const videoAdUnitParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}`, {}); + const videoBidderParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, `params.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}`, {}); + const videoParams = { + ...videoAdUnitParams, + ...videoBidderParams + }; + const videoSizes = videoAdUnitParams && videoAdUnitParams.playerSize || []; + if (videoSizes && videoSizes.length > 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'video.w', videoSizes[0][0]); + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'video.h', videoSizes[0][1]); + } + VIDEO_ORTB_PARAMS.forEach(param => { + if (videoParams.hasOwnProperty(param)) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, `video.${param}`, videoParams[param]); + } + }); + if (imp.video && videoParams?.context === 'outstream') { + imp.video.plcmt = imp.video.plcmt || 4; + } + return { + ...imp + }; +} +function buildBannerImp(bidRequest, imp) { + const bannerAdUnitParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER}`, {}); + const bannerBidderParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, `params.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER}`, {}); + const bannerParams = { + ...bannerAdUnitParams, + ...bannerBidderParams + }; + let sizes = bidRequest.mediaTypes.banner.sizes; + if (sizes) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'banner.w', sizes[0][0]); + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'banner.h', sizes[0][1]); + } + BANNER_ORTB_PARAMS.forEach(param => { + if (bannerParams.hasOwnProperty(param)) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, `banner.${param}`, bannerParams[param]); + } + }); + return { + ...imp + }; +} +function createRequest(bidRequests, bidderRequest, mediaType) { + const data = CONVERTER.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }); + const bid = bidRequests.find(b => b.params.placementId); + if (!data.site) data.site = {}; + data.site.ext = { + placementId: parseInt(bid.params.placementId) + }; + if (bidderRequest.gdprConsent) { + if (!data.user) data.user = {}; + if (!data.user.ext) data.user.ext = {}; + if (!data.regs) data.regs = {}; + if (!data.regs.ext) data.regs.ext = {}; + data.user.ext.consent = bidderRequest.gdprConsent.consentString; + data.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + if (bid.params.bcat) data.bcat = bid.params.bcat; + if (bid.params.badv) data.badv = bid.params.badv; + if (bid.params.bapp) data.bapp = bid.params.bapp; + return { + method: 'POST', + url: getBidRequestUrlByRegion(), + data: data, + options: { + withCredentials: true, + contentType: 'application/json;charset=UTF-8' + } + }; +} +function isVideoBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bid, 'mediaTypes.video'); +} +function isBannerBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bid, 'mediaTypes.banner') || !isVideoBid(bid); +} + +/** + * @param syncOptions + * @param responses + * @param gdprConsent + * @param uspConsent + * @param gppConsent + * @return {{type: (string), url: (*|string)}[]} + */ +function getUserSyncs(syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + if (syncOptions.iframeEnabled || syncOptions.pixelEnabled) { + let pixelType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let query = []; + let syncUrl = getUserSyncUrlByRegion(); + // GDPR Consent Params in UserSync url + if (gdprConsent) { + query.push('gdpr=' + (gdprConsent.gdprApplies & 1)); + query.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } + // US Privacy Consent + if (uspConsent) { + query.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + // Global Privacy Platform Consent + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + query.push('gpp=' + encodeURIComponent(gppConsent.gppString)); + query.push('gpp_sid=' + encodeURIComponent(gppConsent.applicableSections.join(','))); + } + return [{ + type: pixelType, + url: `${syncUrl}${query.length > 0 ? '&' + query.join('&') : ''}` + }]; + } +} + +/** + * Get Bid Request endpoint url by region + * @return {string} + */ +function getBidRequestUrlByRegion() { + return `https://ittr${getRegionSubdomainSuffix()}.eskimi.com/prebidjs`; +} + +/** + * Get User Sync endpoint url by region + * @return {string} + */ +function getUserSyncUrlByRegion() { + return `https://ittpx${getRegionSubdomainSuffix()}.eskimi.com/sync?sp_id=137`; +} + +/** + * Get subdomain URL suffix by region + * @return {string} + */ +function getRegionSubdomainSuffix() { + try { + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const region = timezone.split('/')[0]; + switch (region) { + case 'Europe': + case 'Africa': + case 'Atlantic': + case 'Arctic': + return REGION_SUBDOMAIN_SUFFIX['EU']; + case 'Asia': + case 'Australia': + case 'Antarctica': + case 'Pacific': + case 'Indian': + return REGION_SUBDOMAIN_SUFFIX['APAC']; + case 'America': + return REGION_SUBDOMAIN_SUFFIX['US']; + default: + return REGION_SUBDOMAIN_SUFFIX['EU']; + } + } catch (err) { + return REGION_SUBDOMAIN_SUFFIX['EU']; + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('eskimiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/eskimiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["etargetBidAdapter"],{ + +/***/ "./modules/etargetBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/etargetBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'etarget'; +const GVL_ID = 29; +const countryMap = { + 1: 'sk', + 2: 'cz', + 3: 'hu', + 4: 'ro', + 5: 'rs', + 6: 'bg', + 7: 'pl', + 8: 'hr', + 9: 'at', + 10: 'co', + 11: 'de', + 255: 'en' +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return !!(bid.params.refid && bid.params.country); + }, + buildRequests: function (validBidRequests, bidderRequest) { + var i, l, bid, reqParams, netRevenue, gdprObject; + var request = []; + var bids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(validBidRequests); + var lastCountry = 'sk'; + var floors = []; + for (i = 0, l = bids.length; i < l; i++) { + bid = bids[i]; + if (countryMap[bid.params.country]) { + lastCountry = countryMap[bid.params.country]; + } + reqParams = bid.params; + reqParams.transactionId = bid.ortb2Imp?.ext?.tid; + request.push(formRequestUrl(reqParams)); + floors[i] = getBidFloor(bid); + } + request.unshift('https://' + lastCountry + '.search.etargetnet.com/hb/?hbget=1'); + netRevenue = 'net'; + if (bidderRequest) { + if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + gdprObject = { + gdpr: bidderRequest.gdprConsent.gdprApplies, + gdpr_consent: bidderRequest.gdprConsent.consentString + }; + request.push('gdpr=' + gdprObject.gdpr); + request.push('gdpr_consent=' + gdprObject.gdpr_consent); + } + bidderRequest.metaData = getMetaData(); + if (floors.length > 0) { + bidderRequest.floors = floors; + } + } + return { + method: 'POST', + url: request.join('&'), + data: bidderRequest, + bids: validBidRequests, + netRevenue: netRevenue, + bidder: 'etarget', + gdpr: gdprObject + }; + function getMetaData() { + var mts = {}; + var hmetas = document.getElementsByTagName('meta'); + var wnames = ['title', 'og:title', 'description', 'og:description', 'og:url', 'base', 'keywords']; + try { + for (var k in hmetas) { + if (typeof hmetas[k] == 'object') { + var mname = hmetas[k].name || hmetas[k].getAttribute('property'); + var mcont = hmetas[k].content; + if (!!mname && mname != 'null' && !!mcont) { + if (wnames.indexOf(mname) >= 0) { + if (!mts[mname]) { + mts[mname] = []; + } + mts[mname].push(mcont); + } + } + } + } + mts['title'] = [(document.getElementsByTagName('title')[0] || []).innerHTML]; + mts['base'] = [(document.getElementsByTagName('base')[0] || {}).href]; + mts['referer'] = [document.location.href]; + mts['ortb2'] = bidderRequest.ortb2 || {}; + } catch (e) { + mts.error = e; + } + return mts; + } + function formRequestUrl(reqData) { + var key; + var url = []; + for (key in reqData) { + if (reqData.hasOwnProperty(key) && reqData[key]) { + url.push(key, '=', reqData[key], '&'); + } + } + return encodeURIComponent(btoa(url.join('').slice(0, -1))); + } + }, + interpretResponse: function (serverResponse, bidRequest) { + const VALID_RESPONSES = { + banner: 1, + video: 1 + }; + var bidObject, bid, type; + var bidRespones = []; + var bids = bidRequest.bids; + var responses = serverResponse.body; + var data = []; + for (var i = 0; i < responses.length; i++) { + data = responses[i]; + type = data.response === 'banner' ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bid = bids[i]; + if (VALID_RESPONSES[data.response] && (verifySize(data, bid.sizes) || type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)) { + bidObject = { + requestId: bid.bidId, + cpm: data.win_bid ? data.win_bid : 0, + width: data.width, + height: data.height, + creativeId: data.creativeId, + currency: data.win_cur, + netRevenue: true, + ttl: 360, + reason: data.reason ? data.reason : 'none', + ad: data.banner, + vastXml: data.vast_content, + vastUrl: data.vast_link, + mediaType: data.response + }; + if (bidRequest.gdpr) { + bidObject.gdpr = bidRequest.gdpr.gdpr; + bidObject.gdpr_consent = bidRequest.gdpr.gdpr_consent; + } + if (bid.adomain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(bidObject, 'meta.advertiserDomains', Array.isArray(bid.adomain) ? bid.adomain : [bid.adomain]); + } + bidRespones.push(bidObject); + } + } + return bidRespones; + function verifySize(adItem, validSizes) { + for (var j = 0, k = validSizes.length; j < k; j++) { + if (adItem.width == validSizes[j][0] && adItem.height == validSizes[j][1]) { + return true; + } + } + return false; + } + } +}; +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return null; + } + let floor = bid.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor)) { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('etargetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/etargetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["euidIdSystem"],{ + +/***/ "./modules/euidIdSystem.js": +/*!*********************************!*\ + !*** ./modules/euidIdSystem.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, euidIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_uid2IdSystemShared_uid2IdSystem_shared_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/uid2IdSystemShared/uid2IdSystem_shared.js */ "./libraries/uid2IdSystemShared/uid2IdSystem_shared.js"); + +/** + * This module adds EUID ID support to the User ID module. It shares significant functionality with the UID2 module. + * The {@link module:modules/userId} module is required. + * @module modules/euidIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'euid'; +const MODULE_REVISION = _libraries_uid2IdSystemShared_uid2IdSystem_shared_js__WEBPACK_IMPORTED_MODULE_0__.Uid2CodeVersion; +const PREBID_VERSION = "9.45.0-pre"; +const EUID_CLIENT_ID = `PrebidJS-${PREBID_VERSION}-EUIDModule-${MODULE_REVISION}`; +const GVLID_TTD = 21; // The Trade Desk +const LOG_PRE_FIX = 'EUID: '; +const ADVERTISING_COOKIE = '__euid_advertising_token'; + +// eslint-disable-next-line no-unused-vars +const EUID_TEST_URL = 'https://integ.euid.eu'; +const EUID_PROD_URL = 'https://prod.euid.eu'; +const EUID_BASE_URL = EUID_PROD_URL; +function createLogger(logger, prefix) { + return function () { + for (var _len = arguments.length, strings = new Array(_len), _key = 0; _key < _len; _key++) { + strings[_key] = arguments[_key]; + } + logger(prefix + ' ', ...strings); + }; +} +const _logInfo = createLogger(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo, LOG_PRE_FIX); +const _logWarn = createLogger(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn, LOG_PRE_FIX); +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_2__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function hasWriteToDeviceConsent(consentData) { + const gdprApplies = consentData?.gdprApplies === true; + const localStorageConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(consentData, `vendorData.purpose.consents.1`); + const prebidVendorConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(consentData, `vendorData.vendor.consents.${GVLID_TTD.toString()}`); + if (gdprApplies && (!localStorageConsent || !prebidVendorConsent)) { + return false; + } + return true; +} + +/** @type {Submodule} */ +const euidIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Vendor id of The Trade Desk + * @type {Number} + */ + gvlid: GVLID_TTD, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{euid:{ id: string } }} or undefined if value doesn't exists + */ + decode(value) { + const result = decodeImpl(value); + _logInfo('EUID decode returned', result); + return result; + }, + /** + * performs action to obtain id and return a value. + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData|undefined} consentData + * @returns {IdResponse} + */ + getId(config, consentData) { + if (consentData?.gdpr?.gdprApplies !== true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('EUID is intended for use within the EU. The module will not run when GDPR does not apply.'); + return; + } + if (!hasWriteToDeviceConsent(consentData?.gdpr)) { + // The module cannot operate without this permission. + _logWarn(`Unable to use EUID module due to insufficient consent. The EUID module requires storage permission.`); + return; + } + const mappedConfig = { + apiBaseUrl: config?.params?.euidApiBase ?? EUID_BASE_URL, + paramToken: config?.params?.euidToken, + serverCookieName: config?.params?.euidCookie, + storage: config?.params?.storage ?? 'localStorage', + clientId: EUID_CLIENT_ID, + internalStorage: ADVERTISING_COOKIE + }; + if (true) { + mappedConfig.cstg = { + serverPublicKey: config?.params?.serverPublicKey, + subscriptionId: config?.params?.subscriptionId, + ...(0,_libraries_uid2IdSystemShared_uid2IdSystem_shared_js__WEBPACK_IMPORTED_MODULE_0__.extractIdentityFromParams)(config?.params ?? {}) + }; + } + _logInfo(`EUID configuration loaded and mapped.`, mappedConfig); + const result = (0,_libraries_uid2IdSystemShared_uid2IdSystem_shared_js__WEBPACK_IMPORTED_MODULE_0__.Uid2GetId)(mappedConfig, storage, _logInfo, _logWarn); + _logInfo(`EUID getId returned`, result); + return result; + }, + eids: { + 'euid': { + source: 'euid.eu', + atype: 3, + getValue: function (data) { + return data.id; + } + } + } +}; +function decodeImpl(value) { + if (typeof value === 'string') { + _logInfo('Found server-only token. Refresh is unavailable for this token.'); + const result = { + euid: { + id: value + } + }; + return result; + } + if (value.latestToken === 'optout') { + _logInfo('Found optout token. Refresh is unavailable for this token.'); + return { + euid: { + optout: true + } + }; + } + if (Date.now() < value.latestToken.identity_expires) { + return { + euid: { + id: value.latestToken.advertising_token + } + }; + } + return null; +} + +// Register submodule for userId +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('userId', euidIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('euidIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["uid2IdSystemShared","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/euidIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["exadsBidAdapter"],{ + +/***/ "./modules/exadsBidAdapter.js": +/*!************************************!*\ + !*** ./modules/exadsBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports imps, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +const BIDDER = 'exads'; +const PARTNERS = { + ORTB_2_4: 'ortb_2_4' +}; +const GVL_ID = 1084; +const htmlImageOutput = 'html'; +const htmlVideoOutput = 'html'; +const adPartnerHandlers = { + [PARTNERS.ORTB_2_4]: { + request: handleReqORTB2Dot4, + response: handleResORTB2Dot4, + validation: handleValidORTB2Dot4 + } +}; +function handleReqORTB2Dot4(validBidRequest, endpointUrl, bidderRequest) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(`Calling endpoint for ortb_2_4:`, endpointUrl); + const gdprConsent = getGdprConsentChoice(bidderRequest); + const envParams = getEnvParams(); + + // Make a dynamic bid request to the ad partner's endpoint + let bidRequestData = { + 'id': validBidRequest.bidId, + // NOT bid.bidderRequestId or bid.auctionId + 'at': 1, + 'imp': [], + 'bcat': validBidRequest.params.bcat, + 'badv': validBidRequest.params.badv, + 'site': { + 'id': validBidRequest.params.siteId, + 'name': validBidRequest.params.siteName, + 'domain': envParams.domain, + 'page': envParams.page, + 'keywords': validBidRequest.params.keywords + }, + 'device': { + 'ua': envParams.userAgent, + 'ip': validBidRequest.params.userIp, + 'geo': { + 'country': validBidRequest.params.country + }, + 'language': envParams.lang, + 'os': envParams.osName, + 'js': 0, + 'ext': { + 'accept_language': envParams.language + } + }, + 'user': { + 'id': validBidRequest.params.userId + }, + 'ext': { + 'sub': 0, + 'prebid': { + 'channel': { + 'name': 'pbjs', + 'version': "9.45.0-pre" + } + } + } + }; + if (gdprConsent && gdprConsent.gdprApplies) { + bidRequestData.user['ext'] = { + consent: gdprConsent.consentString + }; + } + if (validBidRequest.params.dsa && (hasValue(validBidRequest.params.dsa.dsarequired) || hasValue(validBidRequest.params.dsa.pubrender) || hasValue(validBidRequest.params.dsa.datatopub))) { + bidRequestData.regs = { + 'ext': { + 'dsa': { + 'dsarequired': validBidRequest.params.dsa.dsarequired, + 'pubrender': validBidRequest.params.dsa.pubrender, + 'datatopub': validBidRequest.params.dsa.datatopub + } + } + }; + } + const impData = imps.get(validBidRequest.params.impressionId); + + // Banner setup + const bannerMediaType = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](validBidRequest, 'mediaTypes.banner'); + if (bannerMediaType != null) { + impData.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + bidRequestData.imp = bannerMediaType.sizes.map(size => { + return { + 'id': validBidRequest.params.impressionId, + 'bidfloor': validBidRequest.params.bidfloor, + 'bidfloorcur': validBidRequest.params.bidfloorcur, + 'banner': { + 'w': size[0], + 'h': size[1], + 'mimes': validBidRequest.params.mimes ? validBidRequest.params.mimes : undefined, + 'ext': { + image_output: htmlImageOutput, + video_output: htmlVideoOutput + } + } + }; + }); + } + const nativeMediaType = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](validBidRequest, 'mediaTypes.native'); + if (nativeMediaType != null) { + impData.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE; + const nativeVersion = '1.2'; + const native = { + 'native': { + 'ver': nativeVersion, + 'plcmttype': 4, + 'plcmtcnt': validBidRequest.params.native.plcmtcnt + } + }; + native.native.assets = bidRequestData.imp = nativeMediaType.ortb.assets.map(asset => { + const newAsset = asset; + if (newAsset.img != null) { + newAsset.img.wmin = newAsset.img.h; + newAsset.img.hmin = newAsset.img.w; + } + return newAsset; + }); + const imp = [{ + 'id': validBidRequest.params.impressionId, + 'bidfloor': validBidRequest.params.bidfloor, + 'bidfloorcur': validBidRequest.params.bidfloorcur, + 'native': { + 'request': JSON.stringify(native), + 'ver': nativeVersion + } + }]; + bidRequestData.imp = imp; + } + ; + const videoMediaType = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](validBidRequest, 'mediaTypes.video'); + if (videoMediaType != null) { + impData.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + const imp = [{ + 'id': validBidRequest.params.impressionId, + 'bidfloor': validBidRequest.params.bidfloor, + 'bidfloorcur': validBidRequest.params.bidfloorcur, + 'video': { + 'mimes': videoMediaType.mimes, + 'protocols': videoMediaType.protocols + }, + 'ext': validBidRequest.params.imp.ext + }]; + bidRequestData.imp = imp; + } + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('PAYLOAD', bidRequestData, JSON.stringify(bidRequestData)); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('FINAL URL', endpointUrl); + return makeBidRequest(endpointUrl, bidRequestData); +} +; +function handleResORTB2Dot4(serverResponse, request, adPartner) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('on handleResORTB2Dot4 -> request:', request); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('on handleResORTB2Dot4 -> request json data:', JSON.parse(request.data)); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('on handleResORTB2Dot4 -> serverResponse:', serverResponse); + let bidResponses = []; + const bidRq = JSON.parse(request.data); + if (serverResponse.hasOwnProperty('body') && serverResponse.body.hasOwnProperty('id')) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('Ad server response', serverResponse.body.id); + const requestId = serverResponse.body.id; + const currency = serverResponse.body.cur; + serverResponse.body.seatbid.forEach((seatbid, seatIndex) => { + seatbid.bid.forEach((bidData, bidIndex) => { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('serverResponse.body.seatbid[' + seatIndex + '].bid[' + bidIndex + ']', bidData); + const bidResponseAd = bidData.adm; + const bannerInfo = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](bidRq.imp[0], 'banner'); + const nativeInfo = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](bidRq.imp[0], 'native'); + const videoInfo = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"](bidRq.imp[0], 'video'); + let w; + let h = 0; + let mediaType = ''; + const native = {}; + if (bannerInfo != null) { + w = bidRq.imp[0].banner.w; + h = bidRq.imp[0].banner.h; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + } else if (nativeInfo != null) { + const responseADM = JSON.parse(bidResponseAd); + responseADM.native.assets.forEach(asset => { + if (asset.img != null) { + const imgAsset = JSON.parse(bidRq.imp[0].native.request).native.assets.filter(asset => asset.img != null).map(asset => asset.img); + w = imgAsset[0].w; + h = imgAsset[0].h; + native.image = { + url: asset.img.url, + height: h, + width: w + }; + } else if (asset.title != null) { + native.title = asset.title.text; + } else if (asset.data != null) { + native.body = asset.data.value; + } else { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn('bidResponse->', 'wrong asset type or null'); + } + }); + if (responseADM.native) { + if (responseADM.native.link) { + native.clickUrl = responseADM.native.link.url; + } + if (responseADM.native.eventtrackers) { + native.impressionTrackers = []; + responseADM.native.eventtrackers.forEach(tracker => { + if (tracker.method == 1) { + native.impressionTrackers.push(tracker.url); + } + }); + } + } + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE; + } else if (videoInfo != null) { + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + } + const metaData = {}; + if (hasValue(bidData.ext.dsa)) { + metaData.dsa = bidData.ext.dsa; + } + const bidResponse = { + requestId: requestId, + currency: currency, + ad: bidData.adm, + cpm: bidData.price, + creativeId: bidData.crid, + cid: bidData.cid, + width: w, + ttl: 360, + height: h, + netRevenue: true, + mediaType: mediaType, + meta: metaData, + nurl: bidData.nurl.replace(/^http:\/\//i, 'https://') + }; + if (mediaType == 'native') { + bidResponse.native = native; + } + if (mediaType == 'video') { + bidResponse.vastXml = bidData.adm; + bidResponse.width = bidData.w; + bidResponse.height = bidData.h; + } + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('bidResponse->', bidResponse); + bidResponses.push(bidResponse); + }); + }); + } else { + imps.delete(bidRq.imp[0].id); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('NO Ad server response ->', serverResponse.body.id); + } + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('interpretResponse -> bidResponses:', bidResponses); + return bidResponses; +} +function makeBidRequest(url, data) { + const payloadString = JSON.stringify(data); + return { + method: 'POST', + url: url, + data: payloadString + }; +} +function getUrl(adPartner, bid) { + let endpointUrlMapping = { + [PARTNERS.ORTB_2_4]: bid.params.endpoint + '?idzone=' + bid.params.zoneId + '&fid=' + bid.params.fid + }; + return endpointUrlMapping[adPartner] ? endpointUrlMapping[adPartner] : 'defaultEndpoint'; +} +function getEnvParams() { + const envParams = { + lang: '', + userAgent: '', + osName: '', + page: '', + domain: '', + language: '' + }; + + // TODO: all of this is already in first party data + envParams.domain = window.location.hostname; + envParams.page = window.location.protocol + '//' + window.location.host + window.location.pathname; + envParams.lang = navigator.language.indexOf('-') > -1 ? navigator.language.split('-')[0] : navigator.language; + envParams.userAgent = navigator.userAgent; + if (envParams.userAgent.match(/Windows/i)) { + envParams.osName = 'Windows'; + } else if (envParams.userAgent.match(/Mac OS|Macintosh/i)) { + envParams.osName = 'MacOS'; + } else if (envParams.userAgent.match(/Unix/i)) { + envParams.osName = 'Unix'; + } else if (envParams.userAgent.match(/Android/i)) { + envParams.osName = 'Android'; + } else if (envParams.userAgent.match(/iPhone|iPad|iPod/i)) { + envParams.osName = 'iOS'; + } else if (envParams.userAgent.match(/Linux/i)) { + envParams.osName = 'Linux'; + } else { + envParams.osName = 'Unknown'; + } + let browserLanguage = navigator.language || navigator.userLanguage; + let acceptLanguage = browserLanguage.replace('_', '-'); + envParams.language = acceptLanguage; + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('Domain -> ', envParams.domain); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('Page -> ', envParams.page); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('Lang -> ', envParams.lang); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('OS -> ', envParams.osName); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('User Agent -> ', envParams.userAgent); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('Primary Language -> ', envParams.language); + return envParams; +} +const imps = new Map(); + +/* + Common mandatory parameters: + - endpoint + - userIp + - userIp - the minimum constraint is having the propery, empty or not + - zoneId + - partner + - fid + - siteId + - impressionId + - country + - mediaTypes?.banner or mediaTypes?.native or mediaTypes?.video + + for native parameters + - assets - it should contain the img property + + for video parameters + - mimes - it has to contain one mime type at least + - procols - it should contain one protocol at least + +*/ +function handleValidORTB2Dot4(bid) { + const bannerInfo = bid.mediaTypes?.banner; + const nativeInfo = bid.mediaTypes?.native; + const videoInfo = bid.mediaTypes?.video; + const isValid = hasValue(bid.params.endpoint) && hasValue(bid.params.userIp) && bid.params.hasOwnProperty('userIp') && hasValue(bid.params.zoneId) && hasValue(bid.params.partner) && hasValue(bid.params.fid) && hasValue(bid.params.siteId) && hasValue(bid.params.impressionId) && hasValue(bid.params.country) && hasValue(bid.params.country.length > 0) && (!hasValue(bid.params.bcat) || bid.params.bcat.length > 0) && (!hasValue(bid.params.badv) || bid.params.badv.length > 0) && (bannerInfo || nativeInfo || videoInfo) && (nativeInfo ? bid.params.native && nativeInfo.ortb.assets && nativeInfo.ortb.assets.some(asset => !!asset.img) : true) && (videoInfo ? videoInfo.mimes && videoInfo.mimes.length > 0 && videoInfo.protocols && videoInfo.protocols.length > 0 : true); + if (!isValid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('Validation Error'); + } + return isValid; +} +function hasValue(value) { + return value !== undefined && value !== null; +} +function getGdprConsentChoice(bidderRequest) { + const hasGdprConsent = hasValue(bidderRequest) && hasValue(bidderRequest.gdprConsent); + if (hasGdprConsent) { + return bidderRequest.gdprConsent; + } + return null; +} +const spec = { + aliases: ['exads'], + // short code + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid: function (bid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('on isBidRequestValid -> bid:', bid); + if (!bid.params.partner) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('Validation Error', 'bid.params.partner missed'); + return false; + } else if (!Object.values(PARTNERS).includes(bid.params.partner)) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('Validation Error', 'bid.params.partner is not valid'); + return false; + } + let adPartner = bid.params.partner; + if (adPartnerHandlers[adPartner] && adPartnerHandlers[adPartner]['validation']) { + return adPartnerHandlers[adPartner]['validation'](bid); + } else { + // Handle unknown or unsupported ad partners + return false; + } + }, + buildRequests: function (validBidRequests, bidderRequest) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('on buildRequests -> validBidRequests:', validBidRequests); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('on buildRequests -> bidderRequest:', bidderRequest); + return validBidRequests.map(bid => { + let adPartner = bid.params.partner; + imps.set(bid.params.impressionId, { + adPartner: adPartner, + mediaType: null + }); + let endpointUrl = getUrl(adPartner, bid); + + // Call the handler for the ad partner, passing relevant parameters + if (adPartnerHandlers[adPartner]['request']) { + return adPartnerHandlers[adPartner]['request'](bid, endpointUrl, bidderRequest); + } else { + // Handle unknown or unsupported ad partners + return null; + } + }); + }, + interpretResponse: function (serverResponse, request) { + const bid = JSON.parse(request.data); + const impData = imps.get(bid.imp[0].id); + const adPartner = impData.adPartner; + + // Call the handler for the ad partner, passing relevant parameters + if (adPartnerHandlers[adPartner]['response']) { + return adPartnerHandlers[adPartner]['response'](serverResponse, request, adPartner); + } else { + // Handle unknown or unsupported ad partners + return null; + } + }, + onTimeout: function (timeoutData) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn(`onTimeout -> timeoutData:`, timeoutData); + }, + onBidWon: function (bid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(`onBidWon -> bid:`, bid); + if (bid.nurl) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel(bid.nurl); + } + }, + onSetTargeting: function (bid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(`onSetTargeting -> bid:`, bid); + }, + onBidderError: function (bid) { + imps.delete(bid.bidderRequest.bids[0].params.impressionId); + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('onBidderError -> bid:', bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)({ + code: BIDDER, + gvlid: GVL_ID, + ...spec +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('exadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/exadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["excoBidAdapter"],{ + +/***/ "./modules/excoBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/excoBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports SID, ENDPOINT, BIDDER_CODE, AdapterHelpers, converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/pbsExtensions/pbsExtensions.js */ "./libraries/pbsExtensions/pbsExtensions.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + + +const SID = window.excoPid || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +const ENDPOINT = '//v.ex.co/se/openrtb/hb/pbjs'; +const SYNC_URL = '//cdn.ex.co/sync/e15e216-l/cookie_sync.html'; +const BIDDER_CODE = 'exco'; +const VERSION = '0.0.1'; +const CURRENCY = 'USD'; +const SYNC = { + done: false +}; +class AdapterHelpers { + doSync() { + let gdprConsent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + consentString: '', + gdprApplies: false + }; + let accountId = arguments.length > 1 ? arguments[1] : undefined; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.insertUserSyncIframe)(this.createSyncUrl(gdprConsent, accountId)); + } + createSyncUrl(_ref, network) { + let { + consentString, + gppString, + applicableSections, + gdprApplies + } = _ref; + try { + const url = new URL(window.location.protocol + SYNC_URL); + const networks = ['368531133']; + if (network) { + networks.push(network); + } + url.searchParams.set('network', networks.join(',')); + url.searchParams.set('gdpr', encodeURIComponent((Number(gdprApplies) || 0).toString())); + url.searchParams.set('gdpr_consent', encodeURIComponent(consentString || '')); + if (gppString && applicableSections?.length) { + url.searchParams.set('gpp', encodeURIComponent(gppString)); + url.searchParams.set('gpp_sid', encodeURIComponent(applicableSections.join(','))); + } + return url.toString(); + } catch (error) {/* Do nothing */} + return null; + } + addOrtbFirstPartyData(data, bidRequests) { + const params = bidRequests[0].params || {}; + const key = data.app ? 'app' : 'site'; + if (data[key] && data[key].publisher && params.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(data[key].publisher, { + id: bidRequests[0].params.publisherId + }); + } + } + getExtData(bidRequests, bidderRequest) { + return { + version: VERSION, + pbversion: "9.45.0-pre", + sid: SID, + aid: bidRequests[0]?.auctionId || bidderRequest.bidderRequestId, + rc: bidRequests[0]?.bidRequestsCount, + brc: bidRequests[0]?.bidderRequestsCount + }; + } + createRequest(converter, bidRequests, bidderRequest, mediaType) { + const data = converter.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }); + data.ext[BIDDER_CODE] = this.getExtData(bidRequests, bidderRequest); + return { + method: 'POST', + url: ENDPOINT, + data + }; + } + isVideoBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video'); + } + isBannerBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner') || !this.isVideoBid(bid); + } + adoptVideoImp(imp, bidRequest) { + imp.id = bidRequest.adUnitCode; + if (bidRequest.params) { + imp.tagId = bidRequest.params.tagId; + } + } + adoptBannerImp(imp, bidRequest) { + if (bidRequest.params) { + imp.tagId = bidRequest.params.tagId; + } + } + adoptBidResponse(bidResponse, bid, context) { + bidResponse.bidderCode = BIDDER_CODE; + bidResponse.vastXml = bidResponse.ad || bid.adm; + bidResponse.ad = bid.ad; + bidResponse.adUrl = bid.adUrl; + bidResponse.mediaType = bid.mediaType || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + bidResponse.meta.mediaType = bid.mediaType || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + bidResponse.meta.advertiserDomains = bidResponse.meta.advertiserDomains || []; + bidResponse.creativeId = bidResponse.creativeId || `creative-${Date.now()}`; + bidResponse.netRevenue = bid.netRevenue || true; + bidResponse.currency = CURRENCY; + bidResponse.cpm = bid.cpm; + const { + bidRequest + } = context; + bidResponse.width = bid.w || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.w') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.video.playerWidth'); + bidResponse.height = bid.h || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.h') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.video.playerHeight'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'ext.bidder.rp.advid')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidResponse, 'meta.advertiserId', bid.ext.bidder.rp.advid); + } + return bidResponse; + } + log(severity, message) { + const msg = `${BIDDER_CODE.toUpperCase()}: ${message}`; + if (severity === 'warn') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(msg); + } + if (severity === 'error') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(msg); + } + if (severity === 'info') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(msg); + } + } +} +const helpers = new AdapterHelpers(); + +/** + * @description https://github.com/prebid/Prebid.js/blob/master/libraries/ortbConverter/README.md + */ +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_4__.ortbConverter)({ + request(buildRequest, imps, bidderRequest, context) { + const data = buildRequest(imps, bidderRequest, context); + if (data.cur && !data.cur.includes('USD')) { + helpers.log('warn', 'Warning - EX.CO adapter is supporting USD only. processing with USD'); + } + data.cur = [CURRENCY]; + data.test = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('debug') ? 1 : 0; + helpers.addOrtbFirstPartyData(data, context.bidRequests || []); + return data; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + imp.secure = window.location.protocol === 'http:' ? 0 : 1; + if (imp.video) { + helpers.adoptVideoImp(imp, bidRequest); + } + if (imp.banner) { + helpers.adoptBannerImp(imp, bidRequest); + } + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + return helpers.adoptBidResponse(bidResponse, bid, context); + }, + context: { + ttl: 3000 + }, + processors: _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_6__.pbsExtensions +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {import('../src/auction.js').BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + const props = ['accountId', 'publisherId', 'tagId']; + const missing = props.filter(prop => !bid.params[prop]); + const nonStr = props.filter(prop => !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(bid.params[prop])); + const existingLegacy = ['cId', 'pId'].filter(prop => bid.params[prop]); + const message = `Bid will not be sent for ad unit '${bid.adUnitCode}'`; + const suggestion = 'wrap it in quotes in your config'; + if (existingLegacy.length) { + existingLegacy.forEach(prop => { + helpers.log('warn', `Warn: '${prop}' was deprecated.`); + }); + } + if (missing.length) { + missing.forEach(prop => { + helpers.log('warn', `Error: '${prop}' is missing. ${message}`); + }); + return false; + } + if (nonStr.length) { + nonStr.forEach(prop => { + helpers.log('warn', `Error: '${prop}' must be a string (${suggestion}). ${message}`); + }); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {import('../src/auction.js').Bid[]} bids - an array of bids + * @param {import('../src/auction.js').BidderRequest} bidderRequest - bidder request object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bids, bidderRequest) { + const videoBids = bids.filter(bid => helpers.isVideoBid(bid)); + const bannerBids = bids.filter(bid => helpers.isBannerBid(bid)); + const requests = []; + if (bannerBids.length) { + requests.push(helpers.createRequest(converter, bannerBids, bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER)); + } + if (videoBids.length) { + requests.push(helpers.createRequest(converter, videoBids, bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO)); + } + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {object} response A successful response from the server. + * @return {import('../src/auction.js').Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (response, request) { + const body = response?.body?.Result || response?.body || {}; + return converter.fromORTB({ + response: body, + request: request?.data + }).bids || []; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {import('../src/adapters/bidderFactory.js').SyncOptions} syncOptions Which user syncs are allowed? + * @param {object[]} serverResponses List of server's responses. + * @return {import('../src/adapters/bidderFactory.js').UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (syncOptions.iframeEnabled && !SYNC.done) { + helpers.doSync(gdprConsent); + SYNC.done = true; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('excoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","pbsExtensions","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/excoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["experianRtdProvider"],{ + +/***/ "./modules/experianRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/experianRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports SUBMODULE_NAME, EXPERIAN_RTID_DATA_KEY, EXPERIAN_RTID_EXPIRATION_KEY, EXPERIAN_RTID_STALE_KEY, EXPERIAN_RTID_NO_TRACK_KEY, experianRtdObj, experianRtdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + * @typedef {import('../modules/rtdModule/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/rtdModule/index.js').UserConsentData} UserConsentData + */ + +const SUBMODULE_NAME = 'experian_rtid'; +const EXPERIAN_RTID_DATA_KEY = 'experian_rtid_data'; +const EXPERIAN_RTID_EXPIRATION_KEY = 'experian_rtid_expiration'; +const EXPERIAN_RTID_STALE_KEY = 'experian_rtid_stale'; +const EXPERIAN_RTID_NO_TRACK_KEY = 'experian_rtid_no_track'; +const EXPERIAN_RTID_URL = 'https://rtid.tapad.com'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +const experianRtdObj = { + /** + * @summary modify bid request data + * @param {Object} reqBidsConfigObj + * @param {function} done + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + getBidRequestData(reqBidsConfigObj, done, config, userConsent) { + const dataEnvelope = storage.getDataFromLocalStorage(EXPERIAN_RTID_DATA_KEY, null); + const stale = storage.getDataFromLocalStorage(EXPERIAN_RTID_STALE_KEY, null); + const expired = storage.getDataFromLocalStorage(EXPERIAN_RTID_EXPIRATION_KEY, null); + const noTrack = storage.getDataFromLocalStorage(EXPERIAN_RTID_NO_TRACK_KEY, null); + const now = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)(); + if (now > new Date(expired).getTime() || noTrack == null && dataEnvelope == null) { + // request data envelope and don't manipulate bids + experianRtdObj.requestDataEnvelope(config, userConsent); + done(); + return false; + } + if (now > new Date(stale).getTime()) { + // request data envelope and manipulate bids + experianRtdObj.requestDataEnvelope(config, userConsent); + } + if (noTrack != null) { + done(); + return false; + } + experianRtdObj.alterBids(reqBidsConfigObj, config); + done(); + return true; + }, + alterBids(reqBidsConfigObj, config) { + const dataEnvelope = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.safeJSONParse)(storage.getDataFromLocalStorage(EXPERIAN_RTID_DATA_KEY, null)); + if (dataEnvelope == null) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.bidders').forEach(bidderCode => { + const bidderData = dataEnvelope.find(_ref => { + let { + bidder + } = _ref; + return bidder === bidderCode; + }); + if (bidderData != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.bidder, { + [bidderCode]: { + experianRtidKey: bidderData.data.key, + experianRtidData: bidderData.data.data + } + }); + } + }); + }, + requestDataEnvelope(config, userConsent) { + function storeDataEnvelopeResponse(response) { + const responseJson = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.safeJSONParse)(response); + if (responseJson != null) { + storage.setDataInLocalStorage(EXPERIAN_RTID_STALE_KEY, responseJson.staleAt, null); + storage.setDataInLocalStorage(EXPERIAN_RTID_EXPIRATION_KEY, responseJson.expiresAt, null); + if (responseJson.status === 'no_track') { + storage.setDataInLocalStorage(EXPERIAN_RTID_NO_TRACK_KEY, 'no_track', null); + storage.removeDataFromLocalStorage(EXPERIAN_RTID_DATA_KEY, null); + } else { + storage.setDataInLocalStorage(EXPERIAN_RTID_DATA_KEY, JSON.stringify(responseJson.data), null); + storage.removeDataFromLocalStorage(EXPERIAN_RTID_NO_TRACK_KEY, null); + } + } + } + const queryString = experianRtdObj.extractConsentQueryString(config, userConsent); + const fullUrl = queryString == null ? `${EXPERIAN_RTID_URL}/acc/${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.accountId')}/ids` : `${EXPERIAN_RTID_URL}/acc/${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.accountId')}/ids${queryString}`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(fullUrl, storeDataEnvelopeResponse, null, { + withCredentials: true, + contentType: 'application/json' + }); + }, + extractConsentQueryString(config, userConsent) { + const queryObj = {}; + if (userConsent != null) { + if (userConsent.gdpr != null) { + const { + gdprApplies, + consentString + } = userConsent.gdpr; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(queryObj, { + gdpr: gdprApplies, + gdpr_consent: consentString + }); + } + if (userConsent.uspConsent != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(queryObj, { + us_privacy: userConsent.uspConsent + }); + } + } + const consentQueryString = Object.entries(queryObj).map(_ref2 => { + let [key, val] = _ref2; + return `${key}=${val}`; + }).join('&'); + let idsString = ''; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.ids') != null && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.ids'))) { + idsString = Object.entries((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.ids')).map(_ref3 => { + let [idType, val] = _ref3; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(val)) { + return val.map(singleVal => `id.${idType}=${singleVal}`).join('&'); + } else { + return `id.${idType}=${val}`; + } + }).join('&'); + } + const combinedString = [consentQueryString, idsString].filter(string => string !== '').join('&'); + return combinedString !== '' ? `?${combinedString}` : undefined; + }, + /** + * @function + * @summary init sub module + * @name RtdSubmodule#init + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + * @return {boolean} false to remove sub module + */ + init(config, userConsent) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, 'params.accountId')); + } +}; + +/** @type {RtdSubmodule} */ +const experianRtdSubmodule = { + name: SUBMODULE_NAME, + getBidRequestData: experianRtdObj.getBidRequestData, + init: experianRtdObj.init +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', experianRtdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('experianRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/experianRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["express"],{ + +/***/ "./modules/express.js": +/*!****************************!*\ + !*** ./modules/express.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + +const MODULE_NAME = 'express'; +const pbjsInstance = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(); + +/** + * Express Module + * + * The express module allows the initiation of Prebid.js auctions automatically based on calls such as gpt.defineSlot. + * It works by monkey-patching the gpt methods and overloading their functionality. In order for this module to be + * used gpt must be included in the page, this module must be included in the Prebid.js bundle, and a call to + * pbjs.express() must be made. + * + * @param {Object[]} [adUnits = pbjs.adUnits] - an array of adUnits for express to operate on. + */ +pbjsInstance.express = function () { + let adUnits = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : pbjsInstance.adUnits; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('loading ' + MODULE_NAME); + if (adUnits.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('no valid adUnits found, not loading ' + MODULE_NAME); + } + + // store gpt slots in a more performant hash lookup by elementId (adUnit code) + var gptSlotCache = {}; + // put adUnits in a more performant hash lookup by code. + var adUnitsCache = adUnits.reduce(function (cache, adUnit) { + if (adUnit.code && adUnit.bids) { + cache[adUnit.code] = adUnit; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('misconfigured adUnit', null, adUnit); + } + return cache; + }, {}); + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(function () { + // verify all necessary gpt functions exist + var gpt = window.googletag; + var pads = gpt.pubads; + if (!gpt.display || !gpt.enableServices || typeof pads !== 'function' || !pads().refresh || !pads().disableInitialLoad || !pads().getSlots || !pads().enableSingleRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('could not bind to gpt googletag api'); + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('running'); + + // function to convert google tag slot sizes to [[w,h],...] + function mapGptSlotSizes(aGPTSlotSizes) { + var aSlotSizes = []; + for (var i = 0; i < aGPTSlotSizes.length; i++) { + try { + aSlotSizes.push([aGPTSlotSizes[i].getWidth(), aGPTSlotSizes[i].getHeight()]); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('slot size ' + aGPTSlotSizes[i].toString() + ' not supported by' + MODULE_NAME); + } + } + return aSlotSizes; + } + + // a helper function to verify slots or get slots if not present + function defaultSlots(slots) { + return Array.isArray(slots) ? slots.slice() + // eslint-disable-next-line no-undef + : googletag.pubads().getSlots().slice(); + } + + // maps gpt slots to adUnits, matches are copied to new array and removed from passed array. + function pickAdUnits(gptSlots) { + var adUnits = []; + // traverse backwards (since gptSlots is mutated) to find adUnits in cache and remove non-mapped slots + for (var i = gptSlots.length - 1; i > -1; i--) { + const gptSlot = gptSlots[i]; + const elemId = gptSlot.getSlotElementId(); + const adUnit = adUnitsCache[elemId]; + if (adUnit) { + gptSlotCache[elemId] = gptSlot; // store by elementId + adUnit.sizes = adUnit.sizes || mapGptSlotSizes(gptSlot.getSizes()); + adUnits.push(adUnit); + gptSlots.splice(i, 1); + } + } + return adUnits; + } + + // store original gpt functions that will be overridden + var fGptDisplay = gpt.display; + var fGptEnableServices = gpt.enableServices; + var fGptRefresh = pads().refresh; + var fGptDisableInitialLoad = pads().disableInitialLoad; + var fGptEnableSingleRequest = pads().enableSingleRequest; + + // override googletag.enableServices() + // - make sure fGptDisableInitialLoad() has been called so we can + // better control when slots are displayed, then call original + // fGptEnableServices() + gpt.enableServices = function () { + if (!bInitialLoadDisabled) { + fGptDisableInitialLoad.apply(pads()); + } + return fGptEnableServices.apply(gpt, arguments); + }; + + // override googletag.display() + // - call the real fGptDisplay(). this won't initiate auctions because we've disabled initial load + // - define all corresponding rubicon slots + // - if disableInitialLoad() has been called by the pub, done + // - else run an auction and call the real fGptRefresh() to + // initiate the DFP request + gpt.display = function (sElementId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('display:', sElementId); + // call original gpt display() function + fGptDisplay.apply(gpt, arguments); + + // if not SRA mode, get only the gpt slot corresponding to sEementId + var aGptSlots; + if (!bEnabledSRA) { + // eslint-disable-next-line no-undef + aGptSlots = googletag.pubads().getSlots().filter(function (oGptSlot) { + return oGptSlot.getSlotElementId() === sElementId; + }); + } + aGptSlots = defaultSlots(aGptSlots).filter(function (gptSlot) { + return !gptSlot._displayed; + }); + aGptSlots.forEach(function (gptSlot) { + gptSlot._displayed = true; + }); + var adUnits = pickAdUnits(/* mutated: */aGptSlots); + if (!bInitialLoadDisabled) { + if (aGptSlots.length) { + fGptRefresh.apply(pads(), [aGptSlots]); + } + if (adUnits.length) { + pbjsInstance.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + pbjsInstance.setTargetingForGPTAsync(); + fGptRefresh.apply(pads(), [adUnits.map(function (adUnit) { + return gptSlotCache[adUnit.code]; + })]); + } + }); + } + } + }; + + // override gpt refresh() function + // - run auctions for provided gpt slots, then initiate ad-server call + pads().refresh = function (aGptSlots, options) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('refresh:', aGptSlots); + // get already displayed adUnits from aGptSlots if provided, else all defined gptSlots + aGptSlots = defaultSlots(aGptSlots); + var adUnits = pickAdUnits(/* mutated: */aGptSlots).filter(function (adUnit) { + return gptSlotCache[adUnit.code]._displayed; + }); + if (aGptSlots.length) { + fGptRefresh.apply(pads(), [aGptSlots, options]); + } + if (adUnits.length) { + pbjsInstance.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + pbjsInstance.setTargetingForGPTAsync(); + fGptRefresh.apply(pads(), [adUnits.map(function (adUnit) { + return gptSlotCache[adUnit.code]; + }), options]); + } + }); + } + }; + + // override gpt disableInitialLoad function + // Register that initial load was called, meaning calls to display() + // should not initiate an ad-server request. Instead a call to + // refresh() will be needed to iniate the request. + // We will assume the pub is using this the correct way, calling it + // before enableServices() + var bInitialLoadDisabled = false; + pads().disableInitialLoad = function () { + bInitialLoadDisabled = true; + return fGptDisableInitialLoad.apply(window.googletag.pubads(), arguments); + }; + + // override gpt useSingleRequest function + // Register that SRA has been turned on + // We will assume the pub is using this the correct way, calling it + // before enableServices() + var bEnabledSRA = false; + pads().enableSingleRequest = function () { + bEnabledSRA = true; + return fGptEnableSingleRequest.apply(window.googletag.pubads(), arguments); + }; + }); +}; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.registerModule)('express'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/express.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["fabrickIdSystem"],{ + +/***/ "./modules/fabrickIdSystem.js": +/*!************************************!*\ + !*** ./modules/fabrickIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports fabrickIdSubmodule, appendUrl */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + +/** + * This module adds neustar's fabrickId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/fabrickIdSystem + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +/** @type {Submodule} */ +const fabrickIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'fabrickId', + /** + * decode the stored id value for passing to bid requests + * @function decode + * @param {(Object|string)} value + * @returns {(Object|undefined)} + */ + decode(value) { + if (value && value.fabrickId) { + return { + 'fabrickId': value.fabrickId + }; + } else { + return undefined; + } + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function getId + * @param {SubmoduleConfig} [config] + * @param {ConsentData} consentData + * @param {Object} cacheIdObj - existing id, if any + * @returns {IdResponse|undefined} + */ + getId(config, consentData, cacheIdObj) { + try { + const configParams = config && config.params || {}; + if (window.fabrickMod1) { + window.fabrickMod1(configParams, consentData?.gdpr, cacheIdObj); + } + if (!configParams || !configParams.apiKey || typeof configParams.apiKey !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('fabrick submodule requires an apiKey.'); + return; + } + try { + let url = _getBaseUrl(configParams); + let keysArr = Object.keys(configParams); + for (let i in keysArr) { + let k = keysArr[i]; + if (k === 'url' || k === 'refererInfo' || k.length > 3 && k.substring(0, 3) === 'max') { + continue; + } + let v = configParams[k]; + if (Array.isArray(v)) { + for (let j in v) { + if (typeof v[j] === 'string' || typeof v[j] === 'number') { + url += `${k}=${v[j]}&`; + } + } + } else if (typeof v === 'string' || typeof v === 'number') { + url += `${k}=${v}&`; + } + } + // pull off the trailing & + url = url.slice(0, -1); + const referer = _getRefererInfo(configParams); + const refs = new Map(); + _setReferrer(refs, referer.topmostLocation); + if (referer.stack && referer.stack[0]) { + _setReferrer(refs, referer.stack[0]); + } + _setReferrer(refs, referer.canonicalUrl); + _setReferrer(refs, window.location.href); + refs.forEach(v => { + url = appendUrl(url, 'r', v, configParams); + }); + const resp = function (callback) { + const callbacks = { + success: response => { + if (window.fabrickMod2) { + return window.fabrickMod2(callback, response, configParams, consentData?.gdpr, cacheIdObj); + } else { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(error); + responseObj = {}; + } + } + callback(responseObj); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`fabrickId fetch encountered an error`, error); + callback(); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, callbacks, null, { + method: 'GET', + withCredentials: true + }); + }; + return { + callback: resp + }; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`fabrickIdSystem encountered an error`, e); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`fabrickIdSystem encountered an error`, e); + } + }, + eids: { + 'fabrickId': { + source: 'neustar.biz', + atype: 1 + } + } +}; +function _getRefererInfo(configParams) { + if (configParams.refererInfo) { + return configParams.refererInfo; + } else { + return (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.getRefererInfo)(); + } +} +function _getBaseUrl(configParams) { + if (configParams.url) { + return configParams.url; + } else { + return `https://fid.agkn.com/f?`; + } +} +function _setReferrer(refs, s) { + if (s) { + // store the longest one for the same URI + const url = s.split('?')[0]; + // OR store the longest one for the same domain + // const url = s.split('?')[0].replace('http://','').replace('https://', '').split('/')[0]; + if (refs.has(url)) { + const prevRef = refs.get(url); + if (s.length > prevRef.length) { + refs.set(url, s); + } + } else { + refs.set(url, s); + } + } +} +function appendUrl(url, paramName, s, configParams) { + const maxUrlLen = configParams && configParams.maxUrlLen || 2000; + const maxRefLen = configParams && configParams.maxRefLen || 1000; + const maxSpaceAvailable = configParams && configParams.maxSpaceAvailable || 50; + // make sure we have enough space left to make it worthwhile + if (s && url.length < maxUrlLen - maxSpaceAvailable) { + let thisMaxRefLen = maxUrlLen - url.length; + if (thisMaxRefLen > maxRefLen) { + thisMaxRefLen = maxRefLen; + } + s = `&${paramName}=${encodeURIComponent(s)}`; + if (s.length >= thisMaxRefLen) { + s = s.substring(0, thisMaxRefLen); + if (s.charAt(s.length - 1) === '%') { + s = s.substring(0, thisMaxRefLen - 1); + } else if (s.charAt(s.length - 2) === '%') { + s = s.substring(0, thisMaxRefLen - 2); + } + } + return `${url}${s}`; + } else { + return url; + } +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', fabrickIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('fabrickIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/fabrickIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["fanAdapter"],{ + +/***/ "./modules/fanAdapter.js": +/*!*******************************!*\ + !*** ./modules/fanAdapter.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'freedomadnetwork'; +const BASE_URL = 'https://srv.freedomadnetwork.com'; + +/** + * Build OpenRTB request from bidRequest and bidderRequest + * + * @param {BidRequest} bid + * @param {BidderRequest} bidderRequest + * @returns {Request} + */ +function buildBidRequest(bid, bidderRequest) { + const payload = { + id: bid.bidId, + tmax: bidderRequest.timeout, + placements: [bid.params.placementId], + at: 1, + user: {} + }; + const gdprConsent = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"](bidderRequest, 'gdprConsent'); + if (!!gdprConsent && gdprConsent.gdprApplies) { + payload.user.gdpr = 1; + payload.user.consent = gdprConsent.consentString; + } + const uspConsent = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"](bidderRequest, 'uspConsent'); + if (uspConsent) { + payload.user.usp = uspConsent; + } + return { + method: 'POST', + url: BASE_URL + '/pb/req', + data: JSON.stringify(payload), + options: { + contentType: 'application/json', + withCredentials: false, + customHeaders: { + 'Accept-Language': 'en;q=10' + } + }, + originalBidRequest: bid + }; +} +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + if (!bid) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(BIDDER_CODE, 'Invalid bid', bid); + return false; + } + if (!bid.params) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(BIDDER_CODE, 'bid.params is required'); + return false; + } + if (!bid.params.placementId) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(BIDDER_CODE, 'bid.params.placementId is required'); + return false; + } + var banner = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"](bid, 'mediaTypes.banner'); + if (banner === undefined) { + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bid => buildBidRequest(bid, bidderRequest)); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const serverBody = serverResponse.body; + let bidResponses = []; + if (!serverBody) { + return bidResponses; + } + serverBody.forEach(response => { + const bidResponse = { + requestId: response.id, + bidid: response.bidid, + impid: response.impid, + userId: response.userId, + cpm: response.cpm, + currency: response.currency, + width: response.width, + height: response.height, + ad: response.payload, + ttl: response.ttl, + creativeId: response.crid, + netRevenue: response.netRevenue, + trackers: response.trackers, + meta: { + mediaType: response.mediaType, + advertiserDomains: response.domains + } + }; + bidResponses.push(bidResponse); + }); + return bidResponses; + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * + * @param {Bid} bid The bid that won the auction + */ + onBidWon: function (bid) { + if (!bid) { + return; + } + const payload = { + id: bid.bidid, + impid: bid.impid, + t: bid.cpm, + u: bid.userId + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(BASE_URL + '/pb/imp', null, JSON.stringify(payload), { + method: 'POST', + customHeaders: { + 'Accept-Language': 'en;q=10' + } + }); + if (bid.trackers && bid.trackers.length > 0) { + for (var i = 0; i < bid.trackers.length; i++) { + if (bid.trackers[i].type == 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(bid.trackers[i].url); + } + } + } + }, + onSetTargeting: function (bid) {}, + onBidderError: function (error) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError(`${BIDDER_CODE} bidder error`, error); + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + return syncs; + }, + onTimeout: function (timeoutData) {}, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('fanAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/fanAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["feedadBidAdapter"],{ + +/***/ "./modules/feedadBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/feedadBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + * @typedef {import('../src/adapters/bidderFactory.js').MediaType} MediaType + */ + +/** + * Version of the FeedAd bid adapter + * @type {string} + */ +const VERSION = '1.0.6'; + +/** + * @typedef {object} FeedAdUserSync + * @inner + * + * @property {string} type + * @property {string} url + */ + +/** + * @typedef {object} FeedAdBidExtension + * @inner + * + * @property {FeedAdUserSync[]} pixels + * @property {FeedAdUserSync[]} iframes + */ + +/** + * @typedef {object} FeedAdApiBidRequest + * @inner + * + * @property {number} ad_type + * @property {string} client_token + * @property {string} placement_id + * @property {string} prebid_adapter_version + * @property {string} prebid_sdk_version + * @property {boolean} app_hybrid + * + * @property {string} [app_bundle_id] + * @property {string} [app_name] + * @property {object} [custom_params] + * @property {number} [connectivity] + * @property {string} [device_adid] + * @property {string} [device_platform] + */ + +/** + * @typedef {object} FeedAdApiBidResponse + * @inner + * + * @property {string} [ad] - Ad HTML payload + * @property {number} cpm - number / float + * @property {string} creativeId - ID of creative for tracking + * @property {string} currency - 3-letter ISO 4217 currency-code + * @property {number} height - Height of creative returned in [].ad + * @property {boolean} netRevenue - Is the CPM net (true) or gross (false)? + * @property {string} requestId - bids[].bidId + * @property {number} ttl - Time to live for this ad + * @property {number} width - Width of creative returned in [].ad + * @property {FeedAdBidExtension} [ext] - an extension object + */ + +/** + * @typedef {object} FeedAdApiTrackingParams + * @inner + * + * @property app_hybrid {boolean} + * @property client_token {string} + * @property klass {'prebid_bidWon'|'prebid_bidTimeout'} + * @property placement_id {string} + * @property prebid_auction_id {string} + * @property prebid_bid_id {string} + * @property prebid_transaction_id {string} + * @property referer {string} + * @property sdk_version {string} + * @property [app_bundle_id] {string} + * @property [app_name] {string} + * @property [device_adid] {string} + * @property [device_platform] {1|2|3} 1 - Android | 2 - iOS | 3 - Windows + */ + +/** + * @typedef {object} FeedAdServerResponse + * @augments {Object} + * @inner + * + * @property {FeedAdApiBidResponse[]} body - the body of a FeedAd server response + */ + +/** + * The IAB TCF 2.0 vendor ID for the FeedAd GmbH + */ +const TCF_VENDOR_ID = 781; + +/** + * Bidder network identity code + * @type {string} + */ +const BIDDER_CODE = 'feedad'; + +/** + * The media types supported by FeedAd + * @type {MediaType[]} + */ +const MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; + +/** + * Tag for logging + * @type {string} + */ +const TAG = '[FeedAd]'; + +/** + * Pattern for valid placement IDs + * @type {RegExp} + */ +const PLACEMENT_ID_PATTERN = /^[a-z0-9][a-z0-9_-]+[a-z0-9]$/; +const API_ENDPOINT = 'https://api.feedad.com'; +const API_PATH_BID_REQUEST = '/1/prebid/web/bids'; +const API_PATH_TRACK_REQUEST = '/1/prebid/web/events'; + +/** + * Stores temporary auction metadata + * @type {Object.} + */ +const BID_METADATA = {}; + +/** + * Checks if the bid is compatible with FeedAd. + * + * @param {BidRequest} bid - the bid to check + * @return {boolean} true if the bid is valid + */ +function isBidRequestValid(bid) { + const clientToken = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.clientToken'); + if (!clientToken || !isValidClientToken(clientToken)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(TAG, "missing or invalid parameter 'clientToken'. found value:", clientToken); + return false; + } + const placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.placementId'); + if (!placementId || !isValidPlacementId(placementId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(TAG, "missing or invalid parameter 'placementId'. found value:", placementId); + return false; + } + return true; +} + +/** + * Checks if a client token is valid + * @param {string} clientToken - the client token + * @return {boolean} true if the token is valid + */ +function isValidClientToken(clientToken) { + return typeof clientToken === 'string' && clientToken.length > 0; +} + +/** + * Checks if the given placement id is of a correct format. + * Valid IDs are words of lowercase letters from a to z and numbers from 0 to 9. + * The words can be separated by hyphens or underscores. + * Multiple separators must not follow each other. + * The whole placement ID must not be larger than 256 characters. + * + * @param placementId - the placement id to verify + * @returns if the placement ID is valid. + */ +function isValidPlacementId(placementId) { + return typeof placementId === 'string' && placementId.length > 0 && placementId.length <= 256 && PLACEMENT_ID_PATTERN.test(placementId); +} + +/** + * Checks if the given media types contain unsupported settings + * @param {Object} mediaTypes - the media types to check + * @return {Object} the unsupported settings, empty when all types are supported + */ +function filterSupportedMediaTypes(mediaTypes) { + return { + banner: mediaTypes.banner, + video: mediaTypes.video && mediaTypes.video.context === 'outstream' ? mediaTypes.video : undefined, + native: undefined + }; +} + +/** + * Checks if the given media types are empty + * @param {Object} mediaTypes - the types to check + * @return {boolean} true if the types are empty + */ +function isMediaTypesEmpty(mediaTypes) { + return Object.keys(mediaTypes).every(type => mediaTypes[type] === undefined); +} + +/** + * Creates the bid request params the api expects from the prebid bid request + * @param {BidRequest} request - the validated prebid bid request + * @return {FeedAdApiBidRequest} + */ +function createApiBidRParams(request) { + return Object.assign({}, request.params, { + ad_type: 0, + client_token: request.params.clientToken, + placement_id: request.params.placementId, + prebid_adapter_version: VERSION, + prebid_sdk_version: "9.45.0-pre", + app_hybrid: false + }); +} + +/** + * Builds the bid request to the FeedAd Server + * @param {BidRequest[]} validBidRequests - all validated bid requests + * @param {object} bidderRequest - meta information + * @return {ServerRequest|ServerRequest[]} + */ +function buildRequests(validBidRequests, bidderRequest) { + if (!bidderRequest) { + return []; + } + let acceptableRequests = validBidRequests.filter(request => !isMediaTypesEmpty(filterSupportedMediaTypes(request.mediaTypes))); + if (acceptableRequests.length === 0) { + return []; + } + let data = Object.assign({}, bidderRequest, { + bids: acceptableRequests.map(req => { + req.params = createApiBidRParams(req); + return req; + }) + }); + data.bids.forEach(bid => BID_METADATA[bid.bidId] = { + referer: data.refererInfo.page, + transactionId: bid.ortb2Imp?.ext?.tid + }); + if (bidderRequest.gdprConsent) { + data.consentIabTcf = bidderRequest.gdprConsent.consentString; + data.gdprApplies = bidderRequest.gdprConsent.gdprApplies; + } + return { + method: 'POST', + url: `${API_ENDPOINT}${API_PATH_BID_REQUEST}`, + data, + options: { + contentType: 'application/json' + } + }; +} + +/** + * Adapts the FeedAd server response to Prebid format + * @param {FeedAdServerResponse} serverResponse - the FeedAd server response + * @param {BidRequest} request - the initial bid request + * @returns {Bid[]} the FeedAd bids + */ +function interpretResponse(serverResponse, request) { + const response = typeof serverResponse.body === 'string' ? JSON.parse(serverResponse.body) : serverResponse.body; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(response)) { + return []; + } + return response.filter(bid => Object.prototype.hasOwnProperty.call(bid, 'ad')).map(bid => { + const copy = Object.assign({}, bid); + delete copy.ext; + return copy; + }); +} + +/** + * Creates the parameters for the FeedAd tracking call + * @param {object} data - prebid data + * @param {'prebid_bidWon'|'prebid_bidTimeout'} klass - type of tracking call + * @return {FeedAdApiTrackingParams|null} + */ +function createTrackingParams(data, klass) { + const bidId = data.bidId || data.requestId; + if (!BID_METADATA.hasOwnProperty(bidId)) { + return null; + } + const { + referer, + transactionId + } = BID_METADATA[bidId]; + delete BID_METADATA[bidId]; + return { + app_hybrid: false, + client_token: data.params[0].clientToken, + placement_id: data.params[0].placementId, + klass, + prebid_auction_id: data.auctionId, + prebid_bid_id: bidId, + prebid_transaction_id: transactionId, + referer, + prebid_adapter_version: VERSION, + prebid_sdk_version: "9.45.0-pre" + }; +} + +/** + * Creates a tracking handler for the given event type + * @param klass - the event type + * @return {Function} the tracking handler function + */ +function trackingHandlerFactory(klass) { + return data => { + if (!data) { + return; + } + let params = createTrackingParams(data, klass); + if (params) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(`${API_ENDPOINT}${API_PATH_TRACK_REQUEST}`, null, JSON.stringify(params), { + withCredentials: true, + method: 'POST', + contentType: 'application/json' + }); + } + }; +} + +/** + * Reads the user syncs off the server responses and converts them into Prebid.JS format + * @param {SyncOptions} syncOptions + * @param {FeedAdServerResponse[]} serverResponses + * @param gdprConsent + * @param uspConsent + */ +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + return serverResponses.flatMap(response => { + // merge all response bodies into one + const body = response.body; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(body) ? body : []; + }).flatMap(/** @param {FeedAdApiBidResponse} bidResponse */bidResponse => { + // extract user syncs from extension + const pixels = syncOptions.pixelEnabled && bidResponse?.ext?.pixels ? bidResponse.ext.pixels : []; + const iframes = syncOptions.iframeEnabled && bidResponse?.ext?.iframes ? bidResponse.ext.iframes : []; + return pixels.concat(...iframes); + }).reduce((syncs, sync) => { + // remove duplicates + if (!syncs.find(it => it.type === sync.type && it.url === sync.url)) { + syncs.push(sync); + } + return syncs; + }, []); +} + +/** + * @type {BidderSpec} + */ +const spec = { + code: BIDDER_CODE, + gvlid: TCF_VENDOR_ID, + supportedMediaTypes: MEDIA_TYPES, + isBidRequestValid, + buildRequests, + interpretResponse, + onTimeout: trackingHandlerFactory('prebid_bidTimeout'), + onBidWon: trackingHandlerFactory('prebid_bidWon'), + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('feedadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/feedadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["finativeBidAdapter"],{ + +/***/ "./modules/finativeBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/finativeBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + +const BIDDER_CODE = 'finative'; +const DEFAULT_CUR = 'EUR'; +const ENDPOINT_URL = 'https://b.finative.cloud/cds/rtb/bid?format=openrtb2.5&ssp=pb'; +const NATIVE_ASSET_IDS = { + 0: 'title', + 1: 'body', + 2: 'sponsoredBy', + 3: 'image', + 4: 'cta', + 5: 'icon' +}; +const NATIVE_PARAMS = { + title: { + id: 0, + name: 'title' + }, + body: { + id: 1, + name: 'data', + type: 2 + }, + sponsoredBy: { + id: 2, + name: 'data', + type: 1 + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + cta: { + id: 4, + type: 12, + name: 'data' + }, + icon: { + id: 5, + type: 1, + name: 'img' + } +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: function (bid) { + return !!bid.params.adUnitId; + }, + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const pt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'params.pt') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.setOnAny)(validBidRequests, 'params.priceType') || 'net'; + const tid = bidderRequest.ortb2?.source?.tid; + const cur = [(0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CUR]; + let url = bidderRequest.refererInfo.referer; + const imp = validBidRequests.map((bid, id) => { + const assets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._map)(bid.nativeParams, (bidParams, key) => { + const props = NATIVE_PARAMS[key]; + const asset = { + required: bidParams.required & 1 + }; + if (props) { + asset.id = props.id; + let w, h; + if (bidParams.sizes) { + w = bidParams.sizes[0]; + h = bidParams.sizes[1]; + } + asset[props.name] = { + len: bidParams.len, + type: props.type, + w, + h + }; + return asset; + } + }).filter(Boolean); + if (bid.params.url) { + url = bid.params.url; + } + return { + id: String(id + 1), + tagid: bid.params.adUnitId, + // TODO: `tid` is not under `imp` in ORTB, is this intentional? + tid: tid, + pt: pt, + native: { + request: { + assets + } + } + }; + }); + const request = { + id: bidderRequest.bidderRequestId, + site: { + page: url + }, + device: { + ua: navigator.userAgent + }, + cur, + imp, + user: {}, + regs: { + ext: { + gdpr: 0, + pb_ver: "9.45.0-pre" + } + } + }; + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'regs.ext.gdpr', typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' && bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + return { + method: 'POST', + url: ENDPOINT_URL, + data: JSON.stringify(request), + options: { + contentType: 'application/json' + }, + bids: validBidRequests + }; + }, + interpretResponse: function (serverResponse, _ref) { + let { + bids + } = _ref; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(serverResponse.body)) { + return []; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidResponses = typeof seatbid != 'undefined' ? flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => { + result[bid.impid - 1] = bid; + return result; + }, []) : []; + return bids.map((bid, id) => { + const bidResponse = bidResponses[id]; + if (bidResponse) { + return { + requestId: bid.bidId, + cpm: bidResponse.price, + creativeId: bidResponse.crid, + ttl: 1000, + netRevenue: !bid.netRevenue || bid.netRevenue === 'net', + currency: cur, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, + native: parseNative(bidResponse), + meta: { + advertiserDomains: bidResponse.adomain && bidResponse.adomain.length > 0 ? bidResponse.adomain : [] + } + }; + } + }).filter(Boolean); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +function parseNative(bid) { + const { + assets, + link, + imptrackers + } = bid.adm.native; + let clickUrl = link.url.replace(/\$\{AUCTION_PRICE\}/g, bid.price); + if (link.clicktrackers) { + link.clicktrackers.forEach(function (clicktracker, index) { + link.clicktrackers[index] = clicktracker.replace(/\$\{AUCTION_PRICE\}/g, bid.price); + }); + } + if (imptrackers) { + imptrackers.forEach(function (imptracker, index) { + imptrackers[index] = imptracker.replace(/\$\{AUCTION_PRICE\}/g, bid.price); + }); + } + const result = { + url: clickUrl, + clickUrl: clickUrl, + clickTrackers: link.clicktrackers || undefined, + impressionTrackers: imptrackers || undefined + }; + assets.forEach(asset => { + const kind = NATIVE_ASSET_IDS[asset.id]; + const content = kind && asset[NATIVE_PARAMS[kind].name]; + if (content) { + result[kind] = content.text || content.value || { + url: content.url, + width: content.w, + height: content.h + }; + } + }); + return result; +} +function flatten(arr) { + return [].concat(...arr); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('finativeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/finativeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["fintezaAnalyticsAdapter"],{ + +/***/ "./modules/fintezaAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/fintezaAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + +const MODULE_CODE = 'finteza'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); +const ANALYTICS_TYPE = 'endpoint'; +const FINTEZA_HOST = 'https://content.mql5.com/tr'; +const BID_REQUEST_TRACK = 'Bid Request %BIDDER%'; +const BID_RESPONSE_PRICE_TRACK = 'Bid Response Price %BIDDER%'; +const BID_RESPONSE_TIME_TRACK = 'Bid Response Time %BIDDER%'; +const BID_TIMEOUT_TRACK = 'Bid Timeout %BIDDER%'; +const BID_WON_TRACK = 'Bid Won %BIDDER%'; +const FIRST_VISIT_DATE = '_fz_fvdt'; +const SESSION_ID = '_fz_ssn'; +const SESSION_DURATION = 30 * 60 * 1000; +const SESSION_RAND_PART = 9; +const TRACK_TIME_KEY = '_fz_tr'; +const UNIQ_ID_KEY = '_fz_uniq'; +function getPageInfo() { + const pageInfo = { + domain: window.location.hostname + }; + if (document.referrer) { + pageInfo.referrerDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(document.referrer).hostname; + } + return pageInfo; +} +function getUniqId() { + let isUniqFromLS; + let uniq = storage.getCookie(UNIQ_ID_KEY); + if (!uniq) { + try { + if (storage.hasLocalStorage()) { + uniq = storage.getDataFromLocalStorage(UNIQ_ID_KEY) || ''; + isUniqFromLS = true; + } + } catch (b) {} + } + if (uniq && isNaN(uniq)) { + uniq = null; + } + if (uniq && isUniqFromLS) { + let expires = new Date(); + expires.setFullYear(expires.getFullYear() + 10); + try { + storage.setCookie(UNIQ_ID_KEY, uniq, expires.toUTCString()); + } catch (e) {} + } + return uniq; +} +function initFirstVisit() { + let now; + let visitDate; + let cookies; + try { + // TODO: commented out because of rule violations + cookies = {}; // parseCookies(document.cookie); + } catch (a) { + cookies = {}; + } + visitDate = cookies[FIRST_VISIT_DATE]; + if (!visitDate) { + now = new Date(); + visitDate = parseInt(now.getTime() / 1000, 10); + now.setFullYear(now.getFullYear() + 20); + try { + storage.setCookie(FIRST_VISIT_DATE, visitDate, now.toUTCString()); + } catch (e) {} + } + return visitDate; +} +// TODO: commented out because of rule violations +/* +function trim(string) { + if (string.trim) { + return string.trim(); + } + return string.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); +} + +function parseCookies(cookie) { + let values = {}; + let arr, item; + let param, value; + let i, j; + + if (!cookie || !storage.cookiesAreEnabled()) { + return {}; + } + + arr = cookie.split(';'); + + for (i = 0, j = arr.length; i < j; i++) { + item = arr[ i ]; + if (!item) { + continue; + } + + param = item.split('='); + if (param.length <= 1) { + continue; + } + + value = decodeURIComponent(param[0]); + value = trim(value); + + values[value] = decodeURIComponent(param[1]); + } + + return values; +} +*/ + +function getRandAsStr(digits) { + let str = ''; + let rand = 0; + let i; + digits = digits || 4; + for (i = 0; i < digits; i++) { + rand = Math.random() * 10 >>> 0; + str += '' + rand; + } + return str; +} +function getSessionBegin(session) { + if (!session || typeof session !== 'string') { + return 0; + } + const len = session.length; + if (len && len <= SESSION_RAND_PART) { + return 0; + } + const timestamp = session.substring(0, len - SESSION_RAND_PART); + return parseInt(timestamp, 10); +} +function initSession() { + const now = new Date(); + const expires = new Date(now.getTime() + SESSION_DURATION); + const timestamp = Math.floor(now.getTime() / 1000); + let begin = 0; + let cookies; + let sessionId; + let sessionDuration; + let isNew = false; + try { + // TODO: commented out because of rule violations + cookies = {}; // parseCookies(document.cookie); + } catch (a) { + cookies = {}; + } + sessionId = cookies[SESSION_ID]; + if (!sessionId || !checkSessionByExpires() || !checkSessionByReferer() || !checkSessionByDay()) { + sessionId = '' + timestamp + getRandAsStr(SESSION_RAND_PART); // lgtm [js/insecure-randomness] + begin = timestamp; + isNew = true; + } else { + begin = getSessionBegin(sessionId); + } + if (begin > 0) { + sessionDuration = Math.floor(timestamp - begin); + } else { + sessionDuration = -1; + } + try { + storage.setCookie(SESSION_ID, sessionId, expires.toUTCString()); + } catch (e) {} + return { + isNew: isNew, + id: sessionId, + duration: sessionDuration + }; +} +function checkSessionByExpires() { + const timestamp = getTrackRequestLastTime(); + const now = new Date().getTime(); + if (now > timestamp + SESSION_DURATION) { + return false; + } + return true; +} +function checkSessionByReferer() { + const referrer = fntzAnalyticsAdapter.context.pageInfo.referrerDomain; + const domain = fntzAnalyticsAdapter.context.pageInfo.domain; + return referrer === '' || domain === referrer; +} +function checkSessionByDay() { + let last = getTrackRequestLastTime(); + if (last) { + last = new Date(last); + const now = new Date(); + return last.getUTCDate() === now.getUTCDate() && last.getUTCMonth() === now.getUTCMonth() && last.getUTCFullYear() === now.getUTCFullYear(); + } + return false; +} +function saveTrackRequestTime() { + const now = new Date().getTime(); + const expires = new Date(now + SESSION_DURATION); + try { + if (storage.hasLocalStorage()) { + storage.setDataInLocalStorage(TRACK_TIME_KEY, now.toString()); + } else { + storage.setCookie(TRACK_TIME_KEY, now.toString(), expires.toUTCString()); + } + } catch (a) {} +} +function getTrackRequestLastTime() { + let cookie; + try { + if (storage.hasLocalStorage()) { + return parseInt(storage.getDataFromLocalStorage(TRACK_TIME_KEY) || 0, 10); + } + + // TODO: commented out because of rule violations + cookie = {}; // parseCookies(document.cookie); + cookie = cookie[TRACK_TIME_KEY]; + if (cookie) { + return parseInt(cookie, 10); + } + } catch (e) {} + return 0; +} +function getAntiCacheParam() { + const date = new Date(); + const rand = Math.random() * 99999 + 1 >>> 0; + return [date.getTime(), rand].join(''); +} +function replaceBidder(str, bidder) { + let _str = str; + _str = _str.replace(/\%bidder\%/, bidder.toLowerCase()); + _str = _str.replace(/\%BIDDER\%/, bidder.toUpperCase()); + _str = _str.replace(/\%Bidder\%/, bidder.charAt(0).toUpperCase() + bidder.slice(1).toLowerCase()); + return _str; +} +function prepareBidRequestedParams(args) { + return [{ + event: encodeURIComponent(replaceBidder(fntzAnalyticsAdapter.context.bidRequestTrack, args.bidderCode)), + ref: encodeURIComponent(window.location.href) + }]; +} +function prepareBidResponseParams(args) { + return [{ + event: encodeURIComponent(replaceBidder(fntzAnalyticsAdapter.context.bidResponsePriceTrack, args.bidderCode)), + value: args.cpm, + unit: 'usd' + }, { + event: encodeURIComponent(replaceBidder(fntzAnalyticsAdapter.context.bidResponseTimeTrack, args.bidderCode)), + value: args.timeToRespond, + unit: 'ms' + }]; +} +function prepareBidWonParams(args) { + return [{ + event: encodeURIComponent(replaceBidder(fntzAnalyticsAdapter.context.bidWonTrack, args.bidderCode)), + value: args.cpm, + unit: 'usd' + }]; +} +function prepareBidTimeoutParams(args) { + return args.map(function (bid) { + return { + event: encodeURIComponent(replaceBidder(fntzAnalyticsAdapter.context.bidTimeoutTrack, bid.bidder)), + value: bid.timeout, + unit: 'ms' + }; + }); +} +function prepareTrackData(evtype, args) { + let prepareParams = null; + switch (evtype) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_REQUESTED: + prepareParams = prepareBidRequestedParams; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_RESPONSE: + prepareParams = prepareBidResponseParams; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_WON: + prepareParams = prepareBidWonParams; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT: + prepareParams = prepareBidTimeoutParams; + break; + } + if (!prepareParams) { + return null; + } + const data = prepareParams(args); + if (!data) { + return null; + } + const session = initSession(); + return data.map(d => { + const trackData = Object.assign(d, { + id: fntzAnalyticsAdapter.context.id, + ref: encodeURIComponent(window.location.href), + title: encodeURIComponent(document.title), + scr_res: fntzAnalyticsAdapter.context.screenResolution, + fv_date: fntzAnalyticsAdapter.context.firstVisit, + ac: getAntiCacheParam() + }); + if (fntzAnalyticsAdapter.context.uniqId) { + trackData.fz_uniq = fntzAnalyticsAdapter.context.uniqId; + } + if (session.id) { + trackData.ssn = session.id; + } + if (session.isNew) { + session.isNew = false; + trackData.ssn_start = 1; + } + trackData.ssn_dr = session.duration; + return trackData; + }); +} +function sendTrackRequest(trackData) { + try { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(fntzAnalyticsAdapter.context.host, null, trackData, { + method: 'GET', + withCredentials: true, + contentType: 'application/x-www-form-urlencoded' + }); + saveTrackRequestTime(); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Error on send data: ', err); + } +} +const fntzAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + FINTEZA_HOST, + ANALYTICS_TYPE +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (typeof args !== 'undefined') { + const trackData = prepareTrackData(eventType, args); + if (!trackData) { + return; + } + trackData.forEach(sendTrackRequest); + } + } +}); +fntzAnalyticsAdapter.originEnableAnalytics = fntzAnalyticsAdapter.enableAnalytics; +fntzAnalyticsAdapter.enableAnalytics = function (config) { + if (!config.options.id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Client ID (id) option is not defined. Analytics won\'t work'); + return; + } + fntzAnalyticsAdapter.context = { + host: config.options.host || FINTEZA_HOST, + id: config.options.id, + bidRequestTrack: config.options.bidRequestTrack || BID_REQUEST_TRACK, + bidResponsePriceTrack: config.options.bidResponsePriceTrack || BID_RESPONSE_PRICE_TRACK, + bidResponseTimeTrack: config.options.bidResponseTimeTrack || BID_RESPONSE_TIME_TRACK, + bidTimeoutTrack: config.options.bidTimeoutTrack || BID_TIMEOUT_TRACK, + bidWonTrack: config.options.bidWonTrack || BID_WON_TRACK, + firstVisit: initFirstVisit(), + screenResolution: `${window.screen.width}x${window.screen.height}`, + uniqId: getUniqId(), + pageInfo: getPageInfo() + }; + fntzAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: fntzAnalyticsAdapter, + code: MODULE_CODE +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (fntzAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('fintezaAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/fintezaAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["flippBidAdapter"],{ + +/***/ "./modules/flippBidAdapter.js": +/*!************************************!*\ + !*** ./modules/flippBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, getUserKey, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const NETWORK_ID = 10922; +const AD_TYPES = [4309, 641]; +const DTX_TYPES = [5061]; +const TARGET_NAME = 'inline'; +const BIDDER_CODE = 'flipp'; +const ENDPOINT = 'https://gateflipp.flippback.com/flyer-locator-service/client_bidding'; +const DEFAULT_TTL = 30; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_CREATIVE_TYPE = 'NativeX'; +const VALID_CREATIVE_TYPES = ['DTX', 'NativeX']; +const FLIPP_USER_KEY = 'flipp-uid'; +const COMPACT_DEFAULT_HEIGHT = 600; +const STANDARD_DEFAULT_HEIGHT = 1800; +let userKey = null; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function getUserKey() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (userKey) { + return userKey; + } + + // If the partner provides the user key use it, otherwise fallback to cookies + if ('userKey' in options && options.userKey) { + if (isValidUserKey(options.userKey)) { + userKey = options.userKey; + return options.userKey; + } + } + + // Grab from Cookie + const foundUserKey = storage.cookiesAreEnabled(null) && storage.getCookie(FLIPP_USER_KEY, null); + if (foundUserKey && isValidUserKey(foundUserKey)) { + return foundUserKey; + } + + // Generate if none found + userKey = generateUUID(); + + // Set cookie + if (storage.cookiesAreEnabled()) { + storage.setCookie(FLIPP_USER_KEY, userKey); + } + return userKey; +} +function isValidUserKey(userKey) { + return typeof userKey === 'string' && !userKey.startsWith('#') && userKey.length > 0; +} +const generateUUID = () => { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); +}; + +/** + * Determines if a creativeType is valid + * + * @param {string} creativeType The Creative Type to validate. + * @return string creativeType if this is a valid Creative Type, and 'NativeX' otherwise. + */ +const validateCreativeType = creativeType => { + if (creativeType && VALID_CREATIVE_TYPES.includes(creativeType)) { + return creativeType; + } else { + return DEFAULT_CREATIVE_TYPE; + } +}; +const getAdTypes = creativeType => { + if (creativeType === 'DTX') { + return DTX_TYPES; + } + return AD_TYPES; +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.siteId && !!bid.params.publisherNameIdentifier; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const urlParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(bidderRequest.refererInfo.page).search; + const contentCode = urlParams['flipp-content-code']; + const userKey = getUserKey(validBidRequests[0]?.params); + const placements = validBidRequests.map((bid, index) => { + const options = bid.params.options || {}; + if (!options.hasOwnProperty('startCompact')) { + options.startCompact = true; + } + return { + divName: TARGET_NAME, + networkId: NETWORK_ID, + siteId: bid.params.siteId, + adTypes: getAdTypes(bid.params.creativeType), + count: 1, + ...(!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(bid.params.zoneIds) && { + zoneIds: bid.params.zoneIds + }), + properties: { + ...(!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(contentCode) && { + contentCode: contentCode.slice(0, 32) + }) + }, + options, + prebid: { + requestId: bid.bidId, + publisherNameIdentifier: bid.params.publisherNameIdentifier, + height: bid.mediaTypes.banner.sizes[index][0], + width: bid.mediaTypes.banner.sizes[index][1], + creativeType: validateCreativeType(bid.params.creativeType) + } + }; + }); + return { + method: 'POST', + url: ENDPOINT, + data: { + placements, + url: bidderRequest.refererInfo.page, + user: { + key: userKey + } + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest A bid request object + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse?.body) return []; + const placements = bidRequest.data.placements; + const res = serverResponse.body; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(res) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(res.decisions) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(res.decisions.inline)) { + return res.decisions.inline.map(decision => { + const placement = placements.find(p => p.prebid.requestId === decision.prebid?.requestId); + const customData = decision.contents[0]?.data?.customData; + const height = placement.options?.startCompact ? customData?.compactHeight ?? COMPACT_DEFAULT_HEIGHT : customData?.standardHeight ?? STANDARD_DEFAULT_HEIGHT; + return { + bidderCode: BIDDER_CODE, + requestId: decision.prebid?.requestId, + cpm: decision.prebid?.cpm, + width: decision.width, + height, + creativeId: decision.adId, + currency: DEFAULT_CURRENCY, + netRevenue: true, + ttl: DEFAULT_TTL, + ad: decision.prebid?.creative + }; + }); + } + return []; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: (syncOptions, serverResponses) => [] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('flippBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/flippBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["fluctBidAdapter"],{ + +/***/ "./modules/fluctBidAdapter.js": +/*!************************************!*\ + !*** ./modules/fluctBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'fluct'; +const END_POINT = 'https://hb.adingo.jp/prebid'; +const VERSION = '1.2'; +const NET_REVENUE = true; +const TTL = 300; +const spec = { + code: BIDDER_CODE, + aliases: ['adingo'], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + return !!(bid.params.groupId && bid.params.tagId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids. + * @param {BidderRequest} bidderRequest bidder request object. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + const serverRequests = []; + const page = bidderRequest.refererInfo.page; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(validBidRequests, request => { + const impExt = request.ortb2Imp?.ext; + const data = {}; + data.page = page; + data.adUnitCode = request.adUnitCode; + data.bidId = request.bidId; + data.user = { + data: bidderRequest.ortb2?.user?.data ?? [], + eids: [...(request.userIdAsEids ?? []), ...(bidderRequest.ortb2?.user?.ext?.eids ?? [])] + }; + if (impExt) { + data.transactionId = impExt.tid; + data.gpid = impExt.gpid ?? impExt.data?.pbadslot ?? impExt.data?.adserver?.adslot; + } + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(data, 'regs.gdpr', { + consent: bidderRequest.gdprConsent.consentString, + gdprApplies: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 + }); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(data, 'regs.us_privacy', { + consent: bidderRequest.uspConsent + }); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(data, 'regs.coppa', 1); + } + if (bidderRequest.gppConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(data, 'regs.gpp', { + string: bidderRequest.gppConsent.gppString, + sid: bidderRequest.gppConsent.applicableSections + }); + } else if (bidderRequest.ortb2?.regs?.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(data, 'regs.gpp', { + string: bidderRequest.ortb2.regs.gpp, + sid: bidderRequest.ortb2.regs.gpp_sid + }); + } + data.sizes = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(request.sizes, size => { + data.sizes.push({ + w: size[0], + h: size[1] + }); + }); + data.params = request.params; + if (request.schain) { + data.schain = request.schain; + } + const searchParams = new URLSearchParams({ + dfpUnitCode: request.params.dfpUnitCode, + tagId: request.params.tagId, + groupId: request.params.groupId + }); + serverRequests.push({ + method: 'POST', + url: END_POINT + '?' + searchParams.toString(), + options: { + contentType: 'application/json', + withCredentials: true, + customHeaders: { + 'x-fluct-app': 'prebid/fluctBidAdapter', + 'x-fluct-version': VERSION, + 'x-openrtb-version': 2.5 + } + }, + data: data + }); + }); + return serverRequests; + }, + /* + * Unpack the respnse from the server into a list of bids. + * + * @param {serverResponse} serverResponse A successful response from the server. + * @return {bid[]} An array of bids which weer nested inside the server. + */ + interpretResponse: (serverResponse, serverRequest) => { + const bidResponses = []; + const res = serverResponse.body; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(res) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(res.seatbid) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(res.seatbid[0].bid)) { + const bid = res.seatbid[0].bid[0]; + const dealId = bid.dealid; + const beaconUrl = bid.burl; + const callImpBeacon = ``; + let data = { + requestId: res.id, + currency: res.cur, + cpm: parseFloat(bid.price) || 0, + netRevenue: NET_REVENUE, + width: bid.w, + height: bid.h, + creativeId: bid.crid, + ttl: TTL, + ad: bid.adm + callImpBeacon, + meta: { + advertiserDomains: bid.adomain || [] + } + }; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(dealId)) { + data.dealId = dealId; + } + bidResponses.push(data); + } + return bidResponses; + }, + /* + * Register the user sync pixels which should be dropped after the auction. + * + * @params {syncOptions} syncOptions which user syncs are allowed? + * @params {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + * + */ + getUserSyncs: (syncOptions, serverResponses) => { + // gdpr, us_privacy, and coppa params to be handled on the server end. + const usersyncs = serverResponses.reduce((acc, serverResponse) => [...acc, ...(serverResponse.body.usersyncs ?? [])], []); + const syncs = usersyncs.filter(sync => sync['type'] === 'image' && syncOptions.pixelEnabled || sync['type'] === 'iframe' && syncOptions.iframeEnabled).map(sync => ({ + type: sync.type, + url: sync.url + })); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('fluctBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/fluctBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["fpdModule"],{ + +/***/ "./modules/fpdModule/index.js": +/*!************************************!*\ + !*** ./modules/fpdModule/index.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports registerSubmodules, reset, processFpd, startAuctionHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); + +/** + * This module sets default values and validates ortb2 first part data + * @module modules/firstPartyData + */ + + + + + +let submodules = []; +function registerSubmodules(submodule) { + submodules.push(submodule); +} +function reset() { + submodules.length = 0; +} +function processFpd() { + let { + global = {}, + bidder = {} + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let modConf = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('firstPartyData') || {}; + let result = _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.PbPromise.resolve({ + global, + bidder + }); + submodules.sort((a, b) => { + return (a.queue || 1) - (b.queue || 1); + }).forEach(submodule => { + result = result.then(_ref => { + let { + global, + bidder + } = _ref; + return _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_1__.PbPromise.resolve(submodule.processFpd(modConf, { + global, + bidder + })).catch(err => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Error in FPD module ${submodule.name}`, err); + return {}; + }).then(result => ({ + global: result.global || global, + bidder: result.bidder || bidder + })); + }); + }); + return result; +} +const startAuctionHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__.timedAuctionHook)('fpd', function startAuctionHook(fn, req) { + processFpd(req.ortb2Fragments).then(ortb2Fragments => { + Object.assign(req.ortb2Fragments, ortb2Fragments); + fn.call(this, req); + }); +}); +function setupHook() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.getHook)('startAuction').before(startAuctionHook, 10); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.module)('firstPartyData', registerSubmodules); + +// Runs setupHook on initial load +setupHook(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('fpdModule'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/fpdModule/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["freeWheelAdserverVideo"],{ + +/***/ "./modules/freeWheelAdserverVideo.js": +/*!*******************************************!*\ + !*** ./modules/freeWheelAdserverVideo.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports adpodUtils, notifyTranslationModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adServerManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adServerManager.js */ "./src/adServerManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds Freewheel support for Video to Prebid. + */ + + + +const adpodUtils = {}; +function notifyTranslationModule(fn) { + fn.call(this, 'freewheel'); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('registerAdserver').before(notifyTranslationModule); +(0,_src_adServerManager_js__WEBPACK_IMPORTED_MODULE_1__.registerVideoSupport)('freewheel', { + getTargeting: args => adpodUtils.getTargeting(args) +}); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.submodule)('adpod', adpodUtils); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('freeWheelAdserverVideo'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/freeWheelAdserverVideo.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["freepassBidAdapter"],{ + +/***/ "./modules/freepassBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/freepassBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + +const BIDDER_SERVICE_URL = 'https://bidding-dsp.ad-m.asia/dsp/api/bid/s/s/freepass'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + } +}); +function prepareUserInfo(user, freepassId) { + let userInfo = user || {}; + let extendedUserInfo = userInfo.ext || {}; + if (freepassId.userId) { + userInfo.id = freepassId.userId; + } + if (freepassId.commonId) { + extendedUserInfo.fuid = freepassId.commonId; + } + userInfo.ext = extendedUserInfo; + return userInfo; +} +function prepareDeviceInfo(device, freepassId) { + let deviceInfo = device || {}; + let extendedDeviceInfo = deviceInfo.ext || {}; + extendedDeviceInfo.is_accurate_ip = 0; + if (freepassId.userIp) { + deviceInfo.ip = freepassId.userIp; + extendedDeviceInfo.is_accurate_ip = 1; + } + deviceInfo.ext = extendedDeviceInfo; + return deviceInfo; +} +const spec = { + code: 'freepass', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + isBidRequestValid(bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Validating bid: ', bid); + return !(!bid.adUnitCode || !bid.params || !bid.params.publisherId); + }, + buildRequests(validBidRequests, bidderRequest) { + if (validBidRequests.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter has no valid bid requests'); + return []; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter is preparing bid request: ', validBidRequests); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter is using bidder request: ', bidderRequest); + const data = converter.toORTB({ + bidderRequest: bidderRequest, + bidRequests: validBidRequests, + context: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter interpreted ORTB bid request as ', data); + + // Only freepassId is supported + let freepassId = validBidRequests[0].userId && validBidRequests[0].userId.freepassId || {}; + data.user = prepareUserInfo(data.user, freepassId); + data.device = prepareDeviceInfo(data.device, freepassId); + + // set site.page & site.publisher + data.site = data.site || {}; + data.site.publisher = data.site.publisher || {}; + // set site.publisher.id. from params.publisherId required + data.site.publisher.id = validBidRequests[0].params.publisherId; + // set site.publisher.domain from params.publisherUrl. optional + data.site.publisher.domain = validBidRequests[0].params?.publisherUrl; + + // set source + data.source = data.source || {}; + data.source.fd = 0; + data.source.tid = validBidRequests.ortb2?.source?.tid; + data.source.pchain = ''; + + // set imp.ext + validBidRequests.forEach((bidRequest, index) => { + data.imp[index].tagId = bidRequest.adUnitCode; + }); + data.test = validBidRequests[0].test || 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter augmented ORTB bid request user: ', data.user); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter augmented ORTB bid request device: ', data.device); + return { + method: 'POST', + url: BIDDER_SERVICE_URL, + data, + options: { + withCredentials: false + } + }; + }, + interpretResponse(serverResponse, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter is interpreting server response: ', serverResponse); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter is using bid request: ', bidRequest); + const bids = converter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('FreePass BidAdapter interpreted ORTB bids as ', bids); + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('freepassBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/freepassBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["freepassIdSystem"],{ + +/***/ "./modules/freepassIdSystem.js": +/*!*************************************!*\ + !*** ./modules/freepassIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports FREEPASS_COOKIE_KEY, storage, freepassIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + +const MODULE_NAME = 'freepassId'; +const FREEPASS_COOKIE_KEY = '_f_UF8cCRlr'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getCoreStorageManager)(MODULE_NAME); +const freepassIdSubmodule = { + name: MODULE_NAME, + decode: function (value, config) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Decoding FreePass ID: ', value); + return { + [MODULE_NAME]: value + }; + }, + getId: function (config, consent, cachedIdObject) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Getting FreePass ID using config: ' + JSON.stringify(config)); + const freepassData = config.params !== undefined ? config.params.freepassData || {} : {}; + const idObject = {}; + const userId = storage.getCookie(FREEPASS_COOKIE_KEY); + if (userId !== null) { + idObject.userId = userId; + } + if (freepassData.commonId !== undefined) { + idObject.commonId = config.params.freepassData.commonId; + } + if (freepassData.userIp !== undefined) { + idObject.userIp = config.params.freepassData.userIp; + } + return { + id: idObject + }; + }, + extendId: function (config, consent, cachedIdObject) { + const freepassData = config.params.freepassData; + const hasFreepassData = freepassData !== undefined; + if (!hasFreepassData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('No Freepass Data. CachedIdObject will not be extended: ' + JSON.stringify(cachedIdObject)); + return { + id: cachedIdObject + }; + } + const currentCookieId = storage.getCookie(FREEPASS_COOKIE_KEY); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Extending FreePass ID object: ' + JSON.stringify(cachedIdObject)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Extending FreePass ID using config: ' + JSON.stringify(config)); + return { + id: { + commonId: freepassData.commonId, + userIp: freepassData.userIp, + userId: currentCookieId + } + }; + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', freepassIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('freepassIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/freepassIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["freewheel-sspBidAdapter"],{ + +/***/ "./modules/freewheel-sspBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/freewheel-sspBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'freewheel-ssp'; +const GVL_ID = 285; +const PROTOCOL = getProtocol(); +const FREEWHEEL_ADSSETUP = PROTOCOL + '://ads.stickyadstv.com/www/delivery/swfIndex.php'; +const MUSTANG_URL = PROTOCOL + '://cdn.stickyadstv.com/mustang/mustang.min.js'; +const PRIMETIME_URL = PROTOCOL + '://cdn.stickyadstv.com/prime-time/'; +const USER_SYNC_URL = PROTOCOL + '://ads.stickyadstv.com/auto-user-sync'; +function getProtocol() { + return 'https'; +} +function isValidUrl(str) { + if (!str) { + return false; + } + + // regExp for url validation + var pattern = /^(https?|ftp|file):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/; + return pattern.test(str); +} +function getBiggerSize(array) { + var result = [0, 0]; + for (var i = 0; i < array.length; i++) { + if (array[i][0] * array[i][1] > result[0] * result[1]) { + result = array[i]; + } + } + return result; +} +function getBiggerSizeWithLimit(array, minSizeLimit, maxSizeLimit) { + var minSize = minSizeLimit || [0, 0]; + var maxSize = maxSizeLimit || [Number.MAX_VALUE, Number.MAX_VALUE]; + var candidates = []; + for (var i = 0; i < array.length; i++) { + if (array[i][0] * array[i][1] >= minSize[0] * minSize[1] && array[i][0] * array[i][1] <= maxSize[0] * maxSize[1]) { + candidates.push(array[i]); + } + } + return getBiggerSize(candidates); +} + +/* +* read the pricing extension with this format: 1.0000 +* @return {object} pricing data in format: {currency: "EUR", price:"1.000"} +*/ +function getPricing(xmlNode) { + var pricingExtNode; + var princingData = {}; + var extensions = xmlNode.querySelectorAll('Extension'); + // Nodelist.forEach is not supported in IE and Edge + // Workaround given here https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10638731/ + Array.prototype.forEach.call(extensions, function (node) { + if (node.getAttribute('type') === 'StickyPricing') { + pricingExtNode = node; + } + }); + if (pricingExtNode) { + var priceNode = pricingExtNode.querySelector('Price'); + princingData = { + currency: priceNode.getAttribute('currency'), + price: priceNode.textContent + }; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('PREBID - ' + BIDDER_CODE + ': No bid received or missing pricing extension.'); + } + return princingData; +} + +/* +* Read the StickyBrand extension with this format: +* +* +* +* +* +* +* @return {object} pricing data in format: {currency: "EUR", price:"1.000"} +*/ +function getAdvertiserDomain(xmlNode) { + var domain = []; + var brandExtNode; + var extensions = xmlNode.querySelectorAll('Extension'); + // Nodelist.forEach is not supported in IE and Edge + // Workaround given here https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10638731/ + Array.prototype.forEach.call(extensions, function (node) { + if (node.getAttribute('type') === 'StickyBrand') { + brandExtNode = node; + } + }); + + // Currently we only return one Domain + if (brandExtNode) { + var domainNode = brandExtNode.querySelector('Domain'); + domain.push(domainNode.textContent); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('PREBID - ' + BIDDER_CODE + ': No bid received or missing StickyBrand extension.'); + } + return domain; +} +function hashcode(inputString) { + var hash = 0; + var char; + if (inputString.length == 0) return hash; + for (var i = 0; i < inputString.length; i++) { + char = inputString.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; // Convert to 32bit integer + } + return hash; +} +function getCreativeId(xmlNode) { + var creaId = ''; + var adNodes = xmlNode.querySelectorAll('Ad'); + // Nodelist.forEach is not supported in IE and Edge + // Workaround given here https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10638731/ + Array.prototype.forEach.call(adNodes, function (el) { + creaId += '[' + el.getAttribute('id') + ']'; + }); + return creaId; +} +function getValueFromKeyInImpressionNode(xmlNode, key) { + var value = ''; + var impNodes = xmlNode.querySelectorAll('Impression'); // Nodelist.forEach is not supported in IE and Edge + var isRootViewKeyPresent = false; + var isAdsDisplayStartedPresent = false; + Array.prototype.forEach.call(impNodes, function (el) { + if (isRootViewKeyPresent && isAdsDisplayStartedPresent) { + return value; + } + isRootViewKeyPresent = false; + isAdsDisplayStartedPresent = false; + var text = el.textContent; + var queries = text.substring(el.textContent.indexOf('?') + 1).split('&'); + var tempValue = ''; + Array.prototype.forEach.call(queries, function (item) { + var split = item.split('='); + if (split[0] == key) { + tempValue = split[1]; + } + if (split[0] == 'reqType' && split[1] == 'AdsDisplayStarted') { + isAdsDisplayStartedPresent = true; + } + if (split[0] == 'rootViewKey') { + isRootViewKeyPresent = true; + } + }); + if (isAdsDisplayStartedPresent) { + value = tempValue; + } + }); + return value; +} +function getDealId(xmlNode) { + return getValueFromKeyInImpressionNode(xmlNode, 'dealId'); +} +function getBannerId(xmlNode) { + return getValueFromKeyInImpressionNode(xmlNode, 'adId'); +} +function getCampaignId(xmlNode) { + return getValueFromKeyInImpressionNode(xmlNode, 'campaignId'); +} + +/** + * returns the top most accessible window + */ +function getTopMostWindow() { + var res = window; + try { + while (top !== res) { + if (res.parent.location.href.length) { + res = res.parent; + } + } + } catch (e) {} + return res; +} +function getComponentId(inputFormat) { + var component = 'mustang'; // default component id + + if (inputFormat && inputFormat !== 'inbanner') { + // format identifiers are equals to their component ids. + component = inputFormat; + } + return component; +} +function getAPIName(componentId) { + componentId = componentId || ''; + + // remove dash in componentId to get API name + return componentId.replace('-', ''); +} +function getBidFloor(bid, config) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.bidfloor', 0); + } + try { + const bidFloor = bid.getFloor({ + currency: getFloorCurrency(config), + mediaType: typeof bid.mediaTypes['banner'] == 'object' ? 'banner' : 'video', + size: '*' + }); + return bidFloor?.floor; + } catch (e) { + return -1; + } +} +function getFloorCurrency(config) { + return config.getConfig('floors.data.currency') != null ? config.getConfig('floors.data.currency') : 'USD'; +} +function formatAdHTML(bid, size) { + var integrationType = bid.params.format; + var divHtml = '
'; + var script = ''; + var libUrl = ''; + if (integrationType && integrationType !== 'inbanner') { + libUrl = PRIMETIME_URL + getComponentId(bid.params.format) + '.min.js'; + script = getOutstreamScript(bid); + } else { + libUrl = MUSTANG_URL; + script = getInBannerScript(bid, size); + } + return divHtml + ''; +} +var getInBannerScript = function (bid, size) { + return 'var config = {' + ' preloadedVast:vast,' + ' autoPlay:true' + ' };' + ' var ad = new window.com.stickyadstv.vpaid.Ad(document.getElementById("freewheelssp_prebid_target"),config);' + ' (new window.com.stickyadstv.tools.ASLoader(' + bid.params.zoneId + ', \'' + getComponentId(bid.params.format) + '\')).registerEvents(ad);' + ' ad.initAd(' + size[0] + ',' + size[1] + ',"",0,"","");'; +}; +var getOutstreamScript = function (bid) { + var config = bid.params; + + // default placement if no placement is set + if (!config.hasOwnProperty('domId') && !config.hasOwnProperty('auto') && !config.hasOwnProperty('p') && !config.hasOwnProperty('article')) { + if (config.format === 'intext-roll') { + config.iframeMode = 'dfp'; + } else { + config.domId = 'freewheelssp_prebid_target'; + } + } + var script = 'var config = {' + ' preloadedVast:vast,' + ' ASLoader:new window.com.stickyadstv.tools.ASLoader(' + bid.params.zoneId + ', \'' + getComponentId(bid.params.format) + '\')'; + for (var key in config) { + // dont' send format parameter + // neither zone nor vastUrlParams value as Vast is already loaded + if (config.hasOwnProperty(key) && key !== 'format' && key !== 'zone' && key !== 'zoneId' && key !== 'vastUrlParams') { + script += ',' + key + ':"' + config[key] + '"'; + } + } + script += '};' + 'window.com.stickyadstv.' + getAPIName(bid.params.format) + '.start(config);'; + return script; +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + aliases: ['stickyadstv', 'freewheelssp'], + // aliases for freewheel-ssp + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.zoneId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + // var currency = config.getConfig(currency); + + let buildRequest = (currentBidRequest, bidderRequest) => { + var zone = currentBidRequest.params.zoneId; + var timeInMillis = new Date().getTime(); + var keyCode = hashcode(zone + '' + timeInMillis); + var bidfloor = getBidFloor(currentBidRequest, _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config); + var format = currentBidRequest.params.format; + var requestParams = { + reqType: 'AdsSetup', + protocolVersion: '4.2', + zoneId: zone, + componentId: 'prebid', + componentSubId: getComponentId(currentBidRequest.params.format), + timestamp: timeInMillis, + _fw_bidfloor: bidfloor > 0 ? bidfloor : 0, + _fw_bidfloorcur: bidfloor > 0 ? getFloorCurrency(_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config) : '', + pbjs_version: "9.45.0-pre", + pKey: keyCode + }; + + // Add GDPR flag and consent string + if (bidderRequest && bidderRequest.gdprConsent) { + requestParams._fw_gdpr_consent = bidderRequest.gdprConsent.consentString; + if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { + requestParams._fw_gdpr = bidderRequest.gdprConsent.gdprApplies; + } + } + if (currentBidRequest.params.gdpr_consented_providers) { + requestParams._fw_gdpr_consented_providers = currentBidRequest.params.gdpr_consented_providers; + } + + // Add CCPA consent string + if (bidderRequest && bidderRequest.uspConsent) { + requestParams._fw_us_privacy = bidderRequest.uspConsent; + } + + // Add GPP consent + if (bidderRequest && bidderRequest.gppConsent) { + requestParams.gpp = bidderRequest.gppConsent.gppString; + requestParams.gpp_sid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.regs && bidderRequest.ortb2.regs.gpp) { + requestParams.gpp = bidderRequest.ortb2.regs.gpp; + requestParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + + // Add content object + if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.site && bidderRequest.ortb2.site.content && typeof bidderRequest.ortb2.site.content === 'object') { + try { + requestParams._fw_prebid_content = JSON.stringify(bidderRequest.ortb2.site.content); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('PREBID - ' + BIDDER_CODE + ': Unable to stringify the content object: ' + error); + } + } + + // Add schain object + var schain = currentBidRequest.schain; + if (schain) { + try { + requestParams.schain = JSON.stringify(schain); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('PREBID - ' + BIDDER_CODE + ': Unable to stringify the schain: ' + error); + } + } + if (currentBidRequest.userIdAsEids && currentBidRequest.userIdAsEids.length > 0) { + try { + requestParams._fw_prebid_3p_UID = JSON.stringify(currentBidRequest.userIdAsEids); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('PREBID - ' + BIDDER_CODE + ': Unable to stringify the userIdAsEids: ' + error); + } + } + var vastParams = currentBidRequest.params.vastUrlParams; + if (typeof vastParams === 'object') { + for (var key in vastParams) { + if (vastParams.hasOwnProperty(key)) { + requestParams[key] = vastParams[key]; + } + } + } + var location = bidderRequest?.refererInfo?.page; + if (isValidUrl(location)) { + requestParams.loc = location; + } + var playerSize = []; + if (currentBidRequest.mediaTypes.video && currentBidRequest.mediaTypes.video.playerSize) { + // If mediaTypes is video, get size from mediaTypes.video.playerSize per http://prebid.org/blog/pbjs-3 + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(currentBidRequest.mediaTypes.video.playerSize[0])) { + playerSize = currentBidRequest.mediaTypes.video.playerSize[0]; + } else { + playerSize = currentBidRequest.mediaTypes.video.playerSize; + } + } else if (currentBidRequest.mediaTypes.banner.sizes) { + // If mediaTypes is banner, get size from mediaTypes.banner.sizes per http://prebid.org/blog/pbjs-3 + playerSize = getBiggerSizeWithLimit(currentBidRequest.mediaTypes.banner.sizes, currentBidRequest.mediaTypes.banner.minSizeLimit, currentBidRequest.mediaTypes.banner.maxSizeLimit); + } else { + // Backward compatible code, in case size still pass by sizes in bid request + playerSize = getBiggerSize(currentBidRequest.sizes); + } + if (playerSize[0] > 0 || playerSize[1] > 0) { + requestParams.playerSize = playerSize[0] + 'x' + playerSize[1]; + } + + // Add video context and placement in requestParams + if (currentBidRequest.mediaTypes.video) { + var videoContext = currentBidRequest.mediaTypes.video.context ? currentBidRequest.mediaTypes.video.context : ''; + var videoPlacement = currentBidRequest.mediaTypes.video.placement ? currentBidRequest.mediaTypes.video.placement : null; + var videoPlcmt = currentBidRequest.mediaTypes.video.plcmt ? currentBidRequest.mediaTypes.video.plcmt : null; + if (format == 'inbanner') { + videoPlacement = 2; + videoContext = 'In-Banner'; + } + requestParams.video_context = videoContext; + requestParams.video_placement = videoPlacement; + requestParams.video_plcmt = videoPlcmt; + } + return { + method: 'GET', + url: FREEWHEEL_ADSSETUP, + data: requestParams, + bidRequest: currentBidRequest + }; + }; + return bidRequests.map(function (currentBidRequest) { + return buildRequest(currentBidRequest, bidderRequest); + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {object} request the built request object containing the initial bidRequest. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + var bidrequest = request.bidRequest; + var playerSize = []; + if (bidrequest.mediaTypes.video && bidrequest.mediaTypes.video.playerSize) { + // If mediaTypes is video, get size from mediaTypes.video.playerSize per http://prebid.org/blog/pbjs-3 + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bidrequest.mediaTypes.video.playerSize[0])) { + playerSize = bidrequest.mediaTypes.video.playerSize[0]; + } else { + playerSize = bidrequest.mediaTypes.video.playerSize; + } + } else if (bidrequest.mediaTypes.banner.sizes) { + // If mediaTypes is banner, get size from mediaTypes.banner.sizes per http://prebid.org/blog/pbjs-3 + playerSize = getBiggerSizeWithLimit(bidrequest.mediaTypes.banner.sizes, bidrequest.mediaTypes.banner.minSizeLimit, bidrequest.mediaTypes.banner.maxSizeLimit); + } else { + // Backward compatible code, in case size still pass by sizes in bid request + playerSize = getBiggerSize(bidrequest.sizes); + } + if (typeof serverResponse == 'object' && typeof serverResponse.body == 'string') { + serverResponse = serverResponse.body; + } + var xmlDoc; + try { + var parser = new DOMParser(); + xmlDoc = parser.parseFromString(serverResponse, 'application/xml'); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Prebid.js - ' + BIDDER_CODE + ' : ' + err); + return; + } + const princingData = getPricing(xmlDoc); + const creativeId = getCreativeId(xmlDoc); + const dealId = getDealId(xmlDoc); + const campaignId = getCampaignId(xmlDoc); + const bannerId = getBannerId(xmlDoc); + const topWin = getTopMostWindow(); + const advertiserDomains = getAdvertiserDomain(xmlDoc); + if (!topWin.freewheelssp_cache) { + topWin.freewheelssp_cache = {}; + } + topWin.freewheelssp_cache[bidrequest.adUnitCode] = serverResponse; + const bidResponses = []; + if (princingData.price) { + const bidResponse = { + requestId: bidrequest.bidId, + cpm: princingData.price, + width: playerSize[0], + height: playerSize[1], + creativeId: creativeId, + currency: princingData.currency, + netRevenue: true, + ttl: 360, + meta: { + advertiserDomains: advertiserDomains + }, + dealId: dealId, + campaignId: campaignId, + bannerId: bannerId + }; + if (bidrequest.mediaTypes.video) { + bidResponse.mediaType = 'video'; + } + bidResponse.vastXml = serverResponse; + bidResponse.ad = formatAdHTML(bidrequest, playerSize); + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, usPrivacy, gppConsent) { + const params = {}; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params.gdpr = Number(gdprConsent.gdprApplies); + params.gdpr_consent = gdprConsent.consentString; + } else { + params.gdpr_consent = gdprConsent.consentString; + } + } + if (gppConsent) { + if (typeof gppConsent.gppString === 'string') { + params.gpp = gppConsent.gppString; + } + if (gppConsent.applicableSections) { + params.gpp_sid = gppConsent.applicableSections; + } + } + var queryString = ''; + if (params) { + queryString = '?' + `${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)(params)}`; + } + const syncs = []; + if (syncOptions && syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: USER_SYNC_URL + queryString + }); + } else if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: USER_SYNC_URL + queryString + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('freewheel-sspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/freewheel-sspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ftrackIdSystem"],{ + +/***/ "./modules/ftrackIdSystem.js": +/*!***********************************!*\ + !*** ./modules/ftrackIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export ftrackIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds ftrack to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/ftrack + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'ftrackId'; +const LOG_PREFIX = 'FTRACK - '; +const LOCAL_STORAGE_EXP_DAYS = 30; +const LOCAL_STORAGE = 'html5'; +const FTRACK_STORAGE_NAME = 'ftrackId'; +const FTRACK_PRIVACY_STORAGE_NAME = `${FTRACK_STORAGE_NAME}_privacy`; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +let consentInfo = { + gdpr: { + applies: 0, + consentString: null, + pd: null + }, + usPrivacy: { + value: null + } +}; + +/** @type {Submodule} */ +const ftrackIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: `ftrack`, + /** + * Decodes the 'value' + * @function decode (required method) + * @param {(Object|string)} value + * @param {SubmoduleConfig|undefined} config + * @returns {(Object|undefined)} an object with the key being ideally camel case + * similar to the module name and ending in id or Id + */ + decode(value, config) { + if (!value) { + return; + } + ; + const DECODE_RESPONSE = { + ftrackId: { + uid: '', + ext: {} + } + }; + + // Loop over the value's properties: + // -- if string, assign value as is. + // -- if array, convert to string then assign value. + // -- If neither type, assign value as empty string + for (var key in value) { + let keyValue = value[key]; + if (Array.isArray(keyValue)) { + keyValue = keyValue.join('|'); + } else if (typeof value[key] !== 'string') { + // Unexpected value type, should be string or array + keyValue = ''; + } + DECODE_RESPONSE.ftrackId.ext[key] = keyValue; + } + + // If we have DeviceId value, assign it to the uid property + if (DECODE_RESPONSE.ftrackId.ext.hasOwnProperty('DeviceID')) { + DECODE_RESPONSE.ftrackId.uid = DECODE_RESPONSE.ftrackId.ext.DeviceID; + } + return DECODE_RESPONSE; + }, + /** + * performs action(s) to obtain ids from D9 and return the Device IDs + * should be the only method that gets a new ID (from ajax calls or a cookie/local storage) + * @function getId (required method) + * @param {SubmoduleConfig} config + * @param {ConsentData} consentData + * @param {(Object|undefined)} cacheIdObj + * @returns {IdResponse|undefined} A response object that contains id and/or callback. + */ + getId(config, consentData, cacheIdObj) { + if (this.isConfigOk(config) === false || this.isThereConsent(consentData) === false) return undefined; + return { + callback: function (cb) { + window.D9v = { + UserID: '99999999999999', + CampID: '3175', + CCampID: '148556' + }; + window.D9r = { + callback: function (response) { + if (response) { + storage.setDataInLocalStorage(`${FTRACK_STORAGE_NAME}_exp`, new Date(Date.now() + 1000 * 60 * 60 * 24 * LOCAL_STORAGE_EXP_DAYS).toUTCString()); + storage.setDataInLocalStorage(`${FTRACK_STORAGE_NAME}`, JSON.stringify(response)); + storage.setDataInLocalStorage(`${FTRACK_PRIVACY_STORAGE_NAME}_exp`, new Date(Date.now() + 1000 * 60 * 60 * 24 * LOCAL_STORAGE_EXP_DAYS).toUTCString()); + storage.setDataInLocalStorage(`${FTRACK_PRIVACY_STORAGE_NAME}`, JSON.stringify(consentInfo)); + } + ; + if (typeof cb === 'function') cb(response); + return response; + } + }; + + // If config.params.ids does not exist, set defaults + if (!config.params.hasOwnProperty('ids')) { + window.D9r.DeviceID = true; + window.D9r.SingleDeviceID = true; + } else { + if (config.params.ids.hasOwnProperty('device id') && config.params.ids['device id'] === true) { + window.D9r.DeviceID = true; + } + if (config.params.ids.hasOwnProperty('single device id') && config.params.ids['single device id'] === true) { + window.D9r.SingleDeviceID = true; + } + if (config.params.ids.hasOwnProperty('household id') && config.params.ids['household id'] === true) { + window.D9r.HHID = true; + } + } + + // Creates an async script element and appends it to the document + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(config.params.url, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, MODULE_NAME); + } + }; + }, + /** + * Called when IDs are already in localStorage + * should just be adding additional data to the cacheIdObj object + * @function extendId (optional method) + * @param {SubmoduleConfig} config + * @param {ConsentData} consentData + * @param {(Object|undefined)} cacheIdObj + * @returns {IdResponse|undefined} + */ + extendId(config, consentData, cacheIdObj) { + this.isConfigOk(config); + return cacheIdObj; + }, + /* + * Validates the config, if it is not correct, then info cannot be saved in localstorage + * @function isConfigOk + * @param {SubmoduleConfig} config from HTML + * @returns {true|false} + */ + isConfigOk: function (config) { + if (!config.storage || !config.storage.type || !config.storage.name) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError(LOG_PREFIX + 'config.storage required to be set.'); + return false; + } + + // in a future release, we may return false if storage type or name are not set as required + if (config.storage.type !== LOCAL_STORAGE) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn(LOG_PREFIX + 'config.storage.type recommended to be "' + LOCAL_STORAGE + '".'); + } + // in a future release, we may return false if storage type or name are not set as required + if (config.storage.name !== FTRACK_STORAGE_NAME) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn(LOG_PREFIX + 'config.storage.name recommended to be "' + FTRACK_STORAGE_NAME + '".'); + } + if (!config.hasOwnProperty('params') || !config.params.hasOwnProperty('url')) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn(LOG_PREFIX + 'config.params.url is required for ftrack to run.'); + return false; + } + return true; + }, + isThereConsent: function (consentData) { + let consentValue = true; + const { + gdpr, + usp + } = consentData ?? {}; + /* + * Scenario 1: GDPR + * if GDPR Applies is true|1, we do not have consent + * if GDPR Applies does not exist or is false|0, we do not NOT have consent + */ + if (gdpr?.gdprApplies === true || gdpr?.gdprApplies === 1) { + consentInfo.gdpr.applies = 1; + consentValue = false; + } + // If consentString exists, then we store it even though we are not using it + if (typeof gdpr?.consentString !== 'undefined' && !_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(gdpr.consentString) && !_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr(gdpr.consentString)) { + consentInfo.gdpr.consentString = consentData.consentString; + } + + /* + * Scenario 2: CCPA/us_privacy + * if usp exists (assuming this check determines the location of the device to be within the California) + * parse the us_privacy string to see if we have consent + * for version 1 of us_privacy strings, if 'Opt-Out Sale' is 'Y' we do not track + */ + let usPrivacyVersion; + // let usPrivacyOptOut; + let usPrivacyOptOutSale; + // let usPrivacyLSPA; + if (typeof usp !== 'undefined' && !_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty(usp) && !_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr(usp)) { + consentInfo.usPrivacy.value = usp; + usPrivacyVersion = usp[0]; + // usPrivacyOptOut = usp[1]; + usPrivacyOptOutSale = usp[2]; + // usPrivacyLSPA = usp[3]; + } + if (usPrivacyVersion == 1 && usPrivacyOptOutSale === 'Y') consentValue = false; + return consentValue; + }, + eids: { + 'ftrackId': { + source: 'flashtalking.com', + atype: 1, + getValue: function (data) { + let value = ''; + if (data && data.ext && data.ext.DeviceID) { + value = data.ext.DeviceID; + } + return value; + }, + getUidExt: function (data) { + return data && data.ext; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', ftrackIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('ftrackIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ftrackIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gameraRtdProvider"],{ + +/***/ "./modules/gameraRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/gameraRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export subModuleObj */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + +const MODULE_NAME = 'gamera'; +const MODULE = `${MODULE_NAME}RtdProvider`; + +/** + * Initialize the Gamera RTD Module. + * @param {Object} config + * @param {Object} userConsent + * @returns {boolean} + */ +function init(config, userConsent) { + return true; +} + +/** + * Modify bid request data before auction + * @param {Object} reqBidsConfigObj - The bid request config object + * @param {function} callback - Callback function to execute after data handling + * @param {Object} config - Module configuration + * @param {Object} userConsent - User consent data + */ +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + // Check if window.gamera.getPrebidSegments is available + if (typeof window.gamera?.getPrebidSegments !== 'function') { + window.gamera = window.gamera || {}; + window.gamera.cmd = window.gamera.cmd || []; + window.gamera.cmd.push(function () { + enrichAuction(reqBidsConfigObj, callback, config, userConsent); + }); + return; + } + enrichAuction(reqBidsConfigObj, callback, config, userConsent); +} + +/** + * Enriches the auction with user and content segments from Gamera's on-page script + * @param {Object} reqBidsConfigObj - The bid request config object + * @param {Function} callback - Callback function to execute after data handling + * @param {Object} config - Module configuration + * @param {Object} userConsent - User consent data + */ +function enrichAuction(reqBidsConfigObj, callback, config, userConsent) { + try { + /** + * @function external:"window.gamera".getPrebidSegments + * @description Retrieves user and content segments from Gamera's on-page script + * @param {Function|null} onSegmentsUpdateCallback - Callback for segment updates (not used here) + * @param {Object} config - Module configuration + * @param {Object} userConsent - User consent data + * @returns {Object|undefined} segments - The targeting segments object containing: + * @property {Object} [user] - User-level attributes to merge into ortb2.user + * @property {Object} [site] - Site-level attributes to merge into ortb2.site + * @property {Object.} [adUnits] - Ad unit specific attributes, keyed by adUnitCode, + * to merge into each ad unit's ortb2Imp + */ + const segments = window.gamera.getPrebidSegments(null, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(config || {}), (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(userConsent || {})) || {}; + + // Initialize ortb2Fragments and its nested objects + reqBidsConfigObj.ortb2Fragments = reqBidsConfigObj.ortb2Fragments || {}; + reqBidsConfigObj.ortb2Fragments.global = reqBidsConfigObj.ortb2Fragments.global || {}; + + // Add user-level data + if (segments.user && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(segments.user)) { + reqBidsConfigObj.ortb2Fragments.global.user = reqBidsConfigObj.ortb2Fragments.global.user || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global.user, segments.user); + } + + // Add site-level data + if (segments.site && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(segments.site)) { + reqBidsConfigObj.ortb2Fragments.global.site = reqBidsConfigObj.ortb2Fragments.global.site || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global.site, segments.site); + } + + // Add adUnit-level data + const adUnits = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().adUnits || []; + adUnits.forEach(adUnit => { + const gameraData = segments.adUnits && segments.adUnits[adUnit.code]; + if (!gameraData || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(gameraData)) { + return; + } + adUnit.ortb2Imp = adUnit.ortb2Imp || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(adUnit.ortb2Imp, gameraData); + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(MODULE, 'Error getting segments:', error); + } + callback(); +} +const subModuleObj = { + name: MODULE_NAME, + init: init, + getBidRequestData: getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('realTimeData', subModuleObj); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('gameraRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gameraRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gammaBidAdapter"],{ + +/***/ "./modules/gammaBidAdapter.js": +/*!************************************!*\ + !*** ./modules/gammaBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'gamma'; +const ENDPOINTS = { + SGP: 'https://hb.gammaplatform.com', + JPN: 'https://hb-jp.gammaplatform.com', + US_WEST: 'https://hb-us.gammaplatform.com', + EU: 'https://hb-eu.gammaplatform.com' +}; +const spec = { + code: BIDDER_CODE, + aliases: ['gamma'], + supportedMediaTypes: ['banner', 'video'], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.siteId || bid.params.zoneId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const serverRequests = []; + const bidderRequestReferer = bidderRequest?.refererInfo?.page || ''; + let ENDPOINT; + for (var i = 0, len = bidRequests.length; i < len; i++) { + const gaxObjParams = bidRequests[i]; + ENDPOINT = getAdUrlByRegion(gaxObjParams); + serverRequests.push({ + method: 'GET', + url: ENDPOINT + '/adx/request?wid=' + gaxObjParams.params.siteId + '&zid=' + gaxObjParams.params.zoneId + '&hb=pbjs&bidid=' + gaxObjParams.bidId + '&urf=' + encodeURIComponent(bidderRequestReferer) + }); + } + return serverRequests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + serverResponse = serverResponse.body; + const bids = []; + if (serverResponse.id) { + const bid = newBid(serverResponse); + bids.push(bid); + } + return bids; + } +}; + +/** + * Get endpoint url by region + * @param bid + * @return aUrl + */ +function getAdUrlByRegion(bid) { + let ENDPOINT; + if (bid.params.region && ENDPOINTS[bid.params.region]) { + ENDPOINT = ENDPOINTS[bid.params.region]; + } else { + try { + const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const region = timezone.split('/')[0]; + switch (region) { + case 'Europe': + ENDPOINT = ENDPOINTS['EU']; + break; + case 'Australia': + ENDPOINT = ENDPOINTS['JPN']; + break; + case 'Asia': + ENDPOINT = ENDPOINTS['SGP']; + break; + case 'America': + ENDPOINT = ENDPOINTS['US_WEST']; + break; + default: + ENDPOINT = ENDPOINTS['SGP']; + } + } catch (err) { + ENDPOINT = ENDPOINTS['SGP']; + } + } + return ENDPOINT; +} + +/** + * Unpack the Server's Bid into a Prebid-compatible one. + * @param serverBid + * @return Bid + */ +function newBid(serverBid) { + const bid = { + ad: serverBid.seatbid[0].bid[0].adm, + cpm: serverBid.seatbid[0].bid[0].price, + creativeId: serverBid.seatbid[0].bid[0].adid, + currency: serverBid.cur, + dealId: serverBid.seatbid[0].bid[0].dealid, + width: serverBid.seatbid[0].bid[0].w, + height: serverBid.seatbid[0].bid[0].h, + mediaType: serverBid.type, + netRevenue: true, + requestId: serverBid.id, + ttl: serverBid.seatbid[0].bid[0].ttl || 300, + meta: { + advertiserDomains: serverBid.seatbid[0].bid[0].adomain && serverBid.seatbid[0].bid[0].adomain.length ? serverBid.seatbid[0].bid[0].adomain : [] + } + }; + if (serverBid.type == 'video') { + Object.assign(bid, { + vastXml: serverBid.seatbid[0].bid[0].vastXml, + vastUrl: serverBid.seatbid[0].bid[0].vastUrl, + ttl: 3600 + }); + } + return bid; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_0__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('gammaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gammaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gamoshiBidAdapter"],{ + +/***/ "./modules/gamoshiBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/gamoshiBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports helper, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + +const ENDPOINTS = { + 'gamoshi': 'https://rtb.gamoshi.io', + 'cleanmedianet': 'https://bidder.cleanmediaads.com' +}; +const DEFAULT_TTL = 360; +const helper = { + getTopFrame: function () { + try { + return window.top === window ? 1 : 0; + } catch (e) {} + return 0; + }, + startsWith: function (str, search) { + return str.substr(0, search.length) === search; + }, + getMediaType: function (bid) { + if (bid.ext) { + if (bid.ext.media_type) { + return bid.ext.media_type.toLowerCase(); + } else if (bid.ext.vast_url) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + } + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + }, + getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return bid.params.bidfloor ? bid.params.bidfloor : null; + } + let bidFloor = bid.getFloor({ + mediaType: '*', + size: '*', + currency: 'USD' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bidFloor) && !isNaN(bidFloor.floor) && bidFloor.currency === 'USD') { + return bidFloor.floor; + } + return null; + } +}; +const spec = { + code: 'gamoshi', + aliases: ['gambid', 'cleanmedianet'], + supportedMediaTypes: ['banner', 'video'], + isBidRequestValid: function (bid) { + return !!bid.params.supplyPartnerId && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.supplyPartnerId) && (!bid.params['rtbEndpoint'] || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params['rtbEndpoint'])) && (!bid.params.bidfloor || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params.bidfloor)) && (!bid.params['adpos'] || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params['adpos'])) && (!bid.params['protocols'] || Array.isArray(bid.params['protocols'])) && (!bid.params.instl || bid.params.instl === 0 || bid.params.instl === 1); + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const { + adUnitCode, + mediaTypes, + params, + sizes, + bidId + } = bidRequest; + const bidderCode = bidderRequest.bidderCode || 'gamoshi'; + const baseEndpoint = params['rtbEndpoint'] || ENDPOINTS[bidderCode] || 'https://rtb.gamoshi.io'; + const rtbEndpoint = `${baseEndpoint}/r/${params.supplyPartnerId}/bidr?rformat=open_rtb&reqformat=rtb_json&bidder=prebid` + (params.query ? '&' + params.query : ''); + const rtbBidRequest = { + id: bidderRequest.bidderRequestId, + site: { + domain: bidderRequest.refererInfo.domain, + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref + }, + device: { + ua: navigator.userAgent, + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0, + h: screen.height, + w: screen.width, + language: navigator.language + }, + imp: [], + ext: {}, + user: { + ext: {} + }, + source: { + ext: {} + }, + regs: { + ext: {} + } + }; + const gdprConsent = getGdprConsent(bidderRequest); + rtbBidRequest.ext.gdpr_consent = gdprConsent; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'regs.ext.gdpr', gdprConsent.consent_required === true ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'user.ext.consent', gdprConsent.consent_string); + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'source.ext.schain', validBidRequests[0].schain); + } + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(rtbBidRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + const imp = { + id: bidId, + instl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest.ortb2Imp, 'instl') === 1 || params.instl === 1 ? 1 : 0, + tagid: adUnitCode, + bidfloor: helper.getBidFloor(bidRequest) || 0, + bidfloorcur: 'USD', + secure: 1 + }; + const hasFavoredMediaType = params.favoredMediaType && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)(this.supportedMediaTypes, params.favoredMediaType); + if (!mediaTypes || mediaTypes.banner) { + if (!hasFavoredMediaType || params.favoredMediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + const bannerImp = Object.assign({}, imp, { + banner: { + w: sizes.length ? sizes[0][0] : 300, + h: sizes.length ? sizes[0][1] : 250, + pos: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'mediaTypes.banner.pos') || params.pos || 0, + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1 + } + }); + rtbBidRequest.imp.push(bannerImp); + } + } + if (mediaTypes && mediaTypes.video) { + if (!hasFavoredMediaType || params.favoredMediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const playerSize = mediaTypes.video.playerSize || sizes; + const videoImp = Object.assign({}, imp, { + video: { + protocols: bidRequest.mediaTypes.video.protocols || params.protocols || [1, 2, 3, 4, 5, 6], + pos: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.pos') || params.pos || 0, + ext: { + context: mediaTypes.video.context + }, + mimes: bidRequest.mediaTypes.video.mimes, + maxduration: bidRequest.mediaTypes.video.maxduration, + api: bidRequest.mediaTypes.video.api, + skip: bidRequest.mediaTypes.video.skip || bidRequest.params.video.skip, + plcmt: bidRequest.mediaTypes.video.plcmt || bidRequest.params.video.plcmt, + minduration: bidRequest.mediaTypes.video.minduration || bidRequest.params.video.minduration, + playbackmethod: bidRequest.mediaTypes.video.playbackmethod || bidRequest.params.video.playbackmethod, + startdelay: bidRequest.mediaTypes.video.startdelay || bidRequest.params.video.startdelay + } + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(playerSize[0])) { + videoImp.video.w = playerSize[0][0]; + videoImp.video.h = playerSize[0][1]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(playerSize[0])) { + videoImp.video.w = playerSize[0]; + videoImp.video.h = playerSize[1]; + } else { + videoImp.video.w = 300; + videoImp.video.h = 250; + } + rtbBidRequest.imp.push(videoImp); + } + } + let eids = []; + if (bidRequest && bidRequest.userId) { + addExternalUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.id5id.uid`), 'id5-sync.com', 'ID5ID'); + addExternalUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.tdid`), 'adserver.org', 'TDID'); + addExternalUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.idl_env`), 'liveramp.com', 'idl'); + } + if (eids.length > 0) { + rtbBidRequest.user.ext.eids = eids; + } + if (rtbBidRequest.imp.length === 0) { + return; + } + return { + method: 'POST', + url: rtbEndpoint, + data: rtbBidRequest, + bidRequest + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + const response = serverResponse && serverResponse.body; + if (!response) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('empty response'); + return []; + } + const bids = response.seatbid.reduce((acc, seatBid) => acc.concat(seatBid.bid), []); + let outBids = []; + bids.forEach(bid => { + const outBid = { + requestId: bidRequest.bidRequest.bidId, + cpm: bid.price, + width: bid.w, + height: bid.h, + ttl: DEFAULT_TTL, + creativeId: bid.crid || bid.adid, + netRevenue: true, + currency: bid.cur || response.cur, + mediaType: helper.getMediaType(bid) + }; + if (bid.adomain && bid.adomain.length) { + outBid.meta = { + advertiserDomains: bid.adomain + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest.bidRequest, 'mediaTypes.' + outBid.mediaType)) { + if (outBid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + outBids.push(Object.assign({}, outBid, { + ad: bid.adm + })); + } else if (outBid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest.bidRequest, 'mediaTypes.video.context'); + outBids.push(Object.assign({}, outBid, { + vastUrl: bid.ext.vast_url, + vastXml: bid.adm, + renderer: context === 'outstream' ? newRenderer(bidRequest.bidRequest, bid) : undefined + })); + } + } + }); + return outBids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + let gdprApplies = false; + let consentString = ''; + let uspConsentString = ''; + if (gdprConsent && typeof gdprConsent.gdprApplies === 'boolean') { + gdprApplies = gdprConsent.gdprApplies; + } + let gdpr = gdprApplies ? 1 : 0; + if (gdprApplies && gdprConsent.consentString) { + consentString = encodeURIComponent(gdprConsent.consentString); + } + if (uspConsent) { + uspConsentString = encodeURIComponent(uspConsent); + } + const macroValues = { + gdpr: gdpr, + consent: consentString, + uspConsent: uspConsentString + }; + serverResponses.forEach(resp => { + if (resp.body) { + const bidResponse = resp.body; + if (bidResponse.ext && Array.isArray(bidResponse.ext['utrk'])) { + bidResponse.ext['utrk'].forEach(pixel => { + const url = replaceMacros(pixel.url, macroValues); + syncs.push({ + type: pixel.type, + url + }); + }); + } + if (Array.isArray(bidResponse.seatbid)) { + bidResponse.seatbid.forEach(seatBid => { + if (Array.isArray(seatBid.bid)) { + seatBid.bid.forEach(bid => { + if (bid.ext && Array.isArray(bid.ext['utrk'])) { + bid.ext['utrk'].forEach(pixel => { + const url = replaceMacros(pixel.url, macroValues); + syncs.push({ + type: pixel.type, + url + }); + }); + } + }); + } + }); + } + } + }); + return syncs; + } +}; +function newRenderer(bidRequest, bid) { + let rendererOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + url: bidRequest.params && bidRequest.params.rendererUrl || bid.ext && bid.ext.renderer_url || 'https://s.gamoshi.io/video/latest/renderer.js', + config: rendererOptions, + loaded: false + }); + try { + renderer.setRender(renderOutstream); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function renderOutstream(bid) { + bid.renderer.push(() => { + const unitId = bid.adUnitCode + '/' + bid.adId; + window['GamoshiPlayer'].renderAd({ + id: unitId, + debug: window.location.href.indexOf('pbjsDebug') >= 0, + placement: document.getElementById(bid.adUnitCode), + width: bid.width, + height: bid.height, + events: { + ALL_ADS_COMPLETED: () => window.setTimeout(() => { + window['GamoshiPlayer'].removeAd(unitId); + }, 300) + }, + vastUrl: bid.vastUrl, + vastXml: bid.vastXml + }); + }); +} +function addExternalUserId(eids, value, source, rtiPartner) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(value)) { + eids.push({ + source, + uids: [{ + id: value, + ext: { + rtiPartner + } + }] + }); + } +} +function replaceMacros(url, macros) { + return url.replace('[GDPR]', macros.gdpr).replace('[CONSENT]', macros.consent).replace('[US_PRIVACY]', macros.uspConsent); +} +function getGdprConsent(bidderRequest) { + const gdprConsent = bidderRequest.gdprConsent; + if (gdprConsent && gdprConsent.consentString && gdprConsent.gdprApplies) { + return { + consent_string: gdprConsent.consentString, + consent_required: gdprConsent.gdprApplies + }; + } + return { + consent_required: false, + consent_string: '' + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('gamoshiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gamoshiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["genericAnalyticsAdapter"],{ + +/***/ "./modules/genericAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/genericAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports GenericAnalytics, defaultHandler */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + +const DEFAULTS = { + batchSize: 1, + batchDelay: 100, + method: 'POST' +}; +const TYPES = { + handler: 'function', + batchSize: 'number', + batchDelay: 'number', + gvlid: 'number' +}; +const MAX_CALL_DEPTH = 20; +function GenericAnalytics() { + const parent = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + analyticsType: 'endpoint' + }); + const { + logError, + logWarn + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.prefixLog)('Generic analytics:'); + let batch = []; + let callDepth = 0; + let options, handler, timer, translate; + function optionsAreValid(options) { + if (!options.url && !options.handler) { + logError('options must specify either `url` or `handler`'); + return false; + } + if (options.hasOwnProperty('method') && !['GET', 'POST'].includes(options.method)) { + logError('options.method must be GET or POST'); + return false; + } + for (const [field, type] of Object.entries(TYPES)) { + // eslint-disable-next-line valid-typeof + if (options.hasOwnProperty(field) && typeof options[field] !== type) { + logError(`options.${field} must be a ${type}`); + return false; + } + } + if (options.hasOwnProperty('events')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(options.events)) { + logError('options.events must be an object'); + return false; + } + for (const [event, handler] of Object.entries(options.events)) { + if (!(0,_src_events_js__WEBPACK_IMPORTED_MODULE_2__.has)(event)) { + logWarn(`options.events.${event} does not match any known Prebid event`); + } + if (typeof handler !== 'function') { + logError(`options.events.${event} must be a function`); + return false; + } + } + } + return true; + } + function processBatch() { + const currentBatch = batch; + batch = []; + callDepth++; + try { + // the pub-provided handler may inadvertently cause an infinite chain of events; + // even just logging an exception from it may cause an AUCTION_DEBUG event, that + // gets back to the handler, that throws another exception etc. + // to avoid the issue, put a cap on recursion + if (callDepth === MAX_CALL_DEPTH) { + logError('detected probable infinite recursion, discarding events', currentBatch); + } + if (callDepth >= MAX_CALL_DEPTH) { + return; + } + try { + handler(currentBatch); + } catch (e) { + logError('error executing options.handler', e); + } + } finally { + callDepth--; + } + } + function translator(eventHandlers) { + if (!eventHandlers) { + return data => data; + } + return function (_ref) { + let { + eventType, + args + } = _ref; + if (eventHandlers.hasOwnProperty(eventType)) { + try { + return eventHandlers[eventType](args); + } catch (e) { + logError(`error executing options.events.${eventType}`, e); + } + } + }; + } + return Object.assign(Object.create(parent), { + gvlid(config) { + return config?.options?.gvlid; + }, + enableAnalytics(config) { + if (optionsAreValid(config?.options || {})) { + options = Object.assign({}, DEFAULTS, config.options); + handler = options.handler || defaultHandler(options); + translate = translator(options.events); + parent.enableAnalytics.call(this, config); + } + }, + track(event) { + const datum = translate(event); + if (datum != null) { + batch.push(datum); + if (timer != null) { + clearTimeout(timer); + timer = null; + } + if (batch.length >= options.batchSize) { + processBatch(); + } else { + timer = setTimeout(processBatch, options.batchDelay); + } + } + } + }); +} +function defaultHandler(_ref2) { + let { + url, + method, + batchSize, + ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajaxBuilder)() + } = _ref2; + const callbacks = { + success() {}, + error() {} + }; + const extract = batchSize > 1 ? events => events : events => events[0]; + const serialize = method === 'GET' ? data => ({ + data: JSON.stringify(data) + }) : data => JSON.stringify(data); + return function (events) { + ajax(url, callbacks, serialize(extract(events)), { + method, + keepalive: true + }); + }; +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: GenericAnalytics(), + code: 'generic' +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('genericAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/genericAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["geoedgeRtdProvider"],{ + +/***/ "./modules/geoedgeRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/geoedgeRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports WRAPPER_URL, HTML_PLACEHOLDER, getClientUrl, getInPageUrl, wrapper, fetchWrapper, setWrapper, getInitialParams, markAsLoaded, preloadClient, wrapHtml, getMacros, wrapBidResponse, geoedgeSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds geoedge provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch creative wrapper from geoedge server + * The module will place geoedge RUM client on bid responses markup + * @module modules/geoedgeProvider + * @requires module:modules/realTimeData + */ + +/** + * @typedef {Object} ModuleParams + * @property {string} key + * @property {?Object} bidders + * @property {?boolean} wap + * @property {?string} keyName + */ + + + + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** @type {string} */ +const SUBMODULE_NAME = 'geoedge'; +/** @type {string} */ +const WRAPPER_URL = 'https://wrappers.geoedge.be/wrapper.html'; +/** @type {string} */ +/* eslint-disable no-template-curly-in-string */ +const HTML_PLACEHOLDER = '${creative}'; +/** @type {string} */ +const PV_ID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +/** @type {string} */ +const HOST_NAME = 'https://rumcdn.geoedge.be'; +/** @type {string} */ +const FILE_NAME_CLIENT = 'grumi.js'; +/** @type {string} */ +const FILE_NAME_INPAGE = 'grumi-ip.js'; +/** @type {function} */ +let getClientUrl = key => `${HOST_NAME}/${key}/${FILE_NAME_CLIENT}`; +/** @type {function} */ +let getInPageUrl = key => `${HOST_NAME}/${key}/${FILE_NAME_INPAGE}`; +/** @type {string} */ +let wrapper +/** @type {boolean} */; +let wrapperReady; +/** @type {boolean} */ +; +let preloaded; +/** @type {object} */ +; +let refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_1__.getRefererInfo)(); +/** @type {object} */ +; +let overrides = window.grumi?.overrides; + +/** + * fetches the creative wrapper + * @param {function} success - success callback + */ +function fetchWrapper(success) { + if (wrapperReady) { + return success(wrapper); + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(WRAPPER_URL, success); +} + +/** + * sets the wrapper and calls preload client + * @param {string} responseText + */ +function setWrapper(responseText) { + wrapperReady = true; + wrapper = responseText; +} +function getInitialParams(key) { + let params = { + wver: '1.1.1', + wtype: 'pbjs-module', + key, + meta: { + topUrl: refererInfo.page + }, + site: refererInfo.domain, + pimp: PV_ID, + fsRan: true, + frameApi: true + }; + return params; +} +function markAsLoaded() { + preloaded = true; +} + +/** + * preloads the client + * @param {string} key + */ +function preloadClient(key) { + let iframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.createInvisibleIframe)(); + iframe.id = 'grumiFrame'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.insertElement)(iframe); + iframe.contentWindow.grumi = getInitialParams(key); + let url = getClientUrl(key); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(url, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, SUBMODULE_NAME, markAsLoaded, iframe.contentDocument); +} + +/** + * creates identity function for string replace without special replacement patterns + * @param {string} str + * @return {function} + */ +function replacer(str) { + return function () { + return str; + }; +} +function wrapHtml(wrapper, html) { + return wrapper.replace(HTML_PLACEHOLDER, replacer(html)); +} + +/** + * generate macros dictionary from bid response + * @param {Object} bid + * @param {string} key + * @return {Object} + */ +function getMacros(bid, key) { + return { + '${key}': key, + '%%ADUNIT%%': bid.adUnitCode, + '%%WIDTH%%': bid.width, + '%%HEIGHT%%': bid.height, + '%%PATTERN:hb_adid%%': bid.adId, + '%%PATTERN:hb_bidder%%': bid.bidderCode, + '%_isHb!': true, + '%_hbcid!': bid.creativeId || '', + '%_hbadomains': bid.meta && bid.meta.advertiserDomains, + '%%PATTERN:hb_pb%%': bid.pbHg, + '%%SITE%%': overrides?.site || refererInfo.domain, + '%_pimp%': PV_ID, + '%_hbCpm!': bid.cpm, + '%_hbCurrency!': bid.currency + }; +} + +/** + * replace macro placeholders in a string with values from a dictionary + * @param {string} wrapper + * @param {Object} macros + * @return {string} + */ +function replaceMacros(wrapper, macros) { + var re = new RegExp('\\' + Object.keys(macros).join('|'), 'gi'); + return wrapper.replace(re, function (matched) { + return macros[matched]; + }); +} + +/** + * build final creative html with creative wrapper + * @param {Object} bid + * @param {string} wrapper + * @param {string} html + * @return {string} + */ +function buildHtml(bid, wrapper, html, key) { + let macros = getMacros(bid, key); + wrapper = replaceMacros(wrapper, macros); + return wrapHtml(wrapper, html); +} + +/** + * muatates the bid ad property + * @param {Object} bid + * @param {string} ad + */ +function mutateBid(bid, ad) { + bid.ad = ad; +} + +/** + * wraps a bid object with the creative wrapper + * @param {Object} bid + * @param {string} key + */ +function wrapBidResponse(bid, key) { + let wrapped = buildHtml(bid, wrapper, bid.ad, key); + mutateBid(bid, wrapped); +} + +/** + * checks if bidder's bids should be monitored + * @param {string} bidder + * @return {boolean} + */ +function isSupportedBidder(bidder, paramsBidders) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(paramsBidders) || paramsBidders[bidder] === true; +} + +/** + * checks if bid should be monitored + * @param {Object} bid + * @return {boolean} + */ +function shouldWrap(bid, params) { + let supportedBidder = isSupportedBidder(bid.bidderCode, params.bidders); + let donePreload = params.wap ? preloaded : true; + let isGPT = params.gpt; + return wrapperReady && supportedBidder && donePreload && !isGPT; +} +function conditionallyWrap(bidResponse, config, userConsent) { + let params = config.params; + if (shouldWrap(bidResponse, params)) { + wrapBidResponse(bidResponse, params.key); + } +} +function isBillingMessage(data, params) { + return data.key === params.key && data.impression; +} + +/** + * Fire billable events when our client sends a message + * Messages will be sent only when: + * a. applicable bids are wrapped + * b. our code laoded and executed sucesfully + */ +function fireBillableEventsForApplicableBids(params) { + window.addEventListener('message', function (message) { + let data = message.data; + if (isBillingMessage(data, params)) { + let winningBid = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.findBidByAdId(data.adId); + _src_events_js__WEBPACK_IMPORTED_MODULE_6__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BILLABLE_EVENT, { + vendor: SUBMODULE_NAME, + billingId: data.impressionId, + type: winningBid ? 'impression' : data.type, + transactionId: winningBid?.transactionId || data.transactionId, + auctionId: winningBid?.auctionId || data.auctionId, + bidId: winningBid?.requestId || data.requestId + }); + } + }); +} + +/** + * Loads Geoedge in page script that monitors all ad slots created by GPT + * @param {Object} params + */ +function setupInPage(params) { + window.grumi = params; + window.grumi.fromPrebid = true; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(getInPageUrl(params.key), _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, SUBMODULE_NAME); +} +function init(config, userConsent) { + let params = config.params; + if (!params || !params.key) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('missing key for geoedge RTD module provider'); + return false; + } + if (params.gpt) { + setupInPage(params); + } else { + fetchWrapper(setWrapper); + preloadClient(params.key); + } + fireBillableEventsForApplicableBids(params); + return true; +} + +/** @type {RtdSubmodule} */ +const geoedgeSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: SUBMODULE_NAME, + init, + onBidResponseEvent: conditionallyWrap +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.submodule)('realTimeData', geoedgeSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('geoedgeRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/geoedgeRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["geolocationRtdProvider"],{ + +/***/ "./modules/geolocationRtdProvider.js": +/*!*******************************************!*\ + !*** ./modules/geolocationRtdProvider.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export geolocationSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/consentHandler.js */ "./src/consentHandler.js"); + + + + + + + + +let permissionsAvailable = true; +let geolocation; +function getGeolocationData(requestBidsObject, onDone, providerConfig, userConsent) { + let done = false; + if (!permissionsAvailable) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('permission for geolocation receiving was denied'); + return complete(); + } + ; + if (!(0,_src_activities_rules_js__WEBPACK_IMPORTED_MODULE_1__.isActivityAllowed)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_2__.ACTIVITY_TRANSMIT_PRECISE_GEO, (0,_src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_3__.activityParams)(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, 'geolocation'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('permission for geolocation receiving was denied by CMP'); + return complete(); + } + ; + const requestPermission = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(providerConfig, 'params.requestPermission') === true; + navigator.permissions.query({ + name: 'geolocation' + }).then(permission => { + if (permission.state !== 'granted' && !requestPermission) return complete(); + navigator.geolocation.getCurrentPosition(geo => { + geolocation = geo; + complete(); + }); + }); + function complete() { + if (done) return; + done = true; + if (geolocation) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(requestBidsObject, 'ortb2Fragments.global.device.geo', { + lat: geolocation.coords.latitude, + lon: geolocation.coords.longitude, + lastfix: Math.round(((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp)() - geolocation.timestamp) / 1000), + type: 1 + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('geolocation was successfully received ', requestBidsObject.ortb2Fragments.global.device.geo); + } + onDone(); + } +} +function init(moduleConfig) { + geolocation = void 0; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(navigator?.permissions?.query) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(navigator?.geolocation?.getCurrentPosition || !navigator?.permissions?.query)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('geolocation is not defined'); + permissionsAvailable = false; + } else { + permissionsAvailable = true; + } + return permissionsAvailable; +} +const geolocationSubmodule = { + name: 'geolocation', + gvlid: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_7__.VENDORLESS_GVLID, + getBidRequestData: getGeolocationData, + init: init +}; +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.submodule)('realTimeData', geolocationSubmodule); +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('geolocationRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/geolocationRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["getintentBidAdapter"],{ + +/***/ "./modules/getintentBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/getintentBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'getintent'; +const IS_NET_REVENUE = true; +const BID_HOST = 'px.adhigh.net'; +const BID_BANNER_PATH = '/rtb/direct_banner'; +const BID_VIDEO_PATH = '/rtb/direct_vast'; +const BID_RESPONSE_TTL_SEC = 360; +const FLOOR_PARAM = 'floor'; +const CURRENCY_PARAM = 'cur'; +const DEFAULT_CURRENCY = 'RUB'; +const VIDEO_PROPERTIES = { + 'protocols': 'protocols', + 'mimes': 'mimes', + 'min_dur': 'minduration', + 'max_dur': 'maxduration', + 'min_btr': 'minbitrate', + 'max_btr': 'maxbitrate', + 'vi_format': null, + 'api': 'api', + 'skippable': 'skip' +}; +const SKIPPABLE_ALLOW = 'ALLOW'; +const SKIPPABLE_NOT_ALLOW = 'NOT_ALLOW'; +const OPTIONAL_PROPERTIES = ['sid']; +const spec = { + code: BIDDER_CODE, + aliases: ['getintentAdapter'], + supportedMediaTypes: ['video', 'banner'], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid to validate. + * @return {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid && bid.params && bid.params.pid && bid.params.tid); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests - an array of bids. + * @return ServerRequest[] + */ + buildRequests: function (bidRequests) { + return bidRequests.map(bidRequest => { + let giBidRequest = buildGiBidRequest(bidRequest); + return { + method: 'GET', + url: buildUrl(giBidRequest), + data: giBidRequest + }; + }); + }, + /** + * Callback for bids, after the call to DSP completes. + * Parse the response from the server into a list of bids. + * + * @param {object} serverResponse A response from the GetIntent's server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + let responseBody = serverResponse.body; + const bids = []; + if (responseBody && responseBody.no_bid !== 1) { + let size = parseSize(responseBody.size); + let bid = { + requestId: responseBody.bid_id, + ttl: BID_RESPONSE_TTL_SEC, + netRevenue: IS_NET_REVENUE, + currency: responseBody.currency, + creativeId: responseBody.creative_id, + cpm: responseBody.cpm, + width: size[0], + height: size[1], + meta: { + advertiserDomains: responseBody.adomain || [] + } + }; + if (responseBody.vast_url) { + bid.mediaType = 'video'; + bid.vastUrl = responseBody.vast_url; + } else { + bid.mediaType = 'banner'; + bid.ad = responseBody.ad; + } + bids.push(bid); + } + return bids; + } +}; +function buildUrl(bid) { + return 'https://' + BID_HOST + (bid.is_video ? BID_VIDEO_PATH : BID_BANNER_PATH); +} + +/** + * Builds GI bid request from BidRequest. + * + * @param {BidRequest} bidRequest + * @return {object} GI bid request + */ +function buildGiBidRequest(bidRequest) { + let giBidRequest = { + bid_id: bidRequest.bidId, + pid: bidRequest.params.pid, + // required + tid: bidRequest.params.tid, + // required + known: bidRequest.params.known || 1, + is_video: bidRequest.mediaType === 'video', + resp_type: 'JSON', + provider: 'direct.prebidjs' + }; + if (bidRequest.sizes) { + giBidRequest.size = produceSize(bidRequest.sizes); + } + const currency = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)(CURRENCY_PARAM, bidRequest.params); + const floorInfo = getBidFloor(bidRequest, currency); + if (floorInfo.floor) { + giBidRequest[FLOOR_PARAM] = floorInfo.floor; + } + if (floorInfo.currency) { + giBidRequest[CURRENCY_PARAM] = floorInfo.currency; + } + if (giBidRequest.is_video) { + addVideo(bidRequest.params.video, bidRequest.mediaTypes.video, giBidRequest); + } + addOptional(bidRequest.params, giBidRequest, OPTIONAL_PROPERTIES); + return giBidRequest; +} +function getBidFloor(bidRequest, currency) { + let floorInfo = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bidRequest.getFloor)) { + floorInfo = bidRequest.getFloor({ + currency: currency || DEFAULT_CURRENCY, + mediaType: bidRequest.mediaType, + size: bidRequest.sizes || '*' + }) || {}; + } + return { + floor: floorInfo.floor || bidRequest.params[FLOOR_PARAM] || 0, + currency: floorInfo.currency || currency || '' + }; +} +function addVideo(videoParams, mediaTypesVideoParams, giBidRequest) { + videoParams = videoParams || {}; + mediaTypesVideoParams = mediaTypesVideoParams || {}; + for (let videoParam in VIDEO_PROPERTIES) { + let paramValue; + const mediaTypesVideoParam = VIDEO_PROPERTIES[videoParam]; + if (videoParams.hasOwnProperty(videoParam)) { + paramValue = videoParams[videoParam]; + } else if (mediaTypesVideoParam !== null && mediaTypesVideoParams.hasOwnProperty(mediaTypesVideoParam)) { + if (mediaTypesVideoParam === 'skip') { + paramValue = mediaTypesVideoParams[mediaTypesVideoParam] === 1 ? SKIPPABLE_ALLOW : SKIPPABLE_NOT_ALLOW; + } else { + paramValue = mediaTypesVideoParams[mediaTypesVideoParam]; + } + } + if (typeof paramValue !== 'undefined') { + giBidRequest[videoParam] = Array.isArray(paramValue) ? paramValue.join(',') : paramValue; + } + } +} +function addOptional(params, request, props) { + for (let i = 0; i < props.length; i++) { + if (params.hasOwnProperty(props[i])) { + request[props[i]] = params[props[i]]; + } + } +} + +/** + * @param {String} s The string representing a size (e.g. "300x250"). + * @return {Number[]} An array with two elements: [width, height] (e.g.: [300, 250]). + */ +function parseSize(s) { + return s.split('x').map(Number); +} + +/** + * @param {Array} sizes An array of sizes/numbers to be joined into single string. + * May be an array (e.g. [300, 250]) or array of arrays (e.g. [[300, 250], [640, 480]]. + * @return {String} The string with sizes, e.g. array of sizes [[50, 50], [80, 80]] becomes "50x50,80x80" string. + */ +function produceSize(sizes) { + function sizeToStr(s) { + if (Array.isArray(s) && s.length === 2 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(s[0]) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(s[1])) { + return s.join('x'); + } else { + throw "Malformed parameter 'sizes'"; + } + } + if (Array.isArray(sizes) && Array.isArray(sizes[0])) { + return sizes.map(sizeToStr).join(','); + } else { + return sizeToStr(sizes); + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('getintentBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/getintentBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gjirafaBidAdapter"],{ + +/***/ "./modules/gjirafaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/gjirafaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'gjirafa'; +const ENDPOINT_URL = 'https://central.gjirafa.com/bid'; +const DIMENSION_SEPARATOR = 'x'; +const SIZE_SEPARATOR = ';'; +const BISKO_ID = 'biskoId'; +const STORAGE_ID = 'bisko-sid'; +const SEGMENTS = 'biskoSegments'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.propertyId && bid.params.placementId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const storageId = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(STORAGE_ID) || '' : ''; + const biskoId = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(BISKO_ID) || '' : ''; + const segments = storage.localStorageIsEnabled() ? JSON.parse(storage.getDataFromLocalStorage(SEGMENTS)) || [] : []; + let propertyId = ''; + let pageViewGuid = ''; + let bidderRequestId = ''; + let url = ''; + let contents = []; + let data = {}; + let placements = validBidRequests.map(bidRequest => { + if (!propertyId) { + propertyId = bidRequest.params.propertyId; + } + if (!pageViewGuid && bidRequest.params) { + pageViewGuid = bidRequest.params.pageViewGuid || ''; + } + if (!bidderRequestId) { + bidderRequestId = bidRequest.bidderRequestId; + } + if (!url && bidderRequest) { + url = bidderRequest.refererInfo.page; + } + if (!contents.length && bidRequest.params.contents && bidRequest.params.contents.length) { + contents = bidRequest.params.contents; + } + if (Object.keys(data).length === 0 && bidRequest.params.data && Object.keys(bidRequest.params.data).length !== 0) { + data = bidRequest.params.data; + } + let adUnitId = bidRequest.adUnitCode; + let placementId = bidRequest.params.placementId; + let sizes = generateSizeParam(bidRequest.sizes); + return { + sizes: sizes, + adUnitId: adUnitId, + placementId: placementId, + bidid: bidRequest.bidId, + count: bidRequest.params.count, + skipTime: bidRequest.params.skipTime + }; + }); + let body = { + propertyId: propertyId, + pageViewGuid: pageViewGuid, + storageId: storageId, + biskoId: biskoId, + segments: segments, + url: url, + requestid: bidderRequestId, + placements: placements, + contents: contents, + data: data + }; + return [{ + method: 'POST', + url: ENDPOINT_URL, + data: body + }]; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const responses = serverResponse.body; + const bidResponses = []; + for (var i = 0; i < responses.length; i++) { + const bidResponse = { + requestId: responses[i].BidId, + cpm: responses[i].CPM, + width: responses[i].Width, + height: responses[i].Height, + creativeId: responses[i].CreativeId, + currency: responses[i].Currency, + netRevenue: responses[i].NetRevenue, + ttl: responses[i].TTL, + referrer: responses[i].Referrer, + ad: responses[i].Ad, + vastUrl: responses[i].VastUrl, + mediaType: responses[i].MediaType, + meta: { + advertiserDomains: Array.isArray(responses[i].ADomain) ? responses[i].ADomain : [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + } +}; + +/** + * Generate size param for bid request using sizes array + * + * @param {Array} sizes Possible sizes for the ad unit. + * @return {string} Processed sizes param to be used for the bid request. + */ +function generateSizeParam(sizes) { + return sizes.map(size => size.join(DIMENSION_SEPARATOR)).join(SIZE_SEPARATOR); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('gjirafaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gjirafaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["globalsunBidAdapter"],{ + +/***/ "./modules/globalsunBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/globalsunBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'globalsun'; +const AD_URL = 'https://endpoint.globalsun.io/pbjs'; +const SYNC_URL = 'https://cs.globalsun.io'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('globalsunBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/globalsunBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["glomexBidAdapter"],{ + +/***/ "./modules/glomexBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/glomexBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const ENDPOINT = 'https://prebid.mes.glomex.cloud/request-bid'; +const BIDDER_CODE = 'glomex'; +const GVLID = 967; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + if (bid && bid.params && bid.params.integrationId) { + return true; + } + return false; + }, + buildRequests: function (validBidRequests) { + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const refererInfo = bidderRequest.refererInfo || {}; + const gdprConsent = bidderRequest.gdprConsent || {}; + return { + method: 'POST', + url: `${ENDPOINT}`, + data: { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidderRequest.auctionId, + refererInfo: { + // TODO: this collects everything it finds, except for canonicalUrl + isAmp: refererInfo.isAmp, + numIframes: refererInfo.numIframes, + reachedTop: refererInfo.reachedTop, + referer: refererInfo.topmostLocation + }, + gdprConsent: { + consentString: gdprConsent.consentString, + gdprApplies: gdprConsent.gdprApplies + }, + bidRequests: validBidRequests.map(_ref => { + let { + params, + sizes, + bidId, + adUnitCode + } = _ref; + return { + bidId, + adUnitCode, + params, + sizes + }; + }) + }, + options: { + withCredentials: false, + contentType: 'application/json' + }, + validBidRequests: validBidRequests + }; + }, + interpretResponse: function (serverResponse, originalBidRequest) { + const bidResponses = []; + originalBidRequest.validBidRequests.forEach(function (bidRequest) { + if (!serverResponse.body) { + return; + } + const matchedBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(serverResponse.body.bids, function (bid) { + return String(bidRequest.bidId) === String(bid.id); + }); + if (matchedBid) { + const bidResponse = { + requestId: bidRequest.bidId, + cpm: matchedBid.cpm, + width: matchedBid.width, + height: matchedBid.height, + creativeId: matchedBid.creativeId, + dealId: matchedBid.dealId, + currency: matchedBid.currency, + netRevenue: matchedBid.netRevenue, + ttl: matchedBid.ttl, + ad: matchedBid.ad, + meta: { + advertiserDomains: matchedBid.adomain ? matchedBid.adomain : [] + } + }; + bidResponses.push(bidResponse); + } + }); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('glomexBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/glomexBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gmosspBidAdapter"],{ + +/***/ "./modules/gmosspBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/gmosspBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'gmossp'; +const ENDPOINT = 'https://sp.gmossp-sp.jp/hb/prebid/query.ad'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.sid; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const bidRequests = []; + const urlInfo = getUrlInfo(bidderRequest.refererInfo); + const cur = getCurrencyType(bidderRequest); + const dnt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? '1' : '0'; + for (let i = 0; i < validBidRequests.length; i++) { + let queryString = ''; + const request = validBidRequests[i]; + const tid = request.ortb2Imp?.ext?.tid; + const bid = request.bidId; + const imuid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'userId.imuid'); + const sharedId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'userId.pubcid'); + const idlEnv = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'userId.idl_env'); + const ver = "9.45.0-pre"; + const sid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('sid', request.params); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'tid', tid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'bid', bid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'ver', ver); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'sid', sid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'im_uid', imuid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'shared_id', sharedId); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'idl_env', idlEnv); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'url', urlInfo.url); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'meta_url', urlInfo.canonicalLink); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'ref', urlInfo.ref); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'cur', cur); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(queryString, 'dnt', dnt); + bidRequests.push({ + method: 'GET', + url: ENDPOINT, + data: queryString + }); + } + return bidRequests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} bidderResponse A successful response from the server. + * @param {Array} requests + * @return {Array} An array of bids which were nested inside the server. + */ + interpretResponse: function (bidderResponse, requests) { + const res = bidderResponse.body; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(res)) { + return []; + } + try { + res.imps.forEach(impTracker => { + const tracker = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(impTracker); + res.ad += tracker; + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error appending tracking pixel', error); + } + const bid = { + requestId: res.bid, + cpm: res.price, + currency: res.cur, + width: res.w, + height: res.h, + ad: res.ad, + creativeId: res.creativeId, + netRevenue: true, + ttl: res.ttl || 300 + }; + if (res.adomains) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'meta.advertiserDomains', Array.isArray(res.adomains) ? res.adomains : [res.adomains]); + } + return [bid]; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (!serverResponses.length) { + return syncs; + } + serverResponses.forEach(res => { + if (syncOptions.pixelEnabled && res.body && res.body.syncs.length) { + res.body.syncs.forEach(sync => { + syncs.push({ + type: 'image', + url: sync + }); + }); + } + }); + return syncs; + } +}; +function getCurrencyType(bidderRequest) { + return (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_5__.getCurrencyFromBidderRequest)(bidderRequest) || 'JPY'; +} +function getUrlInfo(refererInfo) { + let canonicalLink = refererInfo.canonicalUrl; + if (!canonicalLink) { + let metaElements = getMetaElements(); + for (let i = 0; i < metaElements.length && !canonicalLink; i++) { + if (metaElements[i].getAttribute('property') == 'og:url') { + canonicalLink = metaElements[i].content; + } + } + } + return { + canonicalLink: canonicalLink, + // TODO: are these the right refererInfo values? + url: refererInfo.topmostLocation, + ref: refererInfo.ref || window.document.referrer + }; +} +function getMetaElements() { + try { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop.document.getElementsByTagName('meta'); + } catch (e) { + return document.getElementsByTagName('meta'); + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('gmosspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gmosspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gnetBidAdapter"],{ + +/***/ "./modules/gnetBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/gnetBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'gnet'; +const ENDPOINT = 'https://service.gnetrtb.com/api'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.websiteId && bid.params.adunitId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const bidRequests = []; + // TODO: is 'page' the right value? + const referer = bidderRequest.refererInfo.page; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(validBidRequests, request => { + const data = {}; + data.referer = referer; + data.adUnitCode = request.adUnitCode; + data.bidId = request.bidId; + data.transactionId = request.ortb2Imp?.ext?.tid; + data.gftuid = _getCookie(); + data.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(request.sizes); + data.params = request.params; + const payloadString = JSON.stringify(data); + bidRequests.push({ + method: 'POST', + url: ENDPOINT + '/adrequest', + options: { + withCredentials: false + }, + data: payloadString + }); + }); + return bidRequests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, requests) { + if (typeof serverResponse !== 'object') { + return []; + } + const res = serverResponse && serverResponse.body; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(res)) { + return []; + } + if (res.bids) { + const bids = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(res.bids, bidData => { + const bid = { + requestId: bidData.bidId, + cpm: bidData.cpm, + currency: bidData.currency, + width: bidData.width, + height: bidData.height, + ad: bidData.ad, + ttl: 300, + meta: { + advertiserDomains: bidData.adomain ? bidData.adomain : [] + }, + creativeId: bidData.creativeId, + netRevenue: true + }; + bids.push(bid); + }); + return bids; + } + return []; + }, + onBidWon: function (bid) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(ENDPOINT + '/bid-won', null, JSON.stringify(bid), { + method: 'POST' + }); + return true; + } +}; +function _getCookie() { + return storage.cookiesAreEnabled() ? storage.getCookie('gftuid') : null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('gnetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gnetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["goldbachBidAdapter"],{ + +/***/ "./modules/goldbachBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/goldbachBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + + + + + +/* General config */ +const IS_LOCAL_MODE = false; +const BIDDER_CODE = 'goldbach'; +const BIDDER_UID_KEY = 'goldbach_uid'; +const GVLID = 580; +const URL = 'https://goldlayer-api.prod.gbads.net/openrtb/2.5/auction'; +const URL_LOCAL = 'http://localhost:3000/openrtb/2.5/auction'; +const URL_LOGGING = 'https://l.da-services.ch/pb'; +const URL_COOKIESYNC = 'https://goldlayer-api.prod.gbads.net/cookiesync'; +const METHOD = 'POST'; +const DEFAULT_CURRENCY = 'USD'; +const LOGGING_PERCENTAGE_REGULAR = 0.001; +const LOGGING_PERCENTAGE_ERROR = 0.001; +const COOKIE_EXP = 1000 * 60 * 60 * 24 * 365; + +/* Renderer settings */ +const RENDERER_OPTIONS = { + OUTSTREAM_GP: { + URL: 'https://goldplayer.prod.gbads.net/scripts/goldplayer.js' + } +}; + +/* Event types */ +const EVENTS = { + BID_WON: 'bid_won', + TARGETING: 'targeting_set', + RENDER: 'creative_render', + TIMEOUT: 'timeout', + ERROR: 'error' +}; + +/* Goldbach storage */ +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const setUid = uid => { + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(BIDDER_UID_KEY, uid); + } else if (storage.cookiesAreEnabled()) { + const cookieExpiration = new Date(Date.now() + COOKIE_EXP).toISOString(); + storage.setCookie(BIDDER_UID_KEY, uid, cookieExpiration, 'None'); + } +}; +const getUid = () => { + if (storage.localStorageIsEnabled()) { + return storage.getDataFromLocalStorage(BIDDER_UID_KEY); + } else if (storage.cookiesAreEnabled()) { + return storage.getCookie(BIDDER_UID_KEY); + } + return null; +}; +const ensureUid = gdprConsent => { + // Check if the user has given consent for purpose 1 + if (!gdprConsent || !(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_1__.hasPurpose1Consent)(gdprConsent)) return null; + // Check if the UID already exists + const existingUid = getUid(); + if (existingUid) return existingUid; + // Generate a new UID if it doesn't exist + const uid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + setUid(uid); + return uid; +}; + +/* Custom extensions */ +const getRendererForBid = (bidRequest, bidResponse) => { + if (!bidRequest.renderer) { + const config = { + documentResolver: (_, sourceDocument, renderDocument) => renderDocument ?? sourceDocument + }; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: bidRequest.bidId, + url: RENDERER_OPTIONS.OUTSTREAM_GP.URL, + adUnitCode: bidRequest.adUnitCode, + config + }); + renderer.setRender((bid, doc) => { + const videoParams = bidRequest?.mediaTypes?.video || {}; + const playerSize = videoParams.playerSize; + const playbackmethod = videoParams.playbackmethod; + const isMuted = typeof playbackmethod === 'number' ? [2, 6].includes(playbackmethod) : false; + const isAutoplay = typeof playbackmethod === 'number' ? [1, 2].includes(playbackmethod) : false; + bid.renderer.push(() => { + if (doc.defaultView?.GoldPlayer) { + const options = { + vastUrl: bid.vastUrl, + vastXML: bid.vastXml, + autoplay: isAutoplay, + muted: isMuted, + controls: true, + resizeMode: 'auto', + styling: { + progressbarColor: '#000' + }, + publisherProvidedWidth: playerSize?.[0], + publisherProvidedHeight: playerSize?.[1] + }; + const GP = doc.defaultView.GoldPlayer; + const player = new GP(options); + player.play(); + } + }); + }); + return renderer; + } + return undefined; +}; + +/* Converter config, applying custom extensions */ +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_4__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 3600 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + + // Apply custom extensions to the imp + imp.ext = imp.ext || {}; + imp.ext[BIDDER_CODE] = imp.ext[BIDDER_CODE] || {}; + imp.ext[BIDDER_CODE].targetings = bidRequest?.params?.customTargeting || {}; + imp.ext[BIDDER_CODE].slotId = bidRequest?.params?.slotId || bidRequest?.adUnitCode; + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const ortbRequest = buildRequest(imps, bidderRequest, context); + const { + bidRequests = [] + } = context; + const firstBidRequest = bidRequests?.[0]; + + // Read gdpr consent data + const gdprConsent = bidderRequest?.gdprConsent; + + // Apply custom extensions to the request + if (bidRequests.length > 0) { + ortbRequest.ext = ortbRequest.ext || {}; + ortbRequest.ext[BIDDER_CODE] = ortbRequest.ext[BIDDER_CODE] || {}; + ortbRequest.ext[BIDDER_CODE].uid = ensureUid(gdprConsent); + ortbRequest.ext[BIDDER_CODE].publisherId = firstBidRequest?.params?.publisherId; + ortbRequest.ext[BIDDER_CODE].mockResponse = firstBidRequest?.params?.mockResponse || false; + } + + // Apply gdpr consent data + if (bidderRequest?.gdprConsent) { + ortbRequest.regs = ortbRequest.regs || {}; + ortbRequest.regs.ext = ortbRequest.regs.ext || {}; + ortbRequest.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + ortbRequest.user = ortbRequest.user || {}; + ortbRequest.user.ext = ortbRequest.user.ext || {}; + ortbRequest.user.ext.consent = bidderRequest.gdprConsent.consentString; + } + return ortbRequest; + }, + bidResponse(buildBidResponse, bid, context) { + // Setting context: media type + context.mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ext.prebid.type'); + const bidResponse = buildBidResponse(bid, context); + const { + bidRequest + } = context; + + // Setting required properties: cpm, currency + bidResponse.currency = bidResponse.currency || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ext.origbidcur') || DEFAULT_CURRENCY; + bidResponse.cpm = bidResponse.cpm || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'price'); + + // Setting required properties: meta + bidResponse.meta = bidResponse.meta || {}; + bidResponse.meta.advertiserDomains = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'adomain'); + bidResponse.meta.mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ext.prebid.type'); + bidResponse.meta.primaryCatId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ext.prebid.video.primary_category'); + bidResponse.meta.secondaryCatIds = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ext.prebid.video.secondary_categories'); + + // Setting extensions: outstream video renderer + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO && bidRequest.mediaTypes.video.context === 'outstream' && (bidResponse.vastUrl || bidResponse.vastXml)) { + bidResponse.renderer = getRendererForBid(bidRequest, bidResponse); + } + return bidResponse; + } +}); + +/* Logging */ +const sendLog = function (data) { + let percentage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.0001; + if (Math.random() > percentage) return; + const encodedData = `data=${window.btoa(JSON.stringify({ + ...data, + source: 'goldbach_pbjs', + projectedAmount: 1 / percentage + }))}`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(URL_LOGGING, null, encodedData, { + withCredentials: false, + method: METHOD, + crossOrigin: true, + contentType: 'application/x-www-form-urlencoded' + }); +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.NATIVE], + isBidRequestValid: function (bid) { + return typeof bid.params?.publisherId === 'string' && bid.params?.publisherId.length > 0; + }, + buildRequests: function (bidRequests, bidderRequest) { + const url = IS_LOCAL_MODE ? URL_LOCAL : URL; + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: METHOD, + url: url, + data: data, + options: { + withCredentials: false, + contentType: 'application/json' + } + }; + }, + interpretResponse: function (ortbResponse, request) { + const bids = converter.fromORTB({ + response: ortbResponse.body, + request: request.data + }).bids; + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + const uid = ensureUid(gdprConsent); + if ((0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_1__.hasPurpose1Consent)(gdprConsent)) { + let type = syncOptions.pixelEnabled ? 'image' : null ?? syncOptions.iframeEnabled ? 'iframe' : null; + if (type) { + syncs.push({ + type: type, + url: `https://ib.adnxs.com/getuid?${URL_COOKIESYNC}?uid=${uid}&xandrId=$UID&gdpr_consent=${gdprConsent.consentString}&gdpr=${gdprConsent.gdprApplies ? 1 : 0}` + }); + } + } + return syncs; + }, + onTimeout: function (timeoutData) { + const payload = { + event: EVENTS.TIMEOUT, + error: timeoutData + }; + sendLog(payload, LOGGING_PERCENTAGE_ERROR); + }, + onBidWon: function (bid) { + const payload = { + event: EVENTS.BID_WON, + publisherId: bid.params?.[0]?.publisherId, + creativeId: bid.creativeId, + adUnitCode: bid.adUnitCode, + mediaType: bid.mediaType, + size: bid.size + }; + sendLog(payload, LOGGING_PERCENTAGE_REGULAR); + }, + onSetTargeting: function (bid) { + const payload = { + event: EVENTS.BID_WON, + publisherId: bid.params?.[0]?.publisherId, + creativeId: bid.creativeId, + adUnitCode: bid.adUnitCode, + mediaType: bid.mediaType, + size: bid.size + }; + sendLog(payload, LOGGING_PERCENTAGE_REGULAR); + }, + onBidderError: function (_ref) { + let { + error + } = _ref; + const payload = { + event: EVENTS.ERROR, + error: error + }; + sendLog(payload, LOGGING_PERCENTAGE_ERROR); + }, + onAdRenderSucceeded: function (bid) { + const payload = { + event: EVENTS.BID_WON, + publisherId: bid.params?.[0]?.publisherId, + creativeId: bid.creativeId, + adUnitCode: bid.adUnitCode, + mediaType: bid.mediaType, + size: bid.size + }; + sendLog(payload, LOGGING_PERCENTAGE_REGULAR); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('goldbachBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/goldbachBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["goldfishAdsRtdProvider"],{ + +/***/ "./modules/goldfishAdsRtdProvider.js": +/*!*******************************************!*\ + !*** ./modules/goldfishAdsRtdProvider.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MODULE_NAME, MODULE_TYPE, ENDPOINT_URL, DATA_STORAGE_KEY, DATA_STORAGE_TTL, ADAPTER_VERSION, storage, manageCallbackResponse, getStorageData, updateUserData, goldfishAdsSubModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'goldfishAdsRtd'; +const MODULE_TYPE = 'realTimeData'; +const ENDPOINT_URL = 'https://prebid.goldfishads.com/iab-segments'; +const DATA_STORAGE_KEY = 'goldfishads_data'; +const DATA_STORAGE_TTL = 1800 * 1000; // TTL in seconds + +const ADAPTER_VERSION = '1.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + gvlid: null, + moduleName: MODULE_NAME, + moduleType: MODULE_TYPE +}); + +/** + * + * @param {{response: string[]} } response + * @returns + */ +const manageCallbackResponse = response => { + try { + const foo = JSON.parse(response.response); + if (!Array.isArray(foo)) throw new Error('Invalid response'); + const enrichedResponse = { + ext: { + segtax: 4 + }, + segment: foo.map(segment => { + return { + id: segment + }; + }) + }; + const output = { + name: 'goldfishads.com', + ...enrichedResponse + }; + return output; + } catch (e) { + throw e; + } + ; +}; + +/** + * @param {string} key + * @returns { Promise<{name: 'goldfishads.com', ext: { segtag: 4 }, segment: string[]}> } + */ + +const getTargetingDataFromApi = key => { + return new Promise((resolve, reject) => { + const requestOptions = { + customHeaders: { + 'Accept': 'application/json' + } + }; + const callbacks = { + success(responseText, response) { + try { + const output = manageCallbackResponse(response); + resolve(output); + } catch (e) { + reject(e); + } + }, + error(error) { + reject(error); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(`${ENDPOINT_URL}?key=${key}`, callbacks, null, requestOptions); + }); +}; + +/** + * @returns {{ + * name: 'golfishads.com', + * ext: { segtax: 4}, + * segment: string[] + * } | null } + */ +const getStorageData = () => { + const now = new Date(); + const data = storage.getDataFromLocalStorage(DATA_STORAGE_KEY); + if (data === null) return null; + try { + const foo = JSON.parse(data); + if (now.getTime() > foo.expiry) return null; + return foo.targeting; + } catch (e) { + return null; + } +}; + +/** + * @param { { key: string } } payload + * @returns {Promise<{ + * name: string, + * ext: { segtax: 4}, + * segment: string[] + * }> | null + * } + */ + +const getTargetingData = payload => new Promise(resolve => { + const targeting = getStorageData(); + if (targeting === null) { + getTargetingDataFromApi(payload.key).then(response => { + const now = new Date(); + const data = { + targeting: response, + expiry: now.getTime() + DATA_STORAGE_TTL + }; + storage.setDataInLocalStorage(DATA_STORAGE_KEY, JSON.stringify(data)); + resolve(response); + }).catch(e => { + resolve(null); + }); + } else { + resolve(targeting); + } +}); + +/** + * + * @param {*} config + * @param {*} userConsent + * @returns {boolean} + */ + +const init = (config, userConsent) => { + if (!config.params || !config.params.key) return false; + // return { type: (typeof config.params.key === 'string') }; + if (!(typeof config.params.key === 'string')) return false; + return true; +}; + +/** + * + * @param {{ + * name: string, + * ext: { segtax: 4}, + * segment: {id: string}[] + * } | null } userData + * @param {*} reqBidsConfigObj + * @returns + */ +const updateUserData = (userData, reqBidsConfigObj) => { + if (userData === null) return; + const bidders = ['appnexus', 'rubicon', 'nexx360']; + for (let i = 0; i < bidders.length; i++) { + const bidderCode = bidders[i]; + const originalConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(reqBidsConfigObj, `ortb2Fragments.bidder[${bidderCode}].user.data`) || []; + const userConfig = [...originalConfig, userData]; + reqBidsConfigObj.ortb2Fragments = reqBidsConfigObj.ortb2Fragments || {}; + reqBidsConfigObj.ortb2Fragments.bidder = reqBidsConfigObj.ortb2Fragments.bidder || {}; + reqBidsConfigObj.ortb2Fragments.bidder[bidderCode] = reqBidsConfigObj.ortb2Fragments.bidder[bidderCode] || {}; + reqBidsConfigObj.ortb2Fragments.bidder[bidderCode].user = reqBidsConfigObj.ortb2Fragments.bidder[bidderCode].user = {}; + reqBidsConfigObj.ortb2Fragments.bidder[bidderCode].user.data = reqBidsConfigObj.ortb2Fragments.bidder[bidderCode].user.data || userConfig; + } + return reqBidsConfigObj; +}; + +/** + * + * @param {*} reqBidsConfigObj + * @param {*} callback + * @param {*} moduleConfig + * @param {*} userConsent + * @returns {void} + */ +const getBidRequestData = (reqBidsConfigObj, callback, moduleConfig, userConsent) => { + const payload = { + key: moduleConfig.params.key + }; + getTargetingData(payload).then(userData => { + updateUserData(userData, reqBidsConfigObj); + callback(); + }); +}; + +/** @type {RtdSubmodule} */ +const goldfishAdsSubModule = { + name: MODULE_NAME, + init, + getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)(MODULE_TYPE, goldfishAdsSubModule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('goldfishAdsRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/goldfishAdsRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gothamadsBidAdapter"],{ + +/***/ "./modules/gothamadsBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/gothamadsBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'gothamads'; +const ACCOUNTID_MACROS = '[account_id]'; +const URL_ENDPOINT = `https://us-e-node1.gothamads.com/bid?pass=${ACCOUNTID_MACROS}&integration=prebidjs`; +const NATIVE_ASSET_IDS = { + 0: 'title', + 2: 'icon', + 3: 'image', + 5: 'sponsoredBy', + 4: 'body', + 1: 'cta' +}; +const NATIVE_PARAMS = { + title: { + id: 0, + name: 'title' + }, + icon: { + id: 2, + type: 1, + name: 'img' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + sponsoredBy: { + id: 5, + name: 'data', + type: 1 + }, + body: { + id: 4, + name: 'data', + type: 2 + }, + cta: { + id: 1, + type: 12, + name: 'data' + } +}; +const NATIVE_VERSION = '1.2'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + return Boolean(bid.params.accountId) && Boolean(bid.params.placementId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + if (validBidRequests && validBidRequests.length === 0) return []; + let accuontId = validBidRequests[0].params.accountId; + const endpointURL = URL_ENDPOINT.replace(ACCOUNTID_MACROS, accuontId); + let winTop = window; + let location; + location = bidderRequest?.refererInfo ?? null; + let bids = []; + for (let bidRequest of validBidRequests) { + let impObject = prepareImpObject(bidRequest); + let data = { + id: bidRequest.bidId, + test: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('debug') ? 1 : 0, + cur: ['USD'], + device: { + w: winTop.screen.width, + h: winTop.screen.height, + language: navigator && navigator.language ? navigator.language.indexOf('-') != -1 ? navigator.language.split('-')[0] : navigator.language : '' + }, + site: { + page: location?.page, + host: location?.domain + }, + source: { + tid: bidderRequest?.ortb2?.source?.tid + }, + regs: { + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true ? 1 : 0, + ext: {} + }, + tmax: bidRequest.timeout, + imp: [impObject] + }; + if (bidRequest.gdprConsent && bidRequest.gdprConsent.gdprApplies) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'regs.ext.gdpr', bidRequest.gdprConsent.gdprApplies ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'user.ext.consent', bidRequest.gdprConsent.consentString); + } + if (bidRequest.uspConsent !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'regs.ext.us_privacy', bidRequest.uspConsent); + } + bids.push(data); + } + return { + method: 'POST', + url: endpointURL, + data: bids + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: serverResponse => { + if (!serverResponse || !serverResponse.body) return []; + let GothamAdsResponse = serverResponse.body; + let bids = []; + for (let response of GothamAdsResponse) { + let mediaType = response.seatbid[0].bid[0].ext && response.seatbid[0].bid[0].ext.mediaType ? response.seatbid[0].bid[0].ext.mediaType : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + let bid = { + requestId: response.id, + cpm: response.seatbid[0].bid[0].price, + width: response.seatbid[0].bid[0].w, + height: response.seatbid[0].bid[0].h, + ttl: response.ttl || 1200, + currency: response.cur || 'USD', + netRevenue: true, + creativeId: response.seatbid[0].bid[0].crid, + dealId: response.seatbid[0].bid[0].dealid, + mediaType: mediaType + }; + bid.meta = {}; + if (response.seatbid[0].bid[0].adomain && response.seatbid[0].bid[0].adomain.length > 0) { + bid.meta.advertiserDomains = response.seatbid[0].bid[0].adomain; + } + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + bid.vastXml = response.seatbid[0].bid[0].adm; + bid.vastUrl = response.seatbid[0].bid[0].ext.vastUrl; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + bid.native = parseNative(response.seatbid[0].bid[0].adm); + break; + default: + bid.ad = response.seatbid[0].bid[0].adm; + } + bids.push(bid); + } + return bids; + } +}; + +/** + * Determine type of request + * + * @param bidRequest + * @param type + * @returns {boolean} + */ +const checkRequestType = (bidRequest, type) => { + return typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, `mediaTypes.${type}`) !== 'undefined'; +}; +const parseNative = admObject => { + const { + assets, + link, + imptrackers, + jstracker + } = admObject.native; + const result = { + clickUrl: link.url, + clickTrackers: link.clicktrackers || undefined, + impressionTrackers: imptrackers || undefined, + javascriptTrackers: jstracker ? [jstracker] : undefined + }; + assets.forEach(asset => { + const kind = NATIVE_ASSET_IDS[asset.id]; + const content = kind && asset[NATIVE_PARAMS[kind].name]; + if (content) { + result[kind] = content.text || content.value || { + url: content.url, + width: content.w, + height: content.h + }; + } + }); + return result; +}; +const prepareImpObject = bidRequest => { + let impObject = { + id: bidRequest.bidId, + secure: 1, + ext: { + placementId: bidRequest.params.placementId + } + }; + if (checkRequestType(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)) { + impObject.banner = addBannerParameters(bidRequest); + } + if (checkRequestType(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)) { + impObject.video = addVideoParameters(bidRequest); + } + if (checkRequestType(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE)) { + impObject.native = { + ver: NATIVE_VERSION, + request: addNativeParameters(bidRequest) + }; + } + return impObject; +}; +const addNativeParameters = bidRequest => { + let impObject = { + // TODO: this is not an "impObject", and `id` is not part of the ORTB native spec + id: bidRequest.bidId, + ver: NATIVE_VERSION + }; + const assets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__._map)(bidRequest.mediaTypes.native, (bidParams, key) => { + const props = NATIVE_PARAMS[key]; + const asset = { + required: bidParams.required & 1 + }; + if (props) { + asset.id = props.id; + let wmin, hmin; + let aRatios = bidParams.aspect_ratios; + if (aRatios && aRatios[0]) { + aRatios = aRatios[0]; + wmin = aRatios.min_width || 0; + hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0; + } + if (bidParams.sizes) { + const sizes = flatten(bidParams.sizes); + wmin = sizes[0]; + hmin = sizes[1]; + } + asset[props.name] = {}; + if (bidParams.len) asset[props.name]['len'] = bidParams.len; + if (props.type) asset[props.name]['type'] = props.type; + if (wmin) asset[props.name]['wmin'] = wmin; + if (hmin) asset[props.name]['hmin'] = hmin; + return asset; + } + }).filter(Boolean); + impObject.assets = assets; + return impObject; +}; +const addBannerParameters = bidRequest => { + let bannerObject = {}; + const size = parseSizes(bidRequest, 'banner'); + bannerObject.w = size[0]; + bannerObject.h = size[1]; + return bannerObject; +}; +const parseSizes = (bid, mediaType) => { + let mediaTypes = bid.mediaTypes; + if (mediaType === 'video') { + let size = []; + if (mediaTypes.video && mediaTypes.video.w && mediaTypes.video.h) { + size = [mediaTypes.video.w, mediaTypes.video.h]; + } else if (Array.isArray((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video.playerSize')) && bid.mediaTypes.video.playerSize.length === 1) { + size = bid.mediaTypes.video.playerSize[0]; + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0 && Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1) { + size = bid.sizes[0]; + } + return size; + } + let sizes = []; + if (Array.isArray(mediaTypes.banner.sizes)) { + sizes = mediaTypes.banner.sizes[0]; + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) { + sizes = bid.sizes; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('no sizes are setup or found'); + } + return sizes; +}; +const addVideoParameters = bidRequest => { + let videoObj = {}; + let supportParamsList = ['mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']; + for (let param of supportParamsList) { + if (bidRequest.mediaTypes.video[param] !== undefined) { + videoObj[param] = bidRequest.mediaTypes.video[param]; + } + } + const size = parseSizes(bidRequest, 'video'); + videoObj.w = size[0]; + videoObj.h = size[1]; + return videoObj; +}; +const flatten = arr => { + return [].concat(...arr); +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('gothamadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gothamadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gppControl_usnat"],{ + +/***/ "./modules/gppControl_usnat.js": +/*!*************************************!*\ + !*** ./modules/gppControl_usnat.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_mspa_activityControls_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/mspa/activityControls.js */ "./libraries/mspa/activityControls.js"); + + + +let setupDone = false; +_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('consentManagement', cfg => { + if (cfg?.consentManagement?.gpp != null && !setupDone) { + (0,_libraries_mspa_activityControls_js__WEBPACK_IMPORTED_MODULE_1__.setupRules)('usnat', [7]); + setupDone = true; + } +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('gppControl_usnat'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["mspa","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gppControl_usnat.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gppControl_usstates"],{ + +/***/ "./modules/gppControl_usstates.js": +/*!****************************************!*\ + !*** ./modules/gppControl_usstates.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports normalizer, NORMALIZATIONS, DEFAULT_SID_MAPPING, getSections */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_mspa_activityControls_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/mspa/activityControls.js */ "./libraries/mspa/activityControls.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + +const FIELDS = { + Version: 0, + Gpc: 0, + SharingNotice: 0, + SaleOptOutNotice: 0, + SharingOptOutNotice: 0, + TargetedAdvertisingOptOutNotice: 0, + SensitiveDataProcessingOptOutNotice: 0, + SensitiveDataLimitUseNotice: 0, + SaleOptOut: 0, + SharingOptOut: 0, + TargetedAdvertisingOptOut: 0, + SensitiveDataProcessing: 12, + KnownChildSensitiveDataConsents: 2, + PersonalDataConsents: 0, + MspaCoveredTransaction: 0, + MspaOptOutOptionMode: 0, + MspaServiceProviderMode: 0 +}; + +/** + * Generate a normalization function for converting US state strings to the usnat format. + * + * Scalar fields are copied over if they exist in the input (state) data, or set to null otherwise. + * List fields are also copied, but forced to the "correct" length (by truncating or padding with nulls); + * additionally, elements within them can be moved around using the `move` argument. + * + * @param {Object} opts + * @param {string[]} [opts.nullify] list of fields to force to null + * @param {Object} [opts.move] Map from list field name to an index remapping for elements within that field (using 1 as the first index). + * For example, {SensitiveDataProcessing: {1: 2, 2: [1, 3]}} means "rearrange SensitiveDataProcessing by moving + * the first element to the second position, and the second element to both the first and third position." + * @param {function(Object, Object): void} [opts.fn] an optional function to run once all the processing described above is complete; + * it's passed two arguments, the original (state) data, and its normalized (usnat) version. + * @param {Object} [fields] + * @returns {function(Object): Object} + */ +function normalizer(_ref) { + let { + nullify = [], + move = {}, + fn + } = _ref; + let fields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : FIELDS; + move = Object.fromEntries(Object.entries(move).map(_ref2 => { + let [k, map] = _ref2; + return [k, Object.fromEntries(Object.entries(map).map(_ref3 => { + let [k, v] = _ref3; + return [k, Array.isArray(v) ? v : [v]]; + }).map(_ref4 => { + let [k, v] = _ref4; + return [--k, v.map(el => --el)]; + }))]; + })); + return function (cd) { + const norm = Object.fromEntries(Object.entries(fields).map(_ref5 => { + let [field, len] = _ref5; + let val = null; + if (len > 0) { + val = Array(len).fill(null); + if (Array.isArray(cd[field])) { + const remap = move[field] || {}; + const done = []; + cd[field].forEach((el, i) => { + const [dest, moved] = remap.hasOwnProperty(i) ? [remap[i], true] : [[i], false]; + dest.forEach(d => { + if (d < len && !done.includes(d)) { + val[d] = el; + moved && done.push(d); + } + }); + }); + } + } else if (cd[field] != null) { + val = Array.isArray(cd[field]) ? null : cd[field]; + } + return [field, val]; + })); + nullify.forEach(path => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(norm, path, null)); + fn && fn(cd, norm); + return norm; + }; +} +function scalarMinorsAreChildren(original, normalized) { + normalized.KnownChildSensitiveDataConsents = original.KnownChildSensitiveDataConsents === 0 ? [0, 0] : [1, 1]; +} +const NORMALIZATIONS = { + // normalization rules - convert state consent into usnat consent + // https://docs.prebid.org/features/mspa-usnat.html + 7: consent => consent, + 8: normalizer({ + move: { + SensitiveDataProcessing: { + 1: 9, + 2: 10, + 3: 8, + 4: [1, 2], + 5: 12, + 8: 3, + 9: 4 + } + }, + fn(original, normalized) { + if (original.KnownChildSensitiveDataConsents.some(el => el !== 0)) { + normalized.KnownChildSensitiveDataConsents = [1, 1]; + } + } + }), + 9: normalizer({ + fn: scalarMinorsAreChildren + }), + 10: normalizer({ + fn: scalarMinorsAreChildren + }), + 11: normalizer({ + move: { + SensitiveDataProcessing: { + 3: 4, + 4: 5, + 5: 3 + } + }, + fn: scalarMinorsAreChildren + }), + 12: normalizer({ + fn(original, normalized) { + const cc = original.KnownChildSensitiveDataConsents; + let repl; + if (!cc.some(el => el !== 0)) { + repl = [0, 0]; + } else if (cc[1] === 2 && cc[2] === 2) { + repl = [2, 1]; + } else { + repl = [1, 1]; + } + normalized.KnownChildSensitiveDataConsents = repl; + } + }) +}; +const DEFAULT_SID_MAPPING = { + 8: 'usca', + 9: 'usva', + 10: 'usco', + 11: 'usut', + 12: 'usct' +}; +const getSections = (() => { + const allSIDs = Object.keys(DEFAULT_SID_MAPPING).map(Number); + return function () { + let { + sections = {}, + sids = allSIDs + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return sids.map(sid => { + const logger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.prefixLog)(`Cannot set up MSPA controls for SID ${sid}:`); + const ov = sections[sid] || {}; + const normalizeAs = ov.normalizeAs || sid; + if (!NORMALIZATIONS.hasOwnProperty(normalizeAs)) { + logger.logError(`no normalization rules are known for SID ${normalizeAs}`); + return; + } + const api = ov.name || DEFAULT_SID_MAPPING[sid]; + if (typeof api !== 'string') { + logger.logError(`cannot determine GPP section name`); + return; + } + return [api, [sid], NORMALIZATIONS[normalizeAs]]; + }).filter(el => el != null); + }; +})(); +const handles = []; +_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('consentManagement', cfg => { + const gppConf = cfg.consentManagement?.gpp; + if (gppConf) { + while (handles.length) { + handles.pop()(); + } + getSections(gppConf?.mspa || {}).forEach(_ref6 => { + let [api, sids, normalize] = _ref6; + return handles.push((0,_libraries_mspa_activityControls_js__WEBPACK_IMPORTED_MODULE_3__.setupRules)(api, sids, normalize)); + }); + } +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('gppControl_usstates'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["mspa","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gppControl_usstates.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gptPreAuction"],{ + +/***/ "./modules/gptPreAuction.js": +/*!**********************************!*\ + !*** ./modules/gptPreAuction.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports _currentConfig, getSegments, getSignals, getSignalsArrayByAuctionsIds, getSignalsIntersection, getAuctionsIdsFromTargeting, appendGptSlots, appendPbAdSlot, makeBidRequestsHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +var _this = undefined; + + + + + + + + +const MODULE_NAME = 'GPT Pre-Auction'; +let _currentConfig = {}; +let hooksAdded = false; +function getSegments(fpd, sections, segtax) { + return (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_0__.getSegments)(fpd, sections, segtax); +} +function getSignals(fpd) { + return (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_0__.getSignals)(fpd); +} +function getSignalsArrayByAuctionsIds(auctionIds) { + let index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.index; + const signals = auctionIds.map(auctionId => index.getAuction({ + auctionId + })?.getFPD()?.global).map(getSignals).filter(fpd => fpd); + return signals; +} +function getSignalsIntersection(signals) { + const result = {}; + _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_0__.taxonomies.forEach(taxonomy => { + const allValues = signals.flatMap(x => x).filter(x => x.taxonomy === taxonomy).map(x => x.values); + result[taxonomy] = allValues.length ? allValues.reduce((commonElements, subArray) => { + return commonElements.filter(element => subArray.includes(element)); + }) : []; + result[taxonomy] = { + values: result[taxonomy] + }; + }); + return result; +} +function getAuctionsIdsFromTargeting(targeting) { + let am = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager; + return Object.values(targeting).flatMap(x => Object.entries(x)).filter(entry => entry[0] === _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.AD_ID || entry[0].startsWith(_src_constants_js__WEBPACK_IMPORTED_MODULE_2__.TARGETING_KEYS.AD_ID + '_')).flatMap(entry => entry[1]).map(adId => am.findBidByAdId(adId)?.auctionId).filter(id => id != null).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.uniques); +} +const appendGptSlots = adUnits => { + const { + customGptSlotMatching + } = _currentConfig; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isGptPubadsDefined)()) { + return; + } + const adUnitMap = adUnits.reduce((acc, adUnit) => { + acc[adUnit.code] = acc[adUnit.code] || []; + acc[adUnit.code].push(adUnit); + return acc; + }, {}); + const adUnitPaths = {}; + window.googletag.pubads().getSlots().forEach(slot => { + const matchingAdUnitCode = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(Object.keys(adUnitMap), customGptSlotMatching ? customGptSlotMatching(slot) : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isAdUnitCodeMatchingSlot)(slot)); + if (matchingAdUnitCode) { + const path = adUnitPaths[matchingAdUnitCode] = slot.getAdUnitPath(); + const adserver = { + name: 'gam', + adslot: sanitizeSlotPath(path) + }; + adUnitMap[matchingAdUnitCode].forEach(adUnit => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(adUnit, 'ortb2Imp.ext.data.adserver', Object.assign({}, adUnit.ortb2Imp?.ext?.data?.adserver, adserver)); + }); + } + }); + return adUnitPaths; +}; +const sanitizeSlotPath = path => { + const gptConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('gptPreAuction') || {}; + if (gptConfig.mcmEnabled) { + return path.replace(/(^\/\d*),\d*\//, '$1/'); + } + return path; +}; +const defaultPreAuction = (adUnit, adServerAdSlot, adUnitPath) => { + const context = adUnit.ortb2Imp.ext.data; + + // use pbadslot if supplied + if (context.pbadslot) { + return context.pbadslot; + } + + // confirm that GPT is set up + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isGptPubadsDefined)()) { + return; + } + + // find all GPT slots with this name + var gptSlots = window.googletag.pubads().getSlots().filter(slot => slot.getAdUnitPath() === adUnitPath); + if (gptSlots.length === 0) { + return; // should never happen + } + if (gptSlots.length === 1) { + return adServerAdSlot; + } + + // else the adunit code must be div id. append it. + return `${adServerAdSlot}#${adUnit.code}`; +}; +const appendPbAdSlot = adUnit => { + const context = adUnit.ortb2Imp.ext.data; + const { + customPbAdSlot + } = _currentConfig; + + // use context.pbAdSlot if set (if someone set it already, it will take precedence over others) + if (context.pbadslot) { + return; + } + if (customPbAdSlot) { + context.pbadslot = customPbAdSlot(adUnit.code, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(context, 'adserver.adslot')); + return; + } + + // use data attribute 'data-adslotid' if set + try { + const adUnitCodeDiv = document.getElementById(adUnit.code); + if (adUnitCodeDiv.dataset.adslotid) { + context.pbadslot = adUnitCodeDiv.dataset.adslotid; + return; + } + } catch (e) {} + // banner adUnit, use GPT adunit if defined + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(context, 'adserver.adslot')) { + context.pbadslot = context.adserver.adslot; + return; + } + context.pbadslot = adUnit.code; + return true; +}; +function warnDeprecation(adUnit) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`pbadslot is deprecated and will soon be removed, use gpid instead`, adUnit); +} +const makeBidRequestsHook = function (fn, adUnits) { + const adUnitPaths = appendGptSlots(adUnits); + const { + useDefaultPreAuction, + customPreAuction + } = _currentConfig; + adUnits.forEach(adUnit => { + // init the ortb2Imp if not done yet + adUnit.ortb2Imp = adUnit.ortb2Imp || {}; + adUnit.ortb2Imp.ext = adUnit.ortb2Imp.ext || {}; + adUnit.ortb2Imp.ext.data = adUnit.ortb2Imp.ext.data || {}; + const context = adUnit.ortb2Imp.ext; + // if neither new confs set do old stuff + if (!customPreAuction && !useDefaultPreAuction) { + warnDeprecation(adUnit); + const usedAdUnitCode = appendPbAdSlot(adUnit); + // gpid should be set to itself if already set, or to what pbadslot was (as long as it was not adUnit code) + if (!context.gpid && !usedAdUnitCode) { + context.gpid = context.data.pbadslot; + } + } else { + if (context.data?.pbadslot) { + warnDeprecation(adUnit); + } + let adserverSlot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(context, 'data.adserver.adslot'); + let result; + if (customPreAuction) { + result = customPreAuction(adUnit, adserverSlot, adUnitPaths?.[adUnit.code]); + } else if (useDefaultPreAuction) { + result = defaultPreAuction(adUnit, adserverSlot, adUnitPaths?.[adUnit.code]); + } + if (result) { + context.gpid = context.data.pbadslot = result; + } + } + }); + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + return fn.call(_this, adUnits, ...args); +}; +const setPpsConfigFromTargetingSet = (next, targetingSet) => { + // set gpt config + const auctionsIds = getAuctionsIdsFromTargeting(targetingSet); + const signals = getSignalsIntersection(getSignalsArrayByAuctionsIds(auctionsIds)); + window.googletag.setConfig && window.googletag.setConfig({ + pps: { + taxonomies: signals + } + }); + next(targetingSet); +}; +const handleSetGptConfig = moduleConfig => { + _currentConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(moduleConfig, ['enabled', enabled => enabled !== false, 'customGptSlotMatching', customGptSlotMatching => typeof customGptSlotMatching === 'function' && customGptSlotMatching, 'customPbAdSlot', customPbAdSlot => typeof customPbAdSlot === 'function' && customPbAdSlot, 'customPreAuction', customPreAuction => typeof customPreAuction === 'function' && customPreAuction, 'useDefaultPreAuction', useDefaultPreAuction => useDefaultPreAuction ?? true]); + if (_currentConfig.enabled) { + if (!hooksAdded) { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.getHook)('makeBidRequests').before(makeBidRequestsHook); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.getHook)('targetingDone').after(setPpsConfigFromTargetingSet); + hooksAdded = true; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${MODULE_NAME}: Turning off module`); + _currentConfig = {}; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.getHook)('makeBidRequests').getHooks({ + hook: makeBidRequestsHook + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.getHook)('targetingDone').getHooks({ + hook: setPpsConfigFromTargetingSet + }).remove(); + hooksAdded = false; + } +}; +_src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('gptPreAuction', config => handleSetGptConfig(config.gptPreAuction)); +handleSetGptConfig({}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('gptPreAuction'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gptPreAuction.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gravitoIdSystem"],{ + +/***/ "./modules/gravitoIdSystem.js": +/*!************************************!*\ + !*** ./modules/gravitoIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, cookieKey, gravitoIdSystemSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds gravitompId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/gravitoIdSystem + * @requires module:modules/userId + */ + + + + +const MODULE_NAME = 'gravitompId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const cookieKey = 'gravitompId'; +const gravitoIdSystemSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * performs action to obtain id + * @function + * @returns { {id: {gravitompId: string}} | undefined } + */ + getId: function () { + const newId = storage.getCookie(cookieKey); + if (!newId) { + return undefined; + } + const result = { + gravitompId: newId + }; + return { + id: result + }; + }, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { {gravitompId: string} } value + * @returns { {gravitompId: {string} } | undefined } + */ + decode: function (value) { + if (value && typeof value === 'object') { + var result = {}; + if (value.gravitompId) { + result = value.gravitompId; + } + return { + gravitompId: result + }; + } + return undefined; + }, + eids: { + 'gravitompId': { + source: 'gravito.net', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', gravitoIdSystemSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('gravitoIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gravitoIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["greenbidsAnalyticsAdapter"],{ + +/***/ "./modules/greenbidsAnalyticsAdapter.js": +/*!**********************************************!*\ + !*** ./modules/greenbidsAnalyticsAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ANALYTICS_VERSION, BIDDER_STATUS, isSampled, greenbidsAnalyticsAdapter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +/** + * @typedef {object} Message Payload message sent to the Greenbids API + */ + +const analyticsType = 'endpoint'; +const ANALYTICS_VERSION = '2.3.2'; +const ANALYTICS_SERVER = 'https://a.greenbids.ai'; +const { + AUCTION_INIT, + AUCTION_END, + BID_TIMEOUT, + BILLABLE_EVENT +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const BIDDER_STATUS = { + BID: 'bid', + NO_BID: 'noBid', + TIMEOUT: 'timeout' +}; +const analyticsOptions = {}; +const isSampled = function (greenbidsId, samplingRate, exploratorySamplingSplit) { + const isSamplingForced = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getParameterByName)('greenbids_force_sampling'); + if (isSamplingForced) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Greenbids Analytics: sampling flag detected, forcing analytics'); + return true; + } + if (samplingRate < 0 || samplingRate > 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Sampling rate must be between 0 and 1'); + return true; + } + const exploratorySamplingRate = samplingRate * exploratorySamplingSplit; + const throttledSamplingRate = samplingRate * (1.0 - exploratorySamplingSplit); + const hashInt = parseInt(greenbidsId.slice(-4), 16); + const isPrimarySampled = hashInt < exploratorySamplingRate * (0xFFFF + 1); + if (isPrimarySampled) return true; + const isExtraSampled = hashInt >= (1 - throttledSamplingRate) * (0xFFFF + 1); + return isExtraSampled; +}; +const greenbidsAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + ANALYTICS_SERVER, + analyticsType +}), { + cachedAuctions: {}, + exploratorySamplingSplit: 0.9, + initConfig(config) { + analyticsOptions.options = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(config.options); + /** + * Required option: pbuid + * @type {boolean} + */ + if (typeof analyticsOptions.options.pbuid !== 'string' || analyticsOptions.options.pbuid.length < 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('"options.pbuid" is required.'); + return false; + } + + /** + * Deprecate use of integerated 'sampling' config + * replace by greenbidsSampling + */ + if (typeof analyticsOptions.options.sampling === 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('"options.sampling" is deprecated, please use "greenbidsSampling" instead.'); + analyticsOptions.options.greenbidsSampling = analyticsOptions.options.sampling; + } + + /** + * Discourage unsampled analytics + */ + if (typeof analyticsOptions.options.greenbidsSampling !== 'number' || analyticsOptions.options.greenbidsSampling >= 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('"options.greenbidsSampling" is not set or >=1, using this analytics module unsampled is discouraged.'); + analyticsOptions.options.greenbidsSampling = 1; + } + + /** + * Add optional debug parameter to override exploratorySamplingSplit + */ + if (typeof analyticsOptions.options.exploratorySamplingSplit === 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Greenbids Analytics: Overriding "exploratorySamplingSplit".'); + this.exploratorySamplingSplit = analyticsOptions.options.exploratorySamplingSplit; + } + analyticsOptions.pbuid = config.options.pbuid; + analyticsOptions.server = ANALYTICS_SERVER; + return true; + }, + sendEventMessage(endPoint, data) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`AJAX: ${endPoint}: ` + JSON.stringify(data)); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(`${analyticsOptions.server}${endPoint}`, null, JSON.stringify(data), { + contentType: 'application/json' + }); + }, + /** + * + * @param {string} auctionId + * @returns {Message} + */ + createCommonMessage(auctionId) { + const cachedAuction = this.getCachedAuction(auctionId); + return { + version: ANALYTICS_VERSION, + auctionId: auctionId, + referrer: window.location.href, + sampling: analyticsOptions.options.greenbidsSampling, + prebid: "9.45.0-pre", + greenbidsId: cachedAuction.greenbidsId, + pbuid: analyticsOptions.pbuid, + billingId: cachedAuction.billingId, + adUnits: [] + }; + }, + /** + * @param {Bid} bid + * @param {BIDDER_STATUS} status + */ + serializeBidResponse(bid, status) { + return { + bidder: bid.bidder, + isTimeout: status === BIDDER_STATUS.TIMEOUT, + hasBid: status === BIDDER_STATUS.BID, + params: bid.params && Object.keys(bid.params).length > 0 ? bid.params : {}, + ...(status === BIDDER_STATUS.BID ? { + cpm: bid.cpm, + currency: bid.currency + } : {}) + }; + }, + /** + * @param {*} message Greenbids API payload + * @param {Bid} bid Bid to add to the payload + * @param {BIDDER_STATUS} status Bidding status + */ + addBidResponseToMessage(message, bid, status) { + const adUnitCode = bid.adUnitCode.toLowerCase(); + const adUnitIndex = message.adUnits.findIndex(adUnit => { + return adUnit.code === adUnitCode; + }); + if (adUnitIndex === -1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Trying to add to non registered adunit'); + return; + } + const bidderIndex = message.adUnits[adUnitIndex].bidders.findIndex(bidder => { + return bidder.bidder === bid.bidder; + }); + if (bidderIndex === -1) { + message.adUnits[adUnitIndex].bidders.push(this.serializeBidResponse(bid, status)); + } else { + message.adUnits[adUnitIndex].bidders[bidderIndex].params = bid.params && Object.keys(bid.params).length > 0 ? bid.params : {}; + if (status === BIDDER_STATUS.BID) { + message.adUnits[adUnitIndex].bidders[bidderIndex].hasBid = true; + message.adUnits[adUnitIndex].bidders[bidderIndex].cpm = bid.cpm; + message.adUnits[adUnitIndex].bidders[bidderIndex].currency = bid.currency; + } else if (status === BIDDER_STATUS.TIMEOUT) { + message.adUnits[adUnitIndex].bidders[bidderIndex].isTimeout = true; + } + } + }, + createBidMessage(auctionEndArgs) { + const { + auctionId, + timestamp, + auctionEnd, + adUnits, + bidsReceived, + noBids + } = auctionEndArgs; + const cachedAuction = this.getCachedAuction(auctionId); + const message = this.createCommonMessage(auctionId); + const timeoutBids = cachedAuction.timeoutBids || []; + message.auctionElapsed = auctionEnd - timestamp; + adUnits.forEach(adUnit => { + const adUnitCode = adUnit.code?.toLowerCase() || 'unknown_adunit_code'; + message.adUnits.push({ + code: adUnitCode, + mediaTypes: { + ...(adUnit.mediaTypes?.banner !== undefined && { + banner: adUnit.mediaTypes.banner + }), + ...(adUnit.mediaTypes?.video !== undefined && { + video: adUnit.mediaTypes.video + }), + ...(adUnit.mediaTypes?.native !== undefined && { + native: adUnit.mediaTypes.native + }) + }, + ortb2Imp: adUnit.ortb2Imp || {}, + bidders: [] + }); + }); + + // We enrich noBid then bids, then timeouts, because in case of a timeout, one response from a bidder + // Can be in the 3 arrays, and we want that case reflected in the call + noBids.forEach(bid => this.addBidResponseToMessage(message, bid, BIDDER_STATUS.NO_BID)); + bidsReceived.forEach(bid => this.addBidResponseToMessage(message, bid, BIDDER_STATUS.BID)); + timeoutBids.forEach(bid => this.addBidResponseToMessage(message, bid, BIDDER_STATUS.TIMEOUT)); + return message; + }, + getCachedAuction(auctionId) { + this.cachedAuctions[auctionId] = this.cachedAuctions[auctionId] || { + timeoutBids: [], + greenbidsId: null, + billingId: null, + isSampled: true + }; + return this.cachedAuctions[auctionId]; + }, + handleAuctionInit(auctionInitArgs) { + const cachedAuction = this.getCachedAuction(auctionInitArgs.auctionId); + try { + cachedAuction.greenbidsId = auctionInitArgs.adUnits[0].ortb2Imp.ext.greenbids.greenbidsId; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)("Couldn't find Greenbids RTD info, assuming analytics only"); + cachedAuction.greenbidsId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(); + } + cachedAuction.isSampled = isSampled(cachedAuction.greenbidsId, analyticsOptions.options.greenbidsSampling, this.exploratorySamplingSplit); + }, + handleAuctionEnd(auctionEndArgs) { + const cachedAuction = this.getCachedAuction(auctionEndArgs.auctionId); + const isFilteringForced = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getParameterByName)('greenbids_force_filtering'); + if (!isFilteringForced) { + this.sendEventMessage('/', this.createBidMessage(auctionEndArgs, cachedAuction)); + } + ; + }, + handleBidTimeout(timeoutBids) { + timeoutBids.forEach(bid => { + const cachedAuction = this.getCachedAuction(bid.auctionId); + cachedAuction.timeoutBids.push(bid); + }); + }, + handleBillable(billableArgs) { + const cachedAuction = this.getCachedAuction(billableArgs.auctionId); + /* Filter Greenbids Billable Events only */ + if (billableArgs.vendor === 'greenbidsRtdProvider') { + cachedAuction.billingId = billableArgs.billingId || 'unknown_billing_id'; + } + }, + track(_ref) { + let { + eventType, + args + } = _ref; + try { + if (eventType === AUCTION_INIT) { + this.handleAuctionInit(args); + } + if (this.getCachedAuction(args?.auctionId)?.isSampled ?? true) { + switch (eventType) { + case BID_TIMEOUT: + this.handleBidTimeout(args); + break; + case AUCTION_END: + this.handleAuctionEnd(args); + break; + case BILLABLE_EVENT: + this.handleBillable(args); + break; + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('There was an error handling event ' + eventType); + } + }, + getAnalyticsOptions() { + return analyticsOptions; + } +}); +greenbidsAnalyticsAdapter.originEnableAnalytics = greenbidsAnalyticsAdapter.enableAnalytics; +greenbidsAnalyticsAdapter.enableAnalytics = function (config) { + this.initConfig(config); + if (typeof config.options.sampling === 'number') { + // Set sampling to 1 to prevent prebid analytics integrated sampling to happen + config.options.sampling = 1; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('loading greenbids analytics'); + greenbidsAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: greenbidsAnalyticsAdapter, + code: 'greenbids' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (greenbidsAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('greenbidsAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/greenbidsAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["greenbidsBidAdapter"],{ + +/***/ "./modules/greenbidsBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/greenbidsBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_navigatorData_navigatorData_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/navigatorData/navigatorData.js */ "./libraries/navigatorData/navigatorData.js"); +/* harmony import */ var _libraries_timeToFirstBytesUtils_timeToFirstBytesUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/timeToFirstBytesUtils/timeToFirstBytesUtils.js */ "./libraries/timeToFirstBytesUtils/timeToFirstBytesUtils.js"); +/* harmony import */ var _libraries_pageInfosUtils_pageInfosUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/pageInfosUtils/pageInfosUtils.js */ "./libraries/pageInfosUtils/pageInfosUtils.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'greenbids'; +const GVL_ID = 1232; +const ENDPOINT_URL = 'https://hb.greenbids.ai'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: ['banner', 'video'], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (typeof bid.params !== 'undefined' && parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'placementId')) > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Greenbids bidder adapter valid bid request'); + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Greenbids bidder adapter requires placementId to be defined and a positive number'); + return false; + } + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests array of bids + * @param bidderRequest bidder request object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const bids = validBidRequests.map(bids => { + const reqObj = {}; + let placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bids.params, 'placementId'); + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bids, 'ortb2Imp.ext.gpid'); + reqObj.sizes = getSizes(bids); + reqObj.bidId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidId', bids); + reqObj.bidderRequestId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidderRequestId', bids); + reqObj.placementId = parseInt(placementId, 10); + reqObj.adUnitCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('adUnitCode', bids); + reqObj.transactionId = bids.ortb2Imp?.ext?.tid || ''; + if (gpid) { + reqObj.gpid = gpid; + } + }); + const topWindow = window.top; + const payload = { + referrer: (0,_libraries_pageInfosUtils_pageInfosUtils_js__WEBPACK_IMPORTED_MODULE_3__.getReferrerInfo)(bidderRequest), + pageReferrer: document.referrer, + pageTitle: (0,_libraries_pageInfosUtils_pageInfosUtils_js__WEBPACK_IMPORTED_MODULE_3__.getPageTitle)().slice(0, 300), + pageDescription: (0,_libraries_pageInfosUtils_pageInfosUtils_js__WEBPACK_IMPORTED_MODULE_3__.getPageDescription)().slice(0, 300), + networkBandwidth: (0,_libraries_pageInfosUtils_pageInfosUtils_js__WEBPACK_IMPORTED_MODULE_3__.getConnectionDownLink)(window.navigator), + timeToFirstByte: (0,_libraries_timeToFirstBytesUtils_timeToFirstBytesUtils_js__WEBPACK_IMPORTED_MODULE_4__.getTimeToFirstByte)(window), + data: bids, + device: bidderRequest?.ortb2?.device || {}, + deviceWidth: screen.width, + deviceHeight: screen.height, + devicePixelRatio: topWindow.devicePixelRatio, + screenOrientation: screen.orientation?.type, + historyLength: (0,_libraries_navigatorData_navigatorData_js__WEBPACK_IMPORTED_MODULE_5__.getHLen)(), + viewportHeight: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().visualViewport.height, + viewportWidth: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().visualViewport.width, + prebid_version: "9.45.0-pre" + }; + const firstBidRequest = validBidRequests[0]; + if (firstBidRequest.schain) { + payload.schain = firstBidRequest.schain; + } + hydratePayloadWithGppConsentData(payload, bidderRequest.gppConsent); + hydratePayloadWithGdprConsentData(payload, bidderRequest.gdprConsent); + hydratePayloadWithUspConsentData(payload, bidderRequest.uspConsent); + const userAgentClientHints = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(firstBidRequest, 'ortb2.device.sua'); + if (userAgentClientHints) { + payload.userAgentClientHints = userAgentClientHints; + } + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.regs.ext.dsa'); + if (dsa) { + payload.dsa = dsa; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server response. + */ + interpretResponse: function (serverResponse) { + serverResponse = serverResponse.body; + if (!serverResponse.responses) { + return []; + } + return serverResponse.responses.map(bid => { + const bidResponse = { + cpm: bid.cpm, + width: bid.width, + height: bid.height, + currency: bid.currency, + netRevenue: true, + size: bid.size, + ttl: bid.ttl, + meta: { + advertiserDomains: bid && bid.adomain ? bid.adomain : [] + }, + ad: bid.ad, + requestId: bid.bidId, + creativeId: bid.creativeId, + placementId: bid.placementId + }; + if (bid.dealId) { + bidResponse.dealId = bid.dealId; + } + if (bid?.ext?.dsa) { + bidResponse.meta.dsa = bid.ext.dsa; + } + return bidResponse; + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); + +/** + * Converts the sizes from the bid object to the required format. + * + * @param {Object} bid - The bid object containing size information. + * @param {Array} bid.sizes - The sizes array from the bid object. + * @returns {Array} - The parsed sizes in the required format. + */ +function getSizes(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bid.sizes); +} + +// Privacy handling + +/** + * Hydrates the given payload with GPP consent data if available. + * + * @param {Object} payload - The payload object to be hydrated. + * @param {Object} gppData - The GPP consent data object. + * @param {string} gppData.gppString - The GPP consent string. + * @param {number[]} gppData.applicableSections - An array of applicable section IDs. + */ +function hydratePayloadWithGppConsentData(payload, gppData) { + if (!gppData) { + return; + } + let isValidConsentString = typeof gppData.gppString === 'string'; + let validateApplicableSections = Array.isArray(gppData.applicableSections) && gppData.applicableSections.every(section => typeof section === 'number'); + payload.gpp = { + consentString: isValidConsentString ? gppData.gppString : '', + applicableSectionIds: validateApplicableSections ? gppData.applicableSections : [] + }; +} + +/** + * Hydrates the given payload with GDPR consent data if available. + * + * @param {Object} payload - The payload object to be hydrated with GDPR consent data. + * @param {Object} gdprData - The GDPR data object containing consent information. + * @param {boolean} gdprData.gdprApplies - Indicates if GDPR applies. + * @param {string} gdprData.consentString - The GDPR consent string. + * @param {number} gdprData.apiVersion - The version of the GDPR API being used. + * @param {Object} gdprData.vendorData - Additional vendor data related to GDPR. + */ +function hydratePayloadWithGdprConsentData(payload, gdprData) { + if (!gdprData) { + return; + } + let isCmp = typeof gdprData.gdprApplies === 'boolean'; + let isConsentString = typeof gdprData.consentString === 'string'; + let status = isCmp ? findGdprStatus(gdprData.gdprApplies, gdprData.vendorData) : gdprStatus.CMP_NOT_FOUND_OR_ERROR; + payload.gdpr_iab = { + consent: isConsentString ? gdprData.consentString : '', + status: status, + apiVersion: gdprData.apiVersion + }; +} + +/** + * Adds USP (CCPA) consent data to the payload if available. + * + * @param {Object} payload - The payload object to be hydrated with USP consent data. + * @param {string} uspConsentData - The USP consent string to be added to the payload. + */ +function hydratePayloadWithUspConsentData(payload, uspConsentData) { + if (!uspConsentData) { + return; + } + payload.us_privacy = uspConsentData; +} +const gdprStatus = { + GDPR_APPLIES_PUBLISHER: 12, + GDPR_APPLIES_GLOBAL: 11, + GDPR_DOESNT_APPLY: 0, + CMP_NOT_FOUND_OR_ERROR: 22 +}; + +/** + * Determines the GDPR status based on whether GDPR applies and the provided GDPR data. + * + * @param {boolean} gdprApplies - Indicates if GDPR applies. + * @param {Object} gdprData - The GDPR data object. + * @param {boolean} gdprData.isServiceSpecific - Indicates if the GDPR data is service-specific. + * @returns {string} The GDPR status. + */ +function findGdprStatus(gdprApplies, gdprData) { + let status = gdprStatus.GDPR_APPLIES_PUBLISHER; + if (gdprApplies) { + if (gdprData && !gdprData.isServiceSpecific) { + status = gdprStatus.GDPR_APPLIES_GLOBAL; + } + } else { + status = gdprStatus.GDPR_DOESNT_APPLY; + } + return status; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('greenbidsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["navigatorData","timeToFirstBytesUtils","pageInfosUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/greenbidsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["greenbidsRtdProvider"],{ + +/***/ "./modules/greenbidsRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/greenbidsRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export greenbidsSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + +const MODULE_NAME = 'greenbidsRtdProvider'; +const MODULE_VERSION = '2.0.1'; +const ENDPOINT = 'https://t.greenbids.ai'; +const rtdOptions = {}; +function init(moduleConfig) { + let params = moduleConfig?.params; + if (!params?.pbuid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Greenbids pbuid is not set!'); + return false; + } else { + rtdOptions.pbuid = params?.pbuid; + rtdOptions.timeout = params?.timeout || 200; + return true; + } +} +function onAuctionInitEvent(auctionDetails) { + /* Emitting one billing event per auction */ + let defaultId = 'default_id'; + let greenbidsId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(auctionDetails.adUnits[0], 'ortb2Imp.ext.greenbids.greenbidsId', defaultId); + /* greenbids was successfully called so we emit the event */ + if (greenbidsId !== defaultId) { + _src_events_js__WEBPACK_IMPORTED_MODULE_2__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BILLABLE_EVENT, { + type: 'auction', + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(), + auctionId: auctionDetails.auctionId, + vendor: MODULE_NAME + }); + } +} +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + let greenbidsId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + let promise = createPromise(reqBidsConfigObj, greenbidsId); + promise.then(callback); +} +function createPromise(reqBidsConfigObj, greenbidsId) { + return new Promise(resolve => { + const timeoutId = setTimeout(() => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('GreenbidsRtdProvider: Greenbids API timeout, skipping shaping'); + resolve(reqBidsConfigObj); + }, rtdOptions.timeout); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(ENDPOINT, { + success: response => { + processSuccessResponse(response, timeoutId, reqBidsConfigObj, greenbidsId); + resolve(reqBidsConfigObj); + }, + error: () => { + clearTimeout(timeoutId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('GreenbidsRtdProvider: Greenbids API response error, skipping shaping'); + resolve(reqBidsConfigObj); + } + }, createPayload(reqBidsConfigObj, greenbidsId), { + contentType: 'application/json', + customHeaders: { + 'Greenbids-Pbuid': rtdOptions.pbuid + } + }); + }); +} +function processSuccessResponse(response, timeoutId, reqBidsConfigObj, greenbidsId) { + clearTimeout(timeoutId); + try { + const responseAdUnits = JSON.parse(response); + updateAdUnitsBasedOnResponse(reqBidsConfigObj.adUnits, responseAdUnits, greenbidsId); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('GreenbidsRtdProvider: Greenbids API response parsing error, skipping shaping'); + } +} +function updateAdUnitsBasedOnResponse(adUnits, responseAdUnits, greenbidsId) { + const isFilteringForced = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)('greenbids_force_filtering'); + const isFilteringDisabled = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getParameterByName)('greenbids_disable_filtering'); + adUnits.forEach(adUnit => { + const matchingAdUnit = findMatchingAdUnit(responseAdUnits, adUnit.code); + if (matchingAdUnit) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(adUnit, 'ortb2Imp.ext.greenbids', { + greenbidsId: greenbidsId, + keptInAuction: matchingAdUnit.bidders, + isExploration: matchingAdUnit.isExploration + }); + if (matchingAdUnit.isExploration || isFilteringDisabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Greenbids Rtd: either exploration traffic, or disabled filtering flag detected'); + } else if (isFilteringForced) { + adUnit.bids = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Greenbids Rtd: filtering flag detected, forcing filtering of Rtd module.'); + } else { + removeFalseBidders(adUnit, matchingAdUnit); + } + } + }); +} +function findMatchingAdUnit(responseAdUnits, adUnitCode) { + return responseAdUnits.find(responseAdUnit => responseAdUnit.code === adUnitCode); +} +function removeFalseBidders(adUnit, matchingAdUnit) { + const falseBidders = getFalseBidders(matchingAdUnit.bidders); + adUnit.bids = adUnit.bids.filter(bidRequest => !falseBidders.includes(bidRequest.bidder)); +} +function getFalseBidders(bidders) { + return Object.entries(bidders).filter(_ref => { + let [bidder, shouldKeep] = _ref; + return !shouldKeep; + }).map(_ref2 => { + let [bidder] = _ref2; + return bidder; + }); +} +function stripAdUnits(adUnits) { + const stripedAdUnits = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(adUnits); + return stripedAdUnits.map(adUnit => { + adUnit.bids = adUnit.bids.map(bid => { + return { + bidder: bid.bidder + }; + }); + return adUnit; + }); +} +function createPayload(reqBidsConfigObj, greenbidsId) { + return JSON.stringify({ + version: MODULE_VERSION, + ...rtdOptions, + referrer: window.location.href, + prebid: "9.45.0-pre", + greenbidsId: greenbidsId, + adUnits: stripAdUnits(reqBidsConfigObj.adUnits) + }); +} +const greenbidsSubmodule = { + name: MODULE_NAME, + init: init, + onAuctionInitEvent: onAuctionInitEvent, + getBidRequestData: getBidRequestData, + updateAdUnitsBasedOnResponse: updateAdUnitsBasedOnResponse, + findMatchingAdUnit: findMatchingAdUnit, + removeFalseBidders: removeFalseBidders, + getFalseBidders: getFalseBidders, + stripAdUnits: stripAdUnits +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('realTimeData', greenbidsSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('greenbidsRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/greenbidsRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gridBidAdapter"],{ + +/***/ "./modules/gridBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/gridBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec, resetUserSync, getSyncUrl */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_processResponse_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/processResponse/index.js */ "./libraries/processResponse/index.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +const BIDDER_CODE = 'grid'; +const ENDPOINT_URL = 'https://grid.bidswitch.net/hbjson'; +const USP_DELETE_DATA_HANDLER = 'https://media.grid.bidswitch.net/uspapi_delete_c2s'; +const SYNC_URL = 'https://x.bidswitch.net/sync?ssp=themediagrid'; +const TIME_TO_LIVE = 360; +const USER_ID_KEY = 'tmguid'; +const GVLID = 686; +const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const LOG_ERROR_MESS = { + noAdid: 'Bid from response has no adid parameter - ', + noAdm: 'Bid from response has no adm parameter - ', + noBid: 'Array of bid objects is empty', + emptyUids: 'Uids should be not empty', + emptySeatbid: 'Seatbid array from response has empty item', + emptyResponse: 'Response is empty', + hasEmptySeatbidArray: 'Response has empty seatbid array', + hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - ' +}; +const ALIAS_CONFIG = { + 'trustx': { + endpoint: 'https://grid.bidswitch.net/hbjson?sp=trustx', + syncurl: 'https://x.bidswitch.net/sync?ssp=themediagrid', + bidResponseExternal: { + netRevenue: false + } + }, + 'gridNM': { + defaultParams: { + multiRequest: true + } + } +}; +let hasSynced = false; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: ['playwire', 'adlivetech', 'gridNM', { + code: 'trustx', + skipPbsAliasing: true + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return bid && Boolean(bid.params.uid || bid.params.secid); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {bidderRequest} bidderRequest bidder request object + * @return {ServerRequest[]} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + if (!validBidRequests.length) { + return null; + } + let pageKeywords = null; + let content = null; + let schain = null; + let userIdAsEids = null; + let user = null; + let userExt = null; + let endpoint = null; + let forceBidderName = false; + let { + bidderRequestId, + gdprConsent, + uspConsent, + timeout, + refererInfo, + gppConsent + } = bidderRequest || {}; + const referer = refererInfo ? encodeURIComponent(refererInfo.page) : ''; + const tmax = parseInt(timeout) || null; + const imp = []; + const bidsMap = {}; + const requests = []; + const sources = []; + const bidsArray = []; + validBidRequests.forEach(bid => { + const bidObject = { + bid, + savedPrebidBid: null + }; + if (!bid.params.uid && !bid.params.secid) { + return; + } + if (!bidderRequestId) { + bidderRequestId = bid.bidderRequestId; + } + if (!schain) { + schain = bid.schain; + } + if (!userIdAsEids) { + userIdAsEids = bid.userIdAsEids; + } + if (!endpoint) { + endpoint = ALIAS_CONFIG[bid.bidder] && ALIAS_CONFIG[bid.bidder].endpoint; + } + const { + params, + mediaTypes, + bidId, + adUnitCode, + rtd, + ortb2Imp + } = bid; + const { + defaultParams + } = ALIAS_CONFIG[bid.bidder] || {}; + const { + secid, + pubid, + source, + uid, + keywords, + forceBidder, + multiRequest, + content: bidParamsContent, + video: videoParams + } = { + ...defaultParams, + ...params + }; + const bidFloor = _getFloor(mediaTypes || {}, bid); + const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting; + if (jwTargeting && !content && jwTargeting.content) { + content = jwTargeting.content; + } + let impObj = { + id: bidId.toString(), + tagid: (secid || uid).toString(), + ext: { + divid: adUnitCode.toString() + } + }; + if (ortb2Imp) { + if (ortb2Imp.instl) { + impObj.instl = parseInt(ortb2Imp.instl) || null; + } + if (ortb2Imp.ext) { + impObj.ext.gpid = ortb2Imp.ext.gpid?.toString() || ortb2Imp.ext.data?.pbadslot?.toString() || ortb2Imp.ext.data?.adserver?.adslot?.toString(); + if (ortb2Imp.ext.data) { + impObj.ext.data = ortb2Imp.ext.data; + } + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(keywords)) { + if (!pageKeywords) { + pageKeywords = keywords; + } + impObj.ext.bidder = { + keywords + }; + } + if (bidFloor) { + impObj.bidfloor = bidFloor; + } + if (!mediaTypes || mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER]) { + const banner = createBannerRequest(bid, mediaTypes ? mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER] : {}); + if (banner) { + impObj.banner = banner; + } + } + if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO]) { + const video = createVideoRequest(videoParams, mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], bid.sizes); + if (video) { + impObj.video = video; + } + } + if (impObj.banner || impObj.video) { + if (multiRequest) { + const reqSource = { + tid: bidderRequest?.ortb2?.source?.tid?.toString?.(), + ext: { + wrapper: 'Prebid_js', + wrapper_version: "9.45.0-pre" + } + }; + if (bid.schain) { + reqSource.ext.schain = bid.schain; + } + const request = { + id: bid.bidderRequestId && bid.bidderRequestId.toString(), + site: { + page: referer + }, + tmax, + source: reqSource, + imp: [impObj] + }; + if (pubid) { + request.site.publisher = { + id: pubid + }; + } + const siteContent = bidParamsContent || jwTargeting && jwTargeting.content; + if (siteContent) { + request.site.content = siteContent; + } + requests.push(request); + sources.push(source); + bidsArray.push(bidObject); + } else { + bidsMap[bidId] = bidObject; + imp.push(impObj); + } + } + if (!forceBidderName && forceBidder && ALIAS_CONFIG[forceBidder]) { + forceBidderName = forceBidder; + } + }); + forceBidderName = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('forceBidderName') || forceBidderName; + if (forceBidderName && ALIAS_CONFIG[forceBidderName]) { + endpoint = ALIAS_CONFIG[forceBidderName].endpoint; + this.forceBidderName = forceBidderName; + } + const reqSource = { + tid: bidderRequest?.ortb2?.source?.tid?.toString?.(), + ext: { + wrapper: 'Prebid_js', + wrapper_version: "9.45.0-pre" + } + }; + if (schain) { + reqSource.ext.schain = schain; + } + const mainRequest = imp.length || !requests.length ? { + id: bidderRequestId && bidderRequestId.toString(), + site: { + page: referer + }, + tmax, + source: reqSource, + imp + } : null; + if (content) { + mainRequest.site.content = content; + } + [...requests, mainRequest].forEach(request => { + if (!request) { + return; + } + user = null; + const ortb2UserData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.user.data'); + if (ortb2UserData && ortb2UserData.length) { + user = { + data: [...ortb2UserData] + }; + } + if (gdprConsent && gdprConsent.consentString) { + userExt = { + consent: gdprConsent.consentString + }; + } + const ortb2UserExtDevice = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.user.ext.device'); + if (ortb2UserExtDevice) { + userExt = userExt || {}; + userExt.device = { + ...ortb2UserExtDevice + }; + } + + // if present, add device data object from ortb2 to the request + if (bidderRequest?.ortb2?.device) { + request.device = bidderRequest.ortb2.device; + } + if (userIdAsEids && userIdAsEids.length) { + userExt = userExt || {}; + userExt.eids = [...userIdAsEids]; + } + if (userExt && Object.keys(userExt).length) { + user = user || {}; + user.ext = userExt; + } + const fpdUserId = getUserIdFromFPDStorage(); + if (fpdUserId) { + user = user || {}; + user.id = fpdUserId.toString(); + } + if (user) { + request.user = user; + } + const userKeywords = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.user.keywords') || null; + const siteKeywords = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.site.keywords') || null; + if (userKeywords) { + pageKeywords = pageKeywords || {}; + pageKeywords.user = pageKeywords.user || {}; + pageKeywords.user.ortb2 = [{ + name: 'keywords', + keywords: userKeywords.split(',') + }]; + } + if (siteKeywords) { + pageKeywords = pageKeywords || {}; + pageKeywords.site = pageKeywords.site || {}; + pageKeywords.site.ortb2 = [{ + name: 'keywords', + keywords: siteKeywords.split(',') + }]; + } + if (pageKeywords) { + pageKeywords = reformatKeywords(pageKeywords); + if (pageKeywords) { + request.ext = { + keywords: pageKeywords + }; + } + } + if (gdprConsent && gdprConsent.gdprApplies) { + request.regs = { + ext: { + gdpr: gdprConsent.gdprApplies ? 1 : 0 + } + }; + } + const ortb2Regs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.regs') || {}; + if (gppConsent || ortb2Regs?.gpp) { + const gpp = { + gpp: gppConsent?.gppString ?? ortb2Regs?.gpp, + gpp_sid: gppConsent?.applicableSections ?? ortb2Regs?.gpp_sid + }; + request.regs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(request?.regs ?? {}, gpp); + } + if (uspConsent) { + if (!request.regs) { + request.regs = { + ext: {} + }; + } + if (!request.regs.ext) { + request.regs.ext = {}; + } + request.regs.ext.us_privacy = uspConsent; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + if (!request.regs) { + request.regs = {}; + } + request.regs.coppa = 1; + } + if (ortb2Regs?.ext?.dsa) { + if (!request.regs) { + request.regs = { + ext: {} + }; + } + if (!request.regs.ext) { + request.regs.ext = {}; + } + request.regs.ext.dsa = ortb2Regs.ext.dsa; + } + const site = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'ortb2.site'); + if (site) { + const pageCategory = [...(site.cat || []), ...(site.pagecat || [])].filter(category => { + return category && typeof category === 'string'; + }); + if (pageCategory.length) { + request.site.cat = pageCategory; + } + const genre = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(site, 'content.genre'); + if (genre && typeof genre === 'string') { + request.site.content = { + ...request.site.content, + genre + }; + } + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(site, 'content.data'); + if (data && data.length) { + const siteContent = request.site.content || {}; + request.site.content = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(siteContent, { + data + }); + } + const id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(site, 'content.id'); + if (id) { + request.site.content = { + ...request.site.content, + id + }; + } + } + }); + return [...requests.map((req, i) => { + let sp; + const url = (endpoint || ENDPOINT_URL).replace(/[?&]sp=([^?&=]+)/, (i, found) => { + if (found) { + sp = found; + } + return ''; + }); + let currentSource = sources[i] || sp; + const urlWithParams = url + (url.indexOf('?') > -1 ? '&' : '?') + 'no_mapping=1' + (currentSource ? `&sp=${currentSource}` : ''); + return { + method: 'POST', + url: urlWithParams, + data: JSON.stringify(req), + bidObject: bidsArray[i] + }; + }), ...(mainRequest ? [{ + method: 'POST', + url: endpoint || ENDPOINT_URL, + data: JSON.stringify(mainRequest), + bidsMap + }] : [])]; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {*} bidRequest + * @param {*} RendererConst + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let RendererConst = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer; + serverResponse = serverResponse && serverResponse.body; + const bidResponses = []; + let errorMessage; + if (!serverResponse) errorMessage = LOG_ERROR_MESS.emptyResponse;else if (serverResponse.seatbid && !serverResponse.seatbid.length) { + errorMessage = LOG_ERROR_MESS.hasEmptySeatbidArray; + } + const bidderCode = this.forceBidderName || this.code; + if (!errorMessage && serverResponse.seatbid) { + serverResponse.seatbid.forEach(respItem => { + _addBidResponse((0,_libraries_processResponse_index_js__WEBPACK_IMPORTED_MODULE_6__.getBidFromResponse)(respItem, LOG_ERROR_MESS), bidRequest, bidResponses, RendererConst, bidderCode); + }); + } + if (errorMessage) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(errorMessage); + return bidResponses; + }, + getUserSyncs: function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + const [syncOptions,, gdprConsent, uspConsent] = args; + if (!hasSynced && syncOptions.pixelEnabled) { + let params = ''; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params += `&gdpr=${Number(gdprConsent.gdprApplies)}`; + } + if (typeof gdprConsent.consentString === 'string') { + params += `&gdpr_consent=${gdprConsent.consentString}`; + } + } + if (uspConsent) { + params += `&us_privacy=${uspConsent}`; + } + const bidderCode = this.forceBidderName || this.code; + const syncUrl = ALIAS_CONFIG[bidderCode] && ALIAS_CONFIG[bidderCode].syncurl || SYNC_URL; + hasSynced = true; + return { + type: 'image', + url: syncUrl + params + }; + } + }, + ajaxCall: function (url, cb, data, options) { + options.browsingTopics = false; + return (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(url, cb, data, options); + }, + onDataDeletionRequest: function (data) { + spec.ajaxCall(USP_DELETE_DATA_HANDLER, null, null, { + method: 'GET' + }); + } +}; + +/** + * Gets bidfloor + * @param {Object} mediaTypes + * @param {Object} bid + * @returns {Number} floor + */ +function _getFloor(mediaTypes, bid) { + const curMediaType = mediaTypes.video ? 'video' : 'banner'; + let floor = parseFloat(bid.params.bidFloor || bid.params.floorcpm || 0) || null; + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: curMediaType, + size: bid.sizes.map(_ref => { + let [w, h] = _ref; + return { + w, + h + }; + }) + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = Math.max(floor, parseFloat(floorInfo.floor)); + } + } + return floor; +} +function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bidderCode) { + if (!serverBid) return; + let errorMessage; + if (!serverBid.adid) errorMessage = LOG_ERROR_MESS.noAdid + JSON.stringify(serverBid); + if (!errorMessage && !serverBid.adm && !serverBid.nurl) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);else { + const bidObject = bidRequest.bidsMap ? bidRequest.bidsMap[serverBid.impid] : bidRequest.bidObject; + const { + bid, + savedPrebidBid + } = bidObject || {}; + if (bid && canPublishResponse(serverBid.price, savedPrebidBid && savedPrebidBid.cpm)) { + const bidResponse = { + requestId: bid.bidId, + // bid.bidderRequestId + cpm: serverBid.price, + width: serverBid.w, + height: serverBid.h, + creativeId: serverBid.adid, + currency: 'USD', + netRevenue: true, + ttl: TIME_TO_LIVE, + meta: { + advertiserDomains: serverBid.adomain ? serverBid.adomain : [] + }, + dealId: serverBid.dealid + }; + bidObject.savedPrebidBid = bidResponse; + if (serverBid.ext && serverBid.ext.bidder && serverBid.ext.bidder.grid && serverBid.ext.bidder.grid.demandSource) { + bidResponse.adserverTargeting = { + 'hb_ds': serverBid.ext.bidder.grid.demandSource + }; + bidResponse.meta.demandSource = serverBid.ext.bidder.grid.demandSource; + } + if (serverBid.ext && serverBid.ext.dsa) { + bidResponse.meta.dsa = serverBid.ext.dsa; + } + if (serverBid.content_type === 'video') { + if (serverBid.adm) { + bidResponse.vastXml = serverBid.adm; + bidResponse.adResponse = { + content: bidResponse.vastXml + }; + } else if (serverBid.nurl) { + bidResponse.vastUrl = serverBid.nurl; + } + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + if (!bid.renderer && (!bid.mediaTypes || !bid.mediaTypes.video || bid.mediaTypes.video.context === 'outstream')) { + bidResponse.renderer = createRenderer(bidResponse, { + id: bid.bidId, + url: RENDERER_URL + }, RendererConst); + } + } else { + bidResponse.ad = serverBid.adm; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } + const bidResponseExternal = ALIAS_CONFIG[bidderCode] && ALIAS_CONFIG[bidderCode].bidResponseExternal || {}; + bidResponses.push((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(bidResponse, bidResponseExternal)); + } + } + if (errorMessage) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(errorMessage); + } +} +function createVideoRequest(videoParams, mediaType, bidSizes) { + const { + mind, + maxd, + size, + playerSize, + protocols, + durationRangeSec = [], + ...videoData + } = { + ...mediaType, + ...videoParams + }; + if (size && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(size)) { + const sizeArray = size.split('x'); + if (sizeArray.length === 2 && parseInt(sizeArray[0]) && parseInt(sizeArray[1])) { + videoData.w = parseInt(sizeArray[0]); + videoData.h = parseInt(sizeArray[1]); + } + } + if (!videoData.w || !videoData.h) { + const pSizesString = (playerSize || bidSizes || []).toString(); + const pSizeString = (pSizesString.match(/^\d+,\d+/) || [])[0]; + const pSize = pSizeString && pSizeString.split(',').map(d => parseInt(d)); + if (pSize && pSize.length === 2) { + Object.assign(videoData, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArrayToRtbSize)(pSize)); + } + } + if (!videoData.w || !videoData.h) return; + const minDur = mind || durationRangeSec[0] || parseInt(videoData.minduration) || null; + const maxDur = maxd || durationRangeSec[1] || parseInt(videoData.maxduration) || null; + if (minDur) { + videoData.minduration = minDur; + } + if (maxDur) { + videoData.maxduration = maxDur; + } + if (protocols && protocols.length) { + videoData.protocols = protocols; + } + return videoData; +} +function createBannerRequest(bid, mediaType) { + const sizes = mediaType.sizes || bid.sizes; + if (!sizes || !sizes.length) return; + let format = sizes.map(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArrayToRtbSize)(size)); + let result = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArrayToRtbSize)(sizes[0]); + if (format.length) { + result.format = format; + } + return result; +} +function makeNewUserIdInFPDStorage() { + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('localStorageWriteAllowed')) { + const value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)().replace(/-/g, ''); + storage.setDataInLocalStorage(USER_ID_KEY, value); + return value; + } + return null; +} +function getUserIdFromFPDStorage() { + return storage.getDataFromLocalStorage(USER_ID_KEY) || makeNewUserIdInFPDStorage(); +} +function reformatKeywords(pageKeywords) { + const formatedPageKeywords = {}; + Object.keys(pageKeywords).forEach(name => { + const keywords = pageKeywords[name]; + if (keywords) { + if (name === 'site' || name === 'user') { + const formatedKeywords = {}; + Object.keys(keywords).forEach(pubName => { + if (Array.isArray(keywords[pubName])) { + const formatedPublisher = []; + keywords[pubName].forEach(pubItem => { + if (typeof pubItem === 'object' && pubItem.name) { + const formatedPubItem = { + name: pubItem.name, + segments: [] + }; + Object.keys(pubItem).forEach(key => { + if (Array.isArray(pubItem[key])) { + pubItem[key].forEach(keyword => { + if (keyword) { + if (typeof keyword === 'string') { + formatedPubItem.segments.push({ + name: key, + value: keyword + }); + } else if (key === 'segments' && typeof keyword.name === 'string' && typeof keyword.value === 'string') { + formatedPubItem.segments.push(keyword); + } + } + }); + } + }); + if (formatedPubItem.segments.length) { + formatedPublisher.push(formatedPubItem); + } + } + }); + if (formatedPublisher.length) { + formatedKeywords[pubName] = formatedPublisher; + } + } + }); + formatedPageKeywords[name] = formatedKeywords; + } else { + formatedPageKeywords[name] = keywords; + } + } + }); + return Object.keys(formatedPageKeywords).length && formatedPageKeywords; +} +function canPublishResponse(price, savedPrice) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(savedPrice)) { + return price > savedPrice || price === savedPrice && Math.random() > 0.5; + } + return true; +} +function outstreamRender(bid) { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + targetId: bid.adUnitCode, + adResponse: bid.adResponse + }); + }); +} +function createRenderer(bid, rendererParams, RendererConst) { + const renderer = RendererConst.install({ + id: rendererParams.id, + url: rendererParams.url, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function resetUserSync() { + hasSynced = false; +} +function getSyncUrl() { + return SYNC_URL; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('gridBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["processResponse","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gridBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["growadvertisingBidAdapter"],{ + +/***/ "./modules/growadvertisingBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/growadvertisingBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +const BIDDER_CODE = 'growads'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: function (bid) { + return bid.params && !!bid.params.zoneId; + }, + buildRequests: function (validBidRequests) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let zoneId; + let domain; + let requestURI; + let data = {}; + const zoneCounters = {}; + return validBidRequests.map(bidRequest => { + zoneId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('zoneId', bidRequest.params); + domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('domain', bidRequest.params); + if (!(zoneId in zoneCounters)) { + zoneCounters[zoneId] = 0; + } + if (typeof domain === 'undefined' || domain.length === 0) { + domain = 'portal.growadvertising.com'; + } + requestURI = 'https://' + domain + '/adserve/bid'; + data = { + type: 'prebidjs', + zoneId: zoneId, + i: zoneCounters[zoneId] + }; + zoneCounters[zoneId]++; + return { + method: 'GET', + url: requestURI, + data: data, + bidRequest: bidRequest + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + const request = bidRequest.bidRequest; + let bidResponses = []; + let CPM; + let width; + let height; + let response; + let isCorrectSize = false; + let isCorrectCPM = true; + let minCPM; + let maxCPM; + let bid = {}; + let body = serverResponse.body; + try { + response = JSON.parse(body); + } catch (ex) { + response = body; + } + if (response && response.status === 'success' && request) { + CPM = parseFloat(response.cpm); + width = parseInt(response.width); + height = parseInt(response.height); + minCPM = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('minCPM', request.params); + maxCPM = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('maxCPM', request.params); + width = parseInt(response.width); + height = parseInt(response.height); + + // Ensure response CPM is within the given bounds + if (minCPM !== '' && CPM < parseFloat(minCPM)) { + isCorrectCPM = false; + } + if (maxCPM !== '' && CPM > parseFloat(maxCPM)) { + isCorrectCPM = false; + } + if (isCorrectCPM) { + bid = { + requestId: request.bidId, + bidderCode: request.bidder, + creativeId: response.creativeId, + cpm: CPM, + width: width, + height: height, + currency: response.currency, + netRevenue: true, + ttl: response.ttl, + adUnitCode: request.adUnitCode, + // TODO: is 'page' the right value here? + referrer: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request, 'refererInfo.page') + }; + if (response.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE)) { + bid[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE] = { + title: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].title, + body: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].body, + body2: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].body2, + cta: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].cta, + sponsoredBy: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].sponsoredBy, + clickUrl: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].clickUrl, + impressionTrackers: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].impressionTrackers + }; + if (response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].image) { + bid[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].image = { + url: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].image.url, + height: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].image.height, + width: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].image.width + }; + } + if (response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].icon) { + bid[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].icon = { + url: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].icon.url, + height: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].icon.height, + width: response[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].icon.width + }; + } + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + isCorrectSize = true; + } else { + bid.ad = response.ad; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + // Ensure that response ad matches one of the placement sizes. + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request, 'mediaTypes.banner.sizes', []), function (size) { + if (width === size[0] && height === size[1]) { + isCorrectSize = true; + } + }); + } + if (isCorrectSize) { + bidResponses.push(bid); + } + } + } + return bidResponses; + }, + onBidWon: function (bid) { + if (bid.vurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(bid.vurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('growadvertisingBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/growadvertisingBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["growthCodeAnalyticsAdapter"],{ + +/***/ "./modules/growthCodeAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/growthCodeAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export storage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * growthCodeAnalyticsAdapter.js - GrowthCode Analytics Adapter + */ + + + + + + + + + +const MODULE_NAME = 'growthCodeAnalytics'; +const DEFAULT_PID = 'INVALID_PID'; +const ENDPOINT_URL = 'https://analytics.gcprivacy.com/v3/pb/analytics'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_NAME +}); +let sessionId = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID(); +let trackEvents = []; +let pid = DEFAULT_PID; +let url = ENDPOINT_URL; +let eventQueue = []; +let startAuction = 0; +let bidRequestTimeout = 0; +let analyticsType = 'endpoint'; +let growthCodeAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_3__["default"])({ + url: url, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + let eventData = args ? _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone(args) : {}; + let data = {}; + if (!trackEvents.includes(eventType)) return; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_INIT: + { + data = eventData; + startAuction = data.timestamp; + bidRequestTimeout = data.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END: + { + data = eventData; + data.start = startAuction; + data.end = Date.now(); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_ADJUSTMENT: + { + data.bidders = eventData; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_TIMEOUT: + { + data.bidders = eventData; + data.duration = bidRequestTimeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_REQUESTED: + { + data = eventData; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_RESPONSE: + { + data = eventData; + delete data.ad; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_WON: + { + data = eventData; + delete data.ad; + delete data.adUrl; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BIDDER_DONE: + { + data = eventData; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.SET_TARGETING: + { + data.targetings = eventData; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.REQUEST_BIDS: + { + data = eventData; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.ADD_AD_UNITS: + { + data = eventData; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.NO_BID: + { + data = eventData; + break; + } + default: + return; + } + data.eventType = eventType; + data.timestamp = data.timestamp || Date.now(); + sendEvent(data); + } +}); +growthCodeAnalyticsAdapter.originEnableAnalytics = growthCodeAnalyticsAdapter.enableAnalytics; +growthCodeAnalyticsAdapter.enableAnalytics = function () { + let conf = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (typeof conf.options === 'object') { + if (conf.options.pid) { + pid = conf.options.pid; + url = conf.options.url ? conf.options.url : ENDPOINT_URL; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(MODULE_NAME + ' Not a valid PartnerID'); + return; + } + if (conf.options.trackEvents) { + trackEvents = conf.options.trackEvents; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(MODULE_NAME + ' Invalid configuration'); + return; + } + growthCodeAnalyticsAdapter.originEnableAnalytics(conf); +}; +function logToServer() { + if (pid === DEFAULT_PID) return; + if (eventQueue.length >= 1) { + // Get the correct GCID + let gcid = storage.getDataFromLocalStorage('gcid'); + let data = { + session: sessionId, + pid: pid, + gcid: gcid, + timestamp: Date.now(), + url: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)().page, + referer: document.referrer, + events: eventQueue + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, { + success: response => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(MODULE_NAME + ' Send Data to Server'); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(MODULE_NAME + ' Problem Send Data to Server: ' + error); + } + }, JSON.stringify(data), { + method: 'POST', + withCredentials: true + }); + eventQueue = []; + } +} +function sendEvent(event) { + eventQueue.push(event); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(MODULE_NAME + 'Analytics Event: ' + event); + if (event.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END || event.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_WON) { + logToServer(); + } +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: growthCodeAnalyticsAdapter, + code: 'growthCodeAnalytics' +}); +growthCodeAnalyticsAdapter.logToServer = logToServer; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (growthCodeAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('growthCodeAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/growthCodeAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["growthCodeIdSystem"],{ + +/***/ "./modules/growthCodeIdSystem.js": +/*!***************************************!*\ + !*** ./modules/growthCodeIdSystem.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, growthCodeIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds GrowthCodeId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/growthCodeIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'growthCodeId'; +const GCID_KEY = 'gcid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** @type {Submodule} */ +const growthCodeIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {{string}} value + * @returns {{growthCodeId: {string}}|undefined} + */ + decode(value) { + return value && value !== '' ? { + 'growthCodeId': value + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + const configParams = config && config.params || {}; + let ids = []; + let gcid = storage.getDataFromLocalStorage(GCID_KEY, null); + if (gcid !== null) { + const gcEid = { + source: 'growthcode.io', + uids: [{ + id: gcid, + atype: 3 + }] + }; + ids = ids.concat(gcEid); + } + let additionalEids = storage.getDataFromLocalStorage(configParams.customerEids, null); + if (additionalEids !== null) { + let data = JSON.parse(additionalEids); + ids = ids.concat(data); + } + return { + id: ids + }; + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', growthCodeIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('growthCodeIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/growthCodeIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["growthCodeRtdProvider"],{ + +/***/ "./modules/growthCodeRtdProvider.js": +/*!******************************************!*\ + !*** ./modules/growthCodeRtdProvider.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, growthCodeRtdProvider */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + +/** + * This module adds GrowthCode HEM and other Data to Bid Requests + * @module modules/growthCodeRtdProvider + */ + + + + + + +const MODULE_NAME = 'growthCodeRtd'; +const LOG_PREFIX = 'GrowthCodeRtd: '; +const ENDPOINT_URL = 'https://p2.gcprivacy.com/v2/rtd?'; +const RTD_EXPIRE_KEY = 'gc_rtd_expires_at'; +const RTD_CACHE_KEY = 'gc_rtd_items'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME +}); +let items; +const growthCodeRtdProvider = { + name: MODULE_NAME, + init: init, + getBidRequestData: alterBidRequests, + addData: addData, + callServer: callServer +}; + +/** + * Parse json if possible, else return null + * @param data + * @returns {any|null} + */ +function tryParse(data) { + try { + return JSON.parse(data); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err); + return null; + } +} + +/** + * Init The RTD Module + * @param config + * @param userConsent + * @returns {boolean} + */ +function init(config, userConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(LOG_PREFIX + 'Init RTB'); + if (config == null) { + return false; + } + const configParams = config && config.params || {}; + let expiresAt = parseInt(storage.getDataFromLocalStorage(RTD_EXPIRE_KEY, null)); + items = tryParse(storage.getDataFromLocalStorage(RTD_CACHE_KEY, null)); + if (configParams.pid === undefined) { + return true; // Die gracefully + } else { + return callServer(configParams, items, expiresAt, userConsent); + } +} +function callServer(configParams, items, expiresAt, userConsent) { + // Expire Cache + let now = Math.trunc(Date.now() / 1000); + if (!isNaN(expiresAt) && now > expiresAt) { + expiresAt = NaN; + storage.removeDataFromLocalStorage(RTD_CACHE_KEY, null); + storage.removeDataFromLocalStorage(RTD_EXPIRE_KEY, null); + } + if (items === null && isNaN(expiresAt)) { + let gcid = storage.getDataFromLocalStorage('gcid'); + let url = configParams.url ? configParams.url : ENDPOINT_URL; + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(url, 'pid', configParams.pid); + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(url, 'u', window.location.href); + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(url, 'gcid', gcid); + if (userConsent !== null && userConsent.gdpr !== null && userConsent.gdpr.consentString) { + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_3__.tryAppendQueryString)(url, 'tcf', userConsent.gdpr.consentString); + } + _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajaxBuilder()(url, { + success: response => { + let respJson = tryParse(response); + // If response is a valid json and should save is true + if (respJson && respJson.results >= 1) { + storage.setDataInLocalStorage(RTD_CACHE_KEY, JSON.stringify(respJson.items), null); + storage.setDataInLocalStorage(RTD_EXPIRE_KEY, respJson.expires_at, null); + } else { + storage.setDataInLocalStorage(RTD_EXPIRE_KEY, respJson.expires_at, null); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'ID fetch encountered an error', error); + } + }, undefined, { + method: 'GET', + withCredentials: true + }); + } + return true; +} +function addData(reqBidsConfigObj, items) { + let merge = false; + for (let j = 0; j < items.length; j++) { + let item = items[j]; + let data = JSON.parse(item.parameters); + if (item['attachment_point'] === 'data') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.bidder, data); + merge = true; + } + } + return merge; +} + +/** + * Alter the Bid Request for additional information such as HEM or 3rd Party Ids + * @param reqBidsConfigObj + * @param callback + * @param config + * @param userConsent + */ +function alterBidRequests(reqBidsConfigObj, callback, config, userConsent) { + if (items != null) { + addData(reqBidsConfigObj, items); + } + callback(); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', growthCodeRtdProvider); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('growthCodeRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/growthCodeRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["gumgumBidAdapter"],{ + +/***/ "./modules/gumgumBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/gumgumBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getCids, setIrisId, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'gumgum'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const ALIAS_BIDDER_CODE = ['gg']; +const BID_ENDPOINT = `https://g2.gumgum.com/hbid/imp`; +const JCSI = { + t: 0, + rq: 8, + pbv: "9.45.0-pre" +}; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO]; +const TIME_TO_LIVE = 60; +const DELAY_REQUEST_TIME = 1800000; // setting to 30 mins +const pubProvidedIdSources = ['dac.co.jp', 'audigent.com', 'id5-sync.com', 'liveramp.com', 'intentiq.com', 'liveintent.com', 'crwdcntrl.net', 'quantcast.com', 'adserver.org', 'yahoo.com']; +let invalidRequestIds = {}; +let pageViewId = null; + +// TODO: potential 0 values for browserParams sent to ad server +function _getBrowserParams(topWindowUrl, mosttopLocation) { + const paramRegex = paramName => new RegExp(`[?#&](${paramName}=(.*?))($|&)`, 'i'); + let browserParams = {}; + let topWindow; + let topScreen; + let topUrl; + let mosttopURL; + let ggad; + let ggdeal; + let ns; + function getNetworkSpeed() { + const connection = window.navigator && (window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection); + const Mbps = connection && (connection.downlink || connection.bandwidth); + return Mbps ? Math.round(Mbps * 1024) : null; + } + function getOgURL() { + let ogURL = ''; + const ogURLSelector = "meta[property='og:url']"; + const head = document && document.getElementsByTagName('head')[0]; + const ogURLElement = head.querySelector(ogURLSelector); + ogURL = ogURLElement ? ogURLElement.content : null; + return ogURL; + } + function stripGGParams(url) { + const params = ['ggad', 'ggdeal']; + return params.reduce((result, param) => { + const matches = url.match(paramRegex(param)); + if (!matches) return result; + matches[1] && (result = result.replace(matches[1], '')); + matches[3] && (result = result.replace(matches[3], '')); + return result; + }, url); + } + try { + topWindow = __webpack_require__.g.top; + topScreen = topWindow.screen; + topUrl = topWindowUrl || ''; + mosttopURL = mosttopLocation || ''; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + return browserParams; + } + browserParams = { + vw: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().innerWidth, + vh: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().innerHeight, + sw: topScreen.width, + sh: topScreen.height, + pu: stripGGParams(topUrl), + tpl: mosttopURL, + ce: storage.cookiesAreEnabled(), + dpr: topWindow.devicePixelRatio || 1, + jcsi: JSON.stringify(JCSI), + ogu: getOgURL() + }; + ns = getNetworkSpeed(); + if (ns) { + browserParams.ns = ns; + } + ggad = (topUrl.match(paramRegex('ggad')) || [0, 0, 0])[2]; + if (ggad) browserParams[isNaN(ggad) ? 'eAdBuyId' : 'adBuyId'] = ggad; + ggdeal = (topUrl.match(paramRegex('ggdeal')) || [0, 0, 0])[2]; + if (ggdeal) browserParams.ggdeal = ggdeal; + return browserParams; +} +function getWrapperCode(wrapper, data) { + return wrapper.replace('AD_JSON', window.btoa(JSON.stringify(data))); +} + +/** + * Serializes the supply chain object according to IAB standards + * @see https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md + * @param {Object} schainObj supply chain object + * @returns {string} + */ +function _serializeSupplyChainObj(schainObj) { + let serializedSchain = `${schainObj.ver},${schainObj.complete}`; + + // order of properties: asi,sid,hp,rid,name,domain + schainObj.nodes.map(node => { + serializedSchain += `!${encodeURIComponent(node['asi'] || '')},`; + serializedSchain += `${encodeURIComponent(node['sid'] || '')},`; + serializedSchain += `${encodeURIComponent(node['hp'] || '')},`; + serializedSchain += `${encodeURIComponent(node['rid'] || '')},`; + serializedSchain += `${encodeURIComponent(node['name'] || '')},`; + serializedSchain += `${encodeURIComponent(node['domain'] || '')}`; + }); + return serializedSchain; +} + +/** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ +function isBidRequestValid(bid) { + const { + params, + adUnitCode + } = bid; + const legacyParamID = params.inScreen || params.inScreenPubID || params.inSlot || params.ICV || params.video || params.inVideo; + const id = legacyParamID || params.slot || params.native || params.zone || params.pubID; + if (invalidRequestIds[id]) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`[GumGum] Please check the implementation for ${id} for the placement ${adUnitCode}`); + return false; + } + switch (true) { + case !!params.zone: + break; + case !!params.pubId: + break; + case !!params.inScreen: + break; + case !!params.inScreenPubID: + break; + case !!params.inSlot: + break; + case !!params.ICV: + break; + case !!params.video: + break; + case !!params.inVideo: + break; + case !!params.videoPubID: + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`[GumGum] No product selected for the placement ${adUnitCode}, please check your implementation.`); + return false; + } + if (params.bidfloor && !(typeof params.bidfloor === 'number' && isFinite(params.bidfloor))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('[GumGum] bidfloor must be a Number'); + return false; + } + return true; +} + +/** + * Renames vid params from mediatypes.video keys + * @param {Object} attributes + * @returns {Object} + */ +function _getVidParams(attributes) { + const { + minduration: mind, + maxduration: maxd, + linearity: li, + startdelay: sd, + placement: pt, + plcmt, + protocols = [], + playerSize = [], + skip, + api, + mimes, + playbackmethod, + playbackend: pbe + } = attributes; + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(playerSize); + const [viw, vih] = sizes[0] && sizes[0].split('x'); + let pr = ''; + if (protocols.length) { + pr = protocols.join(','); + } + const result = { + mind, + maxd, + li, + sd, + pt, + pr, + viw, + vih, + skip, + pbe + }; + if (plcmt !== undefined && plcmt !== null) { + result.vplcmt = plcmt; + } + if (api && api.length) { + result.api = api.join(','); + } + if (mimes && mimes.length) { + result.mimes = mimes.join(','); + } + if (playbackmethod && playbackmethod.length) { + result.pbm = playbackmethod.join(','); + } + return result; +} + +/** + * Retrieves the bid floor value, which is the minimum acceptable bid for an ad unit. + * This function calculates the bid floor based on the given media types and other bidding parameters. + * @param {Object} mediaTypes - The media types specified for the bid, which might influence floor calculations. + * @param {number} staticBidFloor - The default or static bid floor set for the bid. + * @param {Object} bid - The bid object which may contain a method to get dynamic floor values. + * @returns {Object} An object containing the calculated bid floor and its currency. + */ +function _getFloor(mediaTypes, staticBidFloor, bid) { + const curMediaType = Object.keys(mediaTypes)[0] || 'banner'; + const bidFloor = { + floor: 0, + currency: 'USD' + }; + if (typeof bid.getFloor === 'function') { + const { + currency, + floor + } = bid.getFloor({ + mediaType: curMediaType, + size: '*' + }) || {}; + floor && (bidFloor.floor = floor); + currency && (bidFloor.currency = currency); + if (staticBidFloor && floor && currency === 'USD') { + bidFloor.floor = Math.max(staticBidFloor, parseFloat(floor)); + } + } else if (staticBidFloor) { + bidFloor.floor = staticBidFloor; + } + return bidFloor; +} + +/** + * Retrieves the device data from the ORTB2 object + * @param {Object} ortb2Data ORTB2 object + * @returns {Object} Device data + */ +function _getDeviceData(ortb2Data) { + const _device = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Data, 'device') || {}; + + // set device data params from ortb2 + const _deviceRequestParams = { + ip: _device.ip, + ipv6: _device.ipv6, + ua: _device.ua, + sua: _device.sua ? JSON.stringify(_device.sua) : undefined, + dnt: _device.dnt, + os: _device.os, + osv: _device.osv, + dt: _device.devicetype, + lang: _device.language, + make: _device.make, + model: _device.model, + ppi: _device.ppi, + pxratio: _device.pxratio, + foddid: _device?.ext?.fiftyonedegrees_deviceId + }; + + // return device data params with only non-empty values + return Object.keys(_deviceRequestParams).reduce((r, key) => { + if (_deviceRequestParams[key] !== undefined) { + r[key] = _deviceRequestParams[key]; + } + return r; + }, {}); +} + +/** + * loops through bannerSizes array to get greatest slot dimensions + * @param {number[][]} sizes + * @returns {number[]} + */ +function getGreatestDimensions(sizes) { + let maxw = 0; + let maxh = 0; + let greatestVal = 0; + sizes.forEach(bannerSize => { + let [width, height] = bannerSize; + let greaterSide = width > height ? width : height; + if (greaterSide > greatestVal || greaterSide === greatestVal && width >= maxw && height >= maxh) { + greatestVal = greaterSide; + maxw = width; + maxh = height; + } + }); + return [maxw, maxh]; +} +function getEids(userId) { + const idProperties = ['uid', 'eid', 'lipbid', 'envelope']; + return Object.keys(userId).reduce(function (eids, provider) { + const eid = userId[provider]; + switch (typeof eid) { + case 'string': + eids[provider] = eid; + break; + case 'object': + const idProp = idProperties.filter(prop => eid.hasOwnProperty(prop)); + idProp.length && (eids[provider] = eid[idProp[0]]); + break; + } + return eids; + }, {}); +} + +/** + * Builds requests for bids. + * @param {validBidRequests[]} validBidRequests - An array of valid bid requests. + * @param {Object} bidderRequest - The bidder's request information. + * @returns {Object[]} An array of server requests. + */ +function buildRequests(validBidRequests, bidderRequest) { + const bids = []; + const gdprConsent = bidderRequest && bidderRequest.gdprConsent; + const uspConsent = bidderRequest && bidderRequest.uspConsent; + const gppConsent = bidderRequest && bidderRequest.gppConsent; + const timeout = bidderRequest && bidderRequest.timeout; + const coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true ? 1 : 0; + const topWindowUrl = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page; + const mosttopLocation = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.topmostLocation; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(validBidRequests, bidRequest => { + const { + bidId, + mediaTypes = {}, + params = {}, + schain, + userId = {}, + ortb2Imp, + adUnitCode = '' + } = bidRequest; + const { + currency, + floor + } = _getFloor(mediaTypes, params.bidfloor, bidRequest); + const eids = getEids(userId); + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Imp, 'ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Imp, 'ext.data.pbadslot'); + const paapiEligible = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Imp, 'ext.ae') === 1; + let sizes = [1, 1]; + let data = {}; + data.displaymanager = 'Prebid.js - gumgum'; + data.displaymanagerver = "9.45.0-pre"; + const date = new Date(); + const lt = date.getTime(); + const to = date.getTimezoneOffset(); + + // ADTS-174 Removed unnecessary checks to fix failing test + data.lt = lt; + data.to = to; + function jsoStringifynWithMaxLength(data, maxLength) { + let jsonString = JSON.stringify(data); + if (jsonString.length <= maxLength) { + return jsonString; + } else { + const truncatedData = data.slice(0, Math.floor(data.length * (maxLength / jsonString.length))); + jsonString = JSON.stringify(truncatedData); + return jsonString; + } + } + // Send filtered pubProvidedId's + if (userId && userId.pubProvidedId) { + let filteredData = userId.pubProvidedId.filter(item => pubProvidedIdSources.includes(item.source)); + let maxLength = 1800; // replace this with your desired maximum length + let truncatedJsonString = jsoStringifynWithMaxLength(filteredData, maxLength); + data.pubProvidedId = truncatedJsonString; + } + // ADJS-1286 Read id5 id linktype field + if (userId && userId.id5id && userId.id5id.uid && userId.id5id.ext) { + data.id5Id = userId.id5id.uid || null; + data.id5IdLinkType = userId.id5id.ext.linkType || null; + } + // ADTS-169 add adUnitCode to requests + if (adUnitCode) data.aun = adUnitCode; + + // ADTS-134 Retrieve ID envelopes + for (const eid in eids) data[eid] = eids[eid]; + if (mediaTypes.banner) { + sizes = mediaTypes.banner.sizes; + } else if (mediaTypes.video) { + sizes = mediaTypes.video.playerSize; + data = _getVidParams(mediaTypes.video); + } + + // ADJS-1024 & ADSS-1297 & ADTS-175 + gpid && (data.gpid = gpid); + if (pageViewId) { + data.pv = pageViewId; + } + if (floor) { + data.fp = floor; + data.fpc = currency; + } + if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.site) { + setIrisId(data, bidderRequest.ortb2.site, params); + const curl = bidderRequest.ortb2.site.content?.url; + if (curl) data.curl = curl; + } + if (params.iriscat && typeof params.iriscat === 'string') { + data.iriscat = params.iriscat; + } + if (params.zone || params.pubId) { + params.zone ? data.t = params.zone : data.pubId = params.pubId; + data.pi = 2; // inscreen + // override pi if the following is found + if (params.slot) { + const [maxw, maxh] = getGreatestDimensions(sizes); + data.maxw = maxw; + data.maxh = maxh; + data.si = params.slot; + data.pi = 3; + data.bf = sizes.reduce((acc, curSlotDim) => `${acc}${acc && ','}${curSlotDim[0]}x${curSlotDim[1]}`, ''); + } else if (params.native) { + data.ni = params.native; + data.pi = 5; + } else if (mediaTypes.video) { + data.pi = mediaTypes.video.linearity === 2 ? 6 : 7; // invideo : video + } else if (params.product && params.product.toLowerCase() === 'skins') { + data.pi = 8; + } + } else { + // legacy params + data = { + ...data, + ...handleLegacyParams(params, sizes) + }; + } + if (paapiEligible) { + data.ae = paapiEligible; + } + if (gdprConsent) { + data.gdprApplies = gdprConsent.gdprApplies ? 1 : 0; + } + if (data.gdprApplies) { + data.gdprConsent = gdprConsent.consentString; + } + if (uspConsent) { + data.uspConsent = uspConsent; + } + if (gppConsent) { + data.gppString = bidderRequest.gppConsent.gppString ? bidderRequest.gppConsent.gppString : ''; + data.gppSid = Array.isArray(bidderRequest.gppConsent.applicableSections) ? bidderRequest.gppConsent.applicableSections.join(',') : ''; + } else if (!gppConsent && bidderRequest?.ortb2?.regs?.gpp) { + data.gppString = bidderRequest.ortb2.regs.gpp; + data.gppSid = Array.isArray(bidderRequest.ortb2.regs.gpp_sid) ? bidderRequest.ortb2.regs.gpp_sid.join(',') : ''; + } + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.ext.dsa'); + if (dsa) { + data.dsa = JSON.stringify(dsa); + } + if (coppa) { + data.coppa = coppa; + } + if (schain && schain.nodes) { + data.schain = _serializeSupplyChainObj(schain); + } + const tId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Imp, 'ext.tid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.source.tid') || ''; + data.tId = tId; + Object.assign(data, _getBrowserParams(topWindowUrl, mosttopLocation), _getDeviceData(bidderRequest?.ortb2)); + bids.push({ + id: bidId, + tmax: timeout, + tId: tId, + pi: data.pi, + selector: params.selector, + sizes, + url: BID_ENDPOINT, + method: 'GET', + data + }); + }); + return bids; +} +function getCids(site) { + if (site.content && Array.isArray(site.content.data)) { + for (const dataItem of site.content.data) { + if (typeof dataItem?.name === 'string' && (dataItem.name.includes('iris.com') || dataItem.name.includes('iris.tv'))) { + return Array.isArray(dataItem.ext?.cids) ? dataItem.ext.cids.join(',') : ''; + } + } + } + return null; +} +function setIrisId(data, site, params) { + let irisID = getCids(site); + if (irisID) { + data.irisid = irisID; + } else { + // Just adding this chechk for safty and if needed we can remove + if (params.irisid && typeof params.irisid === 'string') { + data.irisid = params.irisid; + } + } +} +function handleLegacyParams(params, sizes) { + const data = {}; + if (params.inScreenPubID) { + data.pubId = params.inScreenPubID; + data.pi = 2; + } + if (params.inScreen) { + data.t = params.inScreen; + data.pi = 2; + } + if (params.inSlot) { + const [maxw, maxh] = getGreatestDimensions(sizes); + data.maxw = maxw; + data.maxh = maxh; + data.si = params.inSlot; + data.pi = 3; + data.bf = sizes.reduce((acc, curSlotDim) => `${acc}${acc && ','}${curSlotDim[0]}x${curSlotDim[1]}`, ''); + } + if (params.ICV) { + data.ni = params.ICV; + data.pi = 5; + } + if (params.videoPubID) { + data.pubId = params.videoPubID; + data.pi = 7; + } + if (params.video) { + data.t = params.video; + data.pi = 7; + } + if (params.inVideo) { + data.t = params.inVideo; + data.pi = 6; + } + return data; +} + +/** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ +function interpretResponse(serverResponse, bidRequest) { + const bidResponses = []; + const serverResponseBody = serverResponse.body; + if (!serverResponseBody || serverResponseBody.err) { + const data = bidRequest.data || {}; + const id = data.si || data.ni || data.t || data.pubId; + const delayTime = serverResponseBody ? serverResponseBody.err.drt : DELAY_REQUEST_TIME; + invalidRequestIds[id] = { + productId: data.pi, + timestamp: new Date().getTime() + }; + setTimeout(() => { + !!invalidRequestIds[id] && delete invalidRequestIds[id]; + }, delayTime); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`[GumGum] Please check the implementation for ${id}`); + } + const defaultResponse = { + ad: { + price: 0, + id: 0, + markup: '', + width: 0, + height: 0 + }, + pag: { + pvid: 0 + }, + meta: { + adomain: [], + mediaType: '' + } + }; + const { + ad: { + price: cpm, + id: creativeId, + markup, + cur, + width: responseWidth, + height: responseHeight, + maxw, + maxh + }, + cw: wrapper, + pag: { + pvid + }, + jcsi, + meta: { + adomain: advertiserDomains, + mediaType: type + } + } = Object.assign(defaultResponse, serverResponseBody); + let data = bidRequest.data || {}; + let product = data.pi; + let mediaType = product === 6 || product === 7 ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + let isTestUnit = product === 3 && data.si === 9; + let metaData = { + advertiserDomains: advertiserDomains || [], + mediaType: type || mediaType + }; + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(bidRequest.sizes); + if (maxw && maxh) { + sizes = [`${maxw}x${maxh}`]; + } else if (product === 5 && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(sizes, '1x1')) { + sizes = ['1x1']; + // added logic for in-slot multi-szie + } else if (product === 2 && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(sizes, '1x1') || product === 3) { + const requestSizesThatMatchResponse = bidRequest.sizes && bidRequest.sizes.reduce((result, current) => { + const [width, height] = current; + if (responseWidth === width && responseHeight === height) result.push(current.join('x')); + return result; + }, []) || []; + sizes = requestSizesThatMatchResponse.length ? requestSizesThatMatchResponse : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(bidRequest.sizes); + } + let [width, height] = sizes[0].split('x'); + if (jcsi) { + serverResponseBody.jcsi = JCSI; + } + + // update Page View ID from server response + pageViewId = pvid; + if (creativeId) { + bidResponses.push({ + // dealId: DEAL_ID, + // referrer: REFERER, + ad: wrapper ? getWrapperCode(wrapper, Object.assign({}, serverResponseBody, { + bidRequest + })) : markup, + ...(mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO && { + ad: markup, + vastXml: markup + }), + mediaType, + cpm: isTestUnit ? 0.1 : cpm, + creativeId, + currency: cur || 'USD', + height, + netRevenue: true, + requestId: bidRequest.id, + ttl: TIME_TO_LIVE, + width, + meta: metaData + }); + } + return bidResponses; +} + +/** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ +function getUserSyncs(syncOptions, serverResponses) { + const responses = serverResponses.map(response => { + return response.body && response.body.pxs && response.body.pxs.scr || []; + }); + const userSyncs = responses.reduce(function (usersyncs, response) { + return usersyncs.concat(response); + }, []); + const syncs = userSyncs.map(sync => { + return { + type: sync.t === 'f' ? 'iframe' : 'image', + url: sync.u + }; + }); + return syncs; +} +const spec = { + code: BIDDER_CODE, + gvlid: 61, + aliases: ALIAS_BIDDER_CODE, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('gumgumBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/gumgumBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["h12mediaBidAdapter"],{ + +/***/ "./modules/h12mediaBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/h12mediaBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + +const BIDDER_CODE = 'h12media'; +const DEFAULT_URL = 'https://bidder.h12-media.com/prebid/'; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_TTL = 360; +const DEFAULT_NET_REVENUE = false; +const spec = { + code: BIDDER_CODE, + aliases: ['h12'], + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.pubid); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const isiframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.inIframe)(); + const screenSize = getClientDimensions(); + const docSize = getDocumentDimensions(); + return validBidRequests.map(bidRequest => { + const bidderParams = bidRequest.params; + const requestUrl = bidderParams.endpointdom || DEFAULT_URL; + let pubsubid = bidderParams.pubsubid || ''; + if (pubsubid && pubsubid.length > 32) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Bidder param \'pubsubid\' should be not more than 32 chars.'); + pubsubid = ''; + } + const pubcontainerid = bidderParams.pubcontainerid; + const adUnitElement = document.getElementById(pubcontainerid || bidRequest.adUnitCode); + const ishidden = !isVisible(adUnitElement); + const framePos = getFramePos(); + const coords = isiframe ? { + x: framePos[0], + y: framePos[1] + } : { + x: adUnitElement && (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_1__.getBoundingClientRect)(adUnitElement).x, + y: adUnitElement && (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_1__.getBoundingClientRect)(adUnitElement).y + }; + const bidrequest = { + bidId: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + adunitId: bidRequest.adUnitCode, + pubid: bidderParams.pubid, + placementid: bidderParams.placementid || '', + size: bidderParams.size || '', + adunitSize: bidRequest.mediaTypes.banner.sizes || [], + coords, + ishidden, + pubsubid, + pubcontainerid + }; + let windowTop; + try { + windowTop = window.top; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(e); + windowTop = window; + } + return { + method: 'POST', + url: requestUrl, + options: { + withCredentials: true + }, + data: { + gdpr: !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gdprConsent.gdprApplies', false), + gdpr_cs: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gdprConsent.consentString', ''), + usp: !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'uspConsent', false), + usp_cs: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'uspConsent', ''), + topLevelUrl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page', ''), + // TODO: does the fallback make sense here? + refererUrl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.ref', window.document.referrer), + isiframe, + version: "9.45.0-pre", + ExtUserIDs: bidRequest.userId, + visitorInfo: { + localTime: getLocalDateFormatted(), + dayOfWeek: new Date().getDay(), + screenWidth: screenSize[0], + screenHeight: screenSize[1], + docWidth: docSize[0], + docHeight: docSize[1], + scrollbarx: windowTop.scrollX, + scrollbary: windowTop.scrollY + }, + bidrequest + } + }; + }); + }, + interpretResponse: function (serverResponse, bidRequests) { + let bidResponses = []; + try { + const serverBody = serverResponse.body; + if (serverBody) { + if (serverBody.bid) { + const bidBody = serverBody.bid; + const bidRequest = bidRequests.data.bidrequest; + const bidResponse = { + currency: serverBody.currency || DEFAULT_CURRENCY, + netRevenue: serverBody.netRevenue || DEFAULT_NET_REVENUE, + ttl: serverBody.ttl || DEFAULT_TTL, + requestId: bidBody.bidId, + cpm: bidBody.cpm, + width: bidBody.width, + height: bidBody.height, + creativeId: bidBody.creativeId, + ad: bidBody.ad, + meta: bidBody.meta, + mediaType: 'banner' + }; + if (bidRequest) { + bidResponse.pubid = bidRequest.pubid; + bidResponse.placementid = bidRequest.placementid; + bidResponse.size = bidRequest.size; + } + bidResponses.push(bidResponse); + } + } + return bidResponses; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(err); + } + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, usPrivacy) { + const syncs = []; + const uspApplies = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(usPrivacy, 'uspConsent', false); + const uspString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(usPrivacy, 'uspConsent', ''); + gdprConsent = gdprConsent || { + gdprApplies: false, + consentString: '' + }; + const userSyncUrlProcess = url => { + return url.replace('{gdpr}', gdprConsent.gdprApplies).replace('{gdpr_cs}', gdprConsent.consentString).replace('{usp}', uspApplies).replace('{usp_cs}', uspString); + }; + serverResponses.forEach(serverResponse => { + const userSyncUrls = serverResponse.body.usersync || []; + userSyncUrls.forEach(sync => { + if (syncOptions.iframeEnabled && sync.type === 'iframe' && sync.url) { + syncs.push({ + type: 'iframe', + url: userSyncUrlProcess(sync.url) + }); + } + if (syncOptions.pixelEnabled && sync.type === 'image' && sync.url) { + syncs.push({ + type: 'image', + url: userSyncUrlProcess(sync.url) + }); + } + }); + }); + return syncs; + } +}; +function getContext(elem) { + try { + return elem && window.document.body.contains(elem) ? window : window.top.document.body.contains(elem) ? top : undefined; + } catch (e) { + return undefined; + } +} +function isDefined(val) { + return val !== null && typeof val !== 'undefined'; +} +function getIsHidden(elem) { + let lastElem = elem; + let elemHidden = false; + let m; + m = 0; + do { + m = m + 1; + try { + if (getContext(elem).getComputedStyle(lastElem).getPropertyValue('display') === 'none' || getContext(elem).getComputedStyle(lastElem).getPropertyValue('visibility') === 'hidden') { + return true; + } else { + elemHidden = false; + lastElem = lastElem.parentElement; + } + } catch (o) { + return false; + } + } while (m < 250 && lastElem != null && elemHidden === false); + return elemHidden; +} +function isVisible(element) { + return element && isDefined(getContext(element)) && !getIsHidden(element); +} +function getClientDimensions() { + try { + const { + width: t, + height: e + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__.getViewportSize)(); + return [Math.round(t), Math.round(e)]; + } catch (i) { + return [0, 0]; + } +} +function getDocumentDimensions() { + try { + const D = window.top.document; + return [D.body.offsetWidth, Math.max(D.body.scrollHeight, D.documentElement.scrollHeight, D.body.offsetHeight, D.documentElement.offsetHeight, D.body.clientHeight, D.documentElement.clientHeight)]; + } catch (t) { + return [-1, -1]; + } +} +function getLocalDateFormatted() { + const two = num => ('0' + num).slice(-2); + const d = new Date(); + return `${d.getFullYear()}-${two(d.getMonth() + 1)}-${two(d.getDate())} ${two(d.getHours())}:${two(d.getMinutes())}:${two(d.getSeconds())}`; +} +function getFramePos() { + let t = window; + let m = 0; + let frmLeft = 0; + let frmTop = 0; + do { + m = m + 1; + try { + if (m > 1) { + t = t.parent; + } + frmLeft = frmLeft + (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_1__.getBoundingClientRect)(t.frameElement).left; + frmTop = frmTop + (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_1__.getBoundingClientRect)(t.frameElement).top; + } catch (o) {/* keep looping */ + } + } while (m < 100 && t.parent !== t.self); + return [frmLeft, frmTop]; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('h12mediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/h12mediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["hadronAnalyticsAdapter"],{ + +/***/ "./modules/hadronAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/hadronAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export storage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + + + +/** + * hadronAnalyticsAdapter.js - Audigent Hadron Analytics Adapter + */ + +const HADRON_ANALYTICS_URL = 'https://analytics.hadron.ad.gt/api/v1/analytics'; +const HADRONID_ANALYTICS_VER = 'pbadgt0'; +const DEFAULT_PARTNER_ID = 0; +const AU_GVLID = 561; +const MODULE_CODE = 'hadronAnalytics'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); +var viewId = _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID(); +var partnerId = DEFAULT_PARTNER_ID; +var eventsToTrack = []; +const { + width: x, + height: y +} = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__.getViewportSize)(); +var pageView = { + eventType: 'pageView', + userAgent: window.navigator.userAgent, + timestamp: Date.now(), + timezoneOffset: new Date().getTimezoneOffset(), + language: window.navigator.language, + vendor: window.navigator.vendor, + pageUrl: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)().page, + screenWidth: x, + screenHeight: y +}; +var eventQueue = [pageView]; +var startAuction = 0; +var bidRequestTimeout = 0; +let analyticsType = 'endpoint'; +let hadronAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + url: HADRON_ANALYTICS_URL, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + args = args ? _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone(args) : {}; + var data = {}; + if (!eventsToTrack.includes(eventType)) return; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_INIT: + { + data = args; + startAuction = data.timestamp; + bidRequestTimeout = data.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END: + { + data = args; + data.start = startAuction; + data.end = Date.now(); + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_ADJUSTMENT: + { + data.bidders = args; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_TIMEOUT: + { + data.bidders = args; + data.duration = bidRequestTimeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_REQUESTED: + { + data = args; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_RESPONSE: + { + data = args; + delete data.ad; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_WON: + { + data = args; + delete data.ad; + delete data.adUrl; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BIDDER_DONE: + { + data = args; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.SET_TARGETING: + { + data.targetings = args; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.REQUEST_BIDS: + { + data = args; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.ADD_AD_UNITS: + { + data = args; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AD_RENDER_FAILED: + { + data = args; + break; + } + default: + return; + } + data.eventType = eventType; + data.timestamp = data.timestamp || Date.now(); + sendEvent(data); + } +}); +hadronAnalyticsAdapter.originEnableAnalytics = hadronAnalyticsAdapter.enableAnalytics; +hadronAnalyticsAdapter.enableAnalytics = function () { + let conf = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (typeof conf.options === 'object') { + if (conf.options.partnerId) { + partnerId = conf.options.partnerId; + } else { + partnerId = DEFAULT_PARTNER_ID; + } + if (conf.options.eventsToTrack) { + eventsToTrack = conf.options.eventsToTrack; + } + } else { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError('HADRON_ANALYTICS_NO_CONFIG_ERROR'); + return; + } + hadronAnalyticsAdapter.originEnableAnalytics(conf); +}; +function flush() { + // Don't send anything if no partner id was declared + if (partnerId === DEFAULT_PARTNER_ID) return; + if (eventQueue.length > 1) { + var data = { + pageViewId: viewId, + ver: HADRONID_ANALYTICS_VER, + partnerId: partnerId, + events: eventQueue + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(HADRON_ANALYTICS_URL, () => _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo('HADRON_ANALYTICS_BATCH_SEND'), JSON.stringify(data), { + contentType: 'application/json', + method: 'POST' + }); + eventQueue = [pageView]; + } +} +function sendEvent(event) { + eventQueue.push(event); + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo(`HADRON_ANALYTICS_EVENT ${event.eventType} `, event); + if (event.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END) { + flush(); + } +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].registerAnalyticsAdapter({ + adapter: hadronAnalyticsAdapter, + code: MODULE_CODE, + gvlid: AU_GVLID +}); +hadronAnalyticsAdapter.flush = flush; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (hadronAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('hadronAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/hadronAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["hadronIdSystem"],{ + +/***/ "./modules/hadronIdSystem.js": +/*!***********************************!*\ + !*** ./modules/hadronIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MODULE_NAME, LS_TAM_KEY, storage, hadronIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); + +/** + * This module adds HadronID to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/hadronIdSystem + * @requires module:modules/userId + */ + + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'hadronId'; +const LOG_PREFIX = `[${MODULE_NAME}System]`; +const LS_TAM_KEY = 'auHadronId'; +const AU_GVLID = 561; +const DEFAULT_HADRON_URL_ENDPOINT = 'https://id.hadron.ad.gt/api/v1/pbhid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** + * Param or default. + * @param {String|function} param + * @param {String} defaultVal + * @param arg + */ +function paramOrDefault(param, defaultVal, arg) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(param)) { + return param(arg); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(param)) { + return param; + } + return defaultVal; +} + +/** + * @param {string} url + * @param {string} params + * @returns {string} + */ +const urlAddParams = (url, params) => { + return url + (url.indexOf('?') > -1 ? '&' : '?') + params; +}; +const isDebug = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('debug') || false; + +/** @type {Submodule} */ +const hadronIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + gvlid: AU_GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {Object} + */ + decode(value) { + return { + hadronId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(value) ? value : value.hasOwnProperty('id') ? value.id[MODULE_NAME] : value[MODULE_NAME] + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, `getId is called`, config); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(config.params)) { + config.params = {}; + } + let hadronId = ''; + // at this point hadronId was not found by prebid, let check if it is in the webpage by other ways + hadronId = storage.getDataFromLocalStorage(LS_TAM_KEY); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(hadronId) && hadronId.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, `${LS_TAM_KEY} found in localStorage = ${hadronId}`); + // return {callback: function(cb) { cb(hadronId) }}; + return { + id: hadronId + }; + } + const partnerId = config.params.partnerId | 0; + const resp = function (callback) { + let responseObj = {}; + const callbacks = { + success: response => { + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + callback(); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, `Response from backend is ${response}`, responseObj); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(responseObj) && responseObj.hasOwnProperty(MODULE_NAME)) { + hadronId = responseObj[MODULE_NAME]; + } + responseObj = hadronId; // {id: {hadronId: hadronId}}; + } + callback(responseObj); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + callback(); + } + }; + let url = urlAddParams( + // config.params.url and config.params.urlArg are not documented + // since their use is for debugging purposes only + paramOrDefault(config.params.url, DEFAULT_HADRON_URL_ENDPOINT, config.params.urlArg), `partner_id=${partnerId}&_it=prebid&t=1&src=id&domain=${document.location.hostname}` // src=id => the backend was called from getId + ); + if (isDebug) { + url += '&debug=1'; + } + const gdprConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.gdprDataHandler.getConsentData(); + if (gdprConsent) { + url += `${gdprConsent.consentString ? '&gdprString=' + encodeURIComponent(gdprConsent.consentString) : ''}`; + url += `&gdpr=${gdprConsent.gdprApplies === true ? 1 : 0}`; + } + const usPrivacyString = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.uspDataHandler.getConsentData(); + if (usPrivacyString) { + url += `&us_privacy=${encodeURIComponent(usPrivacyString)}`; + } + const gppConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__.gppDataHandler.getConsentData(); + if (gppConsent) { + url += `${gppConsent.gppString ? '&gpp=' + encodeURIComponent(gppConsent.gppString) : ''}`; + url += `${gppConsent.applicableSections ? '&gpp_sid=' + encodeURIComponent(gppConsent.applicableSections) : ''}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, `${MODULE_NAME} not found, calling home (${url})`); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(url, callbacks, undefined, { + method: 'GET' + }); + }; + return { + callback: resp + }; + }, + eids: { + 'hadronId': { + source: 'audigent.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('userId', hadronIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('hadronIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/hadronIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["hadronRtdProvider"],{ + +/***/ "./modules/hadronRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/hadronRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, addRealTimeData, getRealTimeData, hadronSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the Audigent Hadron provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time data from Audigent + * @module modules/hadronRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const LOG_PREFIX = '[HadronRtdProvider] '; +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'hadron'; +const AU_GVLID = 561; +const HADRON_JS_URL = 'https://cdn.hadronid.net/hadron.js'; +const LS_TAM_KEY = 'auHadronId'; +const RTD_LOCAL_NAME = 'auHadronRtd'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); + +/** + * @param {string} url + * @param {string} params + * @returns {string} + */ +const urlAddParams = (url, params) => { + return url + (url.indexOf('?') > -1 ? '&' : '?') + params; +}; + +/** + * Deep object merging with array deduplication. + * @param {Object} target + * @param {Object} sources + */ +function mergeDeep(target) { + for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + if (!sources.length) return target; + const source = sources.shift(); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(target) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(source)) { + for (const key in source) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(source[key])) { + if (!target[key]) Object.assign(target, { + [key]: {} + }); + mergeDeep(target[key], source[key]); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(source[key])) { + if (!target[key]) { + Object.assign(target, { + [key]: source[key] + }); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(target[key])) { + source[key].forEach(obj => { + let e = 1; + for (let i = 0; i < target[key].length; i++) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(target[key][i], obj)) { + e = 0; + break; + } + } + if (e) { + target[key].push(obj); + } + }); + } + } else { + Object.assign(target, { + [key]: source[key] + }); + } + } + } + return mergeDeep(target, ...sources); +} + +/** + * Lazy merge objects. + * @param {Object} target + * @param {Object} source + */ +function mergeLazy(target, source) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(target)) { + target = {}; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(source)) { + source = {}; + } + return mergeDeep(target, source); +} + +/** + * Param or default. + * @param {String|Function} param + * @param {String} defaultVal + * @param {Object} arg + */ +function paramOrDefault(param, defaultVal, arg) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(param)) { + return param(arg); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(param)) { + return param; + } + return defaultVal; +} + +/** + * Add real-time data & merge segments. + * @param {Object} bidConfig + * @param {Object} rtd + * @param {Object} rtdConfig + */ +function addRealTimeData(bidConfig, rtd, rtdConfig) { + if (rtdConfig.params && rtdConfig.params.handleRtd) { + rtdConfig.params.handleRtd(bidConfig, rtd, rtdConfig, _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config); + } else { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtd.ortb2)) { + mergeLazy(bidConfig.ortb2Fragments?.global, rtd.ortb2); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtd.ortb2b)) { + mergeLazy(bidConfig.ortb2Fragments?.bidder, Object.fromEntries(Object.entries(rtd.ortb2b).map(_ref => { + let [_, cfg] = _ref; + return [_, cfg.ortb2]; + }))); + } + } +} + +/** + * Real-time data retrieval from Audigent + * @param {Object} bidConfig + * @param {function} onDone + * @param {Object} rtdConfig + * @param {Object} userConsent + */ +function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { + if (!storage.getDataFromLocalStorage(LS_TAM_KEY)) { + const partnerId = rtdConfig.params.partnerId | 0; + const hadronIdUrl = rtdConfig.params && rtdConfig.params.hadronIdUrl; + const scriptUrl = urlAddParams(paramOrDefault(hadronIdUrl, HADRON_JS_URL, {}), `partner_id=${partnerId}&_it=prebid`); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_4__.loadExternalScript)(scriptUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, SUBMODULE_NAME, () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, 'hadronId JS snippet loaded', scriptUrl); + }); + } + if (rtdConfig && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtdConfig.params) && rtdConfig.params.segmentCache) { + let jsonData = storage.getDataFromLocalStorage(RTD_LOCAL_NAME); + if (jsonData) { + let data = JSON.parse(jsonData); + if (data.rtd) { + addRealTimeData(bidConfig, data.rtd, rtdConfig); + onDone(); + return; + } + } + } + const userIds = {}; + const allUserIds = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)().getUserIds(); + if (allUserIds.hasOwnProperty('hadronId')) { + userIds['hadronId'] = allUserIds.hadronId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, 'hadronId user module found', allUserIds.hadronId); + } else { + let hadronId = storage.getDataFromLocalStorage(LS_TAM_KEY); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(hadronId) && hadronId.length > 0) { + userIds['hadronId'] = hadronId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, 'hadronId TAM found', hadronId); + } + } +} + +/** + * Module init + * @param {Object} provider + * @param {Object} userConsent + * @return {boolean} + */ +function init(provider, userConsent) { + return true; +} + +/** @type {RtdSubmodule} */ +const hadronSubmodule = { + name: SUBMODULE_NAME, + getBidRequestData: getRealTimeData, + init: init, + gvlid: AU_GVLID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)(MODULE_NAME, hadronSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('hadronRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/hadronRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["holidBidAdapter"],{ + +/***/ "./modules/holidBidAdapter.js": +/*!************************************!*\ + !*** ./modules/holidBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +const BIDDER_CODE = 'holid'; +const GVLID = 1177; +const ENDPOINT = 'https://helloworld.holid.io/openrtb2/auction'; +const COOKIE_SYNC_ENDPOINT = 'https://null.holid.io/sync.html'; +const TIME_TO_LIVE = 300; +const TMAX = 500; +let wurlMap = {}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + // Validate bid: requires adUnitID parameter + isBidRequestValid: function (bid) { + return !!bid.params.adUnitID; + }, + // Build request payload including GDPR, GPP, and US Privacy data if available + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bid => { + const requestData = { + ...bid.ortb2, + source: { + schain: bid.schain + }, + id: bidderRequest.bidderRequestId, + imp: [getImp(bid)], + tmax: TMAX, + ...buildStoredRequest(bid) + }; + + // GDPR: If available, include GDPR signals in the request + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(requestData, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(requestData, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + + // GPP: If available, include GPP data in regs.ext + if (bidderRequest && bidderRequest.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(requestData, 'regs.ext.gpp', bidderRequest.gpp); + } + if (bidderRequest && bidderRequest.gppSids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(requestData, 'regs.ext.gpp_sid', bidderRequest.gppSids); + } + + // US Privacy: If available, include US Privacy signal in regs.ext + if (bidderRequest && bidderRequest.usPrivacy) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(requestData, 'regs.ext.us_privacy', bidderRequest.usPrivacy); + } + + // If user IDs are available, add them under user.ext.eids + if (bid.userIdAsEids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(requestData, 'user.ext.eids', bid.userIdAsEids); + } + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(requestData), + bidId: bid.bidId + }; + }); + }, + // Interpret response: group bids by unique impid and select the highest CPM bid per imp + interpretResponse: function (serverResponse, bidRequest) { + const bidResponsesMap = {}; // Maps impid -> highest bid object + if (!serverResponse.body || !serverResponse.body.seatbid) { + return []; + } + serverResponse.body.seatbid.forEach(seatbid => { + seatbid.bid.forEach(bid => { + const impId = bid.impid; // Unique identifier matching getImp(bid).id + + // Build meta object with adomain and networkId, preserving any existing data + let meta = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.meta', {}) || {}; + const adomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'adomain', []); + if (adomain.length > 0) { + meta.adomain = adomain; + } + const networkId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.meta.networkId'); + if (networkId) { + meta.networkId = networkId; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bid, 'ext.prebid.meta', meta); + const currentBidResponse = { + requestId: impId, + // Using imp.id as the unique request identifier + cpm: bid.price, + width: bid.w, + height: bid.h, + ad: bid.adm, + creativeId: bid.crid, + currency: serverResponse.body.cur, + netRevenue: true, + ttl: TIME_TO_LIVE, + meta: meta + }; + + // For each imp, only keep the bid with the highest CPM + if (!bidResponsesMap[impId] || currentBidResponse.cpm > bidResponsesMap[impId].cpm) { + bidResponsesMap[impId] = currentBidResponse; + } + + // Store win notification URL (if provided) using the impid as key + const wurl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.events.win'); + if (wurl) { + addWurl(impId, wurl); + } + }); + }); + return Object.values(bidResponsesMap); + }, + // User syncs: supports both image and iframe syncing with privacy parameters if available + getUserSyncs(optionsType, serverResponse, gdprConsent, uspConsent) { + const syncs = [{ + type: 'image', + url: 'https://track.adform.net/Serving/TrackPoint/?pm=2992097&lid=132720821' + }]; + if (!serverResponse || Array.isArray(serverResponse) && serverResponse.length === 0) { + return syncs; + } + const responses = Array.isArray(serverResponse) ? serverResponse : [serverResponse]; + const bidders = getBidders(responses); + if (optionsType.iframeEnabled && bidders) { + const queryParams = []; + queryParams.push('bidders=' + bidders); + if (gdprConsent) { + queryParams.push('gdpr=' + (gdprConsent.gdprApplies ? 1 : 0)); + queryParams.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } else { + queryParams.push('gdpr=0'); + } + if (typeof uspConsent !== 'undefined') { + queryParams.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + queryParams.push('type=iframe'); + const strQueryParams = '?' + queryParams.join('&'); + syncs.push({ + type: 'iframe', + url: COOKIE_SYNC_ENDPOINT + strQueryParams + }); + } + return syncs; + }, + // On bid win, trigger win notification via an image pixel if available + onBidWon(bid) { + const wurl = getWurl(bid.requestId); + if (wurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`Invoking image pixel for wurl on BID_WIN: "${wurl}"`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(wurl); + removeWurl(bid.requestId); + } + } +}; + +// Create a unique impression object with bid id as the identifier +function getImp(bid) { + const imp = buildStoredRequest(bid); + imp.id = bid.bidId; // Ensure imp.id is unique to match the bid response correctly + const sizes = bid.sizes && !Array.isArray(bid.sizes[0]) ? [bid.sizes] : bid.sizes; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner')) { + imp.banner = { + format: sizes.map(size => { + return { + w: size[0], + h: size[1] + }; + }) + }; + } + + // Include bid floor if defined in bid.params + if (bid.params.floor) { + imp.bidfloor = bid.params.floor; + } + return imp; +} + +// Build stored request object using bid parameters +function buildStoredRequest(bid) { + return { + ext: { + prebid: { + storedrequest: { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter)('adUnitID', bid.params) + } + } + } + }; +} + +// Helper: Extract unique bidders from responses for user syncs +function getBidders(responses) { + const bidders = responses.map(res => Object.keys(res.body.ext?.responsetimemillis || {})).flat(); + if (bidders.length) { + return encodeURIComponent(JSON.stringify([...new Set(bidders)])); + } +} + +// Win URL helper functions +function addWurl(requestId, wurl) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(requestId)) { + wurlMap[requestId] = wurl; + } +} +function removeWurl(requestId) { + delete wurlMap[requestId]; +} +function getWurl(requestId) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(requestId)) { + return wurlMap[requestId]; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('holidBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/holidBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["humansecurityRtdProvider"],{ + +/***/ "./modules/humansecurityRtdProvider.js": +/*!*********************************************!*\ + !*** ./modules/humansecurityRtdProvider.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export __TEST__ */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds humansecurity provider to the real time data module + * + * The {@link module:modules/realTimeData} module is required + * The module will inject the HUMAN Security script into the context where Prebid.js is initialized, enriching bid requests with specific data to provide advanced protection against ad fraud and spoofing. + * @module modules/humansecurityRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + * @typedef {import('../modules/rtdModule/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/rtdModule/index.js').UserConsentData} UserConsentData + */ + +const SUBMODULE_NAME = 'humansecurity'; +const SCRIPT_URL = 'https://sonar.script.ac/prebid/rtd.js'; +const { + logInfo, + logWarn, + logError +} = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)(`[${SUBMODULE_NAME}]:`); + +/** @type {string} */ +let clientId = ''; + +/** @type {boolean} */ +let verbose = false; + +/** @type {string} */ +let sessionId = ''; + +/** @type {Object} */ +let hmnsData = {}; + +/** + * Submodule registration + */ +function main() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.submodule)('realTimeData', /** @type {RtdSubmodule} */{ + name: SUBMODULE_NAME, + // + init: (config, userConsent) => { + try { + load(config); + return true; + } catch (err) { + logError('init', err.message); + return false; + } + }, + getBidRequestData: onGetBidRequestData + }); +} + +/** + * Injects HUMAN Security script on the page to facilitate pre-bid signal collection. + * @param {SubmoduleConfig} config + */ +function load(config) { + // By default, this submodule loads the generic implementation script + // only identified by the referrer information. In the future, if publishers + // want to have analytics where their websites are grouped, they can request + // Client ID from HUMAN, pass it here, and it will enable advanced reporting + clientId = config?.params?.clientId || ''; + if (clientId && (typeof clientId !== 'string' || !/^\w{3,16}$/.test(clientId))) { + throw new Error(`The 'clientId' parameter must be a short alphanumeric string`); + } + + // Load/reset the state + verbose = !!config?.params?.verbose; + sessionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + hmnsData = {}; + + // We rely on prebid implementation to get the best domain possible here + // In some cases, it still might be null, though + const refDomain = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.getRefererInfo)().domain || ''; + + // Once loaded, the implementation script will publish an API using + // the session ID value it was given in data attributes + const scriptAttrs = { + 'data-sid': sessionId + }; + const scriptUrl = `${SCRIPT_URL}?r=${refDomain}${clientId ? `&c=${clientId}` : ''}`; + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(scriptUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, SUBMODULE_NAME, onImplLoaded, null, scriptAttrs); +} + +/** + * The callback to loadExternalScript + * Establishes the bridge between this RTD submodule and the loaded implementation + */ +function onImplLoaded() { + // We then get a hold on this script using the knowledge of this session ID + const wnd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSelf)(); + const impl = wnd[`sonar_${sessionId}`]; + if (typeof impl !== 'object' || typeof impl.connect !== 'function') { + verbose && logWarn('onload', 'Unable to access the implementation script'); + return; + } + + // And set up a bridge between the RTD submodule and the implementation. + // The first argument is used to identify the caller. + // The callback might be called multiple times to update the signals + // once more precise information is available. + impl.connect((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)(), onImplMessage); +} + +/** + * The bridge function will be called by the implementation script + * to update the token information or report errors + * @param {Object} msg + */ +function onImplMessage(msg) { + if (typeof msg !== 'object') { + return; + } + switch (msg.type) { + case 'hmns': + { + hmnsData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)({}, msg.data || {}); + break; + } + case 'error': + { + logError('impl', msg.data || ''); + break; + } + case 'warn': + { + verbose && logWarn('impl', msg.data || ''); + break; + } + case 'info': + { + verbose && logInfo('impl', msg.data || ''); + break; + } + } +} + +/** + * onGetBidRequestData is called once per auction. + * Update the `ortb2Fragments` object with the data from the injected script. + * + * @param {Object} reqBidsConfigObj + * @param {function} callback + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ +function onGetBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + // Add device.ext.hmns to the global ORTB data for all vendors to use + // At the time of writing this submodule, "hmns" is an object defined + // internally by humansecurity, and it currently contains "v1" field + // with a token that contains collected signals about this session. + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global, { + device: { + ext: { + hmns: hmnsData + } + } + }); + callback(); +} + +/** + * Exporting local (and otherwise encapsulated to this module) functions + * for testing purposes + */ +const __TEST__ = { + SUBMODULE_NAME, + SCRIPT_URL, + main, + load, + onImplLoaded, + onImplMessage, + onGetBidRequestData +}; +main(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('humansecurityRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/humansecurityRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["hybridBidAdapter"],{ + +/***/ "./modules/hybridBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/hybridBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'hybrid'; +const DSP_ENDPOINT = 'https://hbe198.hybrid.ai/prebidhb'; +const TRAFFIC_TYPE_WEB = 1; +const PLACEMENT_TYPE_BANNER = 1; +const PLACEMENT_TYPE_VIDEO = 2; +const PLACEMENT_TYPE_IN_IMAGE = 3; +const TTL = 60; +const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const placementTypes = { + 'banner': PLACEMENT_TYPE_BANNER, + 'video': PLACEMENT_TYPE_VIDEO, + 'inImage': PLACEMENT_TYPE_IN_IMAGE +}; +function buildBidRequests(validBidRequests) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._map)(validBidRequests, function (validBidRequest) { + const params = validBidRequest.params; + const bidRequest = { + bidId: validBidRequest.bidId, + transactionId: validBidRequest.ortb2Imp?.ext?.tid, + sizes: validBidRequest.sizes, + placement: placementTypes[params.placement], + placeId: params.placeId, + imageUrl: params.imageUrl || '' + }; + return bidRequest; + }); +} +const outstreamRender = bid => { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [bid.width, bid.height], + targetId: bid.adUnitCode, + rendererOptions: { + showBigPlayButton: false, + showProgressBar: 'bar', + showVolume: false, + allowFullscreen: true, + skippable: false, + content: bid.vastXml + } + }); + }); +}; +const createRenderer = bid => { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_1__.Renderer.install({ + targetId: bid.adUnitCode, + url: RENDERER_URL, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +}; +function buildBid(bidData) { + const bid = { + requestId: bidData.bidId, + cpm: bidData.price, + width: bidData.width, + height: bidData.height, + creativeId: bidData.bidId, + currency: bidData.currency, + netRevenue: true, + ttl: TTL, + meta: { + advertiserDomains: bidData.advertiserDomains || [] + } + }; + if (bidData.placement === PLACEMENT_TYPE_VIDEO) { + bid.vastXml = bidData.content; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + const video = bidData.mediaTypes?.video; + if (video) { + bid.width = video.playerSize[0][0]; + bid.height = video.playerSize[0][1]; + if (video.context === 'outstream') { + bid.renderer = createRenderer(bid); + } + } + } else if (bidData.placement === PLACEMENT_TYPE_IN_IMAGE) { + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + bid.inImageContent = { + content: { + content: bidData.content, + actionUrls: {} + } + }; + let actionUrls = bid.inImageContent.content.actionUrls; + actionUrls.loadUrls = bidData.inImage.loadtrackers || []; + actionUrls.impressionUrls = bidData.inImage.imptrackers || []; + actionUrls.scrollActUrls = bidData.inImage.startvisibilitytrackers || []; + actionUrls.viewUrls = bidData.inImage.viewtrackers || []; + actionUrls.stopAnimationUrls = bidData.inImage.stopanimationtrackers || []; + actionUrls.closeBannerUrls = bidData.inImage.closebannertrackers || []; + if (bidData.inImage.but) { + let inImageOptions = bid.inImageContent.content.inImageOptions = {}; + inImageOptions.hasButton = true; + inImageOptions.buttonLogoUrl = bidData.inImage.but_logo; + inImageOptions.buttonProductUrl = bidData.inImage.but_prod; + inImageOptions.buttonHead = bidData.inImage.but_head; + inImageOptions.buttonHeadColor = bidData.inImage.but_head_colour; + inImageOptions.dynparams = bidData.inImage.dynparams || {}; + } + bid.ad = wrapAd(bid, bidData); + } else { + bid.ad = bidData.content; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + } + return bid; +} +function getMediaTypeFromBid(bid) { + return bid.mediaTypes && Object.keys(bid.mediaTypes)[0]; +} +function hasVideoMandatoryParams(mediaTypes) { + const isHasVideoContext = !!mediaTypes.video && (mediaTypes.video.context === 'instream' || mediaTypes.video.context === 'outstream'); + const isPlayerSize = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mediaTypes, 'video.playerSize') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mediaTypes, 'video.playerSize')); + return isHasVideoContext && isPlayerSize; +} +function wrapAd(bid, bidData) { + return ` + + + + + + + + +
+ + + `; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + placementTypes: placementTypes, + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid(bid) { + return !!bid.params.placeId && !!bid.params.placement && (getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER && bid.params.placement === 'banner' || getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER && bid.params.placement === 'inImage' && !!bid.params.imageUrl || getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO && bid.params.placement === 'video' && hasVideoMandatoryParams(bid.mediaTypes)); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests(validBidRequests, bidderRequest) { + const payload = { + // TODO: is 'page' the right value here? + url: bidderRequest.refererInfo.page, + cmp: !!bidderRequest.gdprConsent, + trafficType: TRAFFIC_TYPE_WEB, + bidRequests: buildBidRequests(validBidRequests) + }; + if (payload.cmp) { + const gdprApplies = bidderRequest.gdprConsent.gdprApplies; + if (gdprApplies !== undefined) payload['ga'] = gdprApplies; + payload['cs'] = bidderRequest.gdprConsent.consentString; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: DSP_ENDPOINT, + data: payloadString, + options: { + contentType: 'application/json' + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bidRequests = JSON.parse(bidRequest.data).bidRequests; + const serverBody = serverResponse.body; + if (serverBody && serverBody.bids && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(serverBody.bids)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._map)(serverBody.bids, function (bid) { + let rawBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(bidRequests, function (item) { + return item.bidId === bid.bidId; + }); + bid.placement = rawBid.placement; + bid.placeId = rawBid.placeId; + return buildBid(bid); + }); + } else { + return []; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('hybridBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/hybridBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["hypelabBidAdapter"],{ + +/***/ "./modules/hypelabBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/hypelabBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_CODE, ENDPOINT_URL, REQUEST_ROUTE, EVENT_ROUTE, REPORTING_ROUTE, mediaSize, report, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + +const BIDDER_CODE = 'hypelab'; +const ENDPOINT_URL = 'https://api.hypelab.com'; +const REQUEST_ROUTE = '/v1/prebid_requests'; +const EVENT_ROUTE = '/v1/events'; +const REPORTING_ROUTE = ''; +const PREBID_VERSION = "9.45.0-pre"; +const PROVIDER_NAME = 'prebid'; +const PROVIDER_VERSION = '0.0.2'; +const url = route => ENDPOINT_URL + route; +function mediaSize(data) { + if (!data || !data.creative_set) return { + width: 0, + height: 0 + }; + const media = data.creative_set.video || data.creative_set.image || {}; + return { + width: media.width, + height: media.height + }; +} +function isBidRequestValid(bidderRequest) { + return !!bidderRequest.params?.property_slug && !!bidderRequest.params?.placement_slug; +} +function buildRequests(validBidRequests, bidderRequest) { + const result = validBidRequests.map(request => { + const uids = (request.userIdAsEids || []).reduce((a, c) => { + const ids = c.uids.map(uid => uid.id); + return [...a, ...ids]; + }, []); + const uuid = uids[0] ? uids[0] : generateTemporaryUUID(); + const floor = getBidFloor(request, request.sizes || []); + const dpr = typeof window != 'undefined' ? window.devicePixelRatio : 1; + const payload = { + property_slug: request.params.property_slug, + placement_slug: request.params.placement_slug, + provider_version: PROVIDER_VERSION, + provider_name: PROVIDER_NAME, + location: bidderRequest.refererInfo?.page || typeof window != 'undefined' ? window.location.href : '', + sdk_version: PREBID_VERSION, + sizes: request.sizes, + wids: [], + floor, + dpr, + uuid, + bidRequestsCount: request.bidRequestsCount, + bidderRequestsCount: request.bidderRequestsCount, + bidderWinsCount: request.bidderWinsCount, + wp: { + ada: typeof window != 'undefined' && !!window.cardano, + bnb: typeof window != 'undefined' && !!window.BinanceChain, + eth: typeof window != 'undefined' && !!window.ethereum, + sol: typeof window != 'undefined' && !!window.solana, + tron: typeof window != 'undefined' && !!window.tron + } + }; + return { + method: 'POST', + url: url(REQUEST_ROUTE), + options: { + contentType: 'application/json', + withCredentials: false + }, + data: payload, + bidId: request.bidId + }; + }); + return result; +} +function generateTemporaryUUID() { + return 'tmp_' + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +} +function getBidFloor(bid, sizes) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return bid.params.bidFloor ? bid.params.bidFloor : null; + } + let floor; + let floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: sizes.length === 1 ? sizes[0] : '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = parseFloat(floorInfo.floor); + } + return floor; +} +function interpretResponse(serverResponse, bidRequest) { + const { + data + } = serverResponse.body; + if (!data.cpm || !data.html) return []; + const size = mediaSize(data); + const result = { + requestId: bidRequest.bidId, + cpm: data.cpm, + width: size.width, + height: size.height, + creativeId: data.creative_set_slug, + currency: data.currency, + netRevenue: true, + referrer: bidRequest.data.location, + ttl: data.ttl, + ad: data.html, + mediaType: serverResponse.body.data.media_type, + meta: { + advertiserDomains: data.advertiser_domains || [] + } + }; + return [result]; +} +function report(eventType, data) { + let route = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : REPORTING_ROUTE; + if (!route) return; + const options = { + method: 'POST', + contentType: 'application/json', + withCredentials: true + }; + const request = { + type: eventType, + data + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url(route), null, request, options); +} +function onTimeout(timeoutData) { + this.report('timeout', timeoutData); +} +function onBidWon(bid) { + this.report('bidWon', bid); +} +function onSetTargeting(bid) { + this.report('setTargeting', bid); +} +function onBidderError(errorData) { + this.report('bidderError', errorData); +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + aliases: ['hype'], + isBidRequestValid, + buildRequests, + interpretResponse, + onTimeout, + onBidWon, + onSetTargeting, + onBidderError, + report, + REPORTING_ROUTE: 'a' +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('hypelabBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/hypelabBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["iasRtdProvider"],{ + +/***/ "./modules/iasRtdProvider.js": +/*!***********************************!*\ + !*** ./modules/iasRtdProvider.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports iasTargeting, init, getApiCallback, iasSubModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** @type {string} */ +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'ias'; +const IAS_HOST = 'https://pixel.adsafeprotected.com/services/pub'; +let iasTargeting = {}; +const BRAND_SAFETY_OBJECT_FIELD_NAME = 'brandSafety'; +const FRAUD_FIELD_NAME = 'fr'; +const SLOTS_OBJECT_FIELD_NAME = 'slots'; +const CUSTOM_FIELD_NAME = 'custom'; +const IAS_KW = 'ias-kw'; +const IAS_KEY_MAPPINGS = { + adt: 'adt', + alc: 'alc', + dlm: 'dlm', + hat: 'hat', + off: 'off', + vio: 'vio', + drg: 'drg', + 'ias-kw': 'ias-kw', + fr: 'fr', + vw: 'vw', + grm: 'grm', + pub: 'pub', + vw05: 'vw05', + vw10: 'vw10', + vw15: 'vw15', + vw30: 'vw30', + vw_vv: 'vw_vv', + grm_vv: 'grm_vv', + pub_vv: 'pub_vv', + id: 'id' +}; + +/** + * Module init + * @param {Object} config + * @param {Object} userConsent + * @return {boolean} + */ +function init(config, userConsent) { + const params = config.params; + if (!params || !params.pubId) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('missing pubId param for IAS provider'); + return false; + } + if (params.hasOwnProperty('keyMappings')) { + const keyMappings = params.keyMappings; + for (let prop in keyMappings) { + if (IAS_KEY_MAPPINGS.hasOwnProperty(prop)) { + IAS_KEY_MAPPINGS[prop] = keyMappings[prop]; + } + } + } + return true; +} +function stringifySlotSizes(sizes) { + let result = ''; + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray(sizes)) { + result = sizes.reduce((acc, size) => { + acc.push(size.join('.')); + return acc; + }, []); + result = '[' + result.join(',') + ']'; + } + return result; +} +function getAdUnitPath(adSlot, bidRequest, adUnitPath) { + let p = bidRequest.code; + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty(adSlot)) { + p = adSlot.gptSlot; + } else { + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty(adUnitPath) && adUnitPath.hasOwnProperty(bidRequest.code)) { + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr(adUnitPath[bidRequest.code]) && !_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty(adUnitPath[bidRequest.code])) { + p = adUnitPath[bidRequest.code]; + } + } + } + return p; +} +function stringifySlot(bidRequest, adUnitPath) { + const sizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__.getAdUnitSizes)(bidRequest); + const id = bidRequest.code; + const ss = stringifySlotSizes(sizes); + const adSlot = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_2__.getGptSlotInfoForAdUnitCode)(bidRequest.code); + const p = getAdUnitPath(adSlot, bidRequest, adUnitPath); + const slot = { + id, + ss, + p + }; + const keyValues = Object.keys(slot).map(function (key) { + return [key, slot[key]].join(':'); + }); + return '{' + keyValues.join(',') + '}'; +} +function stringifyWindowSize() { + const { + innerWidth, + innerHeight + } = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions(); + return [innerWidth || -1, innerHeight || -1].join('.'); +} +function stringifyScreenSize() { + return [window.screen && window.screen.width || -1, window.screen && window.screen.height || -1].join('.'); +} +function renameKeyValues(source) { + let result = {}; + for (let prop in IAS_KEY_MAPPINGS) { + if (source.hasOwnProperty(prop)) { + result[IAS_KEY_MAPPINGS[prop]] = source[prop]; + } + } + return result; +} +function formatTargetingData(adUnit) { + let result = {}; + if (iasTargeting[BRAND_SAFETY_OBJECT_FIELD_NAME]) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep(result, iasTargeting[BRAND_SAFETY_OBJECT_FIELD_NAME]); + } + if (iasTargeting[FRAUD_FIELD_NAME]) { + result[FRAUD_FIELD_NAME] = iasTargeting[FRAUD_FIELD_NAME]; + } + if (iasTargeting[CUSTOM_FIELD_NAME] && IAS_KW in iasTargeting[CUSTOM_FIELD_NAME]) { + result[IAS_KW] = iasTargeting[CUSTOM_FIELD_NAME][IAS_KW]; + } + if (iasTargeting[SLOTS_OBJECT_FIELD_NAME] && adUnit in iasTargeting[SLOTS_OBJECT_FIELD_NAME]) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep(result, iasTargeting[SLOTS_OBJECT_FIELD_NAME][adUnit]); + } + return renameKeyValues(result); +} +function constructQueryString(anId, adUnits, pageUrl, adUnitPath) { + let queries = []; + queries.push(['anId', anId]); + queries = queries.concat(adUnits.reduce(function (acc, request) { + acc.push(['slot', stringifySlot(request, adUnitPath)]); + return acc; + }, [])); + queries.push(['wr', stringifyWindowSize()]); + queries.push(['sr', stringifyScreenSize()]); + queries.push(['url', encodeURIComponent(pageUrl)]); + return encodeURI(queries.map(qs => qs.join('=')).join('&')); +} +function parseResponse(result) { + try { + mergeResponseData(JSON.parse(result)); + } catch (err) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('error', err); + } +} +function mergeResponseData(iasResponse) { + const cachedSlots = iasTargeting[SLOTS_OBJECT_FIELD_NAME] || {}; + iasTargeting = iasResponse; + const slots = iasTargeting[SLOTS_OBJECT_FIELD_NAME] || {}; + Object.keys(cachedSlots).filter(adUnit => adUnit in slots === false).forEach(adUnit => slots[adUnit] = cachedSlots[adUnit]); +} +function getTargetingData(adUnits, config, userConsent) { + const targeting = {}; + try { + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty(iasTargeting)) { + adUnits.forEach(function (adUnit) { + targeting[adUnit] = formatTargetingData(adUnit); + }); + } + } catch (err) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('error', err); + } + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo('IAS targeting', targeting); + return targeting; +} +function isValidHttpUrl(string) { + let url; + try { + url = new URL(string); + } catch (_) { + return false; + } + return url.protocol === 'http:' || url.protocol === 'https:'; +} +function getApiCallback() { + return { + success: function (response, req) { + if (req.status === 200) { + try { + parseResponse(response); + } catch (e) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('Unable to parse IAS response.', e); + } + } + }, + error: function () { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError('failed to retrieve IAS data'); + } + }; +} +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + const adUnits = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().adUnits; + const { + pubId + } = config.params; + let { + pageUrl + } = config.params; + const { + adUnitPath + } = config.params; + if (!isValidHttpUrl(pageUrl)) { + pageUrl = document.location.href; + } + const queryString = constructQueryString(pubId, adUnits, pageUrl, adUnitPath); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(`${IAS_HOST}?${queryString}`, getApiCallback(), undefined, { + method: 'GET' + }); + callback(); +} + +/** @type {RtdSubmodule} */ +const iasSubModule = { + name: SUBMODULE_NAME, + init: init, + getTargetingData: getTargetingData, + getBidRequestData: getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)(MODULE_NAME, iasSubModule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('iasRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/iasRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["id5AnalyticsAdapter"],{ + +/***/ "./modules/id5AnalyticsAdapter.js": +/*!****************************************!*\ + !*** ./modules/id5AnalyticsAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); + + + + + + + +const { + AUCTION_END, + TCF2_ENFORCEMENT, + BID_WON, + BID_VIEWABLE, + AD_RENDER_FAILED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const GVLID = 131; +const STANDARD_EVENTS_TO_TRACK = [AUCTION_END, TCF2_ENFORCEMENT, BID_WON]; + +// These events cause the buffered events to be sent over +const FLUSH_EVENTS = [TCF2_ENFORCEMENT, AUCTION_END, BID_WON, BID_VIEWABLE, AD_RENDER_FAILED]; +const CONFIG_URL_PREFIX = 'https://api.id5-sync.com/analytics'; +const TZ = new Date().getTimezoneOffset(); +const PBJS_VERSION = 'v' + "9.45.0-pre"; +const ID5_REDACTED = '__ID5_REDACTED__'; +const isArray = Array.isArray; +let id5Analytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + analyticsType: 'endpoint' +}), { + // Keeps an array of events for each auction + eventBuffer: {}, + eventsToTrack: STANDARD_EVENTS_TO_TRACK, + track: event => { + const _this = id5Analytics; + if (!event || !event.args) { + return; + } + try { + const auctionId = event.args.auctionId; + _this.eventBuffer[auctionId] = _this.eventBuffer[auctionId] || []; + + // Collect events and send them in a batch when the auction ends + const que = _this.eventBuffer[auctionId]; + que.push(_this.makeEvent(event.eventType, event.args)); + if (FLUSH_EVENTS.indexOf(event.eventType) >= 0) { + // Auction ended. Send the batch of collected events + _this.sendEvents(que); + + // From now on just send events to server side as they come + que.push = pushedEvent => _this.sendEvents([pushedEvent]); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('id5Analytics: ERROR', error); + _this.sendErrorEvent(error); + } + }, + sendEvents: eventsToSend => { + const _this = id5Analytics; + // By giving some content this will be automatically a POST + eventsToSend.forEach(event => (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(_this.options.ingestUrl, null, JSON.stringify(event))); + }, + makeEvent: (event, payload) => { + const _this = id5Analytics; + const filteredPayload = deepTransformingClone(payload, transformFnFromCleanupRules(event)); + return { + source: 'pbjs', + event, + payload: filteredPayload, + partnerId: _this.options.partnerId, + meta: { + sampling: _this.options.id5Sampling, + pbjs: PBJS_VERSION, + tz: TZ + } + }; + }, + sendErrorEvent: error => { + const _this = id5Analytics; + _this.sendEvents([_this.makeEvent('analyticsError', { + message: error.message, + stack: error.stack + })]); + }, + random: () => Math.random() +}); +const ENABLE_FUNCTION = config => { + const _this = id5Analytics; + _this.options = config && config.options || {}; + const partnerId = _this.options.partnerId; + if (typeof partnerId !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('id5Analytics: partnerId in config.options must be a number representing the id5 partner ID'); + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(`${CONFIG_URL_PREFIX}/${partnerId}/pbjs`, result => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('id5Analytics: Received from configuration endpoint', result); + const configFromServer = JSON.parse(result); + const sampling = _this.options.id5Sampling = typeof configFromServer.sampling === 'number' ? configFromServer.sampling : 0; + if (typeof configFromServer.ingestUrl !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('id5Analytics: cannot find ingestUrl in config endpoint response; no analytics will be available'); + return; + } + _this.options.ingestUrl = configFromServer.ingestUrl; + + // 3-way fallback for which events to track: server > config > standard + _this.eventsToTrack = configFromServer.eventsToTrack || _this.options.eventsToTrack || STANDARD_EVENTS_TO_TRACK; + _this.eventsToTrack = isArray(_this.eventsToTrack) ? _this.eventsToTrack : STANDARD_EVENTS_TO_TRACK; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('id5Analytics: Configuration is', _this.options); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('id5Analytics: Tracking events', _this.eventsToTrack); + if (sampling > 0 && _this.random() < 1 / sampling) { + // Init the module only if we got lucky + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('id5Analytics: Selected by sampling. Starting up!'); + + // Clean start + _this.eventBuffer = {}; + + // Replay all events until now + if (!config.disablePastEventsProcessing) { + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.getEvents().forEach(event => { + if (event && _this.eventsToTrack.indexOf(event.eventType) >= 0) { + _this.track(event); + } + }); + } + + // Merge in additional cleanup rules + if (configFromServer.additionalCleanupRules) { + const newRules = configFromServer.additionalCleanupRules; + _this.eventsToTrack.forEach(key => { + // Some protective checks in case we mess up server side + if (isArray(newRules[key]) && newRules[key].every(eventRules => isArray(eventRules.match) && eventRules.apply in TRANSFORM_FUNCTIONS)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('id5Analytics: merging additional cleanup rules for event ' + key); + CLEANUP_RULES[key].push(...newRules[key]); + } + }); + } + + // Register to the events of interest + _this.handlers = {}; + _this.eventsToTrack.forEach(eventType => { + const handler = _this.handlers[eventType] = args => _this.track({ + eventType, + args + }); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.on(eventType, handler); + }); + } + }); + + // Make only one init possible within a lifecycle + _this.enableAnalytics = () => {}; +}; +id5Analytics.enableAnalytics = ENABLE_FUNCTION; +id5Analytics.disableAnalytics = () => { + const _this = id5Analytics; + // Un-register to the events of interest + _this.eventsToTrack.forEach(eventType => { + if (_this.handlers && _this.handlers[eventType]) { + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.off(eventType, _this.handlers[eventType]); + } + }); + + // Make re-init possible. Work around the fact that past events cannot be forgotten + _this.enableAnalytics = config => { + config.disablePastEventsProcessing = true; + ENABLE_FUNCTION(config); + }; +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: id5Analytics, + code: 'id5Analytics', + gvlid: GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (id5Analytics); +function redact(obj, key) { + obj[key] = ID5_REDACTED; +} +function erase(obj, key) { + delete obj[key]; +} + +// The transform function matches against a path and applies +// required transformation if match is found. +function deepTransformingClone(obj, transform) { + let currentPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; + const result = isArray(obj) ? [] : {}; + const recursable = typeof obj === 'object' && obj !== null; + if (recursable) { + const keys = Object.keys(obj); + if (keys.length > 0) { + keys.forEach(key => { + const newPath = currentPath.concat(key); + result[key] = deepTransformingClone(obj[key], transform, newPath); + transform(newPath, result, key); + }); + return result; + } + } + return obj; +} + +// Every set of rules is an object where "match" is an array and +// "apply" is the function to apply in case of match. The function to apply +// takes (obj, prop) and transforms property "prop" in object "obj". +// The "match" is an array of path parts. Each part is either a string or an array. +// In case of array, it represents alternatives which all would match. +// Special path part '*' matches any subproperty or array index. +// Prefixing a part with "!" makes it negative match (doesn't work with multiple alternatives) +const CLEANUP_RULES = {}; +CLEANUP_RULES[AUCTION_END] = [{ + match: [['adUnits', 'bidderRequests'], '*', 'bids', '*', ['userId', 'crumbs'], '!id5id'], + apply: 'redact' +}, { + match: [['adUnits', 'bidderRequests'], '*', 'bids', '*', ['userId', 'crumbs'], 'id5id', 'uid'], + apply: 'redact' +}, { + match: [['adUnits', 'bidderRequests'], '*', 'bids', '*', 'userIdAsEids', '*', 'uids', '*', ['id', 'ext']], + apply: 'redact' +}, { + match: ['bidderRequests', '*', 'gdprConsent', 'vendorData'], + apply: 'erase' +}, { + match: ['bidsReceived', '*', ['ad', 'native']], + apply: 'erase' +}, { + match: ['noBids', '*', ['userId', 'crumbs'], '*'], + apply: 'redact' +}, { + match: ['noBids', '*', 'userIdAsEids', '*', 'uids', '*', ['id', 'ext']], + apply: 'redact' +}]; +CLEANUP_RULES[BID_WON] = [{ + match: [['ad', 'native']], + apply: 'erase' +}]; +const TRANSFORM_FUNCTIONS = { + 'redact': redact, + 'erase': erase +}; + +// Builds a rule function depending on the event type +function transformFnFromCleanupRules(eventType) { + const rules = CLEANUP_RULES[eventType] || []; + return (path, obj, key) => { + for (let i = 0; i < rules.length; i++) { + let match = true; + const ruleMatcher = rules[i].match; + const transformation = rules[i].apply; + if (ruleMatcher.length !== path.length) { + continue; + } + for (let fragment = 0; fragment < ruleMatcher.length && match; fragment++) { + const choices = makeSureArray(ruleMatcher[fragment]); + match = !choices.every(choice => choice !== '*' && (choice.charAt(0) === '!' ? path[fragment] === choice.substring(1) : path[fragment] !== choice)); + } + if (match) { + const transformfn = TRANSFORM_FUNCTIONS[transformation]; + transformfn(obj, key); + break; + } + } + }; +} +function makeSureArray(object) { + return isArray(object) ? object : [object]; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('id5AnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/id5AnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["id5IdSystem"],{ + +/***/ "./modules/id5IdSystem.js": +/*!********************************!*\ + !*** ./modules/id5IdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ID5_STORAGE_NAME, storage, id5IdSubmodule, IdFetchFlow */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); + +/** + * This module adds ID5 to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/id5IdSystem + * @requires module:modules/userId + */ + + + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'id5Id'; +const GVLID = 131; +const ID5_STORAGE_NAME = 'id5id'; +const LOG_PREFIX = 'User ID - ID5 submodule: '; +const ID5_API_CONFIG_URL = 'https://id5-sync.com/api/config/prebid'; +const ID5_DOMAIN = 'id5-sync.com'; +const TRUE_LINK_SOURCE = 'true-link-id5-sync.com'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** + * @typedef {Object} IdResponse + * @property {string} [universal_uid] - The encrypted ID5 ID to pass to bidders + * @property {Object} [ext] - The extensions object to pass to bidders + * @property {Object} [ab_testing] - A/B testing configuration + */ + +/** + * @typedef {Object} FetchCallConfig + * @property {string} [url] - The URL for the fetch endpoint + * @property {Object} [overrides] - Overrides to apply to fetch parameters + */ + +/** + * @typedef {Object} ExtensionsCallConfig + * @property {string} [url] - The URL for the extensions endpoint + * @property {string} [method] - Overrides the HTTP method to use to make the call + * @property {Object} [body] - Specifies a body to pass to the extensions endpoint + */ + +/** + * @typedef {Object} DynamicConfig + * @property {FetchCallConfig} [fetchCall] - The fetch call configuration + * @property {ExtensionsCallConfig} [extensionsCall] - The extensions call configuration + */ + +/** + * @typedef {Object} ABTestingConfig + * @property {boolean} enabled - Tells whether A/B testing is enabled for this instance + * @property {number} controlGroupPct - A/B testing probability + */ + +/** + * @typedef {Object} Multiplexing + * @property {boolean} [disabled] - Disable multiplexing (instance will work in single mode) + */ + +/** + * @typedef {Object} Diagnostics + * @property {boolean} [publishingDisabled] - Disable diagnostics publishing + * @property {number} [publishAfterLoadInMsec] - Delay in ms after script load after which collected diagnostics are published + * @property {boolean} [publishBeforeWindowUnload] - When true, diagnostics publishing is triggered on Window 'beforeunload' event + * @property {number} [publishingSampleRatio] - Diagnostics publishing sample ratio + */ + +/** + * @typedef {Object} Segment + * @property {string} [destination] - GVL ID or ID5-XX Partner ID. Mandatory + * @property {Array} [ids] - The segment IDs to push. Must contain at least one segment ID. + */ + +/** + * @typedef {Object} Id5PrebidConfig + * @property {number} partner - The ID5 partner ID + * @property {string} pd - The ID5 partner data string + * @property {ABTestingConfig} abTesting - The A/B testing configuration + * @property {boolean} disableExtensions - Disabled extensions call + * @property {string} [externalModuleUrl] - URL for the id5 prebid external module + * @property {Multiplexing} [multiplexing] - Multiplexing options. Only supported when loading the external module. + * @property {Diagnostics} [diagnostics] - Diagnostics options. Supported only in multiplexing + * @property {Array} [segments] - A list of segments to push to partners. Supported only in multiplexing. + * @property {boolean} [disableUaHints] - When true, look up of high entropy values through user agent hints is disabled. + */ + +const DEFAULT_EIDS = { + 'id5id': { + getValue: function (data) { + return data.uid; + }, + source: ID5_DOMAIN, + atype: 1, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'euid': { + getValue: function (data) { + return data.uid; + }, + getSource: function (data) { + return data.source; + }, + atype: 3, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'trueLinkId': { + getValue: function (data) { + return data.uid; + }, + getSource: function (data) { + return TRUE_LINK_SOURCE; + }, + atype: 1, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + } +}; + +/** @type {Submodule} */ +const id5IdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'id5Id', + /** + * Vendor id of ID5 + * @type {Number} + */ + gvlid: GVLID, + /** + * decode the stored id value for passing to bid requests + * @function decode + * @param {(Object|string)} value + * @param {SubmoduleConfig|undefined} config + * @returns {(Object|undefined)} + */ + decode(value, config) { + if (value && value.ids !== undefined) { + const responseObj = {}; + const eids = {}; + Object.entries(value.ids).forEach(_ref => { + let [key, value] = _ref; + let eid = value.eid; + let uid = eid?.uids?.[0]; + responseObj[key] = { + uid: uid?.id, + ext: uid?.ext + }; + eids[key] = function () { + return eid; + }; // register function to get eid for each id (key) decoded + }); + this.eids = eids; // overwrite global eids + return responseObj; + } + let universalUid, publisherTrueLinkId; + let ext = {}; + if (value && typeof value.universal_uid === 'string') { + universalUid = value.universal_uid; + ext = value.ext || ext; + publisherTrueLinkId = value.publisherTrueLinkId; + } else { + return undefined; + } + this.eids = DEFAULT_EIDS; + let responseObj = { + id5id: { + uid: universalUid, + ext: ext + } + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(ext.euid)) { + responseObj.euid = { + uid: ext.euid.uids[0].id, + source: ext.euid.source, + ext: { + provider: ID5_DOMAIN + } + }; + } + if (publisherTrueLinkId) { + responseObj.trueLinkId = { + uid: publisherTrueLinkId + }; + } + const abTestingResult = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value, 'ab_testing.result'); + switch (abTestingResult) { + case 'control': + // A/B Testing is enabled and user is in the Control Group + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'A/B Testing - user is in the Control Group: ID5 ID is NOT exposed'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(responseObj, 'id5id.ext.abTestingControlGroup', true); + break; + case 'error': + // A/B Testing is enabled, but configured improperly, so skip A/B testing + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'A/B Testing ERROR! controlGroupPct must be a number >= 0 and <= 1'); + break; + case 'normal': + // A/B Testing is enabled but user is not in the Control Group, so ID5 ID is shared + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'A/B Testing - user is NOT in the Control Group'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(responseObj, 'id5id.ext.abTestingControlGroup', false); + break; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'Decoded ID', responseObj); + return responseObj; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function getId + * @param {SubmoduleConfig} submoduleConfig + * @param {ConsentData} consentData + * @param {(Object|undefined)} cacheIdObj + * @returns {IdResponse|undefined} + */ + getId(submoduleConfig, consentData, cacheIdObj) { + if (!validateConfig(submoduleConfig)) { + return undefined; + } + if (!hasWriteConsentToLocalStorage(consentData?.gdpr)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'Skipping ID5 local storage write because no consent given.'); + return undefined; + } + const resp = function (cbFunction) { + const fetchFlow = new IdFetchFlow(submoduleConfig, consentData?.gdpr, cacheIdObj, consentData?.usp, consentData?.gpp); + fetchFlow.execute().then(response => { + cbFunction(response); + }).catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'getId fetch encountered an error', error); + cbFunction(); + }); + }; + return { + callback: resp + }; + }, + /** + * Similar to Submodule#getId, this optional method returns response to for id that exists already. + * If IdResponse#id is defined, then it will be written to the current active storage even if it exists already. + * If IdResponse#callback is defined, then it'll called at the end of auction. + * It's permissible to return neither, one, or both fields. + * @function extendId + * @param {SubmoduleConfig} config + * @param {ConsentData|undefined} consentData + * @param {Object} cacheIdObj - existing id, if any + * @return {IdResponse} A response object that contains id. + */ + extendId(config, consentData, cacheIdObj) { + if (!hasWriteConsentToLocalStorage(consentData?.gdpr)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'No consent given for ID5 local storage writing, skipping nb increment.'); + return cacheIdObj; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'using cached ID', cacheIdObj); + if (cacheIdObj) { + cacheIdObj.nbPage = incrementNb(cacheIdObj); + } + return cacheIdObj; + }, + primaryIds: ['id5id', 'trueLinkId'], + eids: DEFAULT_EIDS, + _reset() { + this.eids = DEFAULT_EIDS; + } +}; +class IdFetchFlow { + constructor(submoduleConfig, gdprConsentData, cacheIdObj, usPrivacyData, gppData) { + this.submoduleConfig = submoduleConfig; + this.gdprConsentData = gdprConsentData; + this.cacheIdObj = cacheIdObj; + this.usPrivacyData = usPrivacyData; + this.gppData = gppData; + } + + /** + * Calls the ID5 Servers to fetch an ID5 ID + * @returns {Promise} The result of calling the server side + */ + async execute() { + const configCallPromise = this.#callForConfig(); + if (this.#isExternalModule()) { + try { + return await this.#externalModuleFlow(configCallPromise); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'Error while performing ID5 external module flow. Continuing with regular flow.', error); + return this.#regularFlow(configCallPromise); + } + } else { + return this.#regularFlow(configCallPromise); + } + } + #isExternalModule() { + return typeof this.submoduleConfig.params.externalModuleUrl === 'string'; + } + async #externalModuleFlow(configCallPromise) { + await loadExternalModule(this.submoduleConfig.params.externalModuleUrl); + const fetchFlowConfig = await configCallPromise; + return this.#getExternalIntegration().fetchId5Id(fetchFlowConfig, this.submoduleConfig.params, (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)(), this.gdprConsentData, this.usPrivacyData, this.gppData); + } + #getExternalIntegration() { + return window.id5Prebid && window.id5Prebid.integration; + } + async #regularFlow(configCallPromise) { + const fetchFlowConfig = await configCallPromise; + const extensionsData = await this.#callForExtensions(fetchFlowConfig.extensionsCall); + const fetchCallResponse = await this.#callId5Fetch(fetchFlowConfig.fetchCall, extensionsData); + return this.#processFetchCallResponse(fetchCallResponse); + } + async #callForConfig() { + let url = this.submoduleConfig.params.configUrl || ID5_API_CONFIG_URL; // override for debug/test purposes only + const response = await (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.fetch)(url, { + method: 'POST', + body: JSON.stringify({ + ...this.submoduleConfig, + bounce: true + }), + credentials: 'include' + }); + if (!response.ok) { + throw new Error('Error while calling config endpoint: ', response); + } + const dynamicConfig = await response.json(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'config response received from the server', dynamicConfig); + return dynamicConfig; + } + async #callForExtensions(extensionsCallConfig) { + if (extensionsCallConfig === undefined) { + return undefined; + } + const extensionsUrl = extensionsCallConfig.url; + const method = extensionsCallConfig.method || 'GET'; + const body = method === 'GET' ? undefined : JSON.stringify(extensionsCallConfig.body || {}); + const response = await (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.fetch)(extensionsUrl, { + method, + body + }); + if (!response.ok) { + throw new Error('Error while calling extensions endpoint: ', response); + } + const extensions = await response.json(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'extensions response received from the server', extensions); + return extensions; + } + async #callId5Fetch(fetchCallConfig, extensionsData) { + const fetchUrl = fetchCallConfig.url; + const additionalData = fetchCallConfig.overrides || {}; + const body = JSON.stringify({ + ...this.#createFetchRequestData(), + ...additionalData, + extensions: extensionsData + }); + const response = await (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.fetch)(fetchUrl, { + method: 'POST', + body, + credentials: 'include' + }); + if (!response.ok) { + throw new Error('Error while calling fetch endpoint: ', response); + } + const fetchResponse = await response.json(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX + 'fetch response received from the server', fetchResponse); + return fetchResponse; + } + #createFetchRequestData() { + const params = this.submoduleConfig.params; + const hasGdpr = this.gdprConsentData && typeof this.gdprConsentData.gdprApplies === 'boolean' && this.gdprConsentData.gdprApplies ? 1 : 0; + const referer = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)(); + const signature = this.cacheIdObj ? this.cacheIdObj.signature : undefined; + const nbPage = incrementNb(this.cacheIdObj); + const trueLinkInfo = window.id5Bootstrap ? window.id5Bootstrap.getTrueLinkInfo() : { + booted: false + }; + const data = { + 'partner': params.partner, + 'gdpr': hasGdpr, + 'nbPage': nbPage, + 'o': 'pbjs', + 'tml': referer.topmostLocation, + 'ref': referer.ref, + 'cu': referer.canonicalUrl, + 'top': referer.reachedTop ? 1 : 0, + 'u': referer.stack[0] || window.location.href, + 'v': "9.45.0-pre", + 'storage': this.submoduleConfig.storage, + 'localStorage': storage.localStorageIsEnabled() ? 1 : 0, + 'true_link': trueLinkInfo + }; + + // pass in optional data, but only if populated + if (hasGdpr && this.gdprConsentData.consentString !== undefined && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(this.gdprConsentData.consentString) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmptyStr)(this.gdprConsentData.consentString)) { + data.gdpr_consent = this.gdprConsentData.consentString; + } + if (this.usPrivacyData !== undefined && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(this.usPrivacyData) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmptyStr)(this.usPrivacyData)) { + data.us_privacy = this.usPrivacyData; + } + if (this.gppData) { + data.gpp_string = this.gppData.gppString; + data.gpp_sid = this.gppData.applicableSections; + } + if (signature !== undefined && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmptyStr)(signature)) { + data.s = signature; + } + if (params.pd !== undefined && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmptyStr)(params.pd)) { + data.pd = params.pd; + } + if (params.provider !== undefined && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmptyStr)(params.provider)) { + data.provider = params.provider; + } + const abTestingConfig = params.abTesting || { + enabled: false + }; + if (abTestingConfig.enabled) { + data.ab_testing = { + enabled: true, + control_group_pct: abTestingConfig.controlGroupPct // The server validates + }; + } + return data; + } + #processFetchCallResponse(fetchCallResponse) { + try { + if (fetchCallResponse.privacy) { + if (window.id5Bootstrap && window.id5Bootstrap.setPrivacy) { + window.id5Bootstrap.setPrivacy(fetchCallResponse.privacy); + } + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'Error while writing privacy info into local storage.', error); + } + return fetchCallResponse; + } +} +async function loadExternalModule(url) { + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_7__.PbPromise((resolve, reject) => { + if (window.id5Prebid) { + // Already loaded + resolve(); + } else { + try { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_8__.loadExternalScript)(url, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, 'id5', resolve); + } catch (error) { + reject(error); + } + } + }); +} +function validateConfig(config) { + if (!config || !config.params || !config.params.partner) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'partner required to be defined'); + return false; + } + const partner = config.params.partner; + if (typeof partner === 'string' || partner instanceof String) { + let parsedPartnerId = parseInt(partner); + if (isNaN(parsedPartnerId) || parsedPartnerId < 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'partner required to be a number or a String parsable to a positive integer'); + return false; + } else { + config.params.partner = parsedPartnerId; + } + } else if (typeof partner !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'partner required to be a number or a String parsable to a positive integer'); + return false; + } + if (!config.storage || !config.storage.type || !config.storage.name) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX + 'storage required to be set'); + return false; + } + if (config.storage.name !== ID5_STORAGE_NAME) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_PREFIX + `storage name recommended to be '${ID5_STORAGE_NAME}'.`); + } + return true; +} +function incrementNb(cachedObj) { + if (cachedObj && cachedObj.nbPage !== undefined) { + return cachedObj.nbPage + 1; + } else { + return 1; + } +} + +/** + * Check to see if we can write to local storage based on purpose consent 1, and that we have vendor consent (ID5=131) + * @param {ConsentData} consentData + * @returns {boolean} + */ +function hasWriteConsentToLocalStorage(consentData) { + const hasGdpr = consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies; + const localstorageConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(consentData, `vendorData.purpose.consents.1`); + const id5VendorConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(consentData, `vendorData.vendor.consents.${GVLID.toString()}`); + if (hasGdpr && (!localstorageConsent || !id5VendorConsent)) { + return false; + } + return true; +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_9__.submodule)('userId', id5IdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('id5IdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/id5IdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["idImportLibrary"],{ + +/***/ "./modules/idImportLibrary.js": +/*!************************************!*\ + !*** ./modules/idImportLibrary.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* unused harmony exports CONF_DEFAULT_FULL_BODY_SCAN, CONF_DEFAULT_INPUT_SCAN, setConfig */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var crypto_js_md5_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/md5.js */ "./node_modules/crypto-js/md5.js"); +/* harmony import */ var crypto_js_md5_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_md5_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + + + + +let email; +let conf; +const LOG_PRE_FIX = 'ID-Library: '; +const CONF_DEFAULT_OBSERVER_DEBOUNCE_MS = 250; +const CONF_DEFAULT_FULL_BODY_SCAN = false; +const CONF_DEFAULT_INPUT_SCAN = false; +const OBSERVER_CONFIG = { + subtree: true, + attributes: true, + attributeOldValue: false, + childList: true, + attirbuteFilter: ['value'], + characterData: true, + characterDataOldValue: false +}; +const _logInfo = createLogInfo(LOG_PRE_FIX); +const _logError = createLogError(LOG_PRE_FIX); +function createLogInfo(prefix) { + return function () { + for (var _len = arguments.length, strings = new Array(_len), _key = 0; _key < _len; _key++) { + strings[_key] = arguments[_key]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(prefix + ' ', ...strings); + }; +} +function createLogError(prefix) { + return function () { + for (var _len2 = arguments.length, strings = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + strings[_key2] = arguments[_key2]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(prefix + ' ', ...strings); + }; +} +function getEmail(value) { + const matched = value.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi); + if (!matched) { + return null; + } + _logInfo('Email found: ' + matched[0]); + return matched[0]; +} +function bodyAction(mutations, observer) { + _logInfo('BODY observer on debounce called'); + // If the email is found in the input element, disconnect the observer + if (email) { + observer.disconnect(); + _logInfo('Email is found, body observer disconnected'); + return; + } + const body = document.body.innerHTML; + email = getEmail(body); + if (email !== null) { + _logInfo(`Email obtained from the body ${email}`); + observer.disconnect(); + _logInfo('Post data on email found in body'); + postData(); + } +} +function targetAction(mutations, observer) { + _logInfo('Target observer called'); + for (const mutation of mutations) { + for (const node of mutation.addedNodes) { + email = node.textContent; + if (email) { + _logInfo('Email obtained from the target ' + email); + observer.disconnect(); + _logInfo('Post data on email found in target'); + postData(); + return; + } + } + } +} +function addInputElementsElementListner() { + if (doesInputElementsHaveEmail()) { + _logInfo('Email found in input elements ' + email); + _logInfo('Post data on email found in target without'); + postData(); + return; + } + _logInfo('Adding input element listeners'); + const inputs = document.querySelectorAll('input[type=text], input[type=email]'); + for (var i = 0; i < inputs.length; i++) { + _logInfo(`Original Value in Input = ${inputs[i].value}`); + inputs[i].addEventListener('change', event => processInputChange(event)); + inputs[i].addEventListener('blur', event => processInputChange(event)); + } +} +function addFormInputElementsElementListner(id) { + _logInfo('Adding input element listeners'); + if (doesFormInputElementsHaveEmail(id)) { + _logInfo('Email found in input elements ' + email); + postData(); + return; + } + _logInfo('Adding input element listeners'); + const input = document.getElementById(id); + input.addEventListener('change', event => processInputChange(event)); + input.addEventListener('blur', event => processInputChange(event)); +} +function removeInputElementsElementListner() { + _logInfo('Removing input element listeners'); + const inputs = document.querySelectorAll('input[type=text], input[type=email]'); + for (var i = 0; i < inputs.length; i++) { + inputs[i].removeEventListener('change', event => processInputChange(event)); + inputs[i].removeEventListener('blur', event => processInputChange(event)); + } +} +function processInputChange(event) { + const value = event.target.value; + _logInfo(`Modified Value of input ${event.target.value}`); + email = getEmail(value); + if (email !== null) { + _logInfo('Email found in input ' + email); + postData(); + removeInputElementsElementListner(); + } +} +function debounce(func, wait, immediate) { + var timeout; + return function () { + const context = this; + const args = arguments; + const later = function () { + timeout = null; + if (!immediate) func.apply(context, args); + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + if (callNow) { + func.apply(context, args); + } else { + _logInfo('Debounce wait time ' + wait); + timeout = setTimeout(later, wait); + } + }; +} +; +function handleTargetElement() { + const targetObserver = new MutationObserver(debounce(targetAction, conf.debounce, false)); + const targetElement = document.getElementById(conf.target); + if (targetElement) { + email = targetElement.textContent; + if (!email) { + _logInfo('Finding the email with observer'); + targetObserver.observe(targetElement, OBSERVER_CONFIG); + } else { + _logInfo('Target found with target ' + email); + _logInfo('Post data on email found in target with target'); + postData(); + } + } +} +function handleBodyElements() { + email = getEmail(document.body.innerHTML); + if (email !== null) { + _logInfo('Email found in body ' + email); + _logInfo('Post data on email found in the body without observer'); + postData(); + return; + } + if (conf.fullscan === true) { + const bodyObserver = new MutationObserver(debounce(bodyAction, conf.debounce, false)); + bodyObserver.observe(document.body, OBSERVER_CONFIG); + } +} +function doesInputElementsHaveEmail() { + const inputs = document.getElementsByTagName('input'); + for (let index = 0; index < inputs.length; ++index) { + const curInput = inputs[index]; + email = getEmail(curInput.value); + if (email !== null) { + return true; + } + } + return false; +} +function doesFormInputElementsHaveEmail(formElementId) { + const input = document.getElementById(formElementId); + if (input) { + email = getEmail(input.value); + if (email !== null) { + return true; + } + } + return false; +} +function syncCallback() { + return { + success: function () { + _logInfo('Data synced successfully.'); + }, + error: function () { + _logInfo('Data sync failed.'); + } + }; +} +function postData() { + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().refreshUserIds(); + const userIds = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().getUserIds(); + if (Object.keys(userIds).length === 0) { + _logInfo('No user ids'); + return; + } + _logInfo('Users' + userIds); + const syncPayload = {}; + syncPayload.hid = crypto_js_md5_js__WEBPACK_IMPORTED_MODULE_0___default()(email).toString(); + syncPayload.uids = userIds; + const payloadString = JSON.stringify(syncPayload); + _logInfo(payloadString); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(conf.url, syncCallback(), payloadString, { + method: 'POST', + withCredentials: true + }); +} +function associateIds() { + if (window.MutationObserver || window.WebKitMutationObserver) { + if (conf.target) { + handleTargetElement(); + } else if (conf.formElementId) { + addFormInputElementsElementListner(conf.formElementId); + } else if (conf.inputscan) { + addInputElementsElementListner(); + } else { + handleBodyElements(); + } + } +} +function setConfig(config) { + if (!config) { + _logError('Required confirguration not provided'); + return; + } + if (!config.url) { + _logError('The required url is not configured'); + return; + } + if (!(0,_src_activities_rules_js__WEBPACK_IMPORTED_MODULE_4__.isActivityAllowed)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__.ACTIVITY_ENRICH_UFPD, (0,_src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__.activityParams)(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__.MODULE_TYPE_PREBID, 'idImportLibrary'))) { + _logError('Permission for id import was denied by CMP'); + return; + } + if (typeof config.debounce !== 'number') { + config.debounce = CONF_DEFAULT_OBSERVER_DEBOUNCE_MS; + _logInfo('Set default observer debounce to ' + CONF_DEFAULT_OBSERVER_DEBOUNCE_MS); + } + if (typeof config.fullscan !== 'boolean') { + config.fullscan = CONF_DEFAULT_FULL_BODY_SCAN; + _logInfo('Set default fullscan ' + CONF_DEFAULT_FULL_BODY_SCAN); + } + if (typeof config.inputscan !== 'boolean') { + config.inputscan = CONF_DEFAULT_INPUT_SCAN; + _logInfo('Set default input scan ' + CONF_DEFAULT_INPUT_SCAN); + } + if (typeof config.formElementId == 'string') { + _logInfo('Looking for formElementId ' + config.formElementId); + } + conf = config; + associateIds(); +} +_src_config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig('idImportLibrary', config => setConfig(config.idImportLibrary)); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('idImportLibrary'); + +/***/ }), + +/***/ "./node_modules/crypto-js/core.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/core.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(); + } + else {} +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.crypto) { + crypto = __webpack_require__.g.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && "function" === 'function') { + try { + crypto = __webpack_require__(/*! crypto */ "?9157"); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/md5.js": +/*!***************************************!*\ + !*** ./node_modules/crypto-js/md5.js ***! + \***************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + return CryptoJS.MD5; + +})); + +/***/ }), + +/***/ "?9157": +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/***/ (() => { + +/* (ignored) */ + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/idImportLibrary.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["identityLinkIdSystem"],{ + +/***/ "./modules/identityLinkIdSystem.js": +/*!*****************************************!*\ + !*** ./modules/identityLinkIdSystem.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, identityLinkSubmodule, getEnvelopeFromStorage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds IdentityLink to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/identityLinkSubmodule + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'identityLink'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const liverampEnvelopeName = '_lr_env'; + +/** @type {Submodule} */ +const identityLinkSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * used to specify vendor id + * @type {number} + */ + gvlid: 97, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{idl_env:string}} + */ + decode(value) { + return { + 'idl_env': value + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {IdResponse|undefined} + */ + getId(config, consentData) { + const configParams = config && config.params || {}; + if (!configParams || typeof configParams.pid !== 'string') { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError('identityLink: requires partner id to be defined'); + return; + } + const { + gdpr, + gpp: gppData + } = consentData ?? {}; + const hasGdpr = gdpr && typeof gdpr.gdprApplies === 'boolean' && gdpr.gdprApplies ? 1 : 0; + const gdprConsentString = hasGdpr ? gdpr.consentString : ''; + // use protocol relative urls for http or https + if (hasGdpr && (!gdprConsentString || gdprConsentString === '')) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo('identityLink: Consent string is required to call envelope API.'); + return; + } + const gppString = gppData && gppData.gppString ? gppData.gppString : false; + const gppSectionId = gppData && gppData.gppString && gppData.applicableSections.length > 0 && gppData.applicableSections[0] !== -1 ? gppData.applicableSections[0] : false; + const hasGpp = gppString && gppSectionId; + const url = `https://api.rlcdn.com/api/identity/envelope?pid=${configParams.pid}${hasGdpr ? '&ct=4&cv=' + gdprConsentString : ''}${hasGpp ? '&gpp=' + gppString + '&gpp_sid=' + gppSectionId : ''}`; + let resp; + resp = function (callback) { + // Check ats during callback so it has a chance to initialise. + // If ats library is available, use it to retrieve envelope. If not use standard third party endpoint + if (window.ats && window.ats.retrieveEnvelope) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo('identityLink: ATS exists!'); + window.ats.retrieveEnvelope(function (envelope) { + if (envelope) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo('identityLink: An envelope can be retrieved from ATS!'); + setEnvelopeSource(true); + callback(JSON.parse(envelope).envelope); + } else { + getEnvelope(url, callback, configParams); + } + }); + } else { + // try to get envelope directly from storage if ats lib is not present on a page + let envelope = getEnvelopeFromStorage(); + if (envelope) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo('identityLink: LiveRamp envelope successfully retrieved from storage!'); + callback(JSON.parse(envelope).envelope); + } else { + getEnvelope(url, callback, configParams); + } + } + }; + return { + callback: resp + }; + }, + eids: { + 'idl_env': { + source: 'liveramp.com', + atype: 3 + } + } +}; +// return envelope from third party endpoint +function getEnvelope(url, callback, configParams) { + const callbacks = { + success: response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo(error); + } + } + callback(responseObj && responseObj.envelope ? responseObj.envelope : ''); + }, + error: error => { + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo(`identityLink: identityLink: ID fetch encountered an error`, error); + callback(); + } + }; + if (!configParams.notUse3P && !storage.getCookie('_lr_retry_request')) { + setRetryCookie(); + _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo('identityLink: A 3P retrieval is attempted!'); + setEnvelopeSource(false); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, callbacks, undefined, { + method: 'GET', + withCredentials: true + }); + } else { + callback(); + } +} +function setRetryCookie() { + let now = new Date(); + now.setTime(now.getTime() + 3600000); + storage.setCookie('_lr_retry_request', 'true', now.toUTCString()); +} +function setEnvelopeSource(src) { + let now = new Date(); + now.setTime(now.getTime() + 2592000000); + storage.setCookie('_lr_env_src_ats', src, now.toUTCString()); +} +function getEnvelopeFromStorage() { + let rawEnvelope = storage.getCookie(liverampEnvelopeName) || storage.getDataFromLocalStorage(liverampEnvelopeName); + return rawEnvelope ? window.atob(rawEnvelope) : undefined; +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', identityLinkSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('identityLinkIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/identityLinkIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["idxBidAdapter"],{ + +/***/ "./modules/idxBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/idxBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_precisoUtils_bidUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/precisoUtils/bidUtils.js */ "./libraries/precisoUtils/bidUtils.js"); + + + + + +const BIDDER_CODE = 'idx'; +const ENDPOINT_URL = 'https://dev-event.dxmdp.com/rest/api/v1/bid'; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.mediaTypes?.banner?.sizes) && bid.mediaTypes.banner.sizes.every(size => { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size) && size.length === 2 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(size[0]) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(size[1]); + }); + }, + buildRequests: function (bidRequests, bidderRequest) { + const payload = { + id: bidderRequest.bidderRequestId, + imp: bidRequests.map(request => { + const { + bidId, + sizes + } = request; + const item = { + id: bidId + }; + if (request.mediaTypes.banner) { + item.banner = { + format: (request.mediaTypes.banner.sizes || sizes).map(size => { + return { + w: size[0], + h: size[1] + }; + }) + }; + } + return item; + }) + }; + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString, + bidderRequest, + options: { + withCredentials: false, + contentType: 'application/json' + } + }; + }, + interpretResponse: _libraries_precisoUtils_bidUtils_js__WEBPACK_IMPORTED_MODULE_2__.interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('idxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["precisoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/idxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["idxIdSystem"],{ + +/***/ "./modules/idxIdSystem.js": +/*!********************************!*\ + !*** ./modules/idxIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, idxIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds IDx to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/idxIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const IDX_MODULE_NAME = 'idx'; +const IDX_COOKIE_NAME = '_idx'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: IDX_MODULE_NAME +}); +function readIDxFromCookie() { + return storage.cookiesAreEnabled ? storage.getCookie(IDX_COOKIE_NAME) : null; +} +function readIDxFromLocalStorage() { + return storage.localStorageIsEnabled ? storage.getDataFromLocalStorage(IDX_COOKIE_NAME) : null; +} + +/** @type {Submodule} */ +const idxIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: IDX_MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { Object | string | undefined } value + * @return { Object | string | undefined } + */ + decode(value) { + const idxVal = value ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(value) ? value : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(value) ? value.id : undefined : undefined; + return idxVal ? { + 'idx': idxVal + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @return {{id: string | undefined } | undefined} + */ + getId() { + const idxString = readIDxFromLocalStorage() || readIDxFromCookie(); + if (typeof idxString == 'string' && idxString) { + try { + const idxObj = JSON.parse(idxString); + return idxObj && idxObj.idx ? { + id: idxObj.idx + } : undefined; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + } + return undefined; + }, + eids: { + 'idx': { + source: 'idx.lat', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', idxIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('idxIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/idxIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["illuminBidAdapter"],{ + +/***/ "./modules/illuminBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/illuminBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, createDomain, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/vidazooUtils/bidderUtils.js */ "./libraries/vidazooUtils/bidderUtils.js"); + + + + + +const DEFAULT_SUB_DOMAIN = 'exchange'; +const BIDDER_CODE = 'illumin'; +const BIDDER_VERSION = '1.0.0'; +const GVLID = 149; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function createDomain() { + let subDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SUB_DOMAIN; + return `https://${subDomain}.illumin.com`; +} +const buildRequests = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createBuildRequestsFn)(createDomain, null, storage, BIDDER_CODE, BIDDER_VERSION, false); +const interpretResponse = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createInterpretResponseFn)(BIDDER_CODE, false); +const getUserSyncs = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createUserSyncGetter)({ + iframeSyncUrl: 'https://sync.illumin.com/api/sync/iframe', + imageSyncUrl: 'https://sync.illumin.com/api/sync/image' +}); +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + gvlid: GVLID, + isBidRequestValid: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('illuminBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","vidazooUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/illuminBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["imRtdProvider"],{ + +/***/ "./modules/imRtdProvider.js": +/*!**********************************!*\ + !*** ./modules/imRtdProvider.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports imUidLocalName, imVidCookieName, imRtdLocalName, storage, getBidderFunction, getCustomBidderFunction, setRealTimeData, getRealTimeData, getApiCallback, imRtdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time data from Intimate Merger + * @module modules/imRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const imUidLocalName = '__im_uid'; +const imVidCookieName = '_im_vid'; +const imRtdLocalName = '__im_sids'; +const submoduleName = 'im'; +const segmentsMaxAge = 3600000; // 1 hour (30 * 60 * 1000) +const uidMaxAge = 1800000; // 30 minites (30 * 60 * 1000) +const vidMaxAge = 97200000000; // 37 months ((365 * 3 + 30) * 24 * 60 * 60 * 1000) + +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: submoduleName +}); +function setImDataInCookie(value) { + storage.setCookie(imVidCookieName, value, new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + vidMaxAge).toUTCString(), 'none'); +} + +/** + * @param {Object} segments + * @param {Object} moduleConfig + */ +function getSegments(segments, moduleConfig) { + if (!segments) return; + const maxSegments = !Number.isNaN(moduleConfig.params.maxSegments) ? moduleConfig.params.maxSegments : 200; + return segments.slice(0, maxSegments); +} + +/** + * @param {string} bidderName + */ +function getBidderFunction(bidderName) { + const biddersFunction = { + pubmatic: function (bid, data, moduleConfig) { + if (data.im_segments && data.im_segments.length) { + const segments = getSegments(data.im_segments, moduleConfig); + const dctr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.dctr'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'params.dctr', `${dctr ? dctr + '|' : ''}im_segments=${segments.join(',')}`); + } + return bid; + }, + fluct: function (bid, data, moduleConfig) { + if (data.im_segments && data.im_segments.length) { + const segments = getSegments(data.im_segments, moduleConfig); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(bid, 'params.kv.imsids', segments); + } + return bid; + } + }; + return biddersFunction[bidderName] || null; +} +function getCustomBidderFunction(config, bidder) { + const overwriteFn = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(config, `params.overwrites.${bidder}`); + if (overwriteFn && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(overwriteFn)) { + return overwriteFn; + } else { + return null; + } +} + +/** + * Add real-time data. + * @param {Object} bidConfig + * @param {Object} moduleConfig + * @param {Object} data + */ +function setRealTimeData(bidConfig, moduleConfig, data) { + const adUnits = bidConfig.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)().adUnits; + const utils = { + deepSetValue: _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset, + deepAccess: _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"], + logInfo: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo, + logError: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError, + mergeDeep: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep + }; + if (data.im_segments) { + const segments = getSegments(data.im_segments, moduleConfig); + const ortb2 = bidConfig.ortb2Fragments?.global || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortb2, 'user.ext.data.im_segments', segments); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortb2, 'user.ext.data.im_uid', data.im_uid); + if (moduleConfig.params.setGptKeyValues || !moduleConfig.params.hasOwnProperty('setGptKeyValues')) { + window.googletag = window.googletag || { + cmd: [] + }; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(() => { + window.googletag.pubads().setTargeting('im_segments', segments); + }); + } + } + adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + const bidderFunction = getBidderFunction(bid.bidder); + const overwriteFunction = getCustomBidderFunction(moduleConfig, bid.bidder); + if (overwriteFunction) { + overwriteFunction(bid, data, utils, _src_config_js__WEBPACK_IMPORTED_MODULE_6__.config); + } else if (bidderFunction) { + bidderFunction(bid, data, moduleConfig); + } + }); + }); +} + +/** + * Real-time data retrieval from Intimate Merger + * @param {Object} reqBidsConfigObj + * @param {function} onDone + * @param {Object} moduleConfig + */ +function getRealTimeData(reqBidsConfigObj, onDone, moduleConfig) { + const cid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, 'params.cid'); + if (!cid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('imRtdProvider requires a valid cid to be defined'); + onDone(); + return; + } + const uid = storage.getDataFromLocalStorage(imUidLocalName); + const sids = storage.getDataFromLocalStorage(imRtdLocalName); + const parsedSids = sids ? sids.split(',') : []; + const mt = storage.getDataFromLocalStorage(`${imRtdLocalName}_mt`); + const localVid = storage.getCookie(imVidCookieName); + let apiUrl = `https://sync6.im-apps.net/${cid}/rtd`; + let expired = true; + let alreadyDone = false; + if (localVid) { + apiUrl += `?vid=${localVid}`; + setImDataInCookie(localVid); + } + if (Date.parse(mt) && Date.now() - new Date(mt).getTime() < segmentsMaxAge) { + expired = false; + } + if (sids !== null) { + setRealTimeData(reqBidsConfigObj, moduleConfig, { + im_uid: uid, + im_segments: parsedSids + }); + onDone(); + alreadyDone = true; + } + if (expired) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(apiUrl, getApiCallback(reqBidsConfigObj, alreadyDone ? undefined : onDone, moduleConfig), undefined, { + method: 'GET', + withCredentials: true + }); + } +} + +/** + * Api callback from Intimate Merger + * @param {Object} reqBidsConfigObj + * @param {function} onDone + * @param {Object} moduleConfig + */ +function getApiCallback(reqBidsConfigObj, onDone, moduleConfig) { + return { + success: function (response, req) { + let parsedResponse = {}; + if (req.status === 200) { + try { + parsedResponse = JSON.parse(response); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('unable to get Intimate Merger segment data'); + } + if (parsedResponse.uid) { + const imuid = storage.getDataFromLocalStorage(imUidLocalName); + const imuidMt = storage.getDataFromLocalStorage(`${imUidLocalName}_mt`); + const imuidExpired = Date.parse(imuidMt) && Date.now() - new Date(imuidMt).getTime() < uidMaxAge; + if (!imuid || imuidExpired) { + storage.setDataInLocalStorage(imUidLocalName, parsedResponse.uid); + storage.setDataInLocalStorage(`${imUidLocalName}_mt`, new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)()).toUTCString()); + } + } + if (parsedResponse.vid) { + setImDataInCookie(parsedResponse.vid); + } + if (parsedResponse.segments) { + setRealTimeData(reqBidsConfigObj, moduleConfig, { + im_uid: parsedResponse.uid, + im_segments: parsedResponse.segments + }); + storage.setDataInLocalStorage(imRtdLocalName, parsedResponse.segments); + storage.setDataInLocalStorage(`${imRtdLocalName}_mt`, new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)()).toUTCString()); + } + } + if (onDone) { + onDone(); + } + }, + error: function () { + if (onDone) { + onDone(); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('unable to get Intimate Merger segment data'); + } + }; +} + +/** + * Module init + * @param {Object} provider + * @param {Object} userConsent + * @return {boolean} + */ +function init(provider, userConsent) { + return true; +} + +/** @type {RtdSubmodule} */ +const imRtdSubmodule = { + name: submoduleName, + getBidRequestData: getRealTimeData, + init: init +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.submodule)('realTimeData', imRtdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('imRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/imRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["imdsBidAdapter"],{ + +/***/ "./modules/imdsBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/imdsBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); + + + + + + + + + +const BID_SCHEME = 'https://'; +const BID_DOMAIN = 'technoratimedia.com'; +const USER_SYNC_IFRAME_URL = 'https://ad-cdn.technoratimedia.com/html/usersync.html'; +const USER_SYNC_PIXEL_URL = 'https://sync.technoratimedia.com/services'; +const VIDEO_PARAMS = ['minduration', 'maxduration', 'startdelay', 'placement', 'plcmt', 'linearity', 'mimes', 'protocols', 'api']; +const BLOCKED_AD_SIZES = ['1x1', '1x2']; +const DEFAULT_MAX_TTL = 420; // 7 minutes +const spec = { + code: 'imds', + aliases: [{ + code: 'synacormedia' + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + sizeMap: {}, + isVideoBid: function (bid) { + return bid.mediaTypes !== undefined && bid.mediaTypes.hasOwnProperty('video'); + }, + isBidRequestValid: function (bid) { + const hasRequiredParams = bid && bid.params && (bid.params.hasOwnProperty('placementId') || bid.params.hasOwnProperty('tagId')) && bid.params.hasOwnProperty('seatId'); + const hasAdSizes = bid && (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__.getAdUnitSizes)(bid).filter(size => BLOCKED_AD_SIZES.indexOf(size.join('x')) === -1).length > 0; + return !!(hasRequiredParams && hasAdSizes); + }, + buildRequests: function (validBidReqs, bidderRequest) { + if (!validBidReqs || !validBidReqs.length || !bidderRequest) { + return; + } + const refererInfo = bidderRequest.refererInfo; + // start with some defaults, overridden by anything set in ortb2, if provided. + const openRtbBidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)({ + id: bidderRequest.bidderRequestId, + site: { + domain: refererInfo.domain, + page: refererInfo.page, + ref: refererInfo.ref + }, + device: { + ua: navigator.userAgent + }, + imp: [] + }, bidderRequest.ortb2 || {}); + const tmax = bidderRequest.timeout; + if (tmax) { + openRtbBidRequest.tmax = tmax; + } + const schain = validBidReqs[0].schain; + if (schain) { + openRtbBidRequest.source = { + ext: { + schain + } + }; + } + let seatId = null; + validBidReqs.forEach((bid, i) => { + if (seatId && seatId !== bid.params.seatId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`IMDS: there is an inconsistent seatId: ${bid.params.seatId} but only sending bid requests for ${seatId}, you should double check your configuration`); + return; + } else { + seatId = bid.params.seatId; + } + const tagIdOrPlacementId = bid.params.tagId || bid.params.placementId; + let pos = parseInt(bid.params.pos || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid.mediaTypes, 'video.pos'), 10); + if (isNaN(pos)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`IMDS: there is an invalid POS: ${bid.params.pos}`); + pos = 0; + } + const videoOrBannerKey = this.isVideoBid(bid) ? 'video' : 'banner'; + const adSizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_1__.getAdUnitSizes)(bid).filter(size => BLOCKED_AD_SIZES.indexOf(size.join('x')) === -1); + let imps = []; + if (videoOrBannerKey === 'banner') { + imps = this.buildBannerImpressions(adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey); + } else if (videoOrBannerKey === 'video') { + imps = this.buildVideoImpressions(adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey); + } + if (imps.length > 0) { + imps.forEach(i => { + // Deeply add ext section to all imp[] for GPID, prebid slot id, and anything else down the line + const extSection = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext'); + if (extSection) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(i, 'ext', extSection); + } + + // Add imp[] to request object + openRtbBidRequest.imp.push(i); + }); + } + }); + + // Move us_privacy from regs.ext to regs if there isn't already a us_privacy in regs + if (openRtbBidRequest.regs?.ext?.us_privacy && !openRtbBidRequest.regs?.us_privacy) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(openRtbBidRequest, 'regs.us_privacy', openRtbBidRequest.regs.ext.us_privacy); + } + + // Remove regs.ext.us_privacy + if (openRtbBidRequest.regs?.ext?.us_privacy) { + delete openRtbBidRequest.regs.ext.us_privacy; + if (Object.keys(openRtbBidRequest.regs.ext).length < 1) { + delete openRtbBidRequest.regs.ext; + } + } + + // User ID + if (validBidReqs[0] && validBidReqs[0].userIdAsEids && Array.isArray(validBidReqs[0].userIdAsEids)) { + const eids = validBidReqs[0].userIdAsEids; + if (eids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(openRtbBidRequest, 'user.ext.eids', eids); + } + } + if (openRtbBidRequest.imp.length && seatId) { + return { + method: 'POST', + url: `${BID_SCHEME}${seatId}.${BID_DOMAIN}/openrtb/bids/${seatId}?src=pbjs%2F9.45.0-pre`, + data: openRtbBidRequest, + options: { + contentType: 'application/json', + withCredentials: true + } + }; + } + }, + buildBannerImpressions: function (adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey) { + let format = []; + let imps = []; + adSizes.forEach((size, i) => { + if (!size || size.length !== 2) { + return; + } + format.push({ + w: size[0], + h: size[1] + }); + }); + if (format.length > 0) { + const imp = { + id: `${videoOrBannerKey.substring(0, 1)}${bid.bidId}`, + banner: { + format, + pos + }, + tagid: tagIdOrPlacementId + }; + const bidFloor = getBidFloor(bid, 'banner', '*'); + if (isNaN(bidFloor)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`IMDS: there is an invalid bid floor: ${bid.params.bidfloor}`); + } + if (bidFloor !== null && !isNaN(bidFloor)) { + imp.bidfloor = bidFloor; + } + imps.push(imp); + } + return imps; + }, + buildVideoImpressions: function (adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey) { + let imps = []; + adSizes.forEach((size, i) => { + if (!size || size.length != 2) { + return; + } + const size0 = size[0]; + const size1 = size[1]; + const imp = { + id: `${videoOrBannerKey.substring(0, 1)}${bid.bidId}-${size0}x${size1}`, + tagid: tagIdOrPlacementId + }; + const bidFloor = getBidFloor(bid, 'video', size); + if (isNaN(bidFloor)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`IMDS: there is an invalid bid floor: ${bid.params.bidfloor}`); + } + if (bidFloor !== null && !isNaN(bidFloor)) { + imp.bidfloor = bidFloor; + } + const videoOrBannerValue = { + w: size0, + h: size1, + pos + }; + if (bid.mediaTypes.video) { + if (!bid.params.video) { + bid.params.video = {}; + } + this.setValidVideoParams(bid.mediaTypes.video, bid.params.video); + } + if (bid.params.video) { + this.setValidVideoParams(bid.params.video, videoOrBannerValue); + } + imp[videoOrBannerKey] = videoOrBannerValue; + imps.push(imp); + }); + return imps; + }, + setValidVideoParams: function (sourceObj, destObj) { + Object.keys(sourceObj).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(VIDEO_PARAMS, param) && sourceObj[param] !== null && (!isNaN(parseInt(sourceObj[param], 10)) || !(sourceObj[param].length < 1))).forEach(param => destObj[param] = Array.isArray(sourceObj[param]) ? sourceObj[param] : parseInt(sourceObj[param], 10)); + }, + interpretResponse: function (serverResponse, bidRequest) { + const updateMacros = (bid, r) => { + return r ? r.replace(/\${AUCTION_PRICE}/g, bid.price) : r; + }; + if (!serverResponse.body || typeof serverResponse.body != 'object') { + return; + } + const { + id, + seatbid: seatbids + } = serverResponse.body; + let bids = []; + if (id && seatbids) { + seatbids.forEach(seatbid => { + seatbid.bid.forEach(bid => { + const creative = updateMacros(bid, bid.adm); + const nurl = updateMacros(bid, bid.nurl); + const [, impType, impid] = bid.impid.match(/^([vb])([\w\d]+)/); + let height = bid.h; + let width = bid.w; + const isVideo = impType === 'v'; + const isBanner = impType === 'b'; + if ((!height || !width) && bidRequest.data && bidRequest.data.imp && bidRequest.data.imp.length > 0) { + bidRequest.data.imp.forEach(req => { + if (bid.impid === req.id) { + if (isVideo) { + height = req.video.h; + width = req.video.w; + } else if (isBanner) { + let bannerHeight = 1; + let bannerWidth = 1; + if (req.banner.format && req.banner.format.length > 0) { + bannerHeight = req.banner.format[0].h; + bannerWidth = req.banner.format[0].w; + } + height = bannerHeight; + width = bannerWidth; + } else { + height = 1; + width = 1; + } + } + }); + } + let maxTtl = DEFAULT_MAX_TTL; + if (bid.ext && bid.ext['imds.tv'] && bid.ext['imds.tv'].ttl) { + const bidTtlMax = parseInt(bid.ext['imds.tv'].ttl, 10); + maxTtl = !isNaN(bidTtlMax) && bidTtlMax > 0 ? bidTtlMax : DEFAULT_MAX_TTL; + } + let ttl = maxTtl; + if (bid.exp) { + const bidTtl = parseInt(bid.exp, 10); + ttl = !isNaN(bidTtl) && bidTtl > 0 ? Math.min(bidTtl, maxTtl) : maxTtl; + } + const bidObj = { + requestId: impid, + cpm: parseFloat(bid.price), + width: parseInt(width, 10), + height: parseInt(height, 10), + creativeId: `${seatbid.seat}_${bid.crid}`, + currency: 'USD', + netRevenue: true, + mediaType: isVideo ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + ad: creative, + ttl + }; + if (bid.adomain != undefined || bid.adomain != null) { + bidObj.meta = { + advertiserDomains: bid.adomain + }; + } + if (isVideo) { + const [, uuid] = nurl.match(/ID=([^&]*)&?/); + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('cache.url')) { + bidObj.videoCacheKey = encodeURIComponent(uuid); + } + bidObj.vastUrl = nurl; + } + bids.push(bidObj); + }); + }); + } + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + const syncs = []; + const queryParams = ["src=pbjs%2F9.45.0-pre"]; + if (gdprConsent) { + queryParams.push(`gdpr=${Number(gdprConsent.gdprApplies && 1)}&consent=${encodeURIComponent(gdprConsent.consentString || '')}`); + } + if (uspConsent) { + queryParams.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + if (gppConsent) { + queryParams.push('gpp=' + encodeURIComponent(gppConsent.gppString || '') + '&gppsid=' + encodeURIComponent((gppConsent.applicableSections || []).join(','))); + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `${USER_SYNC_IFRAME_URL}?${queryParams.join('&')}` + }); + } else if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `${USER_SYNC_PIXEL_URL}?srv=cs&${queryParams.join('&')}` + }); + } + return syncs; + } +}; +function getBidFloor(bid, mediaType, size) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bid.getFloor)) { + return bid.params.bidfloor ? parseFloat(bid.params.bidfloor) : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType, + size + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('imdsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/imdsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["impactifyBidAdapter"],{ + +/***/ "./modules/impactifyBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/impactifyBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports STORAGE, STORAGE_KEY, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'impactify'; +const BIDDER_ALIAS = ['imp']; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_VIDEO_WIDTH = 640; +const DEFAULT_VIDEO_HEIGHT = 360; +const ORIGIN = 'https://sonic.impactify.media'; +const LOGGER_URI = 'https://logger.impactify.media'; +const LOGGER_JS_URI = 'https://log.impactify.it'; +const AUCTION_URI = '/bidder'; +const COOKIE_SYNC_URI = '/static/cookie_sync.html'; +const GVL_ID = 606; +const GET_CONFIG = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig; +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + gvlid: GVL_ID, + bidderCode: BIDDER_CODE +}); +const STORAGE_KEY = '_im_str'; + +/** + * Helpers object + * @type {Object} + */ +const helpers = { + getExtParamsFromBid(bid) { + let ext = { + impactify: { + appId: bid.params.appId + } + }; + if (typeof bid.params.format == 'string') { + ext.impactify.format = bid.params.format; + } + if (typeof bid.params.style == 'string') { + ext.impactify.style = bid.params.style; + } + if (typeof bid.params.container == 'string') { + ext.impactify.container = bid.params.container; + } + if (typeof bid.params.size == 'string') { + ext.impactify.size = bid.params.size; + } + return ext; + }, + getDeviceType() { + // OpenRTB Device type + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) { + return 5; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) { + return 4; + } + return 2; + }, + createOrtbImpBannerObj(bid, size) { + let sizes = size.split('x'); + return { + id: 'banner-' + bid.bidId, + format: [{ + w: parseInt(sizes[0]), + h: parseInt(sizes[1]) + }] + }; + }, + createOrtbImpVideoObj(bid) { + return { + id: 'video-' + bid.bidId, + playerSize: [DEFAULT_VIDEO_WIDTH, DEFAULT_VIDEO_HEIGHT], + context: 'outstream', + mimes: ['video/mp4'] + }; + }, + getFloor(bid) { + const floorInfo = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorInfo) && floorInfo.currency === DEFAULT_CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { + return parseFloat(floorInfo.floor); + } + return null; + }, + getImStrFromLocalStorage() { + return STORAGE.localStorageIsEnabled(false) ? STORAGE.getDataFromLocalStorage(STORAGE_KEY, false) : ''; + } +}; + +/** + * Create an OpenRTB formated object from prebid payload + * @param validBidRequests + * @param bidderRequest + * @returns {{cur: string[], validBidRequests, id, source: {tid}, imp: *[]}} + */ +function createOpenRtbRequest(validBidRequests, bidderRequest) { + // Create request and set imp bids inside + let request = { + id: bidderRequest.bidderRequestId, + validBidRequests, + cur: [DEFAULT_CURRENCY], + imp: [], + source: { + tid: bidderRequest.ortb2?.source?.tid + } + }; + + // Get the url parameters + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const checkPrebid = urlParams.get('_checkPrebid'); + + // Force impactify debugging parameter if present + if (checkPrebid != null) { + request.test = Number(checkPrebid); + } + + // Set SChain in request + let schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests, '0.schain'); + if (schain) request.source.ext = { + schain: schain + }; + + // Set Eids + let eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests, '0.userIdAsEids'); + if (eids && eids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'user.ext.eids', eids); + } + + // Set device/user/site + if (!request.device) request.device = {}; + if (!request.site) request.site = {}; + request.device = { + w: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().innerWidth, + h: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().innerHeight, + devicetype: helpers.getDeviceType(), + ua: navigator.userAgent, + js: 1, + dnt: navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1' ? 1 : 0, + language: (navigator.language || navigator.userLanguage || '').split('-')[0] || 'en' + }; + request.site = { + page: bidderRequest.refererInfo.page + }; + + // Handle privacy settings for GDPR/CCPA/COPPA + let gdprApplies = 0; + if (bidderRequest.gdprConsent) { + if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') gdprApplies = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'regs.ext.gdpr', gdprApplies); + if (GET_CONFIG('coppa') == true) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'regs.coppa', 1); + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + + // Set buyer uid + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(request, 'user.buyeruid', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)()); + + // Create imps with bids + validBidRequests.forEach(bid => { + let bannerObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid.mediaTypes, `banner`); + let imp = { + id: bid.bidId, + bidfloor: bid.params.bidfloor ? bid.params.bidfloor : 0, + ext: helpers.getExtParamsFromBid(bid) + }; + if (bannerObj && typeof imp.ext.impactify.size == 'string') { + imp.banner = { + ...helpers.createOrtbImpBannerObj(bid, imp.ext.impactify.size) + }; + } else { + imp.video = { + ...helpers.createOrtbImpVideoObj(bid) + }; + } + if (typeof bid.getFloor === 'function') { + const floor = helpers.getFloor(bid); + if (floor) { + imp.bidfloor = floor; + } + } + request.imp.push(imp); + }); + return request; +} + +/** + * Export BidderSpec type object and register it to Prebid + * @type {{supportedMediaTypes: string[], interpretResponse: ((function(ServerResponse, *): Bid[])|*), code: string, aliases: string[], getUserSyncs: ((function(SyncOptions, ServerResponse[], *, *): UserSync[])|*), buildRequests: (function(*, *): {method: string, data: string, url}), onTimeout: (function(*): boolean), gvlid: number, isBidRequestValid: ((function(BidRequest): (boolean))|*), onBidWon: (function(*): boolean)}} + */ +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: ['video', 'banner'], + aliases: BIDDER_ALIAS, + storageAllowed: true, + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (typeof bid.params.appId != 'string' || !bid.params.appId) { + return false; + } + if (typeof bid.params.format != 'string' || typeof bid.params.style != 'string' || !bid.params.format || !bid.params.style) { + return false; + } + if (bid.params.format !== 'screen' && bid.params.format !== 'display') { + return false; + } + if (bid.params.style !== 'inline' && bid.params.style !== 'impact' && bid.params.style !== 'static') { + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest - the bidding request + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // Create a clean openRTB request + let request = createOpenRtbRequest(validBidRequests, bidderRequest); + const imStr = helpers.getImStrFromLocalStorage(); + const options = {}; + if (imStr) { + options.customHeaders = { + 'x-impact': imStr + }; + } + return { + method: 'POST', + url: ORIGIN + AUCTION_URI, + data: JSON.stringify(request), + options + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const serverBody = serverResponse.body; + let bidResponses = []; + if (!serverBody) { + return bidResponses; + } + if (!serverBody.seatbid || !serverBody.seatbid.length) { + return []; + } + serverBody.seatbid.forEach(seatbid => { + if (seatbid.bid.length) { + bidResponses = [...bidResponses, ...seatbid.bid.filter(bid => bid.price > 0).map(bid => ({ + id: bid.id, + requestId: bid.impid, + cpm: bid.price, + currency: serverBody.cur, + netRevenue: true, + ad: bid.adm, + width: bid.w || 0, + height: bid.h || 0, + ttl: 300, + creativeId: bid.crid || 0, + hash: bid.hash, + expiry: bid.expiry, + meta: { + advertiserDomains: bid.adomain && bid.adomain.length ? bid.adomain : [] + } + }))]; + } + }); + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (!serverResponses || serverResponses.length === 0) { + return []; + } + if (!syncOptions.iframeEnabled) { + return []; + } + let params = ''; + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params += `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + params += `?gdpr_consent=${gdprConsent.consentString}`; + } + } + if (uspConsent) { + params += `${params ? '&' : '?'}us_privacy=${encodeURIComponent(uspConsent)}`; + } + if (document.location.search.match(/pbs_debug=true/)) params += `&pbs_debug=true`; + return [{ + type: 'iframe', + url: ORIGIN + COOKIE_SYNC_URI + params + }]; + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Object} bid The bid that won the auction + */ + onBidWon: function (bid) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(`${LOGGER_URI}/prebid/won`, null, JSON.stringify(bid), { + method: 'POST', + contentType: 'application/json' + }); + return true; + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {Object} data Containing timeout specific data + */ + onTimeout: function (data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(`${LOGGER_URI}/prebid/timeout`, null, JSON.stringify(data[0]), { + method: 'POST', + contentType: 'application/json' + }); + return true; + }, + /** + * Register bidder specific code, which will execute if the bid request failed + * @param {*} param0 + */ + onBidderError: function (_ref) { + let { + error, + bidderRequest + } = _ref; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(`${LOGGER_JS_URI}/logger`, null, JSON.stringify({ + error, + bidderRequest + }), { + method: 'POST', + contentType: 'application/json' + }); + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('impactifyBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/impactifyBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["improvedigitalBidAdapter"],{ + +/***/ "./modules/improvedigitalBidAdapter.js": +/*!*********************************************!*\ + !*** ./modules/improvedigitalBidAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, CONVERTER */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/currencyUtils/currency.js */ "./libraries/currencyUtils/currency.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'improvedigital'; +const CREATIVE_TTL = 300; +const AD_SERVER_BASE_URL = 'https://ad.360yield.com'; +const BASIC_ADS_BASE_URL = 'https://ad.360yield-basic.com'; +const PB_ENDPOINT = 'pb'; +const EXTEND_URL = 'https://pbs.360yield.com/openrtb2/auction'; +const IFRAME_SYNC_URL = 'https://hb.360yield.com/prebid-universal-creative/load-cookie.html'; +const DEFAULT_CURRENCY = 'USD'; +const VIDEO_PARAMS = { + DEFAULT_MIMES: ['video/mp4'] +}; +const spec = { + code: BIDDER_CODE, + gvlid: 253, + aliases: ['id'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + syncStore: { + extendMode: false, + placementId: null + }, + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid(bid) { + return !!(bid && bid.params && bid.params.placementId && bid.params.publisherId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests(bidRequests, bidderRequest) { + // Save a placement id to send it to the ad server when fetching the user syncs + this.syncStore.placementId = this.syncStore.placementId || bidRequests[0].params.placementId; + return ID_REQUEST.buildServerRequests(bidRequests, bidderRequest); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {{ortbRequest:Object}} bidderRequest + * @return {Array} An array of bids which were nested inside the server. + */ + interpretResponse(serverResponse, _ref) { + let { + ortbRequest + } = _ref; + return CONVERTER.fromORTB({ + request: ortbRequest, + response: serverResponse.body + }).bids; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + if (_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('coppa') === true || !(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__.hasPurpose1Consent)(gdprConsent)) { + return []; + } + const syncs = []; + if ((this.syncStore.extendMode || !syncOptions.pixelEnabled) && syncOptions.iframeEnabled) { + const { + gdprApplies, + consentString + } = gdprConsent || {}; + const bidders = new Set(); + if (this.syncStore.extendMode && serverResponses) { + serverResponses.forEach(response => { + if (!response?.body?.ext?.responsetimemillis) return; + Object.keys(response.body.ext.responsetimemillis).forEach(b => bidders.add(b)); + }); + } + syncs.push({ + type: 'iframe', + url: IFRAME_SYNC_URL + `?placement_id=${this.syncStore.placementId}` + (this.syncStore.extendMode ? '&pbs=1' : '') + (typeof gdprApplies === 'boolean' ? `&gdpr=${Number(gdprApplies)}` : '') + (consentString ? `&gdpr_consent=${consentString}` : '') + (uspConsent ? `&us_privacy=${encodeURIComponent(uspConsent)}` : '') + (bidders.size ? `&bidders=${[...bidders].join(',')}` : '') + }); + } else if (syncOptions.pixelEnabled) { + serverResponses.forEach(response => { + const syncArr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(response, `body.ext.${BIDDER_CODE}.sync`, []); + syncArr.forEach(url => { + if (!syncs.some(sync => sync.url === url)) { + syncs.push({ + type: 'image', + url + }); + } + }); + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +const convertBidFloorCurrency = imp => { + try { + const bidFloor = (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_5__.convertCurrency)(imp.bidfloor, imp.bidfloorcur, DEFAULT_CURRENCY, false); + imp.bidfloor = bidFloor; + imp.bidfloorcur = DEFAULT_CURRENCY; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)(`Failed to convert bid floor to ${DEFAULT_CURRENCY}. Passing floor price in its original currency.`, err); + } +}; +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_7__.ortbConverter)({ + context: { + ttl: CREATIVE_TTL, + nativeRequest: { + eventtrackers: [{ + event: 1, + methods: [1, 2] + }] + } + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + imp.secure = bidRequest.ortb2Imp?.secure ?? 1; + if (!imp.bidfloor && bidRequest.params.bidFloor) { + imp.bidfloor = bidRequest.params.bidFloor; + imp.bidfloorcur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getBidIdParameter)('bidFloorCur', bidRequest.params).toUpperCase() || DEFAULT_CURRENCY; + } + if (imp.bidfloor && imp.bidfloorcur && imp.bidfloorcur !== DEFAULT_CURRENCY) { + convertBidFloorCurrency(imp); + } + const bidderParamsPath = context.extendMode ? 'ext.prebid.bidder.improvedigital' : 'ext.bidder'; + const placementId = bidRequest.params.placementId; + const publisherId = bidRequest.params.publisherId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, `${bidderParamsPath}.placementId`, placementId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, `${bidderParamsPath}.publisherId`, publisherId); + if (context.extendMode) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, 'ext.prebid.storedrequest.id', '' + placementId); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, `${bidderParamsPath}.keyValues`, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getBidIdParameter)('keyValues', bidRequest.params) || undefined); + context.bidderRequest.bidLimit && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, 'ext.max_bids', context.bidderRequest.bidLimit); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.mergeDeep)(request, { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getUniqueIdentifierStr)(), + source: {}, + ext: { + improvedigital: { + sdk: { + name: 'pbjs', + version: "9.45.0-pre" + } + } + } + }); + return request; + }, + bidResponse(buildBidResponse, bid, context) { + if (!bid.adm || !bid.price || bid.hasOwnProperty('errorCode')) { + return; + } + const { + bidRequest + } = context; + context.mediaType = (() => { + const requestMediaTypes = Object.keys(bidRequest.mediaTypes); + if (requestMediaTypes.length === 1) return requestMediaTypes[0]; + // Detect media type for multi-format response + if (bid.adm.search(/^(<\?xml| { + const bidParamsPublisherId = bidRequest.params.publisherId; + const extendModeEnabled = this.isExtendModeEnabled(globalExtendMode, bidRequest.params); + if (singleRequestMode) { + if (!publisherId) { + publisherId = bidParamsPublisherId; + } else if (bidParamsPublisherId && publisherId !== bidParamsPublisherId) { + throw new Error(`All Improve Digital placements in a single call must have the same publisherId. Please check your 'params.publisherId' or turn off the single request mode.`); + } + extendModeEnabled ? extendBids.push(bidRequest) : adServerBids.push(bidRequest); + } else { + requests.push(formatRequest([bidRequest], bidParamsPublisherId, extendModeEnabled)); + } + }); + if (!singleRequestMode) { + return requests; + } + // In the single request mode, split imps between those going to the ad server and those going to extend server + if (extendBids.length) { + requests.push(formatRequest(extendBids, publisherId, true)); + } + if (adServerBids.length) { + requests.push(formatRequest(adServerBids, publisherId, false)); + } + return requests; + }, + isExtendModeEnabled(globalExtendMode, bidParams) { + const extendMode = typeof bidParams.extend === 'boolean' ? bidParams.extend : globalExtendMode; + if (extendMode && !spec.syncStore.extendMode) { + spec.syncStore.extendMode = true; + } + return extendMode; + }, + isOutstreamVideo(bidRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.context') === 'outstream'; + } +}; +const ID_OUTSTREAM = { + RENDERER_URL: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js', + createRenderer(bidRequest) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_9__.Renderer.install({ + id: bidRequest.adUnitCode, + url: this.RENDERER_URL, + config: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'renderer.options'), + adUnitCode: bidRequest.adUnitCode + }); + try { + renderer.setRender(this.render); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; + }, + render(bid) { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [bid.width, bid.height], + targetId: bid.adUnitCode, + adResponse: bid.adResponse, + rendererOptions: bid.renderer.getConfig() + }, ID_OUTSTREAM.handleRendererEvents.bind(null, bid)); + }); + }, + handleRendererEvents(bid, id, eventName) { + bid.renderer.handleVideoEvent({ + id, + eventName + }); + } +}; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('improvedigitalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","currencyUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/improvedigitalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["imuIdSystem"],{ + +/***/ "./modules/imuIdSystem.js": +/*!********************************!*\ + !*** ./modules/imuIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, storageKey, storagePpKey, cookieKey, apiDomain, removeImDataFromLocalStorage, getLocalData, getApiUrl, apiSuccessProcess, getApiCallback, callImuidApi, imuIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + +/** + * The {@link module:modules/userId} module is required + * @module modules/imuIdSystem + * + * @requires module:modules/userId + */ + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const MODULE_NAME = 'imuid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const storageKey = '__im_uid'; +const storagePpKey = '__im_ppid'; +const cookieKey = '_im_vid'; +const apiDomain = 'sync6.im-apps.net'; +const storageMaxAge = 1800000; // 30 minites (30 * 60 * 1000) +const cookiesMaxAge = 97200000000; // 37 months ((365 * 3 + 30) * 24 * 60 * 60 * 1000) + +function setImDataInCookie(value) { + storage.setCookie(cookieKey, value, new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + cookiesMaxAge).toUTCString(), 'none'); +} +function removeImDataFromLocalStorage() { + storage.removeDataFromLocalStorage(storageKey); + storage.removeDataFromLocalStorage(`${storageKey}_mt`); + storage.removeDataFromLocalStorage(storagePpKey); +} +function getLocalData() { + const mt = storage.getDataFromLocalStorage(`${storageKey}_mt`); + let expired = true; + if (Date.parse(mt) && Date.now() - new Date(mt).getTime() < storageMaxAge) { + expired = false; + } + return { + id: storage.getDataFromLocalStorage(storageKey), + ppid: storage.getDataFromLocalStorage(storagePpKey), + vid: storage.getCookie(cookieKey), + expired: expired + }; +} +function getApiUrl(cid, url) { + const baseUrl = url ? `${url}?cid=${cid}&` : `https://${apiDomain}/${cid}/pid?`; + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)(); + return baseUrl + `page=${encodeURIComponent(refererInfo.page || '')}` + `&ref=${encodeURIComponent(refererInfo.ref || '')}`; +} +function apiSuccessProcess(jsonResponse) { + if (!jsonResponse) { + return; + } + if (jsonResponse.uid && jsonResponse.ppid) { + storage.setDataInLocalStorage(storageKey, jsonResponse.uid); + storage.setDataInLocalStorage(`${storageKey}_mt`, new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)()).toUTCString()); + storage.setDataInLocalStorage(storagePpKey, jsonResponse.ppid); + if (jsonResponse.vid) { + setImDataInCookie(jsonResponse.vid); + } + } else { + removeImDataFromLocalStorage(); + } +} +function getApiCallback(callback) { + return { + success: response => { + let responseObj = {}; + if (response) { + try { + responseObj = JSON.parse(response); + apiSuccessProcess(responseObj); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - imuid submodule: ' + error); + } + } + if (callback && responseObj.uid) { + const callbackObj = { + imuid: responseObj.uid, + imppid: responseObj.ppid + }; + callback(callbackObj); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - imuid submodule was unable to get data from api: ' + error); + if (callback) { + callback(); + } + } + }; +} +function callImuidApi(apiUrl) { + return function (callback) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(apiUrl, getApiCallback(callback), undefined, { + method: 'GET', + withCredentials: true + }); + }; +} + +/** @type {Submodule} */ +const imuIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{imuid: string, imppid: string} | undefined} + */ + decode(ids) { + if (ids && typeof ids === 'object') { + return { + imuid: ids.imuid, + imppid: ids.imppid + }; + } + return undefined; + }, + /** + * @function + * @param {SubmoduleConfig} [config] + * @returns {{id:{imuid: string, imppid: string}} | undefined | {callback:function}}} + */ + getId(config) { + const configParams = config && config.params || {}; + if (!configParams || typeof configParams.cid !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - imuid submodule requires a valid cid to be defined'); + return undefined; + } + let apiUrl = getApiUrl(configParams.cid, configParams.url); + const localData = getLocalData(); + if (localData.vid) { + apiUrl += `&vid=${localData.vid}`; + setImDataInCookie(localData.vid); + } + if (!localData.id) { + return { + callback: callImuidApi(apiUrl) + }; + } + if (localData.expired) { + callImuidApi(apiUrl)(); + } + return { + id: { + imuid: localData.id, + imppid: localData.ppid + } + }; + }, + primaryIds: ['imppid', 'imuid'], + eids: { + 'imppid': { + source: 'ppid.intimatemerger.com', + atype: 1 + }, + 'imuid': { + source: 'intimatemerger.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('userId', imuIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('imuIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/imuIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["incrxBidAdapter"],{ + +/***/ "./modules/incrxBidAdapter.js": +/*!************************************!*\ + !*** ./modules/incrxBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'incrementx'; +const ENDPOINT_URL = 'https://hb.incrementxserv.com/vzhbidder/bid'; +const DEFAULT_CURRENCY = 'USD'; +const CREATIVE_TTL = 300; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + hasTypeVideo(bid) { + return typeof bid.mediaTypes !== 'undefined' && typeof bid.mediaTypes.video !== 'undefined'; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param validBidRequests + * @param bidderRequest + * @return Array Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bidRequest.params.size || bidRequest.sizes); + let mdType = 0; + if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + mdType = 1; + } else { + mdType = 2; + } + const requestParams = { + _vzPlacementId: bidRequest.params.placementId, + sizes: sizes, + _slotBidId: bidRequest.bidId, + _rqsrc: bidderRequest.refererInfo.page, + mChannel: mdType + }; + let payload; + if (mdType === 1) { + // BANNER + payload = { + q: encodeURI(JSON.stringify(requestParams)) + }; + } else { + // VIDEO or other types + payload = { + q: encodeURI(JSON.stringify(requestParams)), + bidderRequestData: encodeURI(JSON.stringify(bidderRequest)) + }; + } + return { + method: 'POST', + url: ENDPOINT_URL, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidderRequest) { + const response = serverResponse.body; + const bids = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(response)) { + return bids; + } + let decodedBidderRequestData; + if (typeof bidderRequest.data.bidderRequestData === 'string') { + decodedBidderRequestData = JSON.parse(decodeURI(bidderRequest.data.bidderRequestData)); + } else { + decodedBidderRequestData = bidderRequest.data.bidderRequestData; + } + const responseBid = { + requestId: response.slotBidId, + cpm: response.cpm > 0 ? response.cpm : 0, + currency: response.currency || DEFAULT_CURRENCY, + adType: response.adType || '1', + settings: response.settings, + width: response.adWidth || 300, + height: response.adHeight || 250, + ttl: CREATIVE_TTL, + creativeId: response.creativeId || 0, + netRevenue: response.netRevenue || false, + mediaType: response.mediaType || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + meta: { + mediaType: response.mediaType, + advertiserDomains: response.advertiserDomains || [] + } + }; + if (response.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + responseBid.ad = response.ad || ''; + } else if (response.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + let context, adUnitCode; + for (let i = 0; i < decodedBidderRequestData.bids.length; i++) { + const item = decodedBidderRequestData.bids[i]; + if (item.bidId === response.slotBidId) { + context = item.mediaTypes.video.context; + adUnitCode = item.adUnitCode; + break; + } + } + if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_2__.INSTREAM) { + responseBid.vastUrl = response.ad || ''; + } else if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_2__.OUTSTREAM) { + responseBid.vastXml = response.ad || ''; + if (response.rUrl) { + responseBid.renderer = createRenderer({ + ...response, + adUnitCode + }); + } + } + } + bids.push(responseBid); + function createRenderer(bid) { + let rendererOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: bid.slotBidId, + url: bid.rUrl, + config: rendererOptions, + adUnitCode: bid.adUnitCode, + loaded: false + }); + try { + renderer.setRender(_ref => { + let { + renderer, + width, + height, + vastXml, + adUnitCode + } = _ref; + renderer.push(() => { + window.onetag.Player.init({ + ...bid, + width, + height, + vastXml, + nodeId: adUnitCode, + config: renderer.getConfig() + }); + }); + }); + } catch (e) {} + return renderer; + } + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('incrxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/incrxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["inmobiBidAdapter"],{ + +/***/ "./modules/inmobiBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/inmobiBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ADAPTER_VERSION, EVENT_ENDPOINT, SYNC_ENDPOINT, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_ortb2_5Translator_translator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortb2.5Translator/translator.js */ "./libraries/ortb2.5Translator/translator.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid + */ + +const GVLID = 333; +const ADAPTER_VERSION = 1.0; +const BIDDER_CODE = 'inmobi'; +const BID_ENDPOINT = 'https://api.w.inmobi.com/openrtb/bidder/prebidjs'; +const EVENT_ENDPOINT = 'https://sync.inmobi.com'; +const SYNC_ENDPOINT = 'https://sync.inmobi.com/prebidjs?'; +const TRANSLATOR = (0,_libraries_ortb2_5Translator_translator_js__WEBPACK_IMPORTED_MODULE_0__.ortb25Translator)(); +const CURRENCY = 'USD'; +const POST_METHOD = 'POST'; +const PLAIN_CONTENT_TYPE = 'text/plain'; + +/** + * Defines the core oRTB converter inherited from converter library and all customization functions. + */ +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 3600, + currency: CURRENCY + }, + imp, + request, + bidResponse, + response +}); + +/** + * Builds an impression object for oRTB 2.5 requests based on the bid request. + * + * @param {function} buildImp - Function to build the imp object. + * @param {Object} bidRequest - The request containing bid details. + * @param {Object} context - Context for the impression. + * @returns {Object} The constructed impression object. + */ +function imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + const params = bidRequest.params; + imp.tagid = bidRequest.adUnitCode; + let floorInfo = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bidRequest.getFloor)) { + floorInfo = bidRequest.getFloor({ + currency: CURRENCY, + size: '*', + mediaType: '*' + }); + } + + // if floor price module is not set reading from bidRequest.params + if (!imp.bidfloor && bidRequest.params.bidfloor) { + imp.bidfloor = bidRequest.params.bidfloor; + imp.bidfloorcur = CURRENCY; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext', { + ...imp.ext, + params: bidRequest.params, + bidder: { + plc: params?.plc + }, + moduleFloors: floorInfo + }); + imp.secure = Number(window.location.protocol === 'https:'); + return imp; +} + +/** + * Constructs the oRTB 2.5 request object. + * + * @param {function} buildRequest - Function to build the request. + * @param {Array} imps - Array of impression objects. + * @param {Object} bidderRequest - Object containing bidder request information. + * @param {Object} context - Additional context. + * @returns {Object} The complete oRTB request object. + */ +function request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'ext.prebid.channel.name', 'pbjs_InMobi'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'ext.prebid.channel.pbjsversion', "9.45.0-pre"); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'ext.prebid.channel.adapterversion', ADAPTER_VERSION); + request = TRANSLATOR(request); + return request; +} + +/** + * Transforms an oRTB 2.5 bid into a bid response format for Prebid.js. + * + * @param {function} buildBidResponse - Function to build a bid response. + * @param {Object} bid - The bid to be transformed. + * @param {Object} context - Context for the bid. + * @returns {Object} Formatted bid response. + */ +function bidResponse(buildBidResponse, bid, context) { + context.mtype = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mtype'); + if (context.mtype === 4) { + const admJson = JSON.parse(bid.adm); + bid.adm = JSON.stringify(admJson.native); + } + let bidResponse = buildBidResponse(bid, context); + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ext') !== 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidResponse, 'meta', { + ...bidResponse.meta, + ...bid.ext + }); + } + return bidResponse; +} + +/** + * Converts the oRTB 2.5 bid response into the format required by Prebid.js. + * + * @param {function} buildResponse - Function to build the response. + * @param {Array} bidResponses - List of bid responses. + * @param {Object} ortbResponse - Original oRTB response data. + * @param {Object} context - Additional context. + * @returns {Object} Prebid.js compatible bid response. + */ +function response(buildResponse, bidResponses, ortbResponse, context) { + let response = buildResponse(bidResponses, ortbResponse, context); + return response; +} + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE], + /** + * Determines user sync options based on consent and supported sync types. + * + * @param {Object} syncOptions - Options for user syncing (iframe, pixel). + * @param {Array} responses - List of bid responses. + * @param {Object} gdprConsent - GDPR consent details. + * @param {Object} uspConsent - CCPA consent details. + * @param {Object} gppConsent - GPP consent details. + * @returns {Array} List of user sync URLs. + */ + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent, gppConsent) => { + const urls = []; + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return urls; + } + const pixelType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let query = ''; + if (gdprConsent) { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_6__.tryAppendQueryString)(query, 'gdpr', gdprConsent.gdprApplies ? 1 : 0); + } + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_6__.tryAppendQueryString)(query, 'gdpr_consent', gdprConsent.consentString); + } + if (uspConsent) { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_6__.tryAppendQueryString)(query, 'us_privacy', uspConsent); + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_6__.tryAppendQueryString)(query, 'gpp', gppConsent.gppString); + query = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_6__.tryAppendQueryString)(query, 'gpp_sid', gppConsent?.applicableSections?.join(',')); + } + if (query.slice(-1) === '&') { + query = query.slice(0, -1); + } + if (pixelType === 'iframe' || !responses || responses.length === 0) { + return [{ + type: pixelType, + url: SYNC_ENDPOINT + query + }]; + } else { + responses.forEach(resp => { + const userSyncs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(resp, 'body.ext.prebidjs.urls'); + if (!userSyncs) { + return; + } + userSyncs.forEach(us => { + let url = us.url; + if (query) { + url = url + (url.indexOf('?') === -1 ? '?' : '&') + query; + } + urls.push({ + type: pixelType, + url: url + }); + }); + }); + return urls; + } + }, + /** + * Validates if a bid request contains the required parameters for InMobi. + * + * @param {Object} bid - Bid request to validate. + * @returns {boolean} True if the bid request is valid, otherwise false. + */ + isBidRequestValid: bid => { + if (!(bid && bid.params && bid.params.plc)) { + return false; + } + return true; + }, + /** + * Builds the server request from bid requests for InMobi. + * + * @param {BidRequest[]} bidRequests - Array of bid requests. + * @param {Object} bidderRequest - Additional request details. + * @returns {ServerRequest} The server request for bidding. + */ + buildRequests: (bidRequests, bidderRequest) => { + const data = CONVERTER.toORTB({ + bidderRequest, + bidRequests + }); + if (data) { + const requestPayload = { + method: POST_METHOD, + url: BID_ENDPOINT, + data: data, + options: { + contentType: PLAIN_CONTENT_TYPE, + crossOrigin: true, + withCredentials: true + } + }; + return requestPayload; + } + }, + /** + * Interprets the server response and formats it into bids. + * + * @param {Object} response - Response from the server. + * @param {ServerRequest} request - Original bid request. + * @returns {Bid[]} Parsed bids or configurations. + */ + interpretResponse: (response, request) => { + if (typeof response?.body == 'undefined') { + return []; + } + const interpretedResponse = CONVERTER.fromORTB({ + response: response.body, + request: request.data + }); + const bids = interpretedResponse.bids || []; + return bids; + }, + /** + * Callback to report timeout event. + * + * @param {TimedOutBid[]} timeoutData - Array of timeout details. + */ + onTimeout: timeoutData => { + report('onTimeout', timeoutData); + }, + /** + * Callback to report targeting event. + * + * @param {Bid} bid - The bid object + */ + onSetTargeting: bid => { + report('onSetTargeting', bid?.meta); + }, + /** + * Callback to report successful ad render event. + * + * @param {Bid} bid - The bid that successfully rendered. + */ + onAdRenderSucceeded: bid => { + report('onAdRenderSucceeded', bid?.meta); + }, + /** + * Callback to report bidder error event. + * + * @param {Object} errorData - Details about the error. + */ + onBidderError: errorData => { + report('onBidderError', errorData); + }, + /** + * Callback to report bid won event. + * + * @param {Bid} bid - The bid that won the auction. + */ + onBidWon: bid => { + report('onBidWon', bid?.meta); + } +}; +function isReportingAllowed(loggingPercentage) { + return loggingPercentage != 0; +} +function report(type, data) { + if (!data) { + return; + } + if (['onBidWon', 'onAdRenderSucceeded', 'onSetTargeting'].includes(type) && !isReportingAllowed(data.loggingPercentage)) { + return; + } + const payload = JSON.stringify({ + domain: location.hostname, + eventPayload: data + }); + fetch(`${EVENT_ENDPOINT}/report/${type}`, { + body: payload, + keepalive: true, + credentials: 'include', + method: POST_METHOD, + headers: { + 'Content-Type': PLAIN_CONTENT_TYPE + } + }).catch(_e => { + // do nothing; ignore errors + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('inmobiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","urlUtils","ortb2.5Translator","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/inmobiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["innityBidAdapter"],{ + +/***/ "./modules/innityBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/innityBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +const BIDDER_CODE = 'innity'; +const ENDPOINT = 'https://as.innity.com/synd/'; +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.pub && bid.params.zone); + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + let parseSized = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(bidRequest.sizes); + let arrSize = parseSized[0].split('x'); + return { + method: 'GET', + url: ENDPOINT, + data: { + cb: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp)(), + ver: 2, + hb: 1, + output: 'js', + pub: bidRequest.params.pub, + zone: bidRequest.params.zone, + url: bidderRequest && bidderRequest.refererInfo ? encodeURIComponent(bidderRequest.refererInfo.page) : '', + width: arrSize[0], + height: arrSize[1], + vpw: window.screen.width, + vph: window.screen.height, + callback: 'json', + callback_uid: bidRequest.bidId, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auction: bidRequest.auctionId + } + }; + }); + }, + interpretResponse: function (serverResponse, request) { + const res = serverResponse.body; + if (Object.keys(res).length === 0) { + return []; + } + const bidResponse = { + requestId: res.callback_uid, + cpm: parseFloat(res.cpm) / 100, + width: res.width, + height: res.height, + creativeId: res.creative_id, + currency: 'USD', + netRevenue: true, + ttl: 60, + ad: '' + res.tag, + meta: { + advertiserDomains: res.adomain && res.adomain.length ? res.adomain : [], + mediaType: res.mediaType + } + }; + return [bidResponse]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('innityBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/innityBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["insticatorBidAdapter"],{ + +/***/ "./modules/insticatorBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/insticatorBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports OPTIONAL_VIDEO_PARAMS, storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +const BIDDER_CODE = 'insticator'; +const ENDPOINT = 'https://ex.ingage.tech/v1/openrtb'; // production endpoint +const USER_ID_KEY = 'hb_insticator_uid'; +const USER_ID_COOKIE_EXP = 2592000000; // 30 days +const BID_TTL = 300; // 5 minutes +const GVLID = 910; +const OPTIONAL_VIDEO_PARAMS = { + 'minduration': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'maxduration': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'protocols': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(value), + // protocols values supported by Inticator, according to the OpenRTB spec + 'startdelay': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'linearity': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value) && [1].includes(value), + 'skip': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value) && [1, 0].includes(value), + 'skipmin': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'skipafter': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'sequence': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'battr': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(value), + 'maxextended': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'minbitrate': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'maxbitrate': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value), + 'playbackmethod': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(value), + 'playbackend': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value) && [1, 2, 3].includes(value), + 'delivery': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(value), + 'pos': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(value) && [0, 1, 2, 3, 4, 5, 6, 7].includes(value), + 'api': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(value) +}; +const ORTB_SITE_FIRST_PARTY_DATA = { + 'cat': v => Array.isArray(v) && v.every(c => typeof c === 'string'), + 'sectioncat': v => Array.isArray(v) && v.every(c => typeof c === 'string'), + 'pagecat': v => Array.isArray(v) && v.every(c => typeof c === 'string'), + 'search': v => typeof v === 'string', + 'mobile': v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(), + 'content': v => typeof v === 'object', + 'keywords': v => typeof v === 'string' +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.setDefaults({ + insticator: { + endpointUrl: ENDPOINT, + bidTTL: BID_TTL + } +}); +function getUserId() { + let uid; + if (storage.localStorageIsEnabled()) { + uid = storage.getDataFromLocalStorage(USER_ID_KEY); + } else { + uid = storage.getCookie(USER_ID_KEY); + } + if (uid && uid.length !== 36) { + uid = undefined; + } + return uid; +} +function setUserId(userId) { + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(USER_ID_KEY, userId); + } + if (storage.cookiesAreEnabled()) { + const expires = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); + storage.setCookie(USER_ID_KEY, userId, expires); + } +} +function buildBanner(bidRequest) { + const format = []; + const pos = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner.pos'); + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes; + for (const size of sizes) { + format.push({ + w: size[0], + h: size[1] + }); + } + return { + format, + pos + }; +} +function buildVideo(bidRequest) { + let w = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.w'); + let h = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.h'); + const mimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.mimes'); + const placement = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.placement'); + const plcmt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.plcmt') || undefined; + const playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.playerSize'); + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.context'); + if (!h && !w && playerSize) { + ({ + w, + h + } = parsePlayerSizeToWidthHeight(playerSize, w, h)); + } + const bidRequestVideo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video'); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.video', {}); + let optionalParams = {}; + for (const param in OPTIONAL_VIDEO_PARAMS) { + if (bidRequestVideo[param] && OPTIONAL_VIDEO_PARAMS[param](bidRequestVideo[param])) { + optionalParams[param] = bidRequestVideo[param]; + } + // remove invalid optional params from bidder specific overrides + if (videoBidderParams[param] && !OPTIONAL_VIDEO_PARAMS[param](videoBidderParams[param])) { + delete videoBidderParams[param]; + } + } + if (placement && typeof placement !== 'undefined' && typeof placement === 'number') { + optionalParams['placement'] = placement; + } + if (plcmt) { + optionalParams['plcmt'] = plcmt; + } + if (context !== undefined) { + optionalParams['context'] = context; + } + let videoObj = { + mimes, + w, + h, + ...optionalParams, + ...videoBidderParams // bidder specific overrides for video + }; + return videoObj; +} +function buildImpression(bidRequest) { + const imp = { + id: bidRequest.bidId, + tagid: bidRequest.adUnitCode, + instl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'ortb2Imp.instl'), + secure: location.protocol === 'https:' ? 1 : 0, + ext: { + gpid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'ortb2Imp.ext.gpid'), + insticator: { + adUnitId: bidRequest.params.adUnitId + } + } + }; + if (bidRequest?.params?.adUnitId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.prebid.bidder.insticator.adUnitId', bidRequest.params.adUnitId); + } + if (bidRequest?.params?.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.prebid.bidder.insticator.publisherId', bidRequest.params.publisherId); + } + let bidFloor = parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.floor')); + if (!isNaN(bidFloor)) { + imp.bidfloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.floor'); + imp.bidfloorcur = 'USD'; + const bidfloorcur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.bidfloorcur'); + if (bidfloorcur && bidfloorcur !== 'USD') { + delete imp.bidfloor; + delete imp.bidfloorcur; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('insticator: bidfloorcur supported by insticator is USD only. ignoring bidfloor and bidfloorcur params'); + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner')) { + imp.banner = buildBanner(bidRequest); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video')) { + imp.video = buildVideo(bidRequest); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bidRequest.getFloor)) { + let moduleBidFloor; + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner') ? 'banner' : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video') ? 'video' : undefined; + let _mediaType = mediaType; + let _size = '*'; + if (mediaType && ['banner', 'video'].includes(mediaType)) { + if (mediaType === 'banner') { + const { + w: width, + h: height + } = imp[mediaType]; + if (width && height) { + _size = [width, height]; + } else { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner.format'); + if (sizes && sizes.length > 0) { + const { + w: width, + h: height + } = sizes[0]; + _size = [width, height]; + } + } + } else if (mediaType === 'video') { + const { + w: width, + h: height + } = imp[mediaType]; + _mediaType = mediaType; + _size = [width, height]; + } + } + try { + moduleBidFloor = bidRequest.getFloor({ + currency: 'USD', + mediaType: _mediaType, + size: _size + }); + } catch (err) { + // continue with no module floors + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('priceFloors module call getFloor failed, error : ', err); + } + if (moduleBidFloor) { + imp.bidfloor = moduleBidFloor.floor; + imp.bidfloorcur = moduleBidFloor.currency; + } + } + return imp; +} +function buildDevice(bidRequest) { + const ortb2Data = bidRequest?.ortb2 || {}; + const deviceConfig = ortb2Data?.device || {}; + const device = { + w: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().innerWidth, + h: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().innerHeight, + js: 1, + ext: { + localStorage: storage.localStorageIsEnabled(), + cookies: storage.cookiesAreEnabled() + } + }; + if (typeof deviceConfig === 'object') { + Object.assign(device, deviceConfig); + } + return device; +} +function _getCoppa(bidderRequest) { + const coppa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.coppa'); + + // If coppa is defined in the request, use it + if (coppa !== undefined) { + return coppa; + } + return _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true ? 1 : 0; +} +function _getGppConsent(bidderRequest) { + let gpp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gppConsent.gppString'); + let gppSid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gppConsent.applicableSections'); + if (!gpp || !gppSid) { + gpp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.gpp', ''); + gppSid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.gpp_sid', []); + } + return { + gpp, + gppSid + }; +} +function _getUspConsent(bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'uspConsent') ? { + uspConsent: bidderRequest.uspConsent + } : false; +} +function buildRegs(bidderRequest) { + let regs = { + ext: {} + }; + if (bidderRequest.gdprConsent) { + regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + regs.ext.gdprConsentString = bidderRequest.gdprConsent.consentString; + } + regs.coppa = _getCoppa(bidderRequest); + const { + gpp, + gppSid + } = _getGppConsent(bidderRequest); + if (gpp) { + regs.ext.gpp = gpp; + } + if (gppSid) { + regs.ext.gppSid = gppSid; + } + const usp = _getUspConsent(bidderRequest); + if (usp) { + regs.ext.us_privacy = usp.uspConsent; + regs.ext.ccpa = usp.uspConsent; + } + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.ext.dsa'); + if (dsa) { + regs.ext.dsa = dsa; + } + return regs; +} +function buildUser(bid) { + const userId = getUserId() || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + const yob = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.user.yob'); + const gender = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.user.gender'); + const keywords = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.user.keywords'); + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.user.data'); + const ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.user.ext'); + setUserId(userId); + const userData = { + id: userId + }; + if (yob) { + userData.yob = yob; + } + if (gender) { + userData.gender = gender; + } + if (keywords) { + userData.keywords = keywords; + } + if (data) { + userData.data = data; + } + if (ext) { + userData.ext = ext; + } + return userData; +} +function extractSchain(bids, requestId) { + if (!bids || bids.length === 0 || !bids[0].schain) return; + const schain = bids[0].schain; + if (schain && schain.nodes && schain.nodes.length && schain.nodes[0]) { + schain.nodes[0].rid = requestId; + } + return schain; +} +function extractEids(bids) { + if (!bids) return; + const bid = bids.find(bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.userIdAsEids) && bid.userIdAsEids.length > 0); + return bid ? bid.userIdAsEids : bids[0].userIdAsEids; +} +function buildRequest(validBidRequests, bidderRequest) { + const req = { + id: bidderRequest.bidderRequestId, + tmax: bidderRequest.timeout, + source: { + fd: 1, + tid: bidderRequest.ortb2?.source?.tid + }, + site: { + // TODO: are these the right refererInfo values? + domain: bidderRequest.refererInfo.domain, + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref + }, + device: buildDevice(bidderRequest), + regs: buildRegs(bidderRequest), + user: buildUser(validBidRequests[0]), + imp: validBidRequests.map(bidRequest => buildImpression(bidRequest)), + ext: { + insticator: { + adapter: { + vendor: 'prebid', + prebid: "9.45.0-pre" + } + } + } + }; + const params = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('insticator.params'); + if (params) { + req.ext = { + insticator: { + ...req.ext.insticator, + ...params + } + }; + } + const schain = extractSchain(validBidRequests, bidderRequest.bidderRequestId); + if (schain) { + req.source.ext = { + schain + }; + } + const eids = extractEids(validBidRequests); + if (eids) { + req.user.ext = { + eids + }; + } + const ortb2SiteData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.site'); + if (ortb2SiteData) { + for (const key in ORTB_SITE_FIRST_PARTY_DATA) { + const value = ortb2SiteData[key]; + if (value && ORTB_SITE_FIRST_PARTY_DATA[key](value)) { + req.site[key] = value; + } + } + } + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + if (validBidRequests[0]?.params?.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req, 'site.publisher.id', validBidRequests[0].params.publisherId); + } + return req; +} +function buildBid(bid, bidderRequest) { + const originalBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(bidderRequest.bids, b => b.bidId === bid.impid); + let meta = {}; + if (bid.ext && bid.ext.meta) { + meta = bid.ext.meta; + } + if (bid.adomain) { + meta.advertiserDomains = bid.adomain; + } + let mediaType = 'banner'; + if (bid.adm && bid.adm.includes(' 0 ? { + meta + } : {}) + }; + if (mediaType === 'video') { + bidResponse.vastXml = bid.adm; + } + + // Inticator bid adaptor only returns `vastXml` for video bids. No VastUrl or videoCache. + if (!bidResponse.vastUrl && bidResponse.vastXml) { + bidResponse.vastUrl = 'data:text/xml;charset=utf-8;base64,' + window.btoa(bidResponse.vastXml.replace(/\\"/g, '"')); + } + if (bid.ext && bid.ext.dsa) { + bidResponse.ext = { + ...bidResponse.ext, + dsa: bid.ext.dsa + }; + } + return bidResponse; +} +function buildBidSet(seatbid, bidderRequest) { + return seatbid.bid.map(bid => buildBid(bid, bidderRequest)); +} +function validateSize(size) { + return size instanceof Array && size.length === 2 && typeof size[0] === 'number' && typeof size[1] === 'number'; +} +function validateSizes(sizes) { + return sizes instanceof Array && sizes.length > 0 && sizes.map(validateSize).reduce((a, b) => a && b, true); +} +function validateAdUnitId(bid) { + if (!bid.params.adUnitId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: missing adUnitId bid parameter'); + return false; + } + return true; +} +function validateMediaType(bid) { + if (!(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER in bid.mediaTypes || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO in bid.mediaTypes)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: expected banner or video in mediaTypes'); + return false; + } + return true; +} +function validateBanner(bid) { + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner'); + if (banner === undefined) { + return true; + } + if (!validateSizes(bid.sizes) && !validateSizes(bid.mediaTypes.banner.sizes)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: banner sizes not specified or invalid'); + return false; + } + return true; +} +function validateVideo(bid) { + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video'); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.video'); + let video = { + ...videoParams, + ...videoBidderParams // bidder specific overrides for video + }; + + // Check if the video object is undefined + if (videoParams === undefined) { + return true; + } + let w = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.w'); + let h = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.h'); + const playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.playerSize'); + if (!h && !w && playerSize) { + ({ + w, + h + } = parsePlayerSizeToWidthHeight(playerSize, w, h)); + } + const videoSize = [w, h]; + if (!validateSize(videoSize)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: video size not specified or invalid'); + return false; + } + const mimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.mimes'); + if (!Array.isArray(mimes) || mimes.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: mimes not specified'); + return false; + } + const plcmt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.plcmt'); + if (typeof plcmt !== 'undefined' && typeof plcmt !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: video plcmt is not a number'); + return false; + } + for (const param in OPTIONAL_VIDEO_PARAMS) { + if (video[param]) { + if (!OPTIONAL_VIDEO_PARAMS[param](video[param])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`insticator: video ${param} is invalid or not supported by insticator`); + } + } + } + if (video.minduration && video.maxduration && video.minduration > video.maxduration) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: video minduration is greater than maxduration'); + return false; + } + return true; +} +function parsePlayerSizeToWidthHeight(playerSize, w, h) { + if (!w && playerSize) { + if (Array.isArray(playerSize[0])) { + w = parseInt(playerSize[0][0], 10); + } else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) { + w = parseInt(playerSize[0], 10); + } + } + if (!h && playerSize) { + if (Array.isArray(playerSize[0])) { + h = parseInt(playerSize[0][1], 10); + } else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) { + h = parseInt(playerSize[1], 10); + } + } + return { + w, + h + }; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO], + isBidRequestValid: function (bid) { + return validateAdUnitId(bid) && validateMediaType(bid) && validateBanner(bid) && validateVideo(bid); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const requests = []; + let endpointUrl = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('insticator.endpointUrl') || ENDPOINT; + endpointUrl = endpointUrl.replace(/^http:/, 'https:'); + + // Use the first bid request's bid_request_url if it exists ( for updating server url) + if (validBidRequests.length > 0) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'params.bid_endpoint_request_url')) { + endpointUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'params.bid_endpoint_request_url').replace(/^http:/, 'https:'); + } + } + if (validBidRequests.length > 0) { + requests.push({ + method: 'POST', + url: endpointUrl, + options: { + contentType: 'application/json', + withCredentials: true + }, + data: JSON.stringify(buildRequest(validBidRequests, bidderRequest)), + bidderRequest + }); + } + return requests; + }, + interpretResponse: function (serverResponse, request) { + const bidderRequest = request.bidderRequest; + const body = serverResponse.body; + if (!body || body.id !== bidderRequest.bidderRequestId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('insticator: response id does not match bidderRequestId'); + return []; + } + if (!body.seatbid) { + return []; + } + const bidsets = body.seatbid.map(seatbid => buildBidSet(seatbid, bidderRequest)); + return bidsets.reduce((a, b) => a.concat(b), []); + }, + getUserSyncs: function (options, responses) { + const syncs = []; + for (const response of responses) { + if (response.body && response.body.ext && response.body.ext.sync instanceof Array) { + syncs.push(...response.body.ext.sync); + } + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('insticatorBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/insticatorBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["instreamTracking"],{ + +/***/ "./modules/instreamTracking.js": +/*!*************************************!*\ + !*** ./modules/instreamTracking.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export trackInstreamDeliveredImpressions */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').AdUnit} AdUnit + */ + +const { + CACHE_ID, + UUID +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS; +const { + BID_WON, + AUCTION_END +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const { + RENDERED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS; +const INSTREAM_TRACKING_DEFAULT_CONFIG = { + enabled: false, + maxWindow: 1000 * 60, + // the time in ms after which polling for instream delivery stops + pollingFreq: 500 // the frequency of polling +}; + +// Set instreamTracking default values +_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.setDefaults({ + 'instreamTracking': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(INSTREAM_TRACKING_DEFAULT_CONFIG) +}); +const whitelistedResources = /video|fetch|xmlhttprequest|other/; + +/** + * Here the idea is + * find all network entries via performance.getEntriesByType() + * filter it by video cache key in the url + * and exclude the ad server urls so that we dont match twice + * eg: + * dfp ads call: https://securepubads.g.doubleclick.net/gampad/ads?...hb_cache_id%3D55e85cd3-6ea4-4469-b890-84241816b131%26... + * prebid cache url: https://prebid.adnxs.com/pbc/v1/cache?uuid=55e85cd3-6ea4-4469-b890-84241816b131 + * + * if the entry exists, emit the BID_WON + * + * Note: this is a workaround till a better approach is engineered. + * + * @param {object} config + * @param {Array} config.adUnits + * @param {Array} config.bidsReceived + * @param {Array} config.bidderRequests + * + * @return {boolean} returns TRUE if tracking started + */ +function trackInstreamDeliveredImpressions(_ref) { + let { + adUnits, + bidsReceived, + bidderRequests + } = _ref; + const instreamTrackingConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('instreamTracking') || {}; + // check if instreamTracking is enabled and performance api is available + if (!instreamTrackingConfig.enabled || !window.performance || !window.performance.getEntriesByType) { + return false; + } + + // filter for video bids + const instreamBids = bidsReceived.filter(bid => { + const bidderRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidRequest)(bid.requestId, bidderRequests); + return bidderRequest && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'mediaTypes.video.context') === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM && bid.videoCacheKey; + }); + if (!instreamBids.length) { + return false; + } + + // find unique instream ad units + const instreamAdUnitMap = {}; + adUnits.forEach(adUnit => { + if (!instreamAdUnitMap[adUnit.code] && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(adUnit, 'mediaTypes.video.context') === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM) { + instreamAdUnitMap[adUnit.code] = true; + } + }); + const instreamAdUnitsCount = Object.keys(instreamAdUnitMap).length; + const start = Date.now(); + const { + maxWindow, + pollingFreq, + urlPattern + } = instreamTrackingConfig; + let instreamWinningBidsCount = 0; + let lastRead = 0; // offset for performance.getEntriesByType + + function poll() { + // get network entries using the last read offset + const entries = window.performance.getEntriesByType('resource').splice(lastRead); + for (const resource of entries) { + const url = resource.name; + // check if the resource is of whitelisted resource to avoid checking img or css or script urls + if (!whitelistedResources.test(resource.initiatorType)) { + continue; + } + instreamBids.forEach(bid => { + // match the video cache key excluding ad server call + const matches = !(url.indexOf(CACHE_ID) !== -1 || url.indexOf(UUID) !== -1) && url.indexOf(bid.videoCacheKey) !== -1; + if (urlPattern && urlPattern instanceof RegExp && !urlPattern.test(url)) { + return; + } + if (matches && bid.status !== RENDERED) { + // video found + instreamWinningBidsCount++; + _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.addWinningBid(bid); + _src_events_js__WEBPACK_IMPORTED_MODULE_6__.emit(BID_WON, bid); + } + }); + } + // update offset + lastRead += entries.length; + const timeElapsed = Date.now() - start; + if (timeElapsed < maxWindow && instreamWinningBidsCount < instreamAdUnitsCount) { + setTimeout(poll, pollingFreq); + } + } + + // start polling for network entries + setTimeout(poll, pollingFreq); + return true; +} +_src_events_js__WEBPACK_IMPORTED_MODULE_6__.on(AUCTION_END, trackInstreamDeliveredImpressions); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('instreamTracking'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/instreamTracking.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["integr8BidAdapter"],{ + +/***/ "./modules/integr8BidAdapter.js": +/*!**************************************!*\ + !*** ./modules/integr8BidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, getBidFloor */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'integr8'; +const DEFAULT_ENDPOINT_URL = 'https://central.sea.integr8.digital/bid'; +const DIMENSION_SEPARATOR = 'x'; +const SIZE_SEPARATOR = ';'; +const BISKO_ID = 'integr8Id'; +const STORAGE_ID = 'bisko-sid'; +const SEGMENTS = 'integr8Segments'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.propertyId && bid.params.placementId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let deliveryUrl = ''; + const storageId = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(STORAGE_ID) || '' : ''; + const biskoId = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(BISKO_ID) || '' : ''; + const segments = storage.localStorageIsEnabled() ? JSON.parse(storage.getDataFromLocalStorage(SEGMENTS)) || [] : []; + let propertyId = ''; + let pageViewGuid = ''; + let bidderRequestId = ''; + let url = ''; + let contents = []; + let data = {}; + if (bidderRequest) { + bidderRequestId = bidderRequest.bidderRequestId; + if (bidderRequest.refererInfo) { + url = bidderRequest.refererInfo.page; + } + } + let placements = validBidRequests.map(bidRequest => { + if (!propertyId) { + propertyId = bidRequest.params.propertyId; + } + if (!pageViewGuid) { + pageViewGuid = bidRequest.params.pageViewGuid || ''; + } + if (!contents.length && bidRequest.params.contents && bidRequest.params.contents.length) { + contents = bidRequest.params.contents; + } + if (!Object.keys(data).length && bidRequest.params.data && Object.keys(bidRequest.params.data).length) { + data = bidRequest.params.data; + } + if (!deliveryUrl && bidRequest.params && typeof bidRequest.params.deliveryUrl === 'string') { + deliveryUrl = bidRequest.params.deliveryUrl; + } + return { + sizes: generateSizeParam(bidRequest.sizes), + adUnitId: bidRequest.adUnitCode, + placementId: bidRequest.params.placementId, + bidid: bidRequest.bidId, + count: bidRequest.params.count, + skipTime: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.skipafter', bidRequest.params.skipTime), + floor: getBidFloor(bidRequest) + }; + }); + if (!deliveryUrl) { + deliveryUrl = DEFAULT_ENDPOINT_URL; + } + let body = { + propertyId: propertyId, + pageViewGuid: pageViewGuid, + storageId: storageId, + biskoId: biskoId, + segments: segments, + url: url, + requestid: bidderRequestId, + placements: placements, + contents: contents, + data: data + }; + return [{ + method: 'POST', + url: deliveryUrl, + data: body + }]; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const responses = serverResponse.body; + const bidResponses = []; + for (var i = 0; i < responses.length; i++) { + const bidResponse = { + requestId: responses[i].BidId, + cpm: responses[i].CPM, + width: responses[i].Width, + height: responses[i].Height, + creativeId: responses[i].CreativeId, + currency: responses[i].Currency, + netRevenue: responses[i].NetRevenue, + ttl: responses[i].TTL, + referrer: responses[i].Referrer, + ad: responses[i].Ad, + vastUrl: responses[i].VastUrl, + mediaType: responses[i].MediaType, + meta: { + advertiserDomains: Array.isArray(responses[i].ADomain) ? responses[i].ADomain : [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + } +}; + +/** + * Generate size param for bid request using sizes array + * + * @param {Array} sizes Possible sizes for the ad unit. + * @return {string} Processed sizes param to be used for the bid request. + */ +function generateSizeParam(sizes) { + return sizes.map(size => size.join(DIMENSION_SEPARATOR)).join(SIZE_SEPARATOR); +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(bid.getFloor)) { + return null; + } + let floor = bid.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('integr8BidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/integr8BidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["intentIqAnalyticsAdapter"],{ + +/***/ "./modules/intentIqAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/intentIqAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports REPORTER_ID, preparePayload */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_intentIqUtils_detectBrowserUtils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/intentIqUtils/detectBrowserUtils.js */ "./libraries/intentIqUtils/detectBrowserUtils.js"); +/* harmony import */ var _libraries_intentIqUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../libraries/intentIqUtils/urlUtils.js */ "./libraries/intentIqUtils/urlUtils.js"); +/* harmony import */ var _libraries_intentIqUtils_getRefferer_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../libraries/intentIqUtils/getRefferer.js */ "./libraries/intentIqUtils/getRefferer.js"); +/* harmony import */ var _libraries_intentIqUtils_getCmpData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/intentIqUtils/getCmpData.js */ "./libraries/intentIqUtils/getCmpData.js"); +/* harmony import */ var _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/intentIqConstants/intentIqConstants.js */ "./libraries/intentIqConstants/intentIqConstants.js"); +/* harmony import */ var _libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/intentIqUtils/storageUtils.js */ "./libraries/intentIqUtils/storageUtils.js"); +/* harmony import */ var _libraries_intentIqUtils_intentIqConfig_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../libraries/intentIqUtils/intentIqConfig.js */ "./libraries/intentIqUtils/intentIqConfig.js"); +/* harmony import */ var _libraries_intentIqUtils_handleAdditionalParams_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../libraries/intentIqUtils/handleAdditionalParams.js */ "./libraries/intentIqUtils/handleAdditionalParams.js"); + + + + + + + + + + + + + + + + + +const MODULE_NAME = 'iiqAnalytics'; +const analyticsType = 'endpoint'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_NAME +}); +const prebidVersion = "9.45.0-pre"; +const REPORTER_ID = Date.now() + '_' + getRandom(0, 1000); +const allowedStorage = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_2__.defineStorageType)(_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.enabledStorageTypes); +const PARAMS_NAMES = { + abTestGroup: 'abGroup', + pbPauseUntil: 'pbPauseUntil', + pbMonitoringEnabled: 'pbMonitoringEnabled', + isInTestGroup: 'isInTestGroup', + enhanceRequests: 'enhanceRequests', + wasSubscribedForPrebid: 'wasSubscribedForPrebid', + hadEids: 'hadEids', + ABTestingConfigurationSource: 'ABTestingConfigurationSource', + lateConfiguration: 'lateConfiguration', + jsversion: 'jsversion', + eidsNames: 'eidsNames', + requestRtt: 'rtt', + clientType: 'clientType', + adserverDeviceType: 'AdserverDeviceType', + terminationCause: 'terminationCause', + callCount: 'callCount', + manualCallCount: 'mcc', + pubprovidedidsFailedToregister: 'ppcc', + noDataCount: 'noDataCount', + profile: 'profile', + isProfileDeterministic: 'pidDeterministic', + siteId: 'sid', + hadEidsInLocalStorage: 'idls', + auctionStartTime: 'ast', + eidsReadTime: 'eidt', + agentId: 'aid', + auctionEidsLength: 'aeidln', + wasServerCalled: 'wsrvcll', + referrer: 'vrref', + isInBrowserBlacklist: 'inbbl', + prebidVersion: 'pbjsver', + partnerId: 'partnerId', + firstPartyId: 'pcid', + placementId: 'placementId', + adType: 'adType' +}; +function getIntentIqConfig() { + return _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('userSync.userIds')?.find(m => m.name === 'intentIqId'); +} +const DEFAULT_URL = 'https://reports.intentiq.com/report'; +const getDataForDefineURL = () => { + const iiqConfig = getIntentIqConfig(); + const cmpData = (0,_libraries_intentIqUtils_getCmpData_js__WEBPACK_IMPORTED_MODULE_4__.getCmpData)(); + const gdprDetected = cmpData.gdprString; + return [iiqConfig, gdprDetected]; +}; +let iiqAnalyticsAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + url: DEFAULT_URL, + analyticsType +}), { + initOptions: { + lsValueInitialized: false, + partner: null, + fpid: null, + currentGroup: null, + dataInLs: null, + eidl: null, + lsIdsInitialized: false, + manualWinReportEnabled: false, + domainName: null, + siloEnabled: false, + reportMethod: null, + additionalParams: null + }, + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case BID_WON: + bidWon(args); + break; + case BID_REQUESTED: + defineGlobalVariableName(); + break; + default: + break; + } + } +}); + +// Events needed +const { + BID_WON, + BID_REQUESTED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS; +function initAdapterConfig() { + if (iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized) return; + let iiqConfig = getIntentIqConfig(); + if (iiqConfig) { + iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized = true; + iiqAnalyticsAnalyticsAdapter.initOptions.partner = iiqConfig.params?.partner && !isNaN(iiqConfig.params.partner) ? iiqConfig.params.partner : -1; + iiqAnalyticsAnalyticsAdapter.initOptions.browserBlackList = typeof iiqConfig.params?.browserBlackList === 'string' ? iiqConfig.params.browserBlackList.toLowerCase() : ''; + iiqAnalyticsAnalyticsAdapter.initOptions.manualWinReportEnabled = iiqConfig.params?.manualWinReportEnabled || false; + iiqAnalyticsAnalyticsAdapter.initOptions.domainName = iiqConfig.params?.domainName || ''; + iiqAnalyticsAnalyticsAdapter.initOptions.siloEnabled = typeof iiqConfig.params?.siloEnabled === 'boolean' ? iiqConfig.params.siloEnabled : false; + iiqAnalyticsAnalyticsAdapter.initOptions.reportMethod = parseReportingMethod(iiqConfig.params?.reportMethod); + iiqAnalyticsAnalyticsAdapter.initOptions.additionalParams = iiqConfig.params?.additionalParams || null; + } else { + iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized = false; + iiqAnalyticsAnalyticsAdapter.initOptions.partner = -1; + iiqAnalyticsAnalyticsAdapter.initOptions.reportMethod = 'GET'; + } +} +function initReadLsIds() { + try { + iiqAnalyticsAnalyticsAdapter.initOptions.dataInLs = null; + iiqAnalyticsAnalyticsAdapter.initOptions.fpid = JSON.parse((0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_2__.readData)(`${_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.FIRST_PARTY_KEY}${iiqAnalyticsAnalyticsAdapter.initOptions.siloEnabled ? '_p_' + iiqAnalyticsAnalyticsAdapter.initOptions.partner : ''}`, allowedStorage, storage)); + if (iiqAnalyticsAnalyticsAdapter.initOptions.fpid) { + iiqAnalyticsAnalyticsAdapter.initOptions.currentGroup = iiqAnalyticsAnalyticsAdapter.initOptions.fpid.group; + } + const partnerData = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_2__.readData)(_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.FIRST_PARTY_KEY + '_' + iiqAnalyticsAnalyticsAdapter.initOptions.partner, allowedStorage, storage); + const clientsHints = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_2__.readData)(_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.CLIENT_HINTS_KEY, allowedStorage, storage) || ''; + if (partnerData) { + iiqAnalyticsAnalyticsAdapter.initOptions.lsIdsInitialized = true; + let pData = JSON.parse(partnerData); + iiqAnalyticsAnalyticsAdapter.initOptions.terminationCause = pData.terminationCause; + iiqAnalyticsAnalyticsAdapter.initOptions.dataInLs = pData.data; + iiqAnalyticsAnalyticsAdapter.initOptions.eidl = pData.eidl || -1; + iiqAnalyticsAnalyticsAdapter.initOptions.clientType = pData.clientType || null; + iiqAnalyticsAnalyticsAdapter.initOptions.siteId = pData.siteId || null; + iiqAnalyticsAnalyticsAdapter.initOptions.wsrvcll = pData.wsrvcll || false; + iiqAnalyticsAnalyticsAdapter.initOptions.rrtt = pData.rrtt || null; + } + iiqAnalyticsAnalyticsAdapter.initOptions.clientsHints = clientsHints; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logError)(e); + } +} +function bidWon(args, isReportExternal) { + if (!iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized) { + initAdapterConfig(); + } + if (isNaN(iiqAnalyticsAnalyticsAdapter.initOptions.partner) || iiqAnalyticsAnalyticsAdapter.initOptions.partner == -1) return; + const currentBrowserLowerCase = (0,_libraries_intentIqUtils_detectBrowserUtils_js__WEBPACK_IMPORTED_MODULE_9__.detectBrowser)(); + if (iiqAnalyticsAnalyticsAdapter.initOptions.browserBlackList?.includes(currentBrowserLowerCase)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logError)('IIQ ANALYTICS -> Browser is in blacklist!'); + return; + } + if (iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized && !iiqAnalyticsAnalyticsAdapter.initOptions.lsIdsInitialized) { + initReadLsIds(); + } + if (isReportExternal && iiqAnalyticsAnalyticsAdapter.initOptions.manualWinReportEnabled || !isReportExternal && !iiqAnalyticsAnalyticsAdapter.initOptions.manualWinReportEnabled) { + const { + url, + method, + payload + } = constructFullUrl(preparePayload(args, true)); + if (method === 'POST') { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_10__.ajax)(url, undefined, payload, { + method, + contentType: 'application/x-www-form-urlencoded' + }); + } else { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_10__.ajax)(url, undefined, null, { + method + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.logInfo)('IIQ ANALYTICS -> BID WON'); + return true; + } + return false; +} +function parseReportingMethod(reportMethod) { + if (typeof reportMethod === 'string') { + switch (reportMethod.toUpperCase()) { + case 'GET': + return 'GET'; + case 'POST': + return 'POST'; + default: + return 'GET'; + } + } + return 'GET'; +} +function defineGlobalVariableName() { + function reportExternalWin(args) { + return bidWon(args, true); + } + const iiqConfig = getIntentIqConfig(); + const partnerId = iiqConfig?.params?.partner || 0; + window[`intentIqAnalyticsAdapter_${partnerId}`] = { + reportExternalWin + }; +} +function getRandom(start, end) { + return Math.floor(Math.random() * (end - start + 1) + start); +} +function preparePayload(data) { + let result = getDefaultDataObject(); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_2__.readData)(_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.FIRST_PARTY_KEY + '_' + iiqAnalyticsAnalyticsAdapter.initOptions.partner, allowedStorage, storage); + result[PARAMS_NAMES.partnerId] = iiqAnalyticsAnalyticsAdapter.initOptions.partner; + result[PARAMS_NAMES.prebidVersion] = prebidVersion; + result[PARAMS_NAMES.referrer] = (0,_libraries_intentIqUtils_getRefferer_js__WEBPACK_IMPORTED_MODULE_11__.getReferrer)(); + result[PARAMS_NAMES.terminationCause] = iiqAnalyticsAnalyticsAdapter.initOptions.terminationCause; + result[PARAMS_NAMES.abTestGroup] = iiqAnalyticsAnalyticsAdapter.initOptions.currentGroup; + result[PARAMS_NAMES.clientType] = iiqAnalyticsAnalyticsAdapter.initOptions.clientType; + result[PARAMS_NAMES.siteId] = iiqAnalyticsAnalyticsAdapter.initOptions.siteId; + result[PARAMS_NAMES.wasServerCalled] = iiqAnalyticsAnalyticsAdapter.initOptions.wsrvcll; + result[PARAMS_NAMES.requestRtt] = iiqAnalyticsAnalyticsAdapter.initOptions.rrtt; + result[PARAMS_NAMES.isInTestGroup] = iiqAnalyticsAnalyticsAdapter.initOptions.currentGroup == 'A'; + result[PARAMS_NAMES.agentId] = REPORTER_ID; + if (iiqAnalyticsAnalyticsAdapter.initOptions.fpid?.pcid) result[PARAMS_NAMES.firstPartyId] = encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.fpid.pcid); + if (iiqAnalyticsAnalyticsAdapter.initOptions.fpid?.pid) result[PARAMS_NAMES.profile] = encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.fpid.pid); + prepareData(data, result); + fillEidsData(result); + return result; +} +function fillEidsData(result) { + if (iiqAnalyticsAnalyticsAdapter.initOptions.lsIdsInitialized) { + result[PARAMS_NAMES.hadEidsInLocalStorage] = iiqAnalyticsAnalyticsAdapter.initOptions.eidl && iiqAnalyticsAnalyticsAdapter.initOptions.eidl > 0; + result[PARAMS_NAMES.auctionEidsLength] = iiqAnalyticsAnalyticsAdapter.initOptions.eidl || -1; + } +} +function prepareData(data, result) { + const adTypeValue = data.adType || data.mediaType; + if (data.bidderCode) { + result.bidderCode = data.bidderCode; + } + if (data.cpm) { + result.cpm = data.cpm; + } + if (data.currency) { + result.currency = data.currency; + } + if (data.originalCpm) { + result.originalCpm = data.originalCpm; + } + if (data.originalCurrency) { + result.originalCurrency = data.originalCurrency; + } + if (data.status) { + result.status = data.status; + } + if (data.auctionId) { + result.prebidAuctionId = data.auctionId; + } + if (adTypeValue) { + result[PARAMS_NAMES.adType] = adTypeValue; + } + const iiqConfig = getIntentIqConfig(); + const adUnitConfig = iiqConfig.params?.adUnitConfig; + switch (adUnitConfig) { + case 1: + // adUnitCode or placementId + result.placementId = data.adUnitCode || extractPlacementId(data) || ''; + break; + case 2: + // placementId or adUnitCode + result.placementId = extractPlacementId(data) || data.adUnitCode || ''; + break; + case 3: + // Only adUnitCode + result.placementId = data.adUnitCode || ''; + break; + case 4: + // Only placementId + result.placementId = extractPlacementId(data) || ''; + break; + default: + // Default (like in case #1) + result.placementId = data.adUnitCode || extractPlacementId(data) || ''; + } + result.biddingPlatformId = 1; + result.partnerAuctionId = 'BW'; +} +function extractPlacementId(data) { + if (data.placementId) { + return data.placementId; + } + if (data.params && Array.isArray(data.params)) { + for (let i = 0; i < data.params.length; i++) { + if (data.params[i].placementId) { + return data.params[i].placementId; + } + } + } + return null; +} +function getDefaultDataObject() { + return { + 'inbbl': false, + 'pbjsver': prebidVersion, + 'partnerAuctionId': 'BW', + 'reportSource': 'pbjs', + 'abGroup': 'U', + 'jsversion': _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.VERSION, + 'partnerId': -1, + 'biddingPlatformId': 1, + 'idls': false, + 'ast': -1, + 'aeidln': -1 + }; +} +function constructFullUrl(data) { + let report = []; + const reportMethod = iiqAnalyticsAnalyticsAdapter.initOptions.reportMethod; + const currentBrowserLowerCase = (0,_libraries_intentIqUtils_detectBrowserUtils_js__WEBPACK_IMPORTED_MODULE_9__.detectBrowser)(); + data = btoa(JSON.stringify(data)); + report.push(data); + const cmpData = (0,_libraries_intentIqUtils_getCmpData_js__WEBPACK_IMPORTED_MODULE_4__.getCmpData)(); + const baseUrl = (0,_libraries_intentIqUtils_intentIqConfig_js__WEBPACK_IMPORTED_MODULE_12__.reportingServerAddress)(...getDataForDefineURL()); + let url = baseUrl + '?pid=' + iiqAnalyticsAnalyticsAdapter.initOptions.partner + '&mct=1' + (iiqAnalyticsAnalyticsAdapter.initOptions?.fpid ? '&iiqid=' + encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.fpid.pcid) : '') + '&agid=' + REPORTER_ID + '&jsver=' + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.VERSION + '&source=' + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_7__.PREBID + '&uh=' + encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.clientsHints) + (cmpData.uspString ? '&us_privacy=' + encodeURIComponent(cmpData.uspString) : '') + (cmpData.gppString ? '&gpp=' + encodeURIComponent(cmpData.gppString) : '') + (cmpData.gdprString ? '&gdpr_consent=' + encodeURIComponent(cmpData.gdprString) + '&gdpr=1' : '&gdpr=0'); + url = (0,_libraries_intentIqUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_13__.appendSPData)(url, iiqAnalyticsAnalyticsAdapter.initOptions.fpid); + url = (0,_libraries_intentIqUtils_getRefferer_js__WEBPACK_IMPORTED_MODULE_11__.appendVrrefAndFui)(url, iiqAnalyticsAnalyticsAdapter.initOptions.domainName); + if (reportMethod === 'POST') { + return { + url, + method: 'POST', + payload: JSON.stringify(report) + }; + } + url += '&payload=' + encodeURIComponent(JSON.stringify(report)); + url = (0,_libraries_intentIqUtils_handleAdditionalParams_js__WEBPACK_IMPORTED_MODULE_14__.handleAdditionalParams)(currentBrowserLowerCase, url, 2, iiqAnalyticsAnalyticsAdapter.initOptions.additionalParams); + return { + url, + method: 'GET' + }; +} +iiqAnalyticsAnalyticsAdapter.originEnableAnalytics = iiqAnalyticsAnalyticsAdapter.enableAnalytics; +iiqAnalyticsAnalyticsAdapter.enableAnalytics = function (myConfig) { + iiqAnalyticsAnalyticsAdapter.originEnableAnalytics(myConfig); // call the base class function +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_15__["default"].registerAnalyticsAdapter({ + adapter: iiqAnalyticsAnalyticsAdapter, + code: MODULE_NAME +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (iiqAnalyticsAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_16__.registerModule)('intentIqAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","intentIqUtils","intentIqConstants","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/intentIqAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["intentIqIdSystem"],{ + +/***/ "./modules/intentIqIdSystem.js": +/*!*************************************!*\ + !*** ./modules/intentIqIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* unused harmony exports firstPartyData, encryptData, decryptData, translateMetadata, createPixelUrl, setGamReporting, handleClientHints, isCMPStringTheSame, intentIqIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var crypto_js_aes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/aes.js */ "./node_modules/crypto-js/aes.js"); +/* harmony import */ var crypto_js_aes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_aes_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var crypto_js_enc_utf8_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js/enc-utf8.js */ "./node_modules/crypto-js/enc-utf8.js"); +/* harmony import */ var crypto_js_enc_utf8_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_utf8_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _libraries_intentIqUtils_detectBrowserUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/intentIqUtils/detectBrowserUtils.js */ "./libraries/intentIqUtils/detectBrowserUtils.js"); +/* harmony import */ var _libraries_intentIqUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/intentIqUtils/urlUtils.js */ "./libraries/intentIqUtils/urlUtils.js"); +/* harmony import */ var _libraries_intentIqUtils_getRefferer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/intentIqUtils/getRefferer.js */ "./libraries/intentIqUtils/getRefferer.js"); +/* harmony import */ var _libraries_intentIqUtils_getCmpData_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../libraries/intentIqUtils/getCmpData.js */ "./libraries/intentIqUtils/getCmpData.js"); +/* harmony import */ var _libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/intentIqUtils/storageUtils.js */ "./libraries/intentIqUtils/storageUtils.js"); +/* harmony import */ var _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/intentIqConstants/intentIqConstants.js */ "./libraries/intentIqConstants/intentIqConstants.js"); +/* harmony import */ var _libraries_intentIqUtils_getSyncKey_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../libraries/intentIqUtils/getSyncKey.js */ "./libraries/intentIqUtils/getSyncKey.js"); +/* harmony import */ var _libraries_intentIqUtils_intentIqConfig_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/intentIqUtils/intentIqConfig.js */ "./libraries/intentIqUtils/intentIqConfig.js"); +/* harmony import */ var _libraries_intentIqUtils_handleAdditionalParams_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/intentIqUtils/handleAdditionalParams.js */ "./libraries/intentIqUtils/handleAdditionalParams.js"); + +/** + * This module adds IntentIqId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/intentIqIdSystem + * @requires module:modules/userId + */ + + + + + + + + + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'intentIqId'; +const encoderCH = { + brands: 0, + mobile: 1, + platform: 2, + architecture: 3, + bitness: 4, + model: 5, + platformVersion: 6, + wow64: 7, + fullVersionList: 8 +}; +let sourceMetaData; +let sourceMetaDataExternal; +let FIRST_PARTY_KEY_FINAL = _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.FIRST_PARTY_KEY; +let PARTNER_DATA_KEY; +let callCount = 0; +let failCount = 0; +let noDataCount = 0; +let firstPartyData; + +/** + * Generate standard UUID string + * @return {string} + */ +function generateGUID() { + let d = new Date().getTime(); + const guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + const r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : r & 0x3 | 0x8).toString(16); + }); + return guid; +} + +/** + * Encrypts plaintext. + * @param {string} plainText The plaintext to encrypt. + * @returns {string} The encrypted text as a base64 string. + */ +function encryptData(plainText) { + return crypto_js_aes_js__WEBPACK_IMPORTED_MODULE_0___default().encrypt(plainText, MODULE_NAME).toString(); +} + +/** + * Decrypts ciphertext. + * @param {string} encryptedText The encrypted text as a base64 string. + * @returns {string} The decrypted plaintext. + */ +function decryptData(encryptedText) { + const bytes = crypto_js_aes_js__WEBPACK_IMPORTED_MODULE_0___default().decrypt(encryptedText, MODULE_NAME); + return bytes.toString((crypto_js_enc_utf8_js__WEBPACK_IMPORTED_MODULE_1___default())); +} +function collectDeviceInfo() { + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)(); + return { + windowInnerHeight: windowDimensions.innerHeight, + windowInnerWidth: windowDimensions.innerWidth, + devicePixelRatio: windowDimensions.devicePixelRatio, + windowScreenHeight: windowDimensions.screen.height, + windowScreenWidth: windowDimensions.screen.width, + language: navigator.language + }; +} +function addUniquenessToUrl(url) { + url += '&tsrnd=' + Math.floor(Math.random() * 1000) + '_' + new Date().getTime(); + return url; +} +function appendDeviceInfoToUrl(url, deviceInfo) { + const screenParamsString = Object.entries(_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.SCREEN_PARAMS).map(_ref => { + let [index, param] = _ref; + const value = deviceInfo[param]; + return `${index}:${value}`; + }).join(','); + url += `&cz=${encodeURIComponent(screenParamsString)}`; + url += `&dw=${deviceInfo.windowScreenWidth}&dh=${deviceInfo.windowScreenHeight}&dpr=${deviceInfo.devicePixelRatio}&lan=${deviceInfo.language}`; + return url; +} +function appendFirstPartyData(url, firstPartyData, partnerData) { + url += firstPartyData.pid ? '&pid=' + encodeURIComponent(firstPartyData.pid) : ''; + url += firstPartyData.pcid ? '&iiqidtype=2&iiqpcid=' + encodeURIComponent(firstPartyData.pcid) : ''; + url += firstPartyData.pcidDate ? '&iiqpciddate=' + encodeURIComponent(firstPartyData.pcidDate) : ''; + return url; +} +function verifyIdType(value) { + if (value === 0 || value === 1 || value === 3 || value === 4) return value; + return -1; +} +function appendPartnersFirstParty(url, configParams) { + let partnerClientId = typeof configParams.partnerClientId === 'string' ? encodeURIComponent(configParams.partnerClientId) : ''; + let partnerClientIdType = typeof configParams.partnerClientIdType === 'number' ? verifyIdType(configParams.partnerClientIdType) : -1; + if (partnerClientIdType === -1) return url; + if (partnerClientId !== '') { + url = url + '&pcid=' + partnerClientId; + url = url + '&idtype=' + partnerClientIdType; + } + return url; +} +function appendCMPData(url, cmpData) { + url += cmpData.uspString ? '&us_privacy=' + encodeURIComponent(cmpData.uspString) : ''; + url += cmpData.gppString ? '&gpp=' + encodeURIComponent(cmpData.gppString) : ''; + url += cmpData.gdprApplies ? '&gdpr_consent=' + encodeURIComponent(cmpData.gdprString) + '&gdpr=1' : '&gdpr=0'; + return url; +} +function appendCounters(url) { + url += '&jaesc=' + encodeURIComponent(callCount); + url += '&jafc=' + encodeURIComponent(failCount); + url += '&jaensc=' + encodeURIComponent(noDataCount); + return url; +} + +/** + * Translate and validate sourceMetaData + */ +function translateMetadata(data) { + try { + const d = data.split('.'); + return ((+d[0] * _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.META_DATA_CONSTANT + +d[1]) * _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.META_DATA_CONSTANT + +d[2]) * _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.META_DATA_CONSTANT + +d[3]; + } catch (e) { + return NaN; + } +} + +/** + * Add sourceMetaData to URL if valid + */ +function addMetaData(url, data) { + if (typeof data !== 'number' || isNaN(data)) { + return url; + } + return url + '&fbp=' + data; +} +function createPixelUrl(firstPartyData, clientHints, configParams, partnerData, cmpData) { + const deviceInfo = collectDeviceInfo(); + const browser = (0,_libraries_intentIqUtils_detectBrowserUtils_js__WEBPACK_IMPORTED_MODULE_4__.detectBrowser)(); + let url = (0,_libraries_intentIqUtils_intentIqConfig_js__WEBPACK_IMPORTED_MODULE_5__.iiqPixelServerAddress)(configParams, cmpData.gdprString); + url += '/profiles_engine/ProfilesEngineServlet?at=20&mi=10&secure=1'; + url += '&dpi=' + configParams.partner; + url = appendFirstPartyData(url, firstPartyData, partnerData); + url = appendPartnersFirstParty(url, configParams); + url = addUniquenessToUrl(url); + url += partnerData?.clientType ? '&idtype=' + partnerData.clientType : ''; + if (deviceInfo) url = appendDeviceInfoToUrl(url, deviceInfo); + url += _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.VERSION ? '&jsver=' + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.VERSION : ''; + if (clientHints) url += '&uh=' + encodeURIComponent(clientHints); + url = (0,_libraries_intentIqUtils_getRefferer_js__WEBPACK_IMPORTED_MODULE_6__.appendVrrefAndFui)(url, configParams.domainName); + url = appendCMPData(url, cmpData); + url = addMetaData(url, sourceMetaDataExternal || sourceMetaData); + url = (0,_libraries_intentIqUtils_handleAdditionalParams_js__WEBPACK_IMPORTED_MODULE_7__.handleAdditionalParams)(browser, url, 0, configParams.additionalParams); + url = (0,_libraries_intentIqUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_8__.appendSPData)(url, firstPartyData); + url += '&source=' + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.PREBID; + return url; +} +function sendSyncRequest(allowedStorage, url, partner, firstPartyData, newUser) { + const lastSyncDate = Number((0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.readData)((0,_libraries_intentIqUtils_getSyncKey_js__WEBPACK_IMPORTED_MODULE_10__.SYNC_KEY)(partner) || '', allowedStorage)) || false; + const lastSyncElapsedTime = Date.now() - lastSyncDate; + if (firstPartyData.isOptedOut) { + const needToDoSync = Date.now() - (firstPartyData?.date || firstPartyData?.sCal || Date.now()) > _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.SYNC_REFRESH_MILL; + if (newUser || needToDoSync) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_11__.ajax)(url, () => {}, undefined, { + method: 'GET', + withCredentials: true + }); + if (firstPartyData?.date) { + firstPartyData.date = Date.now(); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + } + } + } else if (!lastSyncDate || lastSyncElapsedTime > _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.SYNC_REFRESH_MILL) { + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)((0,_libraries_intentIqUtils_getSyncKey_js__WEBPACK_IMPORTED_MODULE_10__.SYNC_KEY)(partner), Date.now() + '', allowedStorage); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_11__.ajax)(url, () => {}, undefined, { + method: 'GET', + withCredentials: true + }); + } +} + +/** + * Configures and updates A/B testing group in Google Ad Manager (GAM). + * + * @param {object} gamObjectReference - Reference to the GAM object, expected to have a `cmd` queue and `pubads()` API. + * @param {string} gamParameterName - The name of the GAM targeting parameter where the group value will be stored. + * @param {string} userGroup - The A/B testing group assigned to the user (e.g., 'A', 'B', or a custom value). + */ +function setGamReporting(gamObjectReference, gamParameterName, userGroup) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(gamObjectReference) && gamObjectReference.cmd) { + gamObjectReference.cmd.push(() => { + gamObjectReference.pubads().setTargeting(gamParameterName, userGroup || _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.NOT_YET_DEFINED); + }); + } +} + +/** + * Processes raw client hints data into a structured format. + * @param {object} clientHints - Raw client hints data + * @return {string} A JSON string of processed client hints or an empty string if no hints + */ +function handleClientHints(clientHints) { + const chParams = {}; + for (const key in clientHints) { + if (clientHints.hasOwnProperty(key) && clientHints[key] !== '') { + if (['brands', 'fullVersionList'].includes(key)) { + let handledParam = ''; + clientHints[key].forEach((element, index) => { + const isNotLast = index < clientHints[key].length - 1; + handledParam += `"${element.brand}";v="${element.version}"${isNotLast ? ', ' : ''}`; + }); + chParams[encoderCH[key]] = handledParam; + } else if (typeof clientHints[key] === 'boolean') { + chParams[encoderCH[key]] = `?${clientHints[key] ? 1 : 0}`; + } else { + chParams[encoderCH[key]] = `"${clientHints[key]}"`; + } + } + } + return Object.keys(chParams).length ? JSON.stringify(chParams) : ''; +} +function isCMPStringTheSame(fpData, cmpData) { + const firstPartyDataCPString = `${fpData.gdprString}${fpData.gppString}${fpData.uspString}`; + const cmpDataString = `${cmpData.gdprString}${cmpData.gppString}${cmpData.uspString}`; + return firstPartyDataCPString === cmpDataString; +} +function updateCountersAndStore(runtimeEids, allowedStorage, partnerData) { + if (!runtimeEids?.eids?.length) { + noDataCount++; + } else { + callCount++; + } + storeCounters(allowedStorage, partnerData); +} +function clearCountersAndStore(allowedStorage, partnerData) { + callCount = 0; + failCount = 0; + noDataCount = 0; + storeCounters(allowedStorage, partnerData); +} +function storeCounters(storage, partnerData) { + partnerData.callCount = callCount; + partnerData.failCount = failCount; + partnerData.noDataCounter = noDataCount; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(PARTNER_DATA_KEY, JSON.stringify(partnerData), storage, firstPartyData); +} + +/** @type {Submodule} */ +const intentIqIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + gvlid: _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {{string}} value + * @returns {{intentIqId: {string}}|undefined} + */ + decode(value) { + return value && value != '' && _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.INVALID_ID != value ? { + 'intentIqId': value + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + const configParams = config?.params || {}; + const firePartnerCallback = () => { + if (configParams.callback && !callbackFired) { + callbackFired = true; + if (callbackTimeoutID) clearTimeout(callbackTimeoutID); + if (isGroupB) runtimeEids = { + eids: [] + }; + configParams.callback(runtimeEids); + } + }; + if (typeof configParams.partner !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('User ID - intentIqId submodule requires a valid partner to be defined'); + firePartnerCallback(); + return; + } + let decryptedData, callbackTimeoutID; + let callbackFired = false; + let runtimeEids = { + eids: [] + }; + let gamObjectReference = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(configParams.gamObjectReference) ? configParams.gamObjectReference : undefined; + let gamParameterName = configParams.gamParameterName ? configParams.gamParameterName : 'intent_iq_group'; + let groupChanged = typeof configParams.groupChanged === 'function' ? configParams.groupChanged : undefined; + let siloEnabled = typeof configParams.siloEnabled === 'boolean' ? configParams.siloEnabled : false; + sourceMetaData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(configParams.sourceMetaData) ? translateMetadata(configParams.sourceMetaData) : ''; + sourceMetaDataExternal = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(configParams.sourceMetaDataExternal) ? configParams.sourceMetaDataExternal : undefined; + let additionalParams = configParams.additionalParams ? configParams.additionalParams : undefined; + PARTNER_DATA_KEY = `${_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.FIRST_PARTY_KEY}_${configParams.partner}`; + const allowedStorage = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.defineStorageType)(config.enabledStorageTypes); + let rrttStrtTime = 0; + let partnerData = {}; + let shouldCallServer = false; + FIRST_PARTY_KEY_FINAL = `${_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.FIRST_PARTY_KEY}${siloEnabled ? '_p_' + configParams.partner : ''}`; + const cmpData = (0,_libraries_intentIqUtils_getCmpData_js__WEBPACK_IMPORTED_MODULE_12__.getCmpData)(); + const gdprDetected = cmpData.gdprString; + firstPartyData = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.tryParse)((0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.readData)(FIRST_PARTY_KEY_FINAL, allowedStorage)); + const isGroupB = firstPartyData?.group === _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.WITHOUT_IIQ; + setGamReporting(gamObjectReference, gamParameterName, firstPartyData?.group); + if (groupChanged) groupChanged(firstPartyData?.group || _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.NOT_YET_DEFINED); + callbackTimeoutID = setTimeout(() => { + firePartnerCallback(); + }, configParams.timeoutInMillis || 500); + const currentBrowserLowerCase = (0,_libraries_intentIqUtils_detectBrowserUtils_js__WEBPACK_IMPORTED_MODULE_4__.detectBrowser)(); + const browserBlackList = typeof configParams.browserBlackList === 'string' ? configParams.browserBlackList.toLowerCase() : ''; + let newUser = false; + if (!firstPartyData?.pcid) { + const firstPartyId = generateGUID(); + firstPartyData = { + pcid: firstPartyId, + pcidDate: Date.now(), + group: _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.NOT_YET_DEFINED, + uspString: _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY, + gppString: _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY, + gdprString: _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.EMPTY, + date: Date.now() + }; + newUser = true; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + } else if (!firstPartyData.pcidDate) { + firstPartyData.pcidDate = Date.now(); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + } + if (gdprDetected && !('isOptedOut' in firstPartyData)) { + firstPartyData.isOptedOut = true; + } + + // Read client hints from storage + let clientHints = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.readData)(_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.CLIENT_HINTS_KEY, allowedStorage); + + // Get client hints and save to storage + if (navigator?.userAgentData?.getHighEntropyValues) { + navigator.userAgentData.getHighEntropyValues(['brands', 'mobile', 'bitness', 'wow64', 'architecture', 'model', 'platform', 'platformVersion', 'fullVersionList']).then(ch => { + clientHints = handleClientHints(ch); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(_libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.CLIENT_HINTS_KEY, clientHints, allowedStorage, firstPartyData); + }); + } + const savedData = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.tryParse)((0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.readData)(PARTNER_DATA_KEY, allowedStorage)); + if (savedData) { + partnerData = savedData; + if (typeof partnerData.callCount === 'number') callCount = partnerData.callCount; + if (typeof partnerData.failCount === 'number') failCount = partnerData.failCount; + if (typeof partnerData.noDataCounter === 'number') noDataCount = partnerData.noDataCounter; + if (partnerData.wsrvcll) { + partnerData.wsrvcll = false; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(PARTNER_DATA_KEY, JSON.stringify(partnerData), allowedStorage, firstPartyData); + } + } + if (partnerData.data) { + if (partnerData.data.length) { + // encrypted data + decryptedData = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.tryParse)(decryptData(partnerData.data)); + runtimeEids = decryptedData; + } + } + if (!isCMPStringTheSame(firstPartyData, cmpData) || !firstPartyData.sCal || savedData && (!partnerData.cttl || !partnerData.date || Date.now() - partnerData.date > partnerData.cttl)) { + firstPartyData.uspString = cmpData.uspString; + firstPartyData.gppString = cmpData.gppString; + firstPartyData.gdprString = cmpData.gdprString; + shouldCallServer = true; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(PARTNER_DATA_KEY, JSON.stringify(partnerData), allowedStorage, firstPartyData); + } + if (!shouldCallServer) { + if (!savedData && !firstPartyData.isOptedOut) { + shouldCallServer = true; + } else shouldCallServer = Date.now() > firstPartyData.sCal + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.HOURS_24; + } + if (firstPartyData.isOptedOut) { + partnerData.data = runtimeEids = { + eids: [] + }; + firePartnerCallback(); + } + if (firstPartyData.group === _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.WITHOUT_IIQ || firstPartyData.group !== _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.WITHOUT_IIQ && runtimeEids?.eids?.length) { + firePartnerCallback(); + } + + // Check if current browser is in blacklist + if (browserBlackList?.includes(currentBrowserLowerCase)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('User ID - intentIqId submodule: browser is in blacklist! Data will be not provided.'); + if (configParams.callback) configParams.callback(''); + const url = createPixelUrl(firstPartyData, clientHints, configParams, partnerData, cmpData); + sendSyncRequest(allowedStorage, url, configParams.partner, firstPartyData, newUser); + return; + } + if (!shouldCallServer) { + if (isGroupB) runtimeEids = { + eids: [] + }; + firePartnerCallback(); + updateCountersAndStore(runtimeEids, allowedStorage, partnerData); + return { + id: runtimeEids.eids + }; + } + + // use protocol relative urls for http or https + let url = `${(0,_libraries_intentIqUtils_intentIqConfig_js__WEBPACK_IMPORTED_MODULE_5__.iiqServerAddress)(configParams, gdprDetected)}/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=${configParams.partner}&pt=17&dpn=1`; + url += configParams.pai ? '&pai=' + encodeURIComponent(configParams.pai) : ''; + url = appendFirstPartyData(url, firstPartyData, partnerData); + url = appendPartnersFirstParty(url, configParams); + url += partnerData.cttl ? '&cttl=' + encodeURIComponent(partnerData.cttl) : ''; + url += partnerData.rrtt ? '&rrtt=' + encodeURIComponent(partnerData.rrtt) : ''; + url = appendCMPData(url, cmpData); + url += '&japs=' + encodeURIComponent(configParams.siloEnabled === true); + url = appendCounters(url); + url += clientHints ? '&uh=' + encodeURIComponent(clientHints) : ''; + url += _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.VERSION ? '&jsver=' + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.VERSION : ''; + url += firstPartyData?.group ? '&testGroup=' + encodeURIComponent(firstPartyData.group) : ''; + url = addMetaData(url, sourceMetaDataExternal || sourceMetaData); + url = (0,_libraries_intentIqUtils_handleAdditionalParams_js__WEBPACK_IMPORTED_MODULE_7__.handleAdditionalParams)(currentBrowserLowerCase, url, 1, additionalParams); + url = (0,_libraries_intentIqUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_8__.appendSPData)(url, firstPartyData); + url += '&source=' + _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.PREBID; + + // Add vrref and fui to the URL + url = (0,_libraries_intentIqUtils_getRefferer_js__WEBPACK_IMPORTED_MODULE_6__.appendVrrefAndFui)(url, configParams.domainName); + const storeFirstPartyData = () => { + partnerData.eidl = runtimeEids?.eids?.length || -1; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(PARTNER_DATA_KEY, JSON.stringify(partnerData), allowedStorage, firstPartyData); + }; + const resp = function (callback) { + const callbacks = { + success: response => { + let respJson = (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.tryParse)(response); + // If response is a valid json and should save is true + if (respJson) { + partnerData.date = Date.now(); + firstPartyData.sCal = Date.now(); + const defineEmptyDataAndFireCallback = () => { + respJson.data = partnerData.data = runtimeEids = { + eids: [] + }; + storeFirstPartyData(); + firePartnerCallback(); + callback(runtimeEids); + }; + if (callbackTimeoutID) clearTimeout(callbackTimeoutID); + if ('cttl' in respJson) { + partnerData.cttl = respJson.cttl; + } else partnerData.cttl = _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.HOURS_24; + if ('tc' in respJson) { + partnerData.terminationCause = respJson.tc; + if (respJson.tc == 41) { + firstPartyData.group = _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.WITHOUT_IIQ; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + if (groupChanged) groupChanged(firstPartyData.group); + defineEmptyDataAndFireCallback(); + if (gamObjectReference) setGamReporting(gamObjectReference, gamParameterName, firstPartyData.group); + return; + } else { + firstPartyData.group = _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.WITH_IIQ; + if (gamObjectReference) setGamReporting(gamObjectReference, gamParameterName, firstPartyData.group); + if (groupChanged) groupChanged(firstPartyData.group); + } + } + if ('isOptedOut' in respJson) { + if (respJson.isOptedOut !== firstPartyData.isOptedOut) { + firstPartyData.isOptedOut = respJson.isOptedOut; + } + if (respJson.isOptedOut === true) { + respJson.data = partnerData.data = runtimeEids = { + eids: [] + }; + const keysToRemove = [PARTNER_DATA_KEY, _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.CLIENT_HINTS_KEY]; + keysToRemove.forEach(key => (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.removeDataByKey)(key, allowedStorage)); + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(FIRST_PARTY_KEY_FINAL, JSON.stringify(firstPartyData), allowedStorage, firstPartyData); + firePartnerCallback(); + callback(runtimeEids); + return; + } + } + if ('pid' in respJson) { + firstPartyData.pid = respJson.pid; + } + if ('dbsaved' in respJson) { + firstPartyData.dbsaved = respJson.dbsaved; + } + if ('ls' in respJson) { + if (respJson.ls === false) { + defineEmptyDataAndFireCallback(); + return; + } + // If data is empty, means we should save as INVALID_ID + if (respJson.data == '') { + respJson.data = _libraries_intentIqConstants_intentIqConstants_js__WEBPACK_IMPORTED_MODULE_2__.INVALID_ID; + } else { + // If data is a single string, assume it is an id with source intentiq.com + if (respJson.data && typeof respJson.data === 'string') { + respJson.data = { + eids: [respJson.data] + }; + } + } + partnerData.data = respJson.data; + } + if ('ct' in respJson) { + partnerData.clientType = respJson.ct; + } + if ('sid' in respJson) { + partnerData.siteId = respJson.sid; + } + if ('spd' in respJson) { + // server provided data + firstPartyData.spd = respJson.spd; + } + if (rrttStrtTime && rrttStrtTime > 0) { + partnerData.rrtt = Date.now() - rrttStrtTime; + } + if (respJson.data?.eids) { + runtimeEids = respJson.data; + callback(respJson.data.eids); + firePartnerCallback(); + const encryptedData = encryptData(JSON.stringify(respJson.data)); + partnerData.data = encryptedData; + } else { + callback(runtimeEids); + firePartnerCallback(); + } + updateCountersAndStore(runtimeEids, allowedStorage, partnerData); + storeFirstPartyData(); + } else { + callback(runtimeEids); + firePartnerCallback(); + } + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(MODULE_NAME + ': ID fetch encountered an error', error); + failCount++; + updateCountersAndStore(runtimeEids, allowedStorage, partnerData); + callback(runtimeEids); + } + }; + rrttStrtTime = Date.now(); + partnerData.wsrvcll = true; + (0,_libraries_intentIqUtils_storageUtils_js__WEBPACK_IMPORTED_MODULE_9__.storeData)(PARTNER_DATA_KEY, JSON.stringify(partnerData), allowedStorage, firstPartyData); + clearCountersAndStore(allowedStorage, partnerData); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_11__.ajax)(url, callbacks, undefined, { + method: 'GET', + withCredentials: true + }); + }; + const respObj = { + callback: resp + }; + if (runtimeEids?.eids?.length) respObj.id = runtimeEids.eids; + return respObj; + }, + eids: { + 'intentIqId': { + source: 'intentiq.com', + atype: 1, + getSource: function (data) { + return data.source; + }, + getValue: function (data) { + if (data?.uids?.length) { + return data.uids[0].id; + } + return null; + }, + getUidExt: function (data) { + if (data?.uids?.length) { + return data.uids[0].ext; + } + return null; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_13__.submodule)('userId', intentIqIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_14__.registerModule)('intentIqIdSystem'); + +/***/ }), + +/***/ "./node_modules/crypto-js/aes.js": +/*!***************************************!*\ + !*** ./node_modules/crypto-js/aes.js ***! + \***************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory, undef) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js"), __webpack_require__(/*! ./enc-base64 */ "./node_modules/crypto-js/enc-base64.js"), __webpack_require__(/*! ./md5 */ "./node_modules/crypto-js/md5.js"), __webpack_require__(/*! ./evpkdf */ "./node_modules/crypto-js/evpkdf.js"), __webpack_require__(/*! ./cipher-core */ "./node_modules/crypto-js/cipher-core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + return CryptoJS.AES; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/cipher-core.js": +/*!***********************************************!*\ + !*** ./node_modules/crypto-js/cipher-core.js ***! + \***********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory, undef) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js"), __webpack_require__(/*! ./evpkdf */ "./node_modules/crypto-js/evpkdf.js")); + } + else {} +}(this, function (CryptoJS) { + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt, hasher) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + if (!hasher) { + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + } else { + var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt); + } + + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/core.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/core.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(); + } + else {} +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.crypto) { + crypto = __webpack_require__.g.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && "function" === 'function') { + try { + crypto = __webpack_require__(/*! crypto */ "?9157"); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/enc-base64.js": +/*!**********************************************!*\ + !*** ./node_modules/crypto-js/enc-base64.js ***! + \**********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + return CryptoJS.enc.Base64; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/enc-utf8.js": +/*!********************************************!*\ + !*** ./node_modules/crypto-js/enc-utf8.js ***! + \********************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + return CryptoJS.enc.Utf8; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/evpkdf.js": +/*!******************************************!*\ + !*** ./node_modules/crypto-js/evpkdf.js ***! + \******************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory, undef) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js"), __webpack_require__(/*! ./sha1 */ "./node_modules/crypto-js/sha1.js"), __webpack_require__(/*! ./hmac */ "./node_modules/crypto-js/hmac.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.EvpKDF; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/hmac.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/hmac.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/md5.js": +/*!***************************************!*\ + !*** ./node_modules/crypto-js/md5.js ***! + \***************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + return CryptoJS.MD5; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/sha1.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/sha1.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + return CryptoJS.SHA1; + +})); + +/***/ }), + +/***/ "?9157": +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/***/ (() => { + +/* (ignored) */ + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["intentIqUtils","intentIqConstants","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/intentIqIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["interactiveOffersBidAdapter"],{ + +/***/ "./modules/interactiveOffersBidAdapter.js": +/*!************************************************!*\ + !*** ./modules/interactiveOffersBidAdapter.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'interactiveOffers'; +const ENDPOINT = 'https://prebid.ioadx.com/bidRequest/?partnerId='; +const DEFAULT = { + 'OpenRTBBidRequest': {}, + 'OpenRTBBidRequestSite': {}, + 'OpenRTBBidRequestSitePublisher': {}, + 'OpenRTBBidRequestSiteContent': { + language: navigator.language + }, + 'OpenRTBBidRequestSource': {}, + 'OpenRTBBidRequestDevice': { + ua: navigator.userAgent, + language: navigator.language + }, + 'OpenRTBBidRequestUser': {}, + 'OpenRTBBidRequestImp': {}, + 'OpenRTBBidRequestImpBanner': {}, + 'PrebidBid': { + currency: 'USD', + ttl: 60, + netRevenue: false + } +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + let ret = true; + if (bid && bid.params) { + if (!bid.params.partnerId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('partnerId must be a valid ID'); + ret = false; + } + if (bid.params.tmax && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params.tmax)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('tmax must be a valid numeric ID'); + ret = false; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('invalid request'); + ret = false; + } + return ret; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let aux = parseRequestPrebidjsToOpenRTB(bidderRequest, bidderRequest); + let payload = aux.payload; + return { + method: 'POST', + url: ENDPOINT + aux.partnerId, + data: JSON.stringify(payload), + bidderRequest: bidderRequest + }; + }, + interpretResponse: function (response, request) { + let bidResponses = []; + if (response.body) { + if (!response.body.length) { + response.body = [response.body]; + } + bidResponses = parseResponseOpenRTBToPrebidjs(response.body); + } + return bidResponses; + } +}; +function parseRequestPrebidjsToOpenRTB(prebidRequest, bidderRequest) { + let ret = { + payload: {}, + partnerId: null + }; + // TODO: these should probably look at refererInfo + let pageURL = window.location.href; + let domain = window.location.hostname; + let openRTBRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequest']); + openRTBRequest.id = bidderRequest.bidderRequestId; + openRTBRequest.ext = { + // TODO: please do not send internal data structures over the network + refererInfo: prebidRequest.refererInfo.legacy, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: prebidRequest.auctionId + }; + openRTBRequest.site = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestSite']); + openRTBRequest.site.id = domain; + openRTBRequest.site.name = domain; + openRTBRequest.site.domain = domain; + openRTBRequest.site.page = pageURL; + openRTBRequest.site.ref = prebidRequest.refererInfo.ref; + openRTBRequest.site.publisher = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestSitePublisher']); + openRTBRequest.site.publisher.id = 0; + openRTBRequest.site.publisher.name = prebidRequest.refererInfo.domain; + openRTBRequest.site.publisher.domain = domain; + openRTBRequest.site.publisher.domain = domain; + openRTBRequest.site.content = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestSiteContent']); + openRTBRequest.source = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestSource']); + openRTBRequest.source.fd = 0; + openRTBRequest.source.tid = prebidRequest.ortb2?.source?.tid; + openRTBRequest.source.pchain = ''; + openRTBRequest.device = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestDevice']); + openRTBRequest.user = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestUser']); + openRTBRequest.imp = []; + prebidRequest.bids.forEach(function (bid) { + if (!ret.partnerId) { + ret.partnerId = bid.params.partnerId; + } + let imp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestImp']); + imp.id = bid.bidId; + imp.secure = bid.ortb2Imp?.secure ?? 1; + imp.tagid = bid.adUnitCode; + imp.ext = { + rawdata: bid + }; + openRTBRequest.site.publisher.id = openRTBRequest.site.publisher.id || 0; + openRTBRequest.tmax = openRTBRequest.tmax || bid.params.tmax || 0; + Object.keys(bid.mediaTypes).forEach(function (mediaType) { + if (mediaType == 'banner') { + imp.banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['OpenRTBBidRequestImpBanner']); + imp.banner.w = 0; + imp.banner.h = 0; + imp.banner.format = []; + bid.mediaTypes[mediaType].sizes.forEach(function (adSize) { + if (!imp.banner.w) { + imp.banner.w = adSize[0]; + imp.banner.h = adSize[1]; + } + imp.banner.format.push({ + w: adSize[0], + h: adSize[1] + }); + }); + } + }); + openRTBRequest.imp.push(imp); + }); + ret.payload = openRTBRequest; + return ret; +} +function parseResponseOpenRTBToPrebidjs(openRTBResponse) { + let prebidResponse = []; + openRTBResponse.forEach(function (response) { + if (response.seatbid && response.seatbid.forEach) { + response.seatbid.forEach(function (seatbid) { + if (seatbid.bid && seatbid.bid.forEach) { + seatbid.bid.forEach(function (bid) { + let prebid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(DEFAULT['PrebidBid']); + prebid.requestId = bid.impid; + prebid.ad = bid.adm; + prebid.creativeId = bid.crid; + prebid.cpm = bid.price; + prebid.width = bid.w; + prebid.height = bid.h; + prebid.mediaType = 'banner'; + prebid.meta = { + advertiserDomains: bid.adomain, + advertiserId: bid.adid, + mediaType: 'banner', + primaryCatId: bid.cat[0] || '', + secondaryCatIds: bid.cat + }; + prebidResponse.push(prebid); + }); + } + }); + } + }); + return prebidResponse; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('interactiveOffersBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/interactiveOffersBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["intersectionRtdProvider"],{ + +/***/ "./modules/intersectionRtdProvider.js": +/*!********************************************!*\ + !*** ./modules/intersectionRtdProvider.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export intersectionSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +let observerAvailable = true; +function getIntersectionData(requestBidsObject, onDone, providerConfig, userConsent) { + const intersectionMap = {}; + const placeholdersMap = {}; + let done = false; + if (!observerAvailable) return complete(); + const observer = new IntersectionObserver(observerCallback, { + threshold: 0.5 + }); + const adUnitCodes = requestBidsObject.adUnitCodes || []; + const auctionDelay = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('realTimeData.auctionDelay') || 0; + const waitForIt = providerConfig.waitForIt; + let adUnits = requestBidsObject.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().adUnits || []; + if (adUnitCodes.length) { + adUnits = adUnits.filter(unit => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(adUnitCodes, unit.code)); + } + let checkTimeoutId; + findAndObservePlaceholders(); + if (auctionDelay > 0) { + setTimeout(complete, auctionDelay); + } + function findAndObservePlaceholders() { + const observed = adUnits.filter(unit => { + const code = unit.code; + if (placeholdersMap[code]) return true; + const ph = document.getElementById(code); + if (ph) { + placeholdersMap[code] = ph; + observer.observe(ph); + return true; + } + }); + if (observed.length === adUnits.length || !waitForIt || auctionDelay <= 0) { + return; + } + checkTimeoutId = setTimeout(findAndObservePlaceholders); + } + function observerCallback(entries) { + let entry = entries.pop(); + while (entry) { + const target = entry.target; + const id = target.getAttribute('id'); + if (id) { + const intersection = intersectionMap[id]; + if (!intersection || intersection.time < entry.time) { + intersectionMap[id] = { + 'boundingClientRect': cloneRect(entry.boundingClientRect), + 'intersectionRect': cloneRect(entry.intersectionRect), + 'rootRect': cloneRect(entry.rootRect), + 'intersectionRatio': entry.intersectionRatio, + 'isIntersecting': entry.isIntersecting, + 'time': entry.time + }; + if (adUnits.every(unit => !!intersectionMap[unit.code])) { + complete(); + } + } + } + entry = entries.pop(); + } + } + function complete() { + if (done) return; + if (checkTimeoutId) clearTimeout(checkTimeoutId); + done = true; + checkTimeoutId = null; + observer && observer.disconnect(); + adUnits && adUnits.forEach(unit => { + const intersection = intersectionMap[unit.code]; + if (intersection && unit.bids) { + unit.bids.forEach(bid => bid.intersection = intersection); + } + }); + onDone(); + } +} +function init(moduleConfig) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(window.IntersectionObserver)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IntersectionObserver is not defined'); + observerAvailable = false; + } else { + observerAvailable = true; + } + return observerAvailable; +} +function cloneRect(rect) { + return rect ? { + 'left': rect.left, + 'top': rect.top, + 'right': rect.right, + 'bottom': rect.bottom, + 'width': rect.width, + 'height': rect.height, + 'x': rect.x, + 'y': rect.y + } : rect; +} +const intersectionSubmodule = { + name: 'intersection', + getBidRequestData: getIntersectionData, + init: init +}; +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('realTimeData', intersectionSubmodule); +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('intersectionRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/intersectionRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["invamiaBidAdapter"],{ + +/***/ "./modules/invamiaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/invamiaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_biddoInvamiaUtils_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/biddoInvamiaUtils/index.js */ "./libraries/biddoInvamiaUtils/index.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'invamia'; +const ENDPOINT_URL = 'https://ad.invamia.com/delivery/impress'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bidRequest) { + return !!bidRequest.params.zoneId; + }, + buildRequests: function (validBidRequests) { + return validBidRequests.flatMap(bidRequest => (0,_libraries_biddoInvamiaUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.buildBannerRequests)(bidRequest, ENDPOINT_URL)); + }, + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + return (0,_libraries_biddoInvamiaUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.interpretBannerResponse)(serverResponse, bidderRequest); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('invamiaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["biddoInvamiaUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/invamiaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["invibesBidAdapter"],{ + +/***/ "./modules/invibesBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/invibesBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec, resetInvibes, stubDomainOptions */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const CONSTANTS = { + BIDDER_CODE: 'invibes', + BID_ENDPOINT: '.videostep.com/Bid/VideoAdContent', + BID_SUBDOMAIN: 'https://bid', + SYNC_ENDPOINT: 'https://k.r66net.com/GetUserSync', + TIME_TO_LIVE: 300, + DEFAULT_CURRENCY: 'EUR', + PREBID_VERSION: 13, + METHOD: 'GET', + INVIBES_VENDOR_ID: 436, + USERID_PROVIDERS: ['pubcid', 'pubProvidedId', 'uid2', 'zeotapIdPlus', 'id5id'], + META_TAXONOMY: ['networkId', 'networkName', 'agencyId', 'agencyName', 'advertiserId', 'advertiserName', 'advertiserDomains', 'brandId', 'brandName', 'primaryCatId', 'secondaryCatIds', 'mediaType'], + DISABLE_USER_SYNC: true +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: CONSTANTS.BIDDER_CODE +}); +const spec = { + code: CONSTANTS.BIDDER_CODE, + gvlid: CONSTANTS.INVIBES_VENDOR_ID, + /** + * @param {object} bid + * @return boolean + */ + isBidRequestValid: isBidRequestValid, + /** + * @param {BidRequest[]} bidRequests + * @param bidderRequest + * @return ServerRequest[] + */ + buildRequests: buildRequest, + /** + * @param {*} responseObj + * @param {*} requestParams + * @return {Bid[]} An array of bids which + */ + interpretResponse: function (responseObj, requestParams) { + return handleResponse(responseObj, requestParams != null ? requestParams.bidRequests : null); + }, + getUserSyncs: getUserSync +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); + +// some state info is required: cookie info, unique user visit id +const topWin = getTopMostWindow(); +let invibes = topWin.invibes = topWin.invibes || {}; +invibes.purposes = invibes.purposes || [false, false, false, false, false, false, false, false, false, false, false]; +invibes.legitimateInterests = invibes.legitimateInterests || [false, false, false, false, false, false, false, false, false, false, false]; +invibes.placementBids = invibes.placementBids || []; +invibes.pushedCids = invibes.pushedCids || {}; +let preventPageViewEvent = false; +let isInfiniteScrollPage = false; +let isPlacementRefresh = false; +let _customUserSync; +let _disableUserSyncs; +function updateInfiniteScrollFlag() { + const { + scrollHeight + } = document.documentElement; + if (invibes.originalURL === undefined) { + invibes.originalURL = window.location.href; + return; + } + if (invibes.originalScrollHeight === undefined) { + invibes.originalScrollHeight = scrollHeight; + return; + } + const currentURL = window.location.href; + if (scrollHeight > invibes.originalScrollHeight && invibes.originalURL !== currentURL) { + isInfiniteScrollPage = true; + } +} +function isBidRequestValid(bid) { + if (typeof bid.params !== 'object') { + return false; + } + let params = bid.params; + if (params.placementId == null) { + return false; + } + return true; +} +function getUserSync(syncOptions) { + if (syncOptions.iframeEnabled) { + if (!(_disableUserSyncs == null || _disableUserSyncs == undefined ? CONSTANTS.DISABLE_USER_SYNC : _disableUserSyncs)) { + const syncUrl = buildSyncUrl(); + return { + type: 'iframe', + url: syncUrl + }; + } + } +} +function buildRequest(bidRequests, bidderRequest) { + bidderRequest = bidderRequest || {}; + const _placementIds = []; + const _adUnitCodes = []; + let _customEndpoint, _userId, _domainId; + let _ivAuctionStart = Date.now(); + window.invibes = window.invibes || {}; + window.invibes.placementIds = window.invibes.placementIds || []; + if (isInfiniteScrollPage == false) { + updateInfiniteScrollFlag(); + } + bidRequests.forEach(function (bidRequest) { + bidRequest.startTime = new Date().getTime(); + if (window.invibes.placementIds.includes(bidRequest.params.placementId)) { + isPlacementRefresh = true; + } + window.invibes.placementIds.push(bidRequest.params.placementId); + _placementIds.push(bidRequest.params.placementId); + _adUnitCodes.push(bidRequest.adUnitCode); + _domainId = _domainId || bidRequest.params.domainId; + _customEndpoint = _customEndpoint || bidRequest.params.customEndpoint; + _customUserSync = _customUserSync || bidRequest.params.customUserSync; + _disableUserSyncs = bidRequest?.params?.disableUserSyncs; + _userId = _userId || bidRequest.userId; + }); + invibes.optIn = invibes.optIn || readGdprConsent(bidderRequest.gdprConsent, bidderRequest.uspConsent); + invibes.visitId = invibes.visitId || generateRandomId(); + const currentQueryStringParams = parseQueryStringParams(); + let userIdModel = getUserIds(_userId); + let bidParamsJson = { + placementIds: _placementIds, + adUnitCodes: _adUnitCodes, + auctionStartTime: _ivAuctionStart, + bidVersion: CONSTANTS.PREBID_VERSION + }; + if (userIdModel) { + bidParamsJson.userId = userIdModel; + } + let data = { + location: getDocumentLocation(bidderRequest), + videoAdHtmlId: generateRandomId(), + showFallback: currentQueryStringParams['advs'] === '0', + ivbsCampIdsLocal: readFromLocalStorage('IvbsCampIdsLocal'), + bidParamsJson: JSON.stringify(bidParamsJson), + capCounts: getCappedCampaignsAsString(), + pcids: Object.keys(invibes.pushedCids).join(','), + vId: invibes.visitId, + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().innerWidth, + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWinDimensions)().innerHeight, + oi: invibes.optIn, + kw: keywords, + purposes: invibes.purposes.toString(), + li: invibes.legitimateInterests.toString(), + tc: invibes.gdpr_consent, + uspc: bidderRequest.uspConsent, + isLocalStorageEnabled: storage.hasLocalStorage(), + preventPageViewEvent: preventPageViewEvent, + isPlacementRefresh: isPlacementRefresh, + isInfiniteScrollPage: isInfiniteScrollPage + }; + if (bidderRequest.refererInfo && bidderRequest.refererInfo.ref) { + data.pageReferrer = bidderRequest.refererInfo.ref.substring(0, 300); + } + let hid = invibes.getCookie('handIid'); + if (hid) { + data.handIid = hid; + } + let lid = readFromLocalStorage('ivbsdid'); + if (!lid) { + let str = invibes.getCookie('ivbsdid'); + if (str) { + try { + let cookieLid = JSON.parse(str); + lid = cookieLid.id ? cookieLid.id : cookieLid; + } catch (e) {} + } + } + if (lid) { + data.lId = lid; + } + const parametersToPassForward = 'videoaddebug,advs,bvci,bvid,istop,trybvid,trybvci'.split(','); + for (let key in currentQueryStringParams) { + if (currentQueryStringParams.hasOwnProperty(key)) { + let value = currentQueryStringParams[key]; + if (parametersToPassForward.indexOf(key) > -1 || /^vs|^invib/i.test(key)) { + data[key] = value; + } + } + } + let endpoint = createEndpoint(_customEndpoint, _domainId, _placementIds); + preventPageViewEvent = true; + return { + method: CONSTANTS.METHOD, + url: endpoint, + data: data, + options: { + withCredentials: true + }, + // for POST: { contentType: 'application/json', withCredentials: true } + bidRequests: bidRequests + }; +} +function handleResponse(responseObj, bidRequests) { + if (bidRequests == null || bidRequests.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - No bids have been requested'); + return []; + } + if (!responseObj) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - Bid response is empty'); + return []; + } + responseObj = responseObj.body || responseObj; + responseObj = responseObj.videoAdContentResult || responseObj; + if (responseObj.ShouldSetLId && responseObj.LId) { + if ((!invibes.optIn || !invibes.purposes[0]) && responseObj.PrivacyPolicyRule && responseObj.TcModel && responseObj.TcModel.PurposeConsents) { + invibes.optIn = responseObj.PrivacyPolicyRule; + invibes.purposes = responseObj.TcModel.PurposeConsents; + } + setInLocalStorage('ivbsdid', responseObj.LId); + } + if (typeof invibes.bidResponse === 'object') { + if (responseObj.MultipositionEnabled === true) { + invibes.bidResponse.AdPlacements = invibes.bidResponse.AdPlacements.concat(responseObj.AdPlacements); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - Bid response already received. Invibes only responds to one bid request per user visit'); + return []; + } + } else { + invibes.bidResponse = responseObj; + } + const bidResponses = []; + for (let i = 0; i < bidRequests.length; i++) { + let bidRequest = bidRequests[i]; + let usedPlacementId = responseObj.UseAdUnitCode === true ? bidRequest.params.placementId + '_' + bidRequest.adUnitCode : bidRequest.params.placementId; + if (invibes.placementBids.indexOf(usedPlacementId) > -1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - Placement was previously bid on ' + usedPlacementId); + continue; + } + let requestPlacement = null; + if (responseObj.AdPlacements != null) { + for (let j = 0; j < responseObj.AdPlacements.length; j++) { + let bidModel = responseObj.AdPlacements[j].BidModel; + if (bidModel != null && bidModel.PlacementId == usedPlacementId) { + requestPlacement = responseObj.AdPlacements[j]; + break; + } + } + } else { + let bidModel = responseObj.BidModel; + if (bidModel != null && bidModel.PlacementId == usedPlacementId) { + requestPlacement = responseObj; + } + } + let bid = createBid(bidRequest, requestPlacement, responseObj.MultipositionEnabled, usedPlacementId); + if (bid !== null) { + invibes.placementBids.push(usedPlacementId); + bidResponses.push(bid); + } + } + return bidResponses; +} +function createBid(bidRequest, requestPlacement, multipositionEnabled, usedPlacementId) { + if (requestPlacement === null || requestPlacement.BidModel === null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - Placement not configured for bidding ' + usedPlacementId); + return null; + } + let bidModel = requestPlacement.BidModel; + let ads = requestPlacement.Ads; + if (!Array.isArray(ads) || ads.length < 1) { + if (requestPlacement.AdReason != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - No ads ' + requestPlacement.AdReason); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - No ads available'); + return null; + } + let ad = ads[0]; + let size = getBiggerSize(bidRequest.sizes); + if (multipositionEnabled === true) { + if (Object.keys(invibes.pushedCids).length > 0) { + if (ad.Blcids != null && ad.Blcids.length > 0) { + let blacklistsPushedCids = Object.keys(invibes.pushedCids).some(function (pushedCid) { + return ad.Blcids.indexOf(parseInt(pushedCid)) > -1; + }); + if (blacklistsPushedCids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - Ad blacklists pushed ids'); + return null; + } + } + let isBlacklisted = Object.keys(invibes.pushedCids).some(function (pushedCid) { + return invibes.pushedCids[pushedCid].indexOf(ad.Cid) > -1; + }); + if (isBlacklisted) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Invibes Adapter - Ad is blacklisted'); + return null; + } + } + } + invibes.pushedCids[ad.Cid] = ad.Blcids || []; + const now = Date.now(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Bid auction started at ' + bidModel.AuctionStartTime + ' . Invibes registered the bid at ' + now + ' ; bid request took a total of ' + (now - bidModel.AuctionStartTime) + ' ms.'); + return { + requestId: bidRequest.bidId, + cpm: ad.BidPrice, + width: bidModel.Width || size[0], + height: bidModel.Height || size[1], + creativeId: ad.VideoExposedId, + currency: bidModel.Currency || CONSTANTS.DEFAULT_CURRENCY, + netRevenue: true, + ttl: CONSTANTS.TIME_TO_LIVE, + ad: renderCreative(bidModel), + meta: addMeta(bidModel.Meta) + }; +} +function createEndpoint(customEndpoint, domainId, placementIds) { + if (customEndpoint != null) { + return customEndpoint; + } + if (domainId != null) { + return extractEndpointFromId(domainId - 1000); + } + if (placementIds.length > 0) { + for (var i = 0; i < placementIds.length; i++) { + const id = extractFromPlacement(placementIds[i]); + if (id != null) { + return extractEndpointFromId(id); + } + } + } + return extractEndpointFromId(1); +} +function extractEndpointFromId(domainId) { + if (domainId < 2) { + return CONSTANTS.BID_SUBDOMAIN + CONSTANTS.BID_ENDPOINT; + } + return CONSTANTS.BID_SUBDOMAIN + domainId + CONSTANTS.BID_ENDPOINT; +} +function extractFromPlacement(placementId) { + if (placementId == null) { + return null; + } + var pattern = /_ivbs([0-9]+)/g; + var match = pattern.exec(placementId); + if (match != null && match[1] != null) { + return parseInt(match[1]); + } + return null; +} +function addMeta(bidModelMeta) { + var meta = {}; + if (bidModelMeta != null) { + for (let i = 0; i < CONSTANTS.META_TAXONOMY.length; i++) { + if (bidModelMeta.hasOwnProperty(CONSTANTS.META_TAXONOMY[i])) { + meta[CONSTANTS.META_TAXONOMY[i]] = bidModelMeta[CONSTANTS.META_TAXONOMY[i]]; + } + } + } + return meta; +} +function generateRandomId() { + return '10000000100040008000100000000000'.replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); +} +function getDocumentLocation(bidderRequest) { + return bidderRequest.refererInfo.page.substring(0, 300); +} +function getUserIds(bidUserId) { + let userId; + if (bidUserId) { + CONSTANTS.USERID_PROVIDERS.forEach(provider => { + if (bidUserId[provider]) { + userId = userId || {}; + userId[provider] = bidUserId[provider]; + } + }); + } + return userId; +} +function parseQueryStringParams() { + let params = {}; + try { + let storedParam = storage.getDataFromLocalStorage('ivbs'); + if (storedParam != null) { + params = JSON.parse(storedParam); + } + } catch (e) {} + let re = /[\\?&]([^=]+)=([^\\?&#]+)/g; + let m; + while ((m = re.exec(window.location.href)) != null) { + if (m.index === re.lastIndex) { + re.lastIndex++; + } + params[m[1].toLowerCase()] = m[2]; + } + return params; +} +function getBiggerSize(array) { + let result = [0, 0]; + for (let i = 0; i < array.length; i++) { + if (array[i][0] * array[i][1] > result[0] * result[1]) { + result = array[i]; + } + } + return result; +} +function getTopMostWindow() { + let res = window; + try { + while (top !== res) { + if (res.parent.location.href.length) { + res = res.parent; + } + } + } catch (e) {} + return res; +} +function renderCreative(bidModel) { + return ` + + + creativeHtml + + `.replace('creativeHtml', bidModel.CreativeHtml); +} +function readFromLocalStorage(key) { + if ((invibes.GdprModuleInstalled || invibes.UspModuleInstalled) && (!invibes.optIn || !invibes.purposes[0])) { + return; + } + return storage.getDataFromLocalStorage(key) || ''; +} +function setInLocalStorage(key, value) { + if (!invibes.optIn || !invibes.purposes[0]) { + return; + } + storage.setDataInLocalStorage(key, value); +} +function getCappedCampaignsAsString() { + const key = 'ivvcap'; + if (!invibes.optIn || !invibes.purposes[0]) { + return ''; + } + let loadData = function () { + try { + return JSON.parse(storage.getDataFromLocalStorage(key)) || {}; + } catch (e) { + return {}; + } + }; + let saveData = function (data) { + storage.setDataInLocalStorage(key, JSON.stringify(data)); + }; + let clearExpired = function () { + let now = new Date().getTime(); + let data = loadData(); + let dirty = false; + Object.keys(data).forEach(function (k) { + let exp = data[k][1]; + if (exp <= now) { + delete data[k]; + dirty = true; + } + }); + if (dirty) { + saveData(data); + } + }; + let getCappedCampaigns = function () { + clearExpired(); + let data = loadData(); + return Object.keys(data).filter(function (k) { + return data.hasOwnProperty(k); + }).sort().map(function (k) { + return [k, data[k][0]]; + }); + }; + return getCappedCampaigns().map(function (record) { + return record.join('='); + }).join(','); +} +function buildSyncUrl() { + let syncUrl = _customUserSync || CONSTANTS.SYNC_ENDPOINT; + syncUrl += '?visitId=' + invibes.visitId; + syncUrl += '&optIn=' + invibes.optIn; + let did = readFromLocalStorage('ivbsdid'); + if (!did) { + let str = invibes.getCookie('ivbsdid'); + if (str) { + try { + let cookieLid = JSON.parse(str); + did = cookieLid.id ? cookieLid.id : cookieLid; + } catch (e) {} + } + } + if (did) { + syncUrl += '&ivbsdid=' + encodeURIComponent(did); + } + return syncUrl; +} +function readGdprConsent(gdprConsent, usConsent) { + invibes.GdprModuleInstalled = false; + invibes.UspModuleInstalled = false; + if (gdprConsent && gdprConsent.vendorData) { + invibes.GdprModuleInstalled = true; + invibes.gdpr_consent = getVendorConsentData(gdprConsent.vendorData); + if (!gdprConsent.vendorData.gdprApplies || gdprConsent.vendorData.hasGlobalConsent) { + setAllPurposesAndLegitimateInterests(true); + return 2; + } + let purposeConsents = getPurposeConsents(gdprConsent.vendorData); + if (purposeConsents == null) { + return 0; + } + let purposesLength = getPurposeConsentsCounter(gdprConsent.vendorData); + if (!tryCopyValueToArray(purposeConsents, invibes.purposes, purposesLength)) { + return 0; + } + let legitimateInterests = getLegitimateInterests(gdprConsent.vendorData); + tryCopyValueToArray(legitimateInterests, invibes.legitimateInterests, purposesLength); + let invibesVendorId = CONSTANTS.INVIBES_VENDOR_ID.toString(10); + let vendorConsents = getVendorConsents(gdprConsent.vendorData); + let vendorHasLegitimateInterest = getVendorLegitimateInterest(gdprConsent.vendorData)[invibesVendorId] === true; + if (vendorConsents == null || vendorConsents[invibesVendorId] == null) { + return 4; + } + if (vendorConsents[invibesVendorId] === false && vendorHasLegitimateInterest === false) { + return 0; + } + return 2; + } else if (usConsent && usConsent.length > 2) { + invibes.UspModuleInstalled = true; + if (usConsent[2] == 'N') { + setAllPurposesAndLegitimateInterests(true); + return 2; + } + } + setAllPurposesAndLegitimateInterests(false); + return 0; +} +function setAllPurposesAndLegitimateInterests(value) { + var index; + for (index = 0; index < invibes.purposes.length; ++index) { + invibes.purposes[index] = value; + } + for (index = 0; index < invibes.legitimateInterests.length; ++index) { + invibes.legitimateInterests[index] = value; + } +} +function tryCopyValueToArray(value, target, length) { + if (value instanceof Array) { + for (let i = 0; i < length && i < value.length; i++) { + target[i] = !(value[i] === false || value[i] === 'false' || value[i] == null); + } + return true; + } + if (typeof value === 'object' && value !== null) { + let i = 0; + for (let prop in value) { + if (i === length) { + break; + } + if (value.hasOwnProperty(prop)) { + let parsedProp = parseInt(prop); + if (isNaN(parsedProp)) { + target[i] = !(value[prop] === false || value[prop] === 'false' || value[prop] == null); + } else { + target[parsedProp - 1] = !(value[prop] === false || value[prop] === 'false' || value[prop] == null); + } + i++; + } + } + return true; + } + return false; +} +function getPurposeConsentsCounter(vendorData) { + if (vendorData.purpose && vendorData.purpose.consents) { + if (vendorData.tcfPolicyVersion >= 4) { + return 11; + } + return 10; + } + return 5; +} +function getPurposeConsents(vendorData) { + if (vendorData.purpose && vendorData.purpose.consents) { + return vendorData.purpose.consents; + } + if (vendorData.purposeConsents) { + return vendorData.purposeConsents; + } + return null; +} +function getLegitimateInterests(vendorData) { + if (vendorData.purpose && vendorData.purpose.legitimateInterests) { + return vendorData.purpose.legitimateInterests; + } + return null; +} +function getVendorConsentData(vendorData) { + if (vendorData.purpose && vendorData.purpose.consents) { + if (vendorData.tcString != null) { + return vendorData.tcString; + } + } + return vendorData.consentData; +} +; +function getVendorConsents(vendorData) { + if (vendorData.vendor && vendorData.vendor.consents) { + return vendorData.vendor.consents; + } + if (vendorData.vendorConsents) { + return vendorData.vendorConsents; + } + return null; +} +function getVendorLegitimateInterest(vendorData) { + if (vendorData.vendor && vendorData.vendor.legitimateInterests) { + return vendorData.vendor.legitimateInterests; + } + return {}; +} + +/// Local domain cookie management ===================== +invibes.Uid = { + generate: function () { + let maxRand = parseInt('zzzzzz', 36); + let mkRand = function () { + return Math.floor(Math.random() * maxRand).toString(36); + }; + let rand1 = mkRand(); + let rand2 = mkRand(); + return rand1 + rand2; + } +}; +invibes.getCookie = function (name) { + if (!storage.cookiesAreEnabled()) { + return; + } + if ((invibes.GdprModuleInstalled || invibes.UspModuleInstalled) && (!invibes.optIn || !invibes.purposes[0])) { + return; + } + return storage.getCookie(name); +}; +let keywords = function () { + const cap = 300; + let headTag = document.getElementsByTagName('head')[0]; + let metaTag = headTag ? headTag.getElementsByTagName('meta') : []; + function parse(str, cap) { + let parsedStr = str.replace(/[<>~|\\"`!@#$%^&*()=+?]/g, ''); + function onlyUnique(value, index, self) { + return value !== '' && self.indexOf(value) === index; + } + let words = parsedStr.split(/[\s,;.:]+/); + let uniqueWords = words.filter(onlyUnique); + parsedStr = ''; + for (let i = 0; i < uniqueWords.length; i++) { + parsedStr += uniqueWords[i]; + if (parsedStr.length >= cap) { + return parsedStr; + } + if (i < uniqueWords.length - 1) { + parsedStr += ','; + } + } + return parsedStr; + } + function gt(cap, prefix) { + cap = cap || 300; + prefix = prefix || ''; + let title = document.title || headTag ? headTag.getElementsByTagName('title')[0] ? headTag.getElementsByTagName('title')[0].innerHTML : '' : ''; + return parse(prefix + ',' + title, cap); + } + function gmeta(metaName, cap, prefix) { + metaName = metaName || 'keywords'; + cap = cap || 100; + prefix = prefix || ''; + let fallbackKw = prefix; + for (let i = 0; i < metaTag.length; i++) { + if (metaTag[i].name && metaTag[i].name.toLowerCase() === metaName.toLowerCase()) { + let kw = prefix + ',' + metaTag[i].content || ''; + return parse(kw, cap); + } else if (metaTag[i].name && metaTag[i].name.toLowerCase().indexOf(metaName.toLowerCase()) > -1) { + fallbackKw = prefix + ',' + metaTag[i].content || ''; + } + } + return parse(fallbackKw, cap); + } + let kw = gmeta('keywords', cap); + if (!kw || kw.length < cap - 8) { + kw = gmeta('description', cap, kw); + if (!kw || kw.length < cap - 8) { + kw = gt(cap, kw); + } + } + return kw; +}(); + +// ====================== + +function resetInvibes() { + invibes.optIn = undefined; + invibes.dom = undefined; + invibes.bidResponse = undefined; + invibes.domainOptions = undefined; + invibes.placementBids = []; + invibes.pushedCids = {}; +} +function stubDomainOptions(persistence) { + invibes.domainOptions = { + persistence: persistence + }; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('invibesBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/invibesBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["invisiblyAnalyticsAdapter"],{ + +/***/ "./modules/invisiblyAnalyticsAdapter.js": +/*!**********************************************!*\ + !*** ./modules/invisiblyAnalyticsAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + +/** + * invisiblyAdapterAdapter.js - analytics adapter for Invisibly + */ + + + + + + +const DEFAULT_EVENT_URL = 'https://api.pymx5.com/v1/' + 'sites/events'; +const analyticsType = 'endpoint'; +const analyticsName = 'Invisibly Analytics Adapter:'; +const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder)(0); + +// Events needed +const { + AUCTION_INIT, + AUCTION_END, + BID_ADJUSTMENT, + BID_TIMEOUT, + BID_REQUESTED, + BID_RESPONSE, + NO_BID, + BID_WON, + BIDDER_DONE, + SET_TARGETING, + REQUEST_BIDS, + ADD_AD_UNITS, + AD_RENDER_FAILED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS; +const _VERSION = 1; +const _pageViewId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); +let initOptions = null; +let _startAuction = 0; +let _bidRequestTimeout = 0; +let flushInterval; +let invisiblyAnalyticsEnabled = false; +const { + width: x, + height: y +} = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_3__.getViewportSize)(); +let _pageView = { + eventType: 'pageView', + userAgent: window.navigator.userAgent, + timestamp: Date.now(), + timezoneOffset: new Date().getTimezoneOffset(), + language: window.navigator.language, + vendor: window.navigator.vendor, + screenWidth: x, + screenHeight: y +}; + +// pass only 1% of events & fail the rest 99% +let weightedFilter = { + filter: Math.random() > 0.99 +}; +let _eventQueue = [_pageView]; +let invisiblyAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__["default"])({ + url: DEFAULT_EVENT_URL, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + handleEvent(eventType, args); + }, + sendEvent, + weightedFilter +}); +invisiblyAdapter.originEnableAnalytics = invisiblyAdapter.enableAnalytics; +invisiblyAdapter.enableAnalytics = function (config) { + initOptions = config.options || {}; + initOptions.url = initOptions.url || DEFAULT_EVENT_URL; + if (initOptions.url && initOptions.account && weightedFilter.filter) { + invisiblyAnalyticsEnabled = true; + invisiblyAdapter.originEnableAnalytics(config); + } else { + invisiblyAnalyticsEnabled = false; + invisiblyAdapter.originDisableAnalytics(); + } + flushInterval = setInterval(flush, 1000); +}; +invisiblyAdapter.originDisableAnalytics = invisiblyAdapter.disableAnalytics; +invisiblyAdapter.disableAnalytics = function () { + if (!invisiblyAnalyticsEnabled) { + return; + } + flush(); + clearInterval(flushInterval); + invisiblyAdapter.originDisableAnalytics(); +}; +function flush() { + if (!invisiblyAnalyticsEnabled) { + return; + } + if (_eventQueue.length > 0) { + while (_eventQueue.length) { + let eventFromQue = _eventQueue.shift(); + let eventtype = 'PREBID_' + eventFromQue.eventType; + delete eventFromQue.eventType; + let data = { + pageViewId: _pageViewId, + ver: _VERSION, + bundleId: initOptions.bundleId, + ...eventFromQue + }; + let payload = { + event_type: eventtype, + event_data: { + ...data + } + }; + ajax(initOptions.url, () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${analyticsName} sent events batch`), JSON.stringify(payload), { + contentType: 'application/json', + method: 'POST', + withCredentials: true + }); + } + } +} +function handleEvent(eventType, eventArgs) { + if (eventArgs) { + eventArgs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.hasNonSerializableProperty)(eventArgs) ? eventArgs : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(eventArgs); + } else { + eventArgs = {}; + } + let invisiblyEvent = {}; + switch (eventType) { + case AUCTION_INIT: + { + invisiblyEvent = eventArgs; + _startAuction = invisiblyEvent.timestamp; + _bidRequestTimeout = invisiblyEvent.timeout; + break; + } + case AUCTION_END: + { + invisiblyEvent = eventArgs; + invisiblyEvent.start = _startAuction; + invisiblyEvent.end = Date.now(); + break; + } + case BID_ADJUSTMENT: + { + invisiblyEvent.bidders = eventArgs; + break; + } + case BID_TIMEOUT: + { + invisiblyEvent.bidders = eventArgs; + invisiblyEvent.duration = _bidRequestTimeout; + break; + } + case BID_REQUESTED: + { + invisiblyEvent = eventArgs; + break; + } + case BID_RESPONSE: + { + invisiblyEvent = eventArgs; + break; + } + case NO_BID: + { + invisiblyEvent.noBid = eventArgs; + break; + } + case BID_WON: + { + invisiblyEvent = eventArgs; + break; + } + case BIDDER_DONE: + { + invisiblyEvent = eventArgs; + break; + } + case SET_TARGETING: + { + invisiblyEvent.targetings = eventArgs; + break; + } + case REQUEST_BIDS: + { + invisiblyEvent = eventArgs; + break; + } + case ADD_AD_UNITS: + { + invisiblyEvent = eventArgs; + break; + } + case AD_RENDER_FAILED: + { + invisiblyEvent = eventArgs; + break; + } + default: + return; + } + invisiblyEvent.eventType = eventType; + invisiblyEvent.timestamp = invisiblyEvent.timestamp || Date.now(); + sendEvent(invisiblyEvent); +} +function sendEvent(event) { + _eventQueue.push(event); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${analyticsName}Event ${event.eventType}:`, event); + if (event.eventType === AUCTION_END) { + flush(); + clearInterval(flushInterval); + } +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: invisiblyAdapter, + code: 'invisiblyAnalytics' +}); +invisiblyAdapter.getOptions = function () { + return initOptions; +}; +invisiblyAdapter.flush = flush; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (invisiblyAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('invisiblyAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/invisiblyAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ipromBidAdapter"],{ + +/***/ "./modules/ipromBidAdapter.js": +/*!************************************!*\ + !*** ./modules/ipromBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +const BIDDER_CODE = 'iprom'; +const ENDPOINT_URL = 'https://core.iprom.net/programmatic'; +const VERSION = 'v1.0.3'; +const DEFAULT_CURRENCY = 'EUR'; +const DEFAULT_NETREVENUE = true; +const DEFAULT_TTL = 360; +const IAB_GVL_ID = 811; +const spec = { + code: BIDDER_CODE, + gvlid: IAB_GVL_ID, + isBidRequestValid: function () { + let { + bidder, + params = {} + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + // id parameter checks + if (!params.id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${bidder}: Parameter 'id' missing`); + return false; + } else if (typeof params.id !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${bidder}: Parameter 'id' needs to be a string`); + return false; + } + // dimension parameter checks + if (!params.dimension) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${bidder}: Required parameter 'dimension' missing`); + return false; + } else if (typeof params.dimension !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${bidder}: Parameter 'dimension' needs to be a string`); + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const payload = { + bids: validBidRequests, + // TODO: please do not send internal data structures over the network + referer: bidderRequest.refererInfo.legacy, + version: VERSION + }; + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + interpretResponse: function (serverResponse, request) { + let bids = serverResponse.body; + const bidResponses = []; + bids.forEach(bid => { + const b = { + ad: bid.ad, + requestId: bid.requestId, + cpm: bid.cpm, + width: bid.width, + height: bid.height, + creativeId: bid.creativeId, + currency: bid.currency || DEFAULT_CURRENCY, + netRevenue: bid.netRevenue || DEFAULT_NETREVENUE, + ttl: bid.ttl || DEFAULT_TTL, + meta: {} + }; + if (bid.aDomains && bid.aDomains.length) { + b.meta.advertiserDomains = bid.aDomains; + } + bidResponses.push(b); + }); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('ipromBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ipromBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["iqxBidAdapter"],{ + +/***/ "./modules/iqxBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/iqxBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/xeUtils/bidderUtils.js */ "./libraries/xeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'iqx'; +const ENDPOINT = 'https://pbjs.iqzonertb.live'; +const spec = { + code: BIDDER_CODE, + aliases: ['iqx'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT), + interpretResponse: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('iqxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","xeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/iqxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["iqzoneBidAdapter"],{ + +/***/ "./modules/iqzoneBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/iqzoneBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'iqzone'; +const AD_URL = 'https://smartssp-us-east.iqzone.com/pbjs'; +const SYNC_URL = 'https://cs.iqzone.com'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('iqzoneBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/iqzoneBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ivsBidAdapter"],{ + +/***/ "./modules/ivsBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/ivsBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'ivs'; +const ENDPOINT_URL = 'https://a.ivstracker.net/prod/openrtb/2.5'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, + ttl: 360, + netRevenue: true + } +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (bid && typeof bid.params !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(BIDDER_CODE + ': params is not defined or is incorrect in the bidder settings.'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(BIDDER_CODE + ': mediaTypes.video is not present in the bidder settings.'); + return false; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.context') !== _src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(BIDDER_CODE + ': only instream video context is allowed.'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('publisherId', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(BIDDER_CODE + ': publisherId is not present in bidder params.'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest - master bidRequest object + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const data = converter.toORTB({ + bidderRequest, + validBidRequests, + context: { + mediaType: 'video' + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(data.site, 'publisher.id', validBidRequests[0].params.publisherId); + return { + method: 'POST', + url: ENDPOINT_URL, + data: data, + options: { + contentType: 'application/json' + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse.body) return; + return converter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('ivsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ivsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ixBidAdapter"],{ + +/***/ "./modules/ixBidAdapter.js": +/*!*********************************!*\ + !*** ./modules/ixBidAdapter.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports LOCAL_STORAGE_FEATURE_TOGGLES_KEY, storage, FEATURE_TOGGLES, bidToVideoImp, bidToNativeImp, spec, combineImps, deduplicateImpExtFields, removeSiteIDs, addDeviceInfo */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + + + + + + + + + + +const BIDDER_CODE = 'ix'; +const GLOBAL_VENDOR_ID = 10; +const SECURE_BID_URL = 'https://htlb.casalemedia.com/openrtb/pbjs'; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const BANNER_ENDPOINT_VERSION = 7.2; +const VIDEO_ENDPOINT_VERSION = 8.1; +const CENT_TO_DOLLAR_FACTOR = 100; +const BANNER_TIME_TO_LIVE = 300; +const VIDEO_TIME_TO_LIVE = 3600; // 1hr +const NATIVE_TIME_TO_LIVE = 3600; // Since native can have video, use ttl same as video +const NET_REVENUE = true; +const MAX_REQUEST_LIMIT = 4; +const MAX_EID_SOURCES = 50; +const OUTSTREAM_MINIMUM_PLAYER_SIZE = [144, 144]; +const PRICE_TO_DOLLAR_FACTOR = { + JPY: 1 +}; +const IFRAME_USER_SYNC_URL = 'https://js-sec.indexww.com/um/ixmatch.html'; +const FLOOR_SOURCE = { + PBJS: 'p', + IX: 'x' +}; +const IMG_USER_SYNC_URL = 'https://dsum.casalemedia.com/pbusermatch?origin=prebid'; +const FIRST_PARTY_DATA = { + SITE: ['id', 'name', 'domain', 'cat', 'sectioncat', 'pagecat', 'page', 'ref', 'search', 'mobile', 'privacypolicy', 'publisher', 'content', 'keywords', 'ext'], + USER: ['id', 'buyeruid', 'yob', 'gender', 'keywords', 'customdata', 'geo', 'data', 'ext'] +}; +const SOURCE_RTI_MAPPING = { + 'liveramp.com': 'idl', + 'netid.de': 'NETID', + 'neustar.biz': 'fabrickId', + 'zeotap.com': 'zeotapIdPlus', + 'uidapi.com': 'UID2', + 'adserver.org': 'TDID' +}; +const PROVIDERS = ['lipbid', 'criteoId', 'merkleId', 'parrableId', 'connectid', 'tapadId', 'quantcastId', 'pubProvidedId', 'pairId']; +const REQUIRED_VIDEO_PARAMS = ['mimes', 'minduration', 'maxduration']; // note: protocol/protocols is also reqd +const VIDEO_PARAMS_ALLOW_LIST = ['mimes', 'minduration', 'maxduration', 'protocols', 'protocol', 'startdelay', 'placement', 'linearity', 'skip', 'skipmin', 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate', 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend', 'delivery', 'pos', 'companionad', 'api', 'companiontype', 'ext', 'playerSize', 'w', 'h', 'plcmt']; +const LOCAL_STORAGE_KEY = 'ixdiag'; +const LOCAL_STORAGE_FEATURE_TOGGLES_KEY = `${BIDDER_CODE}_features`; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const FEATURE_TOGGLES = { + // Update with list of CFTs to be requested from Exchange + REQUESTED_FEATURE_TOGGLES: ['pbjs_enable_multiformat', 'pbjs_allow_all_eids'], + featureToggles: {}, + isFeatureEnabled: function (ft) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(this.featureToggles, `features.${ft}.activated`, false); + }, + getFeatureToggles: function () { + if (storage.localStorageIsEnabled()) { + const parsedToggles = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONParse)(storage.getDataFromLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY)); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(parsedToggles, 'expiry') && parsedToggles.expiry >= new Date().getTime()) { + this.featureToggles = parsedToggles; + } else { + this.clearFeatureToggles(); + } + } + }, + setFeatureToggles: function (serverResponse) { + const responseBody = serverResponse.body; + const expiryTime = new Date(); + const toggles = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(responseBody, 'ext.features'); + if (toggles) { + this.featureToggles = { + expiry: expiryTime.setHours(expiryTime.getHours() + 1), + features: toggles + }; + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY, JSON.stringify(this.featureToggles)); + } + } + }, + clearFeatureToggles: function () { + this.featureToggles = {}; + if (storage.localStorageIsEnabled()) { + storage.removeDataFromLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY); + } + } +}; +let siteID = 0; +let gdprConsent = ''; +let usPrivacy = ''; +let defaultVideoPlacement = false; + +// Possible values for bidResponse.seatBid[].bid[].mtype which indicates the type of the creative markup so that it can properly be associated with the right sub-object of the BidRequest.Imp. +const MEDIA_TYPES = { + Banner: 1, + Video: 2, + Audio: 3, + Native: 4 +}; + +/** + * Transform valid bid request config object to banner impression object that will be sent to ad server. + * + * @param {object} bid A valid bid request config object + * @return {object} A impression object that will be sent to ad server. + */ +function bidToBannerImp(bid) { + const imp = bidToImp(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + imp.banner = {}; + imp.adunitCode = bid.adUnitCode; + const impSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.size'); + if (impSize) { + imp.banner.w = impSize[0]; + imp.banner.h = impSize[1]; + } + imp.banner.topframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.inIframe)() ? 0 : 1; + _applyFloor(bid, imp, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + return imp; +} + +/** + * Sets imp.displaymanager + * + * @param {object} imp + * @param {object} bid + */ +function setDisplayManager(imp, bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context') === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM) { + let renderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.renderer'); + if (!renderer) { + renderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'renderer'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'schain', false)) { + imp.displaymanager = 'pbjs_wrapper'; + } else if (renderer && typeof renderer === 'object') { + if (renderer.url !== undefined) { + let domain = ''; + try { + domain = new URL(renderer.url).hostname; + } catch { + return; + } + if (domain.includes('js-sec.indexww')) { + imp.displaymanager = 'ix'; + } else { + imp.displaymanager = renderer.url; + } + } + } else { + imp.displaymanager = 'ix'; + } + } +} + +/** + * Transform valid bid request config object to video impression object that will be sent to ad server. + * + * @param {object} bid A valid bid request config object. + * @return {object} A impression object that will be sent to ad server. + */ +function bidToVideoImp(bid) { + const imp = bidToImp(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + const videoAdUnitRef = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); + const videoParamRef = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video'); + const videoParamErrors = checkVideoParams(videoAdUnitRef, videoParamRef); + if (videoParamErrors.length) { + return {}; + } + imp.video = videoParamRef ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(bid.params.video) : {}; + // populate imp level transactionId + let tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.tid'); + if (tid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.tid', tid); + } + setDisplayManager(imp, bid); + + // AdUnit-Specific First Party Data + addAdUnitFPD(imp, bid); + + // copy all video properties to imp object + for (const adUnitProperty in videoAdUnitRef) { + if (VIDEO_PARAMS_ALLOW_LIST.indexOf(adUnitProperty) !== -1 && !imp.video.hasOwnProperty(adUnitProperty)) { + imp.video[adUnitProperty] = videoAdUnitRef[adUnitProperty]; + } + } + if (imp.video.minduration > imp.video.maxduration) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`IX Bid Adapter: video minduration [${imp.video.minduration}] cannot be greater than video maxduration [${imp.video.maxduration}]`); + return {}; + } + const context = videoParamRef && videoParamRef.context || videoAdUnitRef && videoAdUnitRef.context; + verifyVideoPlcmt(imp); + + // if placement not already defined, pick one based on `context` + if (context && !imp.video.hasOwnProperty('placement')) { + if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM) { + imp.video.placement = 1; + } else if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(videoParamRef, 'playerConfig.floatOnScroll')) { + imp.video.placement = 5; + } else { + imp.video.placement = 3; + defaultVideoPlacement = true; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`IX Bid Adapter: Video context '${context}' is not supported`); + } + } + if (!(imp.video.w && imp.video.h)) { + // Getting impression Size + const impSize = getFirstSize((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(imp, 'video.playerSize')) || getFirstSize((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.size')); + if (impSize) { + imp.video.w = impSize[0]; + imp.video.h = impSize[1]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('IX Bid Adapter: Video size is missing in [mediaTypes.video]'); + return {}; + } + } + _applyFloor(bid, imp, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + return imp; +} +function verifyVideoPlcmt(imp) { + if (imp.video.hasOwnProperty('plcmt') && (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isInteger)(imp.video.plcmt) || imp.video.plcmt < 1 || imp.video.plcmt > 4)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`IX Bid Adapter: video.plcmt [${imp.video.plcmt}] must be an integer between 1-4 inclusive`); + delete imp.video.plcmt; + } +} + +/** + * Transform valid bid request config object to native impression object that will be sent to ad server. + * + * @param {object} bid A valid bid request config object. + * @return {object} A impression object that will be sent to ad server. + */ +function bidToNativeImp(bid) { + const imp = bidToImp(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + const request = bid.nativeOrtbRequest; + request.eventtrackers = [{ + event: 1, + methods: [1, 2] + }]; + request.privacy = 1; + imp.native = { + request: JSON.stringify(request), + ver: '1.2' + }; + + // populate imp level transactionId + let tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.tid'); + if (tid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.tid', tid); + } + + // AdUnit-Specific First Party Data + addAdUnitFPD(imp, bid); + _applyFloor(bid, imp, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + return imp; +} + +/** + * Converts an incoming PBJS bid to an IX Impression + * @param {object} bid PBJS bid object + * @returns {object} IX impression object + */ +function bidToImp(bid, mediaType) { + const imp = {}; + imp.id = bid.bidId; + if (isExchangeIdConfigured() && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, `params.externalId`)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.externalID', bid.params.externalId); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, `params.${mediaType}.siteId`) && !isNaN(Number(bid.params[mediaType].siteId))) { + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.siteID', bid.params.banner.siteId.toString()); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.siteID', bid.params.video.siteId.toString()); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.siteID', bid.params.native.siteId.toString()); + break; + } + } else { + if (bid.params.siteId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.siteID', bid.params.siteId.toString()); + } + } + + // populate imp level sid + if (bid.params.hasOwnProperty('id') && (typeof bid.params.id === 'string' || typeof bid.params.id === 'number')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.sid', String(bid.params.id)); + } + return imp; +} + +/** + * Gets priceFloors floors and IX adapter floors, + * Validates and sets the higher one on the impression + * @param {object} bid bid object + * @param {object} imp impression object + * @param {string} mediaType the impression ad type, one of the SUPPORTED_AD_TYPES + */ +function _applyFloor(bid, imp, mediaType) { + let adapterFloor = null; + let moduleFloor = null; + if (bid.params.bidFloor && bid.params.bidFloorCur) { + adapterFloor = { + floor: bid.params.bidFloor, + currency: bid.params.bidFloorCur + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(bid.getFloor)) { + let _mediaType = '*'; + let _size = '*'; + if (mediaType && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.contains)(SUPPORTED_AD_TYPES, mediaType)) { + const { + w: width, + h: height + } = imp[mediaType]; + _mediaType = mediaType; + _size = [width, height]; + } + try { + moduleFloor = bid.getFloor({ + mediaType: _mediaType, + size: _size + }); + } catch (err) { + // continue with no module floors + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('priceFloors module call getFloor failed, error : ', err); + } + } + + // Prioritize module floor over bidder.param floor + let setFloor = false; + if (moduleFloor) { + imp.bidfloor = moduleFloor.floor; + imp.bidfloorcur = moduleFloor.currency; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.fl', FLOOR_SOURCE.PBJS); + setFloor = true; + } else if (adapterFloor) { + imp.bidfloor = adapterFloor.floor; + imp.bidfloorcur = adapterFloor.currency; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.fl', FLOOR_SOURCE.IX); + setFloor = true; + } + if (setFloor) { + if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'banner.ext.bidfloor', imp.bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'banner.ext.fl', imp.ext.fl); + } else if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'video.ext.bidfloor', imp.bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'video.ext.fl', imp.ext.fl); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'native.ext.bidfloor', imp.bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'native.ext.fl', imp.ext.fl); + } + } +} + +/** + * Parses a raw bid for the relevant information. + * + * @param {object} rawBid The bid to be parsed. + * @param {string} currency Global currency in bid response. + * @return {object} bid The parsed bid. + */ +function parseBid(rawBid, currency, bidRequest) { + const bid = {}; + const isValidExpiry = !!((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rawBid, 'exp') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isInteger)(rawBid.exp)); + const dealID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rawBid, 'dealid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rawBid, 'ext.dealid'); + if (PRICE_TO_DOLLAR_FACTOR.hasOwnProperty(currency)) { + bid.cpm = rawBid.price / PRICE_TO_DOLLAR_FACTOR[currency]; + } else { + bid.cpm = rawBid.price / CENT_TO_DOLLAR_FACTOR; + } + bid.requestId = rawBid.impid; + if (dealID) { + bid.dealId = dealID; + } + bid.netRevenue = NET_REVENUE; + bid.currency = currency; + bid.creativeId = rawBid.hasOwnProperty('crid') ? rawBid.crid : '-'; + // If mtype = video is passed and vastURl is not set, set vastxml + if (rawBid.mtype == MEDIA_TYPES.Video && (rawBid.ext && !rawBid.ext.vasturl || !rawBid.ext)) { + bid.vastXml = rawBid.adm; + } else if (rawBid.ext && rawBid.ext.vasturl) { + bid.vastUrl = rawBid.ext.vasturl; + } + let parsedAdm = null; + // Detect whether the adm is (probably) JSON + if (typeof rawBid.adm === 'string' && rawBid.adm[0] === '{' && rawBid.adm[rawBid.adm.length - 1] === '}') { + try { + parsedAdm = JSON.parse(rawBid.adm); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('adm looks like JSON but failed to parse: ', err); + } + } + + // in the event of a video + if (rawBid.ext && rawBid.ext.vasturl || rawBid.mtype == MEDIA_TYPES.Video) { + bid.width = bidRequest.video.w; + bid.height = bidRequest.video.h; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bid.mediaTypes = bidRequest.mediaTypes; + bid.ttl = isValidExpiry ? rawBid.exp : VIDEO_TIME_TO_LIVE; + } else if (parsedAdm && parsedAdm.native) { + bid.native = { + ortb: parsedAdm.native + }; + bid.width = rawBid.w ? rawBid.w : 1; + bid.height = rawBid.h ? rawBid.h : 1; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + bid.ttl = isValidExpiry ? rawBid.exp : NATIVE_TIME_TO_LIVE; + } else { + bid.ad = rawBid.adm; + bid.width = rawBid.w; + bid.height = rawBid.h; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + bid.ttl = isValidExpiry ? rawBid.exp : BANNER_TIME_TO_LIVE; + } + bid.meta = {}; + bid.meta.networkId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rawBid, 'ext.dspid'); + bid.meta.brandId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rawBid, 'ext.advbrandid'); + bid.meta.brandName = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rawBid, 'ext.advbrand'); + if (rawBid.adomain && rawBid.adomain.length > 0) { + bid.meta.advertiserDomains = rawBid.adomain; + } + if (rawBid.ext?.dsa) { + bid.meta.dsa = rawBid.ext.dsa; + } + if (rawBid.ext?.ibv) { + bid.ext = bid.ext || {}; + bid.ext.ibv = rawBid.ext.ibv; + } + return bid; +} + +/** + * Determines whether or not the given object is valid size format. + * + * @param {*} size The object to be validated. + * @return {boolean} True if this is a valid size format, and false otherwise. + */ +function isValidSize(size) { + return Array.isArray(size) && size.length === 2 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isInteger)(size[0]) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isInteger)(size[1]); +} + +/** + * Determines whether or not the given size object is an element of the size + * array. + * + * @param {Array} sizeArray The size array. + * @param {object} size The size object. + * @return {boolean} True if the size object is an element of the size array, and false + * otherwise. + */ +function includesSize() { + let sizeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + if (isValidSize(sizeArray)) { + return sizeArray[0] === size[0] && sizeArray[1] === size[1]; + } + for (let i = 0; i < sizeArray.length; i++) { + if (sizeArray[i][0] === size[0] && sizeArray[i][1] === size[1]) { + return true; + } + } + return false; +} + +/** + * Checks if all required video params are present + * @param {object} mediaTypeVideoRef Ad unit level mediaTypes object + * @param {object} paramsVideoRef IX bidder params level video object + * @returns {string[]} Are the required video params available + */ +function checkVideoParams(mediaTypeVideoRef, paramsVideoRef) { + const errorList = []; + if (!mediaTypeVideoRef) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('IX Bid Adapter: mediaTypes.video is the preferred location for video params in ad unit'); + } + for (let property of REQUIRED_VIDEO_PARAMS) { + const propInMediaType = mediaTypeVideoRef && mediaTypeVideoRef.hasOwnProperty(property); + const propInVideoRef = paramsVideoRef && paramsVideoRef.hasOwnProperty(property); + if (!propInMediaType && !propInVideoRef) { + errorList.push(`IX Bid Adapter: ${property} is not included in either the adunit or params level`); + } + } + + // check protocols/protocol + const protocolMediaType = mediaTypeVideoRef && mediaTypeVideoRef.hasOwnProperty('protocol'); + const protocolsMediaType = mediaTypeVideoRef && mediaTypeVideoRef.hasOwnProperty('protocols'); + const protocolVideoRef = paramsVideoRef && paramsVideoRef.hasOwnProperty('protocol'); + const protocolsVideoRef = paramsVideoRef && paramsVideoRef.hasOwnProperty('protocols'); + if (!(protocolMediaType || protocolsMediaType || protocolVideoRef || protocolsVideoRef)) { + errorList.push('IX Bid Adapter: protocol/protcols is not included in either the adunit or params level'); + } + return errorList; +} + +/** + * Get One size from Size Array + * [[250,350]] -> [250, 350] + * [250, 350] -> [250, 350] + * @param {Array} sizes array of sizes + */ +function getFirstSize() { + let sizes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + if (isValidSize(sizes)) { + return sizes; + } else if (isValidSize(sizes[0])) { + return sizes[0]; + } + return false; +} + +/** + * Determines whether or not the given bidFloor parameters are valid. + * + * @param {number} bidFloor The bidFloor parameter inside bid request config. + * @param {number} bidFloorCur The bidFloorCur parameter inside bid request config. + * @return {boolean} True if this is a valid bidFloor parameters format, and false + * otherwise. + */ +function isValidBidFloorParams(bidFloor, bidFloorCur) { + const curRegex = /^[A-Z]{3}$/; + return Boolean(typeof bidFloor === 'number' && typeof bidFloorCur === 'string' && bidFloorCur.match(curRegex)); +} +function nativeMediaTypeValid(bid) { + const nativeMediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.native'); + if (nativeMediaTypes === undefined) { + return true; + } + return bid.nativeOrtbRequest && Array.isArray(bid.nativeOrtbRequest.assets) && bid.nativeOrtbRequest.assets.length > 0; +} + +/** + * Get bid request object with the associated id. + * + * @param {*} id Id of the impression. + * @param {Array} impressions List of impressions sent in the request. + * @return {object} The impression with the associated id. + */ +function getBidRequest(id, impressions, validBidRequests) { + if (!id) { + return; + } + const bidRequest = { + ...(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.find)(validBidRequests, bid => bid.bidId === id), + ...(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.find)(impressions, imp => imp.id === id) + }; + return bidRequest; +} + +/** + * From the userIdAsEids array, filter for the ones our adserver can use, and modify them + * for our purposes, e.g. add rtiPartner + * @param {Array} allEids userIdAsEids passed in by prebid + * @return {object} contains toSend (eids to send to the adserver) and seenSources (used to filter + * identity info from IX Library) + */ +function getEidInfo(allEids) { + let toSend = []; + let seenSources = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(allEids)) { + for (const eid of allEids) { + const isSourceMapped = SOURCE_RTI_MAPPING.hasOwnProperty(eid.source); + const hasUids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eid, 'uids.0'); + if (hasUids) { + seenSources[eid.source] = true; + if (isSourceMapped && SOURCE_RTI_MAPPING[eid.source] !== '') { + eid.uids[0].ext = { + rtiPartner: SOURCE_RTI_MAPPING[eid.source] + }; + } + toSend.push(eid); + if (toSend.length >= MAX_EID_SOURCES) { + break; + } + } + } + } + return { + toSend, + seenSources + }; +} + +/** + * Builds a request object to be sent to the ad server based on bid requests. + * + * @param {Array} validBidRequests A list of valid bid request config objects. + * @param {object} bidderRequest An object containing other info like gdprConsent. + * @param {object} impressions An object containing a list of impression objects describing the bids for each transaction + * @param {Array} version Endpoint version denoting banner, video or native. + * @return {Array} List of objects describing the request to the server. + * + */ +function buildRequest(validBidRequests, bidderRequest, impressions, version) { + // Always use secure HTTPS protocol. + let baseUrl = SECURE_BID_URL; + // Get ids from Prebid User ID Modules + let eidInfo = getEidInfo((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests, '0.userIdAsEids')); + let userEids = eidInfo.toSend; + + // RTI ids will be included in the bid request if the function getIdentityInfo() is loaded + // and if the data for the partner exist + if (window.headertag && typeof window.headertag.getIdentityInfo === 'function') { + addRTI(userEids, eidInfo); + } + const requests = []; + let r = createRequest(validBidRequests); + + // Add FTs to be requested from Exchange + r = addRequestedFeatureToggles(r, FEATURE_TOGGLES.REQUESTED_FEATURE_TOGGLES); + + // getting ixdiags for adunits of the video, outstream & multi format (MF) style + const fledgeEnabled = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'paapi.enabled'); + let ixdiag = buildIXDiag(validBidRequests, fledgeEnabled); + for (let key in ixdiag) { + r.ext.ixdiag[key] = ixdiag[key]; + } + r = enrichRequest(r, bidderRequest, impressions, validBidRequests, userEids); + r = applyRegulations(r, bidderRequest); + let payload = {}; + if (validBidRequests[0].params.siteId) { + siteID = validBidRequests[0].params.siteId; + payload.s = siteID; + } + const impKeys = Object.keys(impressions); + let isFpdAdded = false; + for (let adUnitIndex = 0; adUnitIndex < impKeys.length; adUnitIndex++) { + if (requests.length >= MAX_REQUEST_LIMIT) { + break; + } + r = addImpressions(impressions, impKeys, r, adUnitIndex); + const fpd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2') || {}; + const site = { + ...(fpd.site || fpd.context) + }; + + // update page URL with IX FPD KVs if they exist + site.page = getIxFirstPartyDataPageUrl(bidderRequest); + const user = { + ...fpd.user + }; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(fpd) && !isFpdAdded) { + r = addFPD(bidderRequest, r, fpd, site, user); + r.site = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, r.site, site); + r.user = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, r.user, user); + isFpdAdded = true; + } + + // add identifiers info to ixDiag + r = addIdentifiersInfo(impressions, r, impKeys, adUnitIndex, payload, baseUrl); + const isLastAdUnit = adUnitIndex === impKeys.length - 1; + r = addDeviceInfo(r); + r = deduplicateImpExtFields(r); + r = removeSiteIDs(r); + if (isLastAdUnit) { + let exchangeUrl = `${baseUrl}?`; + if (siteID !== 0) { + exchangeUrl += `s=${siteID}`; + } + if (isExchangeIdConfigured()) { + exchangeUrl += siteID !== 0 ? '&' : ''; + exchangeUrl += `p=${_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('exchangeId')}`; + } + requests.push({ + method: 'POST', + url: exchangeUrl, + data: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(r), + options: { + contentType: 'text/plain', + withCredentials: true + }, + validBidRequests + }); + r.imp = []; + isFpdAdded = false; + } + } + return requests; +} + +/** + * addRTI adds RTI info of the partner to retrieved user IDs from prebid ID module. + * + * @param {Array} userEids userEids info retrieved from prebid + * @param {Array} eidInfo eidInfo info from prebid + */ +function addRTI(userEids, eidInfo) { + let identityInfo = window.headertag.getIdentityInfo(); + if (identityInfo && typeof identityInfo === 'object') { + for (const partnerName in identityInfo) { + if (userEids.length >= MAX_EID_SOURCES) { + return; + } + if (identityInfo.hasOwnProperty(partnerName)) { + let response = identityInfo[partnerName]; + if (!response.responsePending && response.data && typeof response.data === 'object' && Object.keys(response.data).length && !eidInfo.seenSources[response.data.source]) { + userEids.push(response.data); + } + } + } + } +} + +/** + * createRequest creates the base request object + * @param {Array} validBidRequests A list of valid bid request config objects. + * @return {object} Object describing the request to the server. + */ +function createRequest(validBidRequests) { + const r = {}; + // Since bidderRequestId are the same for different bid request, just use the first one. + r.id = validBidRequests[0].bidderRequestId.toString(); + r.site = {}; + r.ext = {}; + r.ext.source = 'prebid'; + r.ext.ixdiag = {}; + r.ext.ixdiag.ls = storage.localStorageIsEnabled(); + r.imp = []; + r.at = 1; + return r; +} + +/** + * Adds requested feature toggles to the provided request object to be sent to Exchange. + * @param {object} r - The request object to add feature toggles to. + * @param {Array} requestedFeatureToggles - The list of feature toggles to add. + * @returns {object} The updated request object with the added feature toggles. + */ +function addRequestedFeatureToggles(r, requestedFeatureToggles) { + if (requestedFeatureToggles.length > 0) { + r.ext.features = {}; + // Loop through each feature toggle and add it to the features object. + // Add current activation status as well. + requestedFeatureToggles.forEach(toggle => { + r.ext.features[toggle] = { + activated: FEATURE_TOGGLES.isFeatureEnabled(toggle) + }; + }); + } + return r; +} + +/** + * enrichRequest adds userSync configs, source, and referer info to request and ixDiag objects. + * + * @param {object} r Base reuqest object. + * @param {object} bidderRequest An object containing other info like gdprConsent. + * @param {Array} impressions A list of impressions to be added to the request. + * @param {Array} validBidRequests A list of valid bid request config objects. + * @param {Array} userEids User ID info retrieved from Prebid ID module. + * @return {object} Enriched object describing the request to the server. + */ +function enrichRequest(r, bidderRequest, impressions, validBidRequests, userEids) { + const tmax = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'timeout'); + if (tmax) { + r.ext.ixdiag.tmax = tmax; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('userSync')) { + r.ext.ixdiag.syncsPerBidder = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('userSync').syncsPerBidder; + } + + // Add number of available imps to ixDiag. + r.ext.ixdiag.imps = Object.keys(impressions).length; + + // set source.tid to auctionId for outgoing request to Exchange. + r.source = { + tid: bidderRequest?.ortb2?.source?.tid + }; + + // if an schain is provided, send it along + if (validBidRequests[0].schain) { + r.source.ext = {}; + r.source.ext.schain = validBidRequests[0].schain; + } + if (userEids.length > 0) { + r.user = {}; + r.user.eids = userEids; + } + if (document.referrer && document.referrer !== '') { + r.site.ref = document.referrer; + } + return r; +} + +/** + * applyRegulations applies regulation info such as GDPR and GPP to the reqeust obejct. + * + * @param {object} r Base reuqest object. + * @param {object} bidderRequest An object containing other info like gdprConsent. + * @return {object} Object enriched with regulation info describing the request to the server. + */ +function applyRegulations(r, bidderRequest) { + // Apply GDPR information to the request if GDPR is enabled. + if (bidderRequest) { + if (bidderRequest.gdprConsent) { + gdprConsent = bidderRequest.gdprConsent; + if (gdprConsent.hasOwnProperty('gdprApplies')) { + r.regs = { + ext: { + gdpr: gdprConsent.gdprApplies ? 1 : 0 + } + }; + } + if (gdprConsent.hasOwnProperty('consentString')) { + r.user = r.user || {}; + r.user.ext = { + consent: gdprConsent.consentString || '' + }; + if (gdprConsent.hasOwnProperty('addtlConsent') && gdprConsent.addtlConsent) { + r.user.ext.consented_providers_settings = { + addtl_consent: gdprConsent.addtlConsent + }; + } + } + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.ext.us_privacy', bidderRequest.uspConsent); + usPrivacy = bidderRequest.uspConsent; + } + const pageUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page'); + if (pageUrl) { + r.site.page = pageUrl; + } + if (bidderRequest.gppConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections); + } + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('coppa')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.coppa', 1); + } + return r; +} + +/** + * addImpressions adds impressions to request object + * + * @param {Array} impressions List of impressions to be added to the request. + * @param {Array} impKeys List of impression keys. + * @param {object} r Reuqest object. + * @param {number} adUnitIndex Index of the current add unit + * @return {object} Reqyest object with added impressions describing the request to the server. + */ +function addImpressions(impressions, impKeys, r, adUnitIndex) { + const adUnitImpressions = impressions[impKeys[adUnitIndex]]; + const { + missingImps: missingBannerImpressions = [], + ixImps = [] + } = adUnitImpressions; + const sourceImpressions = { + ixImps, + missingBannerImpressions + }; + const impressionObjects = Object.keys(sourceImpressions).map(key => sourceImpressions[key]).filter(item => Array.isArray(item)).reduce((acc, curr) => acc.concat(...curr), []); + const gpid = impressions[impKeys[adUnitIndex]].gpid; + const dfpAdUnitCode = impressions[impKeys[adUnitIndex]].dfp_ad_unit_code; + const tid = impressions[impKeys[adUnitIndex]].tid; + const sid = impressions[impKeys[adUnitIndex]].sid; + const auctionEnvironment = impressions[impKeys[adUnitIndex]].ae; + const paapi = impressions[impKeys[adUnitIndex]].paapi; + const bannerImpressions = impressionObjects.filter(impression => _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER in impression); + const otherImpressions = impressionObjects.filter(impression => !(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER in impression)); + if (bannerImpressions.length > 0) { + const bannerImpsKeyed = bannerImpressions.reduce((acc, bannerImp) => { + if (!acc[bannerImp.adunitCode]) { + acc[bannerImp.adunitCode] = []; + } + acc[bannerImp.adunitCode].push(bannerImp); + return acc; + }, {}); + for (const impId in bannerImpsKeyed) { + const bannerImps = bannerImpsKeyed[impId]; + const { + id, + banner: { + topframe + } + } = bannerImps[0]; + let externalID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bannerImps[0], 'ext.externalID'); + const _bannerImpression = { + id, + banner: { + topframe, + format: bannerImps.map(_ref => { + let { + banner: { + w, + h + }, + ext + } = _ref; + return { + w, + h, + ext + }; + }) + } + }; + for (let i = 0; i < _bannerImpression.banner.format.length; i++) { + // We add sid and externalID in imp.ext therefore, remove from banner.format[].ext + if (_bannerImpression.banner.format[i].ext != null) { + if (_bannerImpression.banner.format[i].ext.sid != null) { + delete _bannerImpression.banner.format[i].ext.sid; + } + if (_bannerImpression.banner.format[i].ext.externalID != null) { + delete _bannerImpression.banner.format[i].ext.externalID; + } + } + + // add floor per size + if ('bidfloor' in bannerImps[i]) { + _bannerImpression.banner.format[i].ext.bidfloor = bannerImps[i].bidfloor; + } + if (JSON.stringify(_bannerImpression.banner.format[i].ext) === '{}') { + delete _bannerImpression.banner.format[i].ext; + } + } + const position = impressions[impKeys[adUnitIndex]].pos; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isInteger)(position)) { + _bannerImpression.banner.pos = position; + } + if (dfpAdUnitCode || gpid || tid || sid || auctionEnvironment || externalID || paapi) { + _bannerImpression.ext = {}; + _bannerImpression.ext.dfp_ad_unit_code = dfpAdUnitCode; + _bannerImpression.ext.gpid = gpid; + _bannerImpression.ext.tid = tid; + _bannerImpression.ext.sid = sid; + _bannerImpression.ext.externalID = externalID; + + // enable fledge auction + if (auctionEnvironment == 1) { + _bannerImpression.ext.ae = 1; + _bannerImpression.ext.paapi = paapi; + } + } + if ('bidfloor' in bannerImps[0]) { + _bannerImpression.bidfloor = bannerImps[0].bidfloor; + } + if ('bidfloorcur' in bannerImps[0]) { + _bannerImpression.bidfloorcur = bannerImps[0].bidfloorcur; + } + const adUnitFPD = impressions[impKeys[adUnitIndex]].adUnitFPD; + if (adUnitFPD) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(_bannerImpression, 'ext.data', adUnitFPD); + } + r.imp.push(_bannerImpression); + } + } + if (otherImpressions.length > 0) { + // Creates multiformat imp if they have the same ID + // if not same ID, just add the imp to the imp array + // Removes imp.ext.bidfloor + // Sets imp.ext.siteID to one of the other [video/native].ext.siteid if imp.ext.siteID doesnt exist + otherImpressions.forEach(imp => { + if (gpid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.gpid', gpid); + } + if (r.imp.length > 0) { + let matchFound = false; + r.imp.forEach((rImp, index) => { + if (imp.id === rImp.id && _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO in imp) { + rImp.video = imp.video; + rImp.video.ext = Object.assign({}, imp.video.ext, imp.ext); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rImp, 'video.ext.bidfloor', false) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rImp, 'bidfloor', false)) { + if (rImp.video.ext.bidfloor < rImp.bidfloor) { + rImp.bidfloor = rImp.video.ext.bidfloor; + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rImp, 'ext.siteID', false) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(imp, 'video.ext.siteID')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(rImp, 'ext.siteID', imp.video.ext.siteID); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'ext.ixdiag.usid', true); + } + matchFound = true; + } else if (imp.id === rImp.id && _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE in imp) { + rImp.native = imp.native; + rImp.native.ext = Object.assign({}, imp.native.ext, imp.ext); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rImp, 'native.ext.bidfloor', false) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rImp, 'bidfloor', false)) { + if (rImp.native.ext.bidfloor < rImp.bidfloor) { + rImp.bidfloor = rImp.native.ext.bidfloor; + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(rImp, 'ext.siteID', false) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(imp, 'native.ext.siteID', false)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(rImp, 'ext.siteID', imp.native.ext.siteID); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'ext.ixdiag.usid', true); + } + matchFound = true; + } + }); + if (!matchFound) { + r.imp.push(imp); + } + } else { + r.imp.push(imp); + } + }); + } + return r; +} + +/** +This function retrieves the page URL and appends first party data query parameters +to it without adding duplicate query parameters. Returns original referer URL if no IX FPD exists. +@param {Object} bidderRequest - The bidder request object containing information about the bid and the page. +@returns {string} - The modified page URL with first party data query parameters appended. + */ +function getIxFirstPartyDataPageUrl(bidderRequest) { + // Parse additional runtime configs. + const bidderCode = bidderRequest && bidderRequest.bidderCode || 'ix'; + const otherIxConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig(bidderCode); + let pageUrl = ''; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.site.page')) { + pageUrl = bidderRequest.ortb2.site.page; + } else { + pageUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page'); + } + if (otherIxConfig) { + // Append firstPartyData to r.site.page if firstPartyData exists. + if (typeof otherIxConfig.firstPartyData === 'object') { + const firstPartyData = otherIxConfig.firstPartyData; + return appendIXQueryParams(bidderRequest, pageUrl, firstPartyData); + } + } + return pageUrl; +} + +/** +This function appends the provided query parameters to the given URL without adding duplicate query parameters. +@param {Object} bidderRequest - The bidder request object containing information about the bid and the page to be used as fallback in case url is not valid. +@param {string} url - The base URL to which query parameters will be appended. +@param {Object} params - An object containing key-value pairs of query parameters to append. +@returns {string} - The modified URL with the provided query parameters appended. + */ +function appendIXQueryParams(bidderRequest, url, params) { + let urlObj; + try { + urlObj = new URL(url); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`IX Bid Adapter: Invalid URL set in ortb2.site.page: ${url}. Using referer URL instead.`); + urlObj = new URL((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page')); + } + const searchParams = new URLSearchParams(urlObj.search); + + // Loop through the provided query parameters and append them + for (const [key, value] of Object.entries(params)) { + if (!searchParams.has(key)) { + searchParams.append(key, value); + } + } + + // Construct the final URL with the updated query parameters + urlObj.search = searchParams.toString(); + return urlObj.toString(); +} + +/** + * addFPD adds ortb2 first party data to request object. + * + * @param {object} bidderRequest An object containing other info like gdprConsent. + * @param {object} r Reuqest object. + * @param {object} fpd ortb2 first party data. + * @param {object} site First party site data. + * @param {object} user First party user data. + * @return {object} Reqyest object with added FPD describing the request to the server. + */ +function addFPD(bidderRequest, r, fpd, site, user) { + r.ext.ixdiag.fpd = true; + Object.keys(site).forEach(key => { + if (FIRST_PARTY_DATA.SITE.indexOf(key) === -1) { + delete site[key]; + } + }); + Object.keys(user).forEach(key => { + if (FIRST_PARTY_DATA.USER.indexOf(key) === -1) { + delete user[key]; + } + }); + if (fpd.device) { + const sua = { + ...fpd.device.sua + }; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(sua)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'device.sua', sua); + } + const ip = fpd.device.ip; + if (ip) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'device.ip', ip); + } + const ipv6 = fpd.device.ipv6; + if (ipv6) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'device.ipv6', ipv6); + } + } + + // regulations from ortb2 + if (fpd.hasOwnProperty('regs') && !bidderRequest.gppConsent) { + if (fpd.regs.hasOwnProperty('gpp') && typeof fpd.regs.gpp == 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.gpp', fpd.regs.gpp); + } + if (fpd.regs.hasOwnProperty('gpp_sid') && Array.isArray(fpd.regs.gpp_sid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.gpp_sid', fpd.regs.gpp_sid); + } + if (fpd.regs.ext?.dsa) { + const pubDsaObj = fpd.regs.ext.dsa; + const dsaObj = {}; + ['dsarequired', 'pubrender', 'datatopub'].forEach(dsaKey => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(pubDsaObj[dsaKey])) { + dsaObj[dsaKey] = pubDsaObj[dsaKey]; + } + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(pubDsaObj.transparency)) { + const tpData = []; + pubDsaObj.transparency.forEach(tpObj => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(tpObj) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(tpObj.domain) && tpObj.domain != '' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(tpObj.dsaparams) && tpObj.dsaparams.every(v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(v))) { + tpData.push(tpObj); + } + }); + if (tpData.length > 0) { + dsaObj.transparency = tpData; + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(dsaObj)) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'regs.ext.dsa', dsaObj); + } + } + return r; +} + +/** + * Adds First-Party Data (FPD) from the bid object to the imp object. + * + * @param {Object} imp - The imp object, representing an impression in the OpenRTB format. + * @param {Object} bid - The bid object, containing information about the bid request. + */ +function addAdUnitFPD(imp, bid) { + const adUnitFPD = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.data'); + if (adUnitFPD) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, 'ext.data', adUnitFPD); + } +} + +/** + * addIdentifiersInfo adds indentifier info to ixDaig. + * + * @param {Array} impressions List of impressions to be added to the request. + * @param {object} r Reuqest object. + * @param {Array} impKeys List of impression keys. + * @param {number} adUnitIndex Index of the current add unit + * @param {object} payload Request payload object. + * @param {string} baseUrl Base exchagne URL. + * @return {object} Reqyest object with added indentigfier info to ixDiag. + */ +function addIdentifiersInfo(impressions, r, impKeys, adUnitIndex, payload, baseUrl) { + const pbaAdSlot = impressions[impKeys[adUnitIndex]].pbadslot; + const tagId = impressions[impKeys[adUnitIndex]].tagId; + const adUnitCode = impressions[impKeys[adUnitIndex]].adUnitCode; + const divId = impressions[impKeys[adUnitIndex]].divId; + if (pbaAdSlot || tagId || adUnitCode || divId) { + r.ext.ixdiag.pbadslot = pbaAdSlot; + r.ext.ixdiag.tagid = tagId; + r.ext.ixdiag.adunitcode = adUnitCode; + r.ext.ixdiag.divId = divId; + } + return r; +} + +/** + * Return an object of user IDs stored by Prebid User ID module + * + * @returns {Array} ID providers that are present in userIds + */ +function _getUserIds(bidRequest) { + const userIds = bidRequest.userId || {}; + return PROVIDERS.filter(provider => userIds[provider]); +} + +/** + * Calculates IX diagnostics values and packages them into an object + * + * @param {Array} validBidRequests - The valid bid requests from prebid + * @param {boolean} fledgeEnabled - Flag indicating if protected audience (fledge) is enabled + * @return {Object} IX diag values for ad units + */ +function buildIXDiag(validBidRequests, fledgeEnabled) { + var adUnitMap = validBidRequests.map(bidRequest => bidRequest.adUnitCode).filter((value, index, arr) => arr.indexOf(value) === index); + let allEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests, '0.userIdAsEids', []); + let ixdiag = { + mfu: 0, + bu: 0, + iu: 0, + nu: 0, + ou: 0, + allu: 0, + ren: false, + version: "9.45.0-pre", + userIds: _getUserIds(validBidRequests[0]), + url: window.location.href.split('?')[0], + vpd: defaultVideoPlacement, + ae: fledgeEnabled, + eidLength: allEids.length + }; + + // create ad unit map and collect the required diag properties + for (let adUnit of adUnitMap) { + let bid = validBidRequests.filter(bidRequest => bidRequest.adUnitCode === adUnit)[0]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes')) { + if (Object.keys(bid.mediaTypes).length > 1) { + ixdiag.mfu++; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.native')) { + ixdiag.nu++; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner')) { + ixdiag.bu++; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context') === 'outstream') { + ixdiag.ou++; + if (isIndexRendererPreferred(bid)) { + ixdiag.ren = true; + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context') === 'instream') { + ixdiag.iu++; + } + ixdiag.allu++; + } + } + return ixdiag; +} + +/** + * + * @param {Array} bannerSizeList list of banner sizes + * @param {Array} bannerSize the size to be removed + * @return {boolean} true if successfully removed, false if not found + */ + +function removeFromSizes(bannerSizeList, bannerSize) { + if (!bannerSize) return; + for (let i = 0; i < bannerSizeList.length; i++) { + const size = bannerSizeList[i]; + if (bannerSize[0] === size[0] && bannerSize[1] === size[1]) { + bannerSizeList.splice(i, 1); + break; + } + } +} + +/** + * Creates IX Native impressions based on validBidRequests + * @param {object} validBidRequest valid request provided by prebid + * @param {object} nativeImps reference to created native impressions + */ +function createNativeImps(validBidRequest, nativeImps) { + const imp = bidToNativeImp(validBidRequest); + if (Object.keys(imp).length != 0) { + nativeImps[validBidRequest.adUnitCode] = {}; + nativeImps[validBidRequest.adUnitCode].ixImps = []; + nativeImps[validBidRequest.adUnitCode].ixImps.push(imp); + nativeImps[validBidRequest.adUnitCode].gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.gpid'); + nativeImps[validBidRequest.adUnitCode].dfp_ad_unit_code = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot'); + nativeImps[validBidRequest.adUnitCode].pbadslot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data.pbadslot'); + nativeImps[validBidRequest.adUnitCode].tagId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'params.tagId'); + const adUnitCode = validBidRequest.adUnitCode; + const divId = document.getElementById(adUnitCode) ? adUnitCode : (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__.getGptSlotInfoForAdUnitCode)(adUnitCode).divId; + nativeImps[validBidRequest.adUnitCode].adUnitCode = adUnitCode; + nativeImps[validBidRequest.adUnitCode].divId = divId; + } +} + +/** + * Creates IX Video impressions based on validBidRequests + * @param {object} validBidRequest valid request provided by prebid + * @param {object} videoImps reference to created video impressions + */ +function createVideoImps(validBidRequest, videoImps) { + const imp = bidToVideoImp(validBidRequest); + if (Object.keys(imp).length != 0) { + videoImps[validBidRequest.adUnitCode] = {}; + videoImps[validBidRequest.adUnitCode].ixImps = []; + videoImps[validBidRequest.adUnitCode].ixImps.push(imp); + videoImps[validBidRequest.adUnitCode].gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.gpid'); + videoImps[validBidRequest.adUnitCode].dfp_ad_unit_code = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot'); + videoImps[validBidRequest.adUnitCode].pbadslot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data.pbadslot'); + videoImps[validBidRequest.adUnitCode].tagId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'params.tagId'); + const adUnitCode = validBidRequest.adUnitCode; + const divId = document.getElementById(adUnitCode) ? adUnitCode : (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__.getGptSlotInfoForAdUnitCode)(adUnitCode).divId; + videoImps[validBidRequest.adUnitCode].adUnitCode = adUnitCode; + videoImps[validBidRequest.adUnitCode].divId = divId; + } +} + +/** + * Creates IX banner impressions based on validBidRequests + * @param {object} validBidRequest valid request provided by prebid + * @param {object} missingBannerSizes reference to missing banner config sizes + * @param {object} bannerImps reference to created banner impressions + */ +function createBannerImps(validBidRequest, missingBannerSizes, bannerImps, bidderRequest) { + let imp = bidToBannerImp(validBidRequest); + const bannerSizeDefined = includesSize((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'mediaTypes.banner.sizes'), (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'params.size')); + if (!bannerImps.hasOwnProperty(validBidRequest.adUnitCode)) { + bannerImps[validBidRequest.adUnitCode] = {}; + } + bannerImps[validBidRequest.adUnitCode].gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.gpid'); + bannerImps[validBidRequest.adUnitCode].dfp_ad_unit_code = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data.adserver.adslot'); + bannerImps[validBidRequest.adUnitCode].tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.tid'); + bannerImps[validBidRequest.adUnitCode].pbadslot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data.pbadslot'); + bannerImps[validBidRequest.adUnitCode].tagId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'params.tagId'); + bannerImps[validBidRequest.adUnitCode].pos = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'mediaTypes.banner.pos'); + + // Add Fledge flag if enabled + const fledgeEnabled = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'paapi.enabled'); + if (fledgeEnabled) { + const auctionEnvironment = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.ae'); + const paapi = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.paapi'); + if (paapi) { + bannerImps[validBidRequest.adUnitCode].paapi = paapi; + } + if (auctionEnvironment) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isInteger)(auctionEnvironment)) { + bannerImps[validBidRequest.adUnitCode].ae = auctionEnvironment; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('error setting auction environment flag - must be an integer'); + } + } + } + + // AdUnit-Specific First Party Data + const adUnitFPD = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'ortb2Imp.ext.data'); + if (adUnitFPD) { + bannerImps[validBidRequest.adUnitCode].adUnitFPD = adUnitFPD; + } + const sid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'params.id'); + if (sid && (typeof sid === 'string' || typeof sid === 'number')) { + bannerImps[validBidRequest.adUnitCode].sid = String(sid); + } + const adUnitCode = validBidRequest.adUnitCode; + const divId = document.getElementById(adUnitCode) ? adUnitCode : (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__.getGptSlotInfoForAdUnitCode)(adUnitCode).divId; + bannerImps[validBidRequest.adUnitCode].adUnitCode = adUnitCode; + bannerImps[validBidRequest.adUnitCode].divId = divId; + + // Create IX imps from params.size + if (bannerSizeDefined) { + if (!bannerImps[validBidRequest.adUnitCode].hasOwnProperty('ixImps')) { + bannerImps[validBidRequest.adUnitCode].ixImps = []; + } + bannerImps[validBidRequest.adUnitCode].ixImps.push(imp); + } + updateMissingSizes(validBidRequest, missingBannerSizes, imp); +} + +/** + * Updates the Object to track missing banner sizes. + * + * @param {object} validBidRequest The bid request for an ad unit's with a configured size. + * @param {object} missingBannerSizes The object containing missing banner sizes + * @param {object} imp The impression for the bidrequest + */ +function updateMissingSizes(validBidRequest, missingBannerSizes, imp) { + if (missingBannerSizes.hasOwnProperty(validBidRequest.adUnitCode)) { + let currentSizeList = []; + if (missingBannerSizes[validBidRequest.adUnitCode].hasOwnProperty('missingSizes')) { + currentSizeList = missingBannerSizes[validBidRequest.adUnitCode].missingSizes; + } + removeFromSizes(currentSizeList, validBidRequest.params.size); + missingBannerSizes[validBidRequest.adUnitCode].missingSizes = currentSizeList; + } else { + // New Ad Unit + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'mediaTypes.banner.sizes')) { + let sizeList = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(validBidRequest.mediaTypes.banner.sizes); + removeFromSizes(sizeList, validBidRequest.params.size); + let newAdUnitEntry = { + 'missingSizes': sizeList, + 'impression': imp + }; + missingBannerSizes[validBidRequest.adUnitCode] = newAdUnitEntry; + } + } +} + +/** + * @param {object} bid ValidBidRequest object, used to adjust floor + * @param {object} imp Impression object to be modified + * @param {Array} newSize The new size to be applied + * @return {object} newImp Updated impression object + */ +function createMissingBannerImp(bid, imp, newSize) { + const newImp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(imp); + newImp.banner.w = newSize[0]; + newImp.banner.h = newSize[1]; + _applyFloor(bid, newImp, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + return newImp; +} + +/** + * + * Initialize IX Outstream Renderer + * @param {Object} bid + */ +function outstreamRenderer(bid) { + bid.renderer.push(function () { + const adUnitCode = bid.adUnitCode; + const divId = document.getElementById(adUnitCode) ? adUnitCode : (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__.getGptSlotInfoForAdUnitCode)(adUnitCode).divId; + if (!divId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`IX Bid Adapter: adUnitCode: ${divId} not found on page.`); + return; + } + window.createIXPlayer(divId, bid); + }); +} + +/** + * Create Outstream Renderer + * @param {string} id + * @returns {Renderer} + */ +function createRenderer(id, renderUrl) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_9__.Renderer.install({ + id: id, + url: renderUrl, + loaded: false + }); + try { + renderer.setRender(outstreamRenderer); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Prebid Error calling setRender on renderer', err); + return null; + } + if (!renderUrl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Outstream renderer URL not found'); + return null; + } + return renderer; +} + +/** + * Returns whether our renderer could potentially be used. + * @param {*} bid bid object + */ +function isIndexRendererPreferred(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context') !== 'outstream') { + return false; + } + + // ad unit renderer could be on the adUnit.mediaTypes.video level or adUnit level + let renderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.renderer'); + if (!renderer) { + renderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'renderer'); + } + const isValid = !!(typeof renderer === 'object' && renderer.url && renderer.render); + + // if renderer on the adunit is not valid or it's only a backup, our renderer may be used + return !isValid || renderer.backupOnly; +} +function isExchangeIdConfigured() { + let exchangeId = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('exchangeId'); + if (typeof exchangeId === 'number' && isFinite(exchangeId)) { + return true; + } + if (typeof exchangeId === 'string' && exchangeId.trim() !== '' && isFinite(Number(exchangeId))) { + return true; + } + return false; +} +const spec = { + code: BIDDER_CODE, + gvlid: GLOBAL_VENDOR_ID, + supportedMediaTypes: SUPPORTED_AD_TYPES, + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + const paramsVideoRef = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video'); + const paramsSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.size'); + const mediaTypeBannerSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes'); + const mediaTypeVideoRef = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); + const mediaTypeVideoPlayerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.playerSize'); + const hasBidFloor = bid.params.hasOwnProperty('bidFloor'); + const hasBidFloorCur = bid.params.hasOwnProperty('bidFloorCur'); + if (bid.hasOwnProperty('mediaType') && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.contains)(SUPPORTED_AD_TYPES, bid.mediaType)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('IX Bid Adapter: media type is not supported.'); + return false; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner') && !mediaTypeBannerSizes) { + return false; + } + if (paramsSize) { + // since there is an ix bidder level size, make sure its valid + const ixSize = getFirstSize(paramsSize); + if (!ixSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IX Bid Adapter: size has invalid format.'); + return false; + } + // check if the ix bidder level size, is present in ad unit level + if (!includesSize(bid.sizes, ixSize) && !includesSize(mediaTypeVideoPlayerSize, ixSize) && !includesSize(mediaTypeBannerSizes, ixSize)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IX Bid Adapter: bid size is not included in ad unit sizes or player size.'); + return false; + } + } + if (!isExchangeIdConfigured() && bid.params.siteId == undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IX Bid Adapter: Invalid configuration - either siteId or exchangeId must be configured.'); + return false; + } + if (bid.params.siteId !== undefined) { + if (typeof bid.params.siteId !== 'string' && typeof bid.params.siteId !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IX Bid Adapter: siteId must be string or number type.'); + return false; + } + if (typeof bid.params.siteId !== 'string' && isNaN(Number(bid.params.siteId))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IX Bid Adapter: siteId must valid value'); + return false; + } + } + if (hasBidFloor || hasBidFloorCur) { + if (!(hasBidFloor && hasBidFloorCur && isValidBidFloorParams(bid.params.bidFloor, bid.params.bidFloorCur))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('IX Bid Adapter: bidFloor / bidFloorCur parameter has invalid format.'); + return false; + } + } + if (mediaTypeVideoRef && paramsVideoRef) { + const videoImp = bidToVideoImp(bid).video; + const errorList = checkVideoParams(mediaTypeVideoRef, paramsVideoRef); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context') === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM && isIndexRendererPreferred(bid) && videoImp) { + const outstreamPlayerSize = [(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(videoImp, 'w'), (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(videoImp, 'h')]; + const isValidSize = outstreamPlayerSize[0] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[0] && outstreamPlayerSize[1] >= OUTSTREAM_MINIMUM_PLAYER_SIZE[1]; + if (!isValidSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`IX Bid Adapter: ${outstreamPlayerSize} is an invalid size for IX outstream renderer`); + return false; + } + } + if (errorList.length) { + errorList.forEach(err => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(err); + }); + return false; + } + } + return nativeMediaTypeValid(bid); + }, + // For testing only - resets the siteID to 0 so that it can be set again + resetSiteID: function () { + siteID = 0; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests A list of valid bid request config objects. + * @param {object} bidderRequest A object contains bids and other info like gdprConsent. + * @return {object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const reqs = []; // Stores banner + video requests + const bannerImps = {}; // Stores created banner impressions + const videoImps = {}; // Stores created video impressions + const nativeImps = {}; // Stores created native impressions + const missingBannerSizes = {}; // To capture the missing sizes i.e not configured for ix + FEATURE_TOGGLES.getFeatureToggles(); + + // Step 1: Create impresssions from IX params + validBidRequests.forEach(validBidRequest => { + const adUnitMediaTypes = Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest, 'mediaTypes', {})); + for (const type in adUnitMediaTypes) { + switch (adUnitMediaTypes[type]) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + createBannerImps(validBidRequest, missingBannerSizes, bannerImps, bidderRequest); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + createVideoImps(validBidRequest, videoImps); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + createNativeImps(validBidRequest, nativeImps); + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`IX Bid Adapter: ad unit mediaTypes ${type} is not supported`); + } + } + }); + + // Step 2: Update banner impressions with missing sizes + for (let adunitCode in missingBannerSizes) { + if (missingBannerSizes.hasOwnProperty(adunitCode)) { + let missingSizes = missingBannerSizes[adunitCode].missingSizes; + if (!bannerImps.hasOwnProperty(adunitCode)) { + bannerImps[adunitCode] = {}; + } + if (!bannerImps[adunitCode].hasOwnProperty('missingImps')) { + bannerImps[adunitCode].missingImps = []; + bannerImps[adunitCode].missingCount = 0; + } + let origImp = missingBannerSizes[adunitCode].impression; + for (let i = 0; i < missingSizes.length; i++) { + let newImp = createMissingBannerImp(validBidRequests[0], origImp, missingSizes[i]); + bannerImps[adunitCode].missingImps.push(newImp); + bannerImps[adunitCode].missingCount++; + } + } + } + + // Step 3: Build banner, video & native requests + let allImps = []; + if (Object.keys(bannerImps).length > 0) { + allImps.push(bannerImps); + } + if (Object.keys(videoImps).length > 0) { + allImps.push(videoImps); + } + if (Object.keys(nativeImps).length > 0) { + allImps.push(nativeImps); + } + if (FEATURE_TOGGLES.isFeatureEnabled('pbjs_enable_multiformat')) { + reqs.push(...buildRequest(validBidRequests, bidderRequest, combineImps(allImps))); + } else { + if (Object.keys(bannerImps).length > 0) { + reqs.push(...buildRequest(validBidRequests, bidderRequest, bannerImps, BANNER_ENDPOINT_VERSION)); + } + if (Object.keys(videoImps).length > 0) { + reqs.push(...buildRequest(validBidRequests, bidderRequest, videoImps, VIDEO_ENDPOINT_VERSION)); + } + if (Object.keys(nativeImps).length > 0) { + reqs.push(...buildRequest(validBidRequests, bidderRequest, nativeImps)); + } + } + return reqs; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {object} serverResponse A successful response from the server. + * @param {object} bidderRequest The bid request sent to the server. + * @return {Array} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidderRequest) { + const bids = []; + let bid = null; + + // Extract the FLEDGE auction configuration list from the response + let fledgeAuctionConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(serverResponse, 'body.ext.protectedAudienceAuctionConfigs') || []; + FEATURE_TOGGLES.setFeatureToggles(serverResponse); + if (!serverResponse.hasOwnProperty('body')) { + return bids; + } + const responseBody = serverResponse.body; + const seatbid = responseBody.seatbid || []; + for (let i = 0; i < seatbid.length; i++) { + if (!seatbid[i].hasOwnProperty('bid')) { + continue; + } + + // Transform rawBid in bid response to the format that will be accepted by prebid. + const innerBids = seatbid[i].bid; + const requestBid = bidderRequest.data; + for (let j = 0; j < innerBids.length; j++) { + const bidRequest = getBidRequest(innerBids[j].impid, requestBid.imp, bidderRequest.validBidRequests); + bid = parseBid(innerBids[j], responseBody.cur, bidRequest); + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && isIndexRendererPreferred(bidRequest)) { + const renderUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(responseBody, 'ext.videoplayerurl'); + bid.renderer = createRenderer(innerBids[j].bidId, renderUrl); + if (!bid.renderer) { + continue; + } + } + bids.push(bid); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(requestBid, 'ext.ixdiag.err')) { + if (storage.localStorageIsEnabled()) { + try { + storage.removeDataFromLocalStorage(LOCAL_STORAGE_KEY); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('ix can not clear ixdiag from localStorage.'); + } + } + } + } + if (Array.isArray(fledgeAuctionConfigs) && fledgeAuctionConfigs.length > 0) { + // Validate and filter fledgeAuctionConfigs + fledgeAuctionConfigs = fledgeAuctionConfigs.filter(config => { + if (!isValidAuctionConfig(config)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Malformed auction config detected:', config); + return false; + } + return true; + }); + try { + return { + bids, + paapi: fledgeAuctionConfigs + }; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Error attaching AuctionConfigs', error); + return bids; + } + } else { + return bids; + } + }, + /** + * Determine which user syncs should occur + * @param {object} syncOptions + * @param {Array} serverResponses + * @returns {Array} User sync pixels + */ + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + let publisherSyncsPerBidderOverride = null; + if (serverResponses.length > 0) { + publisherSyncsPerBidderOverride = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(serverResponses[0], 'body.ext.publishersyncsperbidderoverride'); + } + if (publisherSyncsPerBidderOverride !== undefined && publisherSyncsPerBidderOverride == 0) { + return []; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: IFRAME_USER_SYNC_URL + }); + } else { + let publisherSyncsPerBidder = null; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('userSync')) { + publisherSyncsPerBidder = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('userSync').syncsPerBidder; + } + if (publisherSyncsPerBidder === 0) { + publisherSyncsPerBidder = publisherSyncsPerBidderOverride; + } + if (publisherSyncsPerBidderOverride && (publisherSyncsPerBidder === 0 || publisherSyncsPerBidder)) { + publisherSyncsPerBidder = publisherSyncsPerBidderOverride > publisherSyncsPerBidder ? publisherSyncsPerBidder : publisherSyncsPerBidderOverride; + } else { + publisherSyncsPerBidder = 1; + } + for (let i = 0; i < publisherSyncsPerBidder; i++) { + syncs.push({ + type: 'image', + url: buildImgSyncUrl(publisherSyncsPerBidder, i) + }); + } + } + return syncs; + } +}; + +/** + * Build img user sync url + * @param {number} syncsPerBidder number of syncs Per Bidder + * @param {number} index index to pass + * @returns {string} img user sync url + */ +function buildImgSyncUrl(syncsPerBidder, index) { + let consentString = ''; + let gdprApplies = '0'; + if (gdprConsent && gdprConsent.hasOwnProperty('gdprApplies')) { + gdprApplies = gdprConsent.gdprApplies ? '1' : '0'; + } + if (gdprConsent && gdprConsent.hasOwnProperty('consentString')) { + consentString = gdprConsent.consentString || ''; + } + let siteIdParam = siteID !== 0 ? '&site_id=' + siteID.toString() : ''; + return IMG_USER_SYNC_URL + siteIdParam + '&p=' + syncsPerBidder.toString() + '&i=' + index.toString() + '&gdpr=' + gdprApplies + '&gdpr_consent=' + consentString + '&us_privacy=' + (usPrivacy || ''); +} + +/** + * Combines all imps into a single object + * @param {Array} imps array of imps + * @returns object + */ +function combineImps(imps) { + const result = {}; + imps.forEach(imp => { + Object.keys(imp).forEach(key => { + if (Object.keys(result).includes(key)) { + if (result[key].hasOwnProperty('ixImps') && imp[key].hasOwnProperty('ixImps')) { + result[key].ixImps = [...result[key].ixImps, ...imp[key].ixImps]; + } else if (result[key].hasOwnProperty('missingImps') && imp[key].hasOwnProperty('missingImps')) { + result[key].missingImps = [...result[key].missingImps, ...imp[key].missingImps]; + } else if (imp[key].hasOwnProperty('ixImps')) { + result[key].ixImps = imp[key].ixImps; + } else if (imp[key].hasOwnProperty('missingImps')) { + result[key].missingImps = imp[key].missingImps; + } + } else { + result[key] = imp[key]; + } + }); + }); + return result; +} + +/** + * Deduplicates ext fields. For example if imp.ext.tid exists, removes imp.banner.ext.tid + * + * @param {object} r request object + * @returns object + */ +function deduplicateImpExtFields(r) { + r.imp.forEach((imp, index) => { + const impExt = imp.ext; + if (impExt == undefined) { + return r; + } + if (getFormatCount(imp) < 2) { + return; + } + Object.keys(impExt).forEach(key => { + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER in imp) { + const bannerExt = imp.banner.ext; + if (bannerExt !== undefined && bannerExt[key] !== undefined && bannerExt[key] == impExt[key]) { + delete r.imp[index].banner.ext[key]; + } + if (imp.banner.format !== undefined) { + for (let i = 0; i < imp.banner.format.length; i++) { + if (imp.banner.format[i].ext != undefined && imp.banner.format[i].ext[key] != undefined && imp.banner.format[i].ext[key] == impExt[key]) { + delete r.imp[index].banner.format[i].ext[key]; + } + } + } + } + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO in imp) { + const videoExt = imp.video.ext; + if (videoExt !== undefined && videoExt[key] !== undefined && videoExt[key] == impExt[key]) { + delete r.imp[index].video.ext[key]; + } + } + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE in imp) { + const nativeExt = imp.native.ext; + if (nativeExt !== undefined && nativeExt[key] !== undefined && nativeExt[key] == impExt[key]) { + delete r.imp[index].native.ext[key]; + } + } + }); + }); + return r; +} + +/** + * Removes ext.siteids in multiformat scenario + * Site id will be set only at imp.ext.siteId + * + * @param {object} r request object + * @returns object + */ +function removeSiteIDs(r) { + r.imp.forEach((imp, index) => { + const impExt = imp.ext; + if (impExt == undefined) { + return r; + } + if (getFormatCount(imp) < 2) { + return; + } + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER in imp) { + const bannerExt = imp.banner.ext; + if (bannerExt !== undefined && bannerExt.siteID !== undefined) { + delete r.imp[index].banner.ext.siteID; + } + if (imp.banner.format !== undefined) { + for (let i = 0; i < imp.banner.format.length; i++) { + if (imp.banner.format[i].ext !== undefined && imp.banner.format[i].ext.siteID !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r.imp[index], 'ext.siteID', imp.banner.format[i].ext.siteID); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(r, 'ext.ixdiag.usid', true); + delete r.imp[index].banner.format[i].ext.siteID; + } + } + } + } + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO in imp) { + const videoExt = imp.video.ext; + if (videoExt !== undefined && videoExt.siteID !== undefined) { + delete r.imp[index].video.ext.siteID; + } + } + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE in imp) { + const nativeExt = imp.native.ext; + if (nativeExt !== undefined && nativeExt.siteID !== undefined) { + delete r.imp[index].native.ext.siteID; + } + } + }); + return r; +} + +/** + * Gets count of banner/video/native formats in imp + * @param {object} imp + * @returns int + */ +function getFormatCount(imp) { + let formatCount = 0; + if (imp.banner !== undefined) { + formatCount += 1; + } + if (imp.video !== undefined) { + formatCount += 1; + } + if (imp.native !== undefined) { + formatCount += 1; + } + return formatCount; +} + +/** + * Checks if auction config is valid + * @param {object} config + * @returns bool + */ +function isValidAuctionConfig(config) { + return typeof config === 'object' && config !== null; +} + +/** + * Adds device.w / device.h info + * @param {object} r + * @returns object + */ +function addDeviceInfo(r) { + if (r.device == undefined) { + r.device = {}; + } + r.device.h = window.screen.height; + r.device.w = window.screen.width; + return r; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('ixBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ixBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["jixieBidAdapter"],{ + +/***/ "./modules/jixieBidAdapter.js": +/*!************************************!*\ + !*** ./modules/jixieBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, internal, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + + + + +const ADAPTER_VERSION = '2.1.0'; +const PREBID_VERSION = "9.45.0-pre"; +const BIDDER_CODE = 'jixie'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const JX_OUTSTREAM_RENDERER_URL = 'https://scripts.jixie.media/jxhbrenderer.1.1.min.js'; +const REQUESTS_URL = 'https://hb.jixie.io/v2/hbpost'; +const sidTTLMins_ = 30; + +/** + * Get bid floor from Price Floors Module + * + * @param {Object} bid + * @returns {(number|null)} + */ +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} + +/** + * Own miscellaneous support functions: + */ + +function setIds_(clientId, sessionId) { + let dd = null; + try { + dd = window.location.hostname.match(/[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$/mg); + } catch (err1) {} + try { + let expC = new Date(new Date().setFullYear(new Date().getFullYear() + 1)).toUTCString(); + let expS = new Date(new Date().setMinutes(new Date().getMinutes() + sidTTLMins_)).toUTCString(); + storage.setCookie('_jxx', clientId, expC, 'None', null); + storage.setCookie('_jxx', clientId, expC, 'None', dd); + storage.setCookie('_jxxs', sessionId, expS, 'None', null); + storage.setCookie('_jxxs', sessionId, expS, 'None', dd); + storage.setDataInLocalStorage('_jxx', clientId); + storage.setDataInLocalStorage('_jxxs', sessionId); + } catch (error) {} +} + +/** + * fetch some ids from cookie, LS. + * @returns + */ +const defaultGenIds_ = [{ + id: '_jxtoko' +}, { + id: '_jxifo' +}, { + id: '_jxtdid' +}, { + id: '_jxcomp' +}]; +function fetchIds_(cfg) { + let ret = { + client_id_c: '', + client_id_ls: '', + session_id_c: '', + session_id_ls: '', + jxeids: {} + }; + try { + let tmp = storage.getCookie('_jxx'); + if (tmp) ret.client_id_c = tmp; + tmp = storage.getCookie('_jxxs'); + if (tmp) ret.session_id_c = tmp; + tmp = storage.getDataFromLocalStorage('_jxx'); + if (tmp) ret.client_id_ls = tmp; + tmp = storage.getDataFromLocalStorage('_jxxs'); + if (tmp) ret.session_id_ls = tmp; + let arr = cfg.genids ? cfg.genids : defaultGenIds_; + arr.forEach(function (o) { + tmp = storage.getCookie(o.ck ? o.ck : o.id); + if (tmp) ret.jxeids[o.id] = tmp; + }); + } catch (error) {} + return ret; +} + +// device in the payload had been a simple string ('desktop', 'mobile') +// Now changed to an object. yes the backend is able to handle it. +function getDevice_() { + const device = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('device') || {}; + device.w = device.w || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerWidth; + device.h = device.h || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerHeight; + device.ua = device.ua || navigator.userAgent; + device.dnt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0; + device.language = navigator && navigator.language ? navigator.language.split('-')[0] : ''; + return device; +} +function jxOutstreamRender_(bidAd) { + bidAd.renderer.push(() => { + window.JixieOutstreamVideo.init({ + sizes: [bidAd.width, bidAd.height], + width: bidAd.width, + height: bidAd.height, + targetId: bidAd.adUnitCode, + adResponse: bidAd.adResponse + }); + }); +} +function createRenderer_(bidAd, scriptUrl, createFcn) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: bidAd.adUnitCode, + url: scriptUrl, + loaded: false, + config: { + 'player_height': bidAd.height, + 'player_width': bidAd.width + }, + adUnitCode: bidAd.adUnitCode + }); + try { + renderer.setRender(createFcn); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function getMiscDims_() { + let ret = { + pageurl: '', + domain: '', + device: 'unknown', + mkeywords: '' + }; + try { + // TODO: this should pick refererInfo from bidderRequest + let refererInfo_ = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)(); + // TODO: does the fallback make sense here? + let url_ = refererInfo_?.page || window.location.href; + ret.pageurl = url_; + ret.domain = refererInfo_?.domain || window.location.host; + ret.device = getDevice_(); + let keywords = document.getElementsByTagName('meta')['keywords']; + if (keywords && keywords.content) { + ret.mkeywords = keywords.content; + } + } catch (error) {} + return ret; +} + +// easier for replacement in the unit test +const internal = { + getDevice: getDevice_, + getRefererInfo: _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo, + ajax: _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax, + getMiscDims: getMiscDims_ +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO], + isBidRequestValid: function (bid) { + if (bid.bidder !== BIDDER_CODE || typeof bid.params === 'undefined') { + return false; + } + if (typeof bid.params.unit === 'undefined') { + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const currencyObj = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('currency'); + const currency = currencyObj && currencyObj.adServerCurrency || 'USD'; + let bids = []; + validBidRequests.forEach(function (one) { + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(one, 'ortb2Imp.ext.gpid', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(one, 'ortb2Imp.ext.data.pbadslot', '')); + let tmp = { + bidId: one.bidId, + adUnitCode: one.adUnitCode, + mediaTypes: one.mediaTypes === 'undefined' ? {} : one.mediaTypes, + sizes: one.sizes === 'undefined' ? [] : one.sizes, + params: one.params, + gpid: gpid + }; + let bidFloor = getBidFloor(one); + if (bidFloor) { + tmp.bidFloor = bidFloor; + } + bids.push(tmp); + }); + let jxCfg = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('jixie') || {}; + let ids = fetchIds_(jxCfg); + let eids = []; + let miscDims = internal.getMiscDims(); + let schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(validBidRequests[0], 'schain'); + let eids1 = validBidRequests[0].userIdAsEids; + // all available user ids are sent to our backend in the standard array layout: + if (eids1 && eids1.length) { + eids = eids1; + } + // we want to send this blob of info to our backend: + let transformedParams = Object.assign({}, { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionid: bidderRequest.auctionId || '', + aid: jxCfg.aid || '', + timeout: bidderRequest.timeout, + currency: currency, + timestamp: new Date().getTime(), + device: miscDims.device, + domain: miscDims.domain, + pageurl: miscDims.pageurl, + mkeywords: miscDims.mkeywords, + bids: bids, + eids: eids, + schain: schain, + pricegranularity: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('priceGranularity') || {}, + ver: ADAPTER_VERSION, + pbjsver: PREBID_VERSION, + cfg: jxCfg + }, ids); + return Object.assign({}, { + method: 'POST', + url: REQUESTS_URL, + data: JSON.stringify(transformedParams), + currency: currency + }); + }, + onTimeout: function (timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('jixie adapter timed out for the auction.', timeoutData); + }, + onBidWon: function (bid) { + if (bid.trackingUrl) { + internal.ajax(bid.trackingUrl, null, {}, { + withCredentials: true, + method: 'GET', + crossOrigin: true + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`jixie adapter won the auction. Bid id: ${bid.bidId}, Ad Unit Id: ${bid.adUnitId}`); + }, + interpretResponse: function (response, bidRequest) { + if (response && response.body && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response.body.bids)) { + const bidResponses = []; + response.body.bids.forEach(function (oneBid) { + let bnd = {}; + Object.assign(bnd, oneBid); + if (oneBid.osplayer) { + bnd.adResponse = { + content: oneBid.vastXml, + parameters: oneBid.osparams, + height: oneBid.height, + width: oneBid.width + }; + let rendererScript = oneBid.osparams.script ? oneBid.osparams.script : JX_OUTSTREAM_RENDERER_URL; + bnd.renderer = createRenderer_(oneBid, rendererScript, jxOutstreamRender_); + } + // a note on advertiserDomains: our adserver is not responding in + // openRTB-type json. so there is no need to copy from 'adomain' over + // to meta: advertiserDomains + // However, we will just make sure the property is there. + if (!bnd.meta) { + bnd.meta = {}; + } + if (!bnd.meta.advertiserDomains) { + bnd.meta.advertiserDomains = []; + } + bidResponses.push(bnd); + }); + if (response.body.setids) { + setIds_(response.body.setids.client_id, response.body.setids.session_id); + } + return bidResponses; + } else { + return []; + } + }, + getUserSyncs: function (syncOptions, serverResponses) { + if (!serverResponses.length || !serverResponses[0].body || !serverResponses[0].body.userSyncs) { + return false; + } + let syncs = []; + serverResponses[0].body.userSyncs.forEach(function (sync) { + if (syncOptions.iframeEnabled) { + syncs.push(sync.uf ? { + url: sync.uf, + type: 'iframe' + } : { + url: sync.up, + type: 'image' + }); + } else if (syncOptions.pixelEnabled && sync.up) { + syncs.push({ + url: sync.up, + type: 'image' + }); + } + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('jixieBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/jixieBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["justIdSystem"],{ + +/***/ "./modules/justIdSystem.js": +/*!*********************************!*\ + !*** ./modules/justIdSystem.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports EX_URL_REQUIRED, EX_INVALID_MODE, justIdSubmodule, ConfigWrapper, jtUtils */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds JustId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/justIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'justId'; +const EXTERNAL_SCRIPT_MODULE_CODE = 'justtag'; +const LOG_PREFIX = 'User ID - JustId submodule: '; +const GVLID = 160; +const DEFAULT_PARTNER = 'pbjs-just-id-module'; +const DEFAULT_ATM_VAR_NAME = '__atm'; +const MODE_BASIC = 'BASIC'; +const MODE_COMBINED = 'COMBINED'; +const DEFAULT_MODE = MODE_BASIC; +const EX_URL_REQUIRED = new Error(`params.url is required in ${MODE_COMBINED} mode`); +const EX_INVALID_MODE = new Error(`Invalid params.mode. Allowed values: ${MODE_BASIC}, ${MODE_COMBINED}`); + +/** @type {Submodule} */ +const justIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * required for the gdpr enforcement module + */ + gvlid: GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {{uid:string}} value + * @returns {{justId:string}} + */ + decode(value) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'decode', value); + const justId = value && value.uid; + return justId && { + justId: justId + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} config + * @param {ConsentData} consentData + * @param {(Object|undefined)} cacheIdObj + * @returns {IdResponse|undefined} + */ + getId(config, consentData, cacheIdObj) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'getId', config, consentData, cacheIdObj); + var configWrapper; + try { + configWrapper = new ConfigWrapper(config); + } catch (e) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(LOG_PREFIX, e); + } + return configWrapper && { + callback: function (cbFun) { + try { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'fetching uid...'); + var uidProvider = configWrapper.isCombinedMode() ? new CombinedUidProvider(configWrapper, consentData?.gdpr, cacheIdObj) : new BasicUidProvider(configWrapper); + uidProvider.getUid(justId => { + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr(justId)) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(LOG_PREFIX, 'empty uid!'); + cbFun(); + return; + } + cbFun({ + uid: justId + }); + }, err => { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(LOG_PREFIX, 'error during fetching', err); + cbFun(); + }); + } catch (e) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(LOG_PREFIX, 'Error during fetching...', e); + } + } + }; + }, + eids: { + 'justId': { + source: 'justtag.com', + atype: 1 + } + } +}; +const ConfigWrapper = function (config) { + this.getConfig = function () { + return config; + }; + this.getMode = function () { + return (params().mode || DEFAULT_MODE).toUpperCase(); + }; + this.getPartner = function () { + return params().partner || DEFAULT_PARTNER; + }; + this.isCombinedMode = function () { + return this.getMode() === MODE_COMBINED; + }; + this.getAtmVarName = function () { + return params().atmVarName || DEFAULT_ATM_VAR_NAME; + }; + this.getUrl = function () { + const u = params().url; + const url = new URL(u); + url.searchParams.append('sourceId', this.getPartner()); + return url.toString(); + }; + function params() { + return config.params || {}; + } + + // validation + if (!(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)([MODE_BASIC, MODE_COMBINED], this.getMode())) { + throw EX_INVALID_MODE; + } + var url = params().url; + if (this.isCombinedMode() && (_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr(url) || !_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr(url))) { + throw EX_URL_REQUIRED; + } +}; +const CombinedUidProvider = function (configWrapper, consentData, cacheIdObj) { + const url = configWrapper.getUrl(); + this.getUid = function (idCallback, errCallback) { + const scriptTag = (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(url, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_UID, EXTERNAL_SCRIPT_MODULE_CODE, () => { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'script loaded', url); + const eventDetails = { + detail: { + config: configWrapper.getConfig(), + consentData: consentData, + cacheIdObj: cacheIdObj + } + }; + scriptTag.dispatchEvent(new CustomEvent('prebidGetId', eventDetails)); + }); + scriptTag.addEventListener('justIdReady', event => { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'received justId', event); + idCallback(event.detail && event.detail.justId); + }); + scriptTag.onerror = errCallback; + }; +}; +const BasicUidProvider = function (configWrapper) { + const atmVarName = configWrapper.getAtmVarName(); + this.getUid = function (idCallback, errCallback) { + var atm = getAtm(); + if (typeof atm !== 'function') { + // it may be AsyncFunction, so we can't use utils.isFn + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'ATM function not found!', atmVarName, atm); + errCallback('ATM not found'); + return; + } + atm = function () { + // stub is replaced after ATM is loaded so we must refer them directly by global variable + return getAtm().apply(this, arguments); + }; + atm('getReadyState', () => { + Promise.resolve(atm('getVersion')) // atm('getVersion') returns string || Promise + .then(atmVersion => { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo(LOG_PREFIX, 'ATM Version', atmVersion); + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr(atmVersion)) { + // getVersion command was introduced in same ATM version as getUid command + atm('getUid', idCallback); + } else { + errCallback('ATM getUid not supported'); + } + }); + }); + }; + function getAtm() { + return jtUtils.getAtm(atmVarName); + } +}; +const jtUtils = { + getAtm(atmVarName) { + return window[atmVarName]; + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', justIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('justIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/justIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["justpremiumBidAdapter"],{ + +/***/ "./modules/justpremiumBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/justpremiumBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + +const BIDDER_CODE = 'justpremium'; +const GVLID = 62; +const ENDPOINT_URL = 'https://pre.ads.justpremium.com/v/2.0/t/xhr'; +const JP_ADAPTER_VERSION = '1.8.3'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + time: 60000, + isBidRequestValid: bid => { + return !!(bid && bid.params && bid.params.zone); + }, + buildRequests: (validBidRequests, bidderRequest) => { + const c = preparePubCond(validBidRequests); + const { + screen + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)(); + const ggExt = getGumGumParams(); + const payload = { + zone: validBidRequests.map(b => { + return parseInt(b.params.zone); + }).filter((value, index, self) => { + return self.indexOf(value) === index; + }), + // TODO: is 'page' the right value here? + referer: bidderRequest.refererInfo.page, + sw: screen.width, + sh: screen.height, + ww: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().innerWidth, + wh: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().innerHeight, + c: c, + id: validBidRequests[0].params.zone, + sizes: {}, + ggExt: ggExt + }; + validBidRequests.forEach(b => { + const zone = b.params.zone; + const sizes = payload.sizes; + sizes[zone] = sizes[zone] || []; + sizes[zone].push.apply(sizes[zone], b.mediaTypes && b.mediaTypes.banner && b.mediaTypes.banner.sizes); + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'userId.pubcid')) { + payload.pubcid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'userId.pubcid'); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'crumbs.pubcid')) { + payload.pubcid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'crumbs.pubcid'); + } + payload.uids = validBidRequests[0].userId; + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdpr_consent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : true + }; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + payload.version = { + prebid: "9.45.0-pre", + jp_adapter: JP_ADAPTER_VERSION + }; + if (validBidRequests[0].schain) { + payload.schain = validBidRequests[0].schain; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL + '?i=' + +new Date(), + data: payloadString, + bids: validBidRequests + }; + }, + interpretResponse: (serverResponse, bidRequests) => { + const body = serverResponse.body; + let bidResponses = []; + bidRequests.bids.forEach(adUnit => { + let bid = findBid(adUnit.params, body.bid); + if (bid) { + let size = adUnit.mediaTypes && adUnit.mediaTypes.banner && adUnit.mediaTypes.banner.sizes && adUnit.mediaTypes.banner.sizes.length && adUnit.mediaTypes.banner.sizes[0] || []; + let bidResponse = { + requestId: adUnit.bidId, + creativeId: bid.id, + width: size[0] || bid.width, + height: size[1] || bid.height, + ad: bid.adm, + cpm: bid.price, + netRevenue: true, + currency: bid.currency || 'USD', + ttl: bid.ttl || spec.time, + format: bid.format, + meta: { + advertiserDomains: bid.adomain && bid.adomain.length > 0 ? bid.adomain : [] + } + }; + if (bid.ext && bid.ext.pg) { + bidResponse.adserverTargeting = { + 'hb_deal_justpremium': 'jp_pg' + }; + } + bidResponses.push(bidResponse); + } + }); + return bidResponses; + }, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + let url = 'https://pre.ads.justpremium.com/v/1.0/t/sync' + '?_c=' + 'a' + Math.random().toString(36).substring(7) + Date.now(); + let pixels = []; + if (gdprConsent && typeof gdprConsent.gdprApplies === 'boolean' && gdprConsent.gdprApplies && gdprConsent.consentString) { + url = url + '&consentString=' + encodeURIComponent(gdprConsent.consentString); + } + if (uspConsent) { + url = url + '&usPrivacy=' + encodeURIComponent(uspConsent); + } + if (syncOptions.iframeEnabled) { + pixels.push({ + type: 'iframe', + url: url + }); + } + if (syncOptions.pixelEnabled && serverResponses.length !== 0) { + const pxsFromResponse = serverResponses.map(res => res?.body?.pxs).reduce((acc, cur) => acc.concat(cur), []).filter(obj => obj !== undefined); + pixels = [...pixels, ...pxsFromResponse]; + } + return pixels; + } +}; +function findBid(params, bids) { + const tagId = params.zone; + if (bids[tagId]) { + let len = bids[tagId].length; + while (len--) { + if (passCond(params, bids[tagId][len])) { + return bids[tagId].splice(len, 1).pop(); + } + } + } + return false; +} +function passCond(params, bid) { + const format = bid.format; + if (params.allow && params.allow.length) { + return params.allow.indexOf(format) > -1; + } + if (params.exclude && params.exclude.length) { + return params.exclude.indexOf(format) < 0; + } + return true; +} +function preparePubCond(bids) { + const cond = {}; + const count = {}; + bids.forEach(bid => { + const params = bid.params; + const zone = params.zone; + if (cond[zone] === 1) { + return; + } + const allow = params.allow || params.formats || []; + const exclude = params.exclude || []; + if (allow.length === 0 && exclude.length === 0) { + return cond[params.zone] = 1; + } + cond[zone] = cond[zone] || [[], {}]; + cond[zone][0] = arrayUnique(cond[zone][0].concat(allow)); + exclude.forEach(e => { + if (!cond[zone][1][e]) { + cond[zone][1][e] = 1; + } else { + cond[zone][1][e]++; + } + }); + count[zone] = count[zone] || 0; + if (exclude.length) { + count[zone]++; + } + }); + Object.keys(count).forEach(zone => { + if (cond[zone] === 1) return; + const exclude = []; + Object.keys(cond[zone][1]).forEach(format => { + if (cond[zone][1][format] === count[zone]) { + exclude.push(format); + } + }); + cond[zone][1] = exclude; + }); + Object.keys(cond).forEach(zone => { + if (cond[zone] !== 1 && cond[zone][1].length) { + cond[zone][0].forEach(r => { + let idx = cond[zone][1].indexOf(r); + if (idx > -1) { + cond[zone][1].splice(idx, 1); + } + }); + cond[zone][0].length = 0; + } + if (cond[zone] !== 1 && !cond[zone][0].length && !cond[zone][1].length) { + cond[zone] = 1; + } + }); + return cond; +} +function arrayUnique(array) { + const a = array.concat(); + for (let i = 0; i < a.length; ++i) { + for (let j = i + 1; j < a.length; ++j) { + if (a[i] === a[j]) { + a.splice(j--, 1); + } + } + } + return a; +} +function getGumGumParams() { + if (!window.top) return null; + const urlParams = new URLSearchParams(window.top.location.search); + const ggParams = { + 'ggAdbuyid': urlParams.get('gg_adbuyid'), + 'ggDealid': urlParams.get('gg_dealid'), + 'ggEadbuyid': urlParams.get('gg_eadbuyid') + }; + const checkIfEmpty = obj => Object.keys(obj).length === 0 ? null : obj; + const removeNullEntries = obj => Object.fromEntries(Object.entries(obj).filter(_ref => { + let [_, v] = _ref; + return v != null; + })); + return checkIfEmpty(removeNullEntries(ggParams)); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('justpremiumBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/justpremiumBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["jwplayerBidAdapter"],{ + +/***/ "./modules/jwplayerBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/jwplayerBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); + + + + + + +const BIDDER_CODE = 'jwplayer'; +const BASE_URL = 'https://vpb-server.jwplayer.com/'; +const AUCTION_URL = BASE_URL + 'openrtb2/auction'; +const USER_SYNC_URL = BASE_URL + 'setuid'; +const GVLID = 1046; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const VIDEO_ORTB_PARAMS = ['pos', 'w', 'h', 'playbackend', 'mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'placement', 'plcmt', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']; +function getBidAdapter() { + function isBidRequestValid(bid) { + const params = bid && bid.params; + if (!params) { + return false; + } + return !!params.placementId && !!params.publisherId && !!params.siteId; + } + function buildRequests(bidRequests, bidderRequest) { + if (!bidRequests) { + return; + } + if (!hasContentUrl(bidderRequest.ortb2)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${BIDDER_CODE}: cannot bid without a valid Content URL. Please populate ortb2.site.content.url`); + return; + } + const warnings = getWarnings(bidderRequest); + warnings.forEach(warning => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: ${warning}`); + }); + return bidRequests.map(bidRequest => { + const payload = buildRequest(bidRequest, bidderRequest); + return { + method: 'POST', + url: AUCTION_URL, + data: payload + }; + }); + } + function interpretResponse(serverResponse) { + const outgoingBidResponses = []; + const serverResponseBody = serverResponse.body; + logResponseWarnings(serverResponseBody); + const seatBids = serverResponseBody && serverResponseBody.seatbid; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(seatBids)) { + return outgoingBidResponses; + } + const cur = serverResponseBody.cur; + seatBids.forEach(seatBid => { + seatBid.bid.forEach(bid => { + const bidResponse = { + requestId: serverResponseBody.id, + cpm: bid.price, + currency: cur, + width: bid.w, + height: bid.h, + ad: bid.adm, + vastXml: bid.adm, + ttl: bid.ttl || 3600, + netRevenue: false, + creativeId: bid.adid, + dealId: bid.dealid, + meta: { + advertiserDomains: bid.adomain, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + primaryCatId: bid.cat + } + }; + outgoingBidResponses.push(bidResponse); + }); + }); + return outgoingBidResponses; + } + function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__.hasPurpose1Consent)(gdprConsent)) { + return []; + } + const userSyncs = []; + const consentQueryParams = getUserSyncConsentQueryParams(gdprConsent); + const url = `https://ib.adnxs.com/getuid?${USER_SYNC_URL}?bidder=jwplayer&uid=$UID&f=i` + consentQueryParams; + if (syncOptions.iframeEnabled) { + userSyncs.push({ + type: 'iframe', + url + }); + } + if (syncOptions.pixelEnabled) { + userSyncs.push({ + type: 'image', + url + }); + } + return userSyncs; + } + return { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs + }; + function getUserSyncConsentQueryParams(gdprConsent) { + if (!gdprConsent) { + return ''; + } + const consentString = gdprConsent.consentString; + if (!consentString) { + return ''; + } + let gdpr = 0; + const gdprApplies = gdprConsent.gdprApplies; + if (typeof gdprApplies === 'boolean') { + gdpr = Number(gdprApplies); + } + return `&gdpr=${gdpr}&gdpr_consent=${consentString}`; + } + function buildRequest(bidRequest, bidderRequest) { + const openrtbRequest = { + id: bidRequest.bidId, + imp: getRequestImpressions(bidRequest, bidderRequest), + site: getRequestSite(bidRequest, bidderRequest), + device: getRequestDevice(bidderRequest.ortb2), + user: getRequestUser(bidderRequest.ortb2) + }; + + // GDPR Consent Params + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (bidRequest.schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'source.schain', bidRequest.schain); + } + openrtbRequest.tmax = bidderRequest.timeout || 200; + return JSON.stringify(openrtbRequest); + } + function getRequestImpressions(bidRequest) { + const impressionObject = { + id: bidRequest.adUnitCode + }; + impressionObject.video = getImpressionVideo(bidRequest); + const bidFloorData = getBidFloorData(bidRequest); + if (bidFloorData) { + impressionObject.bidfloor = bidFloorData.floor; + impressionObject.bidfloorcur = bidFloorData.currency; + } + impressionObject.ext = getImpressionExtension(bidRequest); + return [impressionObject]; + } + function getImpressionVideo(bidRequest) { + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video', {}); + const video = {}; + VIDEO_ORTB_PARAMS.forEach(param => { + if (videoParams.hasOwnProperty(param)) { + video[param] = videoParams[param]; + } + }); + setPlayerSize(video, videoParams); + if (!videoParams.plcmt) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: Please set a value to mediaTypes.video.plcmt`); + } + return video; + } + function getImpressionExtension(bidRequest) { + return { + prebid: { + bidder: { + jwplayer: { + placementId: bidRequest.params.placementId + } + } + } + }; + } + function setPlayerSize(videoImp, videoParams) { + if (videoImp.w !== undefined && videoImp.h !== undefined) { + return; + } + const playerSize = getNormalizedPlayerSize(videoParams.playerSize); + if (!playerSize.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: Video size has not been set. Please set values in video.h and video.w`)); + return; + } + if (videoImp.w === undefined) { + videoImp.w = playerSize[0]; + } + if (videoImp.h === undefined) { + videoImp.h = playerSize[1]; + } + } + function getNormalizedPlayerSize(playerSize) { + if (!Array.isArray(playerSize)) { + return []; + } + if (Array.isArray(playerSize[0])) { + playerSize = playerSize[0]; + } + if (playerSize.length < 2) { + return []; + } + return playerSize; + } + function getBidFloorData(bidRequest) { + const { + params + } = bidRequest; + const currency = params.currency || 'USD'; + let floorData; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.getFloor)) { + const bidFloorRequest = { + currency: currency, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + size: '*' + }; + floorData = bidRequest.getFloor(bidFloorRequest); + } else if (params.bidFloor) { + floorData = { + floor: params.bidFloor, + currency: currency + }; + } + return floorData; + } + function getRequestSite(bidRequest, bidderRequest) { + const site = bidderRequest.ortb2.site || {}; + site.domain = site.domain || _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.publisherDomain || window.location.hostname; + site.page = site.page || _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.pageUrl || window.location.href; + const referer = bidderRequest.refererInfo && bidderRequest.refererInfo.referer; + if (!site.ref && referer) { + site.ref = referer; + } + const jwplayerPublisherExtChain = 'publisher.ext.jwplayer.'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(site, jwplayerPublisherExtChain + 'publisherId', bidRequest.params.publisherId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(site, jwplayerPublisherExtChain + 'siteId', bidRequest.params.siteId); + return site; + } + function getRequestDevice(ortb2) { + const device = Object.assign({ + h: screen.height, + w: screen.width, + ua: navigator.userAgent, + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0, + js: 1 + }, ortb2.device || {}); + const language = getLanguage(); + if (!device.language && language) { + device.language = language; + } + return device; + } + function getLanguage() { + const navigatorLanguage = navigator.language; + if (!navigatorLanguage) { + return; + } + const languageCodeSegments = navigatorLanguage.split('-'); + if (!languageCodeSegments.length) { + return; + } + return languageCodeSegments[0]; + } + function getRequestUser(ortb2) { + const user = ortb2.user || {}; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa') === true) { + user.coppa = true; + } + return user; + } + function hasContentUrl(ortb2) { + const site = ortb2.site; + const content = site && site.content; + return !!(content && content.url); + } + function getWarnings(bidderRequest) { + const content = bidderRequest.ortb2.site.content; + const contentChain = 'ortb2.site.content.'; + const warnings = []; + if (!content.id) { + warnings.push(getMissingFieldMessage(contentChain + 'id')); + } + if (!content.title) { + warnings.push(getMissingFieldMessage(contentChain + 'title')); + } + if (!content.ext || !content.ext.description) { + warnings.push(getMissingFieldMessage(contentChain + 'ext.description')); + } + return warnings; + } + function getMissingFieldMessage(fieldName) { + return `Optional field ${fieldName} is not populated; we recommend populating for maximum performance.`; + } + function logResponseWarnings(serverResponseBody) { + const warningPayload = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(serverResponseBody, 'ext.warnings'); + if (!warningPayload) { + return; + } + const warningCategories = Object.keys(warningPayload); + warningCategories.forEach(category => { + const warnings = warningPayload[category]; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(warnings)) { + return; + } + warnings.forEach(warning => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: [Bid Response][Warning Code: ${warning.code}] ${warning.message}`); + }); + }); + } +} +const spec = getBidAdapter(); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('jwplayerBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/jwplayerBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["jwplayerRtdProvider"],{ + +/***/ "./modules/jwplayerRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/jwplayerRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports jwplayerSubmodule, fetchTargetingInformation, setOverrides, fetchTargetingForMediaId, enrichAdUnits, extractPublisherParams, getVatFromCache, getVatFromPlayer, formatTargetingResponse, getContentId, getContentSegments, getContentData, addOrtbSiteContent, addTargetingToBid, getPlayer */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + +/** + * This module adds the jwplayer provider to the Real Time Data module (rtdModule) + * The {@link module:modules/realTimeData} module is required + * The module will allow Ad Bidders to obtain JW Player's Video Ad Targeting information + * The module will fetch segments for the media ids present in the prebid config when the module loads. If any bid + * requests are made while the segments are being fetched, they will be blocked until all requests complete, or the + * timeout expires. + * @module modules/jwplayerRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + * @typedef {import('../modules/rtdModule/index.js').adUnit} adUnit + */ + +const SUBMODULE_NAME = 'jwplayer'; +const JWPLAYER_DOMAIN = SUBMODULE_NAME + '.com'; +const ENRICH_ALWAYS = 'always'; +const ENRICH_WHEN_EMPTY = 'whenEmpty'; +const ENRICH_NEVER = 'never'; +const overrideValidationRegex = /^(always|never|whenEmpty)$/; +const playlistItemCache = {}; +const pendingRequests = {}; +let activeRequestCount = 0; +let resumeBidRequest; +let overrideContentId = ENRICH_WHEN_EMPTY; +let overrideContentUrl = ENRICH_WHEN_EMPTY; +let overrideContentTitle = ENRICH_WHEN_EMPTY; +let overrideContentDescription = ENRICH_WHEN_EMPTY; + +/** @type {RtdSubmodule} */ +const jwplayerSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: SUBMODULE_NAME, + /** + * add targeting data to bids and signal completion to realTimeData module + * @function + * @param {object} bidReqConfig + * @param {function} onDone + */ + getBidRequestData: enrichBidRequest, + init +}; +_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('realTimeData', _ref => { + let { + realTimeData + } = _ref; + const providers = realTimeData.dataProviders; + const jwplayerProvider = providers && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(providers, pr => pr.name && pr.name.toLowerCase() === SUBMODULE_NAME); + const params = jwplayerProvider && jwplayerProvider.params; + if (!params) { + return; + } + fetchTargetingInformation(params); + setOverrides(params); +}); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('realTimeData', jwplayerSubmodule); +function init(provider, userConsent) { + return true; +} +function fetchTargetingInformation(jwTargeting) { + const mediaIDs = jwTargeting.mediaIDs; + if (!mediaIDs) { + return; + } + mediaIDs.forEach(mediaID => { + fetchTargetingForMediaId(mediaID); + }); +} +function setOverrides(params) { + overrideContentId = sanitizeOverrideParam(params.overrideContentId, ENRICH_WHEN_EMPTY); + overrideContentUrl = sanitizeOverrideParam(params.overrideContentUrl, ENRICH_WHEN_EMPTY); + overrideContentTitle = sanitizeOverrideParam(params.overrideContentTitle, ENRICH_WHEN_EMPTY); + overrideContentDescription = sanitizeOverrideParam(params.overrideContentDescription, ENRICH_WHEN_EMPTY); +} +function sanitizeOverrideParam(overrideParam, defaultValue) { + if (overrideValidationRegex.test(overrideParam)) { + return overrideParam; + } + return defaultValue; +} +function fetchTargetingForMediaId(mediaId) { + const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajaxBuilder)(); + // TODO: Avoid checking undefined vs null by setting a callback to pendingRequests. + pendingRequests[mediaId] = null; + ajax(`https://cdn.${JWPLAYER_DOMAIN}/v2/media/${mediaId}`, { + success: function (response) { + const item = parsePlaylistItem(response); + cachePlaylistItem(item, mediaId); + onRequestCompleted(mediaId, !!item); + }, + error: function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('failed to retrieve targeting information'); + onRequestCompleted(mediaId, false); + } + }); +} +function parsePlaylistItem(response) { + let item; + try { + const data = JSON.parse(response); + if (!data) { + throw 'Empty response'; + } + const playlist = data.playlist; + if (!playlist || !playlist.length) { + throw 'Empty playlist'; + } + item = playlist[0]; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(err); + } + return item; +} +function cachePlaylistItem(playlistItem, mediaId) { + if (playlistItem && mediaId) { + playlistItemCache[mediaId] = playlistItem; + } +} +function onRequestCompleted(mediaID, success) { + const callback = pendingRequests[mediaID]; + if (callback) { + callback(success ? getVatFromCache(mediaID) : { + mediaID + }); + activeRequestCount--; + } + delete pendingRequests[mediaID]; + if (activeRequestCount > 0) { + return; + } + if (resumeBidRequest) { + resumeBidRequest(); + resumeBidRequest = null; + } +} +function enrichBidRequest(bidReqConfig, onDone) { + activeRequestCount = 0; + const adUnits = bidReqConfig.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)().adUnits; + enrichAdUnits(adUnits, bidReqConfig.ortb2Fragments); + if (activeRequestCount <= 0) { + onDone(); + } else { + resumeBidRequest = onDone; + } +} + +/** + * get targeting data and write to bids + * @function + * @param {adUnit[]} adUnits + * @param ortb2Fragments + */ +function enrichAdUnits(adUnits) { + let ortb2Fragments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const fpdFallback = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(ortb2Fragments.global, 'site.ext.data.jwTargeting'); + adUnits.forEach(adUnit => { + const jwTargeting = extractPublisherParams(adUnit, fpdFallback); + if (!jwTargeting || !Object.keys(jwTargeting).length) { + return; + } + const onVatResponse = function (vat) { + if (!vat) { + return; + } + const mediaId = vat.mediaID; + const contentId = getContentId(mediaId); + const contentSegments = getContentSegments(vat.segments); + const contentData = getContentData(mediaId, contentSegments); + const targeting = formatTargetingResponse(vat); + enrichBids(adUnit.bids, targeting, contentId, contentData); + addOrtbSiteContent(ortb2Fragments.global, contentId, contentData, vat.title, vat.description, vat.mediaUrl); + }; + loadVat(jwTargeting, onVatResponse); + }); +} +function supportsInstreamVideo(mediaTypes) { + const video = mediaTypes && mediaTypes.video; + return video && video.context === 'instream'; +} +function extractPublisherParams(adUnit, fallback) { + let adUnitTargeting; + try { + adUnitTargeting = adUnit.ortb2Imp.ext.data.jwTargeting; + } catch (e) {} + if (!adUnitTargeting && !supportsInstreamVideo(adUnit.mediaTypes)) { + return; + } + return Object.assign({}, fallback, adUnitTargeting); +} +function loadVat(params, onCompletion) { + let { + playerID, + playerDivId, + mediaID + } = params; + if (!playerDivId) { + playerDivId = playerID; + } + if (pendingRequests[mediaID] !== undefined) { + loadVatForPendingRequest(playerDivId, mediaID, onCompletion); + return; + } + const vat = getVatFromCache(mediaID) || getVatFromPlayer(playerDivId, mediaID) || { + mediaID + }; + onCompletion(vat); +} +function loadVatForPendingRequest(playerDivId, mediaID, callback) { + const vat = getVatFromPlayer(playerDivId, mediaID); + if (vat) { + callback(vat); + } else { + activeRequestCount++; + pendingRequests[mediaID] = callback; + } +} +function getVatFromCache(mediaID) { + const item = playlistItemCache[mediaID]; + if (!item) { + return null; + } + const mediaUrl = item.file ?? getFileFromSources(item); + return { + segments: item.jwpseg, + title: item.title, + description: item.description, + mediaUrl, + mediaID + }; +} +function getFileFromSources(playlistItem) { + return playlistItem.sources?.find?.(source => !!source.file)?.file; +} +function getVatFromPlayer(playerDivId, mediaID) { + const player = getPlayer(playerDivId); + if (!player) { + return null; + } + const item = mediaID ? (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(player.getPlaylist(), item => item.mediaid === mediaID) : player.getPlaylistItem(); + if (!item) { + return null; + } + mediaID = mediaID || item.mediaid; + const title = item.title; + const description = item.description; + const mediaUrl = item.file; + const segments = item.jwpseg; + cachePlaylistItem(item, mediaID); + return { + segments, + mediaID, + title, + mediaUrl, + description + }; +} + +/* + deprecated + */ +function formatTargetingResponse(vat) { + const { + segments, + mediaID + } = vat; + const targeting = {}; + if (segments && segments.length) { + targeting.segments = segments; + } + if (mediaID) { + targeting.content = { + id: getContentId(mediaID) + }; + } + return targeting; +} +function getContentId(mediaID) { + if (!mediaID) { + return; + } + return 'jw_' + mediaID; +} +function getContentSegments(segments) { + if (!segments || !segments.length) { + return; + } + const formattedSegments = segments.reduce((convertedSegments, rawSegment) => { + convertedSegments.push({ + id: rawSegment + }); + return convertedSegments; + }, []); + return formattedSegments; +} +function getContentData(mediaId, segments) { + if (!mediaId && !segments) { + return; + } + const contentData = { + name: JWPLAYER_DOMAIN, + ext: {} + }; + if (mediaId) { + contentData.ext.cids = [mediaId]; + } + if (segments) { + contentData.segment = segments; + contentData.ext.segtax = 502; + } + return contentData; +} +function addOrtbSiteContent(ortb2, contentId, contentData, contentTitle, contentDescription, contentUrl) { + if (ortb2 == null) { + ortb2 = {}; + } + let site = ortb2.site = ortb2.site || {}; + let content = site.content = site.content || {}; + if (shouldOverride(content.id, contentId, overrideContentId)) { + content.id = contentId; + } + if (shouldOverride(content.url, contentUrl, overrideContentUrl)) { + content.url = contentUrl; + } + if (shouldOverride(content.title, contentTitle, overrideContentTitle)) { + content.title = contentTitle; + } + if (shouldOverride(content.ext && content.ext.description, contentDescription, overrideContentDescription)) { + content.ext = content.ext || {}; + content.ext.description = contentDescription; + } + const currentData = content.data || []; + // remove old jwplayer data + const data = currentData.filter(datum => datum.name !== JWPLAYER_DOMAIN); + if (contentData) { + data.push(contentData); + } + if (data.length) { + content.data = data; + } + return ortb2; +} +function shouldOverride(currentValue, newValue, configValue) { + switch (configValue) { + case ENRICH_ALWAYS: + return !!newValue; + case ENRICH_NEVER: + return false; + case ENRICH_WHEN_EMPTY: + return !!newValue && currentValue === undefined; + default: + return false; + } +} +function enrichBids(bids, targeting, contentId, contentData) { + if (!bids) { + return; + } + bids.forEach(bid => { + addTargetingToBid(bid, targeting); + }); +} + +/* + deprecated + */ +function addTargetingToBid(bid, targeting) { + if (!targeting) { + return; + } + const rtd = bid.rtd || {}; + const jwRtd = {}; + jwRtd[SUBMODULE_NAME] = Object.assign({}, rtd[SUBMODULE_NAME], { + targeting + }); + bid.rtd = Object.assign({}, rtd, jwRtd); +} +function getPlayer(playerDivId) { + const jwplayer = window.jwplayer; + if (!jwplayer) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(SUBMODULE_NAME + '.js was not found on page'); + return; + } + let player = jwplayer(playerDivId); + if (player && player.getPlaylist) { + return player; + } + const playerOnPageCount = document.getElementsByClassName('jwplayer').length; + if (playerOnPageCount === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('No JWPlayer instances have been detected on the page'); + return; + } + let errorMessage = `player Div ID ${playerDivId} did not match any players.`; + + // If there are multiple instances on the page, we cannot guess which one should be targeted. + if (playerOnPageCount > 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(errorMessage); + return; + } + player = jwplayer(); + if (player && player.getPlaylist) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${errorMessage} Targeting player Div ID ${player.id} instead`); + return player; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(errorMessage); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('jwplayerRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/jwplayerRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["jwplayerVideoProvider"],{ + +/***/ "./modules/jwplayerVideoProvider.js": +/*!******************************************!*\ + !*** ./modules/jwplayerVideoProvider.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports JWPlayerProvider, utils, callbackStorageFactory, adStateFactory, timeStateFactory */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/video/constants/ortb.js */ "./libraries/video/constants/ortb.js"); +/* harmony import */ var _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/video/constants/events.js */ "./libraries/video/constants/events.js"); +/* harmony import */ var _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/video/constants/constants.js */ "./libraries/video/constants/constants.js"); +/* harmony import */ var _libraries_video_shared_state_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/video/shared/state.js */ "./libraries/video/shared/state.js"); +/* harmony import */ var _libraries_video_constants_vendorCodes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/video/constants/vendorCodes.js */ "./libraries/video/constants/vendorCodes.js"); +/* harmony import */ var _libraries_video_shared_eventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/video/shared/eventHandler.js */ "./libraries/video/shared/eventHandler.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + + + + + + + + +/** + * @typedef {import('../libraries/video/constants/ortb.js').OrtbVideoParams} OrtbVideoParams + * @typedef {import('../libraries/video/shared/state.js').State} State + * @typedef {import('../modules/videoModule/coreVideo.js').VideoProvider} VideoProvider + * @typedef {import('../modules/videoModule/coreVideo.js').videoProviderConfig} videoProviderConfig + */ + +/** + * @class + * @param {videoProviderConfig} config + * @param {Object} jwplayer_ - JW Player global factory + * @param {State} adState_ + * @param {State} timeState_ + * @param {CallbackStorage} callbackStorage_ + * @param {Object} utils + * @returns {VideoProvider} + */ +function JWPlayerProvider(config, jwplayer_, adState_, timeState_, callbackStorage_, utils, sharedUtils) { + const jwplayer = jwplayer_; + let player = null; + let playerVersion = null; + const playerConfig = config.playerConfig; + const divId = config.divId; + let adState = adState_; + let timeState = timeState_; + let callbackStorage = callbackStorage_; + let pendingSeek = {}; + let supportedMediaTypes = null; + let minimumSupportedPlayerVersion = '8.20.1'; + let setupCompleteCallbacks = []; + let setupFailedCallbacks = []; + const MEDIA_TYPES = [_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_MIME_TYPE.MP4, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_MIME_TYPE.OGG, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_MIME_TYPE.WEBM, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_MIME_TYPE.AAC, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO_MIME_TYPE.HLS]; + let height = null; + let width = null; + function init() { + if (!jwplayer) { + triggerSetupFailure({ + code: -1 + }); // TODO: come up with error code schema- player is absent + return; + } + playerVersion = jwplayer.version; + if (playerVersion < minimumSupportedPlayerVersion) { + triggerSetupFailure({ + code: -2 + }); // TODO: come up with error code schema - version not supported + return; + } + if (!document.getElementById(divId)) { + triggerSetupFailure({ + code: -3 + }); // TODO: come up with error code schema - missing div id + return; + } + player = jwplayer(divId); + if (!player || !player.getState) { + triggerSetupFailure({ + code: -4 + }); // TODO: come up with error code schema - factory function failure + } else if (player.getState() === undefined) { + setupPlayer(playerConfig); + } else { + triggerSetupComplete(); + } + } + function getId() { + return divId; + } + function getOrtbVideo() { + if (!player) { + return; + } + const config = player.getConfig() || {}; + const adConfig = config.advertising || {}; + supportedMediaTypes = supportedMediaTypes || utils.getSupportedMediaTypes(MEDIA_TYPES); + if (height === null) { + height = utils.getPlayerHeight(player, config); + } + if (width === null) { + width = utils.getPlayerWidth(player, config); + } + if (config.aspectratio && !height && !width) { + const size = utils.getPlayerSizeFromAspectRatio(player, config); + height = size.height; + width = size.width; + } + const video = { + mimes: supportedMediaTypes, + protocols: [_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PROTOCOLS.VAST_2_0, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PROTOCOLS.VAST_3_0, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PROTOCOLS.VAST_4_0, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PROTOCOLS.VAST_2_0_WRAPPER, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PROTOCOLS.VAST_3_0_WRAPPER, _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PROTOCOLS.VAST_4_0_WRAPPER], + h: height, + w: width, + startdelay: utils.getStartDelay(), + placement: utils.getPlacement(adConfig, player), + // linearity is omitted because both forms are supported. + // sequence - TODO not yet supported + battr: adConfig.battr, + maxextended: -1, + // extension is allowed, and there is no time limit imposed. + boxingallowed: 1, + playbackmethod: [utils.getPlaybackMethod(config)], + playbackend: 1, + // TODO: need to account for floating player - https://developer.jwplayer.com/jwplayer/docs/jw8-embed-an-outstream-player , https://developer.jwplayer.com/jwplayer/docs/jw8-player-configuration-reference#section-float-on-scroll + // companionad - TODO add in future version + // companiontype - TODO add in future version + // minbitrate - TODO add in future version + // maxbitrate - TODO add in future version + // delivery - omitted because all are supported. + // minduration - Is there value to specifying ? + // maxduration - Is there value to specifying ? + api: [_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.API_FRAMEWORKS.VPAID_2_0] + }; + if (utils.isOmidSupported(adConfig.adClient)) { + video.api.push(_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.API_FRAMEWORKS.OMID_1_0); + } + Object.assign(video, utils.getSkipParams(adConfig)); + if (player.getFullscreen()) { + // TODO does player call need optimization ? + // only specify ad position when in Fullscreen since computational cost is low + // ad position options are listed in oRTB 2.5 section 5.4 + // https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf + video.pos = _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.AD_POSITION.FULL_SCREEN; // TODO make constant in oRTB + } + return video; + } + function getOrtbContent() { + if (!player) { + return; + } + const item = player.getPlaylistItem() || {}; // TODO does player call need optimization ? + let { + duration, + playbackMode + } = timeState.getState(); + if (duration === undefined) { + duration = player.getDuration(); + } + const content = { + url: item.file, + title: item.title, + cat: item.iabCategories, + keywords: item.tags, + len: duration, + embeddable: 1 + }; + if (playbackMode !== undefined) { + content.livestream = Math.min(playbackMode, 1); + } + const mediaId = item.mediaid; + if (mediaId) { + content.id = 'jw_' + mediaId; + } + const jwpseg = item.jwpseg; + const dataSegment = utils.getSegments(jwpseg); + const contentDatum = utils.getContentDatum(mediaId, dataSegment); + if (contentDatum) { + content.data = [contentDatum]; + } + const isoLanguageCode = utils.getIsoLanguageCode(player); + if (isoLanguageCode) { + content.language = isoLanguageCode; + } + return content; + } + function setAdTagUrl(adTagUrl, options) { + if (!player) { + return; + } + player.playAd(adTagUrl || options.adXml, options); + } + function setAdXml(vastXml, options) { + if (!player || !vastXml) { + return; + } + player.loadAdXml(vastXml, options); + } + function onEvent(externalEventName, callback, basePayload) { + if (externalEventName === _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_COMPLETE) { + setupCompleteCallbacks.push(callback); + return; + } + if (externalEventName === _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_FAILED) { + setupFailedCallbacks.push(callback); + return; + } + if (!player) { + return; + } + let getEventPayload; + switch (externalEventName) { + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_REQUEST: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_PLAY: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_PAUSE: + getEventPayload = e => ({ + adTagUrl: e.tag + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_BREAK_START: + getEventPayload = e => { + timeState.clearState(); + return { + offset: e.adPosition + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_LOADED: + getEventPayload = e => { + adState.updateForEvent(e); + const adConfig = player.getConfig().advertising; + adState.updateState(utils.getSkipParams(adConfig)); + return adState.getState(); + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_STARTED: + // JW Player adImpression fires when the ad starts, regardless of viewability. + getEventPayload = () => adState.getState(); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_IMPRESSION: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_CLICK: + getEventPayload = () => Object.assign({}, adState.getState(), timeState.getState()); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_TIME: + getEventPayload = e => { + timeState.updateForEvent(e); + return { + adTagUrl: e.tag, + time: e.position, + duration: e.duration + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_SKIPPED: + getEventPayload = e => { + adState.clearState(); + return { + time: e.position, + duration: e.duration + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_ERROR: + getEventPayload = e => { + const extraPayload = Object.assign({ + playerErrorCode: e.adErrorCode, + vastErrorCode: e.code, + errorMessage: e.message, + sourceError: e.sourceError + // timeout + }, adState.getState(), timeState.getState()); + adState.clearState(); + return extraPayload; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_COMPLETE: + getEventPayload = e => { + adState.clearState(); + return { + adTagUrl: e.tag + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_BREAK_END: + getEventPayload = e => ({ + offset: e.adPosition + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAYLIST: + getEventPayload = e => { + const playlistItemCount = e.playlist.length; + return { + playlistItemCount, + autostart: player.getConfig().autostart + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAYBACK_REQUEST: + getEventPayload = e => ({ + playReason: e.playReason + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AUTOSTART_BLOCKED: + getEventPayload = e => ({ + sourceError: e.error, + errorCode: e.code, + errorMessage: e.message + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAY_ATTEMPT_FAILED: + getEventPayload = e => ({ + playReason: e.playReason, + sourceError: e.sourceError, + errorCode: e.code, + errorMessage: e.message + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.CONTENT_LOADED: + getEventPayload = e => { + const { + item, + index + } = e; + return { + contentId: item.mediaid, + contentUrl: item.file, + // cover other sources ? util ? + title: item.title, + description: item.description, + playlistIndex: index, + contentTags: item.tags + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.BUFFER: + getEventPayload = () => timeState.getState(); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.TIME: + getEventPayload = e => { + timeState.updateForEvent(e); + return { + position: e.position, + duration: e.duration + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SEEK_START: + getEventPayload = e => { + const duration = e.duration; + const offset = e.offset; + pendingSeek = { + duration, + offset + }; + return { + position: e.position, + destination: offset, + duration: duration + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SEEK_END: + getEventPayload = () => { + const extraPayload = { + position: pendingSeek.offset, + duration: pendingSeek.duration + }; + pendingSeek = {}; + return extraPayload; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.MUTE: + getEventPayload = e => ({ + mute: e.mute + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.VOLUME: + getEventPayload = e => ({ + volumePercentage: e.volume + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.RENDITION_UPDATE: + getEventPayload = e => { + const bitrate = e.bitrate; + const level = e.level; + return { + videoReportedBitrate: bitrate, + audioReportedBitrate: bitrate, + encodedVideoWidth: level.width, + encodedVideoHeight: level.height, + videoFramerate: e.frameRate + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.ERROR: + getEventPayload = e => ({ + sourceError: e.sourceError, + errorCode: e.code, + errorMessage: e.message + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.COMPLETE: + getEventPayload = e => timeState.clearState(); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.FULLSCREEN: + getEventPayload = e => ({ + fullscreen: e.fullscreen + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAYER_RESIZE: + getEventPayload = e => { + height = e.height; + width = e.width; + return { + height, + width + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.VIEWABLE: + getEventPayload = e => ({ + viewable: e.viewable, + viewabilityPercentage: player.getPercentViewable() * 100 + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.CAST: + getEventPayload = e => ({ + casting: e.active + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAY: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PAUSE: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAYLIST_COMPLETE: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.DESTROYED: + break; + default: + return; + } + const jwEventName = utils.getJwEvent(externalEventName); + const eventHandler = (0,_libraries_video_shared_eventHandler_js__WEBPACK_IMPORTED_MODULE_2__.getEventHandler)(externalEventName, callback, basePayload, getEventPayload); + player.on(jwEventName, eventHandler); + callbackStorage.storeCallback(externalEventName, eventHandler, callback); + } + function offEvent(event, callback) { + const jwEvent = utils.getJwEvent(event); + if (!callback) { + player.off(jwEvent); + return; + } + const eventHandler = callbackStorage.getCallback(event, callback); + if (!eventHandler) { + return; + } + player.off(jwEvent, eventHandler); + } + function destroy() { + if (!player) { + return; + } + player.remove(); + player = null; + } + return { + init, + getId, + getOrtbVideo, + getOrtbContent, + setAdTagUrl, + setAdXml, + onEvent, + offEvent, + destroy + }; + function setupPlayer(config) { + if (!config) { + return; + } + player.setup(utils.getJwConfig(config)).on('ready', triggerSetupComplete).on('setupError', triggerSetupFailure); + } + function triggerSetupComplete() { + if (!setupCompleteCallbacks.length) { + return; + } + const payload = getSetupCompletePayload(); + setupCompleteCallbacks.forEach(callback => callback(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_COMPLETE, payload)); + setupCompleteCallbacks = []; + } + function getSetupCompletePayload() { + return { + divId, + playerVersion, + type: _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_COMPLETE, + viewable: player.getViewable(), + viewabilityPercentage: player.getPercentViewable() * 100, + mute: player.getMute(), + volumePercentage: player.getVolume() + }; + } + function triggerSetupFailure(e) { + if (!setupFailedCallbacks.length) { + return; + } + const payload = { + divId, + playerVersion, + type: _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_FAILED, + errorCode: e.code, + errorMessage: e.message, + sourceError: e.sourceError + }; + setupFailedCallbacks.forEach(callback => callback(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_FAILED, payload)); + setupFailedCallbacks = []; + } +} + +/** + * @param {videoProviderConfig} config + * @param {sharedUtils} sharedUtils + * @returns {VideoProvider} + */ +const jwplayerSubmoduleFactory = function (config, sharedUtils) { + const adState = adStateFactory(); + const timeState = timeStateFactory(); + const callbackStorage = callbackStorageFactory(); + return JWPlayerProvider(config, window.jwplayer, adState, timeState, callbackStorage, utils, sharedUtils); +}; +jwplayerSubmoduleFactory.vendorCode = _libraries_video_constants_vendorCodes_js__WEBPACK_IMPORTED_MODULE_3__.JWPLAYER_VENDOR; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('video', jwplayerSubmoduleFactory); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (jwplayerSubmoduleFactory); + +// HELPERS + +const utils = { + getJwConfig: function (config) { + if (!config) { + return; + } + const params = config.params || {}; + const jwConfig = params.vendorConfig || {}; + if (jwConfig.autostart === undefined && config.autoStart !== undefined) { + jwConfig.autostart = config.autoStart; + } + if (jwConfig.mute === undefined && config.mute !== undefined) { + jwConfig.mute = config.mute; + } + if (!jwConfig.key && config.licenseKey !== undefined) { + jwConfig.key = config.licenseKey; + } + if (config.setupAds === false) { + return jwConfig; + } + const advertising = jwConfig.advertising || { + client: 'vast' + }; + if (!jwConfig.file && !jwConfig.playlist && !jwConfig.source) { + // TODO verify accuracy + advertising.outstream = true; + } + const bids = advertising.bids || {}; + bids.prebid = true; + advertising.bids = bids; + jwConfig.advertising = advertising; + return jwConfig; + }, + getPlayerHeight: function (player, config) { + let height; + if (player.getHeight) { + height = player.getHeight(); + } + + // Height is undefined when player has not yet rendered + if (height !== undefined) { + return height; + } + return config.height; + }, + getPlayerWidth: function (player, config) { + let width; + if (player.getWidth) { + width = player.getWidth(); + } + + // Width is undefined when player has not yet rendered + if (width !== undefined) { + return width; + } + + // Width can be a string when aspectratio is set + if (typeof config.width === 'number') { + return config.width; + } + }, + getPlayerSizeFromAspectRatio: function (player, config) { + const aspectRatio = config.aspectratio; + let percentageWidth = config.width; + if (typeof aspectRatio !== 'string' || typeof percentageWidth !== 'string') { + return {}; + } + const ratios = aspectRatio.split(':'); + if (ratios.length !== 2) { + return {}; + } + const containerElement = player.getContainer && player.getContainer(); + if (!containerElement) { + return {}; + } + const containerWidth = containerElement.clientWidth; + const containerHeight = containerElement.clientHeight; + const xRatio = parseInt(ratios[0], 10); + const yRatio = parseInt(ratios[1], 10); + if (isNaN(xRatio) || isNaN(yRatio)) { + return {}; + } + const numericWidthPercentage = parseInt(percentageWidth, 10); + const desiredWidth = containerWidth * numericWidthPercentage / 100; + const desiredHeight = Math.min(desiredWidth * yRatio / xRatio, containerHeight); + return { + height: desiredHeight, + width: desiredWidth + }; + }, + getJwEvent: function (eventName) { + switch (eventName) { + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_COMPLETE: + return 'ready'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SETUP_FAILED: + return 'setupError'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.DESTROYED: + return 'remove'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_STARTED: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_IMPRESSION; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AD_IMPRESSION: + return 'adViewableImpression'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAYBACK_REQUEST: + return 'playAttempt'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.AUTOSTART_BLOCKED: + return 'autostartNotAllowed'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.CONTENT_LOADED: + return 'playlistItem'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SEEK_START: + return 'seek'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.SEEK_END: + return 'seeked'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.RENDITION_UPDATE: + return 'visualQuality'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_1__.PLAYER_RESIZE: + return 'resize'; + default: + return eventName; + } + }, + getSkipParams: function (adConfig) { + const skipParams = {}; + const skipoffset = adConfig.skipoffset; + if (skipoffset !== undefined) { + const skippable = skipoffset >= 0; + skipParams.skip = skippable ? 1 : 0; + if (skippable) { + skipParams.skipmin = skipoffset + 2; + skipParams.skipafter = skipoffset; + } + } + return skipParams; + }, + getSupportedMediaTypes: function () { + let mediaTypes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + const el = document.createElement('video'); + return mediaTypes.filter(mediaType => el.canPlayType(mediaType)).concat(_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.VPAID_MIME_TYPE); // Always allow VPAIDs. + }, + getStartDelay: function () { + // todo calculate + // need to know which ad we are bidding on + // Might have to implement and set in Pb-video ; would required ad unit as param. + }, + /** + * Determine the ad placement + * @param {Object} adConfig + * @param {Object} player + * @return {PLACEMENT|OrtbVideoParams.placement|undefined} + */ + getPlacement: function (adConfig, player) { + if (!adConfig.outstream) { + // https://developer.jwplayer.com/jwplayer/docs/jw8-embed-an-outstream-player for more info on outstream + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.INSTREAM; + } + if (player.getFloating()) { + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.FLOATING; + } + const placement = adConfig.placement; + if (!placement) { + return; + } + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT[placement.toUpperCase()]; + }, + getPlaybackMethod: function (_ref) { + let { + autoplay, + mute, + autoplayAdsMuted + } = _ref; + if (autoplay) { + // Determine whether player is going to start muted. + const isMuted = mute || autoplayAdsMuted; // todo autoplayAdsMuted only applies to preRoll + return isMuted ? _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLAYBACK_METHODS.AUTOPLAY_MUTED : _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLAYBACK_METHODS.AUTOPLAY; + } + /* + TODO + could support the following with float player: + 5 Initiates on Entering Viewport with Sound On + 6 Initiates on Entering Viewport with Sound Off by Default + */ + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLAYBACK_METHODS.CLICK_TO_PLAY; + }, + /** + * Indicates if Omid is supported + * + * @param {string} adClient - The identifier of the ad plugin requesting the bid + * @returns {boolean} - support of omid + */ + isOmidSupported: function (adClient) { + const omidIsLoaded = window.OmidSessionClient !== undefined; + return omidIsLoaded && adClient === 'vast'; + }, + /** + * Gets ISO 639 language code of current audio track. + * @param {Object} player + * @returns {string|undefined} ISO 639 language code. + */ + getIsoLanguageCode: function (player) { + const audioTracks = player.getAudioTracks(); + if (!audioTracks || !audioTracks.length) { + return; + } + const currentTrackIndex = Math.max(player.getCurrentAudioTrack() || 0, 0); // returns -1 when there are no alternative tracks. + const audioTrack = audioTracks[currentTrackIndex]; + return audioTrack && audioTrack.language; + }, + /** + * Converts an array of jwpsegs into an array of data segments compliant with the oRTB content.data[index].segment + * @param {[String]} jwpsegs - jwplayer contextual targeting segments + * @return {[Object]|undefined} list of data segments compliant with the oRTB content.data[index].segment spec + */ + getSegments: function (jwpsegs) { + if (!jwpsegs || !jwpsegs.length) { + return; + } + const formattedSegments = jwpsegs.reduce((convertedSegments, rawSegment) => { + convertedSegments.push({ + id: rawSegment, + value: rawSegment + }); + return convertedSegments; + }, []); + return formattedSegments; + }, + /** + * Creates an object compliant with the oRTB content.data[index] spec. + * @param {String} mediaId - content identifier + * @param {[Object]} segments - list of data segments compliant with the oRTB content.data[index].segment spec + * @return {Object} - Object compliant with the oRTB content.data[index] spec. + */ + getContentDatum: function (mediaId, segments) { + if (!mediaId && !segments) { + return; + } + const contentData = { + name: 'jwplayer.com', + ext: {} + }; + if (mediaId) { + contentData.ext.cids = [mediaId]; + } + if (segments) { + contentData.segment = segments; + contentData.ext.segtax = 502; + } + return contentData; + } +}; + +/** + * Tracks which functions are attached to events + * @typedef CallbackStorage + * @function storeCallback + * @function getCallback + * @function clearStorage + */ + +/** + * @returns {CallbackStorage} + */ +function callbackStorageFactory() { + let storage = {}; + function storeCallback(eventType, eventHandler, callback) { + let eventHandlers = storage[eventType]; + if (!eventHandlers) { + eventHandlers = storage[eventType] = {}; + } + eventHandlers[callback] = eventHandler; + } + function getCallback(eventType, callback) { + let eventHandlers = storage[eventType]; + if (!eventHandlers) { + return; + } + const eventHandler = eventHandlers[callback]; + delete eventHandlers[callback]; + return eventHandler; + } + function clearStorage() { + storage = {}; + } + return { + storeCallback, + getCallback, + clearStorage + }; +} + +// STATE + +/** + * @returns {State} + */ +function adStateFactory() { + const adState = Object.assign({}, (0,_libraries_video_shared_state_js__WEBPACK_IMPORTED_MODULE_5__["default"])()); + function updateForEvent(event) { + const updates = { + adTagUrl: event.tag, + offset: event.adPosition, + loadTime: event.timeLoading, + vastAdId: event.id, + // TODO: delete from spec!! seems JW Player specific + adDescription: event.description, + adServer: event.adsystem, + adTitle: event.adtitle, + advertiserId: event.advertiserId, + advertiserName: event.advertiser, + dealId: event.dealId, + // adCategories + linear: event.linear, + vastVersion: event.vastversion, + // campaignId: + creativeUrl: event.mediaFile, + // TODO: per AP, mediafile might be object w/ file property. verify + adId: event.adId, + universalAdId: event.universalAdId, + creativeId: event.creativeAdId, + creativeType: event.creativetype, + redirectUrl: event.clickThroughUrl, + adPlacementType: convertPlacementToOrtbCode(event.placement), + waterfallIndex: event.witem, + waterfallCount: event.wcount, + adPodCount: event.podcount, + adPodIndex: event.sequence, + wrapperAdIds: event.wrapperAdIds + }; + if (event.client === 'googima' && !updates.wrapperAdIds) { + updates.wrapperAdIds = parseImaAdWrapperIds(event); + } + this.updateState(updates); + } + adState.updateForEvent = updateForEvent; + function convertPlacementToOrtbCode(placement) { + switch (placement) { + case 'instream': + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.INSTREAM; + case 'banner': + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.BANNER; + case 'article': + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.ARTICLE; + case 'feed': + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.FEED; + case 'interstitial': + case 'slider': + case 'floating': + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_0__.PLACEMENT.INTERSTITIAL_SLIDER_FLOATING; + } + } + function parseImaAdWrapperIds(adEvent) { + const ima = adEvent.ima; + const ad = ima && ima.ad; + if (!ad) { + return; + } + const adProperties = Object.keys(ad); + adProperties.forEach(property => { + const value = ad[property]; + const wrapperIds = value.adWrapperIds; + if (wrapperIds) { + return wrapperIds; + } + }); + } + return adState; +} + +/** + * @returns {State} + */ +function timeStateFactory() { + const timeState = Object.assign({}, (0,_libraries_video_shared_state_js__WEBPACK_IMPORTED_MODULE_5__["default"])()); + function updateForEvent(event) { + const { + position, + duration + } = event; + this.updateState({ + time: position, + duration, + playbackMode: getPlaybackMode(duration) + }); + } + timeState.updateForEvent = updateForEvent; + function getPlaybackMode(duration) { + if (duration > 0) { + return _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_6__.PLAYBACK_MODE.VOD; + } else if (duration < 0) { + return _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_6__.PLAYBACK_MODE.DVR; + } + return _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_6__.PLAYBACK_MODE.LIVE; + } + return timeState; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('jwplayerVideoProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["video","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/jwplayerVideoProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kargoAnalyticsAdapter"],{ + +/***/ "./modules/kargoAnalyticsAdapter.js": +/*!******************************************!*\ + !*** ./modules/kargoAnalyticsAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + +const EVENT_URL = 'https://krk.kargo.com/api/v1/event'; +const KARGO_BIDDER_CODE = 'kargo'; +const analyticsType = 'endpoint'; +let _initOptions = {}; +let _logBidResponseData = { + auctionId: '', + auctionTimeout: 0, + responseTime: 0 +}; +let _bidResponseDataLogged = []; +var kargoAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT: + { + _logBidResponseData.auctionTimeout = args.timeout; + break; + } + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE: + { + handleBidResponseData(args); + break; + } + } + } +}); + +// handleBidResponseData: Get auction data for Kargo bids and send to server +function handleBidResponseData(bidResponse) { + // Verify this is Kargo and we haven't seen this auction data yet + if (bidResponse.bidder !== KARGO_BIDDER_CODE || _bidResponseDataLogged.includes(bidResponse.auctionId) !== false) { + return; + } + _logBidResponseData.auctionId = bidResponse.auctionId; + _logBidResponseData.responseTime = bidResponse.timeToRespond; + sendAuctionData(_logBidResponseData); +} + +// sendAuctionData: Send auction data to the server +function sendAuctionData(data) { + try { + _bidResponseDataLogged.push(data.auctionId); + if (!shouldFireEventRequest()) { + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(`${EVENT_URL}/auction-data`, null, { + aid: data.auctionId, + ato: data.auctionTimeout, + rt: data.responseTime, + it: 0 + }, { + method: 'GET' + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Error sending auction data: ', err); + } +} + +// Sampling rate out of 100 +function shouldFireEventRequest() { + const samplingRate = _initOptions && _initOptions.sampling || 100; + return Math.floor(Math.random() * 100) + 1 <= parseInt(samplingRate); +} +kargoAnalyticsAdapter.originEnableAnalytics = kargoAnalyticsAdapter.enableAnalytics; +kargoAnalyticsAdapter.enableAnalytics = function (config) { + _initOptions = config.options; + kargoAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: kargoAnalyticsAdapter, + code: 'kargo' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (kargoAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('kargoAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kargoAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kargoBidAdapter"],{ + +/***/ "./modules/kargoBidAdapter.js": +/*!************************************!*\ + !*** ./modules/kargoBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +const PREBID_VERSION = "9.45.0-pre"; +const BIDDER = Object.freeze({ + CODE: 'kargo', + HOST: 'krk2.kargo.com', + REQUEST_METHOD: 'POST', + REQUEST_ENDPOINT: '/api/v1/prebid', + TIMEOUT_ENDPOINT: '/api/v1/event/timeout', + GVLID: 972, + SUPPORTED_MEDIA_TYPES: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] +}); +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER.CODE +}); +const CURRENCY = Object.freeze({ + KEY: 'currency', + US_DOLLAR: 'USD' +}); +const REQUEST_KEYS = Object.freeze({ + USER_DATA: 'ortb2.user.data', + SOCIAL_CANVAS: 'params.socialCanvas', + SUA: 'ortb2.device.sua', + TDID_ADAPTER: 'userId.tdid' +}); +const SUA = Object.freeze({ + BROWSERS: 'browsers', + MOBILE: 'mobile', + MODEL: 'model', + PLATFORM: 'platform', + SOURCE: 'source' +}); +const SUA_ATTRIBUTES = [SUA.BROWSERS, SUA.MOBILE, SUA.MODEL, SUA.SOURCE, SUA.PLATFORM]; +const CERBERUS = Object.freeze({ + KEY: 'krg_crb', + SYNC_URL: 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&gdpr={GDPR}&gdpr_consent={GDPR_CONSENT}&us_privacy={US_PRIVACY}&gpp={GPP_STRING}&gpp_sid={GPP_SID}', + SYNC_COUNT: 5, + PAGE_VIEW_ID: 'pageViewId', + PAGE_VIEW_TIMESTAMP: 'pageViewTimestamp', + PAGE_VIEW_URL: 'pageViewUrl' +}); +let sessionId, lastPageUrl, requestCounter; +function isBidRequestValid(bid) { + if (!bid || !bid.params) { + return false; + } + return !!bid.params.placementId; +} +function buildRequests(validBidRequests, bidderRequest) { + const currencyObj = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(CURRENCY.KEY); + const currency = currencyObj && currencyObj.adServerCurrency ? currencyObj.adServerCurrency : null; + const impressions = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__._each)(validBidRequests, bid => { + impressions.push(getImpression(bid)); + }); + const firstBidRequest = validBidRequests[0]; + const tdidAdapter = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(firstBidRequest, REQUEST_KEYS.TDID_ADAPTER); + const metadata = getAllMetadata(bidderRequest); + const krakenParams = Object.assign({}, { + pbv: PREBID_VERSION, + aid: firstBidRequest.auctionId, + sid: _getSessionId(), + url: metadata.pageURL, + timeout: bidderRequest.timeout, + ts: new Date().getTime(), + device: { + size: [window.screen.width, window.screen.height] + }, + imp: impressions, + user: getUserIds(tdidAdapter, bidderRequest.uspConsent, bidderRequest.gdprConsent, firstBidRequest.userIdAsEids, bidderRequest.gppConsent), + ext: getExtensions(firstBidRequest.ortb2, bidderRequest?.refererInfo) + }); + + // Add site.cat if it exists + if (firstBidRequest.ortb2?.site?.cat != null) { + krakenParams.site = { + cat: firstBidRequest.ortb2.site.cat + }; + } + + // Add schain + if (firstBidRequest.schain && firstBidRequest.schain.nodes) { + krakenParams.schain = firstBidRequest.schain; + } + + // Add user data object if available + krakenParams.user.data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(firstBidRequest, REQUEST_KEYS.USER_DATA) || []; + const reqCount = getRequestCount(); + if (reqCount != null) { + krakenParams.requestCount = reqCount; + } + + // Add currency if not USD + if (currency != null && currency != CURRENCY.US_DOLLAR) { + krakenParams.cur = currency; + } + if (metadata.rawCRB != null) { + krakenParams.rawCRB = metadata.rawCRB; + } + if (metadata.rawCRBLocalStorage != null) { + krakenParams.rawCRBLocalStorage = metadata.rawCRBLocalStorage; + } + + // Pull Social Canvas segments and embed URL + const socialCanvas = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(firstBidRequest, REQUEST_KEYS.SOCIAL_CANVAS); + if (socialCanvas != null) { + krakenParams.socan = socialCanvas; + } + + // User Agent Client Hints / SUA + const uaClientHints = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(firstBidRequest, REQUEST_KEYS.SUA); + if (uaClientHints) { + const suaValidAttributes = []; + SUA_ATTRIBUTES.forEach(suaKey => { + const suaValue = uaClientHints[suaKey]; + if (!suaValue) { + return; + } + + // Do not pass any empty strings + if (typeof suaValue == 'string' && suaValue.trim() === '') { + return; + } + switch (suaKey) { + case SUA.MOBILE && suaValue < 1: // Do not pass 0 value for mobile + case SUA.SOURCE && suaValue < 1: + // Do not pass 0 value for source + break; + default: + suaValidAttributes.push(suaKey); + } + }); + krakenParams.device.sua = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(uaClientHints, suaValidAttributes); + } + const validPageId = getLocalStorageSafely(CERBERUS.PAGE_VIEW_ID) != null; + const validPageTimestamp = getLocalStorageSafely(CERBERUS.PAGE_VIEW_TIMESTAMP) != null; + const validPageUrl = getLocalStorageSafely(CERBERUS.PAGE_VIEW_URL) != null; + const page = {}; + if (validPageId) { + page.id = getLocalStorageSafely(CERBERUS.PAGE_VIEW_ID); + } + if (validPageTimestamp) { + page.timestamp = Number(getLocalStorageSafely(CERBERUS.PAGE_VIEW_TIMESTAMP)); + } + if (validPageUrl) { + page.url = getLocalStorageSafely(CERBERUS.PAGE_VIEW_URL); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(page)) { + krakenParams.page = page; + } + if (krakenParams.ext && Object.keys(krakenParams.ext).length === 0) { + delete krakenParams.ext; + } + return Object.assign({}, bidderRequest, { + method: BIDDER.REQUEST_METHOD, + url: `https://${BIDDER.HOST}${BIDDER.REQUEST_ENDPOINT}`, + data: krakenParams, + currency: currency + }); +} +function interpretResponse(response, bidRequest) { + const bids = response.body; + const fledgeAuctionConfigs = []; + const bidResponses = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(bids) || typeof bids !== 'object') { + return bidResponses; + } + for (const [bidID, adUnit] of Object.entries(bids)) { + let meta = { + mediaType: adUnit.mediaType && BIDDER.SUPPORTED_MEDIA_TYPES.includes(adUnit.mediaType) ? adUnit.mediaType : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + }; + if (adUnit.metadata?.landingPageDomain) { + meta.clickUrl = adUnit.metadata.landingPageDomain[0]; + meta.advertiserDomains = adUnit.metadata.landingPageDomain; + } + const bidResponse = { + requestId: bidID, + cpm: Number(adUnit.cpm), + width: adUnit.width, + height: adUnit.height, + ttl: 300, + creativeId: adUnit.creativeID, + dealId: adUnit.targetingCustom, + netRevenue: true, + currency: adUnit.currency || bidRequest.currency, + mediaType: meta.mediaType, + meta: meta + }; + if (meta.mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + if (adUnit.admUrl) { + bidResponse.vastUrl = adUnit.admUrl; + } else { + bidResponse.vastXml = adUnit.adm; + } + } else { + bidResponse.ad = adUnit.adm; + } + bidResponses.push(bidResponse); + if (adUnit.auctionConfig) { + fledgeAuctionConfigs.push({ + bidId: bidID, + config: adUnit.auctionConfig + }); + } + } + if (fledgeAuctionConfigs.length > 0) { + return { + bids: bidResponses, + paapi: fledgeAuctionConfigs + }; + } else { + return bidResponses; + } +} +function getUserSyncs(syncOptions, _, gdprConsent, usPrivacy, gppConsent) { + const syncs = []; + const seed = _generateRandomUUID(); + const clientId = getClientId(); + var gdpr = gdprConsent && gdprConsent.gdprApplies ? 1 : 0; + var gdprConsentString = gdprConsent && gdprConsent.consentString ? gdprConsent.consentString : ''; + var gppString = gppConsent && gppConsent.consentString ? gppConsent.consentString : ''; + var gppApplicableSections = gppConsent && gppConsent.applicableSections && Array.isArray(gppConsent.applicableSections) ? gppConsent.applicableSections.join(',') : ''; + + // don't sync if opted out via usPrivacy + if (typeof usPrivacy == 'string' && usPrivacy.length == 4 && usPrivacy[0] == 1 && usPrivacy[2] == 'Y') { + return syncs; + } + if (syncOptions.iframeEnabled && seed && clientId) { + syncs.push({ + type: 'iframe', + url: CERBERUS.SYNC_URL.replace('{UUID}', clientId).replace('{SEED}', seed).replace('{GDPR}', gdpr).replace('{GDPR_CONSENT}', gdprConsentString).replace('{US_PRIVACY}', usPrivacy || '').replace('{GPP_STRING}', gppString).replace('{GPP_SID}', gppApplicableSections) + }); + } + return syncs; +} +function onTimeout(timeoutData) { + if (timeoutData == null) { + return; + } + timeoutData.forEach(bid => { + sendTimeoutData(bid.auctionId, bid.timeout); + }); +} +function getExtensions(ortb2, refererInfo) { + const ext = {}; + if (ortb2) ext.ortb2 = ortb2; + if (refererInfo) ext.refererInfo = refererInfo; + return ext; +} +function _generateRandomUUID() { + try { + // crypto.getRandomValues is supported everywhere but Opera Mini for years + var buffer = new Uint8Array(16); + crypto.getRandomValues(buffer); + buffer[6] = buffer[6] & ~176 | 64; + buffer[8] = buffer[8] & ~64 | 128; + var hex = Array.prototype.map.call(new Uint8Array(buffer), function (x) { + return ('00' + x.toString(16)).slice(-2); + }).join(''); + return hex.slice(0, 8) + '-' + hex.slice(8, 12) + '-' + hex.slice(12, 16) + '-' + hex.slice(16, 20) + '-' + hex.slice(20); + } catch (e) { + return ''; + } +} +function _getCrb() { + let localStorageCrb = getCrbFromLocalStorage(); + if (Object.keys(localStorageCrb).length) { + return localStorageCrb; + } + return getCrbFromCookie(); +} +function _getSessionId() { + if (!sessionId) { + sessionId = _generateRandomUUID(); + } + return sessionId; +} +function getCrbFromCookie() { + try { + const crb = JSON.parse(STORAGE.getCookie(CERBERUS.KEY)); + if (crb && crb.v) { + let vParsed = JSON.parse(atob(crb.v)); + if (vParsed) { + return vParsed; + } + } + return {}; + } catch (e) { + return {}; + } +} +function getCrbFromLocalStorage() { + try { + return JSON.parse(atob(getLocalStorageSafely(CERBERUS.KEY))); + } catch (e) { + return {}; + } +} +function getLocalStorageSafely(key) { + try { + return STORAGE.getDataFromLocalStorage(key); + } catch (e) { + return null; + } +} +function getUserIds(tdidAdapter, usp, gdpr, eids, gpp) { + const crb = spec._getCrb(); + const userIds = { + crbIDs: crb.syncIds || {} + }; + + // Pull Trade Desk ID + if (!tdidAdapter && crb.tdID) { + userIds.tdID = crb.tdID; + } else if (tdidAdapter) { + userIds.tdID = tdidAdapter; + } + + // USP + if (usp) { + userIds.usp = usp; + } + + // GDPR + if (gdpr) { + userIds.gdpr = { + consent: gdpr.consentString || '', + applies: !!gdpr.gdprApplies + }; + } + + // Kargo ID + if (crb.lexId != null) { + userIds.kargoID = crb.lexId; + } + + // Client ID + if (crb.clientId != null) { + userIds.clientID = crb.clientId; + } + + // Opt Out + if (crb.optOut != null) { + userIds.optOut = crb.optOut; + } + + // User ID Sub-Modules (userIdAsEids) + if (eids != null) { + userIds.sharedIDEids = eids; + } + + // GPP + if (gpp) { + const parsedGPP = {}; + if (gpp.consentString) { + parsedGPP.gppString = gpp.consentString; + } + if (gpp.applicableSections) { + parsedGPP.applicableSections = gpp.applicableSections; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(parsedGPP)) { + userIds.gpp = parsedGPP; + } + } + return userIds; +} +function getClientId() { + const crb = spec._getCrb(); + return crb.clientId; +} +function getAllMetadata(bidderRequest) { + return { + pageURL: bidderRequest?.refererInfo?.page, + rawCRB: STORAGE.getCookie(CERBERUS.KEY), + rawCRBLocalStorage: getLocalStorageSafely(CERBERUS.KEY) + }; +} +function getRequestCount() { + if (lastPageUrl === window.location.pathname) { + return ++requestCounter; + } + lastPageUrl = window.location.pathname; + return requestCounter = 0; +} +function sendTimeoutData(auctionId, auctionTimeout) { + const params = { + aid: auctionId, + ato: auctionTimeout + }; + const timeoutRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.buildUrl)({ + protocol: 'https', + hostname: BIDDER.HOST, + pathname: BIDDER.TIMEOUT_ENDPOINT, + search: params + }); + fetch(timeoutRequestUrl, { + method: 'GET', + keepalive: true + }).catch(e => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Kargo: sendTimeoutData/fetch threw an error: ', e); + }); +} +function getImpression(bid) { + const imp = { + id: bid.bidId, + tid: bid.ortb2Imp?.ext?.tid, + pid: bid.params.placementId, + code: bid.adUnitCode + }; + if (bid.bidRequestsCount > 0) { + imp.bidRequestCount = bid.bidRequestsCount; + } + if (bid.bidderRequestsCount > 0) { + imp.bidderRequestCount = bid.bidderRequestsCount; + } + if (bid.bidderWinsCount > 0) { + imp.bidderWinCount = bid.bidderWinsCount; + } + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + imp.fpd = { + gpid: gpid + }; + } + + // Add full ortb2Imp object as backup + if (bid.ortb2Imp) { + imp.ext = { + ortb2Imp: bid.ortb2Imp + }; + } + if (bid.mediaTypes) { + const { + banner, + video, + native + } = bid.mediaTypes; + if (banner) { + imp.banner = banner; + } + if (video) { + imp.video = video; + } + if (native) { + imp.native = native; + } + if (typeof bid.getFloor === 'function') { + let floorInfo; + try { + floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Kargo: getFloor threw an error: ', e); + } + imp.floor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined; + } + } + return imp; +} +const spec = { + gvlid: BIDDER.GVLID, + code: BIDDER.CODE, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + supportedMediaTypes: BIDDER.SUPPORTED_MEDIA_TYPES, + onTimeout, + _getCrb, + _getSessionId +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('kargoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kargoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kimberliteBidAdapter"],{ + +/***/ "./modules/kimberliteBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/kimberliteBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT_URL, spec, expandAuctionMacros */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/processors/mediaType.js */ "./libraries/ortbConverter/processors/mediaType.js"); + + + + + + +const VERSION = '1.1.0'; +const BIDDER_CODE = 'kimberlite'; +const METHOD = 'POST'; +const ENDPOINT_URL = 'https://kimberlite.io/rtb/bid/pbjs'; +const VERSION_INFO = { + ver: "9.45.0-pre", + adapterVer: `${VERSION}` +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300 + }, + request(buildRequest, imps, bidderRequest, context) { + const bidRequest = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bidRequest, 'site.publisher.domain', bidderRequest.refererInfo.domain); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bidRequest, 'site.page', bidderRequest.refererInfo.page); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bidRequest, 'ext.prebid.ver', VERSION_INFO.ver); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bidRequest, 'ext.prebid.adapterVer', VERSION_INFO.adapterVer); + bidRequest.at = 1; + return bidRequest; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + imp.tagid = bidRequest.params.placementId; + return imp; + }, + bidResponse: function (buildBidResponse, bid, context) { + if (!bid.price) return; + const [type] = Object.keys(context.bidRequest.mediaTypes); + if (Object.values(_libraries_ortbConverter_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_2__.ORTB_MTYPES).includes(type)) { + context.mediaType = type; + } + bid.adm = expandAuctionMacros(bid.adm, bid.price, context.ortbResponse.cur); + if (bid.nurl && bid.nurl != '') { + bid.nurl = expandAuctionMacros(bid.nurl, bid.price, context.ortbResponse.cur); + } + const bidResponse = buildBidResponse(bid, context); + return bidResponse; + } +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + isBidRequestValid: function () { + let bidRequest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const { + params, + mediaTypes + } = bidRequest; + let isValid = Boolean(params && params.placementId); + if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER]) { + isValid = isValid && Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER].sizes); + } else if (mediaTypes && mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO]) { + isValid = isValid && Boolean(mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO].mimes); + } else { + isValid = false; + } + return isValid; + }, + buildRequests: function (bidRequests, bidderRequest) { + return { + method: METHOD, + url: ENDPOINT_URL, + data: converter.toORTB({ + bidRequests, + bidderRequest + }) + }; + }, + interpretResponse(serverResponse, bidRequest) { + const bids = converter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + return bids; + } +}; +function expandAuctionMacros(str, price, currency) { + if (!str) return; + const defaultCurrency = 'RUB'; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.replaceMacros)(str, { + AUCTION_PRICE: price, + AUCTION_CURRENCY: currency || defaultCurrency + }); +} +; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('kimberliteBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kimberliteBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kinessoIdSystem"],{ + +/***/ "./modules/kinessoIdSystem.js": +/*!************************************!*\ + !*** ./modules/kinessoIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export kinessoIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds KinessoId ID support to the User ID module + * The {@link module:modules/userId} module is required. + * @module modules/KinessoIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + */ + +const MODULE_NAME = 'kpuid'; +const ID_SVC = 'https://id.knsso.com/id'; +// These values should NEVER change. If +// they do, we're no longer making ulids! +const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32 +const ENCODING_LEN = ENCODING.length; +const TIME_MAX = Math.pow(2, 48) - 1; +const TIME_LEN = 10; +const RANDOM_LEN = 16; +const id = factory(); + +/** + * the factory to generate unique identifier based on time and current pseudorandom number + * @param {string} currPrng the current pseudorandom number generator + * @returns {function(*=): *} + */ +function factory(currPrng) { + if (!currPrng) { + currPrng = detectPrng(); + } + return function ulid(seedTime) { + if (isNaN(seedTime)) { + seedTime = Date.now(); + } + return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, currPrng); + }; +} + +/** + * gets a a random charcter from generated pseudorandom number + * @param {string} prng the generated pseudorandom number + * @returns {string} + */ +function randomChar(prng) { + let rand = Math.floor(prng() * ENCODING_LEN); + if (rand === ENCODING_LEN) { + rand = ENCODING_LEN - 1; + } + return ENCODING.charAt(rand); +} + +/** + * encodes random character + * @param {number} len + * @param {function(): number} prng + * @returns {string} + */ +function encodeRandom(len, prng) { + let str = ''; + for (; len > 0; len--) { + str = randomChar(prng) + str; + } + return str; +} + +/** + * encodes the time based on the length + * @param {number} now + * @param {number} len + * @returns {string} encoded time. + */ +function encodeTime(now, len) { + if (isNaN(now)) { + throw new Error(now + ' must be a number'); + } + if (Number.isInteger(now) === false) { + throw createError('time must be an integer'); + } + if (now > TIME_MAX) { + throw createError('cannot encode time greater than ' + TIME_MAX); + } + if (now < 0) { + throw createError('time must be positive'); + } + if (Number.isInteger(len) === false) { + throw createError('length must be an integer'); + } + if (len < 0) { + throw createError('length must be positive'); + } + let mod; + let str = ''; + for (; len > 0; len--) { + mod = now % ENCODING_LEN; + str = ENCODING.charAt(mod) + str; + now = (now - mod) / ENCODING_LEN; + } + return str; +} + +/** + * creates and logs the error message + * @function + * @param {string} message error message + * @returns {Error} + */ +function createError(message) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(message); + const err = new Error(message); + err.source = 'kinessoId'; + return err; +} + +/** + * detects the pseudorandom number generator and generates the random number + * @function + * @param {string} root + * @returns {string} a random number + */ +function detectPrng(root) { + if (!root) { + root = typeof window !== 'undefined' ? window : null; + } + const browserCrypto = root && (root.crypto || root.msCrypto); + if (browserCrypto) { + return () => { + const buffer = new Uint8Array(1); + browserCrypto.getRandomValues(buffer); + return buffer[0] / 0xff; + }; + } + return () => Math.random(); +} + +/** + * existing id generation call back + * @param {string} storedId + * @returns {{success: function(Object): void, error: function(): void}} + */ +function syncId(storedId) { + return { + success: function (responseBody) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('KinessoId: id to be synced: ' + storedId); + }, + error: function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('KinessoId: Sync error for id : ' + storedId); + } + }; +} + +/** + * Encode the id + * @param value + * @returns {string|*} + */ +function encodeId(value) { + const result = {}; + const knssoId = value && typeof value === 'string' ? value : undefined; + if (knssoId) { + result.kpuid = knssoId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('KinessoId: Decoded value ' + JSON.stringify(result)); + return result; + } + return knssoId; +} + +/** + * Builds and returns the shared Id URL with attached consent data if applicable + * @param {number} accountId + * @param {Object} consentData + * @return {string} + */ +function kinessoSyncUrl(accountId, consentData) { + const { + gdpr, + usp: usPrivacyString + } = consentData ?? {}; + let kinessoSyncUrl = `${ID_SVC}?accountid=${accountId}`; + if (usPrivacyString) { + kinessoSyncUrl = `${kinessoSyncUrl}&us_privacy=${usPrivacyString}`; + } + if (!gdpr || typeof gdpr.gdprApplies !== 'boolean' || !gdpr.gdprApplies) return kinessoSyncUrl; + kinessoSyncUrl = `${kinessoSyncUrl}&gdpr=1&gdpr_consent=${gdpr.consentString}`; + return kinessoSyncUrl; +} + +/** @type {Submodule} */ +const kinessoIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{kpuid:{id: string}}|undefined} + */ + decode(value) { + return value ? encodeId(value) : undefined; + }, + /** + * performs action to obtain id and return a value. + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData|undefined} consentData + * @returns {string|undefined} + */ + getId(config, consentData) { + const configParams = config && config.params || {}; + if (!configParams || typeof configParams.accountid !== 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('User ID - KinessoId submodule requires a valid accountid to be defined'); + return; + } + if (consentData?.coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('KinessoId: IDs not provided for coppa requests, exiting KinessoId'); + return; + } + const accountId = configParams.accountid; + const knnsoId = id(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('KinessoId: generated id ' + knnsoId); + const kinessoIdPayload = {}; + kinessoIdPayload.id = knnsoId; + const payloadString = JSON.stringify(kinessoIdPayload); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(kinessoSyncUrl(accountId, consentData), syncId(knnsoId), payloadString, { + method: 'POST', + withCredentials: true + }); + return { + 'id': knnsoId + }; + }, + eids: { + 'kpuid': { + source: 'kpuid.com', + atype: 3 + } + } +}; + +// Register submodule for userId +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', kinessoIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('kinessoIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kinessoIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kiviadsBidAdapter"],{ + +/***/ "./modules/kiviadsBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/kiviadsBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'kiviads'; +const AD_URL = 'https://lb.kiviads.com/pbjs'; +const SYNC_URL = 'https://sync.kiviads.com'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('kiviadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kiviadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["koblerBidAdapter"],{ + +/***/ "./modules/koblerBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/koblerBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports pageViewId, setAdditionalData, getAdditionalData, isBidRequestValid, buildRequests, interpretResponse, onBidWon, onTimeout, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + +const additionalData = new WeakMap(); +const pageViewId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +function setAdditionalData(obj, key, value) { + const prevValue = additionalData.get(obj) || {}; + additionalData.set(obj, { + ...prevValue, + [key]: value + }); +} +function getAdditionalData(obj, key) { + const data = additionalData.get(obj) || {}; + return data[key]; +} +const BIDDER_CODE = 'kobler'; +const BIDDER_ENDPOINT = 'https://bid.essrtb.com/bid/prebid_rtb_call'; +const DEV_BIDDER_ENDPOINT = 'https://bid-service.dev.essrtb.com/bid/prebid_rtb_call'; +const TIMEOUT_NOTIFICATION_ENDPOINT = 'https://bid.essrtb.com/notify/prebid_timeout'; +const SUPPORTED_CURRENCY = 'USD'; +const TIME_TO_LIVE_IN_SECONDS = 10 * 60; +const isBidRequestValid = function (bid) { + if (!bid || !bid.bidId) { + return false; + } + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner.sizes', bid.sizes); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(sizes) && sizes.length > 0; +}; +const buildRequests = function (validBidRequests, bidderRequest) { + const bidderEndpoint = isTest(validBidRequests[0]) ? DEV_BIDDER_ENDPOINT : BIDDER_ENDPOINT; + return { + method: 'POST', + url: bidderEndpoint, + data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest), + options: { + contentType: 'application/json' + }, + bidderRequest + }; +}; +const interpretResponse = function (serverResponse, request) { + const res = serverResponse.body; + const bids = []; + if (res) { + res.seatbid.forEach(sb => { + sb.bid.forEach(b => { + const bid = { + requestId: b.impid, + cpm: b.price, + currency: res.cur, + width: b.w, + height: b.h, + creativeId: b.crid, + dealId: b.dealid, + netRevenue: true, + ttl: TIME_TO_LIVE_IN_SECONDS, + ad: b.adm, + nurl: b.nurl, + cid: b.cid, + meta: { + advertiserDomains: b.adomain + } + }; + setAdditionalData(bid, 'adServerCurrency', (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(request.bidderRequest)); + bids.push(bid); + }); + }); + } + return bids; +}; +const onBidWon = function (bid) { + const adServerCurrency = getAdditionalData(bid, 'adServerCurrency'); + // We intentionally use the price set by the publisher to replace the ${AUCTION_PRICE} macro + // instead of the `originalCpm` here. This notification is not used for billing, only for extra logging. + const publisherPrice = bid.cpm || 0; + const publisherCurrency = bid.currency || adServerCurrency || SUPPORTED_CURRENCY; + const adServerPrice = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'adserverTargeting.hb_pb', 0); + const adServerPriceCurrency = adServerCurrency || SUPPORTED_CURRENCY; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(bid.nurl) && bid.nurl !== '') { + const winNotificationUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.replaceAuctionPrice)(bid.nurl, publisherPrice).replace(/\${AUCTION_PRICE_CURRENCY}/g, publisherCurrency).replace(/\${AD_SERVER_PRICE}/g, adServerPrice).replace(/\${AD_SERVER_PRICE_CURRENCY}/g, adServerPriceCurrency); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel)(winNotificationUrl); + } +}; +const onTimeout = function (timeoutDataArray) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(timeoutDataArray)) { + const pageUrl = getPageUrlFromRefererInfo(); + timeoutDataArray.forEach(timeoutData => { + const query = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryStringParameters)({ + ad_unit_code: timeoutData.adUnitCode, + bid_id: timeoutData.bidId, + timeout: timeoutData.timeout, + page_url: pageUrl + }); + const timeoutNotificationUrl = `${TIMEOUT_NOTIFICATION_ENDPOINT}?${query}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel)(timeoutNotificationUrl); + }); + } +}; +function getPageUrlFromRequest(validBidRequest, bidderRequest) { + return bidderRequest.refererInfo && bidderRequest.refererInfo.page ? bidderRequest.refererInfo.page : window.location.href; +} +function getPageUrlFromRefererInfo() { + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)(); + return refererInfo && refererInfo.page ? refererInfo.page : window.location.href; +} +function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) { + const imps = validBidRequests.map(buildOpenRtbImpObject); + const timeout = bidderRequest.timeout; + const pageUrl = getPageUrlFromRequest(validBidRequests[0], bidderRequest); + // Kobler, a contextual advertising provider, does not process any personal data itself, so it is not part of TCF/GVL. + // However, it supports using select third-party creatives in its platform, some of which require certain permissions + // in order to be shown. Kobler's bidder checks if necessary permissions are present to avoid bidding + // with ineligible creatives. + let purpose2Given; + let purpose3Given; + if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.vendorData) { + const vendorData = bidderRequest.gdprConsent.vendorData; + const purposeData = vendorData.purpose; + const restrictions = vendorData.publisher ? vendorData.publisher.restrictions : null; + const restrictionForPurpose2 = restrictions ? restrictions[2] ? Object.values(restrictions[2])[0] : null : null; + purpose2Given = restrictionForPurpose2 === 1 ? purposeData && purposeData.consents && purposeData.consents[2] : restrictionForPurpose2 === 0 ? false : purposeData && purposeData.legitimateInterests && purposeData.legitimateInterests[2]; + purpose3Given = purposeData && purposeData.consents && purposeData.consents[3]; + } + const request = { + id: bidderRequest.bidderRequestId, + at: 1, + tmax: timeout, + cur: [SUPPORTED_CURRENCY], + imp: imps, + device: { + devicetype: getDevice(), + ua: navigator.userAgent, + sua: validBidRequests[0]?.ortb2?.device?.sua + }, + site: { + page: pageUrl + }, + test: getTestAsNumber(validBidRequests[0]), + ext: { + kobler: { + tcf_purpose_2_given: purpose2Given, + tcf_purpose_3_given: purpose3Given, + page_view_id: pageViewId + } + } + }; + return JSON.stringify(request); +} +function buildOpenRtbImpObject(validBidRequest) { + const sizes = getSizes(validBidRequest); + const mainSize = sizes[0]; + const floorInfo = getFloorInfo(validBidRequest, mainSize) || {}; + return { + id: validBidRequest.bidId, + banner: { + format: buildFormatArray(sizes), + w: mainSize[0], + h: mainSize[1] + }, + bidfloor: floorInfo.floor, + bidfloorcur: floorInfo.currency, + pmp: buildPmpObject(validBidRequest) + }; +} +function getDevice() { + const ws = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowSelf)(); + const ua = ws.navigator.userAgent; + if (/(tablet|ipad|playbook|silk|android 3.0|xoom|sch-i800|kindle)|(android(?!.*mobi))/i.test(ua.toLowerCase())) { + return 5; // tablet + } + if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(ua.toLowerCase())) { + return 4; // phone + } + return 2; // personal computers +} +function getTestAsNumber(validBidRequest) { + return isTest(validBidRequest) ? 1 : 0; +} +function isTest(validBidRequest) { + return validBidRequest.params && validBidRequest.params.test === true; +} +function getSizes(validBidRequest) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequest, 'mediaTypes.banner.sizes', validBidRequest.sizes); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(sizes) && sizes.length > 0) { + return sizes; + } + return [[0, 0]]; +} +function buildFormatArray(sizes) { + return sizes.map(size => { + return { + w: size[0], + h: size[1] + }; + }); +} +function getFloorInfo(validBidRequest, mainSize) { + if (typeof validBidRequest.getFloor === 'function') { + const sizeParam = mainSize[0] === 0 && mainSize[1] === 0 ? '*' : mainSize; + return validBidRequest.getFloor({ + currency: SUPPORTED_CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, + size: sizeParam + }); + } else { + return { + currency: SUPPORTED_CURRENCY, + floor: getFloorPrice(validBidRequest) + }; + } +} +function getFloorPrice(validBidRequest) { + return parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequest, 'params.floorPrice', 0.0)); +} +function buildPmpObject(validBidRequest) { + if (validBidRequest.params && validBidRequest.params.dealIds && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(validBidRequest.params.dealIds)) { + return { + deals: validBidRequest.params.dealIds.map(dealId => { + return { + id: dealId + }; + }) + }; + } + return {}; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse, + onBidWon, + onTimeout +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('koblerBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/koblerBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["konduitAnalyticsAdapter"],{ + +/***/ "./modules/konduitAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/konduitAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/targeting.js */ "./src/targeting.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + + + +const TRACKER_HOST = 'tracker.konduit.me'; +const KONDUIT_PREBID_MODULE_VERSION = '1.0.0'; +const analyticsType = 'endpoint'; +const eventDataComposerMap = { + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_INIT]: obtainAuctionInfo, + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_END]: obtainAuctionInfo, + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_REQUESTED]: obtainBidRequestsInfo, + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_TIMEOUT]: obtainBidTimeoutInfo, + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_RESPONSE]: obtainBidResponseInfo, + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON]: obtainWinnerBidInfo, + [_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.NO_BID]: obtainNoBidInfo +}; + +// This function is copy from prebid core +function formatQS(query) { + return Object.keys(query).map(k => Array.isArray(query[k]) ? query[k].map(v => `${k}[]=${v}`).join('&') : `${k}=${query[k]}`).join('&'); +} + +// This function is copy from prebid core +function buildUrl(obj) { + return (obj.protocol || 'http') + '://' + (obj.host || obj.hostname + (obj.port ? `:${obj.port}` : '')) + (obj.pathname || '') + (obj.search ? `?${formatQS(obj.search || '')}` : '') + (obj.hash ? `#${obj.hash}` : ''); +} +const getWinnerBidFromAggregatedEvents = () => { + return konduitAnalyticsAdapter.context.aggregatedEvents.filter(evt => evt.eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON)[0]; +}; +const isWinnerBidDetected = () => { + return !!getWinnerBidFromAggregatedEvents(); +}; +const isWinnerBidExist = () => { + return !!_src_targeting_js__WEBPACK_IMPORTED_MODULE_1__.targeting.getWinningBids()[0]; +}; +const konduitAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_INIT === eventType) { + konduitAnalyticsAdapter.context.aggregatedEvents.splice(0); + } + if (eventDataComposerMap[eventType]) { + konduitAnalyticsAdapter.context.aggregatedEvents.push({ + eventType, + data: eventDataComposerMap[eventType](args) + }); + } + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_END) { + if (!isWinnerBidDetected() && isWinnerBidExist()) { + const bidWonData = eventDataComposerMap[_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON](_src_targeting_js__WEBPACK_IMPORTED_MODULE_1__.targeting.getWinningBids()[0]); + konduitAnalyticsAdapter.context.aggregatedEvents.push({ + eventType: _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON, + data: bidWonData + }); + } + sendRequest({ + method: 'POST', + path: '/analytics-initial-event', + payload: composeRequestPayload() + }); + } + } +}); +function obtainBidTimeoutInfo(args) { + return args.map(item => item.bidder).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.uniques); +} +function obtainAuctionInfo(auction) { + return { + auctionId: auction.auctionId, + timestamp: auction.timestamp, + auctionEnd: auction.auctionEnd, + auctionStatus: auction.auctionStatus, + adUnitCodes: auction.adUnitCodes, + labels: auction.labels, + timeout: auction.timeout + }; +} +function obtainBidRequestsInfo(bidRequests) { + return { + bidderCode: bidRequests.bidderCode, + time: bidRequests.start, + bids: bidRequests.bids.map(function (bid) { + return { + transactionId: bid.transactionId, + adUnitCode: bid.adUnitCode, + bidId: bid.bidId, + startTime: bid.startTime, + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseSizesInput)(bid.sizes).toString(), + params: bid.params + }; + }) + }; +} +function obtainBidResponseInfo(bidResponse) { + return { + bidderCode: bidResponse.bidder, + transactionId: bidResponse.transactionId, + adUnitCode: bidResponse.adUnitCode, + statusMessage: bidResponse.statusMessage, + mediaType: bidResponse.mediaType, + renderedSize: bidResponse.size, + cpm: bidResponse.cpm, + currency: bidResponse.currency, + netRevenue: bidResponse.netRevenue, + timeToRespond: bidResponse.timeToRespond, + bidId: bidResponse.bidId, + requestId: bidResponse.requestId, + creativeId: bidResponse.creativeId + }; +} +function obtainNoBidInfo(bidResponse) { + return { + bidderCode: bidResponse.bidder, + transactionId: bidResponse.transactionId, + adUnitCode: bidResponse.adUnitCode, + bidId: bidResponse.bidId + }; +} +function obtainWinnerBidInfo(bidResponse) { + return { + adId: bidResponse.adId, + bidderCode: bidResponse.bidder, + adUnitCode: bidResponse.adUnitCode, + statusMessage: bidResponse.statusMessage, + mediaType: bidResponse.mediaType, + renderedSize: bidResponse.size, + cpm: bidResponse.cpm, + currency: bidResponse.currency, + netRevenue: bidResponse.netRevenue, + timeToRespond: bidResponse.timeToRespond, + bidId: bidResponse.requestId, + dealId: bidResponse.dealId, + status: bidResponse.status, + creativeId: bidResponse.creativeId + }; +} +function composeRequestPayload() { + const konduitId = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('konduit.konduitId'); + const { + width, + height + } = window.screen; + return { + konduitId, + prebidVersion: "9.45.0-pre", + konduitPrebidModuleVersion: KONDUIT_PREBID_MODULE_VERSION, + environment: { + screen: { + width, + height + }, + language: navigator.language + }, + events: konduitAnalyticsAdapter.context.aggregatedEvents + }; +} +function sendRequest(_ref2) { + let { + host = TRACKER_HOST, + method, + path, + payload + } = _ref2; + const formattedUrlOptions = { + protocol: 'https', + hostname: host, + pathname: path + }; + if (method === 'GET') { + formattedUrlOptions.search = payload; + } + let konduitAnalyticsRequestUrl = buildUrl(formattedUrlOptions); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(konduitAnalyticsRequestUrl, undefined, method === 'POST' ? JSON.stringify(payload) : null, { + contentType: 'application/json', + method, + withCredentials: true + }); +} +konduitAnalyticsAdapter.originEnableAnalytics = konduitAnalyticsAdapter.enableAnalytics; +konduitAnalyticsAdapter.enableAnalytics = function (analyticsConfig) { + const konduitId = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('konduit.konduitId'); + if (!konduitId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('A konduitId in config is required to use konduitAnalyticsAdapter'); + return; + } + konduitAnalyticsAdapter.context = { + aggregatedEvents: [] + }; + konduitAnalyticsAdapter.originEnableAnalytics(analyticsConfig); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: konduitAnalyticsAdapter, + code: 'konduit' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (konduitAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('konduitAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/konduitAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["konduitWrapper"],{ + +/***/ "./modules/konduitWrapper.js": +/*!***********************************!*\ + !*** ./modules/konduitWrapper.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports errorMessages, processBids */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adServerManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adServerManager.js */ "./src/adServerManager.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/targeting.js */ "./src/targeting.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/cpmBucketManager.js */ "./src/cpmBucketManager.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); + + + + + + + + + +const SERVER_PROTOCOL = 'https'; +const SERVER_HOST = 'p.konduit.me'; +const KONDUIT_PREBID_MODULE_VERSION = '1.0.0'; +const MODULE_NAME = 'Konduit'; +const KONDUIT_ID_CONFIG = 'konduit.konduitId'; +const SEND_ALL_BIDS_CONFIG = 'enableSendAllBids'; +const errorMessages = { + NO_KONDUIT_ID: 'A konduitId param is required to be in configs', + NO_BIDS: 'No bids received in the auction', + NO_BID: 'A bid was not found', + CACHE_FAILURE: 'A bid was not cached' +}; + +// This function is copy from prebid core +function formatQS(query) { + return Object.keys(query).map(k => Array.isArray(query[k]) ? query[k].map(v => `${k}[]=${v}`).join('&') : `${k}=${query[k]}`).join('&'); +} + +// This function is copy from prebid core +function buildUrl(obj) { + return (obj.protocol || 'http') + '://' + (obj.host || obj.hostname + (obj.port ? `:${obj.port}` : '')) + (obj.pathname || '') + (obj.search ? `?${formatQS(obj.search || '')}` : '') + (obj.hash ? `#${obj.hash}` : ''); +} +function addLogLabel(args) { + args = [].slice.call(args); + args.unshift(`${MODULE_NAME}: `); + return args; +} +function _logInfo() { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(...addLogLabel(arguments)); +} +function _logError() { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(...addLogLabel(arguments)); +} +function sendRequest(_ref) { + let { + host = SERVER_HOST, + protocol = SERVER_PROTOCOL, + method = 'GET', + path, + payload, + callbacks, + timeout + } = _ref; + const formattedUrlOptions = { + protocol: protocol, + hostname: host, + pathname: path + }; + if (method === 'GET') { + formattedUrlOptions.search = payload; + } + let konduitAnalyticsRequestUrl = buildUrl(formattedUrlOptions); + const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajaxBuilder)(timeout); + ajax(konduitAnalyticsRequestUrl, callbacks, method === 'POST' ? JSON.stringify(payload) : null, { + contentType: 'application/json', + method, + withCredentials: true + }); +} +function composeBidsProcessorRequestPayload(bid) { + return { + auctionId: bid.auctionId, + vastUrl: bid.vastUrl, + bidderCode: bid.bidderCode, + creativeId: bid.creativeId, + adUnitCode: bid.adUnitCode, + cpm: bid.cpm, + currency: bid.currency + }; +} +function setDefaultKCpmToBid(bid, winnerBid, priceGranularity) { + bid.kCpm = bid.cpm; + if (!bid.adserverTargeting) { + bid.adserverTargeting = {}; + } + const kCpm = (0,_src_auction_js__WEBPACK_IMPORTED_MODULE_2__.getPriceByGranularity)(priceGranularity)(bid); + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(SEND_ALL_BIDS_CONFIG)) { + bid.adserverTargeting[`k_cpm_${bid.bidderCode}`] = kCpm; + } + if (winnerBid.bidderCode === bid.bidderCode && winnerBid.creativeId === bid.creativeId) { + bid.adserverTargeting.k_cpm = kCpm; + } +} +function addKCpmToBid(kCpm, bid, winnerBid, priceGranularity) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(kCpm)) { + bid.kCpm = kCpm; + const priceStringsObj = (0,_src_cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_4__.getPriceBucketString)(kCpm, _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('customPriceBucket'), _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('currency.granularityMultiplier')); + const calculatedKCpm = priceStringsObj.custom || priceStringsObj[priceGranularity] || priceStringsObj.med; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(SEND_ALL_BIDS_CONFIG)) { + bid.adserverTargeting[`k_cpm_${bid.bidderCode}`] = calculatedKCpm; + } + if (winnerBid.bidderCode === bid.bidderCode && winnerBid.creativeId === bid.creativeId) { + bid.adserverTargeting.k_cpm = calculatedKCpm; + } + } +} +function addKonduitCacheKeyToBid(cacheKey, bid, winnerBid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(cacheKey)) { + bid.konduitCacheKey = cacheKey; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(SEND_ALL_BIDS_CONFIG)) { + bid.adserverTargeting[`k_cache_key_${bid.bidderCode}`] = cacheKey; + } + if (winnerBid.bidderCode === bid.bidderCode && winnerBid.creativeId === bid.creativeId) { + bid.adserverTargeting.k_cache_key = cacheKey; + bid.adserverTargeting.konduit_cache_key = cacheKey; + } + } +} + +/** + * This function accepts an object with bid and tries to cache it while generating k_cache_key for it. + * In addition, it returns a list with updated bid objects where k_cpm key is added + * @param {Object} options + * @param {Object} [options.bid] - a winner bid provided by a client + * @param {Object} [options.bids] - bids array provided by a client for "Send All Bids" scenario + * @param {string} [options.adUnitCode] - ad unit code that is used to get winning bids + * @param {string} [options.timeout] - timeout for Konduit bids processor HTTP request + * @param {function} [options.callback] - callback function to be executed on HTTP request end; the function is invoked with two parameters - error and bids + */ +function processBids() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const konduitId = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(KONDUIT_ID_CONFIG); + options = options || {}; + if (!konduitId) { + _logError(errorMessages.NO_KONDUIT_ID); + if (options.callback) { + options.callback(new Error(errorMessages.NO_KONDUIT_ID), []); + } + return null; + } + const publisherBids = options.bids || _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getBidsReceived(); + const winnerBid = options.bid || _src_targeting_js__WEBPACK_IMPORTED_MODULE_6__.targeting.getWinningBids(options.adUnitCode, publisherBids)[0]; + const bids = []; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(SEND_ALL_BIDS_CONFIG)) { + bids.push(...publisherBids); + } else if (winnerBid) { + bids.push(winnerBid); + } + if (!bids.length) { + _logError(errorMessages.NO_BIDS); + if (options.callback) { + options.callback(new Error(errorMessages.NO_BIDS), []); + } + return null; + } + const priceGranularity = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('priceGranularity'); + const bidsToProcess = []; + bids.forEach(bid => { + setDefaultKCpmToBid(bid, winnerBid, priceGranularity); + bidsToProcess.push(composeBidsProcessorRequestPayload(bid)); + }); + sendRequest({ + method: 'POST', + path: '/api/bidsProcessor', + timeout: options.timeout || 1000, + payload: { + clientId: konduitId, + konduitPrebidModuleVersion: KONDUIT_PREBID_MODULE_VERSION, + enableSendAllBids: _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(SEND_ALL_BIDS_CONFIG), + bids: bidsToProcess, + bidResponsesCount: _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_5__.auctionManager.getBidsReceived().length + }, + callbacks: { + success: data => { + let error = null; + _logInfo('Bids processed successfully ', data); + try { + const { + kCpmData, + cacheData + } = JSON.parse(data); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(cacheData)) { + throw new Error(errorMessages.CACHE_FAILURE); + } + winnerBid.adserverTargeting.konduit_id = konduitId; + winnerBid.adserverTargeting.k_id = konduitId; + bids.forEach(bid => { + const processedBidKey = `${bid.bidderCode}:${bid.creativeId}`; + addKCpmToBid(kCpmData[processedBidKey], bid, winnerBid, priceGranularity); + addKonduitCacheKeyToBid(cacheData[processedBidKey], bid, winnerBid); + }); + } catch (err) { + error = err; + _logError('Error parsing JSON response for bidsProcessor data: ', err); + } + if (options.callback) { + options.callback(error, bids); + } + }, + error: error => { + _logError('Bids were not processed successfully ', error); + if (options.callback) { + options.callback((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(error) ? new Error(error) : error, bids); + } + } + } + }); +} +(0,_src_adServerManager_js__WEBPACK_IMPORTED_MODULE_7__.registerVideoSupport)('konduit', { + processBids: processBids +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('konduitWrapper'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/konduitWrapper.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["krushmediaBidAdapter"],{ + +/***/ "./modules/krushmediaBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/krushmediaBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'krushmedia'; +const AD_URL = 'https://ads4.krushmedia.com/?c=rtb&m=hb'; +const SYNC_URL = 'https://cs.krushmedia.com'; +const addCustomFieldsToPlacement = (bid, bidderRequest, placement) => { + placement.key = bid.params.key; + placement.traffic = placement.adFormat; + if (placement.adFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + placement.wPlayer = placement.playerSize?.[0]?.[0]; + placement.hPlayer = placement.playerSize?.[0]?.[1]; + } +}; +const placementProcessingFunction = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildPlacementProcessingFunction)({ + addCustomFieldsToPlacement +}); +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + return (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequestsBase)({ + adUrl: AD_URL, + validBidRequests, + bidderRequest, + placementProcessingFunction + }); +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['key']), + buildRequests, + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('krushmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/krushmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kubientBidAdapter"],{ + +/***/ "./modules/kubientBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/kubientBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + +const BIDDER_CODE = 'kubient'; +const END_POINT = 'https://kssp.kbntx.ch/kubprebidjs'; +const VERSION = '1.1'; +const VENDOR_ID = 794; +const spec = { + code: BIDDER_CODE, + gvlid: VENDOR_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return !!(bid && bid.params && bid.params.zoneid && (!bid.mediaTypes.video || bid.mediaTypes.video && bid.mediaTypes.video.playerSize && bid.mediaTypes.video.mimes && bid.mediaTypes.video.protocols)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (!validBidRequests || !bidderRequest) { + return; + } + return validBidRequests.map(function (bid) { + let adSlot = { + bidId: bid.bidId, + zoneId: bid.params.zoneid || '' + }; + if (typeof bid.getFloor === 'function') { + const mediaType = Object.keys(bid.mediaTypes).length == 1 ? Object.keys(bid.mediaTypes)[0] : '*'; + const sizes = bid.sizes || '*'; + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: mediaType, + size: sizes + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD') { + let floor = parseFloat(floorInfo.floor); + if (!isNaN(floor) && floor > 0) { + adSlot.floor = parseFloat(floorInfo.floor); + } + } + } + if (bid.mediaTypes.banner) { + adSlot.banner = bid.mediaTypes.banner; + } + if (bid.mediaTypes.video) { + adSlot.video = bid.mediaTypes.video; + } + if (bid.schain) { + adSlot.schain = bid.schain; + } + let data = { + v: VERSION, + requestId: bid.bidderRequestId, + adSlots: [adSlot], + tmax: bidderRequest.timeout, + gdpr: bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? 1 : 0, + consentGiven: kubientGetConsentGiven(bidderRequest.gdprConsent), + uspConsent: bidderRequest.uspConsent + }; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + data.coppa = 1; + } + if (bidderRequest?.refererInfo?.page) { + // TODO: is 'page' the right value here? + data.referer = bidderRequest.refererInfo.page; + } + if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString) { + data.consent = bidderRequest.gdprConsent.consentString; + } + return { + method: 'POST', + url: END_POINT, + data: JSON.stringify(data) + }; + }); + }, + interpretResponse: function interpretResponse(serverResponse, request) { + if (!serverResponse || !serverResponse.body || !serverResponse.body.seatbid) { + return []; + } + let bidResponses = []; + serverResponse.body.seatbid.forEach(seatbid => { + let bids = seatbid.bid || []; + bids.forEach(bid => { + const bidResponse = { + requestId: bid.bidId, + cpm: bid.price, + currency: bid.cur, + width: bid.w, + height: bid.h, + creativeId: bid.creativeId, + netRevenue: bid.netRevenue, + ttl: bid.ttl, + ad: bid.adm, + meta: {} + }; + if (bid.meta && bid.meta.adomain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.meta.adomain)) { + bidResponse.meta.advertiserDomains = bid.meta.adomain; + } + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bidResponse.vastXml = bid.adm; + } + bidResponses.push(bidResponse); + }); + }); + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + let kubientSync = kubientGetSyncInclude(_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config); + if (!syncOptions.pixelEnabled || kubientSync.image === 'exclude') { + return []; + } + let values = {}; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + values['gdpr'] = Number(gdprConsent.gdprApplies); + } + if (typeof gdprConsent.consentString === 'string') { + values['consent'] = gdprConsent.consentString; + } + } + if (uspConsent) { + values['usp'] = uspConsent; + } + return [{ + type: 'image', + url: 'https://matching.kubient.net/match/sp?' + encodeQueryData(values) + }]; + } +}; +function encodeQueryData(data) { + return Object.keys(data).map(function (key) { + return [key, data[key]].map(encodeURIComponent).join('='); + }).join('&'); +} +function kubientGetConsentGiven(gdprConsent) { + let consentGiven = 0; + if (typeof gdprConsent !== 'undefined') { + consentGiven = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gdprConsent, `vendorData.vendor.consents.${VENDOR_ID}`) ? 1 : 0; + } + return consentGiven; +} +function kubientGetSyncInclude(config) { + try { + let kubientSync = {}; + if (config.getConfig('userSync').filterSettings != null && typeof config.getConfig('userSync').filterSettings != 'undefined') { + let filterSettings = config.getConfig('userSync').filterSettings; + if (filterSettings.iframe !== null && typeof filterSettings.iframe !== 'undefined') { + kubientSync.iframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(filterSettings.image.bidders) && filterSettings.iframe.bidders.indexOf('kubient') !== -1 || filterSettings.iframe.bidders === '*' ? filterSettings.iframe.filter : 'exclude'; + } + if (filterSettings.image !== null && typeof filterSettings.image !== 'undefined') { + kubientSync.image = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(filterSettings.image.bidders) && filterSettings.image.bidders.indexOf('kubient') !== -1 || filterSettings.image.bidders === '*' ? filterSettings.image.filter : 'exclude'; + } + } + return kubientSync; + } catch (e) { + return null; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('kubientBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kubientBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kueezBidAdapter"],{ + +/***/ "./modules/kueezBidAdapter.js": +/*!************************************!*\ + !*** ./modules/kueezBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + +const BIDDER_ENDPOINT = 'https://hb.kueezssp.com/hb-kz-multi'; +const BIDDER_TEST_ENDPOINT = 'https://hb.kueezssp.com/hb-multi-kz-test'; +const BIDDER_CODE = 'kueez'; +const MAIN_CURRENCY = 'USD'; +const MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const TTL = 420; +const VERSION = '1.0.0'; +const SUPPORTED_SYNC_METHODS = { + IFRAME: 'iframe', + PIXEL: 'pixel' +}; +const spec = { + code: BIDDER_CODE, + version: VERSION, + supportedMediaTypes: MEDIA_TYPES, + isBidRequestValid: function (bidRequest) { + return validateParams(bidRequest); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const [sharedParams] = validBidRequests; + const testMode = sharedParams.params.testMode; + const bidsToSend = prepareBids(validBidRequests, sharedParams, bidderRequest); + return { + method: 'POST', + url: getBidderEndpoint(testMode), + data: bidsToSend + }; + }, + interpretResponse: function (_ref) { + let { + body + } = _ref; + const bidResponses = body?.bids; + if (!bidResponses || !bidResponses.length) { + return []; + } + return parseBidResponses(bidResponses); + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + for (const response of serverResponses) { + if (syncOptions.pixelEnabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response.body.params.userSyncPixels)) { + const pixels = response.body.params.userSyncPixels.map(pixel => { + return { + type: 'image', + url: pixel + }; + }); + syncs.push(...pixels); + } + if (syncOptions.iframeEnabled && response.body.params.userSyncURL) { + syncs.push({ + type: 'iframe', + url: response.body.params.userSyncURL + }); + } + } + return syncs; + }, + onBidWon: function (bid) { + if (bid == null) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('onBidWon:', bid); + if (bid.hasOwnProperty('nurl') && bid.nurl.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(bid.nurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); + +/** + * Get schain string value + * @param schainObject {Object} + * @returns {string} + */ +function getSupplyChain(schainObject) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(schainObject)) { + return ''; + } + let scStr = `${schainObject.ver},${schainObject.complete}`; + schainObject.nodes.forEach(node => { + scStr += '!'; + scStr += `${getEncodedValIfNotEmpty(node.asi)},`; + scStr += `${getEncodedValIfNotEmpty(node.sid)},`; + scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`; + scStr += `${getEncodedValIfNotEmpty(node.rid)},`; + scStr += `${getEncodedValIfNotEmpty(node.name)},`; + scStr += `${getEncodedValIfNotEmpty(node.domain)}`; + }); + return scStr; +} + +/** + * Get the encoded value + * @param val {string} + * @returns {string} + */ +function getEncodedValIfNotEmpty(val) { + return !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(val) ? encodeURIComponent(val) : ''; +} + +/** + * get device type + * @returns {string} + */ +function getDeviceType() { + const ua = navigator.userAgent; + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(ua.toLowerCase())) { + return '5'; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(ua.toLowerCase())) { + return '4'; + } + if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i.test(ua.toLowerCase())) { + return '3'; + } + return '1'; +} + +/** + * Get floor price + * @param bid {bid} + * @param mediaType {string} + * @returns {Number} + */ +function getFloorPrice(bid, mediaType) { + let floor = 0; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + let floorResult = bid.getFloor({ + currency: MAIN_CURRENCY, + mediaType: mediaType, + size: '*' + }) || {}; + floor = floorResult.currency === MAIN_CURRENCY && floorResult.floor ? floorResult.floor : 0; + } + return floor; +} + +/** + * Get the ad sizes array from the bid + * @param bid {bid} + * @param mediaType {string} + * @returns {Array} + */ +function getSizesArray(bid, mediaType) { + let sizes = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.${mediaType}.sizes`)) { + sizes = bid.mediaTypes[mediaType].sizes; + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) { + sizes = bid.sizes; + } + return sizes; +} + +/** + * Get the preferred user-sync method + * @param filterSettings {filterSettings} + * @param bidderCode {string} + * @returns {string} + */ +function getSyncMethod(filterSettings, bidderCode) { + const iframeConfigs = ['all', 'iframe']; + const pixelConfig = 'image'; + if (filterSettings && iframeConfigs.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) { + return SUPPORTED_SYNC_METHODS.IFRAME; + } + if (!filterSettings || !filterSettings[pixelConfig] || isSyncMethodAllowed(filterSettings[pixelConfig], bidderCode)) { + return SUPPORTED_SYNC_METHODS.PIXEL; + } +} + +/** + * Check sync rule support + * @param filterSetting {Object} + * @param bidderCode {string} + * @returns {boolean} + */ +function isSyncMethodAllowed(filterSetting, bidderCode) { + if (!filterSetting) { + return false; + } + const bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(filterSetting.bidders) ? filterSetting.bidders : [bidderCode]; + return filterSetting.filter === 'include' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.contains)(bidders, bidderCode); +} + +/** + * Get the bidder endpoint + * @param testMode {boolean} + * @returns {string} + */ +function getBidderEndpoint(testMode) { + return testMode ? BIDDER_TEST_ENDPOINT : BIDDER_ENDPOINT; +} + +/** + * Generates the bidder parameters + * @param validBidRequests {Array} + * @param bidderRequest {bidderRequest} + * @returns {Array} + */ +function generateBidParams(validBidRequests, bidderRequest) { + const bidsArray = []; + if (validBidRequests.length) { + validBidRequests.forEach(bid => { + bidsArray.push(generateBidParameters(bid, bidderRequest)); + }); + } + return bidsArray; +} + +/** + * Generate bid specific parameters + * @param bid {bid} + * @param bidderRequest {bidderRequest} + * @returns {Object} bid specific params object + */ +function generateBidParameters(bid, bidderRequest) { + const { + params + } = bid; + const mediaType = isBanner(bid) ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + const sizesArray = getSizesArray(bid, mediaType); + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `ortb2Imp.ext.gpid`); + const pos = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.${mediaType}.pos`); + const placementId = params.placementId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.${mediaType}.name`); + const paramsFloorPrice = isNaN(params.floorPrice) ? 0 : params.floorPrice; + const bidObject = { + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('adUnitCode', bid), + bidId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidId', bid), + loop: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidderRequestsCount', bid), + bidderRequestId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidderRequestId', bid), + floorPrice: Math.max(getFloorPrice(bid, mediaType), paramsFloorPrice), + mediaType, + sizes: sizesArray, + transactionId: bid.ortb2Imp?.ext?.tid || '' + }; + if (pos) { + bidObject.pos = pos; + } + if (gpid) { + bidObject.gpid = gpid; + } + if (placementId) { + bidObject.placementId = placementId; + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + populateVideoParams(bidObject, bid); + } + return bidObject; +} + +/** + * Checks if the media type is a banner + * @param bid {bid} + * @returns {boolean} + */ +function isBanner(bid) { + return bid.mediaTypes && bid.mediaTypes.banner; +} + +/** + * Generate params that are common between all bids + * @param sharedParams {sharedParams} + * @param bidderRequest {bidderRequest} + * @returns {object} the common params object + */ +function generateSharedParams(sharedParams, bidderRequest) { + const { + bidderCode + } = bidderRequest; + const { + syncEnabled, + filterSettings + } = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('userSync') || {}; + const domain = window.location.hostname; + const generalBidParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('params', sharedParams); + const userIds = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('userId', sharedParams); + const ortb2Metadata = bidderRequest.ortb2 || {}; + const timeout = bidderRequest.timeout; + const params = { + adapter_version: VERSION, + auction_start: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.timestamp)(), + device_type: getDeviceType(), + dnt: navigator.doNotTrack === 'yes' || navigator.doNotTrack === '1' || navigator.msDoNotTrack === '1' ? 1 : 0, + publisher_id: generalBidParams.org, + publisher_name: domain, + session_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('auctionId', sharedParams), + site_domain: domain, + tmax: timeout, + ua: navigator.userAgent, + wrapper_type: 'prebidjs', + wrapper_vendor: "pbjs", + wrapper_version: "9.45.0-pre" + }; + if (syncEnabled) { + const allowedSyncMethod = getSyncMethod(filterSettings, bidderCode); + if (allowedSyncMethod) { + params.cs_method = allowedSyncMethod; + } + } + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + params.gdpr = bidderRequest.gdprConsent.gdprApplies; + params.gdpr_consent = bidderRequest.gdprConsent.consentString; + } + if (bidderRequest.uspConsent) { + params.us_privacy = bidderRequest.uspConsent; + } + if (generalBidParams.ifa) { + params.ifa = generalBidParams.ifa; + } + if (ortb2Metadata.site) { + params.site_metadata = JSON.stringify(ortb2Metadata.site); + } + if (ortb2Metadata.user) { + params.user_metadata = JSON.stringify(ortb2Metadata.user); + } + if (bidderRequest && bidderRequest.refererInfo) { + params.referrer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'refererInfo.ref'); + params.page_url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'refererInfo.page') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(window, 'location.href'); + } + if (sharedParams.schain) { + params.schain = getSupplyChain(sharedParams.schain); + } + if (userIds) { + params.userIds = JSON.stringify(userIds); + } + return params; +} + +/** + * Validates the bidder params + * @param bidRequest {bidRequest} + * @returns {boolean} + */ +function validateParams(bidRequest) { + let isValid = true; + if (!bidRequest.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Kueez adapter - missing params'); + isValid = false; + } + if (!bidRequest.params.org) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Kueez adapter - org is a required param'); + isValid = false; + } + return isValid; +} + +/** + * Validates the bidder params + * @param validBidRequests {Array} + * @param sharedParams {sharedParams} + * @param bidderRequest {bidderRequest} + * @returns {Object} + */ +function prepareBids(validBidRequests, sharedParams, bidderRequest) { + return { + params: generateSharedParams(sharedParams, bidderRequest), + bids: generateBidParams(validBidRequests, bidderRequest) + }; +} +function getPlaybackMethod(bid) { + const playbackMethod = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.playbackmethod`); + if (Array.isArray(playbackMethod) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(playbackMethod[0])) { + return playbackMethod[0]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(playbackMethod)) { + return playbackMethod; + } +} +function populateVideoParams(params, bid) { + const linearity = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.linearity`); + const maxDuration = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.maxduration`); + const minDuration = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.minduration`); + const placement = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.placement`); + const plcmt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.plcmt`); + const playbackMethod = getPlaybackMethod(bid); + const skip = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `mediaTypes.video.skip`); + if (linearity) { + params.linearity = linearity; + } + if (maxDuration) { + params.maxDuration = maxDuration; + } + if (minDuration) { + params.minDuration = minDuration; + } + if (placement) { + params.placement = placement; + } + if (plcmt) { + params.plcmt = plcmt; + } + if (playbackMethod) { + params.playbackMethod = playbackMethod; + } + if (skip) { + params.skip = skip; + } +} + +/** + * Processes the bid responses + * @param bids {Array} + * @returns {Array} + */ +function parseBidResponses(bids) { + return bids.map(bid => { + const bidResponse = { + cpm: bid.cpm, + creativeId: bid.requestId, + currency: bid.currency || MAIN_CURRENCY, + height: bid.height, + mediaType: bid.mediaType, + meta: { + mediaType: bid.mediaType + }, + netRevenue: bid.netRevenue || true, + nurl: bid.nurl, + requestId: bid.requestId, + ttl: bid.ttl || TTL, + width: bid.width + }; + if (bid.adomain && bid.adomain.length) { + bidResponse.meta.advertiserDomains = bid.adomain; + } + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bidResponse.vastXml = bid.vastXml; + } else if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + bidResponse.ad = bid.ad; + } + return bidResponse; + }); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('kueezBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kueezBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["kueezRtbBidAdapter"],{ + +/***/ "./modules/kueezRtbBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/kueezRtbBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec, createDomain, getAndSetFirstPartyData, createFirstPartyData */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/vidazooUtils/bidderUtils.js */ "./libraries/vidazooUtils/bidderUtils.js"); + + + + + +const GVLID = 1165; +const DEFAULT_SUB_DOMAIN = 'exchange'; +const BIDDER_CODE = 'kueezrtb'; +const BIDDER_VERSION = '1.0.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_2__.isBidRequestValid, + buildRequests: (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_2__.createBuildRequestsFn)(createDomain, createUniqueRequestData, storage, BIDDER_CODE, BIDDER_VERSION, false), + interpretResponse: (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_2__.createInterpretResponseFn)(BIDDER_CODE, false), + getUserSyncs: (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_2__.createUserSyncGetter)({ + iframeSyncUrl: 'https://sync.kueezrtb.com/api/sync/iframe', + imageSyncUrl: 'https://sync.kueezrtb.com/api/sync/image' + }), + createFirstPartyData +}; +function createDomain() { + let subDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SUB_DOMAIN; + return `https://${subDomain}.kueezrtb.com`; +} +function getAndSetFirstPartyData() { + if (!storage.hasLocalStorage()) { + return; + } + let fdata = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryParseJSON)(storage.getDataFromLocalStorage('_iiq_fdata')); + if (!fdata) { + fdata = spec.createFirstPartyData(); + storage.setDataInLocalStorage('_iiq_fdata', JSON.stringify(fdata)); + } + return fdata; +} +function createFirstPartyData() { + return { + pcid: getFirstPartyUUID(), + pcidDate: Date.now() + }; +} +function getFirstPartyUUID() { + let d = new Date().getTime(); + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + const r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c === 'x' ? r : r & 0x3 | 0x8).toString(16); + }); +} +; +function createUniqueRequestData(hashUrl, bid) { + const { + auctionId, + transactionId + } = bid; + const fdata = getAndSetFirstPartyData(); + return { + auctionId, + transactionId, + ...(fdata && { + iiqpcid: fdata.pcid, + iiqpcidDate: fdata.pcidDate + }) + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('kueezRtbBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","vidazooUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/kueezRtbBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lane4BidAdapter"],{ + +/***/ "./modules/lane4BidAdapter.js": +/*!************************************!*\ + !*** ./modules/lane4BidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/audUtils/bidderUtils.js */ "./libraries/audUtils/bidderUtils.js"); + + + + +const EP = 'https://rtb.lane4.io/hb'; +// Export const spec +const spec = { + code: 'lane4', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + // Determines whether or not the given bid request is valid + isBidRequestValid: bidRequestParam => { + return !!bidRequestParam.params.placement_id; + }, + // Make a server request from the list of BidRequests + buildRequests: (bidR, serverR) => { + // Get Requests based on media types + return (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerRequest)(bidR, serverR, EP); + }, + // Unpack the response from the server into a list of bids. + interpretResponse: (bidRS, bidRQ) => { + let Response = {}; + const mediaType = JSON.parse(bidRQ.data)[0].MediaType; + if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + Response = (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBannerResponse)(bidRS, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } else if (mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + Response = (0,_libraries_audUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getNativeResponse)(bidRS, bidRQ, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE); + } + return Response; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('lane4BidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["audUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lane4BidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lassoBidAdapter"],{ + +/***/ "./modules/lassoBidAdapter.js": +/*!************************************!*\ + !*** ./modules/lassoBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +const BIDDER_CODE = 'lasso'; +const ENDPOINT_URL = 'https://trc.lhmos.com/prebid'; +const GET_IUD_URL = 'https://secure.adnxs.com/getuid?'; +const COOKIE_NAME = 'aim-xr'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.adUnitId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (validBidRequests.length === 0) { + return []; + } + let aimXR = ''; + if (storage.cookiesAreEnabled) { + aimXR = storage.getCookie(COOKIE_NAME, undefined); + } + return validBidRequests.map(bidRequest => { + let sizes = []; + if (bidRequest.mediaTypes && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER] && bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER].sizes) { + sizes = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER].sizes; + } + const { + params + } = bidRequest; + let npi = params.npi || ''; + let dgid = params.dgid || ''; + let test = false; + if (params.testNPI) { + npi = params.testNPI; + test = true; + } + if (params.testDGID) { + dgid = params.testDGID; + test = true; + } + const payload = { + auctionStart: bidderRequest.auctionStart, + url: encodeURIComponent(window.location.href), + bidderRequestId: bidRequest.bidderRequestId, + adUnitCode: bidRequest.adUnitCode, + auctionId: bidRequest.auctionId, + bidId: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + device: encodeURIComponent(JSON.stringify(getDeviceData())), + sizes, + aimXR, + uid: '$UID', + npi, + dgid, + npi_hash: params.npiHash || '', + params: JSON.stringify(bidRequest.params), + crumbs: JSON.stringify(bidRequest.crumbs), + prebidVersion: "9.45.0-pre", + version: 4, + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') == true ? 1 : 0, + ccpa: bidderRequest.uspConsent || undefined, + test + }; + if (bidderRequest && bidderRequest.gppConsent && bidderRequest.gppConsent.gppString) { + payload.gpp = bidderRequest.gppConsent.gppString; + payload.gppSid = bidderRequest.gppConsent.applicableSections; + } + return { + method: 'GET', + url: getBidRequestUrl(aimXR, bidRequest.params), + data: payload, + options: { + withCredentials: true + } + }; + }); + }, + interpretResponse: function (serverResponse) { + const response = serverResponse && serverResponse.body; + const bidResponses = []; + if (!response || !response.bid.ad) { + return bidResponses; + } + const bidResponse = { + requestId: response.bidid, + bidId: response.bidid, + cpm: response.bid.price, + currency: response.cur, + width: response.bid.w, + height: response.bid.h, + creativeId: response.bid.crid, + netRevenue: response.netRevenue, + ttl: response.ttl, + ad: response.bid.ad, + mediaType: response.bid.mediaType, + meta: { + secondaryCatIds: response.bid.cat, + advertiserDomains: response.bid.advertiserDomains, + advertiserName: response.meta.advertiserName, + mediaType: response.bid.mediaType + } + }; + bidResponses.push(bidResponse); + return bidResponses; + }, + onTimeout: function (timeoutData) { + if (timeoutData === null) { + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(ENDPOINT_URL + '/timeout', null, JSON.stringify(timeoutData), { + method: 'POST', + withCredentials: false + }); + }, + onBidWon: function (bid) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(ENDPOINT_URL + '/won', null, JSON.stringify(bid), { + method: 'POST', + withCredentials: false + }); + }, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER] +}; +function getBidRequestUrl(aimXR, params) { + let path = '/request'; + if (params && params.dtc) { + path = '/dtc-request'; + } + if (aimXR || params.npi || params.dgid || params.npiHash || params.testNPI || params.testDGID) { + return ENDPOINT_URL + path; + } + return GET_IUD_URL + ENDPOINT_URL + path; +} +function getDeviceData() { + const win = window.top; + const winDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWinDimensions)(); + return { + ua: navigator.userAgent, + width: winDimensions.innerWidth || winDimensions.document.documentElement.clientWidth || win.document.body.clientWidth, + height: winDimensions.innerHeight || winDimensions.document.documentElement.clientHeight || win.document.body.clientHeight, + browserLanguage: navigator.language + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('lassoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lassoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lemmaDigitalBidAdapter"],{ + +/***/ "./modules/lemmaDigitalBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/lemmaDigitalBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +var BIDDER_CODE = 'lemmadigital'; +var LOG_WARN_PREFIX = 'LEMMADIGITAL: '; +var ENDPOINT = 'https://bid.lemmadigital.com/lemma/servad'; +var USER_SYNC = 'https://sync.lemmadigital.com/js/usersync.html?'; +var DEFAULT_CURRENCY = 'USD'; +var AUCTION_TYPE = 2; +var DEFAULT_TMAX = 300; +var DEFAULT_NET_REVENUE = false; +var DEFAULT_SECURE = 1; +var RESPONSE_TTL = 300; +var pubId = 0; +var adunitId = 0; +var spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + if (!bid || !bid.params) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError(LOG_WARN_PREFIX, 'nil/empty bid object'); + return false; + } + if (!_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty(bid.params.pubId) || !_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber(bid.params.pubId)) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(LOG_WARN_PREFIX + 'Error: publisherId is mandatory and cannot be string. Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(bid)); + return false; + } + if (!bid.params.adunitId) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(LOG_WARN_PREFIX + 'Error: adUnitId is mandatory. Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(bid)); + return false; + } + // video bid request validation + if (bid.params.hasOwnProperty('video')) { + if (!bid.params.video.hasOwnProperty('mimes') || !_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray(bid.params.video.mimes) || bid.params.video.mimes.length === 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(LOG_WARN_PREFIX + 'Error: For video ads, mimes is mandatory and must specify atlease 1 mime value. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(bid)); + return false; + } + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + if (validBidRequests.length === 0) { + return; + } + var refererInfo; + if (bidderRequest && bidderRequest.refererInfo) { + refererInfo = bidderRequest.refererInfo; + } + var conf = spec._setRefURL(refererInfo); + const request = spec._createoRTBRequest(validBidRequests, conf); + if (request && request.imp.length == 0) { + return; + } + spec._setOtherParams(bidderRequest, request); + const endPoint = spec._endPointURL(validBidRequests); + return { + method: 'POST', + url: endPoint, + data: JSON.stringify(request) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} response A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (response, request) => { + return spec._parseRTBResponse(request, response.body); + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: (syncOptions, serverResponses) => { + let syncurl = USER_SYNC + 'pid=' + pubId; + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: syncurl + }]; + } else { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(LOG_WARN_PREFIX + 'Please enable iframe based user sync.'); + } + }, + /** + * Generate UUID + */ + _createUUID: () => { + return new Date().getTime().toString(); + }, + /** + * parse object + */ + _parseJSON: function (rawPayload) { + try { + if (rawPayload) { + return JSON.parse(rawPayload); + } + } catch (ex) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError(LOG_WARN_PREFIX, 'Exception: ', ex); + } + return null; + }, + /** + * + * set referal url + */ + _setRefURL: refererInfo => { + var conf = {}; + conf.pageURL = refererInfo && refererInfo.referer ? refererInfo.referer : window.location.href; + if (refererInfo && refererInfo.referer) { + conf.refURL = refererInfo.referer; + } else { + conf.refURL = ''; + } + return conf; + }, + /** + * set other params into oRTB request + */ + _setOtherParams: (request, ortbRequest) => { + var params = request && request.params ? request.params : null; + if (params) { + ortbRequest.tmax = params.tmax; + ortbRequest.bcat = params.bcat; + } + }, + /** + * create IAB standard OpenRTB bid request + */ + _createoRTBRequest: (bidRequests, conf) => { + var oRTBObject = {}; + try { + oRTBObject = { + id: spec._createUUID(), + at: AUCTION_TYPE, + tmax: DEFAULT_TMAX, + cur: [DEFAULT_CURRENCY], + imp: spec._getImpressionArray(bidRequests), + user: {}, + ext: {} + }; + var bid = bidRequests[0]; + var site = spec._getSiteObject(bid, conf); + if (site) { + oRTBObject.site = site; + // add the content object from config in request + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('content') === 'object') { + oRTBObject.site.content = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('content'); + } + } + var app = spec._getAppObject(bid); + if (app) { + oRTBObject.app = app; + if (typeof oRTBObject.app.content !== 'object' && typeof _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('content') === 'object') { + oRTBObject.app.content = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('content') || undefined; + } + } + var device = spec._getDeviceObject(bid); + if (device) { + oRTBObject.device = device; + } + var source = spec._getSourceObject(bid); + if (source) { + oRTBObject.source = source; + } + return oRTBObject; + } catch (ex) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError(LOG_WARN_PREFIX, 'ERROR ', ex); + } + }, + /** + * create impression array objects + */ + _getImpressionArray: request => { + var impArray = []; + var map = request.map(bid => spec._getImpressionObject(bid)); + if (map) { + map.forEach(o => { + if (o) { + impArray.push(o); + } + }); + } + return impArray; + }, + /** + * create impression (single) object + */ + _getImpressionObject: bid => { + var impression = {}; + var bObj; + var vObj; + var sizes = bid.hasOwnProperty('sizes') ? bid.sizes : []; + var mediaTypes = ''; + var format = []; + var params = bid && bid.params ? bid.params : null; + impression = { + id: bid.bidId, + tagid: params.adunitId ? params.adunitId.toString() : undefined, + secure: DEFAULT_SECURE, + bidfloorcur: params.currency ? params.currency : DEFAULT_CURRENCY + }; + if (params.bidFloor) { + impression.bidfloor = params.bidFloor; + } + if (bid.hasOwnProperty('mediaTypes')) { + for (mediaTypes in bid.mediaTypes) { + switch (mediaTypes) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + bObj = spec._getBannerRequest(bid); + if (bObj) { + impression.banner = bObj; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + vObj = spec._getVideoRequest(bid); + if (vObj) { + impression.video = vObj; + } + break; + } + } + } else { + bObj = { + pos: 0, + w: sizes && sizes[0] ? sizes[0][0] : 0, + h: sizes && sizes[0] ? sizes[0][1] : 0 + }; + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray(sizes) && sizes.length > 1) { + sizes = sizes.splice(1, sizes.length - 1); + sizes.forEach(size => { + format.push({ + w: size[0], + h: size[1] + }); + }); + bObj.format = format; + } + impression.banner = bObj; + } + spec._setFloor(impression, bid); + return impression.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) || impression.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) ? impression : undefined; + }, + /** + * set bid floor + */ + _setFloor: (impObj, bid) => { + let bidFloor = -1; + // get lowest floor from floorModule + if (typeof bid.getFloor === 'function') { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].forEach(mediaType => { + if (impObj.hasOwnProperty(mediaType)) { + let floorInfo = bid.getFloor({ + currency: impObj.bidfloorcur, + mediaType: mediaType, + size: '*' + }); + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject(floorInfo) && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) { + let mediaTypeFloor = parseFloat(floorInfo.floor); + bidFloor = bidFloor == -1 ? mediaTypeFloor : Math.min(mediaTypeFloor, bidFloor); + } + } + }); + } + // get highest from impObj.bidfllor and floor from floor module + // as we are using Math.max, it is ok if we have not got any floor from floorModule, then value of bidFloor will be -1 + if (impObj.bidfloor) { + bidFloor = Math.max(bidFloor, impObj.bidfloor); + } + + // assign value only if bidFloor is > 0 + impObj.bidfloor = !isNaN(bidFloor) && bidFloor > 0 ? bidFloor : undefined; + }, + /** + * parse Open RTB response + */ + _parseRTBResponse: (request, response) => { + var bidResponses = []; + try { + if (response.seatbid) { + var currency = response.curr || DEFAULT_CURRENCY; + var seatbid = response.seatbid; + seatbid.forEach(seatbidder => { + var bidder = seatbidder.bid; + bidder.forEach(bid => { + var req = spec._parseJSON(request.data); + var newBid = { + requestId: bid.impid, + cpm: parseFloat(bid.price).toFixed(2), + width: bid.w, + height: bid.h, + creativeId: bid.crid, + currency: currency, + netRevenue: DEFAULT_NET_REVENUE, + ttl: RESPONSE_TTL, + referrer: req.site.ref, + ad: bid.adm + }; + if (bid.dealid) { + newBid.dealId = bid.dealid; + } + if (req.imp && req.imp.length > 0) { + req.imp.forEach(robj => { + if (bid.impid === robj.id) { + spec._checkMediaType(bid.adm, newBid); + switch (newBid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + newBid.width = bid.hasOwnProperty('w') ? bid.w : robj.video.w; + newBid.height = bid.hasOwnProperty('h') ? bid.h : robj.video.h; + newBid.vastXml = bid.adm; + break; + } + } + }); + } + bidResponses.push(newBid); + }); + }); + } + } catch (error) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError(LOG_WARN_PREFIX, 'ERROR ', error); + } + return bidResponses; + }, + /** + * get bid request api end point url + */ + _endPointURL: request => { + var params = request && request[0].params ? request[0].params : null; + if (params) { + pubId = params.pubId ? params.pubId : 0; + adunitId = params.adunitId ? params.adunitId : 0; + return ENDPOINT + '?pid=' + pubId + '&aid=' + adunitId; + } + return null; + }, + /** + * get domain name from url + */ + _getDomain: url => { + var a = document.createElement('a'); + a.setAttribute('href', url); + return a.hostname; + }, + /** + * create the site object + */ + _getSiteObject: (request, conf) => { + var params = request && request.params ? request.params : null; + if (params) { + pubId = params.pubId ? params.pubId : '0'; + var siteId = params.siteId ? params.siteId : '0'; + var appParams = params.app; + if (!appParams) { + return { + publisher: { + id: pubId.toString() + }, + domain: spec._getDomain(conf.pageURL), + id: siteId.toString(), + ref: conf.refURL, + page: conf.pageURL, + cat: params.category, + pagecat: params.page_category + }; + } + } + return null; + }, + /** + * create the app object + */ + _getAppObject: request => { + var params = request && request.params ? request.params : null; + if (params) { + pubId = params.pubId ? params.pubId : 0; + var appParams = params.app; + if (appParams) { + return { + publisher: { + id: pubId.toString() + }, + id: appParams.id, + name: appParams.name, + bundle: appParams.bundle, + storeurl: appParams.storeUrl, + domain: appParams.domain, + cat: appParams.cat || params.category, + pagecat: appParams.pagecat || params.page_category + }; + } + } + return null; + }, + /** + * create the device object + */ + _getDeviceObject: request => { + var params = request && request.params ? request.params : null; + if (params) { + return { + dnt: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT() ? 1 : 0, + ua: navigator.userAgent, + language: navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage, + w: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions().screen.width || _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions().innerWidth, + h: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions().screen.height || _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions().innerHeight, + geo: { + country: params.country, + lat: params.latitude, + lon: params.longitude, + accuracy: params.accuracy, + region: params.region, + city: params.city, + zip: params.zip + }, + ip: params.ip, + make: params.make, + model: params.model, + os: params.os, + carrier: params.carrier, + devicetype: params.device_type, + ifa: params.ifa + }; + } + return null; + }, + /** + * create source object + */ + _getSourceObject: request => { + var params = request && request.params ? request.params : null; + if (params) { + return { + pchain: params.pchain, + ext: { + schain: request.schain + } + }; + } + return null; + }, + /** + * get request ad sizes + */ + _getSizes: request => { + if (request && request.sizes && _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray(request.sizes[0]) && request.sizes[0].length > 0) { + return request.sizes[0]; + } + return null; + }, + /** + * create the banner object + */ + _getBannerRequest: bid => { + var bObj; + var adFormat = []; + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid, 'mediaTypes.banner')) { + var params = bid ? bid.params : null; + var bannerData = params && params.banner; + var sizes = spec._getSizes(bid) || []; + if (sizes && sizes.length == 0) { + sizes = bid.mediaTypes.banner.sizes[0]; + } + if (sizes && sizes.length > 0) { + bObj = {}; + bObj.w = sizes[0]; + bObj.h = sizes[1]; + bObj.pos = 0; + if (bannerData) { + bObj = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone(bannerData); + } + sizes = bid.mediaTypes.banner.sizes; + if (sizes.length > 0) { + adFormat = []; + sizes.forEach(function (size) { + if (size.length > 1) { + adFormat.push({ + w: size[0], + h: size[1] + }); + } + }); + if (adFormat.length > 0) { + bObj.format = adFormat; + } + } + } else { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(LOG_WARN_PREFIX + 'Error: mediaTypes.banner.sizes missing for adunit: ' + bid.params.adunitId); + } + } + return bObj; + }, + /** + * create the video object + */ + _getVideoRequest: bid => { + var vObj; + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid, 'mediaTypes.video')) { + var params = bid ? bid.params : null; + var videoData = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep(_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid.mediaTypes, 'video'), params.video); + var sizes = bid.mediaTypes.video ? bid.mediaTypes.video.playerSize : []; + if (sizes && sizes.length > 0) { + vObj = {}; + if (videoData) { + vObj = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone(videoData); + } + vObj.w = sizes[0]; + vObj.h = sizes[1]; + } else { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(LOG_WARN_PREFIX + 'Error: mediaTypes.video.sizes missing for adunit: ' + bid.params.adunitId); + } + } + return vObj; + }, + /** + * check media type + */ + _checkMediaType: (adm, newBid) => { + // Create a regex here to check the strings + var videoRegex = new RegExp(/VAST.*version/); + if (videoRegex.test(adm)) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('lemmaDigitalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lemmaDigitalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lifestreetBidAdapter"],{ + +/***/ "./modules/lifestreetBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/lifestreetBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const BIDDER_CODE = 'lifestreet'; +const ADAPTER_VERSION = "9.45.0-pre"; +const urlTemplate = template`https://ads.lfstmedia.com/gate/${'adapter'}/${'slot'}?adkey=${'adkey'}&ad_size=${'ad_size'}&__location=${'location'}&__referrer=${'referrer'}&__wn=${'wn'}&__sf=${'sf'}&__fif=${'fif'}&__if=${'if'}&__stamp=${'stamp'}&__pp=1&__hb=1&_prebid_json=1&__gz=1&deferred_format=vast_2_0,vast_3_0&__hbver=${'hbver'}`; + +/** + * A helper function for template to generate string from boolean + */ +function boolToString(value) { + return value ? '1' : '0'; +} + +/** + * A helper function to form URL from the template + */ +function template(strings) { + for (var _len = arguments.length, keys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + keys[_key - 1] = arguments[_key]; + } + return function () { + for (var _len2 = arguments.length, values = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + values[_key2] = arguments[_key2]; + } + let dict = values[values.length - 1] || {}; + let result = [strings[0]]; + keys.forEach(function (key, i) { + let value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(key) ? values[key] : dict[key]; + result.push(value, strings[i + 1]); + }); + return result.join(''); + }; +} + +/** + * Creates a bid requests for a given bid. + * + * @param {BidRequest} bid The bid params to use for formatting a request + */ +function formatBidRequest(bid) { + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const { + params + } = bid; + const { + referer + } = bidderRequest.refererInfo || {}; + let url = urlTemplate({ + adapter: 'prebid', + slot: params.slot, + adkey: params.adkey, + ad_size: params.ad_size, + location: referer, + referrer: referer, + wn: boolToString(/fb_http/i.test(window.name)), + sf: boolToString(window['sfAPI'] || window['$sf']), + fif: boolToString(window['inDapIF'] === true), + if: boolToString(window !== window.top), + stamp: new Date().getTime(), + hbver: ADAPTER_VERSION + }); + if (bidderRequest.gdprConsent) { + if (bidderRequest.gdprConsent.gdprApplies !== undefined) { + const gdpr = '&__gdpr=' + (bidderRequest.gdprConsent.gdprApplies ? '1' : '0'); + url += gdpr; + } + if (bidderRequest.gdprConsent.consentString !== undefined) { + url += `&__consent=${bidderRequest.gdprConsent.consentString}`; + } + } + + // ccpa support + if (bidderRequest.uspConsent) { + url += `&__us_privacy=${bidderRequest.uspConsent}`; + } + return { + method: 'GET', + url: url, + bidId: bid.bidId + }; +} +function isResponseValid(response) { + return !/^\s*\{\s*"advertisementAvailable"\s*:\s*false/i.test(response.content) && response.content.indexOf('') === -1 && /* (typeof response.cpm !== 'undefined') && */ + response.status === 1; +} +const spec = { + code: BIDDER_CODE, + aliases: ['lsm'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: function () { + let bid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const { + params = {} + } = bid; + return !!(params.slot && params.adkey && params.ad_size); + }, + buildRequests: (validBidRequests, bidderRequest) => { + return validBidRequests.map(bid => { + return formatBidRequest(bid, bidderRequest); + }); + }, + interpretResponse: (serverResponse, bidRequest) => { + const bidResponses = []; + let response = serverResponse.body; + if (!isResponseValid(response)) { + return bidResponses; + } + const isVideo = response.content_type.indexOf('vast') > -1; + const mediaType = isVideo ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + const bidResponse = { + requestId: bidRequest.bidId, + cpm: response.cpm, + currency: response.currency ? response.currency : 'USD', + width: response.width, + height: response.height, + creativeId: response.creativeId, + netRevenue: response.netRevenue ? response.netRevenue : true, + ttl: response.ttl ? response.ttl : 86400, + mediaType, + meta: { + mediaType, + advertiserDomains: response.advertiserDomains + } + }; + if (response.hasOwnProperty('dealId')) { + bidResponse.dealId = response.dealId; + } + if (isVideo) { + if (typeof response.vastUrl !== 'undefined') { + bidResponse.vastUrl = response.vastUrl; + } else { + bidResponse.vastXml = response.content; + } + } else { + bidResponse.ad = response.content; + } + bidResponses.push(bidResponse); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('lifestreetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lifestreetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["limelightDigitalBidAdapter"],{ + +/***/ "./modules/limelightDigitalBidAdapter.js": +/*!***********************************************!*\ + !*** ./modules/limelightDigitalBidAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'limelightDigital'; + +/** + * Determines whether or not the given bid response is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ +function isBidResponseValid(bid) { + if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency || !bid.meta.advertiserDomains) { + return false; + } + switch (bid.meta.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + return Boolean(bid.width && bid.height && bid.ad); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + return Boolean(bid.vastXml || bid.vastUrl); + } + return false; +} +const spec = { + code: BIDDER_CODE, + aliases: [{ + code: 'pll' + }, { + code: 'iionads', + gvlid: 1358 + }, { + code: 'apester' + }, { + code: 'adsyield' + }, { + code: 'tgm' + }, { + code: 'adtg_org' + }, { + code: 'velonium' + }, { + code: 'orangeclickmedia', + gvlid: 1148 + }, { + code: 'streamvision' + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + return Boolean(bid.bidId && bid.params && bid.params.host && bid.params.adUnitType && (bid.params.adUnitId || bid.params.adUnitId === 0)); + }, + /** + * Make a server request from the list of BidRequests. + * + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + let winTop; + try { + winTop = window.top; + winTop.location.toString(); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(e); + winTop = window; + } + const placements = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.groupBy)(validBidRequests.map(bidRequest => buildPlacement(bidRequest)), 'host'); + return Object.keys(placements).map(host => buildRequest(winTop, host, placements[host].map(placement => placement.adUnit), bidderRequest)); + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Object} bid The bid that won the auction + */ + onBidWon: bid => { + const cpm = bid.pbMg; + if (bid.nurl !== '') { + bid.nurl = bid.nurl.replace(/\$\{AUCTION_PRICE\}/, cpm); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(bid.nurl, null); + } + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (serverResponse, bidRequest) => { + const bidResponses = []; + const serverBody = serverResponse.body; + const len = serverBody.length; + for (let i = 0; i < len; i++) { + const bidResponse = serverBody[i]; + if (isBidResponseValid(bidResponse)) { + bidResponses.push(bidResponse); + } + } + return bidResponses; + }, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + const iframeSyncs = []; + const imageSyncs = []; + for (let i = 0; i < serverResponses.length; i++) { + const serverResponseHeaders = serverResponses[i].headers; + const imgSync = serverResponseHeaders != null && syncOptions.pixelEnabled ? serverResponseHeaders.get('x-pll-usersync-image') : null; + const iframeSync = serverResponseHeaders != null && syncOptions.iframeEnabled ? serverResponseHeaders.get('x-pll-usersync-iframe') : null; + if (iframeSync != null) { + iframeSyncs.push(iframeSync); + } else if (imgSync != null) { + imageSyncs.push(imgSync); + } + } + return [iframeSyncs.filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques).map(it => { + return { + type: 'iframe', + url: it + }; + }), imageSyncs.filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques).map(it => { + return { + type: 'image', + url: it + }; + })].reduce(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.flatten, []).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +function buildRequest(winTop, host, adUnits, bidderRequest) { + return { + method: 'POST', + url: `https://${host}/hb`, + data: { + secure: location.protocol === 'https:', + deviceWidth: winTop.screen.width, + deviceHeight: winTop.screen.height, + adUnits: adUnits, + ortb2: bidderRequest?.ortb2, + refererInfo: bidderRequest?.refererInfo, + sua: bidderRequest?.ortb2?.device?.sua, + page: bidderRequest?.ortb2?.site?.page || bidderRequest?.refererInfo?.page + } + }; +} +function buildPlacement(bidRequest) { + let sizes; + if (bidRequest.mediaTypes) { + switch (bidRequest.params.adUnitType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + if (bidRequest.mediaTypes.banner && bidRequest.mediaTypes.banner.sizes) { + sizes = bidRequest.mediaTypes.banner.sizes; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + if (bidRequest.mediaTypes.video && bidRequest.mediaTypes.video.playerSize) { + sizes = [bidRequest.mediaTypes.video.playerSize]; + } + break; + } + } + sizes = (sizes || []).concat(bidRequest.sizes || []); + return { + host: bidRequest.params.host, + adUnit: { + id: bidRequest.params.adUnitId, + bidId: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + sizes: sizes.map(size => { + return { + width: size[0], + height: size[1] + }; + }), + type: bidRequest.params.adUnitType.toUpperCase(), + ortb2Imp: bidRequest.ortb2Imp, + publisherId: bidRequest.params.publisherId, + userIdAsEids: bidRequest.userIdAsEids, + supplyChain: bidRequest.schain, + custom1: bidRequest.params.custom1, + custom2: bidRequest.params.custom2, + custom3: bidRequest.params.custom3, + custom4: bidRequest.params.custom4, + custom5: bidRequest.params.custom5 + } + }; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('limelightDigitalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/limelightDigitalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["liveIntentAnalyticsAdapter"],{ + +/***/ "./modules/liveIntentAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/liveIntentAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); + + + + + + + + + +const ANALYTICS_TYPE = 'endpoint'; +const URL = 'https://wba.liadm.com/analytic-events'; +const GVL_ID = 148; +const ADAPTER_CODE = 'liveintent'; +const { + AUCTION_INIT, + BID_WON +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const INTEGRATION_ID = "pbjs"; +let partnerIdFromUserIdConfig; +let sendAuctionInitEvents; +let liAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + URL, + ANALYTICS_TYPE +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_INIT: + if (sendAuctionInitEvents) { + handleAuctionInitEvent(args); + } + break; + case BID_WON: + handleBidWonEvent(args); + break; + } + } +}); +function handleAuctionInitEvent(auctionInitEvent) { + const liveIntentIdsPresent = checkLiveIntentIdsPresent(auctionInitEvent.bidderRequests); + + // This is for old integration that enable or disable the user id module + // dependeing on the result of rolling the dice outside of Prebid. + const partnerIdFromAnalyticsLabels = auctionInitEvent.analyticsLabels?.partnerId; + const data = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + aid: auctionInitEvent.auctionId, + u: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page, + ats: auctionInitEvent.timestamp, + pid: partnerIdFromUserIdConfig || partnerIdFromAnalyticsLabels, + iid: INTEGRATION_ID, + tr: window.liTreatmentRate, + me: encodeBoolean(window.liModuleEnabled), + liip: encodeBoolean(liveIntentIdsPresent), + aun: auctionInitEvent?.adUnits?.length || 0 + }; + const filteredData = ignoreUndefined(data); + sendData('auction-init', filteredData); +} +function handleBidWonEvent(bidWonEvent) { + const auction = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index.getAuction({ + auctionId: bidWonEvent.auctionId + }); + const liveIntentIdsPresent = checkLiveIntentIdsPresent(auction?.getBidRequests()); + + // This is for old integration that enable or disable the user id module + // depending on the result of rolling the dice outside of Prebid. + const partnerIdFromAnalyticsLabels = bidWonEvent.analyticsLabels?.partnerId; + const data = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + aid: bidWonEvent.auctionId, + u: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page, + ats: auction?.getAuctionStart(), + auc: bidWonEvent.adUnitCode, + auid: bidWonEvent.adUnitId, + cpm: bidWonEvent.cpm, + c: bidWonEvent.currency, + b: bidWonEvent.bidder, + bc: bidWonEvent.bidderCode, + pid: partnerIdFromUserIdConfig || partnerIdFromAnalyticsLabels, + iid: INTEGRATION_ID, + sts: bidWonEvent.requestTimestamp, + rts: bidWonEvent.responseTimestamp, + tr: window.liTreatmentRate, + me: encodeBoolean(window.liModuleEnabled), + liip: encodeBoolean(liveIntentIdsPresent) + }; + const filteredData = ignoreUndefined(data); + sendData('bid-won', filteredData); +} +function encodeBoolean(value) { + return value === undefined ? undefined : value ? 'y' : 'n'; +} +function checkLiveIntentIdsPresent(bidRequests) { + const eids = bidRequests?.flatMap(r => r?.bids).flatMap(b => b?.userIdAsEids); + return !!eids.find(eid => eid?.source === 'liveintent.com') || !!eids.flatMap(e => e?.uids).find(u => u?.ext?.provider === 'liveintent.com'); +} +function sendData(path, data) { + const fields = Object.entries(data); + if (fields.length > 0) { + const params = fields.map(_ref2 => { + let [key, value] = _ref2; + return key + '=' + encodeURIComponent(value); + }).join('&'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(URL + '/' + path + '?' + params, undefined, null, { + method: 'GET' + }); + } +} +function ignoreUndefined(data) { + const filteredData = Object.entries(data).filter(_ref3 => { + let [key, value] = _ref3; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(value) || value; + }); + return Object.fromEntries(filteredData); +} + +// save the base class function +liAnalytics.originEnableAnalytics = liAnalytics.enableAnalytics; +// override enableAnalytics so we can get access to the config passed in from the page +liAnalytics.enableAnalytics = function (config) { + const userIdModuleConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('userSync.userIds').filter(m => m.name == 'liveIntentId')?.at(0)?.params; + partnerIdFromUserIdConfig = userIdModuleConfig?.liCollectConfig?.appId || userIdModuleConfig?.distributorId; + sendAuctionInitEvents = config?.options.sendAuctionInitEvents; + liAnalytics.originEnableAnalytics(config); // call the base class function +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: liAnalytics, + code: ADAPTER_CODE, + gvlid: GVL_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (liAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('liveIntentAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/liveIntentAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["liveIntentIdSystem"],{ + +/***/ "./modules/liveIntentIdSystem.js": +/*!***************************************!*\ + !*** ./modules/liveIntentIdSystem.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export liveIntentIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); + +function loadModule() { + // Load appropriate module based on the build flag. Constant folding ensures + // that the other one will not be included in the bundle. + // eslint-disable-next-line no-constant-condition + if (false) {} else { + // eslint-disable-next-line no-restricted-globals + return __webpack_require__(/*! ../libraries/liveIntentId/idSystem.js */ "./libraries/liveIntentId/idSystem.js"); + } +} +const liveIntentIdSubmodule = loadModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.registerModule)('liveIntentIdSystem'); + +/***/ }), + +/***/ "./node_modules/live-connect-common/dist/index.mjs": +/*!*********************************************************!*\ + !*** ./node_modules/live-connect-common/dist/index.mjs ***! + \*********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ERRORS_CHANNEL: () => (/* binding */ ERRORS_CHANNEL), +/* harmony export */ ReplayEmitter: () => (/* binding */ ReplayEmitter), +/* harmony export */ expiresInDays: () => (/* binding */ expiresInDays), +/* harmony export */ isArray: () => (/* binding */ isArray), +/* harmony export */ isFunction: () => (/* binding */ isFunction), +/* harmony export */ isObject: () => (/* binding */ isObject), +/* harmony export */ isRecord: () => (/* binding */ isRecord), +/* harmony export */ isString: () => (/* binding */ isString), +/* harmony export */ isUUID: () => (/* binding */ isUUID), +/* harmony export */ nonNull: () => (/* binding */ nonNull), +/* harmony export */ onNonNull: () => (/* binding */ onNonNull), +/* harmony export */ safeToString: () => (/* binding */ safeToString), +/* harmony export */ strEqualsIgnoreCase: () => (/* binding */ strEqualsIgnoreCase), +/* harmony export */ trim: () => (/* binding */ trim), +/* harmony export */ wrapError: () => (/* binding */ wrapError) +/* harmony export */ }); +/* unused harmony exports UUID, expiresInHours, isNonEmpty */ +const UUID = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'; +const uuidRegex = new RegExp(`^${UUID}$`, 'i'); +const hasTrim = !!String.prototype.trim; +function onNonNull(value, fn) { + return value != null ? fn(value) : value; +} +function safeToString(value) { + return typeof value === 'object' ? JSON.stringify(value) : ('' + value); +} +function nonNull(value) { + return value != null; +} +function isNonEmpty(value) { + return nonNull(value) && trim(value).length > 0; +} +function isUUID(value) { + return !!value && uuidRegex.test(trim(value)); +} +function isArray(arr) { + return Object.prototype.toString.call(arr) === '[object Array]'; +} +function trim(value) { + return hasTrim ? ('' + value).trim() : ('' + value).replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); +} +function isString(str) { + return typeof str === 'string'; +} +function strEqualsIgnoreCase(fistStr, secondStr) { + return isString(fistStr) && isString(secondStr) && trim(fistStr.toLowerCase()) === trim(secondStr.toLowerCase()); +} +function isObject(obj) { + return !!obj && typeof obj === 'object' && !isArray(obj); +} +function isRecord(obj) { + return isObject(obj); +} +function isFunction(fun) { + return !!fun && typeof fun === 'function'; +} +function _expiresIn(expires, number) { + return new Date((new Date().getTime() + (expires * number))); +} +function expiresInDays(expires) { + return _expiresIn(expires, 864e5); +} +function expiresInHours(expires) { + return _expiresIn(expires, 36e5); +} +function wrapError(name, e, message) { + if (isObject(e)) { + let error; + if ('message' in e && typeof e.message === 'string') { + error = new Error(message || e.message); + } + else { + error = new Error(message); + } + error.name = name; + if ('stack' in e && typeof e.stack === 'string') { + error.stack = e.stack; + } + if ('lineNumber' in e && typeof e.lineNumber === 'number') { + error.lineNumber = e.lineNumber; + } + if ('columnNumber' in e && typeof e.columnNumber === 'number') { + error.columnNumber = e.columnNumber; + } + return error; + } + else { + const error = Error(message); + error.name = name; + return error; + } +} + +const ERRORS_CHANNEL = 'li_errors'; + +class ReplayEmitter { + data; + constructor(replaySize) { + const size = parseInt(replaySize.toString()) || 5; + this.data = { + h: {}, + q: {}, + size + }; + } + on(name, callback, ctx) { + const handler = { + callback: callback.bind(ctx), + unbound: callback + }; + this.data = { ...this.data, h: { ...this.data.h, [name]: [...(this.data.h[name] || []), handler] } }; + (this.data.q[name] || []).forEach(i => callback.call(ctx, i)); + return this; + } + once(name, callback, ctx) { + const eventQueue = this.data.q[name] || []; + if (eventQueue.length > 0) { + callback.call(ctx, eventQueue[0]); + return this; + } + else { + const listener = (args) => { + this.off(name, listener); + callback.call(ctx, args); + }; + listener._ = callback; + return this.on(name, listener, ctx); + } + } + emit(name, event) { + (this.data.h[name] || []).forEach(i => i.callback(event)); + const queue = this.data.q[name] || []; + this.data = { + ...this.data, + q: { + ...this.data.q, + [name]: [...(queue.length < this.data.size ? queue : queue.slice(1)), event] + } + }; + return this; + } + off(name, callback) { + const handlers = this.data.h[name]; + const liveHandlers = (handlers && callback && handlers.filter(h => h.unbound !== callback)) || []; + if (liveHandlers.length) { + this.data = { ...this.data, h: { ...this.data.h, [name]: liveHandlers } }; + } + else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { [name]: _, ...rest } = this.data.h; + this.data = { ...this.data, h: rest }; + } + return this; + } + emitErrorWithMessage(name, message, exception) { + const wrappedError = wrapError(name, exception, message); + return this.emit(ERRORS_CHANNEL, wrappedError); + } + emitError(name, exception) { + const wrappedError = wrapError(name, exception); + return this.emit(ERRORS_CHANNEL, wrappedError); + } +} + + + + +/***/ }), + +/***/ "./node_modules/live-connect-js/dist/index.mjs": +/*!*****************************************************!*\ + !*** ./node_modules/live-connect-js/dist/index.mjs ***! + \*****************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ LiveConnect: () => (/* binding */ LiveConnect) +/* harmony export */ }); +/* unused harmony exports MinimalLiveConnect, StandardLiveConnect */ +/* harmony import */ var _initializer_CySMtDUt_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./initializer-CySMtDUt.mjs */ "./node_modules/live-connect-js/dist/initializer-CySMtDUt.mjs"); +/* harmony import */ var live_connect_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! live-connect-common */ "./node_modules/live-connect-common/dist/index.mjs"); +/* harmony import */ var tiny_hashes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tiny-hashes */ "./node_modules/tiny-hashes/dist/index.mjs"); + + + + + +// upcasted versions of the internal APIs +const LiveConnect = _initializer_CySMtDUt_mjs__WEBPACK_IMPORTED_MODULE_0__.L; +const StandardLiveConnect = _initializer_CySMtDUt_mjs__WEBPACK_IMPORTED_MODULE_0__.a; +const MinimalLiveConnect = _initializer_CySMtDUt_mjs__WEBPACK_IMPORTED_MODULE_0__.M; + + + + +/***/ }), + +/***/ "./node_modules/live-connect-js/dist/initializer-CySMtDUt.mjs": +/*!********************************************************************!*\ + !*** ./node_modules/live-connect-js/dist/initializer-CySMtDUt.mjs ***! + \********************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ L: () => (/* binding */ LiveConnect), +/* harmony export */ M: () => (/* binding */ MinimalLiveConnect), +/* harmony export */ a: () => (/* binding */ StandardLiveConnect) +/* harmony export */ }); +/* unused harmony exports Q, S, W, b, c, e */ +/* harmony import */ var live_connect_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! live-connect-common */ "./node_modules/live-connect-common/dist/index.mjs"); +/* harmony import */ var tiny_hashes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-hashes */ "./node_modules/tiny-hashes/dist/index.mjs"); + + + +const DEFAULT_AJAX_TIMEOUT = 0; +const DEFAULT_AJAX_RETRIES = 3; +class PixelSender { + url; + timeout; + calls; + eventBus; + retries; + constructor(opts) { + this.url = opts.collectorUrl ?? 'https://rp.liadm.com'; + this.timeout = opts.ajaxTimeout ?? DEFAULT_AJAX_TIMEOUT; + this.calls = opts.callHandler; + this.eventBus = opts.eventBus; + this.retries = opts.ajaxRetries ?? DEFAULT_AJAX_RETRIES; + } + callBakers(bakersJson) { + try { + const bakers = JSON.parse(bakersJson).bakers; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(bakers)) { + for (let i = 0; i < bakers.length; i++) + this.calls.pixelGet(`${bakers[i]}?dtstmp=${Date.now()}`); + } + } + catch (e) { + this.eventBus.emitErrorWithMessage('CallBakers', `Error while calling bakers with ${bakersJson}`, e); + } + } + sendState(state, endpoint, makeCall, onPreSend) { + if (state.sendsPixel()) { + if (onPreSend && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(onPreSend)) { + onPreSend(); + } + const query = state.asQuery().add('dtstmp', Date.now(), { prepend: true }).toQueryString(); + const uri = `${this.url}/${endpoint}${query}`; + makeCall(uri); + } + } + sendAjax(state, opts = {}) { + this.sendState(state, 'j', uri => { + const go = (remainingRetries) => { + // additionally set headers extracted from the state only if the state is not empty + const headers = state.asHeaders(); + this.calls.ajaxGet(uri, bakersJson => { + if (opts.onLoad && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(opts.onLoad)) + opts.onLoad(); + this.callBakers(bakersJson); + }, (e) => { + if (remainingRetries <= 0) { + this.sendPixel(state, opts); + this.eventBus.emitError('AjaxFailed', e); + } + else { + go(remainingRetries - 1); + } + }, this.timeout, headers); + }; + go(this.retries); + }, opts.onPreSend); + } + sendPixel(state, opts = {}) { + this.sendState(state, 'p', uri => this.calls.pixelGet(uri, opts.onLoad), opts.onPreSend); + } +} + +const EVENT_BUS_NAMESPACE = '__li__evt_bus'; +// reexport for backwards compat +const ERRORS_PREFIX = live_connect_common__WEBPACK_IMPORTED_MODULE_0__.ERRORS_CHANNEL; +const PIXEL_SENT_PREFIX = 'lips'; +const PRELOAD_PIXEL = 'pre_lips'; +const PEOPLE_VERIFIED_LS_ENTRY = '_li_duid'; +const DEFAULT_IDEX_AJAX_TIMEOUT = 5000; +const DEFAULT_IDEX_URL = 'https://idx.liadm.com/idex'; +const DEFAULT_REQUESTED_ATTRIBUTES = []; // legacy behaviour; resolves nonId as unifiedId + +var consts = /*#__PURE__*/Object.freeze({ + __proto__: null, + DEFAULT_IDEX_AJAX_TIMEOUT: DEFAULT_IDEX_AJAX_TIMEOUT, + DEFAULT_IDEX_URL: DEFAULT_IDEX_URL, + DEFAULT_REQUESTED_ATTRIBUTES: DEFAULT_REQUESTED_ATTRIBUTES, + ERRORS_PREFIX: ERRORS_PREFIX, + EVENT_BUS_NAMESPACE: EVENT_BUS_NAMESPACE, + PEOPLE_VERIFIED_LS_ENTRY: PEOPLE_VERIFIED_LS_ENTRY, + PIXEL_SENT_PREFIX: PIXEL_SENT_PREFIX, + PRELOAD_PIXEL: PRELOAD_PIXEL +}); + +// btoa() as defined by the HTML and Infra specs, which mostly just references RFC 4648. +function btoa(s) { + // String conversion as required by Web IDL. + s = `${s}`; + // "The btoa() method must throw an "InvalidCharacterError" DOMException if + // data contains any character whose code point is greater than U+00FF." + for (let i = 0; i < s.length; i++) { + if (s.charCodeAt(i) > 255) { + return null; + } + } + let out = ''; + for (let i = 0; i < s.length; i += 3) { + const groupsOfSix = [undefined, undefined, undefined, undefined]; + groupsOfSix[0] = s.charCodeAt(i) >> 2; + groupsOfSix[1] = (s.charCodeAt(i) & 0x03) << 4; + if (s.length > i + 2) { + groupsOfSix[1] |= s.charCodeAt(i + 1) >> 4; + groupsOfSix[2] = (s.charCodeAt(i + 1) & 0x0f) << 2; + groupsOfSix[2] |= s.charCodeAt(i + 2) >> 6; + groupsOfSix[3] = s.charCodeAt(i + 2) & 0x3f; + } + else if (s.length > i + 1) { + groupsOfSix[1] |= s.charCodeAt(i + 1) >> 4; + groupsOfSix[2] = (s.charCodeAt(i + 1) & 0x0f) << 2; + } + for (let j = 0; j < groupsOfSix.length; j++) { + const element = groupsOfSix[j]; + if (typeof element === 'undefined') { + out += '='; + } + else { + out += btoaLookup(element); + } + } + } + return out; +} +// Lookup table for btoa(), which converts a six-bit number into the corresponding ASCII character. +const keystr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +function btoaLookup(index) { + return (index >= 0 && index < 64) ? keystr[index] : undefined; +} + +function _safeBtoa(s) { + const res = btoa(s); + return res || ''; +} +const _base64encodeRegex = /[+/]|=+$/g; +const _base64ToUrlEncodedChars = { + '+': '-', + '/': '_' +}; +function _replaceBase64Chars(x) { + return _base64ToUrlEncodedChars[x] || ''; +} +function base64UrlEncode(s) { + let btoa = null; + // First we escape the string using encodeURIComponent to get the UTF-8 encoding of the characters, + // then we convert the percent encodings into raw bytes, and finally feed it to btoa() function. + const utf8Bytes = encodeURIComponent(s).replace(/%([0-9A-F]{2})/g, (match, p1) => String.fromCharCode(parseInt('0x' + p1, 16))); + try { + btoa = (window && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(window.btoa)) ? window.btoa : _safeBtoa; + } + catch (e) { + btoa = _safeBtoa; + } + return btoa(utf8Bytes).replace(_base64encodeRegex, _replaceBase64Chars); +} + +const hashLikeRegex = () => /(\s+)?[a-f0-9]{32,64}(\s+)?/gi; +const lengthToHashType = new Map([[32, 'md5'], [40, 'sha1'], [64, 'sha256']]); +function isHash(hash) { + const extractedHash = extractHashValue(hash); + return !!extractedHash && lengthToHashType.has(extractedHash.length); +} +function extractHashValue(s) { + const result = s.match(hashLikeRegex()); + return result && result.map(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)[0]; +} +function hashEmail(email) { + const lowerCasedEmail = email.toLowerCase(); + return { + md5: (0,tiny_hashes__WEBPACK_IMPORTED_MODULE_1__.md5)(lowerCasedEmail), + sha1: (0,tiny_hashes__WEBPACK_IMPORTED_MODULE_1__.sha1)(lowerCasedEmail), + sha256: (0,tiny_hashes__WEBPACK_IMPORTED_MODULE_1__.sha256)(lowerCasedEmail) + }; +} +function domainHash(domain, limit = 12) { + return (0,tiny_hashes__WEBPACK_IMPORTED_MODULE_1__.sha1)(domain.replace(/^\./, '')).substring(0, limit); +} + +const emailRegex = () => /\S+(@|%40)\S+\.\S+/; +function isEmail(s) { + return emailRegex().test(s); +} +function containsEmailField(s) { + return emailRegex().test(s); +} +function extractEmail(s) { + const result = s.match(emailRegex()); + return result && result.map(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)[0]; +} +function listEmailsInString(s) { + const result = []; + // eslint-disable-next-line + const emailLikeRegex = `([\\w\\d.+-]+(@|%40)[\\w\\d-]+.[\\w\\d.-]+)`; + const multipleEmailLikeRegex = new RegExp(emailLikeRegex, 'g'); + let current = multipleEmailLikeRegex.exec(s); + while (current) { + result.push((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)(current[1])); + current = multipleEmailLikeRegex.exec(s); + } + return result; +} +function replaceEmailsWithHashes(originalString) { + const emailsInString = listEmailsInString(originalString); + const hashes = []; + let convertedString = originalString; + for (let i = 0; i < emailsInString.length; i++) { + const email = emailsInString[i]; + const emailHashes = hashEmail(email); + convertedString = convertedString.replace(email, emailHashes.md5); + hashes.push(emailHashes); + } + return { + stringWithoutRawEmails: convertedString, + hashesFromOriginalString: hashes + }; +} + +const MASK = '*********'; +function replacer(key, value) { + return (typeof value === 'string' && isEmail((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)(value))) ? MASK : value; +} + +function _isNum(v) { + return isNaN(+v) ? v : +v; +} +function _isNull(v) { + return v === 'null' || v === 'undefined' ? null : v; +} +function _isBoolean(v) { + return v === 'false' ? false : (v === 'true' ? true : v); +} +function _convert(v) { + return _isBoolean(_isNull(_isNum(v))); +} +function _parseParam(params, key) { + if (key in params) { + const value = params[key]; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(value)) { + return value.map(v => _convert(decodeValue(v))); + } + else { + return _convert(decodeValue(value)); + } + } +} +function _allParams(url) { + let questionMarkIndex, queryParams, historyIndex; + const obj = {}; + if (!url || (questionMarkIndex = url.indexOf('?')) === -1 || !(queryParams = url.slice(questionMarkIndex + 1))) { + return obj; + } + if ((historyIndex = queryParams.indexOf('#')) !== -1 && !(queryParams = queryParams.slice(0, historyIndex))) { + return obj; + } + queryParams.split('&').forEach(function (raw) { + if (raw) { + let key; + const split = raw.split('='); + key = split[0]; + const value = split.length === 2 ? split[1] : 'true'; + if (key.slice(-2) === '[]') { + key = key.slice(0, -2); + } + if (key in obj) { + const previous = obj[key]; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(previous)) { + previous.push(value); + } + else { + obj[key] = [previous, value]; + } + } + else { + obj[key] = value; + } + } + }); + return obj; +} +function decodeValue(v) { + return v.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent); +} +function urlParamsArray(url) { + const params = _allParams(url); + const result = []; + Object.keys(params).forEach((k) => { result.push([k, _parseParam(params, k)]); }); + return result; +} +function getQueryParameter(url, name) { + const params = _allParams(url); + return _parseParam(params, name); +} +class ParsedUrl { + hash; + host; + hostname; + pathname; + port; + protocol; + search; + constructor(url) { + // eslint-disable-next-line + const urlRegExp = /^(https?\:\/\/)?(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/; + const match = url.match(urlRegExp); + if (match === null) { + throw new TypeError(`Failed to parse URL: ${url}`); + } + else { + this.protocol = match[1] || ''; + this.host = match[2] || ''; + this.hostname = match[3] || ''; + this.port = match[4] || ''; + this.pathname = match[5] || ''; + this.search = match[6] || ''; + this.hash = match[7] || ''; + } + } + toString() { + return `${this.protocol}${this.host}${this.pathname}${this.search}${this.hash}`; + } +} + +const MAX_ITEMS = 10; +const LIMITING_KEYS = ['items', 'itemids']; +const HASH_BEARERS = ['email', 'emailhash', 'hash', 'hashedemail']; +function extractProvidedAttributes(eventSource) { + const extraFields = { eventSource }; + // add provided email hashes. Only consider the first one found. + for (const key of Object.keys(eventSource)) { + const lowerCased = key.toLowerCase(); + if (HASH_BEARERS.indexOf(lowerCased) > -1) { + const value = (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.safeToString)(eventSource[key])); + const extractedEmail = extractEmail(value); + const extractedHash = extractHashValue(value); + if (extractedEmail) { + const hashes = hashEmail(decodeValue(extractedEmail)); + extraFields.hashedEmail = [hashes.md5, hashes.sha1, hashes.sha256]; + break; + } + else if (extractedHash && isHash(extractedHash)) { + extraFields.hashedEmail = [extractedHash.toLowerCase()]; + break; + } + } + } + // add provided user agent + if (typeof eventSource.userAgent === 'string') { + extraFields.providedUserAgent = eventSource.userAgent; + } + // add provided ip4 address + if (typeof eventSource.ipv4 === 'string') { + extraFields.providedIPV4 = eventSource.ipv4; + } + // add provided ip6 address + if (typeof eventSource.ipv6 === 'string') { + extraFields.providedIPV6 = eventSource.ipv6; + } + return extraFields; +} +function limitItems(event) { + const limitedEvent = {}; + Object.keys(event).forEach(key => { + const lowerCased = key.toLowerCase(); + const value = event[key]; + if (LIMITING_KEYS.indexOf(lowerCased) > -1 && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(value) && value.length > MAX_ITEMS) { + limitedEvent[key] = value.slice(0, MAX_ITEMS); + } + else { + limitedEvent[key] = value; + } + }); + return limitedEvent; +} +function fiddle(event) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isRecord)(event)) { + const extraAttributes = extractProvidedAttributes(event); + return { + ...extraAttributes, + eventSource: limitItems(event) + }; + } + else { + return {}; + } +} +function mergeObjects(obj1, obj2) { + const res = {}; + function clean(obj) { + return (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(obj) ? obj : {}; + } + function keys(obj) { + return Object.keys(obj); + } + const first = clean(obj1); + const second = clean(obj2); + keys(first).forEach(key => { + res[key] = first[key]; + }); + keys(second).forEach(key => { + res[key] = second[key]; + }); + return res; +} + +class QueryBuilder { + tuples; + constructor(tuples = []) { + this.tuples = tuples; + } + add(key, value, options = {}) { + const { stripEmpty = true, prepend = false } = options; + if (key === '') { + return this; + } + else if (stripEmpty && value === '') { + return this; + } + else if (prepend) { + this.tuples.unshift([key, value]); + return this; + } + else { + this.tuples.push([key, value]); + return this; + } + } + addOptional(key, value, options = {}) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.nonNull)(value)) { + return this.add(key, value, options); + } + else { + return this; + } + } + addParamsMap(paramsMap) { + Object.keys(paramsMap).forEach((key) => { + const value = paramsMap[key]; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.nonNull)(value)) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(value)) { + value.forEach(entry => this.add(key, entry)); + } + else { + this.add(key, value); + } + } + }); + return this; + } + copy() { + return new QueryBuilder(this.tuples.slice()); + } + filteredCopy(predicate) { + return new QueryBuilder(this.tuples.filter(([k, v]) => predicate(k, v))); + } + toQueryString() { + let acc = ''; + this.tuples.forEach(([k, v]) => { + const operator = acc.length === 0 ? '?' : '&'; + acc = `${acc}${operator}${encodeURIComponent(k)}=${encodeURIComponent(v)}`; + }); + return acc; + } +} +// for use with QueryBuilder#addOptionalParam. Null has a special meaning for the idCookie. +function encodeIdCookie(value) { + return value === null ? '' : value; +} + +const UrlCollectionModes = { + full: 'full', + noPath: 'no_path' +}; + +function collectUrl(state) { + if (state.pageUrl === undefined || state.pageUrl.length === 0) { + return ['', false, []]; + } + if (isDefaultBehavior(state)) { + return [state.pageUrl, false, []]; + } + const url = new ParsedUrl(state.pageUrl); + const urlQueryParameters = urlParamsArray(url.search); + const pathRemoved = isPathRemoved(url, state); + const blockedParams = paramsToDelete(urlQueryParameters, state); + if (pathRemoved) { + url.pathname = '/'; + } + if (blockedParams.length > 0) { + url.search = queryStringToKeep(urlQueryParameters, blockedParams); + } + return [url.toString(), pathRemoved, blockedParams]; +} +function stripQueryAndPath(pageUrl) { + if (pageUrl.length === 0) { + return undefined; + } + else { + const url = new ParsedUrl(pageUrl); + url.pathname = ''; + url.search = ''; + return url.toString(); + } +} +function isPathRemoved(url, conf) { + return conf.urlCollectionMode === UrlCollectionModes.noPath && url.pathname.length > 1; +} +function paramsToDelete(urlQueryParameters, conf) { + if (conf.queryParametersFilter === undefined || conf.queryParametersFilter === '') { + return []; + } + const filterRegExp = new RegExp(conf.queryParametersFilter); + return urlQueryParameters.map(keyValuePair => keyValuePair[0]).filter(param => filterRegExp.test(param)); +} +function queryStringToKeep(urlQueryParameters, paramsToDelete) { + const params = urlQueryParameters + .filter(param => paramsToDelete.indexOf(param[0]) === -1) + .map(keyValue => `${keyValue[0]}=${keyValue[1]}`); + if (params.length > 0) { + return `?${params.join('&')}`; + } + else { + return ''; + } +} +function isDefaultBehavior(state) { + return (state.urlCollectionMode === undefined || state.urlCollectionMode === UrlCollectionModes.full) && + (state.queryParametersFilter === undefined || state.queryParametersFilter === ''); +} + +const noOpEvents = ['setemail', 'setemailhash', 'sethashedemail']; +class StateWrapper { + data; + constructor(state, eventSource, error, eventBus) { + const data = StateWrapper.safeFiddle(state, eventSource, eventBus); + if (error) { + data.errorDetails = error; + } + this.data = data; + } + static safeFiddle(state, eventSource, eventBus) { + try { + return mergeObjects(state, fiddle(JSON.parse(JSON.stringify(eventSource)))); + } + catch (e) { + console.error(e); + if (eventBus != null) { + eventBus.emitErrorWithMessage('StateCombineWith', 'Error while extracting event data', e); + } + return {}; + } + } + static fromEvent(state, event, eventBus) { + return new StateWrapper(state, event, undefined, eventBus); + } + static fromError(state, error, eventBus) { + return new StateWrapper(state, {}, error, eventBus); + } + setHashedEmail(hashedEmail) { + this.data.hashedEmail = hashedEmail; + } + getHashedEmail() { + return this.data.hashedEmail || []; + } + sendsPixel() { + const source = (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(this.data.eventSource) ? this.data.eventSource : {}; + const eventKeys = Object.keys(source) + .filter(objKey => objKey.toLowerCase() === 'eventname' || objKey.toLowerCase() === 'event'); + const eventKey = eventKeys && eventKeys.length >= 1 && eventKeys[0]; + const eventName = eventKey && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)(source[eventKey]); + return !eventName || noOpEvents.indexOf(eventName.toLowerCase()) === -1; + } + asHeaders() { + return this.data.providedUserAgent ? { 'X-LI-Provided-User-Agent': this.data.providedUserAgent } : {}; + } + asQuery() { + const state = this.data; + // roughly add parameters in order of importance as the url might get truncated + const builder = new QueryBuilder() + .addOptional('aid', state.appId) + .addOptional('did', state.distributorId) + .addOptional('se', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(state.eventSource, s => base64UrlEncode(JSON.stringify(s, replacer)))) + .addOptional('duid', state.liveConnectId) + .addOptional('tv', state.trackerVersion); + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.nonNull)(state.pageUrl)) { + const [url, isPathRemoved, blockedParams] = collectUrl(state); + builder + .add('pu', url) + .addOptional('pu_rp', isPathRemoved ? '1' : undefined) + .add('pu_rqp', blockedParams.join(',')); + } + builder.addOptional('ae', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(state.errorDetails, ed => base64UrlEncode(JSON.stringify(ed)))); + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(state.retrievedIdentifiers)) { + state.retrievedIdentifiers.forEach((i) => builder.add(`ext_${i.name}`, i.value)); + } + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(state.hashesFromIdentifiers)) { + state.hashesFromIdentifiers.forEach((h) => builder.add('scre', `${h.md5},${h.sha1},${h.sha256}`)); + } + builder + .addOptional('li_did', state.decisionIds?.join(',')) + .addOptional('e', state.hashedEmail?.join(',')) + .addOptional('us_privacy', state.usPrivacyString) + .addOptional('wpn', state.wrapperName) + .addOptional('gdpr', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(state.gdprApplies, v => v ? '1' : '0')) + .addOptional('gdpr_consent', state.gdprConsent) + .addOptional('refr', state.referrer) + .addOptional('gpp_s', state.gppString) + .addOptional('gpp_as', state.gppApplicableSections?.join(',')) + .addOptional('cd', state.cookieDomain) + .addOptional('ic', encodeIdCookie(state.resolvedIdCookie), { stripEmpty: false }) + .addOptional('c', state.contextElements) + .addOptional('pip', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(state.providedIPV4, v => base64UrlEncode(v))) + .addOptional('pip6', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(state.providedIPV6, v => base64UrlEncode(v))); + return builder; + } +} + +function loadedDomain() { + return (document.domain || (document.location && document.location.host)) || (window && window.location && window.location.host) || 'localhost'; +} +function getReferrer(win = window) { + return _safeGet(() => win.top.document.referrer); +} +function getPage(win = window) { + const ancestorOrigins = _safeGet(() => win.location.ancestorOrigins) || []; + const windows = []; + let currentWindow = win; + while (currentWindow !== top) { + windows.push(currentWindow); + currentWindow = currentWindow.parent; + } + windows.push(currentWindow); + let detectedPageUrl; + for (let i = windows.length - 1; i >= 0 && !detectedPageUrl; i--) { + detectedPageUrl = _safeGet(() => windows[i].location.href); + if (i !== 0) { + if (!detectedPageUrl) + detectedPageUrl = _safeGet(() => windows[i - 1].document.referrer); + if (!detectedPageUrl) + detectedPageUrl = ancestorOrigins[i - 1]; + } + } + return detectedPageUrl; +} +function getContextElements(privacyMode, contextSelectors, contextElementsLength) { + if (privacyMode || !contextSelectors || contextSelectors === '' || !contextElementsLength) { + return ''; + } + else { + const collectedElements = _collectElementsText(contextSelectors, contextElementsLength); + return base64UrlEncode(collectedElements); + } +} +function _collectElementsText(contextSelectors, contextElementsLength) { + const collectedElements = window.document.querySelectorAll(contextSelectors); + let collectedString = ''; + for (let i = 0; i < collectedElements.length; i++) { + const nextElement = replaceEmailsWithHashes(collectedElements[i].outerHTML).stringWithoutRawEmails; + const maybeCollectedString = collectedString + nextElement; + if (encodedByteCount(maybeCollectedString) <= contextElementsLength) + collectedString = maybeCollectedString; + else + return collectedString; + } + return collectedString; +} +function encodedByteCount(s) { + // From: https://stackoverflow.com/questions/2219526/how-many-bytes-in-a-javascript-string + return Math.ceil(new Blob([s]).size * 4 / 3.0); +} +function _safeGet(getter) { + try { + return getter(); + } + catch (e) { + return undefined; + } +} + +const enrichPage = state => ({ + ...state, + pageUrl: getPage(), + referrer: getReferrer(), + contextElements: getContextElements(state.privacyMode, state.contextSelectors, state.contextElementsLength) +}); + +function enrichIdentifiers$1(storageHandler, eventBus) { + return state => { + try { + return { ...state, ...getIdentifiers(parseIdentifiersToResolve(state.identifiersToResolve), storageHandler) }; + } + catch (e) { + eventBus.emitError('IdentifiersEnricher', e); + return { ...state, retrievedIdentifiers: [], hashesFromIdentifiers: [] }; + } + }; +} +function parseIdentifiersToResolve(identifiersToResolve) { + let cookieNames = []; + if (identifiersToResolve) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(identifiersToResolve)) { + cookieNames = identifiersToResolve; + } + else if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isString)(identifiersToResolve)) { + cookieNames = identifiersToResolve.split(','); + } + } + for (let i = 0; i < cookieNames.length; i++) { + cookieNames[i] = cookieNames[i].trim(); + } + return cookieNames; +} +function getIdentifiers(cookieNames, storageHandler) { + const identifiers = []; + let hashes = []; + for (let i = 0; i < cookieNames.length; i++) { + const identifierName = cookieNames[i]; + const identifierValue = storageHandler.getCookie(identifierName) || storageHandler.getDataFromLocalStorage(identifierName); + if (identifierValue) { + const cookieAndHashes = replaceEmailsWithHashes((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.safeToString)(identifierValue)); + identifiers.push({ + name: identifierName, + value: cookieAndHashes.stringWithoutRawEmails + }); + hashes = hashes.concat(cookieAndHashes.hashesFromOriginalString); + } + } + return { + retrievedIdentifiers: identifiers, + hashesFromIdentifiers: deduplicateHashes(hashes) + }; +} +function deduplicateHashes(hashes) { + const seen = new Set(); + const result = []; + for (let i = 0; i < hashes.length; i++) { + if (!seen.has(hashes[i].md5)) { + result.push(hashes[i]); + seen.add(hashes[i].md5); + } + } + return result; +} + +const enrichPrivacyMode = state => ({ ...state, privacyMode: !!state.gdprApplies || (state.gppApplicableSections ?? []).indexOf(2) > -1 }); + +function removeInvalidPairs(config, eventBus) { + if (config && config.appId && config.distributorId) { + const distributorId = config.distributorId; + delete config.distributorId; + eventBus.emitError('AppIdAndDistributorIdPresent', new Error(`Event contains both appId: ${config.appId} and distributorId: ${distributorId}. Ignoring distributorId`)); + } + return config; +} + +const ID_COOKIE_ATTR = 'idCookie'; +class IdentityResolver { + eventBus; + calls; + idexConfig; + externalIds; + source; + publisherId; + url; + timeout; + extraAttributes; + requestedAttributes; + // Be careful, this object is mutable. In cases where temporary changes are needed + // - e.g. adding parameters that are only valid for one single call - ensure to copy it + query; + privacyMode; + resolvedIdCookie; + generateIdCookie; + peopleVerifiedId; + pageUrl; + constructor(config, calls, eventBus) { + const nonNullConfig = config || { identityResolutionConfig: {} }; + this.eventBus = eventBus; + this.calls = calls; + this.idexConfig = nonNullConfig.identityResolutionConfig || {}; + this.extraAttributes = this.idexConfig.extraAttributes || {}; + this.externalIds = nonNullConfig.retrievedIdentifiers || []; + this.source = this.idexConfig.source || 'unknown'; + this.publisherId = this.idexConfig.publisherId || 'any'; + this.url = this.idexConfig.url || DEFAULT_IDEX_URL; + this.timeout = this.idexConfig.ajaxTimeout || nonNullConfig.ajaxTimeout || DEFAULT_IDEX_AJAX_TIMEOUT; + this.requestedAttributes = this.idexConfig.requestedAttributes || DEFAULT_REQUESTED_ATTRIBUTES; + this.privacyMode = nonNullConfig.privacyMode ?? false; + this.resolvedIdCookie = nonNullConfig.resolvedIdCookie; + this.generateIdCookie = this.idexConfig.idCookieMode === 'generated'; + this.peopleVerifiedId = nonNullConfig.peopleVerifiedId; + this.pageUrl = nonNullConfig.pageUrl; + this.query = new QueryBuilder() + .addOptional('duid', nonNullConfig.peopleVerifiedId) + .addOptional('us_privacy', nonNullConfig.usPrivacyString) + .addOptional('gdpr', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(nonNullConfig.gdprApplies, v => v ? 1 : 0)) + .addOptional('gdpr_consent', nonNullConfig.gdprConsent) + .addOptional('did', nonNullConfig.distributorId) + .addOptional('gpp_s', nonNullConfig.gppString) + .addOptional('gpp_as', nonNullConfig.gppApplicableSections?.join(',')) + .addOptional('cd', nonNullConfig.cookieDomain) + .addOptional('ic', encodeIdCookie(nonNullConfig.resolvedIdCookie), { stripEmpty: false }) + .addOptional('pu', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(nonNullConfig.pageUrl, stripQueryAndPath)) + .addOptional('pip', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(this.extraAttributes.ipv4, v => base64UrlEncode(v))) + .addOptional('pip6', (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.onNonNull)(this.extraAttributes.ipv6, v => base64UrlEncode(v))); + this.externalIds.forEach(retrievedIdentifier => { + this.query.add(retrievedIdentifier.name, retrievedIdentifier.value); + }); + this.requestedAttributes.forEach(requestedAttribute => { + this.query.add('resolve', requestedAttribute); + }); + } + attributeResolutionAllowed(attribute) { + if (attribute === 'uid2') { + return !this.privacyMode; + } + else if (attribute === ID_COOKIE_ATTR) { + // cannot be resolved server-side + return false; + } + else { + return true; + } + } + filterParams(query) { + return query.filteredCopy((key, value) => { + if (key === 'resolve') { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isString)(value)) { + return this.attributeResolutionAllowed(value); + } + else { + return false; + } + } + else { + return true; + } + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + enrichExtraIdentifiers(response, params) { + const requestedAttributes = params.tuples.filter(([key]) => key === 'resolve').map(([, value]) => value); + function requested(attribute) { + return requestedAttributes.indexOf(attribute) > -1; + } + const result = { ...response }; + if (requested(ID_COOKIE_ATTR)) { + if (this.generateIdCookie && this.peopleVerifiedId) { + result[ID_COOKIE_ATTR] = this.peopleVerifiedId; + } + else if (this.resolvedIdCookie) { + result[ID_COOKIE_ATTR] = this.resolvedIdCookie; + } + } + return result; + } + responseReceived(successCallback, params) { + return (responseText, response) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let responseObj = {}; + if (responseText) { + try { + const responseJson = JSON.parse(responseText); + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(responseJson)) { + responseObj = responseJson; + } + } + catch (ex) { + console.error('Error parsing response', ex); + this.eventBus.emitError('IdentityResolverParser', ex); + } + } + const expiresAt = responseExpires(response); + successCallback(this.enrichExtraIdentifiers(responseObj, params), { expiresAt }); + }; + } + buildUrl(query) { + return `${this.url}/${this.source}/${this.publisherId}${this.filterParams(query).toQueryString()}`; + } + getUrl(additionalParams) { + const params = this.query.copy().addParamsMap(additionalParams ?? {}); + return this.buildUrl(params); + } + resolve(successCallback, errorCallback, additionalParams) { + try { + const params = this.query.copy().addParamsMap(additionalParams ?? {}); + this.calls.ajaxGet(this.buildUrl(params), this.responseReceived(successCallback, params), errorCallback, this.timeout); + } + catch (e) { + console.error('IdentityResolve', e); + if (errorCallback && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(errorCallback)) { + errorCallback(e); + } + if (this.eventBus) { + this.eventBus.emitError('IdentityResolve', e); + } + } + } +} +function responseExpires(response) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(response) && 'getResponseHeader' in response && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(response.getResponseHeader)) { + const expiresHeader = response.getResponseHeader('expires'); + if (expiresHeader) { + return new Date(expiresHeader); + } + } +} + +// @ts-nocheck +function initBus(size) { + if (typeof size === 'number' && size >= 0) { + return new live_connect_common__WEBPACK_IMPORTED_MODULE_0__.ReplayEmitter(size); + } + else { + return new live_connect_common__WEBPACK_IMPORTED_MODULE_0__.ReplayEmitter(5); + } +} +function extendBusIfNeeded(bus) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(bus.emitErrorWithMessage) && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(bus.emitError)) { + return; + } + bus.emitErrorWithMessage = function (name, message, e = {}) { + const wrappedError = (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.wrapError)(name, message, e); + return bus.emit(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.ERRORS_CHANNEL, wrappedError); + }; + bus.emitError = function (name, exception) { + return bus.emitErrorWithMessage(name, exception.message, exception); + }; +} +function LocalEventBus(size = 5) { + return initBus(size); +} +function GlobalEventBus(name, size, errorCallback) { + try { + if (!window) { + errorCallback(new Error('Bus can only be attached to the window, which is not present')); + } + if (window && !window[name]) { + window[name] = initBus(size); + } + extendBusIfNeeded(window[name]); + return window[name]; + } + catch (e) { + console.error('events.bus.init', e); + errorCallback(e); + } +} +function getAvailableBus(name) { + const eventBus = window[name].eventBus || window[EVENT_BUS_NAMESPACE]; + extendBusIfNeeded(eventBus); + return eventBus; +} + +var eventBus = /*#__PURE__*/Object.freeze({ + __proto__: null, + GlobalEventBus: GlobalEventBus, + LocalEventBus: LocalEventBus, + getAvailableBus: getAvailableBus +}); + +const TLD_CACHE_KEY = '_li_dcdm_c'; +function determineHighestWritableDomain(storageHandler) { + const cachedDomain = storageHandler.getCookie(TLD_CACHE_KEY); + if (cachedDomain) { + return cachedDomain; + } + const domain = loadedDomain(); + const arr = domain.split('.'); + for (let i = arr.length; i > 0; i--) { + const newD = `.${arr.slice(i - 1, arr.length).join('.')}`; + storageHandler.setCookie(TLD_CACHE_KEY, newD, undefined, 'Lax', newD); + if (storageHandler.getCookie(TLD_CACHE_KEY)) { + return newD; + } + } + return `.${domain}`; +} + +function enrichDomain(storageHandler) { + return state => ({ ...state, cookieDomain: determineHighestWritableDomain(storageHandler) }); +} + +const StorageStrategies = { + cookie: 'cookie', + localStorage: 'ls', + none: 'none', // read-only + disabled: 'disabled' // completely disabled +}; + +const enrichStorageStrategy = state => { + const storageStrategy = state.privacyMode ? StorageStrategies.disabled : (state.storageStrategy || StorageStrategies.cookie); + return { ...state, storageStrategy }; +}; + +const DEFAULT_DECISION_ID_COOKIE_EXPIRES = (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.expiresInDays)(30); +const DECISION_ID_QUERY_PARAM_NAME = 'li_did'; +const DECISION_ID_COOKIE_NAMESPACE = 'lidids.'; +const _onlyUnique = (value, index, self) => self.indexOf(value) === index; +const _nonEmpty = (value) => value && (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)(value).length > 0; +function enrichDecisionIds(storageHandler, eventBus) { + return state => { + function addDecisionId(key) { + if (key) { + storageHandler.setCookie(`${DECISION_ID_COOKIE_NAMESPACE}${key}`, key, DEFAULT_DECISION_ID_COOKIE_EXPIRES, 'Lax', state.cookieDomain); + } + } + function orElseEmpty(errorDescription, f) { + try { + return f(); + } + catch (e) { + eventBus.emitErrorWithMessage('DecisionsResolve', errorDescription, e); + return []; + } + } + const freshDecisions = orElseEmpty('Error while extracting new decision ids', () => { + const extractedFreshDecisions = [].concat((state.pageUrl && getQueryParameter(state.pageUrl, DECISION_ID_QUERY_PARAM_NAME)) || []); + return extractedFreshDecisions + .map(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim) + .filter(_nonEmpty) + .filter(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isUUID) + .filter(_onlyUnique); + }); + const storedDecisions = orElseEmpty('Error while retrieving stored decision ids', () => { + const extractedStoredDecisions = storageHandler.findSimilarCookies(DECISION_ID_COOKIE_NAMESPACE); + return extractedStoredDecisions + .map(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim) + .filter(_nonEmpty) + .filter(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isUUID); + }); + freshDecisions.forEach(decision => { + try { + addDecisionId(decision); + } + catch (e) { + eventBus.emitErrorWithMessage('DecisionsResolve', 'Error while storing new decision id', e); + } + }); + return { ...state, decisionIds: freshDecisions.concat(storedDecisions).filter(_onlyUnique) }; + }; +} + +// Borrowed from https://github.com/Kiosked/ulid +const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; +const ENCODING_LEN = ENCODING.length; +const TIME_MAX = Math.pow(2, 48) - 1; +const TIME_LEN = 10; +const RANDOM_LEN = 16; +const prng = detectPrng(); +function createError(message) { + const err = new Error(message); + err.source = 'Ulid'; + return err; +} +function detectPrng() { + const root = typeof window !== 'undefined' ? window : null; + const browserCrypto = root && (root.crypto || root.msCrypto); + if (browserCrypto) { + return () => { + const buffer = new Uint8Array(1); + browserCrypto.getRandomValues(buffer); + return buffer[0] / 0xff; + }; + } + return () => Math.random(); +} +function encodeTime(now, len) { + if (now > TIME_MAX) { + throw createError('cannot encode time greater than ' + TIME_MAX); + } + let mod; + let str = ''; + for (; len > 0; len--) { + mod = now % ENCODING_LEN; + str = ENCODING.charAt(mod) + str; + now = (now - mod) / ENCODING_LEN; + } + return str; +} +function encodeRandom(len) { + let str = ''; + for (; len > 0; len--) { + str = randomChar() + str; + } + return str; +} +function randomChar() { + let rand = Math.floor(prng() * ENCODING_LEN); + if (rand === ENCODING_LEN) { + rand = ENCODING_LEN - 1; + } + return ENCODING.charAt(rand); +} +// the factory to generate unique identifier based on time and current pseudorandom number +function ulid() { + return encodeTime(Date.now(), TIME_LEN) + encodeRandom(RANDOM_LEN); +} + +const NEXT_GEN_FP_NAME = '_lc2_fpi'; +function enrichLiveConnectId(cache, storageHandler) { + return state => { + let liveConnectIdentifier; + // reading the value will also repair any broken records + const oldValue = cache.get(NEXT_GEN_FP_NAME); + if (oldValue) { + liveConnectIdentifier = oldValue.data; + } + else { + const legacyValue = storageHandler.getCookie(NEXT_GEN_FP_NAME); + if (legacyValue) { + // backwards compatibility case. We have a cookie but no cache metadata. + // We might overwrite a http cookie here. But this will be fixed with the next http request to cff. + cache.set(NEXT_GEN_FP_NAME, legacyValue); + liveConnectIdentifier = legacyValue; + } + else { + const newValue = `${domainHash(state.cookieDomain)}--${ulid()}`.toLocaleLowerCase(); + // will also set cookie. It will also later be extended by cookie bouncing in the cff. + cache.set(NEXT_GEN_FP_NAME, newValue); + // handle case when all storage backends are disabled + liveConnectIdentifier = cache.get(NEXT_GEN_FP_NAME)?.data; + } + } + if (liveConnectIdentifier) { + // TODO: should we expose this to users even if the write failed? + storageHandler.setDataInLocalStorage(PEOPLE_VERIFIED_LS_ENTRY, liveConnectIdentifier); + } + return { + ...state, + liveConnectId: liveConnectIdentifier, + peopleVerifiedId: liveConnectIdentifier + }; + }; +} + +const MAX_ERROR_FIELD_LENGTH = 120; +function _asInt(field) { + try { + const intValue = field * 1; + return isNaN(intValue) ? undefined : intValue; + } + catch { + } +} +function _truncate(value) { + try { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isString)(value) && value.length && value.length > MAX_ERROR_FIELD_LENGTH) { + return `${value.substr(0, MAX_ERROR_FIELD_LENGTH)}...`; + } + else { + return `${value}`; + } + } + catch { + } +} +function asErrorDetails(e) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isRecord)(e)) { + return { + message: _truncate(e.message) || '', + name: _truncate(e.name) || '', + stackTrace: _truncate(e.stack), + lineNumber: _asInt(e.lineNumber), + columnNumber: _asInt(e.columnNumber), + fileName: _truncate(e.fileName) + }; + } + else { + return { + message: 'Unknown message', + name: 'Unknown name' + }; + } +} +function register(state, sender, eventBus) { + try { + eventBus.on(live_connect_common__WEBPACK_IMPORTED_MODULE_0__.ERRORS_CHANNEL, (error) => { + const wrapped = StateWrapper.fromError(state, asErrorDetails(error), eventBus); + sender.sendPixel(wrapped); + }); + } + catch (e) { + console.error('handlers.error.register', e); + } +} + +const noop$1 = () => undefined; +class WrappingContext { + obj; + name; + errors; + eventBus; + constructor(obj, name, eventBus) { + this.obj = obj; + this.name = name; + this.errors = []; + this.eventBus = eventBus; + } + wrap(functionName) { + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(this.obj)) { + const member = this.obj[functionName]; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isFunction)(member)) { + return (...args) => { + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return member.call(this.obj, ...args); + } + catch (e) { + this.eventBus.emitErrorWithMessage(this.name, `Failed calling ${functionName}`, e); + } + }; + } + } + this.errors.push(functionName); + return noop$1; + } + reportErrors() { + if (this.errors.length > 0) { + this.eventBus.emitErrorWithMessage(this.name, `The functions '${JSON.stringify(this.errors)}' were not provided`); + } + } +} + +const noop = () => undefined; +function wrapRead(wrapper, storageStrategy, functionName) { + return (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.strEqualsIgnoreCase)(storageStrategy, StorageStrategies.disabled) ? noop : wrapper.wrap(functionName); +} +function wrapWrite(wrapper, storageStrategy, functionName) { + return (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.strEqualsIgnoreCase)(storageStrategy, StorageStrategies.none) ? noop : wrapRead(wrapper, storageStrategy, functionName); +} +class WrappedReadOnlyStorageHandler { + minimalFunctions; + constructor(storageStrategy, wrapper) { + this.minimalFunctions = { + getCookie: wrapRead(wrapper, storageStrategy, 'getCookie'), + getDataFromLocalStorage: wrapRead(wrapper, storageStrategy, 'getDataFromLocalStorage'), + localStorageIsEnabled: wrapWrite(wrapper, storageStrategy, 'localStorageIsEnabled') + }; + } + static make(storageStrategy, externalStorageHandler, eventBus) { + const wrapper = new WrappingContext(externalStorageHandler, 'ReadOnlyStorageHandler', eventBus); + const handler = new WrappedReadOnlyStorageHandler(storageStrategy, wrapper); + wrapper.reportErrors(); + return handler; + } + localStorageIsEnabled() { + return !!this.minimalFunctions.localStorageIsEnabled(); + } + getCookie(key) { + return this.minimalFunctions.getCookie(key) || null; + } + getDataFromLocalStorage(key) { + return this.minimalFunctions.getDataFromLocalStorage(key) || null; + } +} +class WrappedStorageHandler extends WrappedReadOnlyStorageHandler { + storageStrategy; + functions; + constructor(storageStrategy, wrapper) { + super(storageStrategy, wrapper); + this.storageStrategy = storageStrategy; + this.functions = { + setCookie: wrapWrite(wrapper, storageStrategy, 'setCookie'), + removeDataFromLocalStorage: wrapWrite(wrapper, storageStrategy, 'removeDataFromLocalStorage'), + setDataInLocalStorage: wrapWrite(wrapper, storageStrategy, 'setDataInLocalStorage'), + findSimilarCookies: wrapRead(wrapper, storageStrategy, 'findSimilarCookies') + }; + } + static make(storageStrategy, externalStorageHandler, eventBus) { + const wrapper = new WrappingContext(externalStorageHandler, 'StorageHandler', eventBus); + const handler = new WrappedStorageHandler(storageStrategy, wrapper); + wrapper.reportErrors(); + return handler; + } + setCookie(key, value, expires, sameSite, domain) { + this.functions.setCookie(key, value, expires, sameSite, domain); + } + setDataInLocalStorage(key, value) { + this.functions.setDataInLocalStorage(key, value); + } + removeDataFromLocalStorage(key) { + this.functions.removeDataFromLocalStorage(key); + } + findSimilarCookies(substring) { + return this.functions.findSimilarCookies(substring) || []; + } +} + +const DEFAULT_COOKIE_EXPIRATION_DAYS = 730; +class ParseError extends Error { + constructor(message) { + super(message); + this.name = 'ParseError'; + } +} +class StorageHandlerBackedCache { + handler; + cookieDomain; + eventBus; + constructor(opts) { + this.handler = opts.storageHandler; + this.cookieDomain = opts.cookieDomain; + this.eventBus = opts.eventBus; + } + deleteCookie(key) { + this.handler.setCookie(key, '', new Date(0), 'Lax', this.cookieDomain); + } + // layout: { w: writtenAt in millis, e? : expiresAt in millis } + parseMetaRecord(serialized) { + const meta = JSON.parse(serialized); + if (!(0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(meta)) { + throw new ParseError('Meta record is not an object'); + } + let expiresAt; + if ('e' in meta) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expiresAt = new Date(meta.e); + if (isNaN(expiresAt.getTime())) { + throw new ParseError('Invalid expiresAt'); + } + } + if (!('w' in meta)) { + throw new ParseError('Missing writtenAt'); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const writtenAt = new Date(meta.w); + if (isNaN(writtenAt.getTime())) { + throw new ParseError('Invalid writtenAt'); + } + return { expiresAt, writtenAt }; + } + serializeMetaRecord(meta) { + let expiresAtMillis; + if (meta.expiresAt) { + expiresAtMillis = meta.expiresAt.getTime(); + } + return JSON.stringify({ w: meta.writtenAt.getTime(), e: expiresAtMillis }); + } + getCookieRecord(key, metaRecordKey) { + const metaRecord = this.handler.getCookie(metaRecordKey); + if (!metaRecord || metaRecord.length === 0) { + return null; + } + let meta; + try { + meta = this.parseMetaRecord(metaRecord); + } + catch (e) { + this.eventBus.emitErrorWithMessage('Cache', 'Failed reading meta from cookies', e); + // delete this so we don't keep trying to read it + this.deleteCookie(key); + this.deleteCookie(metaRecordKey); + return null; + } + const expiresAt = meta.expiresAt; + if (expiresAt && expiresAt.getTime() <= Date.now()) { + // expired. No need to clean up as the browser will do it for us + return null; + } + const data = this.handler.getCookie(key); + if (!data) { + return null; + } + return { data, meta }; + } + getLSRecord(key, metaRecordKey) { + const metaRecord = this.handler.getDataFromLocalStorage(metaRecordKey); + if (!metaRecord || metaRecord.length === 0) { + return null; + } + let meta; + try { + meta = this.parseMetaRecord(metaRecord); + } + catch (e) { + this.eventBus.emitErrorWithMessage('Cache', 'Failed reading meta from ls', e); + this.handler.removeDataFromLocalStorage(key); + this.handler.removeDataFromLocalStorage(metaRecordKey); + return null; + } + const expiresAt = meta.expiresAt; + if (expiresAt && expiresAt.getTime() <= Date.now()) { + // expired. + this.handler.removeDataFromLocalStorage(key); + this.handler.removeDataFromLocalStorage(metaRecordKey); + return null; + } + const data = this.handler.getDataFromLocalStorage(key); + if (!data) { + return null; + } + return { data, meta }; + } + get(key) { + const metaRecordKey = metaKey(key); + const cookieRecord = this.getCookieRecord(key, metaRecordKey); + const lsRecord = this.getLSRecord(key, metaRecordKey); + if (cookieRecord && lsRecord) { + // comparing dates with getTime() because Date objects are not equal + if (cookieRecord.meta.writtenAt.getTime() === lsRecord.meta.writtenAt.getTime()) { + return cookieRecord; + } + else if (cookieRecord.meta.writtenAt > lsRecord.meta.writtenAt) { + // cookie record is newer. Update ls record + this.handler.setDataInLocalStorage(key, cookieRecord.data); + this.handler.setDataInLocalStorage(metaRecordKey, this.serializeMetaRecord(cookieRecord.meta)); + return cookieRecord; + } + else { + // ls record is newer. Update cookie record + this.handler.setCookie(key, lsRecord.data, lsRecord.meta.expiresAt, 'Lax', this.cookieDomain); + this.handler.setCookie(metaRecordKey, this.serializeMetaRecord(lsRecord.meta), lsRecord.meta.expiresAt, 'Lax', this.cookieDomain); + return lsRecord; + } + } + else if (cookieRecord) { + // only cookie record exists. Write to ls + this.handler.setDataInLocalStorage(key, cookieRecord.data); + this.handler.setDataInLocalStorage(metaRecordKey, this.serializeMetaRecord(cookieRecord.meta)); + return cookieRecord; + } + else if (lsRecord) { + // only ls record exists. Write to cookie + this.handler.setCookie(key, lsRecord.data, lsRecord.meta.expiresAt, 'Lax', this.cookieDomain); + this.handler.setCookie(metaRecordKey, this.serializeMetaRecord(lsRecord.meta), lsRecord.meta.expiresAt, 'Lax', this.cookieDomain); + return lsRecord; + } + else { + return null; + } + } + set(key, value, expires) { + const metaRecordKey = metaKey(key); + const metaRecord = this.serializeMetaRecord({ writtenAt: new Date(), expiresAt: expires }); + // set in ls + this.handler.setDataInLocalStorage(key, value); + this.handler.setDataInLocalStorage(metaRecordKey, metaRecord); + // needs to be set as cookies will be session cookies otherwise. Try to make them live as long as possible + const cookieExpires = expires || (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.expiresInDays)(DEFAULT_COOKIE_EXPIRATION_DAYS); + // set in cookie + this.handler.setCookie(key, value, cookieExpires, 'Lax', this.cookieDomain); + this.handler.setCookie(metaRecordKey, metaRecord, cookieExpires, 'Lax', this.cookieDomain); + } +} +function metaKey(baseKey) { + return `${baseKey}_meta`; +} + +const empty = () => undefined; +function privacyCheck(wrapper, privacyMode, functionName) { + return (privacyMode) ? empty : wrapper.wrap(functionName); +} +class WrappedCallHandler { + functions; + constructor(externalCallHandler, eventBus, privacyMode) { + const wrapper = new WrappingContext(externalCallHandler, 'CallHandler', eventBus); + this.functions = { + ajaxGet: privacyCheck(wrapper, privacyMode, 'ajaxGet'), + pixelGet: privacyCheck(wrapper, privacyMode, 'pixelGet') + }; + wrapper.reportErrors(); + } + ajaxGet(url, onSuccess, onError, timeout, headers) { + this.functions.ajaxGet(url, onSuccess, onError, timeout, headers); + } + pixelGet(url, onLoad) { + this.functions.pixelGet(url, onLoad); + } +} + +function enrichIdCookie(storageHandler) { + return state => { + if (state.idCookie?.strategy === 'cookie' && typeof state.idCookie?.name === 'string') { + return { ...state, resolvedIdCookie: storageHandler.getCookie(state.idCookie.name) }; + } + else if (state.idCookie?.strategy === 'localStorage' && typeof state.idCookie?.name === 'string') { + return { ...state, resolvedIdCookie: storageHandler.getDataFromLocalStorage(state.idCookie.name) }; + } + else { + return state; + } + }; +} + +const hemStore = {}; +function pushSingleEvent(event, pixelClient, enrichedState, eventBus) { + if (!event || !(0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(event)) { + // @ts-ignore + eventBus.emitErrorWithMessage('EventNotAnObject', 'Received event was not an object', new Error(event)); + } + else if ('config' in event) { + eventBus.emitErrorWithMessage('StrayConfig', 'Received a config after LC has already been initialised', new Error(JSON.stringify(event))); + } + else { + // const stateWithEventSource: StateWithEventSource = { eventSource: event, ...enrichedState } + const wrapper = StateWrapper.fromEvent(enrichedState, event, eventBus); + // const combined = wrapper.combineWith({ eventSource: event }) + if (wrapper.getHashedEmail().length > 0) { + hemStore.hashedEmail = wrapper.getHashedEmail(); + } + else if (hemStore.hashedEmail) { + wrapper.setHashedEmail(hemStore.hashedEmail); + } + const onPreSend = () => eventBus.emit(PRELOAD_PIXEL, '0'); + const onLoad = () => eventBus.emit(PIXEL_SENT_PREFIX, enrichedState); + pixelClient.sendAjax(wrapper, { onPreSend, onLoad }); + } +} +function configMatcher(previousConfig, newConfig) { + const equalConfigs = previousConfig.appId === newConfig.appId && + previousConfig.wrapperName === newConfig.wrapperName && + previousConfig.collectorUrl === newConfig.collectorUrl; + if (!equalConfigs) { + return { + appId: [previousConfig.appId, newConfig.appId], + wrapperName: [previousConfig.wrapperName, newConfig.wrapperName], + collectorUrl: [previousConfig.collectorUrl, newConfig.collectorUrl] + }; + } +} +function processArgs(args, pixelClient, enrichedState, eventBus) { + try { + args.forEach(arg => { + const event = arg; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(event)) { + event.forEach(e => pushSingleEvent(e, pixelClient, enrichedState, eventBus)); + } + else { + pushSingleEvent(event, pixelClient, enrichedState, eventBus); + } + }); + } + catch (e) { + console.error('Error sending events', e); + eventBus.emitErrorWithMessage('LCPush', 'Failed sending an event', e); + } +} +function getInitializedLiveConnect(liveConnectConfig) { + try { + // @ts-ignore + if (window && window[liveConnectConfig.globalVarName] && window[liveConnectConfig.globalVarName].ready) { + // @ts-ignore + const mismatchedConfig = window[liveConnectConfig.globalVarName].config && configMatcher(window[liveConnectConfig.globalVarName].config, liveConnectConfig); + if (mismatchedConfig) { + const error = new Error(); + error.name = 'ConfigSent'; + error.message = 'Additional configuration received'; + // @ts-ignore + const eventBus = getAvailableBus(liveConnectConfig.globalVarName); + // @ts-ignore + window[liveConnectConfig.globalVarName].eventBus = eventBus; + eventBus.emitErrorWithMessage('LCDuplication', JSON.stringify(mismatchedConfig), error); + } + // @ts-ignore + return window[liveConnectConfig.globalVarName]; + } + } + catch (e) { + console.error('Could not initialize error bus'); + } +} +// @ts-ignore +function standardInitialization(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus) { + try { + // TODO: proper config validation + const validLiveConnectConfig = { + ...removeInvalidPairs(liveConnectConfig, eventBus), + identifiersToResolve: liveConnectConfig.identifiersToResolve || [], + contextSelectors: liveConnectConfig.contextSelectors || '', + contextElementsLength: liveConnectConfig.contextElementsLength || 0 + }; + const stateWithStorage = enrichPage(enrichStorageStrategy(enrichPrivacyMode(validLiveConnectConfig))); + const callHandler = new WrappedCallHandler(externalCallHandler, eventBus, stateWithStorage.privacyMode); + const storageHandler = WrappedStorageHandler.make(stateWithStorage.storageStrategy, externalStorageHandler, eventBus); + const stateWithDomain = enrichDomain(storageHandler)(stateWithStorage); + const cache = new StorageHandlerBackedCache({ + storageHandler, + eventBus, + cookieDomain: stateWithDomain.cookieDomain + }); + const enrichedState = enrichIdCookie(storageHandler)(enrichLiveConnectId(cache, storageHandler)(enrichDecisionIds(storageHandler, eventBus)(enrichIdentifiers$1(storageHandler, eventBus)(stateWithDomain)))); + const pixelSender = new PixelSender({ + collectorUrl: validLiveConnectConfig.collectorUrl, + ajaxTimeout: validLiveConnectConfig.ajaxTimeout, + eventBus, + callHandler + }); + register(enrichedState, pixelSender, eventBus); + const resolver = new IdentityResolver(enrichedState, callHandler, eventBus); + const _push = (...args) => processArgs(args, pixelSender, enrichedState, eventBus); + return { + push: _push, + fire: () => _push({}), + peopleVerifiedId: enrichedState.peopleVerifiedId, + ready: true, + resolve: resolver.resolve.bind(resolver), + resolutionCallUrl: resolver.getUrl.bind(resolver), + config: validLiveConnectConfig, + eventBus, + storageHandler, + cache + }; + } + catch (x) { + console.error(x); + eventBus.emitErrorWithMessage('LCConstruction', 'Failed to build LC', x); + } +} +function initializeWithoutGlobalName$1(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus) { + const lc = standardInitialization(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus); + window.liQ_instances = window.liQ_instances || []; + window.liQ_instances.push(lc); + return lc; +} +function initializeWithGlobalName$1(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus) { + // @ts-ignore + const queue = window[liveConnectConfig.globalVarName] || []; + const lc = getInitializedLiveConnect(liveConnectConfig) || standardInitialization(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus) || queue; + if ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(queue)) { + for (let i = 0; i < queue.length; i++) { + lc.push(queue[i]); + } + } + // @ts-ignore + window[lc.config.globalVarName] = lc; + window.liQ_instances = window.liQ_instances || []; + // @ts-ignore + if (window.liQ_instances.filter(i => i.config.globalVarName === lc.config.globalVarName).length === 0) { + window.liQ_instances.push(lc); + } + return lc; +} +function StandardLiveConnect(liveConnectConfig, externalStorageHandler, externalCallHandler, externalEventBus) { + const configuration = ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(liveConnectConfig) && liveConnectConfig) || {}; + const eventBus = externalEventBus || LocalEventBus(); + let lc; + try { + lc = configuration.globalVarName + ? initializeWithGlobalName$1(configuration, externalStorageHandler, externalCallHandler, eventBus) + : initializeWithoutGlobalName$1(configuration, externalStorageHandler, externalCallHandler, eventBus); + } + catch (e) { + console.error(e); + eventBus.emitErrorWithMessage('LCConstruction', 'Failed to build LC', e); + } + // @ts-ignore + return lc; +} + +function enrichPeopleVerifiedId(storageHandler, eventBus) { + return state => { + try { + return { + ...state, + peopleVerifiedId: state.peopleVerifiedId || storageHandler.getDataFromLocalStorage(PEOPLE_VERIFIED_LS_ENTRY) || undefined + }; + } + catch (e) { + eventBus.emitError('PeopleVerifiedEnrich', e); + return state; + } + }; +} + +function enrichIdentifiers(storageHandler, eventBus) { + return state => { + try { + return { ...state, retrievedIdentifiers: resolveIdentifiers(state.identifiersToResolve, storageHandler) }; + } + catch (e) { + eventBus.emitError('IdentifiersEnrich', e); + return { ...state, retrievedIdentifiers: [] }; + } + }; +} +function resolveIdentifiers(identifiersToResolve, storageHandler) { + const cookieNames = (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isArray)(identifiersToResolve) ? identifiersToResolve : (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.safeToString)(identifiersToResolve).split(','); + const identifiers = []; + for (let i = 0; i < cookieNames.length; i++) { + const identifierName = (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.trim)(cookieNames[i]); + const identifierValue = storageHandler.getCookie(identifierName) || storageHandler.getDataFromLocalStorage(identifierName); + if (identifierValue && !containsEmailField((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.safeToString)(identifierValue)) && !isEmail((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.safeToString)(identifierValue))) { + identifiers.push({ + name: identifierName, + value: (0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.safeToString)(identifierValue) + }); + } + } + return identifiers; +} + +// @ts-ignore +function _minimalInitialization(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus, push) { + try { + const validLiveConnectConfig = { + ...removeInvalidPairs(liveConnectConfig, eventBus), + identifiersToResolve: liveConnectConfig.identifiersToResolve || [] + }; + const stateWithStorage = enrichStorageStrategy(enrichPrivacyMode(validLiveConnectConfig)); + const storageHandler = WrappedReadOnlyStorageHandler.make(stateWithStorage.storageStrategy, externalStorageHandler, eventBus); + const callHandler = new WrappedCallHandler(externalCallHandler, eventBus, stateWithStorage.privacyMode); + const enrichedState = enrichIdentifiers(storageHandler, eventBus)(enrichIdCookie(storageHandler)(enrichPeopleVerifiedId(storageHandler, eventBus)(stateWithStorage))); + const resolver = new IdentityResolver(enrichedState, callHandler, eventBus); + return { + push: (arg) => push(arg), + fire: () => push({}), + peopleVerifiedId: enrichedState.peopleVerifiedId, + ready: true, + resolve: resolver.resolve.bind(resolver), + resolutionCallUrl: resolver.getUrl.bind(resolver), + config: validLiveConnectConfig, + eventBus, + // @ts-ignore + storageHandler + }; + } + catch (x) { + console.error(x); + } +} +function initializeWithoutGlobalName(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus) { + const lc = _minimalInitialization(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus, () => { }); + window.liQ_instances = window.liQ_instances || []; + window.liQ_instances.push(lc); + return lc; +} +function initializeWithGlobalName(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus) { + // @ts-ignore + const queue = window[liveConnectConfig.globalVarName] = window[liveConnectConfig.globalVarName] || []; + const push = queue.push.bind(queue); + const lc = _minimalInitialization(liveConnectConfig, externalStorageHandler, externalCallHandler, eventBus, push); + window.liQ_instances = window.liQ_instances || []; + // @ts-ignore + if (window.liQ_instances.filter(i => i.config.globalVarName === lc.config.globalVarName).length === 0) { + window.liQ_instances.push(lc); + } + return lc; +} +function MinimalLiveConnect(liveConnectConfig, externalStorageHandler, externalCallHandler, externalEventBus) { + const configuration = ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(liveConnectConfig) && liveConnectConfig) || {}; + const eventBus = externalEventBus || LocalEventBus(); + try { + return configuration.globalVarName + ? initializeWithGlobalName(configuration, externalStorageHandler, externalCallHandler, eventBus) + : initializeWithoutGlobalName(configuration, externalStorageHandler, externalCallHandler, eventBus); + } + catch (x) { + console.error(x); + } + // @ts-ignore + return {}; +} + +function LiveConnect(liveConnectConfig, externalStorageHandler, externalCallHandler, mode, externalEventBus) { + const minimalMode = mode === 'minimal'; + const bus = externalEventBus || LocalEventBus(); + const configuration = ((0,live_connect_common__WEBPACK_IMPORTED_MODULE_0__.isObject)(liveConnectConfig) && liveConnectConfig) || {}; + const initializationFunction = minimalMode ? MinimalLiveConnect : StandardLiveConnect; + return initializationFunction(configuration, externalStorageHandler, externalCallHandler, bus); +} + + + + +/***/ }), + +/***/ "./node_modules/tiny-hashes/dist/index.mjs": +/*!*************************************************!*\ + !*** ./node_modules/tiny-hashes/dist/index.mjs ***! + \*************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ md5: () => (/* binding */ n), +/* harmony export */ sha1: () => (/* binding */ t), +/* harmony export */ sha256: () => (/* binding */ i) +/* harmony export */ }); +for(var r=[],o=0;o<64;)r[o]=0|4294967296*Math.sin(++o%Math.PI);function n(n){var t,e,f,a=[t=1732584193,e=4023233417,~t,~e],c=[],u=unescape(encodeURI(n))+"€",h=u.length;for(n=--h/4+2|15,c[--n]=8*h;~h;)c[h>>2]|=u.charCodeAt(h)<<8*h--;for(o=u=0;o>4]+r[u]+~~c[o|15&[u,5*u+1,3*u+5,7*u][h]])<<(h=[7,12,17,22,5,9,14,20,4,11,16,23,6,10,15,21][4*h+u++%4])|f>>>-h),t,e])t=0|h[1],e=h[2];for(u=4;u;)a[--u]+=h[u]}for(n="";u<32;)n+=(a[u>>3]>>4*(1^u++)&15).toString(16);return n}function t(r){var o,n,t,e,f,a=[],c=[n=1732584193,t=4023233417,~n,~t,3285377520],u=[],h=unescape(encodeURI(r))+"€",i=h.length;for(u[r=--i/4+2|15]=8*i;~i;)u[i>>2]|=h.charCodeAt(i)<<8*~i--;for(o=i=0;o>2]+((h=n[0])<<5|h>>>27),h,t<<30|t>>>2,e,f])h=a[i-3]^a[i-8]^a[i-14]^a[i-16],t=n[1],e=n[2],f=n[3];for(i=5;i;)c[--i]+=n[i]}for(h="";i<40;)h+=(c[i>>3]>>4*(7-i++)&15).toString(16);return h}for(var e,f=18,a=[],c=[];f>1;f--)for(e=f;e<320;)a[e+=f]=1;function u(r,o){return 4294967296*Math.pow(r,1/o)|0}for(e=0;e<64;)a[++f]||(c[e]=u(f,2),a[e++]=u(f,3));function h(r,o){return r>>>o|r<<-o}function i(r){var o=c.slice(f=e=0,8),n=[],t=unescape(encodeURI(r))+"€",i=t.length;for(n[r=--i/4+2|15]=8*i;~i;)n[i>>2]|=t.charCodeAt(i)<<8*~i--;for(i=[];f>>10)+i[e-7]+(h(t=i[e-15],7)^h(t,18)^t>>>3)+i[e-16])+u.pop()+(h(t=u[4],6)^h(t,11)^h(t,25))+(t&u[5]^~t&u[6])+a[e++];for(e=8;e;)o[--e]+=u[e]}for(t="";e<64;)t+=(o[e>>3]>>4*(7-e++)&15).toString(16);return t} +//# sourceMappingURL=index.mjs.map + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["uid1Eids","uid2Eids","liveIntentId","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/liveIntentIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); +//# sourceMappingURL=liveIntentIdSystem.js.map +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["liveIntentRtdProvider"],{ + +/***/ "./modules/liveIntentRtdProvider.js": +/*!******************************************!*\ + !*** ./modules/liveIntentRtdProvider.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export liveIntentRtdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + +/** + * This module adds the LiveIntent provider to the Real Time Data module (rtdModule). + */ + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + * @typedef {import('../modules/rtdModule/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/rtdModule/index.js').UserConsentData} UserConsentData + */ + +const SUBMODULE_NAME = 'liveintent'; +const GVLID = 148; + +/** + * Init + * @param {Object} config Module configuration + * @param {UserConsentData} userConsent User consent + * @returns true + */ +const init = (config, userConsent) => { + return true; +}; + +/** + * onBidRequest is called for each bidder during an auction and contains the bids for that bidder. + * + * @param {Object} bidRequest + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + +function onBidRequest(bidRequest, config, userConsent) { + bidRequest.bids.forEach(bid => { + const providedSegmentsFromUserId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'userId.lipb.segments', []); + if (providedSegmentsFromUserId.length > 0) { + const providedSegments = { + name: 'liveintent.com', + segment: providedSegmentsFromUserId.map(id => ({ + id + })) + }; + const existingData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'ortb2.user.data', []); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bid, 'ortb2.user.data', existingData.concat(providedSegments)); + } + }); +} +const liveIntentRtdSubmodule = { + name: SUBMODULE_NAME, + gvlid: GVLID, + init: init, + onBidRequestEvent: onBidRequest +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('realTimeData', liveIntentRtdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('liveIntentRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/liveIntentRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["livewrappedAnalyticsAdapter"],{ + +/***/ "./modules/livewrappedAnalyticsAdapter.js": +/*!************************************************!*\ + !*** ./modules/livewrappedAnalyticsAdapter.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export BID_WON_TIMEOUT */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + + + + + +const ANALYTICSTYPE = 'endpoint'; +const URL = 'https://lwadm.com/analytics/10'; +const EMPTYURL = ''; +const REQUESTSENT = 1; +const RESPONSESENT = 2; +const WINSENT = 4; +const TIMEOUTSENT = 8; +const ADRENDERFAILEDSENT = 16; +let initOptions; +let prebidGlobal = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(); +const BID_WON_TIMEOUT = 500; +const cache = { + auctions: {} +}; +let livewrappedAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + EMPTYURL, + ANALYTICSTYPE +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + const time = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_EVENT:', [eventType, args]); + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_INIT: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_AUCTION_INIT:', args); + cache.auctions[args.auctionId] = { + bids: {}, + bidAdUnits: {} + }; + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_REQUESTED: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_BID_REQUESTED:', args); + cache.auctions[args.auctionId].timeStamp = args.start; + args.bids.forEach(function (bidRequest) { + cache.auctions[args.auctionId].gdprApplies = args.gdprConsent ? args.gdprConsent.gdprApplies : undefined; + cache.auctions[args.auctionId].gdprConsent = args.gdprConsent ? args.gdprConsent.consentString : undefined; + let lwFloor; + let container = document.getElementById(bidRequest.adUnitCode); + let adUnitId = container ? container.getAttribute('data-adunitid') : undefined; + adUnitId = adUnitId != null ? adUnitId : undefined; + if (bidRequest.lwflr) { + lwFloor = bidRequest.lwflr.flr; + let buyerFloor = bidRequest.lwflr.bflrs ? bidRequest.lwflr.bflrs[bidRequest.bidder] : undefined; + lwFloor = buyerFloor || lwFloor; + } + cache.auctions[args.auctionId].bids[bidRequest.bidId] = { + bidder: bidRequest.bidder, + adUnit: bidRequest.adUnitCode, + adUnitId: adUnitId, + isBid: false, + won: false, + timeout: false, + sendStatus: 0, + readyToSend: 0, + start: args.start, + lwFloor: lwFloor, + floorData: bidRequest.floorData, + auc: bidRequest.auc, + buc: bidRequest.buc, + lw: bidRequest.lw + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(bidRequest); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(livewrappedAnalyticsAdapter.requestEvents); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_RESPONSE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_BID_RESPONSE:', args); + let bidResponse = cache.auctions[args.auctionId].bids[args.requestId]; + if (bidResponse.cpm > args.cpm) break; // For now we only store the highest bid + bidResponse.isBid = args.getStatusCode() === _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.STATUS.GOOD; + bidResponse.width = args.width; + bidResponse.height = args.height; + bidResponse.cpm = args.cpm; + bidResponse.originalCpm = prebidGlobal.convertCurrency(args.originalCpm, args.originalCurrency, args.currency); + bidResponse.ttr = args.timeToRespond; + bidResponse.readyToSend = 1; + bidResponse.mediaType = getMediaTypeEnum(args.mediaType); + bidResponse.floorData = args.floorData; + bidResponse.meta = args.meta; + if (!bidResponse.ttr) { + bidResponse.ttr = time - bidResponse.start; + } + if (!cache.auctions[args.auctionId].bidAdUnits[bidResponse.adUnit]) { + cache.auctions[args.auctionId].bidAdUnits[bidResponse.adUnit] = { + sent: 0, + lw: bidResponse.lw, + adUnitId: bidResponse.adUnitId, + timeStamp: cache.auctions[args.auctionId].timeStamp + }; + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BIDDER_DONE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_BIDDER_DONE:', args); + args.bids.forEach(doneBid => { + let bid = cache.auctions[doneBid.auctionId].bids[doneBid.bidId || doneBid.requestId]; + if (!bid.ttr) { + bid.ttr = time - bid.start; + } + bid.readyToSend = 1; + }); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_WON: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_BID_WON:', args); + let wonBid = cache.auctions[args.auctionId].bids[args.requestId]; + wonBid.won = true; + wonBid.width = args.width; + wonBid.height = args.height; + wonBid.cpm = args.cpm; + wonBid.originalCpm = prebidGlobal.convertCurrency(args.originalCpm, args.originalCurrency, args.currency); + wonBid.mediaType = getMediaTypeEnum(args.mediaType); + wonBid.floorData = args.floorData; + wonBid.rUp = args.rUp; + wonBid.meta = args.meta; + wonBid.dealId = args.dealId; + if (wonBid.sendStatus != 0) { + livewrappedAnalyticsAdapter.sendEvents(); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AD_RENDER_FAILED: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_AD_RENDER_FAILED:', args); + let adRenderFailedBid = cache.auctions[args.bid.auctionId].bids[args.bid.requestId]; + adRenderFailedBid.adRenderFailed = true; + adRenderFailedBid.reason = args.reason; + adRenderFailedBid.message = args.message; + if (adRenderFailedBid.sendStatus != 0) { + livewrappedAnalyticsAdapter.sendEvents(); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_BID_TIMEOUT:', args); + args.forEach(timeout => { + cache.auctions[timeout.auctionId].bids[timeout.bidId].timeout = true; + }); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('LIVEWRAPPED_AUCTION_END:', args); + setTimeout(() => { + livewrappedAnalyticsAdapter.sendEvents(); + }, BID_WON_TIMEOUT); + break; + } + } +}); + +// save the base class function +livewrappedAnalyticsAdapter.originEnableAnalytics = livewrappedAnalyticsAdapter.enableAnalytics; +livewrappedAnalyticsAdapter.allRequestEvents = []; + +// override enableAnalytics so we can get access to the config passed in from the page +livewrappedAnalyticsAdapter.enableAnalytics = function (config) { + initOptions = config.options; + livewrappedAnalyticsAdapter.originEnableAnalytics(config); +}; +livewrappedAnalyticsAdapter.sendEvents = function () { + var sentRequests = getSentRequests(); + var events = { + publisherId: initOptions.publisherId, + gdpr: sentRequests.gdpr, + auctionIds: sentRequests.auctionIds, + requests: sentRequests.sentRequests, + responses: getResponses(sentRequests.gdpr, sentRequests.auctionIds), + wins: getWins(sentRequests.gdpr, sentRequests.auctionIds), + timeouts: getTimeouts(sentRequests.gdpr, sentRequests.auctionIds), + bidAdUnits: getbidAdUnits(), + rf: getAdRenderFailed(sentRequests.auctionIds), + ext: initOptions.ext + }; + if (events.requests.length == 0 && events.responses.length == 0 && events.wins.length == 0 && events.timeouts.length == 0 && events.rf.length == 0) { + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(initOptions.endpoint || URL, undefined, JSON.stringify(events), { + method: 'POST' + }); +}; +function getMediaTypeEnum(mediaType) { + return mediaType == 'native' ? 2 : mediaType == 'video' ? 4 : 1; +} +function getSentRequests() { + var sentRequests = []; + var gdpr = []; + var auctionIds = []; + Object.keys(cache.auctions).forEach(auctionId => { + let auction = cache.auctions[auctionId]; + let gdprPos = getGdprPos(gdpr, auction); + let auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let bid = auction.bids[bidId]; + if (!(bid.sendStatus & REQUESTSENT)) { + bid.sendStatus |= REQUESTSENT; + sentRequests.push({ + timeStamp: auction.timeStamp, + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + bidder: bid.bidder, + gdpr: gdprPos, + floor: bid.lwFloor, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw + }); + } + }); + }); + return { + gdpr: gdpr, + auctionIds: auctionIds, + sentRequests: sentRequests + }; +} +function getResponses(gdpr, auctionIds) { + var responses = []; + Object.keys(cache.auctions).forEach(auctionId => { + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let auction = cache.auctions[auctionId]; + let gdprPos = getGdprPos(gdpr, auction); + let auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + let bid = auction.bids[bidId]; + if (bid.readyToSend && !(bid.sendStatus & RESPONSESENT) && !bid.timeout) { + bid.sendStatus |= RESPONSESENT; + let response = getResponseObject(auction, bid, gdprPos, auctionIdPos); + responses.push(response); + } + }); + }); + return responses; +} +function getWins(gdpr, auctionIds) { + var wins = []; + Object.keys(cache.auctions).forEach(auctionId => { + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let auction = cache.auctions[auctionId]; + let gdprPos = getGdprPos(gdpr, auction); + let auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + let bid = auction.bids[bidId]; + if (!(bid.sendStatus & WINSENT) && bid.won) { + bid.sendStatus |= WINSENT; + wins.push({ + timeStamp: auction.timeStamp, + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + bidder: bid.bidder, + width: bid.width, + height: bid.height, + cpm: bid.cpm, + orgCpm: bid.originalCpm, + mediaType: bid.mediaType, + gdpr: gdprPos, + floor: bid.lwFloor ? bid.lwFloor : bid.floorData ? bid.floorData.floorValue : undefined, + floorCur: bid.floorData ? bid.floorData.floorCurrency : undefined, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw, + rUp: bid.rUp, + meta: bid.meta, + dealId: bid.dealId + }); + } + }); + }); + return wins; +} +function getGdprPos(gdpr, auction) { + var gdprPos = 0; + for (gdprPos = 0; gdprPos < gdpr.length; gdprPos++) { + if (gdpr[gdprPos].gdprApplies == auction.gdprApplies && gdpr[gdprPos].gdprConsent == auction.gdprConsent) { + break; + } + } + if (gdprPos == gdpr.length) { + gdpr[gdprPos] = { + gdprApplies: auction.gdprApplies, + gdprConsent: auction.gdprConsent + }; + } + return gdprPos; +} +function getAuctionIdPos(auctionIds, auctionId) { + var auctionIdPos = 0; + for (auctionIdPos = 0; auctionIdPos < auctionIds.length; auctionIdPos++) { + if (auctionIds[auctionIdPos] == auctionId) { + break; + } + } + if (auctionIdPos == auctionIds.length) { + auctionIds[auctionIdPos] = auctionId; + } + return auctionIdPos; +} +function getResponseObject(auction, bid, gdprPos, auctionIdPos) { + return { + timeStamp: auction.timeStamp, + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + bidder: bid.bidder, + width: bid.width, + height: bid.height, + cpm: bid.cpm, + orgCpm: bid.originalCpm, + ttr: bid.ttr, + IsBid: bid.isBid, + mediaType: bid.mediaType, + gdpr: gdprPos, + floor: bid.lwFloor ? bid.lwFloor : bid.floorData ? bid.floorData.floorValue : undefined, + floorCur: bid.floorData ? bid.floorData.floorCurrency : undefined, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw, + meta: bid.meta + }; +} +function getTimeouts(gdpr, auctionIds) { + var timeouts = []; + Object.keys(cache.auctions).forEach(auctionId => { + let auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let auction = cache.auctions[auctionId]; + let gdprPos = getGdprPos(gdpr, auction); + let bid = auction.bids[bidId]; + if (!(bid.sendStatus & TIMEOUTSENT) && bid.timeout) { + bid.sendStatus |= TIMEOUTSENT; + let timeout = getResponseObject(auction, bid, gdprPos, auctionIdPos); + timeouts.push(timeout); + } + }); + }); + return timeouts; +} +function getAdRenderFailed(auctionIds) { + var adRenderFails = []; + Object.keys(cache.auctions).forEach(auctionId => { + let auctionIdPos = getAuctionIdPos(auctionIds, auctionId); + Object.keys(cache.auctions[auctionId].bids).forEach(bidId => { + let auction = cache.auctions[auctionId]; + let bid = auction.bids[bidId]; + if (!(bid.sendStatus & ADRENDERFAILEDSENT) && bid.adRenderFailed) { + bid.sendStatus |= ADRENDERFAILEDSENT; + adRenderFails.push({ + bidder: bid.bidder, + adUnit: bid.adUnit, + adUnitId: bid.adUnitId, + timeStamp: auction.timeStamp, + auctionId: auctionIdPos, + auc: bid.auc, + buc: bid.buc, + lw: bid.lw, + rsn: bid.reason, + msg: bid.message + }); + } + }); + }); + return adRenderFails; +} +function getbidAdUnits() { + var bidAdUnits = []; + Object.keys(cache.auctions).forEach(auctionId => { + let auction = cache.auctions[auctionId]; + Object.keys(auction.bidAdUnits).forEach(adUnit => { + let bidAdUnit = auction.bidAdUnits[adUnit]; + if (!bidAdUnit.sent) { + bidAdUnit.sent = 1; + bidAdUnits.push({ + adUnit: adUnit, + adUnitId: bidAdUnit.adUnitId, + timeStamp: bidAdUnit.timeStamp, + lw: bidAdUnit.lw + }); + } + }); + }); + return bidAdUnits; +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: livewrappedAnalyticsAdapter, + code: 'livewrapped' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (livewrappedAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.registerModule)('livewrappedAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/livewrappedAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["livewrappedBidAdapter"],{ + +/***/ "./modules/livewrappedBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/livewrappedBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, URL, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'livewrapped'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const URL = 'https://lwadm.com/ad'; +const VERSION = '1.4'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + gvlid: 919, + /** + * Determines whether or not the given bid request is valid. + * + * Parameters should be + * + * adUnitId: LiveWrapped's id of the ad unit. Optional. A guid identifying the ad unit. + * adUnitName: LiveWrapped's name of the ad unit Optional. (Prebid's ad unit code will be used otherwise.) + * publisherId: Publisher id. Required if adUnitName is used or both adUnitName and adUnitId is omitted, otherwise optional. + * userId: A persistent user id if available. Optional. + * url: Page url Optional. Use if page url cannot be determined due to use of iframes. + * bidUrl: Bidding endpoint Optional. + * seats: List of bidders and seats Optional. {"bidder name": ["seat 1", "seat 2"], ...} + * deviceId: Device id if available Optional. + * ifa: Advertising ID Optional. + * bundle: App bundle Optional. Read from config if exists. + * options Dynamic data Optional. Optional data to send into adapter. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return (bid.params.adUnitId || (bid.params.adUnitName || bid.adUnitCode || bid.placementCode) && bid.params.publisherId) !== undefined; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const userId = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasUserId); + const pubcid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasPubcid); + const publisherId = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasPublisherId); + const auctionId = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasAuctionId); + let bidUrl = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasBidUrl); + let url = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasUrl); + let test = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasTestParam); + const seats = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasSeatsParam); + const deviceId = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasDeviceIdParam); + const ifa = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasIfaParam); + const bundle = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasBundleParam); + const tid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasTidParam); + const schain = bidRequests[0].schain; + let ortb2 = bidderRequest.ortb2; + const eids = handleEids(bidRequests); + bidUrl = bidUrl ? bidUrl.params.bidUrl : URL; + url = url ? url.params.url : getAppDomain() || getTopWindowLocation(bidderRequest); + test = test ? test.params.test : undefined; + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest) || 'USD'; + var adRequests = bidRequests.map(b => bidToAdRequest(b, currency)); + const adRequestsContainFloors = adRequests.some(r => r.flr !== undefined); + if (eids) { + ortb2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)({}, ortb2 || {}), eids); + } + const payload = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: auctionId ? auctionId.auctionId : undefined, + publisherId: publisherId ? publisherId.params.publisherId : undefined, + userId: userId ? userId.params.userId : pubcid ? pubcid.crumbs.pubcid : undefined, + url: url, + test: test, + seats: seats ? seats.params.seats : undefined, + deviceId: deviceId ? deviceId.params.deviceId : undefined, + ifa: ifa ? ifa.params.ifa : getDeviceIfa(), + bundle: bundle ? bundle.params.bundle : getAppBundle(), + width: getDeviceWidth(), + height: getDeviceHeight(), + tid: tid ? tid.params.tid : undefined, + version: VERSION, + gdprApplies: bidderRequest.gdprConsent ? bidderRequest.gdprConsent.gdprApplies : undefined, + gdprConsent: bidderRequest.gdprConsent ? bidderRequest.gdprConsent.consentString : undefined, + coppa: getCoppa(), + usPrivacy: bidderRequest.uspConsent, + cookieSupport: !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isSafariBrowser)() && storage.cookiesAreEnabled(), + rcv: getAdblockerRecovered(), + adRequests: [...adRequests], + rtbData: ortb2, + schain: schain, + flrCur: adRequestsContainFloors ? currency : undefined + }; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig().debug) { + payload.dbg = true; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: bidUrl, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const bidResponses = []; + if (serverResponse.body.dbg && window.livewrapped && window.livewrapped.s2sDebug) { + window.livewrapped.s2sDebug(serverResponse.body.dbg); + } + serverResponse.body.ads.forEach(function (ad) { + var bidResponse = { + requestId: ad.bidId, + cpm: ad.cpmBid, + width: ad.width, + height: ad.height, + ad: ad.tag, + ttl: ad.ttl, + creativeId: ad.creativeId, + netRevenue: true, + currency: serverResponse.body.currency, + meta: ad.meta + }; + if (ad.meta?.dealId) { + bidResponse.dealId = ad.meta?.dealId; + } + if (ad.fwb) { + bidResponse.bidderCode = ad.meta?.bidder; + } + if (ad.native) { + bidResponse.native = ad.native; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } + if (ad.video) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + bidResponse.vastXml = ad.tag; + } + bidResponses.push(bidResponse); + }); + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + if (serverResponses.length == 0) return []; + let syncList = []; + let userSync = serverResponses[0].body.pixels || []; + userSync.forEach(function (sync) { + if (syncOptions.pixelEnabled && sync.type == 'Redirect') { + syncList.push({ + type: 'image', + url: sync.url + }); + } + if (syncOptions.iframeEnabled && sync.type == 'Iframe') { + syncList.push({ + type: 'iframe', + url: sync.url + }); + } + }); + return syncList; + } +}; +function hasUserId(bid) { + return !!bid.params.userId; +} +function hasPublisherId(bid) { + return !!bid.params.publisherId; +} +function hasUrl(bid) { + return !!bid.params.url; +} +function hasBidUrl(bid) { + return !!bid.params.bidUrl; +} +function hasAuctionId(bid) { + return !!bid.auctionId; +} +function hasTestParam(bid) { + return !!bid.params.test; +} +function hasSeatsParam(bid) { + return !!bid.params.seats; +} +function hasDeviceIdParam(bid) { + return !!bid.params.deviceId; +} +function hasIfaParam(bid) { + return !!bid.params.ifa; +} +function hasBundleParam(bid) { + return !!bid.params.bundle; +} +function hasTidParam(bid) { + return !!bid.params.tid; +} +function hasPubcid(bid) { + return !!bid.crumbs && !!bid.crumbs.pubcid; +} +function bidToAdRequest(bid, currency) { + var adRequest = { + adUnitId: bid.params.adUnitId, + callerAdUnitId: bid.params.adUnitName || bid.adUnitCode || bid.placementCode, + bidId: bid.bidId, + formats: getSizes(bid).map(sizeToFormat), + flr: getBidFloor(bid, currency), + rtbData: bid.ortb2Imp, + options: bid.params.options + }; + if (bid.auc !== undefined) { + adRequest.auc = bid.auc; + } + adRequest.native = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.native'); + adRequest.video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.video'); + if ((adRequest.native || adRequest.video) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.banner')) { + adRequest.banner = true; + } + return adRequest; +} +function getSizes(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.banner.sizes')) { + return bid.mediaTypes.banner.sizes; + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) { + return bid.sizes; + } + return []; +} +function sizeToFormat(size) { + return { + width: size[0], + height: size[1] + }; +} +function getBidFloor(bid, currency) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(bid.getFloor)) { + return undefined; + } + const floor = bid.getFloor({ + currency: currency, + mediaType: '*', + size: '*' + }); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency == currency ? floor.floor : undefined; +} +function getAdblockerRecovered() { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWindowTop)().I12C && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWindowTop)().I12C.Morph === 1; + } catch (e) {} +} +function handleEids(bidRequests) { + const bidRequest = bidRequests[0]; + if (bidRequest && bidRequest.userIdAsEids) { + return { + user: { + ext: { + eids: bidRequest.userIdAsEids + } + } + }; + } + return undefined; +} +function getTopWindowLocation(bidderRequest) { + return bidderRequest?.refererInfo?.page; +} +function getAppBundle() { + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('app') === 'object') { + return _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('app').bundle; + } +} +function getAppDomain() { + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('app') === 'object') { + return _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('app').domain; + } +} +function getDeviceIfa() { + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('device') === 'object') { + return _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('device').ifa; + } +} +function getDeviceWidth() { + const device = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('device') || {}; + return device.w || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWinDimensions)().innerWidth; +} +function getDeviceHeight() { + const device = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('device') || {}; + return device.h || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWinDimensions)().innerHeight; +} +function getCoppa() { + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa') === 'boolean') { + return _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa'); + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('livewrappedBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/livewrappedBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lkqdBidAdapter"],{ + +/***/ "./modules/lkqdBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/lkqdBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'lkqd'; +const BID_TTL_DEFAULT = 300; +const MIMES_TYPES = ['application/x-mpegURL', 'video/mp4', 'video/H264']; +const PROTOCOLS = [1, 2, 3, 4, 5, 6, 7, 8]; +const PARAM_VOLUME_DEFAULT = '100'; +const DEFAULT_SIZES = [[640, 480]]; +function calculateSizes(VIDEO_BID, bid) { + const userProvided = bid.sizes && Array.isArray(bid.sizes) ? Array.isArray(bid.sizes[0]) ? bid.sizes : [bid.sizes] : DEFAULT_SIZES; + const preBidProvided = VIDEO_BID.playerSize && Array.isArray(VIDEO_BID.playerSize) ? Array.isArray(VIDEO_BID.playerSize[0]) ? VIDEO_BID.playerSize : [VIDEO_BID.playerSize] : null; + return preBidProvided || userProvided; +} +function isSet(value) { + return value != null; +} +const spec = { + code: BIDDER_CODE, + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return bid.bidder === BIDDER_CODE && bid.params && Object.keys(bid.params).length > 0 && (isSet(bid.params.publisherId) && parseInt(bid.params.publisherId) > 0 || isSet(bid.params.placementId) && parseInt(bid.params.placementId) > 0) && bid.params.siteId != null; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const BIDDER_REQUEST = bidderRequest || {}; + const serverRequestObjects = []; + const UTC_OFFSET = new Date().getTimezoneOffset(); + const UA = navigator.userAgent; + const USP = BIDDER_REQUEST.uspConsent || null; + // TODO: does the fallback make sense here? + const REFERER = BIDDER_REQUEST?.refererInfo?.domain || window.location.host; + const BIDDER_GDPR = BIDDER_REQUEST.gdprConsent && BIDDER_REQUEST.gdprConsent.gdprApplies ? 1 : null; + const BIDDER_GDPRS = BIDDER_REQUEST.gdprConsent && BIDDER_REQUEST.gdprConsent.consentString ? BIDDER_REQUEST.gdprConsent.consentString : null; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, bid => { + const DOMAIN = bid.params.pageurl || REFERER; + const GDPR = BIDDER_GDPR || bid.params.gdpr || null; + const GDPRS = BIDDER_GDPRS || bid.params.gdprs || null; + const DNT = bid.params.dnt || null; + const BID_FLOOR = 0; + const VIDEO_BID = bid.video ? bid.video : {}; + const requestData = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + imp: [], + site: { + domain: DOMAIN + }, + device: { + ua: UA, + geo: { + utcoffset: UTC_OFFSET + } + }, + user: { + ext: {} + }, + test: 0, + at: 2, + tmax: bidderRequest.timeout, + cur: ['USD'], + regs: { + ext: { + us_privacy: USP + } + } + }; + if (isSet(DNT)) { + requestData.device.dnt = DNT; + } + if (isSet(_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa'))) { + requestData.regs.coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true ? 1 : 0; + } + if (isSet(GDPR)) { + requestData.regs.ext.gdpr = GDPR; + requestData.regs.ext.gdprs = GDPRS; + } + if (isSet(bid.params.aid) || isSet(bid.params.appname) || isSet(bid.params.bundleid)) { + requestData.app = { + id: bid.params.aid, + name: bid.params.appname, + bundle: bid.params.bundleid + }; + if (bid.params.contentId) { + requestData.app.content = { + id: bid.params.contentId, + title: bid.params.contentTitle, + len: bid.params.contentLength, + url: bid.params.contentUrl + }; + } + } + if (isSet(bid.params.idfa) || isSet(bid.params.aid)) { + requestData.device.ifa = bid.params.idfa || bid.params.aid; + } + if (bid.schain) { + requestData.source = { + ext: { + schain: bid.schain + } + }; + } else if (bid.params.schain) { + const section = bid.params.schain.split('!'); + const verComplete = section[0].split(','); + const node = section[1].split(','); + requestData.source = { + ext: { + schain: { + validation: 'strict', + config: { + ver: verComplete[0], + complete: parseInt(verComplete[1]), + nodes: [{ + asi: decodeURIComponent(node[0]), + sid: decodeURIComponent(node[1]), + hp: parseInt(node[2]), + rid: decodeURIComponent(node[3]), + name: decodeURIComponent(node[4]), + domain: decodeURIComponent(node[5]) + }] + } + } + } + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(calculateSizes(VIDEO_BID, bid), sizes => { + const impObj = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + displaymanager: bid.bidder, + bidfloor: BID_FLOOR, + video: { + mimes: VIDEO_BID.mimes || MIMES_TYPES, + protocols: VIDEO_BID.protocols || PROTOCOLS, + nvol: bid.params.volume || PARAM_VOLUME_DEFAULT, + w: sizes[0], + h: sizes[1], + skip: VIDEO_BID.skip || 0, + playbackmethod: VIDEO_BID.playbackmethod || [1], + ext: { + lkqdcustomparameters: {} + } + }, + bidfloorcur: 'USD', + secure: 1 + }; + for (let k = 1; k <= 40; k++) { + if (bid.params.hasOwnProperty(`c${k}`) && bid.params[`c${k}`]) { + impObj.video.ext.lkqdcustomparameters[`c${k}`] = bid.params[`c${k}`]; + } + } + requestData.imp.push(impObj); + }); + serverRequestObjects.push({ + method: 'POST', + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: 'https', + hostname: 'rtb.lkqd.net', + pathname: '/ad', + search: { + pid: bid.params.publisherId || bid.params.placementId, + sid: bid.params.siteId, + output: 'rtb', + prebid: true + } + }), + data: requestData + }); + }); + return serverRequestObjects; + }, + interpretResponse: function (serverResponse, bidRequest) { + const serverBody = serverResponse.body; + const bidResponses = []; + if (serverBody && serverBody.seatbid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(serverBody.seatbid, seatbid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(seatbid.bid, bid => { + if (bid.price > 0) { + const bidResponse = { + requestId: bidRequest.id, + creativeId: bid.crid, + cpm: bid.price, + width: bid.w, + height: bid.h, + currency: serverBody.cur, + netRevenue: true, + ttl: BID_TTL_DEFAULT, + ad: bid.adm, + meta: { + advertiserDomains: bid.adomain && Array.isArray(bid.adomain) ? bid.adomain : [], + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO + } + }; + bidResponses.push(bidResponse); + } + }); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error: No server response or server response was empty for the requested URL'); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('lkqdBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lkqdBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lm_kiviadsBidAdapter"],{ + +/***/ "./modules/lm_kiviadsBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/lm_kiviadsBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/xeUtils/bidderUtils.js */ "./libraries/xeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'lm_kiviads'; +const ENDPOINT = 'https://pbjs.kiviads.live'; +const spec = { + code: BIDDER_CODE, + aliases: ['kivi'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT), + interpretResponse: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('lm_kiviadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","xeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lm_kiviadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lmpIdSystem"],{ + +/***/ "./modules/lmpIdSystem.js": +/*!********************************!*\ + !*** ./modules/lmpIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, lmpIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + +/** + * This module adds lmpId support to the User ID module + * The {@link module:modules/userId} module is required. + * @module modules/lmpIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const MODULE_NAME = 'lmpid'; +const STORAGE_KEY = '__lmpid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function readFromLocalStorage() { + return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(STORAGE_KEY) : null; +} +function getLmpid() { + return window[STORAGE_KEY] || readFromLocalStorage(); +} + +/** @type {Submodule} */ +const lmpIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { string | undefined } value + * @return { {lmpid: string} | undefined } + */ + decode(value) { + return value ? { + lmpid: value + } : undefined; + }, + /** + * Retrieve the LMPID + * @function + * @param {SubmoduleConfig} config + * @return {{id: string | undefined} | undefined} + */ + getId(config) { + const id = getLmpid(); + return id ? { + id + } : undefined; + }, + eids: { + 'lmpid': { + source: 'loblawmedia.ca', + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', lmpIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('lmpIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lmpIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lockerdomeBidAdapter"],{ + +/***/ "./modules/lockerdomeBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/lockerdomeBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + +const spec = { + code: 'lockerdome', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.adUnitId; + }, + buildRequests: function (bidRequests, bidderRequest) { + let schain; + const adUnitBidRequests = bidRequests.map(function (bid) { + if (bid.schain) schain = schain || bid.schain; + return { + requestId: bid.bidId, + adUnitCode: bid.adUnitCode, + adUnitId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('adUnitId', bid.params), + sizes: bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes + }; + }); + const payload = { + bidRequests: adUnitBidRequests, + // TODO: are these the right refererInfo values? + url: encodeURIComponent(bidderRequest?.refererInfo?.canonicalUrl || ''), + referrer: encodeURIComponent(bidderRequest?.refererInfo?.topmostLocation || '') + }; + if (schain) { + payload.schain = schain; + } + if (bidderRequest) { + if (bidderRequest.gdprConsent) { + payload.gdpr = { + applies: bidderRequest.gdprConsent.gdprApplies, + consent: bidderRequest.gdprConsent.consentString + }; + } + if (bidderRequest.uspConsent) { + payload.us_privacy = { + consent: bidderRequest.uspConsent + }; + } + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: 'https://lockerdome.com/ladbid/prebid', + data: payloadString + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse || !serverResponse.body || !serverResponse.body.bids) { + return []; + } + return serverResponse.body.bids.map(function (bid) { + return { + requestId: bid.requestId, + cpm: bid.cpm, + width: bid.width, + height: bid.height, + creativeId: bid.creativeId, + currency: bid.currency, + netRevenue: bid.netRevenue, + ad: bid.ad, + ttl: bid.ttl, + meta: { + advertiserDomains: bid.adomain && Array.isArray(bid.adomain) ? bid.adomain : [] + } + }; + }); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('lockerdomeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lockerdomeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lockrAIMIdSystem"],{ + +/***/ "./modules/lockrAIMIdSystem.js": +/*!*************************************!*\ + !*** ./modules/lockrAIMIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports lockrAIMCodeVersion, storage, lockrAIMSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds lockr AIM ID support to the User ID module + * The {@link module:modules/userId} module is required. + * @module modules/lockrAIMIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').lockrAIMId} lockrAIMId + */ + +const MODULE_NAME = 'lockrAIMId'; +const LOG_PRE_FIX = 'lockr-AIM: '; +const AIM_PROD_URL = 'https://identity.loc.kr'; +const lockrAIMCodeVersion = '1.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function createLogger(logger, prefix) { + return function () { + for (var _len = arguments.length, strings = new Array(_len), _key = 0; _key < _len; _key++) { + strings[_key] = arguments[_key]; + } + logger(prefix + ' ', ...strings); + }; +} +const _logInfo = createLogger(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo, LOG_PRE_FIX); +const _logWarn = createLogger(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn, LOG_PRE_FIX); + +/** @type {Submodule} */ +const lockrAIMSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + init() { + _logInfo('lockrAIM Initialization complete'); + }, + /** + * performs action to obtain id and return a value. + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData|undefined} consentData + * @returns {lockrAIMId} + */ + getId(config, consentData) { + if (consentData?.gdpr?.gdprApplies === true) { + _logWarn('lockrAIM is not intended for use where GDPR applies. The lockrAIM module will not run'); + return undefined; + } + const gppConsent = consentData?.gpp; + let gppString = ''; + if (gppConsent) { + gppString = gppConsent.gppString; + } + const mappedConfig = { + appID: config?.params?.appID, + email: config?.params?.email, + baseUrl: AIM_PROD_URL + }; + _logInfo('lockr AIM configurations loaded and mapped.', mappedConfig); + if (!mappedConfig.appID || !mappedConfig.email) { + return undefined; + } + const tokenGenerator = new LockrAIMApiClient(mappedConfig, _logInfo, _logWarn, storage, gppString); + const result = tokenGenerator.generateToken(); + _logInfo('lockr AIM results generated'); + return result; + } +}; +class LockrAIMApiClient { + static expiryDateKeys = []; + static canRefreshToken = false; + constructor(opts, logInfo, logWarn, prebidStorageManager, gppString) { + this._baseUrl = opts.baseUrl; + this._appID = opts.appID; + this._email = opts.email; + this._logInfo = logInfo; + this._logWarn = logWarn; + this._gppString = gppString; + this.prebidStorageManager = prebidStorageManager; + LockrAIMApiClient.expiryDateKeys = this.prebidStorageManager.getDataFromLocalStorage('lockr_expiry_keys') ? JSON.parse(this.prebidStorageManager.getDataFromLocalStorage('lockr_expiry_keys')) : []; + this.initializeRefresher(); + } + async generateToken() { + let type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'email'; + let value = arguments.length > 1 ? arguments[1] : undefined; + const url = this._baseUrl + '/publisher/app/v1/identityLockr/generate-tokens'; + let rejectPromise; + const promise = new Promise((resolve, reject) => { + rejectPromise = reject; + }); + const requestBody = { + appID: this._appID, + data: { + type: type, + value: value ?? this._email, + gppString: this._gppString + } + }; + this._logInfo('Sending the token generation request'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, { + success: responseText => { + try { + const response = JSON.parse(responseText); + LockrAIMApiClient.canRefreshToken = false; + const token = response.lockrMappingToken; + this.prebidStorageManager.setDataInLocalStorage('ilui', token); + response.data.forEach(cookieitem => { + const settings = cookieitem?.settings; + this.prebidStorageManager.setDataInLocalStorage(`${cookieitem.key_name}_expiry`, cookieitem.identity_expires); + if (!LockrAIMApiClient.expiryDateKeys.includes(`${cookieitem.key_name}_expiry`)) { + LockrAIMApiClient.expiryDateKeys.push(`${cookieitem.key_name}_expiry`); + } + this.prebidStorageManager.setDataInLocalStorage('lockr_expiry_keys', JSON.stringify(LockrAIMApiClient.expiryDateKeys)); + if (!settings?.dropLocalStorage) { + this.prebidStorageManager.setDataInLocalStorage(cookieitem.key_name, cookieitem.advertising_token); + } + if (!settings?.dropCookie) { + this.prebidStorageManager.setCookie(cookieitem.key_name, cookieitem.advertising_token); + } + }); + LockrAIMApiClient.canRefreshToken = true; + } catch (_err) { + this._logWarn(_err); + rejectPromise(responseText); + LockrAIMApiClient.canRefreshToken = true; + } + } + }, JSON.stringify(requestBody), { + method: 'POST', + contentType: 'application/json;charset=UTF-8' + }); + return promise; + } + async initializeRefresher() { + setInterval(() => { + LockrAIMApiClient.expiryDateKeys.forEach(expiryItem => { + const currentMillis = new Date().getTime(); + const dateMillis = this.prebidStorageManager.getDataFromLocalStorage(expiryItem); + if (currentMillis > dateMillis && dateMillis !== null && this.prebidStorageManager.getDataFromLocalStorage('ilui') && LockrAIMApiClient.canRefreshToken) { + this.generateToken('refresh', this.prebidStorageManager.getDataFromLocalStorage('ilui')); + } + }); + }, 1000); + } +} + +// Register submodule for userId +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', lockrAIMSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('lockrAIMIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lockrAIMIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["loganBidAdapter"],{ + +/***/ "./modules/loganBidAdapter.js": +/*!************************************!*\ + !*** ./modules/loganBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/precisoUtils/bidUtilsCommon.js */ "./libraries/precisoUtils/bidUtilsCommon.js"); + + + + + + +const BIDDER_CODE = 'logan'; +const AD_URL = 'https://USeast2.logan.ai/pbjs'; +const SYNC_URL = 'https://ssp-cookie.logan.ai'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const winTop = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWindowTop)(); + const location = winTop.location; + const placements = []; + const request = { + deviceWidth: winTop.screen.width, + deviceHeight: winTop.screen.height, + language: navigator && navigator.language ? navigator.language.split('-')[0] : '', + secure: 1, + host: location.host, + page: location.pathname, + placements: placements + }; + (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.consentCheck)(bidderRequest, request); + const len = validBidRequests.length; + for (let i = 0; i < len; i++) { + const bid = validBidRequests[i]; + const placement = { + placementId: bid.params.placementId, + bidId: bid.bidId, + schain: bid.schain || {}, + bidfloor: (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.getBidFloor)(bid) + }; + const mediaType = bid.mediaTypes; + if (mediaType && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes) { + placement.sizes = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } else if (mediaType && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize) { + placement.wPlayer = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize[0]; + placement.hPlayer = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playerSize[1]; + placement.minduration = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].minduration; + placement.maxduration = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].maxduration; + placement.mimes = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].mimes; + placement.protocols = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].protocols; + placement.startdelay = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].startdelay; + placement.placement = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].placement; + placement.plcmt = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].plcmt; + placement.skip = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].skip; + placement.skipafter = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].skipafter; + placement.minbitrate = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].minbitrate; + placement.maxbitrate = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].maxbitrate; + placement.delivery = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].delivery; + placement.playbackmethod = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].playbackmethod; + placement.api = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].api; + placement.linearity = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].linearity; + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else if (mediaType && mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]) { + placement.native = mediaType[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; + placement.adFormat = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } + placements.push(placement); + } + return { + method: 'POST', + url: AD_URL, + data: request + }; + }, + interpretResponse: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + return (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.buildUserSyncs)(syncOptions, serverResponses, gdprConsent, uspConsent, SYNC_URL); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('loganBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["precisoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/loganBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["logicadBidAdapter"],{ + +/***/ "./modules/logicadBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/logicadBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const BIDDER_CODE = 'logicad'; +const ENDPOINT_URL = 'https://pb.ladsp.com/adrequest/prebid'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.tid); + }, + buildRequests: function (bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(bidRequests); + const requests = []; + for (let i = 0, len = bidRequests.length; i < len; i++) { + const request = { + method: 'POST', + url: ENDPOINT_URL, + data: JSON.stringify(newBidRequest(bidRequests[i], bidderRequest)), + options: {}, + bidderRequest + }; + requests.push(request); + } + return requests; + }, + interpretResponse: function (serverResponse, bidderRequest) { + serverResponse = serverResponse.body; + const bids = []; + if (!serverResponse || serverResponse.error) { + return bids; + } + serverResponse.seatbid.forEach(function (seatbid) { + bids.push(seatbid.bid); + }); + const fledgeAuctionConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(serverResponse, 'ext.fledgeAuctionConfigs') || []; + if (fledgeAuctionConfigs.length) { + return { + bids, + paapi: fledgeAuctionConfigs + }; + } + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses) { + if (serverResponses.length > 0 && serverResponses[0].body.userSync && syncOptions.pixelEnabled && serverResponses[0].body.userSync.type == 'image') { + return [{ + type: 'image', + url: serverResponses[0].body.userSync.url + }]; + } + return []; + } +}; +function newBidRequest(bidRequest, bidderRequest) { + const bid = { + adUnitCode: bidRequest.adUnitCode, + bidId: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + sizes: bidRequest.sizes, + params: bidRequest.params, + mediaTypes: bidRequest.mediaTypes + }; + const fledgeEnabled = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'paapi.enabled'); + if (fledgeEnabled) { + const ae = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.ae'); + if (ae) { + bid.ae = ae; + } + } + const data = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidRequest.auctionId, + bidderRequestId: bidRequest.bidderRequestId, + bids: [bid], + prebidJsVersion: "9.45.0-pre", + // TODO: is 'page' the right value here? + referrer: bidderRequest.refererInfo.page, + auctionStartTime: bidderRequest.auctionStart, + eids: bidRequest.userIdAsEids + }; + const sua = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2.device.sua'); + if (sua) { + data.sua = sua; + } + const userData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2.user.data'); + if (userData) { + data.userData = userData; + } + if (bidRequest.schain) { + data.schain = bidRequest.schain; + } + return data; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('logicadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/logicadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["loglyliftBidAdapter"],{ + +/***/ "./modules/loglyliftBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/loglyliftBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + +const BIDDER_CODE = 'loglylift'; +const ENDPOINT_URL = 'https://bid.logly.co.jp/prebid/client/v1'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.adspotId); + }, + buildRequests: function (bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(bidRequests); + const requests = []; + for (let i = 0, len = bidRequests.length; i < len; i++) { + const request = { + method: 'POST', + url: ENDPOINT_URL + '?adspot_id=' + bidRequests[i].params.adspotId, + data: JSON.stringify(newBidRequest(bidRequests[i], bidderRequest)), + options: {}, + bidderRequest + }; + requests.push(request); + } + return requests; + }, + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + const bidResponses = []; + if (!serverResponse || serverResponse.error) { + return bidResponses; + } + serverResponse.bids.forEach(function (bid) { + bidResponses.push(bid); + }); + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + + // sync if mediaType is native because not native ad itself has a function for sync + if (syncOptions.iframeEnabled && serverResponses.length > 0 && serverResponses[0].body.bids[0].native) { + syncs.push({ + type: 'iframe', + url: 'https://sync.logly.co.jp/sync/sync.html' + }); + } + return syncs; + } +}; +function newBidRequest(bid, bidderRequest) { + const currencyObj = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('currency'); + const currency = currencyObj && currencyObj.adServerCurrency || 'USD'; + return { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bid.auctionId, + bidderRequestId: bid.bidderRequestId, + transactionId: bid.ortb2Imp?.ext?.tid, + adUnitCode: bid.adUnitCode, + bidId: bid.bidId, + mediaTypes: bid.mediaTypes, + params: bid.params, + prebidJsVersion: "9.45.0-pre", + url: window.location.href, + domain: bidderRequest.refererInfo.domain, + referer: bidderRequest.refererInfo.page, + auctionStartTime: bidderRequest.auctionStart, + currency: currency, + timeout: _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('bidderTimeout') + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('loglyliftBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/loglyliftBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["loopmeBidAdapter"],{ + +/***/ "./modules/loopmeBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/loopmeBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/pbsExtensions/pbsExtensions.js */ "./libraries/pbsExtensions/pbsExtensions.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + +const BIDDER_CODE = 'loopme'; +const url = 'https://prebid.loopmertb.com/'; +const GVLID = 109; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + processors: _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_1__.pbsExtensions, + context: { + netRevenue: true, + ttl: 30 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext.bidder', { + ...bidRequest.params + }); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + req.at = 1; + const { + bundleId, + publisherId + } = bidderRequest.bids[0].params; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(req, 'site.domain', bundleId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(req, 'site.publisher.domain', bundleId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(req, 'site.publisher.id', publisherId); + return req; + } +}); +const spec = { + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE], + code: BIDDER_CODE, + gvlid: GVLID, + isBidRequestValid: _ref => { + let { + params = {} + } = _ref; + return Boolean(params.publisherId && params.bundleId); + }, + buildRequests: (bidRequests, bidderRequest) => ({ + url, + method: 'POST', + data: converter.toORTB({ + bidRequests, + bidderRequest + }) + }), + interpretResponse: (_ref2, _ref3) => { + let { + body + } = _ref2; + let { + data + } = _ref3; + return converter.fromORTB({ + request: data, + response: body + }).bids; + }, + getUserSyncs: (syncOptions, serverResponses) => serverResponses.flatMap(_ref4 => { + let { + body + } = _ref4; + return (body.ext?.usersyncs || []).filter(_ref5 => { + let { + type + } = _ref5; + return type === 'image' || type === 'iframe'; + }).filter(_ref6 => { + let { + url + } = _ref6; + return url && (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')); + }).filter(_ref7 => { + let { + type + } = _ref7; + return type === 'image' && syncOptions.pixelEnabled || type === 'iframe' && syncOptions.iframeEnabled; + }); + }) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('loopmeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","pbsExtensions","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/loopmeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lotamePanoramaIdSystem"],{ + +/***/ "./modules/lotamePanoramaIdSystem.js": +/*!*******************************************!*\ + !*** ./modules/lotamePanoramaIdSystem.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, lotamePanoramaIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds LotamePanoramaId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/lotamePanoramaId + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const KEY_ID = 'panoramaId'; +const KEY_EXPIRY = `${KEY_ID}_expiry`; +const KEY_PROFILE = '_cc_id'; +const MODULE_NAME = 'lotamePanoramaId'; +const NINE_MONTHS_MS = 23328000 * 1000; +const DAYS_TO_CACHE = 7; +const DAY_MS = 60 * 60 * 24 * 1000; +const MISSING_CORE_CONSENT = 111; +const GVLID = 95; +const ID_HOST = 'id.crwdcntrl.net'; +const ID_HOST_COOKIELESS = 'c.ltmsphrcl.net'; +const DO_NOT_HONOR_CONFIG = false; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +let cookieDomain; +let appliedConfig = { + name: 'lotamePanoramaId', + storage: { + type: 'cookie&html5', + name: 'panoramaId' + } +}; + +/** + * Set the Lotame First Party Profile ID in the first party namespace + * @param {String} profileId + */ +function setProfileId(profileId) { + if (cookiesAreEnabled()) { + let expirationDate = new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + NINE_MONTHS_MS).toUTCString(); + storage.setCookie(KEY_PROFILE, profileId, expirationDate, 'Lax', cookieDomain, undefined); + } + if (localStorageIsEnabled()) { + storage.setDataInLocalStorage(KEY_PROFILE, profileId, undefined); + } +} + +/** + * Get the Lotame profile id by checking cookies first and then local storage + */ +function getProfileId() { + let profileId; + if (cookiesAreEnabled(DO_NOT_HONOR_CONFIG)) { + profileId = storage.getCookie(KEY_PROFILE, undefined); + } + if (!profileId && localStorageIsEnabled(DO_NOT_HONOR_CONFIG)) { + profileId = storage.getDataFromLocalStorage(KEY_PROFILE, undefined); + } + return profileId; +} + +/** + * Get a value from browser storage by checking cookies first and then local storage + * @param {String} key + */ +function getFromStorage(key) { + let value = null; + if (cookiesAreEnabled(DO_NOT_HONOR_CONFIG)) { + value = storage.getCookie(key, undefined); + } + if (value === null && localStorageIsEnabled(DO_NOT_HONOR_CONFIG)) { + value = storage.getDataFromLocalStorage(key, undefined); + } + return value; +} + +/** + * Save a key/value pair to the browser cache (cookies and local storage) + * @param {String} key + * @param {String} value + * @param {Number} expirationTimestamp + */ +function saveLotameCache(key, value) { + let expirationTimestamp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + DAYS_TO_CACHE * DAY_MS; + if (key && value) { + let expirationDate = new Date(expirationTimestamp).toUTCString(); + if (cookiesAreEnabled()) { + storage.setCookie(key, value, expirationDate, 'Lax', cookieDomain, undefined); + } + if (localStorageIsEnabled()) { + storage.setDataInLocalStorage(key, value, undefined); + } + } +} + +/** + * Retrieve all the cached values from cookies and/or local storage + * @param {Number} clientId + */ +function getLotameLocalCache() { + let clientId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; + let cache = { + data: getFromStorage(KEY_ID), + expiryTimestampMs: 0, + clientExpiryTimestampMs: 0 + }; + try { + if (clientId) { + const rawClientExpiry = getFromStorage(`${KEY_EXPIRY}_${clientId}`); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(rawClientExpiry)) { + cache.clientExpiryTimestampMs = parseInt(rawClientExpiry, 10); + } + } + const rawExpiry = getFromStorage(KEY_EXPIRY); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(rawExpiry)) { + cache.expiryTimestampMs = parseInt(rawExpiry, 10); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + return cache; +} + +/** + * Clear a cached value from cookies and local storage + * @param {String} key + */ +function clearLotameCache(key) { + if (key) { + if (cookiesAreEnabled(DO_NOT_HONOR_CONFIG)) { + let expirationDate = new Date(0).toUTCString(); + storage.setCookie(key, '', expirationDate, 'Lax', cookieDomain, undefined); + } + if (localStorageIsEnabled(DO_NOT_HONOR_CONFIG)) { + storage.removeDataFromLocalStorage(key, undefined); + } + } +} +/** + * @param {boolean} honorConfig - false to override for reading or deleting old cookies + * @returns {boolean} for whether we can write the cookie + */ +function cookiesAreEnabled() { + let honorConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + if (honorConfig) { + return storage.cookiesAreEnabled() && appliedConfig.storage.type.includes('cookie'); + } + return storage.cookiesAreEnabled(); +} +/** + * @param {boolean} honorConfig - false to override for reading or deleting old stored items + * @returns {boolean} for whether we can write the cookie + */ +function localStorageIsEnabled() { + let honorConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + if (honorConfig) { + return storage.hasLocalStorage() && appliedConfig.storage.type.includes('html5'); + } + return storage.hasLocalStorage(); +} +/** + * @param {SubmoduleConfig} config + * @returns {null|string} - string error if it finds one, null otherwise. + */ +function checkConfigHasErrorsAndReport(config) { + let error = null; + if (typeof config.storage !== 'undefined') { + Object.assign(appliedConfig.storage, appliedConfig.storage, config.storage); + const READABLE_MODULE_NAME = 'Lotame ID module'; + const PERMITTED_STORAGE_TYPES = ['cookie', 'html5', 'cookie&html5']; + if (typeof config.storage.name !== 'undefined' && config.storage.name !== KEY_ID) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Misconfigured ${READABLE_MODULE_NAME}, "storage.name" is expected to be "${KEY_ID}", actual is "${config.storage.name}"`); + error = true; + } else if (config.storage.type !== 'undefined' && !PERMITTED_STORAGE_TYPES.includes(config.storage.type)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Misconfigured ${READABLE_MODULE_NAME}, "storage.type" is expected to be one of "${PERMITTED_STORAGE_TYPES.join(', ')}", actual is "${config.storage.type}"`); + } + } + return error; +} +/** @type {Submodule} */ +const lotamePanoramaIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Vendor id of Lotame + * @type {Number} + */ + gvlid: GVLID, + /** + * Decode the stored id value for passing to bid requests + * @function decode + * @param {(Object|string)} value + * @param {SubmoduleConfig|undefined} config + * @returns {(Object|undefined)} + */ + decode(value, config) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(value) ? { + lotamePanoramaId: value + } : undefined; + }, + /** + * Retrieve the Lotame Panorama Id + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @param {(Object|undefined)} cacheIdObj + * @returns {IdResponse|undefined} + */ + getId(config, consentData, cacheIdObj) { + if (checkConfigHasErrorsAndReport(config)) { + return; + } + cookieDomain = lotamePanoramaIdSubmodule.findRootDomain(); + const configParams = config && config.params || {}; + const clientId = configParams.clientId; + const hasCustomClientId = !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(clientId); + const localCache = getLotameLocalCache(clientId); + const hasExpiredPanoId = Date.now() > localCache.expiryTimestampMs; + if (hasCustomClientId) { + const hasFreshClientNoConsent = Date.now() < localCache.clientExpiryTimestampMs; + if (hasFreshClientNoConsent) { + // There is no consent + return { + id: undefined, + reason: 'NO_CLIENT_CONSENT' + }; + } + } + if (!hasExpiredPanoId) { + return { + id: localCache.data + }; + } + const storedUserId = getProfileId(); + const getRequestHost = function () { + if (navigator.userAgent && navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) { + return ID_HOST_COOKIELESS; + } + return ID_HOST; + }; + const resolveIdFunction = function (callback) { + let queryParams = {}; + if (storedUserId) { + queryParams.fp = storedUserId; + } + let consentString; + if (consentData) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isBoolean)(consentData.gdpr?.gdprApplies)) { + queryParams.gdpr_applies = consentData.gdpr.gdprApplies; + } + consentString = consentData.gdpr?.consentString; + } + if (consentString) { + queryParams.gdpr_consent = consentString; + } + + // Add clientId to the url + if (hasCustomClientId) { + queryParams.c = clientId; + } + const url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + host: getRequestHost(), + pathname: '/id', + search: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(queryParams) ? undefined : queryParams + }); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, response => { + let coreId; + if (response) { + try { + let responseObj = JSON.parse(response); + const hasNoConsentErrors = !((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(responseObj.errors) && responseObj.errors.indexOf(MISSING_CORE_CONSENT) !== -1); + if (hasCustomClientId) { + if (hasNoConsentErrors) { + clearLotameCache(`${KEY_EXPIRY}_${clientId}`); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(responseObj.no_consent) && responseObj.no_consent === 'CLIENT') { + saveLotameCache(`${KEY_EXPIRY}_${clientId}`, responseObj.expiry_ts, responseObj.expiry_ts); + + // End Processing + callback(); + return; + } + } + saveLotameCache(KEY_EXPIRY, responseObj.expiry_ts, responseObj.expiry_ts); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(responseObj.profile_id)) { + if (hasNoConsentErrors) { + setProfileId(responseObj.profile_id); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(responseObj.core_id)) { + saveLotameCache(KEY_ID, responseObj.core_id, responseObj.expiry_ts); + coreId = responseObj.core_id; + } else { + clearLotameCache(KEY_ID); + } + } else { + if (hasNoConsentErrors) { + clearLotameCache(KEY_PROFILE); + } + clearLotameCache(KEY_ID); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + } + callback(coreId); + }, undefined, { + method: 'GET', + withCredentials: true + }); + }; + return { + callback: resolveIdFunction + }; + }, + eids: { + lotamePanoramaId: { + source: 'crwdcntrl.net', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', lotamePanoramaIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('lotamePanoramaIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lotamePanoramaIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["loyalBidAdapter"],{ + +/***/ "./modules/loyalBidAdapter.js": +/*!************************************!*\ + !*** ./modules/loyalBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'loyal'; +const AD_URL = 'https://us-east-1.loyal.app/pbjs'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('loyalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/loyalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["luceadBidAdapter"],{ + +/***/ "./modules/luceadBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/luceadBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + +/** + * @module modules/luceadBidAdapter + */ + + + + + +const gvlid = 1309; +const bidderCode = 'lucead'; +const defaultCurrency = 'EUR'; +const defaultTtl = 500; +const aliases = ['adliveplus']; +const defaultRegion = 'eu'; +const domain = 'lucead.com'; +let baseUrl = `https://${domain}`; +let staticUrl = `https://s.${domain}`; +let endpointUrl = baseUrl; +function isDevEnv() { + return location.hash.includes('prebid-dev'); +} +function isBidRequestValid(bidRequest) { + return !!bidRequest?.params?.placementId; +} +function buildRequests(bidRequests, bidderRequest) { + const region = bidRequests[0]?.params?.region || defaultRegion; + endpointUrl = `https://${region}.${domain}`; + if (isDevEnv()) { + baseUrl = location.origin; + staticUrl = baseUrl; + endpointUrl = `${baseUrl}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('buildRequests', { + bidRequests, + bidderRequest + }); + const companionData = { + base_url: baseUrl, + static_url: staticUrl, + endpoint_url: endpointUrl, + request_id: bidderRequest.bidderRequestId, + prebid_version: "9.45.0-pre", + bidRequests, + bidderRequest, + getUniqueIdentifierStr: _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getUniqueIdentifierStr, + ortbConverter: _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter, + deepSetValue: _src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset, + is_sra: true, + region + }; + window.lucead_prebid_data = companionData; + const fn = window.lucead_prebid; + if (fn && typeof fn === 'function') { + fn(companionData); + } + return { + method: 'POST', + url: `${endpointUrl}/go/prebid/sra`, + data: JSON.stringify({ + request_id: bidderRequest.bidderRequestId, + domain: location.hostname, + bid_requests: bidRequests.map(bidRequest => { + return { + bid_id: bidRequest.bidId, + sizes: bidRequest.sizes, + media_types: bidRequest.mediaTypes, + placement_id: bidRequest.params.placementId, + schain: bidRequest.schain + }; + }) + }), + options: { + contentType: 'text/plain', + withCredentials: false + } + }; +} +function interpretResponse(serverResponse, bidRequest) { + // @see required fields https://docs.prebid.org/dev-docs/bidder-adaptor.html + const response = serverResponse?.body; + const bidRequestData = JSON.parse(bidRequest?.data); + const bids = (response?.bids || []).map(bid => ({ + requestId: bid?.bid_id || '1', + // bid request id, the bid id + cpm: bid?.cpm || 0, + width: bid?.size && bid?.size?.width || 300, + height: bid?.size && bid?.size?.height || 250, + currency: bid?.currency || defaultCurrency, + ttl: bid?.ttl || defaultTtl, + creativeId: bid?.ssp ? `ssp:${bid.ssp}` : `${bid?.ad_id || 0}:${bid?.ig_id || 0}`, + netRevenue: bid?.net_revenue || true, + ad: bid?.ad || '', + meta: { + advertiserDomains: bid?.advertiser_domains || [] + } + })); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('interpretResponse', { + serverResponse, + bidRequest, + bidRequestData, + bids + }); + if (response?.enable_pa === false) { + return bids; + } + const fledgeAuctionConfigs = (response.bids || []).map(bid => ({ + bidId: bid?.bid_id, + config: { + seller: baseUrl, + decisionLogicUrl: `${baseUrl}/js/ssp.js`, + interestGroupBuyers: [baseUrl], + requestedSize: bid?.size, + auctionSignals: { + size: bid?.size + }, + perBuyerSignals: { + [baseUrl]: { + prebid_paapi: true, + prebid_bid_id: bid?.bid_id, + prebid_request_id: bidRequestData.request_id, + placement_id: bid.placement_id, + // floor, + is_sra: true, + endpoint_url: endpointUrl + } + } + } + })); + return { + bids, + paapi: fledgeAuctionConfigs + }; +} +function report(type, data) { + // noinspection JSCheckFunctionSignatures + return (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.fetch)(`${endpointUrl}/go/report/${type}`, { + body: JSON.stringify({ + ...data, + domain: location.hostname + }), + method: 'POST', + contentType: 'text/plain' + }); +} +function onBidWon(bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Bid won', bid); + let data = { + bid_id: bid?.bidId, + placement_id: bid.params ? bid?.params[0]?.placementId || '0' : '0', + spent: bid?.cpm, + currency: bid?.currency + }; + if (bid?.creativeId) { + const parts = bid.creativeId.toString().split(':'); + if (parts[0] === 'ssp') { + data.ssp = parts[1]; + } else { + data.ad_id = parts[0]; + data.ig_id = parts[1]; + } + } + return report('impression', data); +} +function onTimeout(timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Timeout from adapter', timeoutData); +} +const spec = { + code: bidderCode, + gvlid, + aliases, + isBidRequestValid, + buildRequests, + interpretResponse, + onBidWon, + onTimeout, + isDevEnv +}; + +// noinspection JSCheckFunctionSignatures +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('luceadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/luceadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["lunamediahbBidAdapter"],{ + +/***/ "./modules/lunamediahbBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/lunamediahbBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'lunamediahb'; +const AD_URL = 'https://balancer.lmgssp.com/?c=o&m=multi'; +const SYNC_URL = 'https://cookie.lmgssp.com'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['placementId']), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('lunamediahbBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/lunamediahbBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["luponmediaBidAdapter"],{ + +/***/ "./modules/luponmediaBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/luponmediaBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, hasValidSupplyChainParams, resetUserSync, masSizeOrdering */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'luponmedia'; +const ENDPOINT_URL = 'https://rtb.adxpremium.services/openrtb2/auction'; +const DIGITRUST_PROP_NAMES = { + PREBID_SERVER: { + id: 'id', + keyv: 'keyv' + } +}; +var sizeMap = { + 1: '468x60', + 2: '728x90', + 5: '120x90', + 7: '125x125', + 8: '120x600', + 9: '160x600', + 10: '300x600', + 13: '200x200', + 14: '250x250', + 15: '300x250', + 16: '336x280', + 17: '240x400', + 19: '300x100', + 31: '980x120', + 32: '250x360', + 33: '180x500', + 35: '980x150', + 37: '468x400', + 38: '930x180', + 39: '750x100', + 40: '750x200', + 41: '750x300', + 42: '2x4', + 43: '320x50', + 44: '300x50', + 48: '300x300', + 53: '1024x768', + 54: '300x1050', + 55: '970x90', + 57: '970x250', + 58: '1000x90', + 59: '320x80', + 60: '320x150', + 61: '1000x1000', + 64: '580x500', + 65: '640x480', + 66: '930x600', + 67: '320x480', + 68: '1800x1000', + 72: '320x320', + 73: '320x160', + 78: '980x240', + 79: '980x300', + 80: '980x400', + 83: '480x300', + 85: '300x120', + 90: '548x150', + 94: '970x310', + 95: '970x100', + 96: '970x210', + 101: '480x320', + 102: '768x1024', + 103: '480x280', + 105: '250x800', + 108: '320x240', + 113: '1000x300', + 117: '320x100', + 125: '800x250', + 126: '200x600', + 144: '980x600', + 145: '980x150', + 152: '1000x250', + 156: '640x320', + 159: '320x250', + 179: '250x600', + 195: '600x300', + 198: '640x360', + 199: '640x200', + 213: '1030x590', + 214: '980x360', + 221: '1x1', + 229: '320x180', + 230: '2000x1400', + 232: '580x400', + 234: '6x6', + 251: '2x2', + 256: '480x820', + 257: '400x600', + 258: '500x200', + 259: '998x200', + 264: '970x1000', + 265: '1920x1080', + 274: '1800x200', + 278: '320x500', + 282: '320x400', + 288: '640x380', + 548: '500x1000', + 550: '980x480', + 552: '300x200', + 558: '640x640' +}; +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(sizeMap, (item, key) => sizeMap[item] = key); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.siteId && bid.params.keyId); // TODO: check for siteId and keyId + }, + buildRequests: function (bidRequests, bidderRequest) { + const bRequest = { + method: 'POST', + url: ENDPOINT_URL, + data: null, + options: {}, + bidderRequest + }; + let currentImps = []; + for (let i = 0, len = bidRequests.length; i < len; i++) { + let newReq = newOrtbBidRequest(bidRequests[i], bidderRequest, currentImps); + currentImps = newReq.imp; + bRequest.data = JSON.stringify(newReq); + } + return bRequest; + }, + interpretResponse: (response, request) => { + const bidResponses = []; + var respCur = 'USD'; + let parsedRequest = JSON.parse(request.data); + let parsedReferrer = parsedRequest.site && parsedRequest.site.ref ? parsedRequest.site.ref : ''; + try { + if (response.body && response.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(response.body.seatbid)) { + // Supporting multiple bid responses for same adSize + respCur = response.body.cur || respCur; + response.body.seatbid.forEach(seatbidder => { + seatbidder.bid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(seatbidder.bid) && seatbidder.bid.forEach(bid => { + let newBid = { + requestId: bid.impid, + cpm: (parseFloat(bid.price) || 0).toFixed(2), + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.id, + dealId: bid.dealid, + currency: respCur, + netRevenue: false, + ttl: 300, + referrer: parsedReferrer, + ad: bid.adm, + adomain: bid.adomain || [], + meta: { + advertiserDomains: bid && bid.adomain ? bid.adomain : [] + } + }; + bidResponses.push(newBid); + }); + }); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(error); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) { + let allUserSyncs = []; + if (!hasSynced && (syncOptions.iframeEnabled || syncOptions.pixelEnabled)) { + responses.forEach(csResp => { + if (csResp.body && csResp.body.ext && csResp.body.ext.usersyncs) { + try { + let response = csResp.body.ext.usersyncs; + let bidders = response.bidder_status; + for (let synci in bidders) { + let thisSync = bidders[synci]; + if (thisSync.no_cookie) { + let url = thisSync.usersync.url; + let type = thisSync.usersync.type; + if (!url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`No sync url for bidder luponmedia.`); + } else if ((type === 'image' || type === 'redirect') && syncOptions.pixelEnabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(`Invoking image pixel user sync for luponmedia`); + allUserSyncs.push({ + type: 'image', + url: url + }); + } else if (type == 'iframe' && syncOptions.iframeEnabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(`Invoking iframe user sync for luponmedia`); + allUserSyncs.push({ + type: 'iframe', + url: url + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`User sync type "${type}" not supported for luponmedia`); + } + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e); + } + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Luponmedia: Please enable iframe/pixel based user sync.'); + } + hasSynced = true; + return allUserSyncs; + } +}; +function hasValidSupplyChainParams(schain) { + let isValid = false; + const requiredFields = ['asi', 'sid', 'hp']; + if (!schain.nodes) return isValid; + isValid = schain.nodes.reduce((status, node) => { + if (!status) return status; + return requiredFields.every(field => node[field]); + }, true); + if (!isValid) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('LuponMedia: required schain params missing'); + return isValid; +} +var hasSynced = false; +function resetUserSync() { + hasSynced = false; +} +function masSizeOrdering(sizes) { + const MAS_SIZE_PRIORITY = [15, 2, 9]; + return sizes.sort((first, second) => { + // sort by MAS_SIZE_PRIORITY priority order + const firstPriority = MAS_SIZE_PRIORITY.indexOf(first); + const secondPriority = MAS_SIZE_PRIORITY.indexOf(second); + if (firstPriority > -1 || secondPriority > -1) { + if (firstPriority === -1) { + return 1; + } + if (secondPriority === -1) { + return -1; + } + return firstPriority - secondPriority; + } + + // and finally ascending order + return first - second; + }); +} +function newOrtbBidRequest(bidRequest, bidderRequest, currentImps) { + bidRequest.startTime = new Date().getTime(); + const bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner'); + let bannerSizes = []; + if (bannerParams && bannerParams.sizes) { + // get banner sizes in form [{ w: , h: }, ...] + const format = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.sizesToSizeTuples)(bannerParams.sizes).map(_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.sizeTupleToRtbSize); + bannerSizes = format; + } + const data = { + id: bidderRequest.bidderRequestId, + test: _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('debug') ? 1 : 0, + source: { + tid: bidderRequest.ortb2?.source?.tid + }, + tmax: bidderRequest.timeout, + imp: currentImps.concat([{ + id: bidRequest.bidId, + secure: 1, + ext: { + [bidRequest.bidder]: bidRequest.params + }, + banner: { + format: bannerSizes + } + }]), + ext: { + prebid: { + targeting: { + includewinners: true, + // includebidderkeys always false for openrtb + includebidderkeys: false + } + } + }, + user: {} + }; + let bidFloor; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bidRequest.getFloor) && !_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('disableFloors')) { + let floorInfo; + try { + floorInfo = bidRequest.getFloor({ + currency: 'USD', + mediaType: 'video', + size: parseSizes(bidRequest, 'video') + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('LuponMedia: getFloor threw an error: ', e); + } + bidFloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? parseFloat(floorInfo.floor) : undefined; + } else { + bidFloor = parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.floor')); + } + if (!isNaN(bidFloor)) { + data.imp[0].bidfloor = bidFloor; + } + appendSiteAppDevice(data, bidRequest, bidderRequest); + const digiTrust = _getDigiTrustQueryParams(bidRequest, 'PREBID_SERVER'); + if (digiTrust) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.digitrust', digiTrust); + } + if (bidderRequest.gdprConsent) { + // note - gdprApplies & consentString may be undefined in certain use-cases for consentManagement module + let gdprApplies; + if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { + gdprApplies = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.ext.gdpr', gdprApplies); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + + // Set user uuid + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.id', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)()); + + // set crumbs + if (bidRequest.crumbs && bidRequest.crumbs.pubcid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.buyeruid', bidRequest.crumbs.pubcid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.buyeruid', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)()); + } + if (bidRequest.userId && typeof bidRequest.userId === 'object' && (bidRequest.userId.tdid || bidRequest.userId.pubcid || bidRequest.userId.lipb || bidRequest.userId.idl_env)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'user.ext.eids', []); + if (bidRequest.userId.tdid) { + data.user.ext.eids.push({ + source: 'adserver.org', + uids: [{ + id: bidRequest.userId.tdid, + ext: { + rtiPartner: 'TDID' + } + }] + }); + } + if (bidRequest.userId.pubcid) { + data.user.ext.eids.push({ + source: 'pubcommon', + uids: [{ + id: bidRequest.userId.pubcid + }] + }); + } + + // support liveintent ID + if (bidRequest.userId.lipb && bidRequest.userId.lipb.lipbid) { + data.user.ext.eids.push({ + source: 'liveintent.com', + uids: [{ + id: bidRequest.userId.lipb.lipbid + }] + }); + data.user.ext.tpid = { + source: 'liveintent.com', + uid: bidRequest.userId.lipb.lipbid + }; + if (Array.isArray(bidRequest.userId.lipb.segments) && bidRequest.userId.lipb.segments.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'rp.target.LIseg', bidRequest.userId.lipb.segments); + } + } + + // support identityLink (aka LiveRamp) + if (bidRequest.userId.idl_env) { + data.user.ext.eids.push({ + source: 'liveramp.com', + uids: [{ + id: bidRequest.userId.idl_env + }] + }); + } + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'regs.coppa', 1); + } + if (bidRequest.schain && hasValidSupplyChainParams(bidRequest.schain)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'source.ext.schain', bidRequest.schain); + } + + // TODO: getConfig('fpd.context') should not have worked even with legacy FPD support - 'fpd' gets translated + // into 'ortb2' by `setConfig` + // Unclear what the intent was here - maybe `const {context: siteData, user: userData} = getLegacyFpd(config.getConfig('ortb2'))` ? + // (with PB7 `config.getConfig('ortb2')` should be replaced by `bidderRequest.ortb2`) + const siteData = Object.assign({}, bidRequest.params.inventory, _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('fpd.context')); + const userData = Object.assign({}, bidRequest.params.visitor, _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('fpd.user')); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(siteData) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(userData)) { + const bidderData = { + bidders: [bidderRequest.bidderCode], + config: { + fpd: {} + } + }; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(siteData)) { + bidderData.config.fpd.site = siteData; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(userData)) { + bidderData.config.fpd.user = userData; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data, 'ext.prebid.bidderconfig.0', bidderData); + } + const pbAdSlot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.data.pbadslot'); + if (typeof pbAdSlot === 'string' && pbAdSlot) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(data.imp[0].ext, 'context.data.adslot', pbAdSlot); + } + return data; +} +function _getDigiTrustQueryParams() { + let bidRequest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let endpointName = arguments.length > 1 ? arguments[1] : undefined; + if (!endpointName || !DIGITRUST_PROP_NAMES[endpointName]) { + return null; + } + const propNames = DIGITRUST_PROP_NAMES[endpointName]; + function getDigiTrustId() { + const bidRequestDigitrust = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.digitrustid.data'); + if (bidRequestDigitrust) { + return bidRequestDigitrust; + } + let digiTrustUser = window.DigiTrust && (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('digiTrustId') || window.DigiTrust.getUser({ + member: 'T9QSFKPDN9' + })); + return digiTrustUser && digiTrustUser.success && digiTrustUser.identity || null; + } + let digiTrustId = getDigiTrustId(); + // Verify there is an ID and this user has not opted out + if (!digiTrustId || digiTrustId.privacy && digiTrustId.privacy.optout) { + return null; + } + const digiTrustQueryParams = { + [propNames.id]: digiTrustId.id, + [propNames.keyv]: digiTrustId.keyv + }; + if (propNames.pref) { + digiTrustQueryParams[propNames.pref] = 0; + } + return digiTrustQueryParams; +} +function _getPageUrl(bidRequest, bidderRequest) { + // TODO: do the fallbacks make sense here? + let pageUrl = bidderRequest.refererInfo.page; + if (bidRequest.params.referrer) { + pageUrl = bidRequest.params.referrer; + } else if (!pageUrl) { + pageUrl = bidderRequest.refererInfo.topmostLocation; + } + return bidRequest.params.secure ? pageUrl.replace(/^http:/i, 'https:') : pageUrl; +} +function appendSiteAppDevice(data, bidRequest, bidderRequest) { + if (!data) return; + + // ORTB specifies app OR site + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('app') === 'object') { + data.app = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('app'); + } else { + data.site = { + page: _getPageUrl(bidRequest, bidderRequest) + }; + } + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('device') === 'object') { + data.device = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('device'); + } +} + +/** + * @param sizes + * @returns {*} + */ +function mapSizes(sizes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(sizes) + // map sizes while excluding non-matches + .reduce((result, size) => { + let mappedSize = parseInt(sizeMap[size], 10); + if (mappedSize) { + result.push(mappedSize); + } + return result; + }, []); +} +function parseSizes(bid, mediaType) { + let params = bid.params; + if (mediaType === 'video') { + let size = []; + if (params.video && params.video.playerWidth && params.video.playerHeight) { + size = [params.video.playerWidth, params.video.playerHeight]; + } else if (Array.isArray((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.playerSize')) && bid.mediaTypes.video.playerSize.length === 1) { + size = bid.mediaTypes.video.playerSize[0]; + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0 && Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1) { + size = bid.sizes[0]; + } + return size; + } + + // Deprecated: temp legacy support + let sizes = []; + if (Array.isArray(params.sizes)) { + sizes = params.sizes; + } else if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes') !== 'undefined') { + sizes = mapSizes(bid.mediaTypes.banner.sizes); + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) { + sizes = mapSizes(bid.sizes); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('LuponMedia: no sizes are setup or found'); + } + return masSizeOrdering(sizes); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('luponmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/luponmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mabidderBidAdapter"],{ + +/***/ "./modules/mabidderBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/mabidderBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports baseUrl, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + +const BIDDER_CODE = 'mabidder'; +const baseUrl = 'https://prebid.ecdrsvc.com/bid'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({}); +const spec = { + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + if (typeof bid.params === 'undefined') { + return false; + } + return !!(bid.params.ppid && bid.sizes && Array.isArray(bid.sizes) && Array.isArray(bid.sizes[0])); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const fpd = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest: bidderRequest + }); + const bids = []; + validBidRequests.forEach(bidRequest => { + const sizes = []; + bidRequest.sizes.forEach(size => { + sizes.push({ + width: size[0], + height: size[1] + }); + }); + bids.push({ + bidId: bidRequest.bidId, + sizes: sizes, + ppid: bidRequest.params.ppid, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER + }); + }); + const req = { + url: baseUrl, + method: 'POST', + data: { + v: 'v' + "9.45.0-pre", + bids: bids, + url: bidderRequest.refererInfo.page || '', + referer: bidderRequest.refererInfo.ref || '', + fpd: fpd || {} + } + }; + return req; + }, + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + if (serverResponse.body) { + const body = serverResponse.body; + if (!body || typeof body !== 'object' || !body.Responses || !(body.Responses.length > 0)) { + return []; + } + body.Responses.forEach(bidResponse => { + bidResponses.push(bidResponse); + }); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('mabidderBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mabidderBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["madsenseBidAdapter"],{ + +/***/ "./modules/madsenseBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/madsenseBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + +const BIDDER_CODE = 'madsense'; +const DEFAULT_BID_TTL = 55; +const DEFAULT_NET_REVENUE = true; +const DEFAULT_CURRENCY = 'USD'; +const MS_EXCHANGE_BASE_URL = 'https://ads.madsense.io/pbjs'; +const buildImpWithDefaults = (buildImp, bidRequest, context) => { + const imp = buildImp(bidRequest, context); + imp.bidfloor = imp.bidfloor || bidRequest.params.bidfloor || 0; + imp.bidfloorcur = imp.bidfloorcur || bidRequest.params.currency || DEFAULT_CURRENCY; + return imp; +}; +const enrichRequestWithConsent = (req, bidderRequest) => { + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } +}; +const determineMediaType = bid => { + if (bid.mtype === 2) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } + if (bid.mtype === 1) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Unrecognized media type, defaulting to BANNER (madSense)'); + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL + }, + imp: (buildImp, bidRequest, context) => buildImpWithDefaults(buildImp, bidRequest, context), + request: (buildRequest, imps, bidderRequest, context) => { + const req = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(req, { + ext: { + hb: 1, + prebidver: "9.45.0-pre", + adapterver: '1.0.0' + } + }); + enrichRequestWithConsent(req, bidderRequest); + return req; + }, + bidResponse: (buildBidResponse, bid, context) => { + const resMediaType = determineMediaType(bid); + Object.assign(context, { + mediaType: resMediaType, + currency: DEFAULT_CURRENCY, + ...(resMediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO && { + vastXml: bid.adm + }) + }); + return buildBidResponse(bid, context); + } +}); +const spec = { + code: BIDDER_CODE, + VERSION: '1.0.0', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + ENDPOINT: MS_EXCHANGE_BASE_URL, + isBidRequestValid: function (bid) { + return validateBidRequest(bid); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const contextMediaType = determineMediaType(validBidRequests[0]); + const data = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest, + context: { + contextMediaType + } + }); + const companyId = getCompanyId(validBidRequests); + const madsenseExchangeEndpointUrl = buildEndpointUrl(companyId); + return { + method: 'POST', + url: madsenseExchangeEndpointUrl, + data: data + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + const bids = parseServerResponse(serverResponse, bidRequest); + return filterValidBids(bids); + } +}; +function validateBidRequest(bid) { + return _validateParams(bid) && _validateBanner(bid) && _validateVideo(bid); +} +function getCompanyId(validBidRequests) { + let companyId = validBidRequests[0].params.company_id; + if (validBidRequests[0].params.test) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('madsense: test mode'); + companyId = 'test'; + } + return companyId; +} +function buildEndpointUrl(companyId) { + return `${spec.ENDPOINT}?company_id=${companyId}`; +} +function parseServerResponse(serverResponse, bidRequest) { + return converter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; +} +function filterValidBids(bids) { + return bids.map(bid => { + if (bid.mtype === 2 && bid.adm) { + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('cache.url')) { + bid.vastXml = bid.adm; + delete bid.adm; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Prebid Cache is not configured (madSense)'); + return null; + } + } + return bid; + }).filter(bid => bid !== null); +} +function hasBannerMediaType(bidRequest) { + return !!bidRequest.mediaTypes?.banner; +} +function hasVideoMediaType(bidRequest) { + return !!bidRequest.mediaTypes?.video; +} +function _validateParams(bidRequest) { + if (!bidRequest.params) { + return false; + } + if (bidRequest.params.test) { + return true; + } + if (!bidRequest.params.company_id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('company_id not declared (madSense)'); + return false; + } + const mediaTypesExists = hasVideoMediaType(bidRequest) || hasBannerMediaType(bidRequest); + if (!mediaTypesExists) { + return false; + } + return true; +} +function _validateBanner(bidRequest) { + if (!hasBannerMediaType(bidRequest)) { + return true; + } + const bannerSizes = bidRequest.mediaTypes?.banner?.sizes; + if (!Array.isArray(bannerSizes)) { + return false; + } + return true; +} +function _validateVideo(bidRequest) { + if (!hasVideoMediaType(bidRequest)) { + return true; + } + const videoPlacement = bidRequest.mediaTypes?.video || {}; + const videoBidderParams = bidRequest.params?.video || {}; + const params = bidRequest.params || {}; + if (params && params.test) { + return true; + } + const videoParams = { + ...videoPlacement, + ...videoBidderParams + }; + if (!Array.isArray(videoParams.mimes) || videoParams.mimes.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Invalid MIME types (madSense)'); + return false; + } + if (!Array.isArray(videoParams.protocols) || videoParams.protocols.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Invalid protocols (madSense)'); + return false; + } + if (!videoParams.context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Context not declared (madSense)'); + return false; + } + if (videoParams.context !== 'instream') { + if (hasBannerMediaType(bidRequest)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Context is not instream, preferring banner (madSense)'); + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Only instream context is supported (madSense)'); + } + } + if (typeof videoParams.playerSize === 'undefined' || !Array.isArray(videoParams.playerSize) || !Array.isArray(videoParams.playerSize[0])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Player size not declared or not in [[w,h]] format'); + return false; + } + return true; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('madsenseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/madsenseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["madvertiseBidAdapter"],{ + +/***/ "./modules/madvertiseBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/madvertiseBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +// use protocol relative urls for http or https +const MADVERTISE_ENDPOINT = 'https://mobile.mng-ads.com/'; +const spec = { + code: 'madvertise', + /** + * @param {object} bid + * @return boolean + */ + isBidRequestValid: function (bid) { + if (typeof bid.params !== 'object') { + return false; + } + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(bid.sizes); + if (!sizes || sizes.length === 0) { + return false; + } + if (sizes.length > 0 && sizes[0] === undefined) { + return false; + } + return typeof bid.params.s != 'undefined'; + }, + /** + * @param {BidRequest[]} bidRequests + * @param bidderRequest + * @return ServerRequest[] + */ + buildRequests: function (bidRequests, bidderRequest) { + return bidRequests.map(bidRequest => { + bidRequest.startTime = new Date().getTime(); + + // non-video request builder + var src = '?rt=bid_request&v=1.0'; + for (var i = 0; i < bidRequest.sizes.length; i++) { + if (Array.isArray(bidRequest.sizes[i]) && bidRequest.sizes[i].length == 2) { + src = src + '&sizes[' + i + ']=' + bidRequest.sizes[i][0] + 'x' + bidRequest.sizes[i][1]; + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(bidRequest.params, (item, key) => src = src + '&' + key + '=' + item); + if (typeof bidRequest.params.u == 'undefined') { + src = src + '&u=' + navigator.userAgent; + } + if (bidderRequest && bidderRequest.gdprConsent) { + src = src + '&gdpr=' + (bidderRequest.gdprConsent.gdprApplies ? '1' : '0') + '&consent[0][format]=iab&consent[0][value]=' + bidderRequest.gdprConsent.consentString; + } + return { + method: 'GET', + url: MADVERTISE_ENDPOINT + src, + options: { + withCredentials: false + }, + bidId: bidRequest.bidId + }; + }); + }, + /** + * @param {*} responseObj + * @param {BidRequest} bidRequest + * @return {Bid[]} An array of bids which + */ + interpretResponse: function (responseObj, bidRequest) { + responseObj = responseObj.body; + // check overall response + if (responseObj == null || typeof responseObj !== 'object' || !responseObj.hasOwnProperty('ad')) { + return []; + } + let bid = { + requestId: bidRequest.bidId, + cpm: responseObj.cpm, + width: responseObj.Width, + height: responseObj.height, + ad: responseObj.ad, + ttl: responseObj.ttl, + creativeId: responseObj.creativeId, + netRevenue: responseObj.netRevenue, + currency: responseObj.currency, + dealId: responseObj.dealId, + meta: { + advertiserDomains: Array.isArray(responseObj.adomain) ? responseObj.adomain : [] + } + }; + return [bid]; + }, + getUserSyncs: function (syncOptions) {} +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('madvertiseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/madvertiseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["magniteAnalyticsAdapter"],{ + +/***/ "./modules/magniteAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/magniteAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, rubiConf, parseBidResponse, getHostNameFromReferer, detectBrowserFromUa, callPrebidCacheHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + + + + + + + + + + + +const RUBICON_GVL_ID = 52; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: 'magnite' +}); +const COOKIE_NAME = 'mgniSession'; +const LAST_SEEN_EXPIRE_TIME = 1800000; // 30 mins +const END_EXPIRE_TIME = 21600000; // 6 hours +const MODULE_NAME = 'Magnite Analytics'; +const BID_REJECTED_IPF = 'rejected-ipf'; +const DEFAULT_INTEGRATION = 'pbjs'; + +// List of known rubicon aliases +// This gets updated on auction init to account for any custom aliases present +let rubiconAliases = ['rubicon']; +const pbsErrorMap = { + 1: 'timeout-error', + 2: 'input-error', + 3: 'connect-error', + 4: 'request-error', + 999: 'generic-error' +}; +let browser; +let pageReferer; +let auctionIndex = 0; // count of auctions on page +let accountId; +let endpoint; +let cookieless; +let prebidGlobal = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)(); +const { + AUCTION_INIT, + AUCTION_END, + BID_REQUESTED, + BID_RESPONSE, + BIDDER_DONE, + BID_TIMEOUT, + BID_WON, + BILLABLE_EVENT, + PBS_ANALYTICS, + BID_REJECTED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS; + +// The saved state of rubicon specific setConfig controls +let rubiConf; +// Saving state of all our data we want +let cache; +const resetConfs = () => { + cache = { + auctions: {}, + auctionOrder: [], + timeouts: {}, + billing: {}, + pendingEvents: {}, + eventPending: false, + elementIdMap: {}, + sessionData: {}, + bidsCachedClientSide: new WeakSet() + }; + rubiConf = { + pvid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)().slice(0, 8), + analyticsEventDelay: 500, + analyticsBatchTimeout: 5000, + analyticsProcessDelay: 1, + dmBilling: { + enabled: false, + vendors: [], + waitForAuction: true + } + }; +}; +resetConfs(); +_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('rubicon', config => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(rubiConf, config.rubicon); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(config, 'rubicon.updatePageView') === true) { + rubiConf.pvid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)().slice(0, 8); + } +}); + +// pbs confs +let serverConfig; +_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('s2sConfig', _ref => { + let { + s2sConfig + } = _ref; + serverConfig = s2sConfig; +}); +const adUnitIsOnlyInstream = adUnit => { + return adUnit.mediaTypes && Object.keys(adUnit.mediaTypes).length === 1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, 'mediaTypes.video.context') === 'instream'; +}; +const sendPendingEvents = () => { + cache.pendingEvents.trigger = `batched-${Object.keys(cache.pendingEvents).sort().join('-')}`; + sendEvent(cache.pendingEvents); + cache.pendingEvents = {}; + cache.eventPending = false; +}; +const addEventToQueue = (event, auctionId, eventName) => { + // If it's auction has not left yet, add it there + if (cache.auctions[auctionId] && !cache.auctions[auctionId].sent) { + cache.auctions[auctionId].pendingEvents = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(cache.auctions[auctionId].pendingEvents, event); + } else if (rubiConf.analyticsEventDelay > 0) { + // else if we are trying to batch stuff up, add it to pending events to be fired + cache.pendingEvents = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(cache.pendingEvents, event); + + // If no event is pending yet, start a timer for them to be sent and attempted to be gathered together + if (!cache.eventPending) { + setTimeout(sendPendingEvents, rubiConf.analyticsEventDelay); + cache.eventPending = true; + } + } else { + // else - send it solo + event.trigger = `solo-${eventName}`; + sendEvent(event); + } +}; +const sendEvent = payload => { + const event = { + ...getTopLevelDetails(), + ...payload + }; + if (window.pbjs?.rp?.eventDispatcher) { + const analyticsEvent = new CustomEvent('beforeSendingMagniteAnalytics', { + detail: event + }); + window.pbjs.rp.eventDispatcher.dispatchEvent(analyticsEvent); + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_7__.ajax)(endpoint, null, JSON.stringify(event), { + contentType: 'application/json' + }); +}; +const sendAuctionEvent = (auctionId, trigger) => { + let auctionCache = cache.auctions[auctionId]; + const auctionEvent = formatAuction(auctionCache.auction); + auctionCache.sent = true; + sendEvent({ + auctions: [auctionEvent], + ...(auctionCache.pendingEvents || {}), + // if any pending events were attached + trigger + }); +}; +const formatAuction = auction => { + const auctionEvent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(auction); + auctionEvent.samplingFactor = 1; + + // We stored adUnits and bids as objects for quick lookups, now they are mapped into arrays for PBA + auctionEvent.adUnits = Object.entries(auctionEvent.adUnits).map(_ref2 => { + let [tid, adUnit] = _ref2; + adUnit.bids = Object.entries(adUnit.bids).map(_ref3 => { + let [bidId, bid] = _ref3; + // determine adUnit.status from its bid statuses. Use priority below to determine, higher index is better + let statusPriority = ['error', 'no-bid', 'success']; + if (statusPriority.indexOf(bid.status) > statusPriority.indexOf(adUnit.status)) { + adUnit.status = bid.status; + } + + // If PBS told us to overwrite the bid ID, do so + if (bid.pbsBidId) { + bid.oldBidId = bid.bidId; + bid.bidId = bid.pbsBidId; + delete bid.pbsBidId; + } + return bid; + }); + return adUnit; + }); + return auctionEvent; +}; +const isBillingEventValid = event => { + // vendor is whitelisted + const isWhitelistedVendor = rubiConf.dmBilling.vendors.includes(event.vendor); + // event is not duplicated + const isNotDuplicate = typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache.billing, `${event.vendor}.${event.billingId}`) !== 'boolean'; + // billingId is defined and a string + return typeof event.billingId === 'string' && isWhitelistedVendor && isNotDuplicate; +}; +const formatBillingEvent = event => { + let billingEvent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(event); + // Pass along type if is string and not empty else general + billingEvent.type = typeof event.type === 'string' && event.type || 'general'; + billingEvent.accountId = accountId; + // mark as sent + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(cache.billing, `${event.vendor}.${event.billingId}`, true); + return billingEvent; +}; +const getBidPrice = bid => { + // get the cpm from bidResponse + let cpm; + let currency; + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'floorData.cpmAfterAdjustments') === 'number') { + // if bid was rejected and bid.floorData.cpmAfterAdjustments use it + cpm = bid.floorData.cpmAfterAdjustments; + currency = bid.floorData.floorCurrency; + } else if (typeof bid.currency === 'string' && bid.currency.toUpperCase() === 'USD') { + // bid is in USD use it + return Number(bid.cpm); + } else { + // else grab cpm + cpm = bid.cpm; + currency = bid.currency; + } + // if after this it is still going and is USD then return it. + if (currency === 'USD') { + return Number(cpm); + } + // otherwise we convert and return + try { + return Number(prebidGlobal.convertCurrency(cpm, currency, 'USD')); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${MODULE_NAME}: Could not determine the bidPriceUSD of the bid `, bid); + bid.conversionError = true; + bid.ogCurrency = currency; + bid.ogPrice = cpm; + return 0; + } +}; +const parseBidResponse = (bid, previousBidResponse) => { + // The current bidResponse for this matching requestId/bidRequestId + let responsePrice = getBidPrice(bid); + // we need to compare it with the previous one (if there was one) log highest only + // THIS WILL CHANGE WITH ALLOWING MULTIBID BETTER + if (previousBidResponse && previousBidResponse.bidPriceUSD > responsePrice) { + return previousBidResponse; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(bid, ['bidPriceUSD', () => responsePrice, 'dealId', dealId => dealId || undefined, 'mediaType', () => bid?.meta?.mediaType ?? bid.mediaType, 'ogMediaType', () => bid?.meta?.mediaType && bid.mediaType !== bid?.meta?.mediaType ? bid.mediaType : undefined, 'dimensions', () => { + const width = bid.width || bid.playerWidth; + const height = bid.height || bid.playerHeight; + return width && height ? { + width, + height + } : undefined; + }, 'floorValue', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'floorData.floorValue'), 'floorRuleValue', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'floorData.floorRuleValue'), 'floorRule', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.debugTurnedOn)() ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'floorData.floorRule') : undefined, 'adomains', () => { + const adomains = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'meta.advertiserDomains'); + const validAdomains = Array.isArray(adomains) && adomains.filter(domain => typeof domain === 'string'); + return validAdomains && validAdomains.length > 0 ? validAdomains.slice(0, 10) : undefined; + }, 'networkId', () => { + const networkId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'meta.networkId'); + // if not a valid after this, set to undefined so it gets filtered out + return networkId && networkId.toString() || undefined; + }, 'conversionError', conversionError => conversionError === true || undefined, + // only pass if exactly true + 'ogCurrency', 'ogPrice', 'rejectionReason']); +}; +const addFloorData = floorData => { + if (floorData.location === 'noData') { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(floorData, ['location', 'fetchStatus', 'floorProvider as provider']); + } else { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(floorData, ['location', 'modelVersion as modelName', 'modelWeight', 'modelTimestamp', 'skipped', 'enforcement', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(floorData, 'enforcements.enforceJS'), 'dealsEnforced', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(floorData, 'enforcements.floorDeals'), 'skipRate', 'fetchStatus', 'floorMin', 'floorProvider as provider']); + } +}; +const getTopLevelDetails = () => { + let payload = { + channel: 'web', + integration: rubiConf.int_type || DEFAULT_INTEGRATION, + referrerUri: pageReferer, + version: "9.45.0-pre", + referrerHostname: magniteAdapter.referrerHostname || getHostNameFromReferer(pageReferer), + timestamps: { + timeSincePageLoad: performance.now(), + eventTime: Date.now(), + prebidLoaded: magniteAdapter.MODULE_INITIALIZED_TIME + } + }; + if (browser) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(payload, rubiConf.pbaBrowserLocation || 'client.browser', browser); + } + + // Add DM wrapper details + if (rubiConf.wrapperName) { + let rule = rubiConf.rule_name; + if (cookieless) { + rule = rule ? rule.concat('_cookieless') : 'cookieless'; + } + payload.wrapper = { + name: rubiConf.wrapperName, + family: rubiConf.wrapperFamily, + rule + }; + } + if (cache.sessionData) { + // gather session info + payload.session = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(cache.sessionData, ['id', 'pvid', 'start', 'expires']); + // Any FPKVS set? + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(cache.sessionData.fpkvs)) { + payload.fpkvs = Object.keys(cache.sessionData.fpkvs).map(key => { + return { + key, + value: cache.sessionData.fpkvs[key] + }; + }); + } + } + return payload; +}; +const getHostNameFromReferer = referer => { + try { + magniteAdapter.referrerHostname = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseUrl)(referer, { + noDecodeWholeURL: true + }).hostname; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${MODULE_NAME}: Unable to parse hostname from supplied url: `, referer, e); + magniteAdapter.referrerHostname = ''; + } + return magniteAdapter.referrerHostname; +}; +const getRpaCookie = () => { + let encodedCookie = storage.getDataFromLocalStorage(COOKIE_NAME); + if (encodedCookie) { + try { + return JSON.parse(window.atob(encodedCookie)); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${MODULE_NAME}: Unable to decode ${COOKIE_NAME} value: `, e); + } + } + return {}; +}; +const setRpaCookie = decodedCookie => { + try { + storage.setDataInLocalStorage(COOKIE_NAME, window.btoa(JSON.stringify(decodedCookie))); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${MODULE_NAME}: Unable to encode ${COOKIE_NAME} value: `, e); + } +}; +const updateRpaCookie = () => { + const currentTime = Date.now(); + let decodedRpaCookie = getRpaCookie(); + if (!Object.keys(decodedRpaCookie).length || currentTime - decodedRpaCookie.lastSeen > LAST_SEEN_EXPIRE_TIME || decodedRpaCookie.expires < currentTime) { + decodedRpaCookie = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(), + start: currentTime, + expires: currentTime + END_EXPIRE_TIME // six hours later, + }; + } + // possible that decodedRpaCookie is undefined, and if it is, we probably are blocked by storage or some other exception + if (Object.keys(decodedRpaCookie).length) { + decodedRpaCookie.lastSeen = currentTime; + decodedRpaCookie.fpkvs = { + ...decodedRpaCookie.fpkvs, + ...getFpkvs() + }; + decodedRpaCookie.pvid = rubiConf.pvid; + setRpaCookie(decodedRpaCookie); + } + return decodedRpaCookie; +}; + +/* + Filters and converts URL Params into an object and returns only KVs that match the 'utm_KEY' format +*/ +const getUtmParams = () => { + let search; + try { + search = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseQS)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWindowLocation)().search); + } catch (e) { + search = {}; + } + return Object.keys(search).reduce((accum, param) => { + if (param.match(/utm_/)) { + accum[param.replace(/utm_/, '')] = search[param]; + } + return accum; + }, {}); +}; +const getFpkvs = () => { + rubiConf.fpkvs = Object.assign(rubiConf.fpkvs || {}, getUtmParams()); + + // convert all values to strings + Object.keys(rubiConf.fpkvs).forEach(key => { + rubiConf.fpkvs[key] = rubiConf.fpkvs[key] + ''; + }); + return rubiConf.fpkvs; +}; + +/* + Checks the alias registry for any entries of the rubicon bid adapter. + adds to the rubiconAliases list if found +*/ +const setRubiconAliases = aliasRegistry => { + const otherAliases = Object.keys(aliasRegistry).filter(alias => aliasRegistry[alias] === 'rubicon'); + rubiconAliases.push(...otherAliases); +}; +const sizeToDimensions = size => { + return { + width: size.w || size[0], + height: size.h || size[1] + }; +}; +const findMatchingAdUnitFromAuctions = (matchesFunction, returnFirstMatch) => { + // finding matching adUnit / auction + let matches = {}; + + // loop through auctions in order and adunits + for (const auctionId of cache.auctionOrder) { + const auction = cache.auctions[auctionId].auction; + for (const transactionId in auction.adUnits) { + const adUnit = auction.adUnits[transactionId]; + + // check if this matches + let doesMatch; + try { + doesMatch = matchesFunction(adUnit, auction); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${MODULE_NAME}: Error running matches function: ${returnFirstMatch}`, error); + doesMatch = false; + } + if (doesMatch) { + matches = { + adUnit, + auction + }; + + // we either return first match or we want last one matching so go to end + if (returnFirstMatch) return matches; + } + } + } + return matches; +}; +const getRenderingIds = bidWonData => { + // if bid caching off -> return the bidWon auction id + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('useBidCache')) { + return { + renderTransactionId: bidWonData.transactionId, + renderAuctionId: bidWonData.auctionId + }; + } + + // a rendering auction id is the LATEST auction / adunit which contains GAM ID's + const matchingFunction = (adUnit, auction) => { + // does adUnit match our bidWon and gam id's are present + const gamHasRendered = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${auction.auctionId}.gamRenders.${adUnit.transactionId}`); + return adUnit.adUnitCode === bidWonData.adUnitCode && gamHasRendered; + }; + let { + adUnit, + auction + } = findMatchingAdUnitFromAuctions(matchingFunction, false); + // If no match was found, we will use the actual bid won auction id + return { + renderTransactionId: adUnit && adUnit.transactionId || bidWonData.transactionId, + renderAuctionId: auction && auction.auctionId || bidWonData.auctionId + }; +}; +const formatBidWon = bidWonData => { + // get transaction and auction id of where this "rendered" + const { + renderTransactionId, + renderAuctionId + } = getRenderingIds(bidWonData); + const isCachedBid = renderTransactionId !== bidWonData.transactionId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME}: Bid Won : `, { + isCachedBid, + renderAuctionId, + renderTransactionId, + sourceAuctionId: bidWonData.auctionId, + sourceTransactionId: bidWonData.transactionId + }); + + // get the bid from the source auction id + let bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${bidWonData.auctionId}.auction.adUnits.${bidWonData.transactionId}.bids.${bidWonData.requestId}`); + let adUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${bidWonData.auctionId}.auction.adUnits.${bidWonData.transactionId}`); + let bidWon = { + ...bid, + sourceAuctionId: bidWonData.auctionId, + renderAuctionId, + transactionId: bidWonData.transactionId, + sourceTransactionId: bidWonData.transactionId, + bidId: bid.pbsBidId || bidWonData.bidId || bidWonData.requestId, + // if PBS had us overwrite bidId, use that as signal + renderTransactionId, + accountId, + siteId: adUnit.siteId, + zoneId: adUnit.zoneId, + mediaTypes: adUnit.mediaTypes, + adUnitCode: adUnit.adUnitCode, + isCachedBid: isCachedBid || undefined // only send if it is true (save some space) + }; + delete bidWon.pbsBidId; // if pbsBidId is there delete it (no need to pass it) + return bidWon; +}; +const formatGamEvent = (slotEvent, adUnit, auction) => { + const gamEvent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(slotEvent, [ + // these come in as `null` from Gpt, which when stringified does not get removed + // so set explicitly to undefined when not a number + 'advertiserId', advertiserId => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(advertiserId) ? advertiserId : undefined, 'creativeId', creativeId => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(slotEvent.sourceAgnosticCreativeId) ? slotEvent.sourceAgnosticCreativeId : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(creativeId) ? creativeId : undefined, 'lineItemId', lineItemId => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(slotEvent.sourceAgnosticLineItemId) ? slotEvent.sourceAgnosticLineItemId : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(lineItemId) ? lineItemId : undefined, 'adSlot', () => slotEvent.slot.getAdUnitPath(), 'isSlotEmpty', () => slotEvent.isEmpty || undefined]); + gamEvent.auctionId = auction.auctionId; + gamEvent.transactionId = adUnit.transactionId; + return gamEvent; +}; +const subscribeToGamSlots = () => { + window.googletag.pubads().addEventListener('slotRenderEnded', event => { + const isMatchingAdSlot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isAdUnitCodeMatchingSlot)(event.slot); + + // We want to find the FIRST auction - adUnit that matches and does not have gam data yet + const matchingFunction = (adUnit, auction) => { + // first it has to match the slot + // if the code is present in the elementIdMap then we use the matched id as code here + const elementIds = cache.elementIdMap[adUnit.adUnitCode] || [adUnit.adUnitCode]; + const matchesSlot = elementIds.some(isMatchingAdSlot); + + // next it has to have NOT already been counted as gam rendered + const gamHasRendered = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${auction.auctionId}.gamRenders.${adUnit.transactionId}`); + return matchesSlot && !gamHasRendered; + }; + let { + adUnit, + auction + } = findMatchingAdUnitFromAuctions(matchingFunction, true); + const slotName = `${event.slot.getAdUnitPath()} - ${event.slot.getSlotElementId()}`; + if (!adUnit || !auction) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME}: Could not find matching adUnit for Gam Render: `, { + slotName + }); + return; + } + const auctionId = auction.auctionId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME}: Gam Render: `, { + slotName, + transactionId: adUnit.transactionId, + auctionId: auctionId, + adUnit: adUnit + }); + + // if we have an adunit, then we need to make a gam event + const gamEvent = formatGamEvent(event, adUnit, auction); + + // marking that this prebid adunit has had its matching gam render found + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(cache, `auctions.${auctionId}.gamRenders.${adUnit.transactionId}`, true); + addEventToQueue({ + gamRenders: [gamEvent] + }, auctionId, 'gam'); + + // If this auction now has all gam slots rendered, fire the payload + if (!cache.auctions[auctionId].sent && Object.keys(cache.auctions[auctionId].gamRenders).every(tid => cache.auctions[auctionId].gamRenders[tid])) { + // clear the auction end timeout + clearTimeout(cache.timeouts[auctionId]); + delete cache.timeouts[auctionId]; + + // wait for bid wons a bit or send right away + if (rubiConf.analyticsEventDelay > 0) { + setTimeout(() => { + sendAuctionEvent(auctionId, 'gam-delayed'); + }, rubiConf.analyticsEventDelay); + } else { + sendAuctionEvent(auctionId, 'gam'); + } + } + }); +}; + +/** + * Lazy parsing of UA to determine browser + * @param {string} userAgent string from prebid ortb ua or navigator + * @returns {string} lazily guessed browser name + */ +const detectBrowserFromUa = userAgent => { + let normalizedUa = userAgent.toLowerCase(); + if (normalizedUa.includes('edg')) { + return 'Edge'; + } else if (/opr|opera|opt/i.test(normalizedUa)) { + return 'Opera'; + } else if (/chrome|crios/i.test(normalizedUa)) { + return 'Chrome'; + } else if (/fxios|firefox/i.test(normalizedUa)) { + return 'Firefox'; + } else if (normalizedUa.includes('safari') && !/chromium|ucbrowser/i.test(normalizedUa)) { + return 'Safari'; + } + return 'OTHER'; +}; +let magniteAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_9__["default"])({ + analyticsType: 'endpoint' +}); +magniteAdapter.originEnableAnalytics = magniteAdapter.enableAnalytics; +function enableMgniAnalytics() { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let error = false; + // endpoint + endpoint = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(config, 'options.endpoint'); + if (!endpoint) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${MODULE_NAME}: required endpoint missing`); + error = true; + } + // accountId + accountId = Number((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(config, 'options.accountId')); + if (!accountId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${MODULE_NAME}: required accountId missing`); + error = true; + } + if (!error) { + magniteAdapter.originEnableAnalytics(config); + } + // listen to gam slot renders! + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isGptPubadsDefined)()) { + subscribeToGamSlots(); + } else { + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(() => subscribeToGamSlots()); + } + + // Edge case handler for client side video caching + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_10__.getHook)('callPrebidCache').before(callPrebidCacheHook); +} +; + +/* + We want to know if a bid was cached client side + And if it was we will use the actual bidId instead of the pbsBidId override in our BID_RESPONSE handler +*/ +function callPrebidCacheHook(fn, auctionInstance, bidResponse, afterBidAdded, videoMediaType) { + cache.bidsCachedClientSide.add(bidResponse); + fn.call(this, auctionInstance, bidResponse, afterBidAdded, videoMediaType); +} +const handleBidWon = args => { + const bidWon = formatBidWon(args); + addEventToQueue({ + bidsWon: [bidWon] + }, bidWon.renderAuctionId, 'bidWon'); +}; +magniteAdapter.enableAnalytics = enableMgniAnalytics; +magniteAdapter.originDisableAnalytics = magniteAdapter.disableAnalytics; +magniteAdapter.disableAnalytics = function () { + // trick analytics module to register our enable back as main one + magniteAdapter._oldEnable = enableMgniAnalytics; + endpoint = undefined; + accountId = undefined; + cookieless = undefined; + auctionIndex = 0; + resetConfs(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_10__.getHook)('callPrebidCache').getHooks({ + hook: callPrebidCacheHook + }).remove(); + magniteAdapter.originDisableAnalytics(); +}; +magniteAdapter.onDataDeletionRequest = function () { + if (storage.localStorageIsEnabled()) { + storage.removeDataFromLocalStorage(COOKIE_NAME); + } else { + throw Error('Unable to access local storage, no data deleted'); + } +}; +magniteAdapter.MODULE_INITIALIZED_TIME = Date.now(); +magniteAdapter.referrerHostname = ''; +const handleBidResponse = (args, bidStatus) => { + const auctionEntry = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${args.auctionId}.auction`); + const adUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(auctionEntry, `adUnits.${args.transactionId}`); + let bid = adUnit.bids[args.requestId]; + + // if this came from multibid, there might now be matching bid, so check + // THIS logic will change when we support multibid per bid request + if (!bid && args.originalRequestId) { + let ogBid = adUnit.bids[args.originalRequestId]; + // create new bid + adUnit.bids[args.requestId] = { + ...ogBid, + bidId: args.requestId, + bidderDetail: args.targetingBidder + }; + bid = adUnit.bids[args.requestId]; + } + + // if we have not set enforcements yet set it (This is hidden from bidders until now so we have to get from here) + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(auctionEntry, 'floors.enforcement') !== 'boolean' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'floorData.enforcements')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(auctionEntry, 'floors.enforcement', args.floorData.enforcements.enforceJS); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(auctionEntry, 'floors.dealsEnforced', args.floorData.enforcements.floorDeals); + } + + // no-bid from server. report it! + if (!bid && args.seatBidId) { + bid = adUnit.bids[args.seatBidId] = { + bidder: args.bidderCode, + source: 'server', + bidId: args.seatBidId, + unknownBid: true + }; + } + if (!bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${MODULE_NAME}: Could not find associated bid request for bid response with requestId: `, args.requestId); + return; + } + + // set bid status + bid.status = bidStatus; + const latencies = getLatencies(args, auctionEntry.auctionStart); + bid.clientLatencyMillis = latencies.total; + bid.httpLatencyMillis = latencies.net; + bid.bidResponse = parseBidResponse(args, bid.bidResponse); + + // if pbs gave us back a bidId, we need to use it and update our bidId to PBA + const pbsBidId = (args.pbsBidId == 0 ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)() : args.pbsBidId) || (args.seatBidId == 0 ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)() : args.seatBidId); + if (pbsBidId && !cache.bidsCachedClientSide.has(args)) { + bid.pbsBidId = pbsBidId; + } +}; +const getLatencies = (args, auctionStart) => { + try { + const metrics = args.metrics.getMetrics(); + const src = args.src || args.source; + return { + total: parseInt(metrics[`adapter.${src}.total`]), + // If it is array, get slowest + net: parseInt(Array.isArray(metrics[`adapter.${src}.net`]) ? metrics[`adapter.${src}.net`][metrics[`adapter.${src}.net`].length - 1] : metrics[`adapter.${src}.net`]) + }; + } catch (error) { + // default to old way if not able to get better ones + const latency = Date.now() - auctionStart; + return { + total: latency, + net: latency + }; + } +}; +magniteAdapter.track = _ref4 => { + let { + eventType, + args + } = _ref4; + switch (eventType) { + case AUCTION_INIT: + auctionIndex += 1; + // Update session + cache.sessionData = storage.localStorageIsEnabled() && updateRpaCookie(); + // set the rubicon aliases + setRubiconAliases(_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__["default"].aliasRegistry); + + // latest page "referer" + pageReferer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'bidderRequests.0.refererInfo.page'); + + // set auction level data + let auctionData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(args, ['auctionId', 'timestamp as auctionStart', 'timeout as clientTimeoutMillis']); + auctionData.accountId = accountId; + auctionData.auctionIndex = auctionIndex; + + // get browser + if (!browser) { + const userAgent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'bidderRequests.0.ortb2.device.ua', navigator.userAgent) || ''; + browser = detectBrowserFromUa(userAgent); + } + + // Order bidders were called + auctionData.bidderOrder = args.bidderRequests.map(bidderRequest => bidderRequest.bidderCode); + + // Price Floors information + const floorData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'bidderRequests.0.bids.0.floorData'); + if (floorData) { + auctionData.floors = addFloorData(floorData); + } + + // Identify chrome cookieless trafic + if (!cookieless) { + const cdep = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'bidderRequests.0.ortb2.device.ext.cdep'); + if (cdep && (cdep.indexOf('treatment') !== -1 || cdep.indexOf('control_2') !== -1)) { + cookieless = 1; + auctionData.cdep = 1; + } + } + + // GDPR info + const gdprData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'bidderRequests.0.gdprConsent'); + if (gdprData) { + auctionData.gdpr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(gdprData, ['gdprApplies as applies', 'consentString', 'apiVersion as version']); + } + + // User ID Data included in auction + const userIds = Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'bidderRequests.0.bids.0.userId', {})).map(id => { + return { + provider: id, + hasId: true + }; + }); + if (userIds.length) { + auctionData.user = { + ids: userIds + }; + } + if (serverConfig) { + auctionData.serverTimeoutMillis = serverConfig.timeout; + } + + // lets us keep a map of adunit and wether it had a gam or bid won render yet, used to track when to send events + let gamRenders = {}; + // adunits saved as map of transactionIds + auctionData.adUnits = args.adUnits.reduce((adMap, adUnit) => { + let ad = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(adUnit, ['code as adUnitCode', 'transactionId', 'mediaTypes', mediaTypes => Object.keys(mediaTypes), 'sizes as dimensions', sizes => (sizes || [[1, 1]]).map(sizeToDimensions)]); + ad.pbAdSlot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, 'ortb2Imp.ext.data.pbadslot'); + ad.pattern = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, 'ortb2Imp.ext.data.aupname'); + ad.gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, 'ortb2Imp.ext.gpid'); + ad.bids = {}; + adMap[adUnit.transactionId] = ad; + gamRenders[adUnit.transactionId] = false; + + // Handle case elementId's (div Id's) are set on adUnit - PPI + const elementIds = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(adUnit, 'ortb2Imp.ext.data.elementid'); + if (elementIds) { + cache.elementIdMap[adUnit.code] = cache.elementIdMap[adUnit.code] || []; + // set it to array if set to string to be careful (should be array of strings) + const newIds = typeof elementIds === 'string' ? [elementIds] : elementIds; + newIds.forEach(id => { + if (!cache.elementIdMap[adUnit.code].includes(id)) { + cache.elementIdMap[adUnit.code].push(id); + } + }); + } + return adMap; + }, {}); + + // holding our pba data to send + cache.auctions[args.auctionId] = { + auction: auctionData, + gamRenders, + pendingEvents: {} + }; + break; + case BID_REQUESTED: + args.bids.forEach(bid => { + const adUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${args.auctionId}.auction.adUnits.${bid.transactionId}`); + adUnit.bids[bid.bidId] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.pick)(bid, ['bidder', 'bidId', 'source', () => bid.src === 's2s' ? 'server' : 'client', 'status', () => 'no-bid']); + // add a pbs flag if one of the bids has a server source + if (adUnit.bids[bid.bidId].source === 'server') adUnit.pbsRequest = 1; + // set acct site zone id on adunit + if ((!adUnit.siteId || !adUnit.zoneId) && rubiconAliases.indexOf(bid.bidder) !== -1) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.accountId') == accountId) { + adUnit.accountId = parseInt(accountId); + adUnit.siteId = parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.siteId')); + adUnit.zoneId = parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.zoneId')); + } + } + }); + break; + case BID_RESPONSE: + handleBidResponse(args, 'success'); + break; + case BID_REJECTED: + const bidStatus = args.rejectionReason === _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.REJECTION_REASON.FLOOR_NOT_MET ? BID_REJECTED_IPF : 'rejected'; + handleBidResponse(args, bidStatus); + break; + case PBS_ANALYTICS: + handlePbsAnalytics(args); + break; + case BIDDER_DONE: + const serverError = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, 'serverErrors.0'); + const serverResponseTimeMs = args.serverResponseTimeMs; + args.bids.forEach(bid => { + let cachedBid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${bid.auctionId}.auction.adUnits.${bid.transactionId}.bids.${bid.bidId}`); + if (typeof bid.serverResponseTimeMs !== 'undefined') { + cachedBid.serverLatencyMillis = bid.serverResponseTimeMs; + } else if (serverResponseTimeMs && bid.source === 's2s') { + cachedBid.serverLatencyMillis = serverResponseTimeMs; + } + // if PBS said we had an error, and this bid has not been processed by BID_RESPONSE YET + if (serverError && (!cachedBid.status || ['no-bid', 'error'].indexOf(cachedBid.status) !== -1)) { + cachedBid.status = 'error'; + cachedBid.error = { + code: pbsErrorMap[serverError.code] || pbsErrorMap[999], + description: serverError.message + }; + } + + // set client latency if not done yet + if (!cachedBid.clientLatencyMillis || !cachedBid.httpLatencyMillis) { + const latencies = getLatencies(bid, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${args.auctionId}.auction.auctionStart`)); + cachedBid.clientLatencyMillis = cachedBid.clientLatencyMillis || latencies.total; + cachedBid.httpLatencyMillis = cachedBid.httpLatencyMillis || latencies.net; + } + }); + break; + case BID_WON: + // Allowing us to delay bidWon handling so it happens at right time + // we expect it to happen after gpt slotRenderEnded, but have seen it happen before when testing + // this will ensure it happens after if set + if (rubiConf.analyticsProcessDelay > 0) { + setTimeout(() => { + handleBidWon(args); + }, rubiConf.analyticsProcessDelay); + } else { + handleBidWon(args); + } + break; + case AUCTION_END: + let auctionCache = cache.auctions[args.auctionId]; + // if for some reason the auction did not do its normal thing, this could be undefied so bail + if (!auctionCache) { + break; + } + // Set this auction as being done + auctionCache.auction.auctionEnd = args.auctionEnd; + + // keeping order of auctions and if the payload has been sent or not + cache.auctionOrder.push(args.auctionId); + const isOnlyInstreamAuction = args.adUnits && args.adUnits.every(adUnit => adUnitIsOnlyInstream(adUnit)); + + // if we are not waiting OR it is instream only auction + if (isOnlyInstreamAuction || rubiConf.analyticsBatchTimeout === 0) { + sendAuctionEvent(args.auctionId, 'solo-auction'); + } else { + // start timer to send batched payload just in case we don't hear any BID_WON events + cache.timeouts[args.auctionId] = setTimeout(() => { + sendAuctionEvent(args.auctionId, 'auctionEnd'); + }, rubiConf.analyticsBatchTimeout); + } + break; + case BID_TIMEOUT: + args.forEach(badBid => { + let bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${badBid.auctionId}.auction.adUnits.${badBid.transactionId}.bids.${badBid.bidId}`, {}); + // might be set already by bidder-done, so do not overwrite + if (bid.status !== 'error') { + bid.status = 'error'; + bid.error = { + code: 'timeout-error', + description: 'prebid.js timeout' // will help us diff if timeout was set by PBS or PBJS + }; + } + }); + break; + case BILLABLE_EVENT: + if (rubiConf.dmBilling.enabled && isBillingEventValid(args)) { + // add to the map indicating it has not been sent yet + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(cache.billing, `${args.vendor}.${args.billingId}`, false); + const billingEvent = formatBillingEvent(args); + addEventToQueue({ + billableEvents: [billingEvent] + }, args.auctionId, 'billing'); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME}: Billing event ignored`, args); + } + break; + } +}; +const handlePbsAnalytics = function (args) { + const { + seatnonbid, + auctionId, + atag + } = args; + if (seatnonbid) { + handleNonBidEvent(seatnonbid, auctionId); + } + if (atag) { + handleAtagEvent(atag, auctionId); + } +}; +const handleAtagEvent = function (atag, auctionId) { + const tags = findTimeoutOptimization(atag); + tags.forEach(tag => { + tag.activities.forEach(activity => { + if (activity.name === 'optimize-tmax' && activity.status === 'success') { + setAnalyticsTagData(activity.results[0]?.values, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${auctionId}.auction`)); + } + }); + }); +}; +const handleNonBidEvent = function (seatnonbid, auctionId) { + const auction = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(cache, `auctions.${auctionId}.auction`); + // if no auction just bail + if (!auction) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`Unable to match nonbid to auction`); + return; + } + const adUnits = auction.adUnits; + seatnonbid.forEach(seatnonbid => { + let { + seat + } = seatnonbid; + seatnonbid.nonbid.forEach(nonbid => { + try { + const { + status, + impid + } = nonbid; + const matchingTid = Object.keys(adUnits).find(tid => adUnits[tid].adUnitCode === impid); + const adUnit = adUnits[matchingTid]; + const statusInfo = statusMap[status] || { + status: 'no-bid' + }; + adUnit.bids[(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)()] = { + bidder: seat, + source: 'server', + isSeatNonBid: true, + clientLatencyMillis: Date.now() - auction.auctionStart, + ...statusInfo + }; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`Unable to match nonbid to adUnit`); + } + }); + }); +}; +const findTimeoutOptimization = atag => { + let timeoutOpt; + atag.forEach(tag => { + if (tag.module === 'mgni-timeout-optimization') { + timeoutOpt = tag.analyticstags; + } + }); + return timeoutOpt; +}; +const setAnalyticsTagData = (values, auction) => { + let data = { + name: values.scenario, + rule: values.rule, + value: values.tmax + }; + const experiments = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(auction, 'experiments') || []; + experiments.push(data); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(auction, 'experiments', experiments); +}; +const statusMap = { + 0: { + status: 'no-bid' + }, + 100: { + status: 'error', + error: { + code: 'request-error', + description: 'general error' + } + }, + 101: { + status: 'error', + error: { + code: 'timeout-error', + description: 'prebid server timeout' + } + }, + 200: { + status: 'rejected' + }, + 202: { + status: 'rejected' + }, + 301: { + status: 'rejected-ipf' + } +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_11__["default"].registerAnalyticsAdapter({ + adapter: magniteAdapter, + code: 'magnite', + gvlid: RUBICON_GVL_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (magniteAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('magniteAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/magniteAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["malltvAnalyticsAdapter"],{ + +/***/ "./modules/malltvAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/malltvAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ANALYTICS_VERSION, DEFAULT_SERVER, BIDDER_STATUS, getCpmInEur, parseBidderCode, parseAdUnitCode, malltvAnalyticsAdapter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +const analyticsType = 'endpoint'; +const ANALYTICS_VERSION = '1.0.0'; +const DEFAULT_SERVER = 'https://central.mall.tv/analytics'; +const { + AUCTION_END, + BID_TIMEOUT +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const BIDDER_STATUS = { + BID: 1, + NO_BID: 2, + BID_WON: 3, + TIMEOUT: 4 +}; +const getCpmInEur = function (bid) { + if (bid.currency !== 'EUR' && typeof bid.getCpmInNewCurrency === 'function') { + return bid.getCpmInNewCurrency('EUR'); + } + return bid.cpm; +}; +const analyticsOptions = {}; +const parseBidderCode = function (bid) { + let bidderCode = bid.bidderCode || bid.bidder; + return bidderCode.toLowerCase(); +}; +const parseAdUnitCode = function (bidResponse) { + return bidResponse.adUnitCode.toLowerCase(); +}; +const malltvAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + DEFAULT_SERVER, + analyticsType +}), { + cachedAuctions: {}, + initConfig(config) { + /** + * Required option: propertyId + * + * Optional option: server + * @type {boolean} + */ + analyticsOptions.options = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(config.options); + if (typeof config.options.propertyId !== 'string' || config.options.propertyId.length < 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('"options.propertyId" is required.'); + return false; + } + analyticsOptions.propertyId = config.options.propertyId; + analyticsOptions.server = config.options.server || DEFAULT_SERVER; + return true; + }, + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case BID_TIMEOUT: + this.handleBidTimeout(args); + break; + case AUCTION_END: + this.handleAuctionEnd(args); + break; + } + }, + handleBidTimeout(timeoutBids) { + timeoutBids.forEach(bid => { + const cachedAuction = this.getCachedAuction(bid.auctionId); + cachedAuction.timeoutBids.push(bid); + }); + }, + handleAuctionEnd(auctionEndArgs) { + const cachedAuction = this.getCachedAuction(auctionEndArgs.auctionId); + const highestCpmBids = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().getHighestCpmBids(); + this.sendEventMessage('end', this.createBidMessage(auctionEndArgs, highestCpmBids, cachedAuction.timeoutBids)); + }, + createBidMessage(auctionEndArgs, winningBids, timeoutBids) { + const { + auctionId, + timestamp, + timeout, + auctionEnd, + adUnitCodes, + bidsReceived, + noBids + } = auctionEndArgs; + const message = this.createCommonMessage(auctionId); + message.auctionElapsed = auctionEnd - timestamp; + message.timeout = timeout; + adUnitCodes.forEach(adUnitCode => { + message.adUnits[adUnitCode] = {}; + }); + + // We handled noBids first because when currency conversion is enabled, a bid with a foreign currency + // will be set to NO_BID initially, and then set to BID after the currency rate json file is fully loaded. + // In this situation, the bid exists in both noBids and bids arrays. + noBids.forEach(bid => this.addBidResponseToMessage(message, bid, BIDDER_STATUS.NO_BID)); + + // This array may contain some timeout bids (responses come back after auction timeout) + bidsReceived.forEach(bid => this.addBidResponseToMessage(message, bid, BIDDER_STATUS.BID)); + + // We handle timeout after bids since it's possible that a bid has a response, but the response comes back + // after auction end. In this case, the bid exists in both bidsReceived and timeoutBids arrays. + timeoutBids.forEach(bid => this.addBidResponseToMessage(message, bid, BIDDER_STATUS.TIMEOUT)); + + // mark the winning bids with prebidWon = true + winningBids.forEach(bid => { + const adUnitCode = parseAdUnitCode(bid); + const bidder = parseBidderCode(bid); + message.adUnits[adUnitCode][bidder].prebidWon = true; + }); + return message; + }, + createCommonMessage(auctionId) { + return { + analyticsVersion: ANALYTICS_VERSION, + auctionId: auctionId, + propertyId: analyticsOptions.propertyId, + referrer: window.location.href, + prebidVersion: "9.45.0-pre", + adUnits: {} + }; + }, + addBidResponseToMessage(message, bid, status) { + const adUnitCode = parseAdUnitCode(bid); + message.adUnits[adUnitCode] = message.adUnits[adUnitCode] || {}; + const bidder = parseBidderCode(bid); + const bidResponse = this.serializeBidResponse(bid, status); + message.adUnits[adUnitCode][bidder] = bidResponse; + }, + serializeBidResponse(bid, status) { + const result = { + prebidWon: status === BIDDER_STATUS.BID_WON, + isTimeout: status === BIDDER_STATUS.TIMEOUT, + status: status + }; + if (status === BIDDER_STATUS.BID || status === BIDDER_STATUS.BID_WON) { + Object.assign(result, { + time: bid.timeToRespond, + cpm: bid.cpm, + currency: bid.currency, + originalCpm: bid.originalCpm || bid.cpm, + cpmEur: getCpmInEur(bid), + originalCurrency: bid.originalCurrency || bid.currency, + vastUrl: bid.vastUrl + }); + } + return result; + }, + sendEventMessage(endPoint, data) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`AJAX: ${endPoint}: ` + JSON.stringify(data)); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(`${analyticsOptions.server}/${endPoint}`, null, JSON.stringify(data), { + contentType: 'application/json' + }); + }, + getCachedAuction(auctionId) { + this.cachedAuctions[auctionId] = this.cachedAuctions[auctionId] || { + timeoutBids: [] + }; + return this.cachedAuctions[auctionId]; + }, + getAnalyticsOptions() { + return analyticsOptions; + } +}); + +// save the base class function +malltvAnalyticsAdapter.originEnableAnalytics = malltvAnalyticsAdapter.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +malltvAnalyticsAdapter.enableAnalytics = function (config) { + if (this.initConfig(config)) { + malltvAnalyticsAdapter.originEnableAnalytics(config); // call the base class function + } +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: malltvAnalyticsAdapter, + code: 'malltv' +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('malltvAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/malltvAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["malltvBidAdapter"],{ + +/***/ "./modules/malltvBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/malltvBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'malltv'; +const ENDPOINT_URL = 'https://central.mall.tv/bid'; +const DIMENSION_SEPARATOR = 'x'; +const SIZE_SEPARATOR = ';'; +const BISKO_ID = 'biskoId'; +const STORAGE_ID = 'bisko-sid'; +const SEGMENTS = 'biskoSegments'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.propertyId && bid.params.placementId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const storageId = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(STORAGE_ID) || '' : ''; + const biskoId = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(BISKO_ID) || '' : ''; + const segments = storage.localStorageIsEnabled() ? JSON.parse(storage.getDataFromLocalStorage(SEGMENTS)) || [] : []; + let propertyId = ''; + let pageViewGuid = ''; + let bidderRequestId = ''; + let url = ''; + let contents = []; + let data = {}; + let auctionId = bidderRequest ? bidderRequest.auctionId : ''; + let gdrpApplies = true; + let gdprConsent = ''; + let placements = validBidRequests.map(bidRequest => { + if (!propertyId) { + propertyId = bidRequest.params.propertyId; + } + if (!pageViewGuid && bidRequest.params) { + pageViewGuid = bidRequest.params.pageViewGuid || ''; + } + if (!bidderRequestId) { + bidderRequestId = bidRequest.bidderRequestId; + } + // TODO: is 'page' the right value here? + if (!url && bidderRequest) { + url = bidderRequest.refererInfo.page; + } + if (!contents.length && bidRequest.params.contents && bidRequest.params.contents.length) { + contents = bidRequest.params.contents; + } + if (Object.keys(data).length === 0 && bidRequest.params.data && Object.keys(bidRequest.params.data).length !== 0) { + data = bidRequest.params.data; + } + if (bidderRequest && bidRequest.gdprConsent) { + gdrpApplies = bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? bidderRequest.gdprConsent.gdprApplies : true; + } + if (bidderRequest && bidRequest.gdprConsent) { + gdprConsent = bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString : ''; + } + let adUnitId = bidRequest.adUnitCode; + let placementId = bidRequest.params.placementId; + let sizes = generateSizeParam(bidRequest.sizes); + return { + sizes: sizes, + adUnitId: adUnitId, + placementId: placementId, + bidid: bidRequest.bidId, + count: bidRequest.params.count, + skipTime: bidRequest.params.skipTime + }; + }); + let body = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: auctionId, + propertyId: propertyId, + pageViewGuid: pageViewGuid, + storageId: storageId, + biskoId: biskoId, + segments: segments, + url: url, + requestid: bidderRequestId, + placements: placements, + contents: contents, + data: data, + gdpr_applies: gdrpApplies, + gdpr_consent: gdprConsent + }; + return [{ + method: 'POST', + url: ENDPOINT_URL, + data: body + }]; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const responses = serverResponse.body; + const bidResponses = []; + for (var i = 0; i < responses.length; i++) { + const bidResponse = { + requestId: responses[i].BidId, + cpm: responses[i].CPM, + width: responses[i].Width, + height: responses[i].Height, + creativeId: responses[i].CreativeId, + currency: responses[i].Currency, + netRevenue: responses[i].NetRevenue, + ttl: responses[i].TTL, + referrer: responses[i].Referrer, + ad: responses[i].Ad, + vastUrl: responses[i].VastUrl, + mediaType: responses[i].MediaType, + meta: { + advertiserDomains: Array.isArray(responses[i].ADomain) ? responses[i].ADomain : [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + } +}; + +/** + * Generate size param for bid request using sizes array + * + * @param {Array} sizes Possible sizes for the ad unit. + * @return {string} Processed sizes param to be used for the bid request. + */ +function generateSizeParam(sizes) { + return sizes.map(size => size.join(DIMENSION_SEPARATOR)).join(SIZE_SEPARATOR); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('malltvBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/malltvBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mantisBidAdapter"],{ + +/***/ "./modules/mantisBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/mantisBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, onVisible, spec, sfPostMessage, iframePostMessage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: 'mantis' +}); +function inIframe() { + try { + return window.self !== window.top && !window.mantis_link; + } catch (e) { + return true; + } +} +function onVisible(win, element, doOnVisible, time, pct) { + var started = null; + var notified = false; + var onNotVisible = null; + var whenNotVisible = function () { + if (notified && onNotVisible) { + onNotVisible(); + } + notified = false; + }; + var interval; + var listener; + var doCheck = function (winWidth, winHeight, rect) { + var hidden = typeof document.hidden !== 'undefined' && document.hidden; + if (rect.width == 0 || rect.height == 0 || hidden) { + return whenNotVisible(); + } + var minHeight = rect.height * pct; + var minWidth = rect.width * pct; + var inView = (rect.top < 0 && rect.bottom >= minHeight || rect.top > 0 && winHeight - rect.top >= minHeight) && (rect.left < 0 && rect.right >= minWidth || rect.left > 0 && winWidth - rect.left >= minWidth); + if (!inView) { + return whenNotVisible(); + } + if (!started && time) { + started = Date.now(); + return whenNotVisible(); + } + if (time && Date.now() - started < time) { + return whenNotVisible(); + } + if (notified) { + return; + } + doOnVisible(function (ack) { + if (ack) { + notified = true; + } else { + interval && clearInterval(interval); + listener && listener(); + } + }, function (onHidden) { + onNotVisible = onHidden; + }); + }; + if (isAmp()) { + listener = win.context.observeIntersection(function (changes) { + changes.forEach(function (change) { + doCheck(change.rootBounds.width, change.rootBounds.height, change.boundingClientRect); + }); + }); + } + interval = setInterval(function () { + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)(); + var winHeight = windowDimensions.innerHeight || windowDimensions.document.documentElement.clientHeight; + var winWidth = windowDimensions.innerWidth || windowDimensions.document.documentElement.clientWidth; + doCheck(winWidth, winHeight, (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_2__.getBoundingClientRect)(element)); + }, 100); +} +function storeUuid(uuid) { + if (window.mantis_uuid) { + return false; + } + window.mantis_uuid = uuid; + if (storage.hasLocalStorage()) { + try { + storage.setDataInLocalStorage('mantis:uuid', uuid); + } catch (ex) {} + } +} +function onMessage(type, callback) { + window.addEventListener('message', function (event) { + if (event.data.mantis && event.data.type == type) { + callback(event.data.data); + } + }, false); +} +function isSendable(val) { + if (val === null || val === undefined) { + return false; + } + if (typeof val === 'string') { + return !(!val || /^\s*$/.test(val)); + } + if (typeof val === 'number') { + return !isNaN(val); + } + return true; +} +function isObject(value) { + return Object.prototype.toString.call(value) === '[object Object]'; +} +function isAmp() { + return typeof window.context === 'object' && (window.context.tagName === 'AMP-AD' || window.context.tagName === 'AMP-EMBED'); +} +function isSecure() { + return document.location.protocol === 'https:'; +} +function isArray(value) { + return Object.prototype.toString.call(value) === '[object Array]'; +} +function jsonToQuery(data, chain, form) { + var parts = form || []; + for (var key in data) { + var queryKey = key; + if (chain) { + queryKey = chain + '[' + key + ']'; + } + var val = data[key]; + if (isArray(val)) { + for (var index = 0; index < val.length; index++) { + var akey = queryKey + '[' + index + ']'; + var aval = val[index]; + if (isObject(aval)) { + jsonToQuery(aval, akey, parts); + } + } + } else if (isObject(val) && val != data) { + jsonToQuery(val, queryKey, parts); + } else if (isSendable(val)) { + parts.push(queryKey + '=' + encodeURIComponent(val)); + } + } + return parts.join('&'); +} +function buildMantisUrl(path, data, domain) { + var params = { + referrer: document.referrer, + tz: new Date().getTimezoneOffset(), + buster: new Date().getTime(), + secure: isSecure(), + version: 9 + }; + if (window.mantis_uuid) { + params.uuid = window.mantis_uuid; + } else if (storage.hasLocalStorage()) { + var localUuid = storage.getDataFromLocalStorage('mantis:uuid'); + if (localUuid) { + params.uuid = localUuid; + } + } + if (!inIframe()) { + try { + params.title = window.top.document.title; + params.referrer = window.top.document.referrer; + params.url = window.top.document.location.href; + } catch (ex) {} + } else { + params.iframe = true; + } + if (isAmp()) { + params.amp = true; + if (!params.url && window.context.canonicalUrl) { + params.url = window.context.canonicalUrl; + } + if (!params.url && window.context.location) { + params.url = window.context.location.href; + } + if (!params.referrer && window.context.referrer) { + params.referrer = window.context.referrer; + } + } + Object.keys(data).forEach(function (key) { + params[key] = data[key]; + }); + var query = jsonToQuery(params); + return (window.mantis_domain === undefined ? domain || 'https://mantodea.mantisadnetwork.com' : window.mantis_domain) + path + '?' + query; +} +const spec = { + code: 'mantis', + supportedMediaTypes: ['banner'], + isBidRequestValid: function (bid) { + return !!(bid.params.property && (bid.params.code || bid.params.zoneId || bid.params.zone)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + var property = null; + validBidRequests.some(function (bid) { + if (bid.params.property) { + property = bid.params.property; + return true; + } + }); + const query = { + measurable: true, + usp: bidderRequest && bidderRequest.uspConsent, + bids: validBidRequests.map(function (bid) { + return { + bidId: bid.bidId, + config: bid.params, + sizes: bid.sizes.map(function (size) { + return { + width: size[0], + height: size[1] + }; + }) + }; + }), + property: property + }; + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + // we purposefully do not track data for users in the EU + query.consent = false; + } + return { + method: 'GET', + url: buildMantisUrl('/prebid/display', query) + '&foo', + data: '' + }; + }, + interpretResponse: function (serverResponse) { + storeUuid(serverResponse.body.uuid); + return serverResponse.body.ads.map(function (ad) { + return { + requestId: ad.bid, + cpm: ad.cpm, + width: ad.width, + height: ad.height, + ad: ad.html, + meta: { + advertiserDomains: ad.domains || [] + }, + ttl: ad.ttl || serverResponse.body.ttl || 86400, + creativeId: ad.view, + netRevenue: true, + currency: 'USD' + }; + }); + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: buildMantisUrl('/prebid/iframe', { + gdpr: gdprConsent, + uspConsent: uspConsent + }) + }]; + } + if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: buildMantisUrl('/prebid/pixel', { + gdpr: gdprConsent, + uspConsent: uspConsent + }) + }]; + } + } +}; +function sfPostMessage($sf, width, height, callback) { + var viewed = false; + $sf.ext.register(width, height, function () { + if ($sf.ext.inViewPercentage() < 50 || viewed) { + return; + } + viewed = true; + callback(); + }); +} +; +function iframePostMessage(win, name, callback) { + var frames = document.getElementsByTagName('iframe'); + for (var i = 0; i < frames.length; i++) { + var frame = frames[i]; + if (frame.name == name) { + onVisible(win, frame, function (stop) { + callback(); + stop(); + }, 1000, 0.50); + } + } +} +onMessage('iframe', function (data) { + if (window.$sf) { + sfPostMessage(window.$sf, data.width, data.height, () => (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(data.pixel)); + } else { + iframePostMessage(window, data.frame, () => (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(data.pixel)); + } +}); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('mantisBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mantisBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["marsmediaBidAdapter"],{ + +/***/ "./modules/marsmediaBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/marsmediaBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/percentInView/percentInView.js */ "./libraries/percentInView/percentInView.js"); + + + + + + + + +function MarsmediaAdapter() { + this.code = 'marsmedia'; + this.aliases = ['mars']; + this.supportedMediaTypes = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; + let SUPPORTED_VIDEO_PROTOCOLS = [2, 3, 5, 6]; + let SUPPORTED_VIDEO_MIMES = ['video/mp4']; + let SUPPORTED_VIDEO_PLAYBACK_METHODS = [1, 2, 3, 4]; + let SUPPORTED_VIDEO_DELIVERY = [1]; + let SUPPORTED_VIDEO_API = [1, 2, 5]; + let slotsToBids = {}; + let version = '2.5'; + this.isBidRequestValid = function (bid) { + return !!(bid.params && bid.params.zoneId); + }; + this.getUserSyncs = function (syncOptions, responses, gdprConsent) { + return []; + }; + function frameImp(BRs, bidderRequest) { + var impList = []; + var isSecure = 0; + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.stack.length) { + // clever trick to get the protocol + // TODO: this should probably use parseUrl + var el = document.createElement('a'); + el.href = bidderRequest.refererInfo.stack[0]; + isSecure = el.protocol == 'https:' ? 1 : 0; + } + for (var i = 0; i < BRs.length; i++) { + slotsToBids[BRs[i].adUnitCode] = BRs[i]; + var impObj = {}; + impObj.id = BRs[i].adUnitCode; + impObj.secure = isSecure; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaTypes.banner') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaType') === 'banner') { + let banner = frameBanner(BRs[i]); + if (banner) { + impObj.banner = banner; + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaTypes.video') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaType') === 'video') { + impObj.video = frameVideo(BRs[i]); + } + if (!(impObj.banner || impObj.video)) { + continue; + } + impObj.bidfloor = _getFloor(BRs[i]); + impObj.ext = frameExt(BRs[i]); + impList.push(impObj); + } + return impList; + } + function frameSite(bidderRequest) { + var site = { + domain: '', + page: '', + ref: '' + }; + if (bidderRequest && bidderRequest.refererInfo) { + var ri = bidderRequest.refererInfo; + // TODO: is 'ref' the right value here? + site.ref = ri.ref; + if (ri.stack.length) { + site.page = ri.stack[ri.stack.length - 1]; + + // clever trick to get the domain + // TODO: does this logic make sense? why should domain be set to the lowermost frame's? + // TODO: this should probably use parseUrl + var el = document.createElement('a'); + el.href = ri.stack[0]; + site.domain = el.hostname; + } + } + return site; + } + function frameDevice() { + return { + ua: navigator.userAgent, + ip: '', + // Empty Ip string is required, server gets the ip from HTTP header + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDNT)() ? 1 : 0 + }; + } + function getValidSizeSet(dimensionList) { + let w = parseInt(dimensionList[0]); + let h = parseInt(dimensionList[1]); + // clever check for NaN + if (!(w !== w || h !== h)) { + // eslint-disable-line + return [w, h]; + } + return false; + } + function frameBanner(adUnit) { + // adUnit.sizes is scheduled to be deprecated, continue its support but prefer adUnit.mediaTypes.banner + var sizeList = adUnit.sizes; + if (adUnit.mediaTypes && adUnit.mediaTypes.banner) { + sizeList = adUnit.mediaTypes.banner.sizes; + } + var sizeStringList = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(sizeList); + var format = []; + sizeStringList.forEach(function (size) { + if (size) { + var dimensionList = getValidSizeSet(size.split('x')); + if (dimensionList) { + format.push({ + 'w': dimensionList[0], + 'h': dimensionList[1] + }); + } + } + }); + if (format.length) { + return { + 'format': format + }; + } + return false; + } + function frameVideo(bid) { + var size = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playerSize')) { + var dimensionSet = bid.mediaTypes.video.playerSize; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.mediaTypes.video.playerSize[0])) { + dimensionSet = bid.mediaTypes.video.playerSize[0]; + } + var validSize = getValidSizeSet(dimensionSet); + if (validSize) { + size = validSize; + } + } + return { + mimes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.mimes') || SUPPORTED_VIDEO_MIMES, + protocols: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.protocols') || SUPPORTED_VIDEO_PROTOCOLS, + w: size[0], + h: size[1], + startdelay: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.startdelay') || 0, + skip: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.skip') || 0, + playbackmethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playbackmethod') || SUPPORTED_VIDEO_PLAYBACK_METHODS, + delivery: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.delivery') || SUPPORTED_VIDEO_DELIVERY, + api: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.api') || SUPPORTED_VIDEO_API + }; + } + function frameExt(bid) { + if (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) { + let bidSizes = bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes || bid.sizes; + bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidSizes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidSizes[0]) ? bidSizes : [bidSizes]; + bidSizes = bidSizes.filter(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(size)); + const processedSizes = bidSizes.map(size => ({ + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + })); + const element = document.getElementById(bid.adUnitCode); + const minSize = _getMinSize(processedSizes); + const viewabilityAmount = _isViewabilityMeasurable(element) ? _getViewability(element, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(), minSize) : 'na'; + const viewabilityAmountRounded = isNaN(viewabilityAmount) ? viewabilityAmount : Math.round(viewabilityAmount); + return { + bidder: { + zoneId: bid.params['zoneId'] + }, + viewability: viewabilityAmountRounded + }; + } else { + return { + bidder: { + zoneId: bid.params['zoneId'] + }, + viewability: 'na' + }; + } + } + function frameBid(BRs, bidderRequest) { + let bid = { + id: BRs[0].bidderRequestId, + imp: frameImp(BRs, bidderRequest), + site: frameSite(bidderRequest), + device: frameDevice(), + user: { + ext: { + consent: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.gdprApplies') ? bidderRequest.gdprConsent.consentString : '' + } + }, + at: 1, + tmax: 650, + regs: { + ext: { + gdpr: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.gdprApplies') ? Boolean(bidderRequest.gdprConsent.gdprApplies & 1) : false + } + } + }; + if (BRs[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'source.ext.schain', BRs[0].schain); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'regs.coppa', _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') & 1); + } + return bid; + } + function getFirstParam(key, validBidRequests) { + for (let i = 0; i < validBidRequests.length; i++) { + if (validBidRequests[i].params && validBidRequests[i].params[key]) { + return validBidRequests[i].params[key]; + } + } + } + this.buildRequests = function (BRs, bidderRequest) { + let fallbackZoneId = getFirstParam('zoneId', BRs); + if (fallbackZoneId === undefined || BRs.length < 1) { + return []; + } + var uri = 'https://hb.go2speed.media/bidder/?bid=3mhdom&zoneId=' + fallbackZoneId; + var fat = /(^v|(\.0)+$)/gi; + var prebidVersion = "9.45.0-pre"; + uri += '&hbv=' + prebidVersion.replace(fat, '') + ',' + version.replace(fat, ''); + var bidRequest = frameBid(BRs, bidderRequest); + if (!bidRequest.imp.length) { + return {}; + } + return { + method: 'POST', + url: uri, + data: JSON.stringify(bidRequest) + }; + }; + this.onBidWon = function (bid) { + if (typeof bid.nurl !== 'undefined') { + const cpm = bid.pbMg; + bid.nurl = bid.nurl.replace(/\$\{AUCTION_PRICE\}/, cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(bid.nurl, null); + } + ; + sendbeacon(bid, 17); + }; + this.onTimeout = function (bid) { + sendbeacon(bid, 19); + }; + this.onSetTargeting = function (bid) { + sendbeacon(bid, 20); + }; + this.interpretResponse = function (serverResponse) { + let responses = serverResponse.body || []; + let bids = []; + let i = 0; + if (responses.seatbid) { + let temp = []; + for (i = 0; i < responses.seatbid.length; i++) { + for (let j = 0; j < responses.seatbid[i].bid.length; j++) { + temp.push(responses.seatbid[i].bid[j]); + } + } + responses = temp; + } + for (i = 0; i < responses.length; i++) { + let bid = responses[i]; + let bidRequest = slotsToBids[bid.impid]; + let bidResponse = { + requestId: bidRequest.bidId, + cpm: parseFloat(bid.price), + width: bid.w, + height: bid.h, + creativeId: bid.crid, + currency: 'USD', + netRevenue: true, + ttl: 350, + nurl: bid.nurl + }; + if (bidRequest.mediaTypes && bidRequest.mediaTypes.video) { + if (bid.adm.charAt(0) === '<') { + bidResponse.vastXml = bid.adm; + } else { + bidResponse.vastUrl = bid.adm; + } + bidResponse.mediaType = 'video'; + bidResponse.ttl = 600; + } else { + bidResponse.ad = bid.adm; + } + bids.push(bidResponse); + } + return bids; + }; + function sendbeacon(bid, type) { + const bidString = JSON.stringify(bid); + const encodedBuf = window.btoa(bidString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)('https://ping-hqx-1.go2speed.media/notification/rtb/beacon/?bt=' + type + '&bid=3mhdom&hb_j=' + encodedBuf, null); + } + + /** + * Gets bidfloor + * @param {Object} bid + * @returns {Number} floor + */ + function _getFloor(bid) { + const curMediaType = bid.mediaTypes.video ? 'video' : 'banner'; + let floor = 0; + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: curMediaType, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = floorInfo.floor; + } + } + return floor; + } + function _getMinSize(sizes) { + return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min); + } + function _isViewabilityMeasurable(element) { + return !_isIframe() && element !== null; + } + function _isIframe() { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowSelf)() !== (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowTop)(); + } catch (e) { + return true; + } + } + function _getViewability(element, topWin) { + let { + w, + h + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return topWin.document.visibilityState === 'visible' ? (0,_libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_5__.percentInView)(element, { + w, + h + }) : 0; + } +} +const spec = new MarsmediaAdapter(); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('marsmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","percentInView","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/marsmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mathildeadsBidAdapter"],{ + +/***/ "./modules/mathildeadsBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/mathildeadsBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'mathildeads'; +const AD_URL = 'https://endpoint2.mathilde-ads.com/pbjs'; +const SYNC_URL = 'https://cs2.mathilde-ads.com'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['placementId']), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('mathildeadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mathildeadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediaConsortiumBidAdapter"],{ + +/***/ "./modules/mediaConsortiumBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/mediaConsortiumBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports OPTIMIZATIONS_STORAGE_KEY, spec, getOptimizationsFromLocalStorage */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + + + +const BIDDER_CODE = 'mediaConsortium'; +const PROFILE_API_USAGE_CONFIG_KEY = 'useProfileApi'; +const ONE_PLUS_X_ID_USAGE_CONFIG_KEY = 'readOnePlusXId'; +const SYNC_ENDPOINT = 'https://relay.hubvisor.io/v1/sync/big'; +const AUCTION_ENDPOINT = 'https://relay.hubvisor.io/v1/auction/big'; +const XANDR_OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const OPTIMIZATIONS_STORAGE_KEY = 'media_consortium_optimizations'; +const SYNC_TYPES = { + image: 'image', + redirect: 'image', + iframe: 'iframe' +}; +const storageManager = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + version: '0.0.1', + code: BIDDER_CODE, + gvlid: 1112, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid(bid) { + return true; + }, + buildRequests(bidRequests, bidderRequest) { + const useProfileApi = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(PROFILE_API_USAGE_CONFIG_KEY) ?? false; + const readOnePlusXId = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig(ONE_PLUS_X_ID_USAGE_CONFIG_KEY) ?? false; + const { + auctionId, + bids, + gdprConsent: { + gdprApplies = false, + consentString + } = {}, + ortb2: { + device, + site + } + } = bidderRequest; + const currentTimestamp = Date.now(); + const optimizations = getOptimizationsFromLocalStorage(); + const impressions = bids.reduce((acc, bidRequest) => { + const { + bidId, + adUnitCode, + mediaTypes + } = bidRequest; + const optimization = optimizations[adUnitCode]; + if (optimization) { + const { + expiresAt, + isEnabled + } = optimization; + if (expiresAt >= currentTimestamp && !isEnabled) { + return acc; + } + } + let finalizedMediatypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(mediaTypes); + if (mediaTypes.video && mediaTypes.video.context !== _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Filtering video request for adUnitCode ${adUnitCode} because context is not ${_src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM}`); + if (Object.keys(finalizedMediatypes).length > 1) { + delete finalizedMediatypes.video; + } else { + return acc; + } + } + return acc.concat({ + id: bidId, + adUnitCode, + mediaTypes: finalizedMediatypes + }); + }, []); + if (!impressions.length) { + return; + } + const request = { + id: auctionId ?? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(), + impressions, + device, + site, + user: { + ids: {} + }, + regulations: { + gdpr: { + applies: gdprApplies, + consentString + } + }, + timeout: 3600, + options: { + useProfileApi + } + }; + if (readOnePlusXId) { + const fpId = getFpIdFromLocalStorage(); + if (fpId) { + request.user.ids['1plusX'] = fpId; + } + } + const syncData = { + gdpr: gdprApplies, + ad_unit_codes: impressions.map(_ref => { + let { + adUnitCode + } = _ref; + return adUnitCode; + }).join(',') + }; + if (consentString) { + syncData.gdpr_consent = consentString; + } + return [{ + method: 'GET', + url: SYNC_ENDPOINT, + data: syncData + }, { + method: 'POST', + url: AUCTION_ENDPOINT, + data: request + }]; + }, + interpretResponse(serverResponse, params) { + if (!isValidResponse(serverResponse)) return []; + const { + body: { + bids, + optimizations + } + } = serverResponse; + if (optimizations && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(optimizations)) { + const currentTimestamp = Date.now(); + const optimizationsToStore = optimizations.reduce((acc, optimization) => { + const { + adUnitCode, + isEnabled, + ttl + } = optimization; + return { + ...acc, + [adUnitCode]: { + isEnabled, + expiresAt: currentTimestamp + ttl + } + }; + }, getOptimizationsFromLocalStorage()); + storageManager.setDataInLocalStorage(OPTIMIZATIONS_STORAGE_KEY, JSON.stringify(optimizationsToStore)); + } + return bids.map(bid => { + const { + impressionId, + price: { + cpm, + currency + }, + dealId, + ad: { + creative: { + id, + mediaType, + size: { + width, + height + }, + markup + } + }, + ttl = 360 + } = bid; + const formattedBid = { + requestId: impressionId, + cpm, + currency, + dealId, + ttl, + netRevenue: true, + creativeId: id, + mediaType, + width, + height, + ad: markup, + adUrl: null + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + const impressionRequest = params.data.impressions.find(_ref2 => { + let { + id + } = _ref2; + return id === impressionId; + }); + formattedBid.vastXml = markup; + if (impressionRequest) { + formattedBid.renderer = buildXandrOutstreamRenderer(impressionId, impressionRequest.adUnitCode); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Could not find adUnitCode matching the impressionId ${impressionId} to setup the renderer`); + } + } + return formattedBid; + }); + }, + getUserSyncs(syncOptions, serverResponses) { + if (serverResponses.length !== 2) { + return; + } + const [sync] = serverResponses; + return sync.body?.bidders?.reduce((acc, _ref3) => { + let { + type, + url + } = _ref3; + const syncType = SYNC_TYPES[type]; + if (!syncType || !url) { + return acc; + } + return acc.concat({ + type: syncType, + url + }); + }, []); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +function getOptimizationsFromLocalStorage() { + try { + const storedOptimizations = storageManager.getDataFromLocalStorage(OPTIMIZATIONS_STORAGE_KEY); + return storedOptimizations ? JSON.parse(storedOptimizations) : {}; + } catch (err) { + return {}; + } +} +function getFpIdFromLocalStorage() { + try { + return storageManager.getDataFromLocalStorage('ope_fpid'); + } catch (err) { + return null; + } +} +function isValidResponse(response) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(response) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(response.body) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(response.body.bids); +} +function buildXandrOutstreamRenderer(bidId, adUnitCode) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__.Renderer.install({ + id: bidId, + url: XANDR_OUTSTREAM_RENDERER_URL, + loaded: false, + adUnitCode, + targetId: adUnitCode + }); + try { + renderer.setRender(xandrOutstreamRenderer); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function xandrOutstreamRenderer(bid) { + const { + width, + height, + adUnitCode, + vastXml + } = bid; + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [width, height], + targetId: adUnitCode, + rendererOptions: { + showBigPlayButton: false, + showProgressBar: 'bar', + content: vastXml, + showVolume: false, + allowFullscreen: true, + skippable: false + } + }); + }); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('mediaConsortiumBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediaConsortiumBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediabramaBidAdapter"],{ + +/***/ "./modules/mediabramaBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/mediabramaBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/precisoUtils/bidUtilsCommon.js */ "./libraries/precisoUtils/bidUtilsCommon.js"); + + + + +const BIDDER_CODE = 'mediabrama'; +const AD_URL = 'https://prebid.mediabrama.com/pbjs'; +const SYNC_URL = 'https://prebid.mediabrama.com/sync'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.buildBidRequests)(AD_URL), + interpretResponse: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + return (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.buildUserSyncs)(syncOptions, serverResponses, gdprConsent, uspConsent, SYNC_URL); + }, + onBidWon: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.bidWinReport +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('mediabramaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["precisoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediabramaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediaeyesBidAdapter"],{ + +/***/ "./modules/mediaeyesBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/mediaeyesBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + +const ENDPOINT_URL = 'https://delivery.upremium.asia/ortb/open/auction'; +const spec = { + code: 'mediaeyes', + supportedMediaTypes: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + isBidRequestValid: bid => { + return !!bid.params.itemId; + }, + buildRequests: (bidRequests, bidderRequest) => { + let requests = []; + bidRequests.map(bidRequest => { + let { + itemId + } = bidRequest.params; + let requestData = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + imp: [cookingImp(bidRequest)], + device: bidRequest.ortb2?.device, + site: bidRequest.ortb2?.site + }; + requests.push({ + method: 'POST', + url: ENDPOINT_URL + "?item_id=" + itemId, + data: JSON.stringify(requestData) + }); + }); + return requests; + }, + interpretResponse: (serverResponse, serverRequest) => { + let response = serverResponse.body; + if (!response.seatbid) { + return []; + } + let rtbBids = response.seatbid.map(seatbid => seatbid.bid).reduce((a, b) => a.concat(b), []); + let data = rtbBids.map(rtbBid => { + let prBid = { + requestId: rtbBid.impid, + cpm: rtbBid.price, + creativeId: rtbBid.crid, + currency: response.cur || 'USD', + ttl: 360, + netRevenue: true + }; + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + prBid.width = rtbBid.w; + prBid.height = rtbBid.h; + prBid.ad = rtbBid.adm; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(rtbBid.adomain)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(prBid, 'meta.advertiserDomains', rtbBid.adomain); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(rtbBid.ext)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(rtbBid.ext.advertiser_id)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(prBid, 'meta.advertiserId', rtbBid.ext.advertiser_id); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(rtbBid.ext.advertiser_name)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(prBid, 'meta.advertiserName', rtbBid.ext.advertiser_name); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(rtbBid.ext.agency_name)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(prBid, 'meta.agencyName', rtbBid.ext.agency_name); + } + } + return prBid; + }); + return data; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +function cookingImp(bidReq) { + let imp = {}; + if (bidReq) { + const bidfloor = getBidFloor(bidReq); + if (bidfloor) { + imp.bidfloor = parseFloat(bidfloor); + imp.bidfloorcur = 'USD'; + } + imp.id = bidReq.bidId; + imp.bidfloor = bidfloor; + imp.banner = cookImpBanner(bidReq); + } + return imp; +} +const cookImpBanner = _ref => { + let { + mediaTypes, + params + } = _ref; + if (!mediaTypes?.banner) return {}; + const { + sizes + } = mediaTypes.banner; + return { + w: sizes[0][0], + h: sizes[0][1] + }; +}; +function getBidFloor(bidRequest) { + let bidfloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'params.bidFloor', 0); + if (!bidfloor && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.getFloor)) { + let floor = bidRequest.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor)) { + bidfloor = floor.floor; + } + } + return bidfloor; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('mediaeyesBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediaeyesBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediafilterRtdProvider"],{ + +/***/ "./modules/mediafilterRtdProvider.js": +/*!*******************************************!*\ + !*** ./modules/mediafilterRtdProvider.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MEDIAFILTER_EVENT_TYPE, MEDIAFILTER_BASE_URL, MediaFilter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the Media Filter real-time ad monitoring and protection module. + * + * The {@link module:modules/realTimeData} module is required + * + * For more information, visit {@link https://www.themediatrust.com The Media Trust}. + * + * @author Mirnes Cajlakovic + * @module modules/mediafilterRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + +/** The event type for Media Filter. */ +const MEDIAFILTER_EVENT_TYPE = 'com.mediatrust.pbjs.'; +/** The base URL for Media Filter scripts. */ +const MEDIAFILTER_BASE_URL = 'https://scripts.webcontentassessor.com/scripts/'; +const MediaFilter = { + /** + * Registers the Media Filter as a submodule of real-time data. + */ + register: function () { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.submodule)('realTimeData', { + 'name': 'mediafilter', + 'init': this.generateInitHandler() + }); + }, + /** + * Sets up the Media Filter by initializing event listeners and loading the external script. + * @param {object} configuration - The configuration object. + */ + setup: function (configuration) { + this.setupEventListener(configuration.configurationHash); + this.setupScript(configuration.configurationHash); + }, + /** + * Sets up an event listener for Media Filter messages. + * @param {string} configurationHash - The configuration hash. + */ + setupEventListener: function (configurationHash) { + window.addEventListener('message', this.generateEventHandler(configurationHash)); + }, + /** + * Loads the Media Filter script based on the provided configuration hash. + * @param {string} configurationHash - The configuration hash. + */ + setupScript: function (configurationHash) { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_1__.loadExternalScript)(MEDIAFILTER_BASE_URL.concat(configurationHash), _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, 'mediafilter', () => {}); + }, + /** + * Generates an event handler for Media Filter messages. + * @param {string} configurationHash - The configuration hash. + * @returns {function} The generated event handler. + */ + generateEventHandler: function (configurationHash) { + return windowEvent => { + if (windowEvent.data.type === MEDIAFILTER_EVENT_TYPE.concat('.', configurationHash)) { + _src_events_js__WEBPACK_IMPORTED_MODULE_3__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BILLABLE_EVENT, { + 'billingId': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.generateUUID)(), + 'configurationHash': configurationHash, + 'type': 'impression', + 'vendor': 'mediafilter' + }); + } + }; + }, + /** + * Generates an initialization handler for Media Filter. + * @returns {function} The generated init handler. + */ + generateInitHandler: function () { + return configuration => { + try { + this.setup(configuration); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`Error in initialization: ${error.message}`); + } + }; + } +}; + +// Register the module +MediaFilter.register(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('mediafilterRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediafilterRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediaforceBidAdapter"],{ + +/***/ "./modules/mediaforceBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/mediaforceBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, resolveFloor */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/mediaTypes.js').MediaType} MediaType + * @typedef {import('../src/utils.js').MediaTypes} MediaTypes + * @typedef {import('../modules/priceFloors.js').getFloor} GetFloor + */ + +/** + * @typedef {Object} AdditionalBidRequestFields + * @property {GetFloor} [getFloor] - Function for retrieving dynamic bid floor based on mediaType and size + * @property {MediaTypes} [mediaTypes] - Media types defined for the ad unit (e.g., banner, video, native) + */ + +/** + * @typedef {BidRequest & AdditionalBidRequestFields} ExtendedBidRequest + */ + +const BIDDER_CODE = 'mediaforce'; +const ENDPOINT_URL = 'https://rtb.mfadsrvr.com/header_bid'; +const TEST_ENDPOINT_URL = 'https://rtb.mfadsrvr.com/header_bid?debug_key=abcdefghijklmnop'; +const NATIVE_ID_MAP = {}; +const NATIVE_PARAMS = { + title: { + id: 1, + name: 'title' + }, + icon: { + id: 2, + type: 1, + name: 'img' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + body: { + id: 4, + name: 'data', + type: 2 + }, + sponsoredBy: { + id: 5, + name: 'data', + type: 1 + }, + cta: { + id: 6, + type: 12, + name: 'data' + }, + body2: { + id: 7, + name: 'data', + type: 10 + }, + rating: { + id: 8, + name: 'data', + type: 3 + }, + likes: { + id: 9, + name: 'data', + type: 4 + }, + downloads: { + id: 10, + name: 'data', + type: 5 + }, + displayUrl: { + id: 11, + name: 'data', + type: 11 + }, + price: { + id: 12, + name: 'data', + type: 6 + }, + salePrice: { + id: 13, + name: 'data', + type: 7 + }, + address: { + id: 14, + name: 'data', + type: 9 + }, + phone: { + id: 15, + name: 'data', + type: 8 + } +}; +Object.keys(NATIVE_PARAMS).forEach(key => { + NATIVE_ID_MAP[NATIVE_PARAMS[key].id] = key; +}); +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const DEFAULT_CURRENCY = 'USD'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(typeof bid.params === 'object' && bid.params.placement_id && bid.params.publisher_id); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {bidderRequest} bidderRequest bidder request object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + if (validBidRequests.length === 0) { + return; + } + + // TODO: is 'ref' the right value here? + const referer = bidderRequest && bidderRequest.refererInfo ? encodeURIComponent(bidderRequest.refererInfo.ref) : ''; + const auctionId = bidderRequest && bidderRequest.auctionId; + const timeout = bidderRequest && bidderRequest.timeout; + const dnt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDNT)() ? 1 : 0; + const requestsMap = {}; + const requests = []; + let isTest = false; + validBidRequests.forEach(bid => { + isTest = isTest || bid.params.is_test; + let tagid = bid.params.placement_id; + let bidfloor = resolveFloor(bid); + let validImp = false; + let impObj = { + id: bid.bidId, + tagid: tagid, + secure: window.location.protocol === 'https:' ? 1 : 0, + bidfloor: bidfloor, + ext: { + mediaforce: { + transactionId: bid.ortb2Imp?.ext?.tid + } + } + }; + Object.keys(bid.mediaTypes).forEach(mediaType => { + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + impObj.banner = createBannerRequest(bid); + validImp = true; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + impObj.native = createNativeRequest(bid); + validImp = true; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + impObj.video = createVideoRequest(bid); + validImp = true; + break; + } + }); + let request = requestsMap[bid.params.publisher_id]; + if (!request) { + request = { + id: Math.round(Math.random() * 1e16).toString(16), + site: { + // TODO: this should probably look at refererInfo + page: window.location.href, + ref: referer, + id: bid.params.publisher_id, + publisher: { + id: bid.params.publisher_id + } + }, + device: { + ua: navigator.userAgent, + js: 1, + dnt: dnt, + language: getLanguage() + }, + ext: { + mediaforce: { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + hb_key: auctionId + } + }, + tmax: timeout, + imp: [] + }; + requestsMap[bid.params.publisher_id] = request; + requests.push({ + method: 'POST', + url: ENDPOINT_URL, + data: request + }); + } + if (validImp && impObj) request.imp.push(impObj); + }); + requests.forEach(req => { + if (isTest) { + req.url = TEST_ENDPOINT_URL; + } + req.data = JSON.stringify(req.data); + }); + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse || !serverResponse.body) { + return []; + } + const responseBody = serverResponse.body; + const bidResponses = []; + const cur = responseBody.cur; + responseBody.seatbid.forEach(bids => { + bids.bid.forEach(serverBid => { + const bid = { + requestId: serverBid.impid, + cpm: parseFloat(serverBid.price), + creativeId: serverBid.adid, + currency: cur, + netRevenue: true, + ttl: serverBid.ttl || 300, + meta: { + advertiserDomains: serverBid.adomain ? serverBid.adomain : [] + }, + burl: serverBid.burl + }; + if (serverBid.dealid) { + bid.dealId = serverBid.dealid; + } + let jsonAdm; + let adm = serverBid.adm; + let ext = serverBid.ext; + try { + jsonAdm = JSON.parse(adm); + } catch (err) {} + if (jsonAdm && jsonAdm.native) { + ext = ext || {}; + ext.native = jsonAdm.native; + adm = null; + } + if (ext?.native) { + bid.native = parseNative(ext.native); + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } else if (adm?.trim().startsWith(' { + const { + id, + img, + data, + title + } = asset; + const key = NATIVE_ID_MAP[id]; + if (key) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(title)) { + result.title = title.text; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(img)) { + result[key] = { + url: img.url, + height: img.h, + width: img.w + }; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(data)) { + result[key] = data.value; + } + } + }); + return result; +} +function createNativeRequest(bid) { + const assets = []; + if (bid.nativeParams) { + Object.keys(bid.nativeParams).forEach(key => { + if (NATIVE_PARAMS[key]) { + const { + name, + type, + id + } = NATIVE_PARAMS[key]; + const assetObj = type ? { + type + } : {}; + let { + len, + sizes, + required, + aspect_ratios: aRatios + } = bid.nativeParams[key]; + if (len) { + assetObj.len = len; + } + if (aRatios && aRatios[0]) { + aRatios = aRatios[0]; + let wmin = aRatios.min_width || 0; + let hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0; + assetObj.wmin = wmin; + assetObj.hmin = hmin; + } + if (sizes && sizes.length) { + sizes = [].concat(...sizes); + assetObj.w = sizes[0]; + assetObj.h = sizes[1]; + } + const asset = { + required: required ? 1 : 0, + id + }; + asset[name] = assetObj; + assets.push(asset); + } + }); + } + return { + ver: '1.2', + request: { + assets: assets, + context: 1, + plcmttype: 1, + ver: '1.2' + } + }; +} +function createVideoRequest(bid) { + const video = bid.mediaTypes.video; + if (!video || !video.playerSize) return; + const playerSize = Array.isArray(video.playerSize[0]) ? video.playerSize[0] // [[640, 480], [300, 250]] -> use first size + : video.playerSize; // [640, 480] + + const videoRequest = { + mimes: video.mimes || ['video/mp4'], + minduration: video.minduration || 1, + maxduration: video.maxduration || 60, + protocols: video.protocols || [2, 3, 5, 6], + w: playerSize[0], + h: playerSize[1], + startdelay: video.startdelay || 0, + linearity: video.linearity || 1, + skip: video.skip != null ? video.skip : 0, + skipmin: video.skipmin || 5, + skipafter: video.skipafter || 10, + playbackmethod: video.playbackmethod || [1], + api: video.api || [1, 2] + }; + if (video.placement) { + videoRequest.placement = video.placement; + } + return videoRequest; +} + +/** + * Returns the highest applicable bid floor for a given bid request. + * + * Considers: + * - 0 + * - floors from resolveFloor() API (if available) + * - static bid.params.bidfloor (if provided) + * + * @param {ExtendedBidRequest} bid - The bid object + * @returns {number} - Highest bid floor found + */ +function resolveFloor(bid) { + const floors = [0]; + if (typeof bid.getFloor === 'function') { + for (const mediaType of SUPPORTED_MEDIA_TYPES) { + const mediaTypeDef = bid.mediaTypes?.[mediaType]; + if (mediaTypeDef) { + const sizes = getMediaTypeSizes(mediaType, mediaTypeDef) || ['*']; + for (const size of sizes) { + const floorInfo = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType, + size + }); + if (typeof floorInfo?.floor === 'number') { + floors.push(floorInfo.floor); + } + } + } + } + } + if (typeof bid.params?.bidfloor === 'number') { + floors.push(bid.params.bidfloor); + } + return Math.max(...floors); +} + +/** + * Extracts and normalizes sizes for a given media type. + * + * @param {MediaType} mediaType - The type of media (banner, video, native) + * @param {Object} mediaTypeDef - Definition object for the media type + * @returns {(number[]|string)[]} An array of sizes or undefined + */ +function getMediaTypeSizes(mediaType, mediaTypeDef) { + let sizes; + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + sizes = mediaTypeDef.sizes; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + sizes = mediaTypeDef.playerSize; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + break; + // native usually doesn't define sizes + } + if (!sizes) return undefined; + return Array.isArray(sizes[0]) ? sizes : [sizes]; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('mediaforceBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediaforceBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediafuseBidAdapter"],{ + +/***/ "./modules/mediafuseBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/mediafuseBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_categoryTranslationMapping_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../libraries/categoryTranslationMapping/index.js */ "./libraries/categoryTranslationMapping/index.js"); +/* harmony import */ var _libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/appnexusUtils/anKeywords.js */ "./libraries/appnexusUtils/anKeywords.js"); +/* harmony import */ var _libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/appnexusUtils/anUtils.js */ "./libraries/appnexusUtils/anUtils.js"); +/* harmony import */ var _libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../libraries/chunk/chunk.js */ "./libraries/chunk/chunk.js"); + + + + + + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'mediafuse'; +const URL = 'https://ib.adnxs.com/ut/v3/prebid'; +const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid'; +const VIDEO_TARGETING = ['id', 'minduration', 'maxduration', 'skippable', 'playback_method', 'frameworks', 'context', 'skipoffset']; +const VIDEO_RTB_TARGETING = ['minduration', 'maxduration', 'skip', 'skipafter', 'playbackmethod', 'api']; +const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language']; +const APP_DEVICE_PARAMS = ['device_id']; // appid is collected separately +const DEBUG_PARAMS = ['enabled', 'dongle', 'member_id', 'debug_timeout']; +const VIDEO_MAPPING = { + playback_method: { + 'unknown': 0, + 'auto_play_sound_on': 1, + 'auto_play_sound_off': 2, + 'click_to_play': 3, + 'mouse_over': 4, + 'auto_play_sound_unknown': 5 + }, + context: { + 'unknown': 0, + 'pre_roll': 1, + 'mid_roll': 2, + 'post_roll': 3, + 'outstream': 4, + 'in-banner': 5 + } +}; +const NATIVE_MAPPING = { + body: 'description', + body2: 'desc2', + cta: 'ctatext', + image: { + serverName: 'main_image', + requiredParams: { + required: true + } + }, + icon: { + serverName: 'icon', + requiredParams: { + required: true + } + }, + sponsoredBy: 'sponsored_by', + privacyLink: 'privacy_link', + salePrice: 'saleprice', + displayUrl: 'displayurl' +}; +const SOURCE = 'pbjs'; +const MAX_IMPS_PER_REQUEST = 15; +const SCRIPT_TAG_START = ' (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(USER_PARAMS, param)).forEach(param => { + let uparam = (0,_libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_5__.convertCamelToUnderscore)(param); + if (param === 'segments' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(userObjBid.params.user[param])) { + let segs = []; + userObjBid.params.user[param].forEach(val => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isNumber)(val)) { + segs.push({ + 'id': val + }); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(val)) { + segs.push(val); + } + }); + userObj[uparam] = segs; + } else if (param !== 'segments') { + userObj[uparam] = userObjBid.params.user[param]; + } + }); + } + const appDeviceObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidRequests, hasAppDeviceInfo); + let appDeviceObj; + if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app) { + appDeviceObj = {}; + Object.keys(appDeviceObjBid.params.app).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(APP_DEVICE_PARAMS, param)).forEach(param => appDeviceObj[param] = appDeviceObjBid.params.app[param]); + } + const appIdObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidRequests, hasAppId); + let appIdObj; + if (appIdObjBid && appIdObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) { + appIdObj = { + appid: appIdObjBid.params.app.id + }; + } + let debugObj = {}; + let debugObjParams = {}; + const debugCookieName = 'apn_prebid_debug'; + const debugCookie = storage.getCookie(debugCookieName) || null; + if (debugCookie) { + try { + debugObj = JSON.parse(debugCookie); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)('MediaFuse Debug Auction Cookie Error:\n\n' + e); + } + } else { + const debugBidRequest = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidRequests, hasDebug); + if (debugBidRequest && debugBidRequest.debug) { + debugObj = debugBidRequest.debug; + } + } + if (debugObj && debugObj.enabled) { + Object.keys(debugObj).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(DEBUG_PARAMS, param)).forEach(param => { + debugObjParams[param] = debugObj[param]; + }); + } + const memberIdBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidRequests, hasMemberId); + const member = memberIdBid ? parseInt(memberIdBid.params.member, 10) : 0; + const schain = bidRequests[0].schain; + const omidSupport = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidRequests, hasOmidSupport); + const payload = { + tags: [...tags], + user: userObj, + sdk: { + source: SOURCE, + version: "9.45.0-pre" + }, + schain: schain + }; + if (omidSupport) { + payload['iab_support'] = { + omidpn: 'Mediafuse', + omidpv: "9.45.0-pre" + }; + } + if (member > 0) { + payload.member_id = member; + } + if (appDeviceObjBid) { + payload.device = appDeviceObj; + } + if (appIdObjBid) { + payload.app = appIdObj; + } + let mfKeywords = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('mediafuseAuctionKeywords'); + payload.keywords = (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_7__.getANKeywordParam)(bidderRequest?.ortb2, mfKeywords); + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('adpod.brandCategoryExclusion')) { + payload.brand_category_uniqueness = true; + } + if (debugObjParams.enabled) { + payload.debug = debugObjParams; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)('MediaFuse Debug Auction Settings:\n\n' + JSON.stringify(debugObjParams, null, 4)); + } + if (bidderRequest && bidderRequest.gdprConsent) { + // note - objects for impbus use underscore instead of camelCase + payload.gdpr_consent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + if (bidderRequest.gdprConsent.addtlConsent && bidderRequest.gdprConsent.addtlConsent.indexOf('~') !== -1) { + let ac = bidderRequest.gdprConsent.addtlConsent; + // pull only the ids from the string (after the ~) and convert them to an array of ints + let acStr = ac.substring(ac.indexOf('~') + 1); + payload.gdpr_consent.addtl_consent = acStr.split('.').map(id => parseInt(id, 10)); + } + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.refererInfo) { + let refererinfo = { + // TODO: this collects everything it finds, except for canonicalUrl + rd_ref: encodeURIComponent(bidderRequest.refererInfo.topmostLocation), + rd_top: bidderRequest.refererInfo.reachedTop, + rd_ifs: bidderRequest.refererInfo.numIframes, + rd_stk: bidderRequest.refererInfo.stack.map(url => encodeURIComponent(url)).join(',') + }; + payload.referrer_detection = refererinfo; + } + const hasAdPodBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidRequests, hasAdPod); + if (hasAdPodBid) { + bidRequests.filter(hasAdPod).forEach(adPodBid => { + const adPodTags = createAdPodRequest(tags, adPodBid); + // don't need the original adpod placement because it's in adPodTags + const nonPodTags = payload.tags.filter(tag => tag.uuid !== adPodBid.bidId); + payload.tags = [...nonPodTags, ...adPodTags]; + }); + } + if (bidRequests[0].userId) { + let eids = []; + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidRequests[0], `userId.criteoId`), 'criteo.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidRequests[0], `userId.netId`), 'netid.de', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidRequests[0], `userId.idl_env`), 'liveramp.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidRequests[0], `userId.tdid`), 'adserver.org', 'TDID'); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidRequests[0], `userId.uid2.id`), 'uidapi.com', 'UID2'); + if (eids.length) { + payload.eids = eids; + } + } + if (tags[0].publisher_id) { + payload.publisher_id = tags[0].publisher_id; + } + const request = formatRequest(payload, bidderRequest); + return request; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + const bids = []; + if (!serverResponse || serverResponse.error) { + let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`; + if (serverResponse && serverResponse.error) { + errorMessage += `: ${serverResponse.error}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(errorMessage); + return bids; + } + if (serverResponse.tags) { + serverResponse.tags.forEach(serverBid => { + const rtbBid = getRtbBid(serverBid); + if (rtbBid) { + const cpmCheck = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_9__.bidderSettings.get(bidderRequest.bidderCode, 'allowZeroCpmBids') === true ? rtbBid.cpm >= 0 : rtbBid.cpm > 0; + if (cpmCheck && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(this.supportedMediaTypes, rtbBid.ad_type)) { + const bid = newBid(serverBid, rtbBid, bidderRequest); + bid.mediaType = parseMediaType(rtbBid); + bids.push(bid); + } + } + }); + } + if (serverResponse.debug && serverResponse.debug.debug_info) { + let debugHeader = 'MediaFuse Debug Auction for Prebid\n\n'; + let debugText = debugHeader + serverResponse.debug.debug_info; + debugText = debugText.replace(/(|)/gm, '\t') // Tables + .replace(/(<\/td>|<\/th>)/gm, '\n') // Tables + .replace(/^
/gm, '') // Remove leading
+ .replace(/(
\n|
)/gm, '\n') //
+ .replace(/

(.*)<\/h1>/gm, '\n\n===== $1 =====\n\n') // Header H1 + .replace(/(.*)<\/h[2-6]>/gm, '\n\n*** $1 ***\n\n') // Headers + .replace(/(<([^>]+)>)/igm, ''); // Remove any other tags + // logMessage('https://console.appnexus.com/docs/understanding-the-debug-auction'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)(debugText); + } + return bids; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent) { + if (syncOptions.iframeEnabled && (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_10__.hasPurpose1Consent)({ + gdprConsent + })) { + return [{ + type: 'iframe', + url: 'https://acdn.adnxs.com/dmp/async_usersync.html' + }]; + } + }, + /** + * Add element selector to javascript tracker to improve native viewability + * @param {Bid} bid + */ + onBidWon: function (bid) { + if (bid.native) { + reloadViewabilityScriptWithCorrectParameters(bid); + } + } +}; +function reloadViewabilityScriptWithCorrectParameters(bid) { + let viewJsPayload = getMediafuseViewabilityScriptFromJsTrackers(bid.native.javascriptTrackers); + if (viewJsPayload) { + let prebidParams = 'pbjs_adid=' + bid.adId + ';pbjs_auc=' + bid.adUnitCode; + let jsTrackerSrc = getViewabilityScriptUrlFromPayload(viewJsPayload); + let newJsTrackerSrc = jsTrackerSrc.replace('dom_id=%native_dom_id%', prebidParams); + + // find iframe containing script tag + let frameArray = document.getElementsByTagName('iframe'); + + // boolean var to modify only one script. That way if there are muliple scripts, + // they won't all point to the same creative. + let modifiedAScript = false; + + // first, loop on all ifames + for (let i = 0; i < frameArray.length && !modifiedAScript; i++) { + let currentFrame = frameArray[i]; + try { + // IE-compatible, see https://stackoverflow.com/a/3999191/2112089 + let nestedDoc = currentFrame.contentDocument || currentFrame.contentWindow.document; + if (nestedDoc) { + // if the doc is present, we look for our jstracker + let scriptArray = nestedDoc.getElementsByTagName('script'); + for (let j = 0; j < scriptArray.length && !modifiedAScript; j++) { + let currentScript = scriptArray[j]; + if (currentScript.getAttribute('data-src') == jsTrackerSrc) { + currentScript.setAttribute('src', newJsTrackerSrc); + currentScript.setAttribute('data-src', ''); + if (currentScript.removeAttribute) { + currentScript.removeAttribute('data-src'); + } + modifiedAScript = true; + } + } + } + } catch (exception) { + // trying to access a cross-domain iframe raises a SecurityError + // this is expected and ignored + if (!(exception instanceof DOMException && exception.name === 'SecurityError')) { + // all other cases are raised again to be treated by the calling function + throw exception; + } + } + } + } +} +function strIsMediafuseViewabilityScript(str) { + let regexMatchUrlStart = str.match(VIEWABILITY_URL_START); + let viewUrlStartInStr = regexMatchUrlStart != null && regexMatchUrlStart.length >= 1; + let regexMatchFileName = str.match(VIEWABILITY_FILE_NAME); + let fileNameInStr = regexMatchFileName != null && regexMatchFileName.length >= 1; + return str.startsWith(SCRIPT_TAG_START) && fileNameInStr && viewUrlStartInStr; +} +function getMediafuseViewabilityScriptFromJsTrackers(jsTrackerArray) { + let viewJsPayload; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(jsTrackerArray) && strIsMediafuseViewabilityScript(jsTrackerArray)) { + viewJsPayload = jsTrackerArray; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(jsTrackerArray)) { + for (let i = 0; i < jsTrackerArray.length; i++) { + let currentJsTracker = jsTrackerArray[i]; + if (strIsMediafuseViewabilityScript(currentJsTracker)) { + viewJsPayload = currentJsTracker; + } + } + } + return viewJsPayload; +} +function getViewabilityScriptUrlFromPayload(viewJsPayload) { + // extracting the content of the src attribute + // -> substring between src=" and " + let indexOfFirstQuote = viewJsPayload.indexOf('src="') + 5; // offset of 5: the length of 'src=' + 1 + let indexOfSecondQuote = viewJsPayload.indexOf('"', indexOfFirstQuote); + let jsTrackerSrc = viewJsPayload.substring(indexOfFirstQuote, indexOfSecondQuote); + return jsTrackerSrc; +} +function formatRequest(payload, bidderRequest) { + let request = []; + let options = { + withCredentials: true + }; + let endpointUrl = URL; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_10__.hasPurpose1Consent)(bidderRequest?.gdprConsent)) { + endpointUrl = URL_SIMPLE; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getParameterByName)('apn_test').toUpperCase() === 'TRUE' || _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('apn_test') === true) { + options.customHeaders = { + 'X-Is-Test': 1 + }; + } + if (payload.tags.length > MAX_IMPS_PER_REQUEST) { + const clonedPayload = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(payload); + (0,_libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_11__.chunk)(payload.tags, MAX_IMPS_PER_REQUEST).forEach(tags => { + clonedPayload.tags = tags; + const payloadString = JSON.stringify(clonedPayload); + request.push({ + method: 'POST', + url: endpointUrl, + data: payloadString, + bidderRequest, + options + }); + }); + } else { + const payloadString = JSON.stringify(payload); + request = { + method: 'POST', + url: endpointUrl, + data: payloadString, + bidderRequest, + options + }; + } + return request; +} +function newRenderer(adUnitCode, rtbBid) { + let rendererOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_12__.Renderer.install({ + id: rtbBid.renderer_id, + url: rtbBid.renderer_url, + config: rendererOptions, + loaded: false, + adUnitCode + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)('Prebid Error calling setRender on renderer', err); + } + renderer.setEventHandlers({ + impression: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)('MediaFuse outstream video impression event'), + loaded: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)('MediaFuse outstream video loaded event'), + ended: () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logMessage)('MediaFuse outstream renderer video event'); + document.querySelector(`#${adUnitCode}`).style.display = 'none'; + } + }); + return renderer; +} + +/** + * Unpack the Server's Bid into a Prebid-compatible one. + * @param serverBid + * @param rtbBid + * @param bidderRequest + * @return Bid + */ +function newBid(serverBid, rtbBid, bidderRequest) { + const bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getBidRequest)(serverBid.uuid, [bidderRequest]); + const bid = { + requestId: serverBid.uuid, + cpm: rtbBid.cpm, + creativeId: rtbBid.creative_id, + dealId: rtbBid.deal_id, + currency: 'USD', + netRevenue: true, + ttl: 300, + adUnitCode: bidRequest.adUnitCode, + mediafuse: { + buyerMemberId: rtbBid.buyer_member_id, + dealPriority: rtbBid.deal_priority, + dealCode: rtbBid.deal_code + } + }; + + // WE DON'T FULLY SUPPORT THIS ATM - future spot for adomain code; creating a stub for 5.0 compliance + if (rtbBid.adomain) { + bid.meta = Object.assign({}, bid.meta, { + advertiserDomains: [] + }); + } + if (rtbBid.advertiser_id) { + bid.meta = Object.assign({}, bid.meta, { + advertiserId: rtbBid.advertiser_id + }); + } + + // temporary function; may remove at later date if/when adserver fully supports dchain + function setupDChain(rtbBid) { + let dchain = { + ver: '1.0', + complete: 0, + nodes: [{ + bsid: rtbBid.buyer_member_id.toString() + }] + }; + return dchain; + } + if (rtbBid.buyer_member_id) { + bid.meta = Object.assign({}, bid.meta, { + dchain: setupDChain(rtbBid) + }); + } + if (rtbBid.brand_id) { + bid.meta = Object.assign({}, bid.meta, { + brandId: rtbBid.brand_id + }); + } + if (rtbBid.rtb.video) { + // shared video properties used for all 3 contexts + Object.assign(bid, { + width: rtbBid.rtb.video.player_width, + height: rtbBid.rtb.video.player_height, + vastImpUrl: rtbBid.notify_url, + ttl: 3600 + }); + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bidRequest, 'mediaTypes.video.context'); + switch (videoContext) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.ADPOD: + const primaryCatId = _libraries_categoryTranslationMapping_index_js__WEBPACK_IMPORTED_MODULE_13__.APPNEXUS_CATEGORY_MAPPING[rtbBid.brand_category_id] ? _libraries_categoryTranslationMapping_index_js__WEBPACK_IMPORTED_MODULE_13__.APPNEXUS_CATEGORY_MAPPING[rtbBid.brand_category_id] : null; + bid.meta = Object.assign({}, bid.meta, { + primaryCatId + }); + const dealTier = rtbBid.deal_priority; + bid.video = { + context: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.ADPOD, + durationSeconds: Math.floor(rtbBid.rtb.video.duration_ms / 1000), + dealTier + }; + bid.vastUrl = rtbBid.rtb.video.asset_url; + break; + case _src_video_js__WEBPACK_IMPORTED_MODULE_14__.OUTSTREAM: + bid.adResponse = serverBid; + bid.adResponse.ad = bid.adResponse.ads[0]; + bid.adResponse.ad.video = bid.adResponse.ad.rtb.video; + bid.vastXml = rtbBid.rtb.video.content; + if (rtbBid.renderer_url) { + const videoBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(bidderRequest.bids, bid => bid.bidId === serverBid.uuid); + const rendererOptions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(videoBid, 'renderer.options'); + bid.renderer = newRenderer(bid.adUnitCode, rtbBid, rendererOptions); + } + break; + case _src_video_js__WEBPACK_IMPORTED_MODULE_14__.INSTREAM: + bid.vastUrl = rtbBid.notify_url + '&redir=' + encodeURIComponent(rtbBid.rtb.video.asset_url); + break; + } + } else if (rtbBid.rtb[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE]) { + const nativeAd = rtbBid.rtb[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE]; + + // setting up the jsTracker: + // we put it as a data-src attribute so that the tracker isn't called + // until we have the adId (see onBidWon) + let jsTrackerDisarmed = rtbBid.viewability.config.replace('src=', 'data-src='); + let jsTrackers = nativeAd.javascript_trackers; + if (jsTrackers == undefined) { + jsTrackers = jsTrackerDisarmed; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isStr)(jsTrackers)) { + jsTrackers = [jsTrackers, jsTrackerDisarmed]; + } else { + jsTrackers.push(jsTrackerDisarmed); + } + bid[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE] = { + title: nativeAd.title, + body: nativeAd.desc, + body2: nativeAd.desc2, + cta: nativeAd.ctatext, + rating: nativeAd.rating, + sponsoredBy: nativeAd.sponsored, + privacyLink: nativeAd.privacy_link, + address: nativeAd.address, + downloads: nativeAd.downloads, + likes: nativeAd.likes, + phone: nativeAd.phone, + price: nativeAd.price, + salePrice: nativeAd.saleprice, + clickUrl: nativeAd.link.url, + displayUrl: nativeAd.displayurl, + clickTrackers: nativeAd.link.click_trackers, + impressionTrackers: nativeAd.impression_trackers, + javascriptTrackers: jsTrackers + }; + if (nativeAd.main_img) { + bid['native'].image = { + url: nativeAd.main_img.url, + height: nativeAd.main_img.height, + width: nativeAd.main_img.width + }; + } + if (nativeAd.icon) { + bid['native'].icon = { + url: nativeAd.icon.url, + height: nativeAd.icon.height, + width: nativeAd.icon.width + }; + } + } else { + Object.assign(bid, { + width: rtbBid.rtb.banner.width, + height: rtbBid.rtb.banner.height, + ad: rtbBid.rtb.banner.content + }); + try { + if (rtbBid.rtb.trackers) { + for (let i = 0; i < rtbBid.rtb.trackers[0].impression_urls.length; i++) { + const url = rtbBid.rtb.trackers[0].impression_urls[i]; + const tracker = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.createTrackPixelHtml)(url); + bid.ad += tracker; + } + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)('Error appending tracking pixel', error); + } + } + return bid; +} +function bidToTag(bid) { + const tag = {}; + tag.sizes = transformSizes(bid.sizes); + tag.primary_size = tag.sizes[0]; + tag.ad_types = []; + tag.uuid = bid.bidId; + if (bid.params.placementId) { + tag.id = parseInt(bid.params.placementId, 10); + } else { + tag.code = bid.params.invCode; + } + tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false; + tag.use_pmt_rule = bid.params.usePaymentRule || false; + tag.prebid = true; + tag.disable_psa = true; + let bidFloor = getBidFloor(bid); + if (bidFloor) { + tag.reserve = bidFloor; + } + if (bid.params.position) { + tag.position = { + 'above': 1, + 'below': 2 + }[bid.params.position] || 0; + } + if (bid.params.trafficSourceCode) { + tag.traffic_source_code = bid.params.trafficSourceCode; + } + if (bid.params.privateSizes) { + tag.private_sizes = transformSizes(bid.params.privateSizes); + } + if (bid.params.supplyType) { + tag.supply_type = bid.params.supplyType; + } + if (bid.params.pubClick) { + tag.pubclick = bid.params.pubClick; + } + if (bid.params.extInvCode) { + tag.ext_inv_code = bid.params.extInvCode; + } + if (bid.params.publisherId) { + tag.publisher_id = parseInt(bid.params.publisherId, 10); + } + if (bid.params.externalImpId) { + tag.external_imp_id = bid.params.externalImpId; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(bid.params.keywords)) { + tag.keywords = (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_7__.getANKewyordParamFromMaps)(bid.params.keywords); + } + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + tag.gpid = gpid; + } + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE}`)) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE); + if (tag.sizes.length === 0) { + tag.sizes = transformSizes([1, 1]); + } + if (bid.nativeParams) { + const nativeRequest = buildNativeRequest(bid.nativeParams); + tag[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE] = { + layouts: [nativeRequest] + }; + } + } + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO}`); + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(bid, 'mediaTypes.video.context'); + if (videoMediaType && context === 'adpod') { + tag.hb_source = 7; + } else { + tag.hb_source = 1; + } + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO || videoMediaType) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO); + } + + // instream gets vastUrl, outstream gets vastXml + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO || videoMediaType && context !== 'outstream') { + tag.require_asset_url = true; + } + if (bid.params.video) { + tag.video = {}; + // place any valid video params on the tag + Object.keys(bid.params.video).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(VIDEO_TARGETING, param)).forEach(param => { + switch (param) { + case 'context': + case 'playback_method': + let type = bid.params.video[param]; + type = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(type) ? type[0] : type; + tag.video[param] = VIDEO_MAPPING[param][type]; + break; + // Deprecating tags[].video.frameworks in favor of tags[].video_frameworks + case 'frameworks': + break; + default: + tag.video[param] = bid.params.video[param]; + } + }); + if (bid.params.video.frameworks && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(bid.params.video.frameworks)) { + tag['video_frameworks'] = bid.params.video.frameworks; + } + } + + // use IAB ORTB values if the corresponding values weren't already set by bid.params.video + if (videoMediaType) { + tag.video = tag.video || {}; + Object.keys(videoMediaType).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(VIDEO_RTB_TARGETING, param)).forEach(param => { + switch (param) { + case 'minduration': + case 'maxduration': + if (typeof tag.video[param] !== 'number') tag.video[param] = videoMediaType[param]; + break; + case 'skip': + if (typeof tag.video['skippable'] !== 'boolean') tag.video['skippable'] = videoMediaType[param] === 1; + break; + case 'skipafter': + if (typeof tag.video['skipoffset'] !== 'number') tag.video['skippoffset'] = videoMediaType[param]; + break; + case 'playbackmethod': + if (typeof tag.video['playback_method'] !== 'number') { + let type = videoMediaType[param]; + type = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(type) ? type[0] : type; + + // we only support iab's options 1-4 at this time. + if (type >= 1 && type <= 4) { + tag.video['playback_method'] = type; + } + } + break; + case 'api': + if (!tag['video_frameworks'] && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(videoMediaType[param])) { + // need to read thru array; remove 6 (we don't support it), swap 4 <> 5 if found (to match our adserver mapping for these specific values) + let apiTmp = videoMediaType[param].map(val => { + let v = val === 4 ? 5 : val === 5 ? 4 : val; + if (v >= 1 && v <= 5) { + return v; + } + }).filter(v => v); + tag['video_frameworks'] = apiTmp; + } + break; + } + }); + } + if (bid.renderer) { + tag.video = Object.assign({}, tag.video, { + custom_renderer_present: true + }); + } + if (bid.params.frameworks && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(bid.params.frameworks)) { + tag['banner_frameworks'] = bid.params.frameworks; + } + if (bid.mediaTypes?.banner) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER); + } + if (tag.ad_types.length === 0) { + delete tag.ad_types; + } + return tag; +} + +/* Turn bid request sizes into ut-compatible format */ +function transformSizes(requestSizes) { + let sizes = []; + let sizeObj = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(requestSizes) && requestSizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(requestSizes[0])) { + sizeObj.width = parseInt(requestSizes[0], 10); + sizeObj.height = parseInt(requestSizes[1], 10); + sizes.push(sizeObj); + } else if (typeof requestSizes === 'object') { + for (let i = 0; i < requestSizes.length; i++) { + let size = requestSizes[i]; + sizeObj = {}; + sizeObj.width = parseInt(size[0], 10); + sizeObj.height = parseInt(size[1], 10); + sizes.push(sizeObj); + } + } + return sizes; +} +function hasUserInfo(bid) { + return !!bid.params.user; +} +function hasMemberId(bid) { + return !!parseInt(bid.params.member, 10); +} +function hasAppDeviceInfo(bid) { + if (bid.params) { + return !!bid.params.app; + } +} +function hasAppId(bid) { + if (bid.params && bid.params.app) { + return !!bid.params.app.id; + } + return !!bid.params.app; +} +function hasDebug(bid) { + return !!bid.debug; +} +function hasAdPod(bid) { + return bid.mediaTypes && bid.mediaTypes.video && bid.mediaTypes.video.context === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.ADPOD; +} +function hasOmidSupport(bid) { + let hasOmid = false; + const bidderParams = bid.params; + const videoParams = bid.params.video; + if (bidderParams.frameworks && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(bidderParams.frameworks)) { + hasOmid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(bid.params.frameworks, 6); + } + if (!hasOmid && videoParams && videoParams.frameworks && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(videoParams.frameworks)) { + hasOmid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(bid.params.video.frameworks, 6); + } + return hasOmid; +} + +/** + * Expand an adpod placement into a set of request objects according to the + * total adpod duration and the range of duration seconds. Sets minduration/ + * maxduration video property according to requireExactDuration configuration + */ +function createAdPodRequest(tags, adPodBid) { + const { + durationRangeSec, + requireExactDuration + } = adPodBid.mediaTypes.video; + const numberOfPlacements = getAdPodPlacementNumber(adPodBid.mediaTypes.video); + const maxDuration = Math.max(...durationRangeSec); + const tagToDuplicate = tags.filter(tag => tag.uuid === adPodBid.bidId); + let request = (0,_libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_5__.fill)(...tagToDuplicate, numberOfPlacements); + if (requireExactDuration) { + const divider = Math.ceil(numberOfPlacements / durationRangeSec.length); + const chunked = (0,_libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_11__.chunk)(request, divider); + + // each configured duration is set as min/maxduration for a subset of requests + durationRangeSec.forEach((duration, index) => { + chunked[index].map(tag => { + setVideoProperty(tag, 'minduration', duration); + setVideoProperty(tag, 'maxduration', duration); + }); + }); + } else { + // all maxdurations should be the same + request.map(tag => setVideoProperty(tag, 'maxduration', maxDuration)); + } + return request; +} +function getAdPodPlacementNumber(videoParams) { + const { + adPodDurationSec, + durationRangeSec, + requireExactDuration + } = videoParams; + const minAllowedDuration = Math.min(...durationRangeSec); + const numberOfPlacements = Math.floor(adPodDurationSec / minAllowedDuration); + return requireExactDuration ? Math.max(numberOfPlacements, durationRangeSec.length) : numberOfPlacements; +} +function setVideoProperty(tag, key, value) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(tag.video)) { + tag.video = {}; + } + tag.video[key] = value; +} +function getRtbBid(tag) { + return tag && tag.ads && tag.ads.length && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(tag.ads, ad => ad.rtb); +} +function buildNativeRequest(params) { + const request = {}; + + // map standard prebid native asset identifier to /ut parameters + // e.g., tag specifies `body` but /ut only knows `description`. + // mapping may be in form {tag: ''} or + // {tag: {serverName: '', requiredParams: {...}}} + Object.keys(params).forEach(key => { + // check if one of the forms is used, otherwise + // a mapping wasn't specified so pass the key straight through + const requestKey = NATIVE_MAPPING[key] && NATIVE_MAPPING[key].serverName || NATIVE_MAPPING[key] || key; + + // required params are always passed on request + const requiredParams = NATIVE_MAPPING[key] && NATIVE_MAPPING[key].requiredParams; + request[requestKey] = Object.assign({}, requiredParams, params[key]); + + // convert the sizes of image/icon assets to proper format (if needed) + const isImageAsset = !!(requestKey === NATIVE_MAPPING.image.serverName || requestKey === NATIVE_MAPPING.icon.serverName); + if (isImageAsset && request[requestKey].sizes) { + let sizes = request[requestKey].sizes; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArrayOfNums)(sizes) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArray)(sizes) && sizes.length > 0 && sizes.every(sz => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isArrayOfNums)(sz))) { + request[requestKey].sizes = transformSizes(request[requestKey].sizes); + } + } + if (requestKey === NATIVE_MAPPING.privacyLink) { + request.privacy_supported = true; + } + }); + return request; +} + +/** + * This function hides google div container for outstream bids to remove unwanted space on page. Mediafuse renderer creates a new iframe outside of google iframe to render the outstream creative. + * @param {string} elementId element id + */ +function hidedfpContainer(elementId) { + var el = document.getElementById(elementId).querySelectorAll("div[id^='google_ads']"); + if (el[0]) { + el[0].style.setProperty('display', 'none'); + } +} +function hideSASIframe(elementId) { + try { + // find script tag with id 'sas_script'. This ensures it only works if you're using Smart Ad Server. + const el = document.getElementById(elementId).querySelectorAll("script[id^='sas_script']"); + if (el[0].nextSibling && el[0].nextSibling.localName === 'iframe') { + el[0].nextSibling.style.setProperty('display', 'none'); + } + } catch (e) { + // element not found! + } +} +function outstreamRender(bid) { + hidedfpContainer(bid.adUnitCode); + hideSASIframe(bid.adUnitCode); + // push to render queue because ANOutstreamVideo may not be loaded + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + tagId: bid.adResponse.tag_id, + sizes: [bid.getSize().split('x')], + targetId: bid.adUnitCode, + // target div id to render video + uuid: bid.adResponse.uuid, + adResponse: bid.adResponse, + rendererOptions: bid.renderer.getConfig() + }, handleOutstreamRendererEvents.bind(null, bid)); + }); +} +function handleOutstreamRendererEvents(bid, id, eventName) { + bid.renderer.handleVideoEvent({ + id, + eventName + }); +} +function parseMediaType(rtbBid) { + const adType = rtbBid.ad_type; + if (adType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } else if (adType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } +} +function addUserId(eids, id, source, rti) { + if (id) { + if (rti) { + eids.push({ + source, + id, + rti_partner: rti + }); + } else { + eids.push({ + source, + id + }); + } + } + return eids; +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isFn)(bid.getFloor)) { + return bid.params.reserve ? bid.params.reserve : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_15__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_16__.registerModule)('mediafuseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","chunk","keywords","appnexusUtils","categoryTranslationMapping","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediafuseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediagoBidAdapter"],{ + +/***/ "./modules/mediagoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/mediagoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports THIRD_PARTY_COOKIE_ORIGIN, storage, COOKIE_KEY_MGUID, getPmgUID, getCurrentTimeToUTCString, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/fpdUtils/pageInfo.js */ "./libraries/fpdUtils/pageInfo.js"); +/* harmony import */ var _libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/fpdUtils/deviceInfo.js */ "./libraries/fpdUtils/deviceInfo.js"); +/* harmony import */ var _libraries_currencyUtils_floor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/currencyUtils/floor.js */ "./libraries/currencyUtils/floor.js"); +/* harmony import */ var _libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/sizeUtils/tranformSize.js */ "./libraries/sizeUtils/tranformSize.js"); +/* harmony import */ var _libraries_navigatorData_navigatorData_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/navigatorData/navigatorData.js */ "./libraries/navigatorData/navigatorData.js"); +/* harmony import */ var _libraries_cookieSync_cookieSync_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/cookieSync/cookieSync.js */ "./libraries/cookieSync/cookieSync.js"); + +/** + * gulp serve --modules=mediagoBidAdapter,pubCommonId --nolint --notest + */ + + + + + + + + + + + +// import { config } from '../src/config.js'; +// import { isPubcidEnabled } from './pubCommonId.js'; + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').mediaType} mediaType + */ + +const BIDDER_CODE = 'mediago'; +// const PROTOCOL = window.document.location.protocol; +const ENDPOINT_URL = 'https://gbid.mediago.io/api/bid?tn='; +// const COOKY_SYNC_URL = 'https://gtrace.mediago.io/ju/cs/eplist'; +const THIRD_PARTY_COOKIE_ORIGIN = 'https://cdn.mediago.io'; +const TIME_TO_LIVE = 500; +const GVLID = 1020; +// const ENDPOINT_URL = '/api/bid?tn='; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +let globals = {}; +let itemMaps = {}; + +/* ----- mguid:start ------ */ +const COOKIE_KEY_MGUID = '__mguid_'; +const COOKIE_KEY_PMGUID = '__pmguid_'; +const COOKIE_RETENTION_TIME = 365 * 24 * 60 * 60 * 1000; // 1 year +const COOKY_SYNC_IFRAME_URL = 'https://cdn.mediago.io/js/cookieSync.html'; +let reqTimes = 0; + +/** + * get pmg uid + * 获取并生成用户的id + * + * @return {string} + */ +const getPmgUID = () => { + if (!storage.cookiesAreEnabled()) return; + let pmgUid = storage.getCookie(COOKIE_KEY_PMGUID); + if (!pmgUid) { + pmgUid = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID(); + try { + storage.setCookie(COOKIE_KEY_PMGUID, pmgUid, getCurrentTimeToUTCString()); + } catch (e) {} + } + return pmgUid; +}; + +/* ----- pmguid:end ------ */ + +/** + * 获取一个对象的某个值,如果没有则返回空字符串 + * + * @param {Object} obj 对象 + * @param {...string} keys 键名 + * @return {any} + */ +function getProperty(obj) { + let o = obj; + for (var _len = arguments.length, keys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + keys[_key - 1] = arguments[_key]; + } + for (let key of keys) { + // console.log(key, o); + if (o && o[key]) { + o = o[key]; + } else { + return ''; + } + } + return o; +} + +/** + * 获取底价 + * @param {*} bid + * @param {*} mediaType + * @param {*} sizes + * @returns + */ +// function getBidFloor(bid, mediaType, sizes) { +// var floor; +// var size = sizes.length === 1 ? sizes[0] : '*'; +// if (typeof bid.getFloor === 'function') { +// const floorInfo = bid.getFloor({ currency: 'USD', mediaType, size }); +// if ( +// typeof floorInfo === 'object' && +// floorInfo.currency === 'USD' && +// !isNaN(parseFloat(floorInfo.floor)) +// ) { +// floor = parseFloat(floorInfo.floor); +// } +// } +// return floor; +// } + +// 支持的广告尺寸 +const mediagoAdSize = _libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_2__.normalAdSize; + +/** + * 获取广告位配置 + * @param {Array} validBidRequests an an array of bids + * @param {Object} bidderRequest The master bidRequest object + * @return {Object} + */ +function getItems(validBidRequests, bidderRequest) { + let items = []; + items = validBidRequests.map((req, i) => { + let ret = {}; + let mediaTypes = getProperty(req, 'mediaTypes'); + let sizes = (0,_libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_2__.transformSizes)(getProperty(req, 'sizes')); + let matchSize; + + // 确认尺寸是否符合我们要求 + for (let size of sizes) { + matchSize = mediagoAdSize.find(item => size.width === item.w && size.height === item.h); + if (matchSize) { + break; + } + } + if (!matchSize) { + matchSize = sizes[0] ? { + h: sizes[0].height || 0, + w: sizes[0].width || 0 + } : { + h: 0, + w: 0 + }; + } + const bidFloor = (0,_libraries_currencyUtils_floor_js__WEBPACK_IMPORTED_MODULE_3__.getBidFloor)(req); + const gpid = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](req, 'ortb2Imp.ext.gpid') || _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](req, 'ortb2Imp.ext.data.pbadslot') || _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](req, 'params.placementId', 0); + const gdprConsent = {}; + if (bidderRequest && bidderRequest.gdprConsent) { + gdprConsent.consent = bidderRequest.gdprConsent.consentString; + gdprConsent.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + // if (bidderRequest.gdprConsent.addtlConsent && bidderRequest.gdprConsent.addtlConsent.indexOf('~') !== -1) { + // let ac = bidderRequest.gdprConsent.addtlConsent; + // // pull only the ids from the string (after the ~) and convert them to an array of ints + // let acStr = ac.substring(ac.indexOf('~') + 1); + // gdpr_consent.addtl_consent = acStr.split('.').map(id => parseInt(id, 10)); + // } + } + + // if (mediaTypes.native) {} + // banner广告类型 + if (mediaTypes.banner) { + let id = '' + (i + 1); + ret = { + id: id, + bidfloor: bidFloor, + banner: { + h: matchSize.h, + w: matchSize.w, + pos: 1, + format: sizes + }, + ext: { + adUnitCode: req.adUnitCode, + referrer: (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getReferrer)(req, bidderRequest), + ortb2Imp: _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](req, 'ortb2Imp'), + // 传入完整对象,分析日志数据 + gpid: gpid, + // 加入后无法返回广告 + adslot: _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](req, 'ortb2Imp.ext.data.adserver.adslot', '', ''), + publisher: req.params.publisher || '', + ...gdprConsent // gdpr + }, + tagid: req.params && req.params.tagid + }; + itemMaps[id] = { + req, + ret + }; + } + return ret; + }); + return items; +} + +/** + * get current time to UTC string + * @returns utc string + */ +function getCurrentTimeToUTCString() { + const date = new Date(); + date.setTime(date.getTime() + COOKIE_RETENTION_TIME); + return date.toUTCString(); +} + +/** + * 获取rtb请求参数 + * + * @param {Array} validBidRequests an an array of bids + * @param {Object} bidderRequest The master bidRequest object + * @return {Object} + */ +function getParam(validBidRequests, bidderRequest) { + const pubcid = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](validBidRequests[0], 'crumbs.pubcid'); + const bidsUserIdAsEids = validBidRequests[0].userIdAsEids; + const eids = bidsUserIdAsEids; + const content = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidderRequest, 'ortb2.site.content'); + const cat = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidderRequest, 'ortb2.site.cat'); + reqTimes += 1; + let isMobile = (0,_libraries_fpdUtils_deviceInfo_js__WEBPACK_IMPORTED_MODULE_6__.getDevice)() ? 1 : 0; + // input test status by Publisher. more frequently for test true req + let isTest = validBidRequests[0].params.test || 0; + let auctionId = getProperty(bidderRequest, 'auctionId'); + let items = getItems(validBidRequests, bidderRequest); + const domain = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidderRequest, 'refererInfo.domain') || document.domain; + const location = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidderRequest, 'refererInfo.location'); + const page = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidderRequest, 'refererInfo.page'); + const referer = _src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"](bidderRequest, 'refererInfo.ref'); + const timeout = bidderRequest.timeout || 2000; + const firstPartyData = bidderRequest.ortb2; + const title = (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getPageTitle)(); + const desc = (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getPageDescription)(); + const keywords = (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getPageKeywords)(); + if (items && items.length) { + let c = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + id: 'mgprebidjs_' + auctionId, + test: +isTest, + at: 1, + cur: ['USD'], + device: { + connectiontype: 0, + // ip: '98.61.5.0', + js: 1, + // language: 'en', + // os: 'Microsoft Windows', + // ua: 'Mozilla/5.0 (Linux; Android 12; SM-G970U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36', + os: navigator.platform || '', + ua: navigator.userAgent, + language: /en/.test(navigator.language) ? 'en' : navigator.language + }, + ext: { + eids, + bidsUserIdAsEids, + firstPartyData, + content, + cat, + reqTimes, + pmguid: getPmgUID(), + page: { + title: title ? title.slice(0, 100) : undefined, + desc: desc ? desc.slice(0, 300) : undefined, + keywords: keywords ? keywords.slice(0, 100) : undefined, + hLen: (0,_libraries_navigatorData_navigatorData_js__WEBPACK_IMPORTED_MODULE_7__.getHLen)() + }, + device: { + nbw: (0,_libraries_fpdUtils_pageInfo_js__WEBPACK_IMPORTED_MODULE_5__.getConnectionDownLink)() + } + }, + user: { + buyeruid: storage.getCookie(COOKIE_KEY_MGUID) || undefined, + id: pubcid + }, + eids, + site: { + name: domain, + domain: domain, + page: page || location, + ref: referer, + mobile: isMobile, + cat: [], + // todo + publisher: { + id: globals['publisher'] + } + }, + imp: items, + tmax: timeout + }; + return c; + } else { + return null; + } +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + // aliases: ['ex'], // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // console.log('mediago', { + // bid + // }); + if (bid.params.token) { + globals['token'] = bid.params.token; + } + if (bid.params.publisher) { + globals['publisher'] = bid.params.publisher; + } + return !!bid.params.token; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests an an array of bids + * @param {Object} bidderRequest The master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let payload = getParam(validBidRequests, bidderRequest); + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL + globals['token'], + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bids = getProperty(serverResponse, 'body', 'seatbid', 0, 'bid'); + const cur = getProperty(serverResponse, 'body', 'cur'); + const bidResponses = []; + for (let bid of bids) { + let impid = getProperty(bid, 'impid'); + if (itemMaps[impid]) { + let bidId = getProperty(itemMaps[impid], 'req', 'bidId'); + const bidResponse = { + requestId: bidId, + cpm: getProperty(bid, 'price'), + width: getProperty(bid, 'w'), + height: getProperty(bid, 'h'), + creativeId: getProperty(bid, 'crid'), + dealId: '', + currency: cur, + netRevenue: true, + ttl: TIME_TO_LIVE, + // referrer: REFERER, + ad: getProperty(bid, 'adm'), + nurl: getProperty(bid, 'nurl') + // adserverTargeting: { + // granularityMultiplier: 0.1, + // priceGranularity: 'pbHg', + // pbMg: '0.01', + // }, + // pbMg: '0.01', + // granularityMultiplier: 0.1, + // priceGranularity: 'pbHg', + }; + bidResponses.push(bidResponse); + } + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponse, gdprConsent, uspConsent, gppConsent) { + return (0,_libraries_cookieSync_cookieSync_js__WEBPACK_IMPORTED_MODULE_8__.cookieSync)(syncOptions, gdprConsent, uspConsent, BIDDER_CODE, THIRD_PARTY_COOKIE_ORIGIN, COOKY_SYNC_IFRAME_URL, getCurrentTimeToUTCString()); + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {Object} data Containing timeout specific data + */ + // onTimeout: function (data) { + // // console.log('onTimeout', data); + // // Bidder specifc code + // }, + + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Object} bid The bid that won the auction + */ + onBidWon: function (bid) { + // console.log('onBidWon: ', bid, config.getConfig('priceGranularity')); + // Bidder specific code + if (bid['nurl']) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(bid['nurl']); + } + } + + /** + * Register bidder specific code, which will execute when the adserver targeting has been set for a bid from this bidder + * @param {Bid} The bid of which the targeting has been set + */ + // onSetTargeting: function (bid) { + // // console.log('onSetTargeting', bid); + // // Bidder specific code + // }, +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('mediagoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","currencyUtils","navigatorData","fpdUtils","cookieSync","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediagoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediaimpactBidAdapter"],{ + +/***/ "./modules/mediaimpactBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/mediaimpactBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT_PROTOCOL, ENDPOINT_DOMAIN, ENDPOINT_PATH, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_mediaImpactUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/mediaImpactUtils/index.js */ "./libraries/mediaImpactUtils/index.js"); + + + +const BIDDER_CODE = 'mediaimpact'; +const ENDPOINT_PROTOCOL = 'https'; +const ENDPOINT_DOMAIN = 'bidder.smartytouch.co'; +const ENDPOINT_PATH = '/hb/bid'; +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bidRequest) { + return !!parseInt(bidRequest.params.unitId) || !!parseInt(bidRequest.params.partnerId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const referer = bidderRequest?.refererInfo?.page || window.location.href; + + // Use the common function to build bidRequests and beaconParams + const { + bidRequests, + beaconParams + } = (0,_libraries_mediaImpactUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.buildBidRequestsAndParams)(validBidRequests, referer); + const adRequestUrl = (0,_libraries_mediaImpactUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.buildEndpointUrl)(ENDPOINT_PROTOCOL, ENDPOINT_DOMAIN, ENDPOINT_PATH, beaconParams); + return { + method: 'POST', + url: adRequestUrl, + data: JSON.stringify(bidRequests) + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + const validBids = JSON.parse(bidRequest.data); + if (typeof serverResponse.body === 'undefined') { + return []; + } + return validBids.map(bid => ({ + bid: bid, + ad: serverResponse.body[bid.adUnitCode] + })).filter(item => item.ad).map(item => spec.adResponse(item.bid, item.ad)); + }, + adResponse: function (bid, ad) { + return { + requestId: bid.bidId, + ad: ad.ad, + cpm: ad.cpm, + width: ad.width, + height: ad.height, + ttl: 60, + creativeId: ad.creativeId, + netRevenue: ad.netRevenue, + currency: ad.currency, + winNotification: ad.winNotification, + meta: ad.meta || {} + }; + }, + onBidWon: function (data) { + data.winNotification.forEach(function (unitWon) { + const adBidWonUrl = (0,_libraries_mediaImpactUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.buildEndpointUrl)(ENDPOINT_PROTOCOL, ENDPOINT_DOMAIN, unitWon.path); + if (unitWon.method === 'POST') { + (0,_libraries_mediaImpactUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.postRequest)(adBidWonUrl, JSON.stringify(unitWon.data)); + } + }); + return true; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return syncs; + } + let appendGdprParams = function (url, gdprParams) { + if (gdprParams === null) { + return url; + } + return url + (url.indexOf('?') >= 0 ? '&' : '?') + gdprParams; + }; + let gdprParams = null; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdprParams = `gdpr_consent=${gdprConsent.consentString}`; + } + } + serverResponses.forEach(resp => { + if (resp.body) { + Object.keys(resp.body).map(function (key, index) { + let respObject = resp.body[key]; + if (respObject['syncs'] !== undefined && Array.isArray(respObject.syncs) && respObject.syncs.length > 0) { + if (syncOptions.iframeEnabled) { + respObject.syncs.filter(function (syncIframeObject) { + if (syncIframeObject['type'] !== undefined && syncIframeObject['link'] !== undefined && syncIframeObject.type === 'iframe') { + return true; + } + return false; + }).forEach(function (syncIframeObject) { + syncs.push({ + type: 'iframe', + url: appendGdprParams(syncIframeObject.link, gdprParams) + }); + }); + } + if (syncOptions.pixelEnabled) { + respObject.syncs.filter(function (syncImageObject) { + if (syncImageObject['type'] !== undefined && syncImageObject['link'] !== undefined && syncImageObject.type === 'image') { + return true; + } + return false; + }).forEach(function (syncImageObject) { + syncs.push({ + type: 'image', + url: appendGdprParams(syncImageObject.link, gdprParams) + }); + }); + } + } + }); + } + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('mediaimpactBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["mediaImpactUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediaimpactBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediakeysBidAdapter"],{ + +/***/ "./modules/mediakeysBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/mediakeysBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +const AUCTION_TYPE = 1; +const BIDDER_CODE = 'mediakeys'; +const ENDPOINT = 'https://prebid.eu-central-1.bidder.mediakeys.io/bids'; +const GVLID = 498; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const DEFAULT_CURRENCY = 'USD'; +const NET_REVENUE = true; +const NATIVE_ASSETS_MAPPING = [{ + name: 'title', + id: 1, + type: 0 +}, { + name: 'image', + id: 2, + type: 3 +}, { + name: 'icon', + id: 3, + type: 1 +}, { + name: 'sponsoredBy', + id: 5, + type: 1 +}, { + name: 'body', + id: 6, + type: 2 +}, { + name: 'rating', + id: 7, + type: 3 +}, { + name: 'likes', + id: 8, + type: 4 +}, { + name: 'downloads', + id: 9, + type: 5 +}, { + name: 'price', + id: 10, + type: 6 +}, { + name: 'salePrice', + id: 11, + type: 7 +}, { + name: 'phone', + id: 12, + type: 8 +}, { + name: 'address', + id: 13, + type: 9 +}, { + name: 'body2', + id: 14, + type: 10 +}, { + name: 'displayUrl', + id: 15, + type: 11 +}, { + name: 'cta', + id: 16, + type: 12 +}]; + +// This provide a whitelist and a basic validation of OpenRTB native 1.2 options. +// https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf +const ORTB_NATIVE_PARAMS = { + context: value => [1, 2, 3].indexOf(value) !== -1, + plcmttype: value => [1, 2, 3, 4].indexOf(value) !== -1 +}; + +// This provide a whitelist and a basic validation of OpenRTB 2.5 video options. +// https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf +const ORTB_VIDEO_PARAMS = { + mimes: value => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'), + minduration: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + maxduration: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + protocols: value => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].indexOf(v) !== -1), + w: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + h: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + startdelay: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + placement: value => [1, 2, 3, 4, 5].indexOf(value) !== -1, + plcmt: value => [1, 2, 3, 4].indexOf(value) !== -1, + linearity: value => [1, 2].indexOf(value) !== -1, + skip: value => [0, 1].indexOf(value) !== -1, + skipmin: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + skipafter: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + sequence: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + battr: value => Array.isArray(value) && value.every(v => Array.from({ + length: 17 + }, (_, i) => i + 1).includes(v)), + maxextended: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + minbitrate: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + maxbitrate: value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value), + boxingallowed: value => [0, 1].indexOf(value) !== -1, + playbackmethod: value => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6].indexOf(v) !== -1), + playbackend: value => [1, 2, 3].indexOf(value) !== -1, + delivery: value => [1, 2, 3].indexOf(value) !== -1, + pos: value => [0, 1, 2, 3, 4, 5, 6, 7].indexOf(value) !== -1, + api: value => Array.isArray(value) && value.every(v => [1, 2, 3, 4, 5, 6].indexOf(v) !== -1) +}; + +/** + * Returns the OpenRtb deviceType id detected from User Agent + * Voluntary limited to phone, tablet, desktop. + * + * @returns {number} + */ +function getDeviceType() { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) { + return 5; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) { + return 4; + } + return 2; +} + +/** + * Returns the OS name detected from User Agent. + * + * @returns {number} + */ +function getOS() { + if (navigator.userAgent.indexOf('Android') != -1) return 'Android'; + if (navigator.userAgent.indexOf('like Mac') != -1) return 'iOS'; + if (navigator.userAgent.indexOf('Win') != -1) return 'Windows'; + if (navigator.userAgent.indexOf('Mac') != -1) return 'Macintosh'; + if (navigator.userAgent.indexOf('Linux') != -1) return 'Linux'; + if (navigator.appVersion.indexOf('X11') != -1) return 'Unix'; + return 'Others'; +} + +/** + * Returns floor from priceFloors module or MediaKey default value. + * + * @param {*} bid a Prebid.js bid (request) object + * @param {string} mediaType the mediaType or the wildcard '*' + * @param {string|Array} size the size array or the wildcard '*' + * @returns {number|boolean} + */ +function getFloor(bid, mediaType) { + let size = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '*'; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return false; + } + if (SUPPORTED_MEDIA_TYPES.indexOf(mediaType) === -1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: Unable to detect floor price for unsupported mediaType ${mediaType}. No floor will be used.`); + return false; + } + const floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType, + size + }); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY ? floor.floor : false; +} + +/** + * Returns the highest floor price found when a bid have + * several mediaTypes. + * + * @param {*} bid a Prebid.js bid (request) object + * @returns {number|boolean} + */ +function getHighestFloor(bid) { + const floors = []; + for (let mediaType in bid.mediaTypes) { + const floor = getFloor(bid, mediaType); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(floor)) { + floors.push(floor); + } + } + if (!floors.length) { + return false; + } + return floors.reduce((a, b) => { + return Math.max(a, b); + }); +} + +/** + * Returns an openRTB 2.5 object. + * This one will be populated at each step of the buildRequest process. + * + * @returns {object} + */ +function createOrtbTemplate() { + return { + id: '', + at: AUCTION_TYPE, + cur: [DEFAULT_CURRENCY], + imp: [], + site: {}, + // computed in buildRequest() + device: { + ip: '', + js: 1, + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)(), + ua: navigator.userAgent, + devicetype: getDeviceType(), + os: getOS(), + h: screen.height, + w: screen.width, + language: navigator.language, + make: navigator.vendor ? navigator.vendor : '' + }, + user: {}, + regs: { + ext: { + gdpr: 0 // not applied by default + } + }, + ext: { + is_secure: 1 + } + }; +} + +/** + * Returns an openRtb 2.5 banner object. + * + * @param {object} bid Prebid bid object from request + * @returns {object} + */ +function createBannerImp(bid) { + let sizes = bid.mediaTypes.banner.sizes; + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params', {}); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes) || !sizes.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: mediaTypes.banner.size missing for adunit: ${bid.params.adUnit}. Ignoring the banner impression in the adunit.`); + } else { + const banner = {}; + banner.w = parseInt(sizes[0][0], 10); + banner.h = parseInt(sizes[0][1], 10); + const format = []; + sizes.forEach(function (size) { + if (size.length && size.length > 1) { + format.push({ + w: size[0], + h: size[1] + }); + } + }); + banner.format = format; + banner.topframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1; + banner.pos = params.pos || 0; + return banner; + } +} + +/** + * Returns an openRtb 2.5 native object with a native 1.2 request. + * + * @param {object} bid Prebid bid object from request + * @returns {object} + */ +function createNativeImp(bid) { + if (!bid.nativeParams) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: bid.nativeParams object has not been found.`); + return; + } + const nativeParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(bid.nativeParams); + const nativeAdUnitParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.native', {}); + const nativeBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.native', {}); + const extraParams = { + ...nativeAdUnitParams, + ...nativeBidderParams + }; + const nativeObject = { + ver: '1.2', + context: 1, + // overwrited later if needed + plcmttype: 1, + // overwrited later if needed + assets: [] + }; + Object.keys(ORTB_NATIVE_PARAMS).forEach(name => { + if (extraParams.hasOwnProperty(name)) { + if (ORTB_NATIVE_PARAMS[name](extraParams[name])) { + nativeObject[name] = extraParams[name]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: the OpenRTB native param ${name} has been skipped due to misformating. Please refer to OpenRTB Native spec.`); + } + } + }); + + // just a helper function + const setImageAssetSizes = function (asset, param) { + if (param.sizes && param.sizes.length) { + asset.img.w = param.sizes ? param.sizes[0] : undefined; + asset.img.h = param.sizes ? param.sizes[1] : undefined; + } + if (!asset.img.w) { + asset.img.wmin = 0; + } + if (!asset.img.h) { + asset.img.hmin = 0; + } + }; + + // Prebid.js "image" type support. + // Add some defaults to support special type provided by Prebid.js `mediaTypes.native.type: "image"` + const nativeImageType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.native.type'); + if (nativeImageType === 'image') { + // Default value is ones of the recommended by the spec: https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf + nativeParams.title.len = 90; + } + for (let key in nativeParams) { + if (nativeParams.hasOwnProperty(key)) { + const internalNativeAsset = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(NATIVE_ASSETS_MAPPING, ref => ref.name === key); + if (!internalNativeAsset) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: the asset "${key}" has not been found in Prebid assets map. Skipped for request.`); + continue; + } + const param = nativeParams[key]; + const asset = { + id: internalNativeAsset.id, + required: param.required ? 1 : 0 + }; + switch (key) { + case 'title': + if (param.len || param.length) { + asset.title = { + len: param.len || param.length, + ext: param.ext + }; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: "title.length" property for native asset is required. Skipped for request.`); + continue; + } + break; + case 'image': + asset.img = { + type: internalNativeAsset.type, + mimes: param.mimes, + ext: param.ext + }; + setImageAssetSizes(asset, param); + break; + case 'icon': + asset.img = { + type: internalNativeAsset.type, + mimes: param.mimes, + ext: param.ext + }; + setImageAssetSizes(asset, param); + break; + case 'sponsoredBy': // sponsored + case 'body': // desc + case 'rating': + case 'likes': + case 'downloads': + case 'price': + case 'salePrice': + case 'phone': + case 'address': + case 'body2': // desc2 + case 'displayUrl': + case 'cta': + // generic asset.data + asset.data = { + type: internalNativeAsset.type, + len: param.len, + ext: param.ext + }; + break; + } + nativeObject.assets.push(asset); + } + } + if (nativeObject.assets.length) { + return { + request: nativeObject + }; + } +} + +/** + * Returns an openRtb 2.5 video object. + * + * @param {object} bid Prebid bid object from request + * @returns {object} + */ +function createVideoImp(bid) { + const videoAdUnitParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video', {}); + const computedParams = {}; + + // Special case for playerSize. + // Eeach props will be overrided if they are defined in config. + if (Array.isArray(videoAdUnitParams.playerSize)) { + const tempSize = Array.isArray(videoAdUnitParams.playerSize[0]) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize; + computedParams.w = tempSize[0]; + computedParams.h = tempSize[1]; + } + const videoParams = { + ...computedParams, + ...videoAdUnitParams, + ...videoBidderParams + }; + const video = {}; + + // Only whitelisted OpenRTB options need to be validated. + Object.keys(ORTB_VIDEO_PARAMS).forEach(name => { + if (videoParams.hasOwnProperty(name)) { + if (ORTB_VIDEO_PARAMS[name](videoParams[name])) { + video[name] = videoParams[name]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: the OpenRTB video param ${name} has been skipped due to misformating. Please refer to OpenRTB 2.5 spec.`); + } + } + }); + return video; +} + +/** + * Create the OpenRTB 2.5 imp object. + * + * @param {*} bid Prebid bid object from request + * @returns + */ +function createImp(bid) { + const imp = { + id: bid.bidId, + tagid: bid.params.adUnit || undefined, + bidfloorcur: DEFAULT_CURRENCY, + secure: 1 + }; + + // There is no default floor. bidfloor is set only + // if the priceFloors module is activated and returns a valid floor. + const floor = getHighestFloor(bid); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(floor)) { + imp.bidfloor = floor; + } + + // Only supports proper mediaTypes definition… + for (let mediaType in bid.mediaTypes) { + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + const banner = createBannerImp(bid); + if (banner) { + imp.banner = banner; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + const native = createNativeImp(bid); + if (native) { + imp.native = native; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + const video = createVideoImp(bid); + if (video) { + imp.video = video; + } + break; + } + } + + // handle FPD for imp. + const ortb2Imp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.data'); + if (ortb2Imp) { + const fpd = { + ...bid.ortb2Imp + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(imp, fpd); + } + return imp; +} + +/** + * If array, extract the first IAB category from provided list + * If string just return it + * + * @param {string|Array} cat IAB Category + * @returns {string|null} + */ +function getPrimaryCatFromResponse(cat) { + if (!cat || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(cat) && !cat.length) { + return; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(cat)) { + return cat[0]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(cat)) { + return cat; + } +} + +/** + * Create the Prebid.js native object from response. + * + * @param {*} bid bid object from response + * @returns {object} Prebid.js native object used in response + */ +function nativeBidResponseHandler(bid) { + const nativeAdm = JSON.parse(bid.adm); + if (!nativeAdm || !nativeAdm.assets.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${BIDDER_CODE}: invalid native response.`); + return; + } + const native = {}; + nativeAdm.assets.forEach(asset => { + if (asset.title) { + native.title = asset.title.text; + return; + } + if (asset.img) { + switch (asset.img.type) { + case 1: + native.icon = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + default: + native.image = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + } + return; + } + if (asset.data) { + const internalNativeAsset = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(NATIVE_ASSETS_MAPPING, ref => ref.id === asset.id); + if (internalNativeAsset) { + native[internalNativeAsset.name] = asset.data.value; + } + } + }); + if (nativeAdm.link) { + if (nativeAdm.link.url) { + native.clickUrl = nativeAdm.link.url; + } + if (Array.isArray(nativeAdm.link.clicktrackers)) { + native.clickTrackers = nativeAdm.link.clicktrackers; + } + } + if (Array.isArray(nativeAdm.eventtrackers)) { + native.impressionTrackers = []; + nativeAdm.eventtrackers.forEach(tracker => { + // Only Impression events are supported. Prebid does not support Viewability events yet. + if (tracker.event !== 1) { + return; + } + + // methods: + // 1: image + // 2: js + // note: javascriptTrackers is a string. If there's more than one JS tracker in bid response, the last script will be used. + switch (tracker.method) { + case 1: + native.impressionTrackers.push(tracker.url); + break; + case 2: + const script = ``; + if (!native.javascriptTrackers) { + native.javascriptTrackers = script; + } else { + native.javascriptTrackers += `\n${script}`; + } + break; + } + }); + } + if (nativeAdm.privacy) { + native.privacyLink = nativeAdm.privacy; + } + return native; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bid) { + return !!(bid && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(bid)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const payload = createOrtbTemplate(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'id', bidderRequest.bidderRequestId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'source.tid', bidderRequest.ortb2.source?.tid); + validBidRequests.forEach(validBid => { + let bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(validBid); + + // No additional params atm. + const imp = createImp(bid); + payload.imp.push(imp); + }); + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'source.ext.schain', validBidRequests[0].schain); + } + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.coppa', 1); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'userIdAsEids')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'user.ext.eids', validBidRequests[0].userIdAsEids); + } + + // Assign payload.site from refererinfo + if (bidderRequest.refererInfo) { + // TODO: reachedTop is probably not the right check here - it may be false when page is available or vice-versa + if (bidderRequest.refererInfo.reachedTop) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'site.page', bidderRequest.refererInfo.page); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'site.domain', bidderRequest.refererInfo.domain); + if (bidderRequest.refererInfo.ref) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'site.ref', bidderRequest.refererInfo.ref); + } + } + } + + // Handle First Party Data (need publisher fpd setup) + const fpd = bidderRequest.ortb2 || {}; + if (fpd.site) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(payload, { + site: fpd.site + }); + } + if (fpd.user) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(payload, { + user: fpd.user + }); + } + const request = { + method: 'POST', + url: ENDPOINT, + data: payload, + options: { + withCredentials: false + } + }; + return request; + }, + interpretResponse(serverResponse, bidRequest) { + const bidResponses = []; + try { + if (serverResponse.body && serverResponse.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse.body.seatbid)) { + const currency = serverResponse.body.cur || DEFAULT_CURRENCY; + const referrer = bidRequest.site && bidRequest.site.ref ? bidRequest.site.ref : ''; + serverResponse.body.seatbid.forEach(bidderSeat => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidderSeat.bid) || !bidderSeat.bid.length) { + return; + } + bidderSeat.bid.forEach(bid => { + let mediaType; + // Actually only BANNER is supported, but other types will be added soon. + switch ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.type')) { + case 'V': + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + break; + case 'N': + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + break; + default: + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + const meta = { + advertiserDomains: Array.isArray(bid.adomain) && bid.adomain.length ? bid.adomain : [], + advertiserName: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.advertiser_name', null), + agencyName: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.agency_name', null), + primaryCatId: getPrimaryCatFromResponse(bid.cat), + mediaType + }; + const newBid = { + requestId: bid.impid, + cpm: parseFloat(bid.price) || 0, + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.id, + dealId: bid.dealid || null, + currency, + netRevenue: NET_REVENUE, + ttl: 360, + // seconds. https://docs.prebid.org/dev-docs/faq.html#does-prebidjs-cache-bids + referrer, + ad: bid.adm, + mediaType, + burl: bid.burl, + meta: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.cleanObj)(meta) + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + const native = nativeBidResponseHandler(bid); + if (native) { + newBid.native = native; + } + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + // Note: + // Mediakeys bid adapter expects a publisher has set his own video player + // in the `mediaTypes.video` configuration object. + + // Mediakeys bidder does not provide inline XML in the bid response + // newBid.vastXml = bid.ext.vast_url; + + // For instream video, disable server cache as vast is generated per bid request + newBid.videoCacheKey = 'no_cache'; + + // The vast URL is server independently and must be fetched before video rendering in the renderer + // appending '&no_cache' is safe and fast as the vast url always have parameters + newBid.vastUrl = bid.ext.vast_url + '&no_cache'; + } + bidResponses.push(newBid); + }); + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, e); + } + return bidResponses; + }, + onBidWon: function (bid) { + if (!bid.burl) { + return; + } + const url = bid.burl.replace(/\$\{AUCTION_PRICE\}/, bid.cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(url); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('mediakeysBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediakeysBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["medianetAnalyticsAdapter"],{ + +/***/ "./modules/medianetAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/medianetAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_vastTrackers_vastTrackers_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../libraries/vastTrackers/vastTrackers.js */ "./libraries/vastTrackers/vastTrackers.js"); +/* harmony import */ var _libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/medianetUtils/utils.js */ "./libraries/medianetUtils/utils.js"); +/* harmony import */ var _libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/medianetUtils/logger.js */ "./libraries/medianetUtils/logger.js"); +/* harmony import */ var _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/medianetUtils/logKeys.js */ "./libraries/medianetUtils/logKeys.js"); +/* harmony import */ var _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/medianetUtils/constants.js */ "./libraries/medianetUtils/constants.js"); + + + + + + + + + + + + + + + + + +// General Constants +const ADAPTER_CODE = 'medianetAnalytics'; +const LoggingEvents = { + SETUP_LISTENERS: 'setupListeners', + CONFIG_INIT: 'loadConfig', + FETCH_CONFIG: 'fetchConfig', + ..._src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS +}; +// =============================[ CONFIGURATION ]================================= +function fetchAnalyticsConfig() { + function updateLoggingPercentage(response) { + if (!isNaN(parseInt(response.percentage, 10))) { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingPercent = response.percentage; + } + } + function parseConfig(loggingConfig) { + const domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(loggingConfig, 'domain.' + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.refererInfo.domain); + updateLoggingPercentage(domain || loggingConfig); + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.shouldLogAPPR = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.isSampledForLogging)(); + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.ajaxState = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.CONFIG_PASS; + } + function success(response) { + try { + parseConfig(JSON.parse(response)); + } catch (e) { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.ajaxState = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.CONFIG_ERROR; + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.ERROR_CONFIG_JSON_PARSE, e).send(); + } + } + function error() { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.ajaxState = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.CONFIG_ERROR; + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.ERROR_CONFIG_FETCH).send(); + } + function getConfigURL() { + return `${_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.CONFIG_URL}?${(0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.formatQS)({ + cid: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.cid, + dn: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.refererInfo.domain + })}`; + } + + // Debugging and default settings + const urlObj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.parseUrl)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.refererInfo.topmostLocation); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(urlObj, 'search.medianet_test') || urlObj.hostname === 'localhost') { + Object.assign(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration, { + loggingPercent: 100, + shouldLogAPPR: true, + ajaxState: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.CONFIG_PASS, + debug: true + }); + return; + } + if (_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingConfig) { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingDelay = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingConfig.loggingDelay || _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingDelay; + parseConfig(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingConfig); + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(getConfigURL(), { + success, + error + }); +} +function initConfiguration(eventType, configuration) { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_7__.getRefererInfo)(); + // Holds configuration details + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration = { + ..._libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration, + pubLper: configuration.options.sampling || '', + ajaxState: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.CONFIG_PENDING, + shouldLogAPPR: false, + debug: false, + loggingPercent: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_LOGGING_PERCENT, + enabledUids: [], + commonParams: configuration.commonParams, + loggingDelay: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOGGING_DELAY, + ...configuration.options + }; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue.enqueueEvent(LoggingEvents.SETUP_LISTENERS, _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration); + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue.enqueueEvent(LoggingEvents.FETCH_CONFIG, _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration); +} + +// ======================[ LOGGING AND TRACKING ]=========================== +function doLogging(auctionObj, adUnitCode, logType, bidObj) { + const queryParams = getQueryString(auctionObj, adUnitCode, logType, bidObj); + // Use the generated queryParams for logging + const payload = (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.getLoggingPayload)(queryParams); + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.firePostLog)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.POST_ENDPOINT, payload); + auctionObj.adSlots[adUnitCode].logged[logType] = true; +} +function getQueryString(auctionObj, adUnitCode, logType, winningBidObj) { + const commonParams = getCommonParams(auctionObj, adUnitCode, logType); + const bidParams = getBidParams(auctionObj, adUnitCode, winningBidObj); + const queryString = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.formatQS)(commonParams); + let bidStrings = bidParams.map(bid => `&${(0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.formatQS)(bid)}`).join(''); + return `${queryString}${bidStrings}`; +} +function getErrorTracker(bidResponse, error) { + const stack = { + acid: bidResponse.auctionId, + bidId: bidResponse.requestId, + crid: bidResponse.creativeId, + ttl: bidResponse.ttl, + bidder: bidResponse.bidderCode || bidResponse.adapterCode, + context: bidResponse.context + }; + return [{ + event: 'impressions', + url: (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)('vast_tracker_handler_' + error, stack).getUrl() + }]; +} +function vastTrackerHandler(bidResponse, _ref) { + let { + auction, + bidRequest + } = _ref; + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig('cache')?.url) return []; + try { + if (auction) { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue.enqueueEvent(_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_INIT, auction); + } + const bidderRequest = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auction.bidderRequests, 'bidderRequestId', bidRequest?.bidderRequestId); + if (bidderRequest) { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue.enqueueEvent(_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_REQUESTED, bidderRequest); + } + const auctionObject = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[bidResponse.auctionId]; + if (!auctionObject) { + return getErrorTracker(bidResponse, 'missing_auction'); + } + const requestId = bidResponse.originalRequestId || bidResponse.requestId; + const bidRequestObj = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObject.bidsRequested, 'bidId', requestId); + if (!bidRequestObj) { + return getErrorTracker(bidResponse, 'missing_bidrequest'); + } + const context = auctionObject.adSlots[bidRequestObj?.adUnitCode]?.context; + if (context !== _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO_CONTEXT.INSTREAM) { + return []; + } + bidRequestObj.status = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO_UUID_PENDING; + const { + validBidResponseObj + } = processBidResponse(auctionObject, bidRequestObj, bidResponse); + const queryParams = getQueryString(auctionObject, bidRequestObj.adUnitCode, _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOG_RA, validBidResponseObj); + return [{ + event: 'impressions', + url: `${_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.GET_ENDPOINT}?${(0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.getLoggingPayload)(queryParams)}` + }]; + } catch (e) { + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)('vast_tracker_handler_error', e).send(); + return []; + } +} +function processBidResponse(auctionObj, bidRequest, bidResponse) { + bidRequest.bidTs = Date.now(); + bidRequest.responseReceived = true; + // timeout bid can be there for the bidResponse came after auctionEnd + // or it can be from a multi-bid response with a different requestId + let bidObj = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsReceived, 'bidId', bidResponse.requestId); + let bidIdAlreadyPresent = true; + if (!bidObj || bidObj.status === _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_SUCCESS) { + bidObj = Object.assign({}, bidRequest); + bidIdAlreadyPresent = false; + } + Object.assign(bidObj, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(bidResponse, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Pick.BidResponse), getDfpCurrencyInfo(bidResponse)); + if (bidObj.status === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.BID_REJECTED) { + bidObj.status = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_FLOOR_REJECTED; + } else { + bidObj.status = auctionObj.hasEnded ? _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.SUCCESS_AFTER_AUCTION : _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_SUCCESS; + } + bidRequest.status = bidObj.status; + return { + validBidResponseObj: bidObj, + bidIdAlreadyPresent + }; +} +function getLoggingBids(auctionObj, adUnitCode) { + const receivedResponse = buildBidResponseMap(auctionObj, adUnitCode); + const dummyBids = getDummyBids(auctionObj, adUnitCode, receivedResponse); + return [...auctionObj.psiBids, ...auctionObj.bidsReceived, ...dummyBids].filter(bid => bid.adUnitCode === adUnitCode); +} +function getBidParams(auctionObj, adUnitCode, winningBidObj) { + let loggableBids = []; + if (winningBidObj) { + const responseInfoMap = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.infoByAdIdMap[winningBidObj.adId] || {}; + const bidLogData = Object.assign({}, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(winningBidObj, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Log.Bid), (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(responseInfoMap.srrEvt, ['lineItemId as lid', 'creativeId as crtvid'], true)); + loggableBids.push(bidLogData); + } else { + // For logging all bids + loggableBids = setDbf(getLoggingBids(auctionObj, adUnitCode)).map(bidObj => (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(bidObj, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Log.Bid)).map(_ref2 => { + let { + winner, + ...restParams + } = _ref2; + return restParams; + }); + } + return loggableBids; +} +function getDummyBids(auctionObj, adUnitCode, receivedResponse) { + const emptyBids = []; + auctionObj.bidsRequested.forEach(bid => { + if (bid.adUnitCode !== adUnitCode) return; + const emptySizes = bid.sizes.filter(size => !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(receivedResponse, `${bid.bidId}.${size}`)); + if (emptySizes.length > 0) { + const bidObj = Object.assign({}, bid, { + res_sizes: emptySizes, + status: bid.status === _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_SUCCESS ? _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_NOBID : bid.status, + iwb: 0 + }); + emptyBids.push(bidObj); + } + }); + return emptyBids; +} +function setDbf(bids) { + const highestBids = {}; + bids.forEach(bid => { + bid.dbf = 0; // Default all dbf to 0 + if (isHigher(bid, highestBids[bid.bidder])) { + highestBids[bid.bidder] = bid; + } + }); + + // Mark the highest-priority bids as dbf = 1 + Object.values(highestBids).forEach(bid => { + bid.dbf = 1; + }); + return bids; +} +function isHigher(newBid) { + let currentBid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const newPriority = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.DBF_PRIORITY[newBid.status] ?? 0; + const currentPriority = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.DBF_PRIORITY[currentBid.status] ?? -1; + return newPriority > currentPriority || newPriority === currentPriority && (newBid.cpm ?? 0) > (currentBid.cpm ?? -1); +} +function markWinningBidsAndImpressionStatus(auctionObj) { + const sendAllBidsEnabled = _src_config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.SEND_ALL_BID_PROP) === true; + const updatePsiBid = (winner, adUnitCode, winnersAdIds) => { + const psiBidObj = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.psiBids, 'adUnitCode', adUnitCode); + if (!psiBidObj) { + return; + } + if (winnersAdIds.length > 0) { + psiBidObj.iwb = 1; + psiBidObj.width = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(winner, 'width') ?? null; + psiBidObj.height = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(winner, 'height') ?? null; + psiBidObj.size = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidResponseSize)(psiBidObj.width, psiBidObj.height); + } + const bidsRequested = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.filterBidsListByFilters)(auctionObj.bidsRequested, { + adUnitCode + }); + const bidsTimeout = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.filterBidsListByFilters)(auctionObj.bidsTimeout, { + adUnitCode + }); + if (bidsRequested.length === bidsTimeout.length) { + psiBidObj.status = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_TIMEOUT; + } + }; + const markValidBidsAsWinners = winnersAdIds => { + if (!sendAllBidsEnabled) { + return; + } + winnersAdIds.forEach(adId => { + const sendAllWinnerBid = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsReceived, 'adId', adId); + if (sendAllWinnerBid) { + sendAllWinnerBid.iwb = 1; + } + }); + }; + const checkWinnersForIwb = (winner, winningBidObj) => { + // bid-cache can be enabled + const fromSameAuction = winner?.auctionId === auctionObj.auctionId; + if (fromSameAuction && !winningBidObj) { + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.ERROR_IWB_BID_MISSING, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(winner, ['adId', 'auctionId', 'bidder', 'requestId', 'cpm', 'adUnitCode'])).send(); + } + }; + Object.keys(auctionObj.adSlots).forEach(adUnitCode => { + const winner = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().getHighestCpmBids(adUnitCode)[0]; + const winningBid = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsReceived, 'adId', winner?.adId); + if (winningBid && winningBid.status === _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_SUCCESS) { + winningBid.iwb = 1; + } + checkWinnersForIwb(winner, winningBid); + const targetingForAdUnitCode = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().getAdserverTargetingForAdUnitCode(adUnitCode); + auctionObj.adSlots[adUnitCode].targeting = targetingForAdUnitCode; + const winnersAdIds = []; + Object.keys(targetingForAdUnitCode).forEach(key => { + if (key.includes(_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS.AD_ID)) { + winnersAdIds.push(targetingForAdUnitCode[key]); + } + }); + markValidBidsAsWinners(winnersAdIds); + updatePsiBid(winner, adUnitCode, winnersAdIds); + }); +} +// =====================[ S2S ]====================== +function addS2sInfo(auctionObj, bidderRequests) { + bidderRequests.forEach(bidderRequest => { + bidderRequest.bids.forEach(bidRequest => { + if (bidRequest.src !== _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.S2S.SRC) return; + const bidObjs = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.filterBidsListByFilters)(auctionObj.bidsReceived, { + bidId: bidRequest.bidId + }); + bidObjs.forEach(bidObj => { + bidObj.serverLatencyMillis = bidderRequest.serverResponseTimeMs; + const serverError = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, `serverErrors.0`); + if (serverError && bidObj.status !== _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_SUCCESS) { + bidObj.status = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.PBS_ERROR_STATUS_START + serverError.code; + } + }); + }); + }); +} + +// =========================[ HELPERS ]========================== +function getAllMediaTypesAndSizes(adUnits) { + const allMTypes = new Set(); + const allSizes = new Set(); + adUnits.forEach(_ref3 => { + let { + mediaTypes, + sizes + } = _ref3; + Object.keys(mediaTypes).forEach(mType => allMTypes.add(mType)); + (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.getRequestedSizes)({ + mediaTypes, + sizes + }).forEach(size => allSizes.add(size)); + }); + return { + allMTypes: [...allMTypes], + allSizes: [...allSizes] + }; +} +function getAdSlot(adUnits) { + const context = adUnits.find(adUnit => !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adUnit, 'mediaTypes.video.context'))?.mediaTypes.video.context; + return Object.assign({}, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(adUnits[0], [..._libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Pick.AdSlot, 'context', () => context]), getAllMediaTypesAndSizes(adUnits)); +} +function buildBidResponseMap(auctionObj, adUnitCode) { + const responses = [].concat(auctionObj.bidsReceived, auctionObj.psiBids).filter(bid => bid.adUnitCode === adUnitCode); + const receivedResponse = {}; + + // Set true in map for success bids + responses.forEach(bid => { + if (!bid.size) return; + const sizeKey = `${bid.bidId}.${bid.size}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_11__.dset)(receivedResponse, sizeKey, true); + }); + + // For non-success bids: + // 1) set bid.res_sizes = (sizes for which no successful bid received) + // 2) set true in map + responses.forEach(bid => { + if (bid.size) return; + bid.res_sizes = bid.sizes.filter(size => !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(receivedResponse, `${bid.bidId}.${size}`)); + bid.res_sizes.forEach(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_11__.dset)(receivedResponse, `${bid.bidId}.${size}`, true)); + }); + return receivedResponse; +} +function getDfpCurrencyInfo(bidResponse) { + function convertCurrency(price, fromCurrency, toCurrency) { + try { + return (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency?.(price, fromCurrency, toCurrency) || price; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`Currency conversion failed: ${fromCurrency} -> ${toCurrency} for price ${price}`); + return price; + } + } + let { + source, + ext, + cpm, + originalCpm, + currency = '', + originalCurrency = '', + adserverTargeting + } = bidResponse; + currency = currency.toUpperCase(); + originalCurrency = (originalCurrency || currency).toUpperCase(); + originalCpm = originalCpm || cpm; + // https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#original-bid-cpm + if (source === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.S2S.SRC) { + originalCurrency = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ext, 'origbidcur') || originalCurrency; + originalCpm = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ext, 'origbidcpm') || originalCpm; + } + let currMul = 1; + let inCurrMul = 1; + if (currency !== 'USD') { + cpm = convertCurrency(cpm, currency, 'USD'); + currMul = convertCurrency(1, 'USD', currency); + } + if (originalCurrency !== 'USD') { + originalCpm = convertCurrency(originalCpm, originalCurrency, 'USD'); + inCurrMul = convertCurrency(1, 'USD', originalCurrency); + } + let bdp = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.bdpMap[bidResponse.adId]; + if (bdp) { + bdp = convertCurrency(bdp, currency, 'USD'); + } + + // dfpBd + let dfpbd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(adserverTargeting, `${_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS.PRICE_BUCKET}`); + if (!dfpbd) { + const priceGranularityKey = (0,_src_auction_js__WEBPACK_IMPORTED_MODULE_12__.getPriceByGranularity)(bidResponse); + dfpbd = bidResponse[priceGranularityKey] || bidResponse.cpm; + } + if (currency !== 'USD' && dfpbd) { + dfpbd = convertCurrency(dfpbd, currency, 'USD'); + } + return { + originalCpm, + bdp, + cpm, + dfpbd, + currMul, + inCurrMul + }; +} + +/** + * Generates auction-level, slot-level, and config-level parameters. + */ +function getCommonParams(auctionObj, adUnitCode, logType) { + const adSlotObj = auctionObj.adSlots[adUnitCode] || {}; + let commonParams = Object.assign({ + lgtp: logType + }, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Log.Globals), (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(auctionObj, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Log.Auction), (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(adSlotObj, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Log.AdSlot), _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.commonParams); + if (logType === _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOG_RA) { + commonParams.lper = 1; + } + Object.keys(commonParams).forEach(key => { + if (commonParams[key] === undefined) { + delete commonParams[key]; + } + }); + return commonParams; +} +function setupSlotResponseReceivedListener() { + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(() => { + window.googletag.pubads().addEventListener('slotResponseReceived', slotEvent => { + if (!slotEvent.slot || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isFn)(slotEvent.slot.getResponseInformation)) return; + const slot = slotEvent.slot; + const slotInf = slot.getResponseInformation(); + const setSlotResponseInf = adId => { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.infoByAdIdMap[adId] = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.infoByAdIdMap[adId] || {}; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.infoByAdIdMap[adId].srrEvt = slotInf; + }; + slot.getTargetingKeys().filter(key => key.startsWith(_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.TARGETING_KEYS.AD_ID)).forEach(key => setSlotResponseInf(slot.getTargeting(key)[0])); + }); + }); +} + +// ======================[ EVENT QUEUE PROCESSING ]======================= +const eventQueue = () => { + function enqueueEvent(eventType, args) { + if (_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.debug) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logInfo)(eventType, args); + } + processEventQueue(eventType, args); + } + function processEventQueue(eventType, args) { + try { + const handler = eventListeners[eventType]; + if (!handler) { + return; + } + handler(eventType, args); + } catch (e) { + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(`${eventType}_handler_error`, e).send(); + } + } + return { + enqueueEvent, + processEventQueue + }; +}; + +// ======================[ AUCTION EVENT HANDLERS ]===================== +function auctionInitHandler(eventType, auction) { + let auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[auction.auctionId]; + if (auctionObj) { + return; + } + auctionObj = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(auction, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Pick.Auction); + // addAddSlots + Object.values((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.groupBy)(auction.adUnits, 'code')).map(getAdSlot).forEach(adSlot => { + // Assign adSlot to auctionObj.adSlots + auctionObj.adSlots[adSlot.code] = adSlot; + // Push the PSI bid + auctionObj.psiBids.push({ + src: 'client', + bidId: '-1', + originalRequestId: '-1', + bidder: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.DUMMY_BIDDER, + mediaTypes: adSlot.allMTypes, + sizes: adSlot.allSizes, + size: (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidResponseSize)(-1, -1), + width: -1, + height: -1, + iwb: 0, + status: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_SUCCESS, + adUnitCode: adSlot.code + }); + }); + + // addUidData + const userIds = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(auction.bidderRequests, '0.bids.0.userId'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isPlainObject)(userIds)) { + const enabledUids = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.enabledUids || []; + auctionObj.availableUids = Object.keys(userIds).sort(); + auctionObj.uidValues = auctionObj.availableUids.filter(key => enabledUids.includes(key)).map(key => `${key}##${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.safeJSONEncode)(userIds[key])}`); + } + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.refererInfo = auctionObj.refererInfo; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[auction.auctionId] = auctionObj; +} +function auctionEndHandler(eventType, auctionEndData) { + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[auctionEndData.auctionId]; + if (!auctionObj) return; + auctionObj.hasEnded = true; + auctionObj.auctionEndTime = auctionEndData.auctionEnd; + markWinningBidsAndImpressionStatus(auctionObj); + const execute = () => { + addS2sInfo(auctionObj, auctionEndData.bidderRequests); + Object.keys(auctionObj.adSlots).forEach(adUnitCode => { + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.shouldLogAPPR)(auctionObj, adUnitCode) && doLogging(auctionObj, adUnitCode, _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOG_APPR); + }); + }; + const timeout = auctionObj.pendingRequests === 0 ? 0 : _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.configuration.loggingDelay; + auctionObj.loggerTimeout = timeout; + Promise.race([new Promise(resolve => setTimeout(resolve, timeout)), new Promise(resolve => (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.onHidden)(resolve))]).finally(execute); +} +function bidRequestedHandler(eventType, bidRequestedData) { + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[bidRequestedData.auctionId]; + if (!auctionObj) return; + auctionObj.auctionStartTime = bidRequestedData.auctionStart; + bidRequestedData.bids + // In the case of video (instream), the `bidRequested` object might already exist. + .filter(_ref4 => { + let { + bidId + } = _ref4; + return !(0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsRequested, 'bidId', bidId); + }).forEach(bidRequested => { + const bidRequestObj = Object.assign({}, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(bidRequested, _libraries_medianetUtils_logKeys_js__WEBPACK_IMPORTED_MODULE_9__.KeysMap.Pick.BidRequest)); + auctionObj.bidsRequested.push(bidRequestObj); + }); +} +function bidResponseHandler(eventType, validBidResponse) { + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[validBidResponse.auctionId]; + if (!auctionObj) return; + const requestId = validBidResponse.originalRequestId || validBidResponse.requestId; + const bidRequest = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsRequested, 'bidId', requestId); + if (!bidRequest) return; + const { + bidIdAlreadyPresent = true, + validBidResponseObj + } = processBidResponse(auctionObj, bidRequest, validBidResponse); + auctionObj.responseBids.push(validBidResponseObj); + if (!bidIdAlreadyPresent && validBidResponseObj) { + auctionObj.bidsReceived.push(validBidResponseObj); + } +} +function bidWonHandler(eventType, winner) { + const { + auctionId, + adUnitCode, + adId, + bidder, + requestId, + originalRequestId + } = winner; + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[auctionId]; + if (!auctionObj) { + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.WINNING_AUCTION_MISSING_ERROR, { + adId, + auctionId, + adUnitCode, + bidder, + requestId, + originalRequestId + }).send(); + return; + } + const bidObj = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsReceived, 'adId', adId); + if (!bidObj) { + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(_libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.WINNING_BID_ABSENT_ERROR, { + adId, + auctionId, + adUnitCode, + bidder, + requestId, + originalRequestId + }).send(); + return; + } + auctionObj.bidWonTime = Date.now(); + // Update the bidObj with the winner details + Object.assign(bidObj, (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.pick)(winner, ['latestTargetedAuctionId', 'winner', () => 1, 'utime', () => bidObj.bidTs ? Date.now() - bidObj.bidTs : undefined])); + doLogging(auctionObj, adUnitCode, _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.LOG_RA, bidObj); +} +function bidRejectedHandler(eventType, bidRejected) { + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[bidRejected.auctionId]; + if (!auctionObj) return; + if (bidRejected.rejectionReason === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.REJECTION_REASON.FLOOR_NOT_MET) { + bidRejected.snm = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.BID_STATUS.BID_REJECTED; + bidResponseHandler(eventType, bidRejected); + } +} +function noBidResponseHandler(eventType, noBid) { + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[noBid.auctionId]; + if (!auctionObj) return; + const bidRequest = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsRequested, 'bidId', noBid.bidId); + if (!bidRequest || bidRequest.responseReceived) return; + const status = auctionObj.hasEnded ? _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.NOBID_AFTER_AUCTION : _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_NOBID; + const noBidObj = Object.assign({}, bidRequest, { + status, + metrics: noBid.metrics + }); + bidRequest.status = status; + bidRequest.responseReceived = true; + auctionObj.noBids.push(noBidObj); + auctionObj.bidsReceived.push(noBidObj); +} +function bidTimeoutHandler(eventType, timedOutBids) { + const auctionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(timedOutBids, '0.auctionId'); + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[auctionId]; + if (!auctionObj) return; + const status = auctionObj.hasEnded ? _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.TIMEOUT_AFTER_AUCTION : _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_TIMEOUT; + timedOutBids.forEach(timedOutBid => { + const bidRequest = (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_3__.findBidObj)(auctionObj.bidsRequested, 'bidId', timedOutBid.bidId); + if (!bidRequest) return; + const timedOutObj = Object.assign({}, bidRequest, { + status, + metrics: timedOutBid.metrics + }); + bidRequest.status = status; + bidRequest.responseReceived = true; + auctionObj.bidsTimeout.push(timedOutObj); + auctionObj.bidsReceived.push(timedOutObj); + }); +} +function bidderDoneHandler(eventType, args) { + const auctionObj = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions[args.auctionId]; + if (!auctionObj) return; + auctionObj.pendingRequests--; +} +function adRenderFailedHandler(eventType, args) { + const { + reason, + message, + bid: { + auctionId, + adUnitCode, + bidder, + creativeId + } + } = args; + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(eventType, { + reason, + message, + auctionId, + adUnitCode, + bidder, + creativeId + }).send(); +} +function adRenderSucceededHandler(eventType, args) { + const { + bid: { + auctionId, + adUnitCode, + bidder, + creativeId + } + } = args; + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(eventType, { + auctionId, + adUnitCode, + bidder, + creativeId + }).send(); +} +function staleRenderHandler(eventType, args) { + const { + auctionId, + adUnitCode, + bidder, + creativeId, + adId, + cpm + } = args; + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_4__.errorLogger)(eventType, { + adId, + auctionId, + adUnitCode, + bidder, + creativeId, + cpm + }).send(); +} + +// ======================[ EVENT LISTENER MAP ]===================== +// Define listener functions for each event +const eventListeners = { + [LoggingEvents.SETUP_LISTENERS]: setupListeners, + [LoggingEvents.CONFIG_INIT]: initConfiguration, + [LoggingEvents.FETCH_CONFIG]: fetchAnalyticsConfig, + [LoggingEvents.AUCTION_INIT]: auctionInitHandler, + [LoggingEvents.AUCTION_END]: auctionEndHandler, + [LoggingEvents.BID_REQUESTED]: bidRequestedHandler, + [LoggingEvents.BID_RESPONSE]: bidResponseHandler, + [LoggingEvents.BID_REJECTED]: bidRejectedHandler, + [LoggingEvents.NO_BID]: noBidResponseHandler, + [LoggingEvents.BIDDER_DONE]: bidderDoneHandler, + [LoggingEvents.BID_TIMEOUT]: bidTimeoutHandler, + [LoggingEvents.BID_WON]: bidWonHandler, + [LoggingEvents.AD_RENDER_FAILED]: adRenderFailedHandler, + [LoggingEvents.AD_RENDER_SUCCEEDED]: adRenderSucceededHandler, + [LoggingEvents.STALE_RENDER]: staleRenderHandler +}; +let medianetAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_13__["default"])({ + analyticsType: 'endpoint' +}), { + getlogsQueue() { + return _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.logsQueue; + }, + getErrorQueue() { + return _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.errorQueue; + }, + getVastTrackerHandler() { + return vastTrackerHandler; + }, + clearlogsQueue() { + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.logsQueue = []; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.errorQueue = []; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.auctions = {}; + }, + track(_ref5) { + let { + eventType, + args + } = _ref5; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue.enqueueEvent(eventType, args); + } +}); +function setupListeners() { + setupSlotResponseReceivedListener(); + (0,_libraries_vastTrackers_vastTrackers_js__WEBPACK_IMPORTED_MODULE_14__.registerVastTrackers)(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_15__.MODULE_TYPE_ANALYTICS, ADAPTER_CODE, vastTrackerHandler); +} +medianetAnalytics.originEnableAnalytics = medianetAnalytics.enableAnalytics; +medianetAnalytics.enableAnalytics = function (configuration) { + if (!configuration || !configuration.options || !configuration.options.cid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Media.net Analytics adapter: cid is required.'); + return; + } + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().medianetGlobals = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().medianetGlobals || {}; + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().medianetGlobals.analyticsEnabled = true; + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().medianetGlobals.analytics = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals; + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue = eventQueue(); + _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.mnetGlobals.eventQueue.enqueueEvent(LoggingEvents.CONFIG_INIT, configuration); + configuration.options.sampling = 1; + medianetAnalytics.originEnableAnalytics(configuration); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_16__["default"].registerAnalyticsAdapter({ + adapter: medianetAnalytics, + code: ADAPTER_CODE, + gvlid: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_VENDOR_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (medianetAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('medianetAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","medianetUtils","vastTrackers","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/medianetAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["medianetBidAdapter"],{ + +/***/ "./modules/medianetBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/medianetBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports EVENTS, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); +/* harmony import */ var _libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/medianetUtils/utils.js */ "./libraries/medianetUtils/utils.js"); +/* harmony import */ var _libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../libraries/medianetUtils/logger.js */ "./libraries/medianetUtils/logger.js"); +/* harmony import */ var _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/medianetUtils/constants.js */ "./libraries/medianetUtils/constants.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + + + + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid + */ + +const BIDDER_CODE = _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.MEDIANET; +const TRUSTEDSTACK_CODE = 'trustedstack'; +const BID_URL = 'https://prebid.media.net/rtb/prebid'; +const TRUSTEDSTACK_URL = 'https://prebid.trustedstack.com/rtb/trustedstack'; +const PLAYER_URL = 'https://prebid.media.net/video/bundle.js'; +const SLOT_VISIBILITY = { + NOT_DETERMINED: 0, + ABOVE_THE_FOLD: 1, + BELOW_THE_FOLD: 2 +}; +const EVENTS = { + TIMEOUT_EVENT_NAME: 'client_timeout', + BID_WON_EVENT_NAME: 'client_bid_won', + SET_TARGETING: 'client_set_targeting', + BIDDER_ERROR: 'client_bidder_error' +}; +const OUTSTREAM = 'outstream'; +let pageMeta; +let customerId; +window.mnet = window.mnet || {}; +window.mnet.queue = window.mnet.queue || []; +const aliases = [{ + code: TRUSTEDSTACK_CODE, + gvlid: 1288 +}]; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().medianetGlobals = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().medianetGlobals || {}; +function siteDetails(site, bidderRequest) { + const urlData = bidderRequest.refererInfo; + site = site || {}; + let siteData = { + domain: site.domain || urlData.domain, + page: site.page || urlData.page, + ref: (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_2__.getTopWindowReferrer)(site.ref), + topMostLocation: urlData.topmostLocation, + isTop: site.isTop || urlData.reachedTop + }; + if (!pageMeta) { + pageMeta = getPageMeta(); + } + return Object.assign(siteData, pageMeta); +} +function getPageMeta() { + if (pageMeta) { + return pageMeta; + } + let canonicalUrl = getUrlFromSelector('link[rel="canonical"]', 'href'); + pageMeta = Object.assign({}, canonicalUrl && { + 'canonical_url': canonicalUrl + }); + return pageMeta; +} +function getUrlFromSelector(selector, attribute) { + let attr = getAttributeFromSelector(selector, attribute); + return attr && getAbsoluteUrl(attr); +} +function getAttributeFromSelector(selector, attribute) { + try { + let doc = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWindowTop)().document; + let element = doc.querySelector(selector); + if (element !== null && element[attribute]) { + return element[attribute]; + } + } catch (e) {} +} +function getAbsoluteUrl(url) { + let aTag = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWindowTop)().document.createElement('a'); + aTag.href = url; + return aTag.href; +} +function transformSizes(sizes) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(sizes) && sizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(sizes[0])) { + return [getSize(sizes)]; + } + return sizes.map(size => getSize(size)); +} +function getSize(size) { + return { + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + }; +} +function getWindowSize() { + return { + w: window.screen.width || -1, + h: window.screen.height || -1 + }; +} +function getCoordinates(adUnitCode) { + let element = document.getElementById(adUnitCode); + if (!element && adUnitCode.indexOf('/') !== -1) { + // now it means that adUnitCode is GAM AdUnitPath + const { + divId + } = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(adUnitCode); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(divId)) { + element = document.getElementById(divId); + } + } + if (element) { + const rect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_5__.getBoundingClientRect)(element); + let coordinates = {}; + coordinates.top_left = { + y: rect.top, + x: rect.left + }; + coordinates.bottom_right = { + y: rect.bottom, + x: rect.right + }; + return coordinates; + } + return null; +} +function extParams(bidRequest, bidderRequests) { + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params'); + const gdpr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidderRequests, 'gdprConsent'); + const uspConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidderRequests, 'uspConsent'); + const userId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'userId'); + const sChain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'schain') || {}; + const windowSize = spec.getWindowSize(); + const gdprApplies = !!(gdpr && gdpr.gdprApplies); + const uspApplies = !!uspConsent; + const coppaApplies = !!_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('coppa'); + const { + top = -1, + right = -1, + bottom = -1, + left = -1 + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_8__.getViewportCoordinates)(); + return Object.assign({}, { + customer_id: params.cid + }, { + prebid_version: 'v' + "9.45.0-pre" + }, { + gdpr_applies: gdprApplies + }, gdprApplies && { + gdpr_consent_string: gdpr.consentString || '' + }, { + usp_applies: uspApplies + }, uspApplies && { + usp_consent_string: uspConsent || '' + }, { + coppa_applies: coppaApplies + }, windowSize.w !== -1 && windowSize.h !== -1 && { + screen: windowSize + }, userId && { + user_id: userId + }, (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().medianetGlobals.analyticsEnabled && { + analytics: true + }, !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(sChain) && { + schain: sChain + }, { + vcoords: { + top_left: { + x: left, + y: top + }, + bottom_right: { + x: right, + y: bottom + } + } + }); +} +function slotParams(bidRequest, bidderRequests) { + // check with Media.net Account manager for bid floor and crid parameters + let params = { + id: bidRequest.bidId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + ext: { + dfp_id: bidRequest.adUnitCode, + display_count: bidRequest.auctionsCount + }, + all: bidRequest.params + }; + if (bidRequest.ortb2Imp) { + params.ortb2Imp = bidRequest.ortb2Imp; + } + let bannerSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.banner.sizes') || []; + const videoInMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.video') || {}; + const videoInParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.video') || {}; + const videoCombinedObj = Object.assign({}, videoInParams, videoInMediaType); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(videoCombinedObj)) { + params.video = videoCombinedObj; + } + if (bannerSizes.length > 0) { + params.banner = transformSizes(bannerSizes); + } + if (bidRequest.nativeParams) { + try { + params.native = JSON.stringify(bidRequest.nativeParams); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${BIDDER_CODE} : Incorrect JSON : bidRequest.nativeParams`); + } + } + if (bidRequest.params.crid) { + params.tagid = bidRequest.params.crid.toString(); + } + let bidFloor = parseFloat(bidRequest.params.bidfloor || bidRequest.params.bidFloor); + if (bidFloor) { + params.bidfloor = bidFloor; + } + const coordinates = getCoordinates(bidRequest.adUnitCode); + if (coordinates && params.banner && params.banner.length !== 0) { + let normCoordinates = normalizeCoordinates(coordinates); + params.ext.coordinates = normCoordinates; + params.ext.viewability = getSlotVisibility(coordinates.top_left, getMinSize(params.banner)); + if (getSlotVisibility(normCoordinates.top_left, getMinSize(params.banner)) > 0.5) { + params.ext.visibility = SLOT_VISIBILITY.ABOVE_THE_FOLD; + } else { + params.ext.visibility = SLOT_VISIBILITY.BELOW_THE_FOLD; + } + } else { + params.ext.visibility = SLOT_VISIBILITY.NOT_DETERMINED; + } + const floorInfo = getBidFloorByType(bidRequest); + if (floorInfo && floorInfo.length > 0) { + params.bidfloors = floorInfo; + } + if (bidderRequests.paapi?.enabled) { + params.ext.ae = bidRequest?.ortb2Imp?.ext?.ae; + } + return params; +} +function getBidFloorByType(bidRequest) { + let floorInfo = []; + if (typeof bidRequest.getFloor === 'function') { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.NATIVE].forEach(mediaType => { + if (bidRequest.mediaTypes.hasOwnProperty(mediaType)) { + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.BANNER) { + bidRequest.mediaTypes.banner.sizes.forEach(size => { + setFloorInfo(bidRequest, mediaType, size, floorInfo); + }); + } else { + setFloorInfo(bidRequest, mediaType, '*', floorInfo); + } + } + }); + } + return floorInfo; +} +function setFloorInfo(bidRequest, mediaType, size, floorInfo) { + let floor = bidRequest.getFloor({ + currency: 'USD', + mediaType: mediaType, + size: size + }) || {}; + if (size.length > 1) floor.size = size; + floor.mediaType = mediaType; + floorInfo.push(floor); +} +function getMinSize(sizes) { + return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min); +} +function getSlotVisibility(topLeft, size) { + let maxArea = size.w * size.h; + let windowSize = spec.getWindowSize(); + let bottomRight = { + x: topLeft.x + size.w, + y: topLeft.y + size.h + }; + if (maxArea === 0 || windowSize.w === -1 || windowSize.h === -1) { + return 0; + } + return getOverlapArea(topLeft, bottomRight, { + x: 0, + y: 0 + }, { + x: windowSize.w, + y: windowSize.h + }) / maxArea; +} + +// find the overlapping area between two rectangles +function getOverlapArea(topLeft1, bottomRight1, topLeft2, bottomRight2) { + // If no overlap, return 0 + if (topLeft1.x > bottomRight2.x || bottomRight1.x < topLeft2.x || topLeft1.y > bottomRight2.y || bottomRight1.y < topLeft2.y) { + return 0; + } + // return overlapping area : [ min of rightmost/bottommost co-ordinates ] - [ max of leftmost/topmost co-ordinates ] + return (Math.min(bottomRight1.x, bottomRight2.x) - Math.max(topLeft1.x, topLeft2.x)) * (Math.min(bottomRight1.y, bottomRight2.y) - Math.max(topLeft1.y, topLeft2.y)); +} +function normalizeCoordinates(coordinates) { + const { + scrollX, + scrollY + } = window; + return { + top_left: { + x: coordinates.top_left.x + scrollX, + y: coordinates.top_left.y + scrollY + }, + bottom_right: { + x: coordinates.bottom_right.x + scrollX, + y: coordinates.bottom_right.y + scrollY + } + }; +} +function getBidderURL(bidderCode, cid) { + const url = bidderCode === TRUSTEDSTACK_CODE ? TRUSTEDSTACK_URL : BID_URL; + return url + '?cid=' + encodeURIComponent(cid); +} +function ortb2Data(ortb2, bidRequests) { + const ortb2Object = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(ortb2); + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequests, '0.userIdAsEids'); + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_10__.dset)(ortb2Object, 'user.ext.eids', eids); + } + return ortb2Object; +} +function generatePayload(bidRequests, bidderRequests) { + return { + site: siteDetails(bidRequests[0].params.site, bidderRequests), + ext: extParams(bidRequests[0], bidderRequests), + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + id: bidRequests[0].auctionId, + imp: bidRequests.map(request => slotParams(request, bidderRequests)), + ortb2: ortb2Data(bidderRequests.ortb2, bidRequests), + tmax: bidderRequests.timeout + }; +} +function isValidBid(bid) { + return bid.no_bid === false && parseFloat(bid.cpm) > 0.0; +} +function fetchCookieSyncUrls(response) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(response) && response[0].body && response[0].body.ext && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(response[0].body.ext.csUrl)) { + return response[0].body.ext.csUrl; + } + return []; +} +function getBidData(bid) { + const params = {}; + params.acid = bid.auctionId || ''; + params.crid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.crid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.0.crid') || bid.adUnitCode || ''; + params.ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(bid.ext) || ''; + const rawobj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(bid); + delete rawobj.ad; + delete rawobj.vastXml; + params.rawobj = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.safeJSONEncode)(rawobj); + return params; +} +function getLoggingData(bids) { + const logData = {}; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(bids)) { + bids = []; + } + bids.forEach(bid => { + let bidData = getBidData(bid); + Object.keys(bidData).forEach(key => { + logData[key] = logData[key] || []; + logData[key].push(encodeURIComponent(bidData[key])); + }); + }); + return logData; +} +function logEvent(event, data) { + const logData = getLoggingData(data); + event.cid = customerId; + (0,_libraries_medianetUtils_logger_js__WEBPACK_IMPORTED_MODULE_11__.errorLogger)(event, logData, false).send(); +} +function clearPageMeta() { + pageMeta = undefined; +} +function addRenderer(bid) { + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'context') || ''; + const vastTimeout = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'vto'); + /* Adding renderer only when the context is Outstream + and the provider has responded with a renderer. + */ + if (videoContext === OUTSTREAM && vastTimeout) { + bid.renderer = newVideoRenderer(bid); + } +} +function newVideoRenderer(bid) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_12__.Renderer.install({ + url: PLAYER_URL + }); + renderer.setRender(function (bid) { + window.mnet.queue.push(function () { + const obj = { + width: bid.width, + height: bid.height, + vastTimeout: bid.vto, + maxAllowedVastTagRedirects: bid.mavtr, + allowVpaid: bid.avp, + autoPlay: bid.ap, + preload: bid.pl, + mute: bid.mt + }; + const adUnitCode = bid.dfp_id; + const divId = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_4__.getGptSlotInfoForAdUnitCode)(adUnitCode).divId || adUnitCode; + window.mnet.mediaNetoutstreamPlayer(bid, divId, obj); + }); + }); + return renderer; +} +const spec = { + code: BIDDER_CODE, + gvlid: _libraries_medianetUtils_constants_js__WEBPACK_IMPORTED_MODULE_0__.GLOBAL_VENDOR_ID, + aliases, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid (if cid is present), and false otherwise. + */ + isBidRequestValid: function (bid) { + if (!bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${BIDDER_CODE} : Missing bid parameters`); + return false; + } + if (!bid.params.cid || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(bid.params.cid) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr)(bid.params.cid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${BIDDER_CODE} : cid should be a string`); + return false; + } + customerId = bid.params.cid; + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @param {Object} bidderRequests + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequests) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_13__.convertOrtbRequestToProprietaryNative)(bidRequests); + let payload = generatePayload(bidRequests, bidderRequests); + return { + method: 'POST', + url: getBidderURL(bidderRequests.bidderCode, payload.ext.customer_id), + data: JSON.stringify(payload) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @returns {{bids: *[], fledgeAuctionConfigs: *[]} | *[]} An object containing bids and fledgeAuctionConfigs if present, otherwise an array of bids. + */ + interpretResponse: function (serverResponse, request) { + let validBids = []; + if (!serverResponse || !serverResponse.body) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${BIDDER_CODE} : response is empty`); + return validBids; + } + let bids = serverResponse.body.bidList; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(bids) || bids.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${BIDDER_CODE} : no bids`); + } else { + validBids = bids.filter(bid => isValidBid(bid)); + validBids.forEach(addRenderer); + } + const fledgeAuctionConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(serverResponse, 'body.ext.paApiAuctionConfigs') || []; + const ortbAuctionConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(serverResponse, 'body.ext.igi') || []; + if (fledgeAuctionConfigs.length === 0 && ortbAuctionConfigs.length === 0) { + return validBids; + } + if (ortbAuctionConfigs.length > 0) { + fledgeAuctionConfigs.push(...ortbAuctionConfigs.map(_ref => { + let { + igs + } = _ref; + return igs || []; + }).flat()); + } + return { + bids: validBids, + paapi: fledgeAuctionConfigs + }; + }, + getUserSyncs: function (syncOptions, serverResponses) { + let cookieSyncUrls = fetchCookieSyncUrls(serverResponses); + if (syncOptions.iframeEnabled) { + return (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_2__.filterBidsListByFilters)(cookieSyncUrls, { + type: 'iframe' + }); + } + if (syncOptions.pixelEnabled) { + return (0,_libraries_medianetUtils_utils_js__WEBPACK_IMPORTED_MODULE_2__.filterBidsListByFilters)(cookieSyncUrls, { + type: 'image' + }); + } + }, + /** + * @param {TimedOutBid} timeoutData + */ + onTimeout: timeoutData => { + try { + let eventData = { + name: EVENTS.TIMEOUT_EVENT_NAME, + value: timeoutData.length, + relatedData: timeoutData[0].timeout || _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('bidderTimeout') + }; + logEvent(eventData, timeoutData); + } catch (e) {} + }, + /** + * @param {Bid} bid + */ + onBidWon: bid => { + try { + let eventData = { + name: EVENTS.BID_WON_EVENT_NAME, + value: bid.cpm + }; + logEvent(eventData, [bid]); + } catch (e) {} + }, + onSetTargeting: bid => { + try { + let eventData = { + name: EVENTS.SET_TARGETING, + value: bid.cpm + }; + const enableSendAllBids = _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('enableSendAllBids'); + if (!enableSendAllBids) { + logEvent(eventData, [bid]); + } + } catch (e) {} + }, + onBidderError: _ref2 => { + let { + error, + bidderRequest + } = _ref2; + try { + let eventData = { + name: EVENTS.BIDDER_ERROR, + relatedData: `timedOut:${error.timedOut}|status:${error.status}|message:${error.reason.message}` + }; + logEvent(eventData, bidderRequest.bids); + } catch (e) {} + }, + clearPageMeta, + getWindowSize +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_14__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('medianetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","boundingClientRect","medianetUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/medianetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["medianetRtdProvider"],{ + +/***/ "./modules/medianetRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/medianetRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export medianetRtdModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + +const MODULE_NAME = 'medianet'; +const SOURCE = MODULE_NAME + 'rtd'; +const AD_UNIT_CODE_TARGETING_KEY = 'mnadc'; +const OPEN_RTB_FIELD = 'ortb2Imp'; +const getClientUrl = (customerId, domain) => `https://warp.media.net/js/tags/prebidrtdclient.js?cid=${customerId}&dn=${domain}`; +window.mnjs = window.mnjs || {}; +window.mnjs.que = window.mnjs.que || []; +function init(config) { + const customerId = config.params && config.params.cid; + if (!customerId || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(customerId) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmptyStr)(customerId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${SOURCE}: cid should be a string`); + return false; + } + loadRtdScript(customerId); + executeCommand(() => window.mnjs.setData({ + module: 'iref', + name: 'initIRefresh', + data: { + config, + prebidGlobal: (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)() + } + }, SOURCE)); + return true; +} +function getBidRequestData(requestBidsProps, callback, config, userConsent) { + executeCommand(() => { + let adUnits = getAdUnits(requestBidsProps.adUnits, requestBidsProps.adUnitCodes); + const request = window.mnjs.onPrebidRequestBid({ + requestBidsProps, + config, + userConsent + }); + if (!request) { + callback(); + return; + } + const success = (adUnitProps, openRtbProps) => { + adUnits.forEach(adUnit => { + adUnit[OPEN_RTB_FIELD] = adUnit[OPEN_RTB_FIELD] || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(adUnit[OPEN_RTB_FIELD], openRtbProps[adUnit.code]); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(adUnit, adUnitProps[adUnit.code]); + }); + callback(); + }; + const error = () => callback(); + request.onComplete(error, success); + }); +} +function onAuctionInitEvent(auctionInit) { + executeCommand(() => window.mnjs.setData({ + module: 'iref', + name: 'auctionInit', + data: { + auction: auctionInit + } + }, SOURCE)); +} +function getTargetingData(adUnitCodes, config, consent, auction) { + const adUnits = getAdUnits(auction.adUnits, adUnitCodes); + let targetingData = {}; + if (window.mnjs.loaded && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(window.mnjs.getTargetingData)) { + targetingData = window.mnjs.getTargetingData(adUnitCodes, adUnits, SOURCE) || {}; + } + const targeting = {}; + adUnitCodes.forEach(adUnitCode => { + targeting[adUnitCode] = targeting[adUnitCode] || {}; + targetingData[adUnitCode] = targetingData[adUnitCode] || {}; + targeting[adUnitCode] = { + // we use this to find gpt slot => prebid ad unit + [AD_UNIT_CODE_TARGETING_KEY]: adUnitCode, + ...targetingData[adUnitCode] + }; + }); + return targeting; +} +function executeCommand(command) { + window.mnjs.que.push(command); +} +function loadRtdScript(customerId) { + const url = getClientUrl(customerId, window.location.hostname); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_2__.loadExternalScript)(url, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_RTD, MODULE_NAME); +} +function getAdUnits(adUnits, adUnitCodes) { + adUnits = adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.getGlobal)().adUnits || []; + if (adUnitCodes && adUnitCodes.length) { + adUnits = adUnits.filter(unit => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)(adUnitCodes, unit.code)); + } + return adUnits; +} +const medianetRtdModule = { + name: MODULE_NAME, + init, + getBidRequestData, + onAuctionInitEvent, + getTargetingData +}; +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', medianetRtdModule); +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('medianetRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/medianetRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediasniperBidAdapter"],{ + +/***/ "./modules/mediasniperBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/mediasniperBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'mediasniper'; +const DEFAULT_BID_TTL = 360; +const DEFAULT_CURRENCY = 'RUB'; +const DEFAULT_NET_REVENUE = true; +const ENDPOINT = 'https://sapi.bumlam.com/prebid/'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Hello!! bid: ', JSON.stringify(bid)); + if (!bid || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(bid)) { + return false; + } + if (!bid.params || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(bid.params)) { + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.placementId) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params.placementId)) { + return false; + } + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner', {}); + if (!banner || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(banner)) { + return false; + } + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes', []); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(sizes)) { + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const payload = createOrtbTemplate(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'id', bidderRequest.bidderRequestId); + validBidRequests.forEach(validBid => { + let bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(validBid); + const imp = createImp(bid); + payload.imp.push(imp); + }); + + // params + const siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('siteid', validBidRequests[0].params) + ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'site.id', siteId); + + // Assign payload.site from refererinfo + if (bidderRequest.refererInfo) { + // TODO: reachedTop is probably not the right check - it may be false when page is available or vice-versa + if (bidderRequest.refererInfo.reachedTop) { + const sitePage = bidderRequest.refererInfo.page; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'site.page', sitePage); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'site.domain', bidderRequest.refererInfo.domain); + if (bidderRequest.refererInfo?.ref) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'site.ref', bidderRequest.refererInfo.ref); + } + } + } + const request = { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(payload) + }; + return request; + }, + interpretResponse(serverResponse, bidRequest) { + const bidResponses = []; + try { + if (serverResponse.body && serverResponse.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse.body.seatbid)) { + serverResponse.body.seatbid.forEach(bidderSeat => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidderSeat.bid) || !bidderSeat.bid.length) { + return; + } + bidderSeat.bid.forEach(bid => { + const newBid = { + requestId: bid.impid, + cpm: bid.price || 0, + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.adid || bid.id, + dealId: bid.dealid || null, + currency: serverResponse.body.cur || DEFAULT_CURRENCY, + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL, + // seconds. https://docs.prebid.org/dev-docs/faq.html#does-prebidjs-cache-bids + ad: bid.adm, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + burl: bid.nurl, + meta: { + advertiserDomains: Array.isArray(bid.adomain) && bid.adomain.length ? bid.adomain : [], + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('answer: ', JSON.stringify(newBid)); + bidResponses.push(newBid); + }); + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, e); + } + return bidResponses; + }, + onBidWon: function (bid) { + if (!bid.burl) { + return; + } + const url = bid.burl.replace(/\$\{AUCTION_PRICE\}/, bid.cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(url); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); + +/** + * Returns an openRTB 2.5 object. + * This one will be populated at each step of the buildRequest process. + * + * @returns {object} + */ +function createOrtbTemplate() { + return { + id: '', + cur: [DEFAULT_CURRENCY], + imp: [], + site: {}, + device: { + ip: '', + js: 1, + ua: navigator.userAgent + }, + user: {} + }; +} + +/** + * Create the OpenRTB 2.5 imp object. + * + * @param {*} bid Prebid bid object from request + * @returns + */ +function createImp(bid) { + let placementId = ''; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.placementId)) { + placementId = bid.params.placementId; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params.placementId)) { + placementId = bid.params.placementId.toString(); + } + const imp = { + id: bid.bidId, + tagid: placementId, + bidfloorcur: DEFAULT_CURRENCY, + secure: 1 + }; + + // There is no default floor. bidfloor is set only + // if the priceFloors module is activated and returns a valid floor. + const floor = getMinFloor(bid); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(floor)) { + imp.bidfloor = floor; + } + + // Only supports proper mediaTypes definition… + for (let mediaType in bid.mediaTypes) { + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + imp.banner = createBannerImp(bid); + break; + } + } + + // dealid + const dealId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('dealid', bid.params); + if (dealId) { + imp.pmp = { + private_auction: 1, + deals: [{ + id: dealId, + bidfloor: floor || 0, + bidfloorcur: DEFAULT_CURRENCY + }] + }; + } + return imp; +} + +/** + * Returns floor from priceFloors module or MediaKey default value. + * + * @param {*} bid a Prebid.js bid (request) object + * @param {string} mediaType the mediaType or the wildcard '*' + * @param {string|Array} size the size array or the wildcard '*' + * @returns {number|boolean} + */ +function getFloor(bid, mediaType) { + let size = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '*'; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return false; + } + if (spec.supportedMediaTypes.indexOf(mediaType) === -1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: Unable to detect floor price for unsupported mediaType ${mediaType}. No floor will be used.`); + return false; + } + const floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType, + size + }); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY ? floor.floor : false; +} +function getMinFloor(bid) { + const floors = []; + for (let mediaType in bid.mediaTypes) { + const floor = getFloor(bid, mediaType); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(floor)) { + floors.push(floor); + } + } + if (!floors.length) { + return false; + } + return floors.reduce((a, b) => { + return Math.min(a, b); + }); +} + +/** + * Returns an openRtb 2.5 banner object. + * + * @param {object} bid Prebid bid object from request + * @returns {object} + */ +function createBannerImp(bid) { + let sizes = bid.mediaTypes.banner.sizes; + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params', {}); + const banner = {}; + banner.w = parseInt(sizes[0][0], 10); + banner.h = parseInt(sizes[0][1], 10); + const format = []; + sizes.forEach(function (size) { + if (size.length && size.length > 1) { + format.push({ + w: size[0], + h: size[1] + }); + } + }); + banner.format = format; + banner.topframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1; + banner.pos = params.pos || 0; + return banner; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('mediasniperBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediasniperBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mediasquareBidAdapter"],{ + +/***/ "./modules/mediasquareBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/mediasquareBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'mediasquare'; +const BIDDER_URL_PROD = 'https://pbs-front.mediasquare.fr/'; +const BIDDER_URL_TEST = 'https://bidder-test.mediasquare.fr/'; +const BIDDER_ENDPOINT_AUCTION = 'msq_prebid'; +const BIDDER_ENDPOINT_WINNING = 'winning'; +const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const spec = { + code: BIDDER_CODE, + gvlid: 791, + aliases: ['msq'], + // short code + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.owner && bid.params.code); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let codes = []; + let endpoint = document.location.search.match(/msq_test=true/) ? BIDDER_URL_TEST : BIDDER_URL_PROD; + let floor = {}; + const test = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('debug') ? 1 : 0; + let adunitValue = null; + Object.keys(validBidRequests).forEach(key => { + floor = {}; + adunitValue = validBidRequests[key]; + if (typeof adunitValue.getFloor === 'function') { + if (Array.isArray(adunitValue.sizes)) { + adunitValue.sizes.forEach(value => { + let tmpFloor = adunitValue.getFloor({ + currency: 'USD', + mediaType: '*', + size: value + }); + if (tmpFloor != {}) { + floor[value.join('x')] = tmpFloor; + } + }); + } + let tmpFloor = adunitValue.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if (tmpFloor != {}) { + floor['*'] = tmpFloor; + } + } + codes.push({ + owner: adunitValue.params.owner, + code: adunitValue.params.code, + adunit: adunitValue.adUnitCode, + bidId: adunitValue.bidId, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: adunitValue.auctionId, + transactionId: adunitValue.ortb2Imp?.ext?.tid, + mediatypes: adunitValue.mediaTypes, + floor: floor + }); + }); + const payload = { + codes: codes, + // TODO: is 'page' the right value here? + referer: encodeURIComponent(bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation), + pbjs: "9.45.0-pre" + }; + if (bidderRequest) { + // modules informations (gdpr, ccpa, schain, userId) + if (bidderRequest.gdprConsent) { + payload.gdpr = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + } + if (bidderRequest.uspConsent) { + payload.uspConsent = bidderRequest.uspConsent; + } + if (bidderRequest.schain) { + payload.schain = bidderRequest.schain; + } + if (bidderRequest.userId) { + payload.userId = bidderRequest.userId; + } else if (bidderRequest.hasOwnProperty('bids') && typeof bidderRequest.bids == 'object' && bidderRequest.bids.length > 0 && bidderRequest.bids[0].hasOwnProperty('userId')) { + payload.userId = bidderRequest.bids[0].userId; + } + if (bidderRequest.ortb2?.regs?.ext?.dsa) { + payload.dsa = bidderRequest.ortb2.regs.ext.dsa; + } + } + ; + if (test) { + payload.debug = true; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: endpoint + BIDDER_ENDPOINT_AUCTION, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const serverBody = serverResponse.body; + // const headerValue = serverResponse.headers.get('some-response-header'); + const bidResponses = []; + let bidResponse = null; + let value = null; + if (serverBody.hasOwnProperty('responses')) { + Object.keys(serverBody['responses']).forEach(key => { + value = serverBody['responses'][key]; + bidResponse = { + requestId: value['bid_id'], + cpm: value['cpm'], + width: value['width'], + height: value['height'], + creativeId: value['creative_id'], + currency: value['currency'], + netRevenue: value['net_revenue'], + ttl: value['ttl'], + ad: value['ad'], + mediasquare: {}, + meta: { + 'advertiserDomains': value['adomain'] + } + }; + if ('dsa' in value) { + bidResponse.meta.dsa = value['dsa']; + } + let paramsToSearchFor = ['bidder', 'code', 'match', 'hasConsent', 'context', 'increment', 'ova']; + paramsToSearchFor.forEach(param => { + if (param in value) { + bidResponse['mediasquare'][param] = value[param]; + } + }); + if ('native' in value) { + bidResponse['native'] = value['native']; + bidResponse['mediaType'] = 'native'; + } else if ('video' in value) { + if ('url' in value['video']) { + bidResponse['vastUrl'] = value['video']['url']; + } + if ('xml' in value['video']) { + bidResponse['vastXml'] = value['video']['xml']; + } + bidResponse['mediaType'] = 'video'; + bidResponse['renderer'] = createRenderer(value, OUTSTREAM_RENDERER_URL); + } + if (value.hasOwnProperty('deal_id')) { + bidResponse['dealId'] = value['deal_id']; + } + bidResponses.push(bidResponse); + }); + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') && serverResponses[0].body.hasOwnProperty('cookies') && typeof serverResponses[0].body.cookies === 'object') { + return serverResponses[0].body.cookies; + } else { + return []; + } + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Object} bid The bid that won the auction + */ + onBidWon: function (bid) { + // fires a pixel to confirm a winning bid + if (bid.hasOwnProperty('mediaType') && bid.mediaType == 'video') { + return; + } + let params = { + pbjs: "9.45.0-pre", + referer: encodeURIComponent((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().topmostLocation) + }; + let endpoint = document.location.search.match(/msq_test=true/) ? BIDDER_URL_TEST : BIDDER_URL_PROD; + let paramsToSearchFor = ['bidder', 'code', 'match', 'hasConsent', 'context', 'increment', 'ova']; + if (bid.hasOwnProperty('mediasquare')) { + paramsToSearchFor.forEach(param => { + if (bid['mediasquare'].hasOwnProperty(param)) { + params[param] = bid['mediasquare'][param]; + if (typeof params[param] == 'number') { + params[param] = params[param].toString(); + } + } + }); + } + ; + paramsToSearchFor = ['cpm', 'size', 'mediaType', 'currency', 'creativeId', 'adUnitCode', 'timeToRespond', 'requestId', 'auctionId', 'originalCpm', 'originalCurrency']; + paramsToSearchFor.forEach(param => { + if (bid.hasOwnProperty(param)) { + params[param] = bid[param]; + if (typeof params[param] == 'number') { + params[param] = params[param].toString(); + } + } + }); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(endpoint + BIDDER_ENDPOINT_WINNING, null, JSON.stringify(params), { + method: 'POST', + withCredentials: true + }); + return true; + } +}; +function outstreamRender(bid) { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [bid.width, bid.height], + targetId: bid.adUnitCode, + adResponse: bid.adResponse, + rendererOptions: { + showBigPlayButton: false, + showProgressBar: 'bar', + showVolume: false, + allowFullscreen: true, + skippable: false, + content: bid.vastXml + } + }); + }); +} +function createRenderer(bid, url) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bid.bidId, + url: url, + loaded: false, + adUnitCode: bid.adUnitCode, + targetId: bid.adUnitCode + }); + renderer.setRender(outstreamRender); + return renderer; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('mediasquareBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mediasquareBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["merkleIdSystem"],{ + +/***/ "./modules/merkleIdSystem.js": +/*!***********************************!*\ + !*** ./modules/merkleIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, merkleIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds merkleId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/merkleIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'merkleId'; +const ID_URL = 'https://prebid.sv.rkdms.com/identity/'; +const DEFAULT_REFRESH = 7 * 3600; +const SESSION_COOKIE_NAME = '_svsid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function getSession(configParams) { + let session = null; + if (typeof configParams.sv_session === 'string') { + session = configParams.sv_session; + } else { + session = storage.getCookie(SESSION_COOKIE_NAME); + } + return session; +} +function setCookie(name, value, expires) { + let expTime = new Date(); + expTime.setTime(expTime.getTime() + expires * 1000 * 60); + storage.setCookie(name, value, expTime.toUTCString(), 'Lax'); +} +function setSession(storage, response) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Merkle setting ' + `${SESSION_COOKIE_NAME}`); + if (response && response[SESSION_COOKIE_NAME] && typeof response[SESSION_COOKIE_NAME] === 'string') { + setCookie(SESSION_COOKIE_NAME, response[SESSION_COOKIE_NAME], storage.expires); + } +} +function constructUrl(configParams) { + const session = getSession(configParams); + let url = configParams.endpoint + `?sv_domain=${configParams.sv_domain}&sv_pubid=${configParams.sv_pubid}&ssp_ids=${configParams.ssp_ids.join()}`; + if (session) { + url = `${url}&sv_session=${session}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Merkle url :' + url); + return url; +} +function generateId(configParams, configStorage) { + const url = constructUrl(configParams); + const resp = function (callback) { + _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajaxBuilder()(url, response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + setSession(configStorage, responseObj); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Merkle responseObj ' + JSON.stringify(responseObj)); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(error); + } + } + const date = new Date().toUTCString(); + responseObj.date = date; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Merkle responseObj with date ' + JSON.stringify(responseObj)); + callback(responseObj); + }, error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: merkleId fetch encountered an error`, error); + callback(); + }, { + method: 'GET', + withCredentials: true + }); + }; + return resp; +} + +/** @type {Submodule} */ +const merkleIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{eids:Array}} + */ + decode(value) { + // Legacy support for a single id + const id = value && value.pam_id && typeof value.pam_id.id === 'string' ? value.pam_id : undefined; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Merkle id ' + JSON.stringify(id)); + if (id) { + return { + 'merkleId': id + }; + } + + // Supports multiple IDs for different SSPs + const merkleIds = value && value?.merkleId && Array.isArray(value.merkleId) ? value.merkleId : undefined; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('merkleIds: ' + JSON.stringify(merkleIds)); + return merkleIds ? { + 'merkleId': merkleIds + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {IdResponse|undefined} + */ + getId(config, consentData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('User ID - merkleId generating id'); + const configParams = config && config.params || {}; + if (typeof configParams.sv_pubid !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - merkleId submodule requires a valid sv_pubid string to be defined'); + return; + } + if (!Array.isArray(configParams.ssp_ids)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - merkleId submodule requires a valid ssp_ids array to be defined'); + return; + } + if (consentData?.gdpr?.gdprApplies === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - merkleId submodule does not currently handle consent strings'); + return; + } + if (typeof configParams.endpoint !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('User ID - merkleId submodule endpoint string is not defined'); + configParams.endpoint = ID_URL; + } + if (typeof configParams.sv_domain !== 'string') { + configParams.sv_domain = merkleIdSubmodule.findRootDomain(); + } + const configStorage = config && config.storage || {}; + const resp = generateId(configParams, configStorage); + return { + callback: resp + }; + }, + extendId: function () { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let consentData = arguments.length > 1 ? arguments[1] : undefined; + let storedId = arguments.length > 2 ? arguments[2] : undefined; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('User ID - stored id ' + storedId); + const configParams = config && config.params || {}; + if (typeof configParams.endpoint !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('User ID - merkleId submodule endpoint string is not defined'); + configParams.endpoint = ID_URL; + } + if (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - merkleId submodule does not currently handle consent strings'); + return; + } + if (typeof configParams.sv_domain !== 'string') { + configParams.sv_domain = merkleIdSubmodule.findRootDomain(); + } + const configStorage = config && config.storage || {}; + if (configStorage && configStorage.refreshInSeconds && typeof configParams.refreshInSeconds === 'number') { + return { + id: storedId + }; + } + let refreshInSeconds = DEFAULT_REFRESH; + if (configParams && configParams.refreshInSeconds && typeof configParams.refreshInSeconds === 'number') { + refreshInSeconds = configParams.refreshInSeconds; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('User ID - merkleId param refreshInSeconds' + refreshInSeconds); + } + const storedDate = new Date(storedId.date); + let refreshNeeded = false; + if (storedDate) { + refreshNeeded = storedDate && Date.now() - storedDate.getTime() > refreshInSeconds * 1000; + if (refreshNeeded) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('User ID - merkleId needs refreshing id'); + const resp = generateId(configParams, configStorage); + return { + callback: resp + }; + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('User ID - merkleId not refreshed'); + return { + id: storedId + }; + }, + eids: { + 'merkleId': { + atype: 3, + getSource: function (data) { + if (data?.ext?.ssp) { + return `${data.ext.ssp}.merkleinc.com`; + } + return 'merkleinc.com'; + }, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.keyID) { + return { + keyID: data.keyID + }; + } + if (data.ext) { + return data.ext; + } + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', merkleIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('merkleIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/merkleIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mgidBidAdapter"],{ + +/***/ "./modules/mgidBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/mgidBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_mgidUtils_mgidUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/mgidUtils/mgidUtils.js */ "./libraries/mgidUtils/mgidUtils.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const GVLID = 358; +const DEFAULT_CUR = 'USD'; +const BIDDER_CODE = 'mgid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const ENDPOINT_URL = 'https://prebid.mgid.com/prebid/'; +const LOG_WARN_PREFIX = '[MGID warn]: '; +const LOG_INFO_PREFIX = '[MGID info]: '; +const NATIVE_ASSETS = { + 'TITLE': { + ID: 1, + KEY: 'title', + TYPE: 0 + }, + 'IMAGE': { + ID: 2, + KEY: 'image', + TYPE: 0 + }, + 'ICON': { + ID: 3, + KEY: 'icon', + TYPE: 0 + }, + 'SPONSOREDBY': { + ID: 4, + KEY: 'sponsoredBy', + TYPE: 1 + }, + // please note that type of SPONSORED is also 1 + 'DESC': { + ID: 5, + KEY: 'data', + TYPE: 2 + }, + // please note that type of BODY is also set to 2 + 'PRICE': { + ID: 6, + KEY: 'price', + TYPE: 6 + }, + 'SALEPRICE': { + ID: 7, + KEY: 'saleprice', + TYPE: 7 + }, + 'DISPLAYURL': { + ID: 8, + KEY: 'displayurl', + TYPE: 11 + }, + 'CTA': { + ID: 9, + KEY: 'cta', + TYPE: 12 + }, + 'BODY': { + ID: 10, + KEY: 'body', + TYPE: 2 + }, + // please note that type of DESC is also set to 2 + 'SPONSORED': { + ID: 11, + KEY: 'sponsored', + TYPE: 1 + } // please note that type of SPONSOREDBY is also set to 1 +}; +const NATIVE_ASSET_IMAGE_TYPE = { + 'ICON': 1, + 'IMAGE': 3 +}; +const DEFAULT_IMAGE_WIDTH = 492; +const DEFAULT_IMAGE_HEIGHT = 328; +const DEFAULT_ICON_WIDTH = 50; +const DEFAULT_ICON_HEIGHT = 50; +const DEFAULT_TITLE_LENGTH = 80; +let isInvalidNativeRequest = false; + +// check if title, image can be added with mandatory field default values +const NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS = [{ + id: NATIVE_ASSETS.SPONSOREDBY.ID, + required: true, + data: { + type: 1 + } +}, { + id: NATIVE_ASSETS.TITLE.ID, + required: true +}, { + id: NATIVE_ASSETS.IMAGE.ID, + required: true +}]; +let _NATIVE_ASSET_ID_TO_KEY_MAP = {}; +let _NATIVE_ASSET_KEY_TO_ASSET_MAP = {}; + +// loading _NATIVE_ASSET_ID_TO_KEY_MAP +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(NATIVE_ASSETS, anAsset => { + _NATIVE_ASSET_ID_TO_KEY_MAP[anAsset.ID] = anAsset.KEY; +}); +// loading _NATIVE_ASSET_KEY_TO_ASSET_MAP +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(NATIVE_ASSETS, anAsset => { + _NATIVE_ASSET_KEY_TO_ASSET_MAP[anAsset.KEY] = anAsset; +}); +const spec = { + VERSION: '1.8', + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + reId: /^[1-9][0-9]*$/, + NATIVE_ASSET_ID_TO_KEY_MAP: _NATIVE_ASSET_ID_TO_KEY_MAP, + NATIVE_ASSET_KEY_TO_ASSET_MAP: _NATIVE_ASSET_KEY_TO_ASSET_MAP, + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + const banner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner'); + const native = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.native'); + let nativeOk = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(native); + if (nativeOk) { + const nativeParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'nativeParams'); + let assetsCount = 0; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(nativeParams)) { + for (let k in nativeParams) { + let v = nativeParams[k]; + const supportProp = spec.NATIVE_ASSET_KEY_TO_ASSET_MAP.hasOwnProperty(k); + if (supportProp) { + assetsCount++; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(v) || !supportProp && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(v, 'required')) { + nativeOk = false; + break; + } + } + } + nativeOk = nativeOk && assetsCount > 0; + } + let bannerOk = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(banner); + if (bannerOk) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(banner, 'sizes'); + bannerOk = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes) && sizes.length > 0; + for (let f = 0; bannerOk && f < sizes.length; f++) { + bannerOk = sizes[f].length === 2; + } + } + let acc = Number(bid.params.accountId); + let plcmt = Number(bid.params.placementId); + return (bannerOk || nativeOk) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bid.params) && !!bid.adUnitCode && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.adUnitCode) && (plcmt > 0 ? bid.params.placementId.toString().search(spec.reId) === 0 : true) && !!acc && acc > 0 && bid.params.accountId.toString().search(spec.reId) === 0; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests A non-empty list of bid requests which should be sent to the Server. + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const [bidRequest] = validBidRequests; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_INFO_PREFIX + `buildRequests`); + if (validBidRequests.length === 0) { + return; + } + const info = pageInfo(); + const accountId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.accountId'); + const muid = getLocalStorageSafely('mgMuidn'); + let url = ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.bidUrl') || ENDPOINT_URL) + accountId; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(muid) && muid.length > 0) { + url += '?muid=' + muid; + } + const cur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.currency') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'params.cur') || (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_5__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CUR; + const secure = window.location.protocol === 'https:' ? 1 : 0; + let imp = []; + validBidRequests.forEach(bid => { + let tagid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.placementId') || 0; + tagid = !tagid ? bid.adUnitCode : tagid + '/' + bid.adUnitCode; + let impObj = { + id: bid.bidId, + tagid, + secure + }; + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.gpid'); + gpid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(gpid) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(impObj, `ext.gpid`, gpid); + const floorData = getBidFloor(bid, cur); + if (floorData.floor) { + impObj.bidfloor = floorData.floor; + } + if (floorData.cur) { + impObj.bidfloorcur = floorData.cur; + } + for (let mediaTypes in bid.mediaTypes) { + switch (mediaTypes) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER: + impObj.banner = createBannerRequest(bid); + imp.push(impObj); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE: + const native = createNativeRequest(bid.nativeParams); + if (!isInvalidNativeRequest) { + impObj.native = { + 'request': native + }; + imp.push(impObj); + } + break; + } + } + }); + if (imp.length === 0) { + return; + } + const ortb2Data = bidderRequest?.ortb2 || {}; + let request = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'bidderRequestId'), + site: ortb2Data?.site || {}, + cur: [cur], + geo: { + utcoffset: info.timeOffset + }, + device: ortb2Data?.device || {}, + ext: { + mgid_ver: spec.VERSION, + prebid_ver: "9.45.0-pre" + }, + imp, + tmax: bidderRequest?.timeout || _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('bidderTimeout') || 500 + }; + // request level + const bcat = ortb2Data?.bcat || bidRequest?.params?.bcat || []; + const badv = ortb2Data?.badv || bidRequest?.params?.badv || []; + const wlang = ortb2Data?.wlang || bidRequest?.params?.wlang || []; + if (bcat.length > 0) { + request.bcat = bcat; + } + if (badv.length > 0) { + request.badv = badv; + } + if (wlang.length > 0) { + request.wlang = wlang; + } + // site level + const page = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'refererInfo.page') || info.location; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.site, 'domain'))) { + const hostname = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)(page).hostname; + request.site.domain = extractDomainFromHostExceptLocalhost(hostname) || hostname; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.site, 'page'))) { + request.site.page = page; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.site, 'ref'))) { + const ref = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'refererInfo.ref') || info.referrer; + if (ref) { + request.site.ref = ref; + } + } + // device level + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.device, 'ua'))) { + request.device.ua = navigator.userAgent; + } + request.device.js = 1; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.device, 'dnt'))) { + request.device.dnt = navigator?.doNotTrack === 'yes' || navigator?.doNotTrack === '1' || navigator?.msDoNotTrack === '1' ? 1 : 0; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.device, 'h'))) { + request.device.h = screen.height; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.device, 'w'))) { + request.device.w = screen.width; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.device, 'language'))) { + request.device.language = getLanguage(); + } + // user & regs & privacy + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(ortb2Data?.user)) { + request.user = ortb2Data.user; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(ortb2Data?.regs)) { + request.regs = ortb2Data.regs; + } + if (bidderRequest && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bidderRequest.gdprConsent)) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.user, 'ext.consent'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.consent', bidderRequest.gdprConsent?.consentString); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.regs, 'ext.gdpr'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gdpr', bidderRequest.gdprConsent?.gdprApplies ? 1 : 0); + } + } + const userId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'userId'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(userId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.id', userId); + } + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'userIdAsEids'); + if (eids && eids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.eids', eids); + } + if (bidderRequest && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bidderRequest.uspConsent)) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.regs, 'ext.us_privacy'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + } + if (bidderRequest && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bidderRequest.gppConsent)) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.regs, 'gpp'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.gpp', bidderRequest.gppConsent?.gppString); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.regs, 'gpp_sid'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.gpp_sid', bidderRequest.gppConsent?.applicableSections); + } + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('coppa')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(request.regs, 'coppa'))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.coppa', 1); + } + } + const schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.setOnAny)(validBidRequests, 'schain'); + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'source.ext.schain', schain); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_INFO_PREFIX + `buildRequest:`, request); + return { + method: 'POST', + url: url, + data: JSON.stringify(request) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequests + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (serverResponse, bidRequests) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_INFO_PREFIX + `interpretResponse`, serverResponse); + if (serverResponse == null || serverResponse.body == null || serverResponse.body === '' || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse.body.seatbid) || !serverResponse.body.seatbid.length) { + return; + } + const returnedBids = []; + const muidn = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(serverResponse.body, 'ext.muidn'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(muidn) && muidn.length > 0) { + setLocalStorageSafely('mgMuidn', muidn); + } + serverResponse.body.seatbid.forEach(bids => { + bids.bid.forEach(bid => { + const pbid = prebidBid(bid, serverResponse.body.cur); + if (pbid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(pbid.native)) { + return; + } + returnedBids.push(pbid); + }); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_INFO_PREFIX + `interpretedResponse`, returnedBids); + return returnedBids; + }, + onBidWon: bid => { + const cpm = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'adserverTargeting.hb_pb') || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerNurlWithCpm)(bid, cpm); + if (bid.isBurl) { + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER) { + bid.ad = bid.ad.replace(/\${AUCTION_PRICE}/, cpm); + } else { + bid.burl = bid.burl.replace(/\${AUCTION_PRICE}/, cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(bid.burl); + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_INFO_PREFIX + `onBidWon`); + }, + getUserSyncs: _libraries_mgidUtils_mgidUtils_js__WEBPACK_IMPORTED_MODULE_8__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); + +/** + * Unpack the Server's Bid into a Prebid-compatible one. + * @param serverBid + * @param cur + * @return Bid + */ +function prebidBid(serverBid, cur) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(cur) || cur === '') { + cur = DEFAULT_CUR; + } + const bid = { + requestId: serverBid.impid, + ad: serverBid.adm, + cpm: serverBid.price, + creativeId: serverBid.adid, + currency: cur, + dealId: serverBid.dealid || '', + width: serverBid.w, + height: serverBid.h, + mediaType: 'banner', + netRevenue: true, + ttl: serverBid.ttl || 300, + nurl: serverBid.nurl || '', + burl: serverBid.burl || '', + isBurl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(serverBid.burl) && serverBid.burl.length > 0, + meta: { + advertiserDomains: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverBid.adomain) && serverBid.adomain.length > 0 ? serverBid.adomain : [] + } + }; + setMediaType(serverBid, bid); + switch (bid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER: + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE: + parseNativeResponse(serverBid, bid); + break; + } + return bid; +} +function setMediaType(bid, newBid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ext.crtype') === 'native') { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE; + } else { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + } +} +function extractDomainFromHostExceptLocalhost(pageHost) { + if (pageHost === 'localhost') { + return 'localhost'; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.extractDomainFromHost)(pageHost); +} +function getLanguage() { + const language = navigator.language ? 'language' : 'userLanguage'; + const lang2 = navigator[language].split('-')[0]; + if (lang2.length === 2 || lang2.length === 3) { + return lang2; + } + return ''; +} +function getLocalStorageSafely(key) { + try { + return storage.getDataFromLocalStorage(key); + } catch (e) { + return null; + } +} +function setLocalStorageSafely(key, val) { + try { + return storage.setDataInLocalStorage(key, val); + } catch (e) { + return null; + } +} +function createBannerRequest(bid) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.sizes'); + let format = []; + if (sizes.length > 1) { + for (let f = 0; f < sizes.length; f++) { + if (sizes[f].length === 2) { + format.push({ + w: sizes[f][0], + h: sizes[f][1] + }); + } + } + } + let r = { + w: sizes && sizes[0][0], + h: sizes && sizes[0][1] + }; + if (format.length) { + r.format = format; + } + const pos = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.pos') || 0; + if (pos) { + r.pos = pos; + } + return r; +} +function createNativeRequest(params) { + let nativeRequestObject = { + plcmtcnt: 1, + assets: [] + }; + for (let key in params) { + let assetObj = {}; + if (params.hasOwnProperty(key)) { + if (!(nativeRequestObject.assets && nativeRequestObject.assets.length > 0 && nativeRequestObject.assets.hasOwnProperty(key))) { + switch (key) { + case NATIVE_ASSETS.TITLE.KEY: + assetObj = { + id: NATIVE_ASSETS.TITLE.ID, + required: params[key].required ? 1 : 0, + title: { + len: params[key].len || params[key].length || DEFAULT_TITLE_LENGTH + } + }; + break; + case NATIVE_ASSETS.IMAGE.KEY: + const wmin = params[key].wmin || params[key].minimumWidth || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params[key].minsizes) && params[key].minsizes.length > 0 ? params[key].minsizes[0] : 0); + const hmin = params[key].hmin || params[key].minimumHeight || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params[key].minsizes) && params[key].minsizes.length > 1 ? params[key].minsizes[1] : 0); + assetObj = { + id: NATIVE_ASSETS.IMAGE.ID, + required: params[key].required ? 1 : 0, + img: { + type: NATIVE_ASSET_IMAGE_TYPE.IMAGE, + w: params[key].w || params[key].width || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params[key].sizes) && params[key].sizes.length > 0 ? params[key].sizes[0] : 0), + h: params[key].h || params[key].height || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params[key].sizes) && params[key].sizes.length > 1 ? params[key].sizes[1] : 0), + mimes: params[key].mimes, + ext: params[key].ext + } + }; + if (wmin > 0) { + assetObj.img.wmin = wmin; + } + if (hmin > 0) { + assetObj.img.hmin = hmin; + } + if (!assetObj.img.w) { + assetObj.img.w = DEFAULT_IMAGE_WIDTH; + } + if (!assetObj.img.h) { + assetObj.img.h = DEFAULT_IMAGE_HEIGHT; + } + break; + case NATIVE_ASSETS.ICON.KEY: + assetObj = { + id: NATIVE_ASSETS.ICON.ID, + required: params[key].required ? 1 : 0, + img: { + type: NATIVE_ASSET_IMAGE_TYPE.ICON, + w: params[key].w || params[key].width || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params[key].sizes) && params[key].sizes.length > 0 ? params[key].sizes[0] : 0), + h: params[key].h || params[key].height || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params[key].sizes) && params[key].sizes.length > 0 ? params[key].sizes[1] : 0) + } + }; + if (!assetObj.img.w) { + assetObj.img.w = DEFAULT_ICON_WIDTH; + } + if (!assetObj.img.h) { + assetObj.img.h = DEFAULT_ICON_HEIGHT; + } + break; + case NATIVE_ASSETS.SPONSORED.KEY: + case NATIVE_ASSETS.SPONSOREDBY.KEY: + case NATIVE_ASSETS.PRICE.KEY: + case NATIVE_ASSETS.SALEPRICE.KEY: + case NATIVE_ASSETS.DESC.KEY: + case NATIVE_ASSETS.BODY.KEY: + case NATIVE_ASSETS.DISPLAYURL.KEY: + case NATIVE_ASSETS.CTA.KEY: + assetObj = commonNativeRequestObject(spec.NATIVE_ASSET_KEY_TO_ASSET_MAP[key], params); + break; + default: + if (params[key].required) { + isInvalidNativeRequest = true; + return; + } + } + } + } + if (assetObj.id) { + nativeRequestObject.assets[nativeRequestObject.assets.length] = assetObj; + } + } + + // for native image adtype prebid has to have few required assests i.e. title,sponsoredBy, image + // if any of these are missing from the request then request will not be sent + let requiredAssetCount = NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS.length; + let presentrequiredAssetCount = 0; + NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS.forEach(ele => { + let lengthOfExistingAssets = nativeRequestObject.assets.length; + for (let i = 0; i < lengthOfExistingAssets; i++) { + if (ele.id === nativeRequestObject.assets[i].id) { + presentrequiredAssetCount++; + break; + } else { + if (ele.id === 4 && nativeRequestObject.assets[i].id === 11) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(nativeRequestObject.assets[i], 'data.type') === ele.data.type) { + presentrequiredAssetCount++; + break; + } + } + } + } + }); + isInvalidNativeRequest = requiredAssetCount !== presentrequiredAssetCount; + return nativeRequestObject; +} +function commonNativeRequestObject(nativeAsset, params) { + const key = nativeAsset.KEY; + return { + id: nativeAsset.ID, + required: params[key].required ? 1 : 0, + data: { + type: nativeAsset.TYPE, + len: params[key].len, + ext: params[key].ext + } + }; +} +function parseNativeResponse(bid, newBid) { + newBid.native = {}; + if (bid.hasOwnProperty('adm')) { + let nativeAdm = ''; + try { + nativeAdm = JSON.parse(bid.adm); + } catch (ex) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_WARN_PREFIX + 'Error: Cannot parse native response for ad response: ' + newBid.adm); + return; + } + if (nativeAdm && nativeAdm.native && nativeAdm.native.assets && nativeAdm.native.assets.length > 0) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE; + for (let i = 0, len = nativeAdm.native.assets.length; i < len; i++) { + switch (nativeAdm.native.assets[i].id) { + case NATIVE_ASSETS.TITLE.ID: + newBid.native.title = nativeAdm.native.assets[i].title && nativeAdm.native.assets[i].title.text; + break; + case NATIVE_ASSETS.IMAGE.ID: + newBid.native.image = copyFromAdmAsset(nativeAdm.native.assets[i]); + break; + case NATIVE_ASSETS.ICON.ID: + newBid.native.icon = copyFromAdmAsset(nativeAdm.native.assets[i]); + break; + case NATIVE_ASSETS.SPONSOREDBY.ID: + case NATIVE_ASSETS.SPONSORED.ID: + case NATIVE_ASSETS.PRICE: + case NATIVE_ASSETS.SALEPRICE.ID: + case NATIVE_ASSETS.DESC.ID: + case NATIVE_ASSETS.BODY.ID: + case NATIVE_ASSETS.DISPLAYURL.ID: + case NATIVE_ASSETS.CTA.ID: + newBid.native[spec.NATIVE_ASSET_ID_TO_KEY_MAP[nativeAdm.native.assets[i].id]] = nativeAdm.native.assets[i].data && nativeAdm.native.assets[i].data.value; + break; + } + } + newBid.native.clickUrl = nativeAdm.native.link && nativeAdm.native.link.url; + newBid.native.clickTrackers = nativeAdm.native.link && nativeAdm.native.link.clicktrackers || []; + newBid.native.impressionTrackers = nativeAdm.native.imptrackers || []; + newBid.native.jstracker = nativeAdm.native.jstracker || []; + newBid.width = 0; + newBid.height = 0; + } + } +} +function pageInfo() { + var w, d, l, r, m, p, t; + for (w = window, d = w.document, l = d.location.href, r = d.referrer, m = 0, t = new Date(); w !== w.parent;) { + try { + p = w.parent; + l = p.location.href; + r = p.document.referrer; + w = p; + } catch (e) { + m = top !== w.parent ? 2 : 1; + break; + } + } + return { + location: l, + referrer: r || '', + masked: m, + wWidth: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerWidth, + wHeight: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerHeight, + date: t.toUTCString(), + timeOffset: t.getTimezoneOffset() + }; +} + +/** + * Get the floor price from bid.params for backward compatibility. + * If not found, then check floor module. + * @param bid A valid bid object + * @param cur + * @returns {*|number} floor price + */ +function getBidFloor(bid, cur) { + let bidFloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidfloor', bid.params) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidFloor', bid.params) || 0; + const reqCur = cur; + if (!bidFloor && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + const floorObj = bid.getFloor({ + currency: '*', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorObj) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(floorObj.floor)) { + if (!floorObj.currency && reqCur !== DEFAULT_CUR) { + floorObj.currency = DEFAULT_CUR; + } + if (floorObj.currency && reqCur !== floorObj.currency) { + cur = floorObj.currency; + } + bidFloor = floorObj.floor; + } + } + if (reqCur === cur) { + cur = ''; + } + return { + floor: bidFloor, + cur: cur + }; +} +function copyFromAdmAsset(asset) { + return { + url: asset.img && asset.img.url, + height: asset.img && asset.img.h, + width: asset.img && asset.img.w + }; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('mgidBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","mgidUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mgidBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mgidRtdProvider"],{ + +/***/ "./modules/mgidRtdProvider.js": +/*!************************************!*\ + !*** ./modules/mgidRtdProvider.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, mgidSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'mgid'; +const MGID_RTD_API_URL = 'https://servicer.mgid.com/sda'; +const MGUID_LOCAL_STORAGE_KEY = 'mguid'; +const ORTB2_NAME = 'www.mgid.com'; +const GVLID = 358; +/** @type {?Object} */ +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +function init(moduleConfig) { + if (!moduleConfig?.params?.clientSiteId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Mgid clientSiteId is not set!'); + return false; + } + return true; +} +function getBidRequestData(reqBidsConfigObj, onDone, moduleConfig, userConsent) { + let mguid; + try { + mguid = storage.getDataFromLocalStorage(MGUID_LOCAL_STORAGE_KEY); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Can't get mguid from localstorage`); + } + const params = [{ + name: 'gdprApplies', + data: typeof userConsent?.gdpr?.gdprApplies !== 'undefined' ? userConsent?.gdpr?.gdprApplies + '' : undefined + }, { + name: 'consentData', + data: userConsent?.gdpr?.consentString + }, { + name: 'uspString', + data: userConsent?.usp + }, { + name: 'cxurl', + data: encodeURIComponent(getContextUrl()) + }, { + name: 'muid', + data: mguid + }, { + name: 'clientSiteId', + data: moduleConfig?.params?.clientSiteId + }, { + name: 'cxlang', + data: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(reqBidsConfigObj.ortb2Fragments.global, 'site.content.language') + }]; + const url = MGID_RTD_API_URL + '?' + params.filter(p => p.data).map(p => p.name + '=' + p.data).join('&'); + let isDone = false; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, { + success: (response, req) => { + if (req.status === 200) { + try { + const data = JSON.parse(response); + const ortb2 = reqBidsConfigObj?.ortb2Fragments?.global || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ortb2, getDataForMerge(data)); + if (data?.muid) { + try { + mguid = storage.setDataInLocalStorage(MGUID_LOCAL_STORAGE_KEY, data.muid); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Can't set mguid to localstorage`); + } + } + onDone(); + isDone = true; + } catch (e) { + onDone(); + isDone = true; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Unable to parse Mgid RTD data', e); + } + } else { + onDone(); + isDone = true; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Mgid RTD wrong response status'); + } + }, + error: () => { + onDone(); + isDone = true; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Unable to get Mgid RTD data'); + } + }, null, { + method: 'GET', + withCredentials: false + }); + setTimeout(function () { + if (!isDone) { + onDone(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Mgid RTD timeout'); + isDone = true; + } + }, moduleConfig.params.timeout || 1000); +} +function getContextUrl() { + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_5__.getRefererInfo)(); + let resultUrl = refererInfo.canonicalUrl || refererInfo.topmostLocation; + const metaElements = document.getElementsByTagName('meta'); + for (let i = 0; i < metaElements.length; i++) { + if (metaElements[i].getAttribute('property') === 'og:url') { + resultUrl = metaElements[i].content; + } + } + return resultUrl; +} +function getDataForMerge(responseData) { + let siteData = { + name: ORTB2_NAME + }; + let userData = { + name: ORTB2_NAME + }; + if (responseData.siteSegments) { + siteData.segment = responseData.siteSegments.map(segmentId => ({ + id: segmentId + })); + } + if (responseData.siteSegtax) { + siteData.ext = { + segtax: responseData.siteSegtax + }; + } + if (responseData.userSegments) { + userData.segment = responseData.userSegments.map(segmentId => ({ + id: segmentId + })); + } + if (responseData.userSegtax) { + userData.ext = { + segtax: responseData.userSegtax + }; + } + let result = {}; + if (siteData.segment || siteData.ext) { + result.site = { + content: { + data: [siteData] + } + }; + } + if (userData.segment || userData.ext) { + result.user = { + data: [userData] + }; + } + return result; +} + +/** @type {RtdSubmodule} */ +const mgidSubmodule = { + name: SUBMODULE_NAME, + init: init, + getBidRequestData: getBidRequestData, + gvlid: GVLID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)(MODULE_NAME, mgidSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('mgidRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mgidRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mgidXBidAdapter"],{ + +/***/ "./modules/mgidXBidAdapter.js": +/*!************************************!*\ + !*** ./modules/mgidXBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); +/* harmony import */ var _libraries_mgidUtils_mgidUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/mgidUtils/mgidUtils.js */ "./libraries/mgidUtils/mgidUtils.js"); + + + + + +const BIDDER_CODE = 'mgidX'; +const GVLID = 358; +const AD_URL = 'https://#{REGION}#.mgid.com/pbjs'; +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const request = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.buildRequestsBase)({ + adUrl: AD_URL, + validBidRequests, + bidderRequest + }); + const region = validBidRequests[0].params?.region; + if (region === 'eu') { + request.url = AD_URL.replace('#{REGION}#', 'eu-x'); + } else { + request.url = AD_URL.replace('#{REGION}#', 'us-east-x'); + } + return request; +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.isBidRequestValid)(), + buildRequests, + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.interpretResponse, + getUserSyncs: _libraries_mgidUtils_mgidUtils_js__WEBPACK_IMPORTED_MODULE_2__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('mgidXBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","mgidUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mgidXBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["michaoBidAdapter"],{ + +/***/ "./modules/michaoBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/michaoBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, domainLogger */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + +const ENV = { + BIDDER_CODE: 'michao', + SUPPORTED_MEDIA_TYPES: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + ENDPOINT: 'https://rtb.michao-ssp.com/openrtb/prebid', + NET_REVENUE: true, + DEFAULT_CURRENCY: 'USD', + OUTSTREAM_RENDERER_URL: 'https://cdn.jsdelivr.net/npm/in-renderer-js@1/dist/in-video-renderer.umd.min.js' +}; +const spec = { + code: ENV.BIDDER_CODE, + supportedMediaTypes: ENV.SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bid) { + const params = bid.params; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(params?.site)) { + domainLogger.invalidSiteError(params?.site); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(params?.placement)) { + domainLogger.invalidPlacementError(params?.placement); + return false; + } + if (params?.partner) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(params?.partner)) { + domainLogger.invalidPartnerError(params?.partner); + return false; + } + } + if (params?.test) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean)(params?.test)) { + domainLogger.invalidTestParamError(params?.test); + return false; + } + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const bidRequests = []; + validBidRequests.forEach(validBidRequest => { + let bidRequestEachFormat = []; + if (validBidRequest.mediaTypes?.banner) { + bidRequestEachFormat.push({ + ...validBidRequest, + mediaTypes: { + banner: validBidRequest.mediaTypes.banner + } + }); + } + if (validBidRequest.mediaTypes?.native) { + bidRequestEachFormat.push({ + ...validBidRequest, + mediaTypes: { + native: validBidRequest.mediaTypes.native + } + }); + } + if (validBidRequest.mediaTypes?.video) { + bidRequestEachFormat.push({ + ...validBidRequest, + mediaTypes: { + video: validBidRequest.mediaTypes.video + } + }); + } + bidRequests.push(buildRequest(bidRequestEachFormat, bidderRequest)); + }); + return bidRequests; + }, + interpretResponse: function (serverResponse, request) { + return converter.fromORTB({ + response: serverResponse.body, + request: request.data + }).bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: 'https://sync.michao-ssp.com/cookie-syncs?' + generateGdprParams(gdprConsent) + }]; + } + return []; + }, + onBidBillable: function (bid) { + if (bid.burl && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.burl)) { + const billingUrls = generateBillableUrls(bid); + billingUrls.forEach(billingUrl => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(billingUrl); + }); + } + } +}; +const domainLogger = { + invalidSiteError(value) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Michao Bid Adapter: Invalid site ID. Expected number, got ${typeof value}. Value: ${value}`); + }, + invalidPlacementError(value) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Michao Bid Adapter: Invalid placement. Expected string, got ${typeof value}. Value: ${value}`); + }, + invalidPartnerError(value) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Michao Bid Adapter: Invalid partner ID. Expected number, got ${typeof value}. Value: ${value}`); + }, + invalidTestParamError(value) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Michao Bid Adapter: Invalid test parameter. Expected boolean, got ${typeof value}. Value: ${value}`); + } +}; +function buildRequest(bidRequests, bidderRequest) { + const openRTBBidRequest = converter.toORTB({ + bidRequests: bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: ENV.ENDPOINT, + data: openRTBBidRequest, + options: { + contentType: 'application/json', + withCredentials: true + } + }; +} +function generateGdprParams(gdprConsent) { + let gdprParams = ''; + if (typeof gdprConsent === 'object') { + if (gdprConsent?.gdprApplies) { + gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString || ''}`; + } + } + return gdprParams; +} +function generateBillableUrls(bid) { + const billingUrls = []; + const cpm = bid.originalCpm || bid.cpm; + const billingUrl = new URL(bid.burl); + const burlParam = billingUrl.searchParams.get('burl'); + if (burlParam) { + billingUrl.searchParams.delete('burl'); + billingUrls.push((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(burlParam, cpm)); + } + billingUrls.push((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice)(billingUrl.toString(), cpm)); + return billingUrls; +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + request(buildRequest, imps, bidderRequest, context) { + const bidRequest = context.bidRequests[0]; + const openRTBBidRequest = buildRequest(imps, bidderRequest, context); + openRTBBidRequest.cur = [ENV.DEFAULT_CURRENCY]; + openRTBBidRequest.test = bidRequest.params?.test ? 1 : 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRTBBidRequest, 'site.ext.michao.site', bidRequest.params.site.toString()); + if (bidRequest?.schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRTBBidRequest, 'source.schain', bidRequest.schain); + } + if (bidRequest.params?.partner) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRTBBidRequest, 'site.publisher.ext.michao.partner', bidRequest.params.partner.toString()); + } + return openRTBBidRequest; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext.michao.placement', bidRequest.params.placement.toString()); + if (!bidRequest.mediaTypes?.native) { + delete imp.native; + } + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + const { + bidRequest + } = context; + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && bidRequest.mediaTypes.video.context === 'outstream') { + bidResponse.vastXml = bid.adm; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__.Renderer.install({ + url: ENV.OUTSTREAM_RENDERER_URL, + id: bidRequest.bidId, + adUnitCode: bidRequest.adUnitCode + }); + renderer.setRender(bid => { + bid.renderer.push(() => { + const inRenderer = new window.InVideoRenderer(); + inRenderer.render(bid.adUnitCode, bid); + }); + }); + bidResponse.renderer = renderer; + } + return bidResponse; + }, + context: { + netRevenue: ENV.NET_REVENUE, + currency: ENV.DEFAULT_CURRENCY, + ttl: 360 + } +}); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('michaoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/michaoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["microadBidAdapter"],{ + +/***/ "./modules/microadBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/microadBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENVIRONMENT, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + +const BIDDER_CODE = 'microad'; +const ENDPOINT_URLS = { + 'production': 'https://s-rtb-pb.send.microad.jp/prebid', + 'test': 'https://rtbtest.send.microad.jp/prebid' +}; +let ENVIRONMENT = 'production'; + +/* eslint-disable no-template-curly-in-string */ +const EXT_URL_STRING = '${COMPASS_EXT_URL}'; +const EXT_REF_STRING = '${COMPASS_EXT_REF}'; +const EXT_IFA_STRING = '${COMPASS_EXT_IFA}'; +const EXT_APPID_STRING = '${COMPASS_EXT_APPID}'; +/* eslint-enable no-template-curly-in-string */ + +const BANNER_CODE = 1; +const NATIVE_CODE = 2; +const VIDEO_CODE = 4; +const AUDIENCE_IDS = [{ + type: 6, + bidKey: 'userId.imuid', + source: 'intimatemerger.com' +}, { + type: 8, + bidKey: 'userId.id5id.uid', + source: 'id5-sync.com' +}, { + type: 9, + bidKey: 'userId.tdid', + source: 'adserver.org' +}, { + type: 10, + bidKey: 'userId.novatiq.snowflake', + source: 'novatiq.com' +}, { + type: 12, + bidKey: 'userId.dacId.id', + source: 'dac.co.jp' +}, { + type: 13, + bidKey: 'userId.idl_env', + source: 'liveramp.com' +}, { + type: 14, + bidKey: 'userId.criteoId', + source: 'criteo.com' +}, { + type: 15, + bidKey: 'userId.pubcid', + source: 'pubcid.org' +}, { + type: 17, + bidKey: 'userId.uid2.id', + source: 'uidapi.com' +}]; +function createCBT() { + const randomValue = Math.floor(Math.random() * Math.pow(10, 18)).toString(16); + const date = new Date().getTime().toString(16); + return randomValue + date; +} +function createBitSequenceFromMediaType(hi, code) { + return (hi ? -1 : 0) & code; +} +function convertMediaTypes(bid) { + return createBitSequenceFromMediaType(bid.mediaTypes.banner, BANNER_CODE) | createBitSequenceFromMediaType(bid.mediaTypes.native, NATIVE_CODE) | createBitSequenceFromMediaType(bid.mediaTypes.video, VIDEO_CODE); +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!(bid && bid.params && bid.params.spot && bid.mediaTypes && (bid.mediaTypes.banner || bid.mediaTypes.native || bid.mediaTypes.video)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const requests = []; + validBidRequests.forEach(bid => { + const bidParams = bid.params; + const params = { + spot: bidParams.spot, + // TODO: are these the right refererInfo values - does the fallback make sense here? + url: bidderRequest.refererInfo.page || window.location.href, + referrer: bidderRequest.refererInfo.ref, + bid_id: bid.bidId, + transaction_id: bid.ortb2Imp?.ext?.tid, + media_types: convertMediaTypes(bid), + cbt: createCBT() + }; + if (bidParams.url) { + params['url_macro'] = bidParams.url.replace(EXT_URL_STRING, ''); + } + if (bidParams.referrer) { + params['referrer_macro'] = bidParams.referrer.replace(EXT_REF_STRING, ''); + } + if (bidParams.ifa) { + params['ifa'] = bidParams.ifa.replace(EXT_IFA_STRING, ''); + } + if (bidParams.appid) { + params['appid'] = bidParams.appid.replace(EXT_APPID_STRING, ''); + } + const aidsParams = []; + const userIdAsEids = bid.userIdAsEids; + AUDIENCE_IDS.forEach(audienceId => { + const bidAudienceId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, audienceId.bidKey); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(bidAudienceId) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(bidAudienceId)) { + const aidParam = { + type: audienceId.type, + id: bidAudienceId + }; + // Set ext + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(userIdAsEids)) { + const targetEid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(userIdAsEids, eid => eid.source === audienceId.source) || {}; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(targetEid, 'uids.0.ext'))) { + aidParam.ext = targetEid.uids[0].ext; + } + } + aidsParams.push(aidParam); + // Set Ramp ID + if (audienceId.type === 13) params['idl_env'] = bidAudienceId; + } + }); + if (aidsParams.length > 0) { + params['aids'] = JSON.stringify(aidsParams); + } + const pbadslot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.gpid') || pbadslot; + if (gpid) { + params['gpid'] = gpid; + } + if (pbadslot) { + params['pbadslot'] = pbadslot; + } + const adservname = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.data.adserver.name'); + if (adservname) { + params['adservname'] = adservname; + } + const adservadslot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.data.adserver.adslot'); + if (adservadslot) { + params['adservadslot'] = adservadslot; + } + requests.push({ + method: 'GET', + url: ENDPOINT_URLS[ENVIRONMENT], + data: params, + options: { + Accept: 'application/json' + } + }); + }); + return requests; + }, + interpretResponse: function (serverResponse) { + const body = serverResponse.body; + const bidResponses = []; + if (body.cpm && body.cpm > 0) { + const bidResponse = { + requestId: body.requestId, + cpm: body.cpm, + width: body.width, + height: body.height, + ad: body.ad, + ttl: body.ttl, + creativeId: body.creativeId, + netRevenue: body.netRevenue, + currency: body.currency, + meta: body.meta || { + advertiserDomains: [] + } + }; + if (body.dealId) { + bidResponse['dealId'] = body.dealId; + } + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return syncs; + } + serverResponses.forEach(resp => { + const syncIframeUrls = resp.body.syncUrls.iframe; + const syncImageUrls = resp.body.syncUrls.image; + if (syncOptions.iframeEnabled && syncIframeUrls) { + syncIframeUrls.forEach(syncIframeUrl => { + syncs.push({ + type: 'iframe', + url: syncIframeUrl + }); + }); + } + if (syncOptions.pixelEnabled && syncImageUrls) { + syncImageUrls.forEach(syncImageUrl => { + syncs.push({ + type: 'image', + url: syncImageUrl + }); + }); + } + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('microadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/microadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["minutemediaBidAdapter"],{ + +/***/ "./modules/minutemediaBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/minutemediaBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/riseUtils/index.js */ "./libraries/riseUtils/index.js"); + + + + +const BIDDER_CODE = 'minutemedia'; +const BASE_URL = 'https://hb.minutemedia-prebid.com/'; +const GVLID = 918; +const MODES = { + PRODUCTION: 'hb-mm-multi', + TEST: 'hb-multi-mm-test' +}; +const spec = { + ...(0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.makeBaseSpec)(BASE_URL, MODES), + code: BIDDER_CODE, + gvlid: GVLID, + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('no params have been set to MinuteMedia adapter'); + return false; + } + if (!bidRequest.params.org) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('org is a mandatory param for MinuteMedia adapter'); + return false; + } + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('minutemediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["riseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/minutemediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["missenaBidAdapter"],{ + +/***/ "./modules/missenaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/missenaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _libraries_autoplayDetection_autoplay_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/autoplayDetection/autoplay.js */ "./libraries/autoplayDetection/autoplay.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid + */ + +const BIDDER_CODE = 'missena'; +const ENDPOINT_URL = 'https://bid.missena.io/'; +const EVENTS_DOMAIN = 'events.missena.io'; +const EVENTS_DOMAIN_DEV = 'events.staging.missena.xyz'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +window.msna_ik = window.msna_ik || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(); + +/* Get Floor price information */ +function getFloor(bidRequest) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.getFloor)) { + return {}; + } + const bidFloors = bidRequest.getFloor({ + currency: 'USD', + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER + }); + if (!isNaN(bidFloors?.floor)) { + return bidFloors; + } +} + +/* Helper function that converts the prebid data to the payload expected by our servers */ +function toPayload(bidRequest, bidderRequest) { + const payload = { + adunit: bidRequest.adUnitCode, + ik: window.msna_ik, + request_id: bidRequest.bidId, + timeout: bidderRequest.timeout + }; + const baseUrl = bidRequest.params.baseUrl || ENDPOINT_URL; + payload.params = bidRequest.params; + payload.userEids = bidRequest.userIdAsEids || []; + payload.version = "9.45.0-pre"; + const bidFloor = getFloor(bidRequest); + payload.floor = bidFloor?.floor; + payload.floor_currency = bidFloor?.currency; + payload.currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest); + payload.schain = bidRequest.schain; + payload.autoplay = (0,_libraries_autoplayDetection_autoplay_js__WEBPACK_IMPORTED_MODULE_4__.isAutoplayEnabled)() === true ? 1 : 0; + payload.screen = { + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().screen.height, + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().screen.width + }; + payload.viewport = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_5__.getViewportSize)(); + payload.sizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_6__.normalizeBannerSizes)(bidRequest.mediaTypes.banner.sizes); + payload.ortb2 = bidderRequest.ortb2; + return { + method: 'POST', + url: baseUrl + '?' + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)({ + t: bidRequest.params.apiKey + }), + data: JSON.stringify(payload) + }; +} +const spec = { + aliases: ['msna'], + code: BIDDER_CODE, + gvlid: 687, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return typeof bid == 'object' && !!bid.params.apiKey; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const capKey = `missena.missena.capper.remove-bubble.${validBidRequests[0]?.params.apiKey}`; + const capping = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.safeJSONParse)(storage.getDataFromLocalStorage(capKey)); + const referer = bidderRequest?.refererInfo?.topmostLocation; + if (typeof capping?.expiry === 'number' && new Date().getTime() < capping?.expiry && (!capping?.referer || capping?.referer == referer)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Missena - Capped'); + return []; + } + this.msnaApiKey = validBidRequests[0]?.params.apiKey; + return validBidRequests.map(bidRequest => toPayload(bidRequest, bidderRequest)); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + if (response && !response.timeout && !!response.ad) { + bidResponses.push(response); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let uspConsent = arguments.length > 3 ? arguments[3] : undefined; + if (!syncOptions.iframeEnabled || !this.msnaApiKey) { + return []; + } + const url = new URL('https://sync.missena.io/iframe'); + url.searchParams.append('t', this.msnaApiKey); + if (typeof gdprConsent.gdprApplies === 'boolean') { + url.searchParams.append('gdpr', Number(gdprConsent.gdprApplies)); + url.searchParams.append('gdpr_consent', gdprConsent.consentString); + } + if (uspConsent) { + url.searchParams.append('us_privacy', uspConsent); + } + return [{ + type: 'iframe', + url: url.href + }]; + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {TimedOutBid} timeoutData - Containing timeout specific data + */ + onTimeout: function onTimeout(timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Missena - Timeout from adapter', timeoutData); + }, + /** + * Register bidder specific code, which@ will execute if a bid from this bidder won the auction + * @param {Bid} bid - The bid that won the auction + */ + onBidWon: function (bid) { + const hostname = bid.params[0].baseUrl ? EVENTS_DOMAIN_DEV : EVENTS_DOMAIN; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: 'https', + hostname, + pathname: '/v1/bidsuccess', + search: { + t: bid.params[0].apiKey, + provider: bid.meta?.networkName, + cpm: bid.originalCpm, + currency: bid.originalCurrency + } + })); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Missena - Bid won', bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('missenaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","sizeUtils","autoplayDetection","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/missenaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mobfoxpbBidAdapter"],{ + +/***/ "./modules/mobfoxpbBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/mobfoxpbBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'mobfoxpb'; +const AD_URL = 'https://bes.mobfox.com/pbjs'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('mobfoxpbBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mobfoxpbBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mobianRtdProvider"],{ + +/***/ "./modules/mobianRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/mobianRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MOBIAN_URL, AP_VALUES, CATEGORIES, EMOTIONS, GENRES, RISK, SENTIMENT, THEMES, TONES, CONTEXT_KEYS, getContextData, makeContextDataToKeyValuesReducer, fetchContextData, getConfig, setTargeting, makeDataFromResponse, extendBidRequestConfig, mobianBrandSafetySubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + +/** + * This module adds the Mobian RTD provider to the real time data module + * The {@link module:modules/realTimeData} module is required + */ + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** + * @typedef {Object} MobianConfig + * @property {MobianConfigParams} params + */ + +/** + * @typedef {Object} MobianConfigParams + * @property {string} [prefix] - Optional prefix for targeting keys (default: 'mobian') + * @property {boolean} [publisherTargeting] - Optional boolean to enable targeting for publishers (default: false) + * @property {boolean} [advertiserTargeting] - Optional boolean to enable targeting for advertisers (default: false) + */ + +/** + * @typedef {Object} MobianContextData + * @property {Object} apValues + * @property {string[]} categories + * @property {string[]} emotions + * @property {string[]} genres + * @property {string} risk + * @property {string} sentiment + * @property {string[]} themes + * @property {string[]} tones + */ + +const MOBIAN_URL = 'https://prebid.outcomes.net/api/prebid/v1/assessment/async'; +const MOBIAN_TCF_ID = 1348; +const AP_VALUES = 'apValues'; +const CATEGORIES = 'categories'; +const EMOTIONS = 'emotions'; +const GENRES = 'genres'; +const RISK = 'risk'; +const SENTIMENT = 'sentiment'; +const THEMES = 'themes'; +const TONES = 'tones'; +const CONTEXT_KEYS = [AP_VALUES, CATEGORIES, EMOTIONS, GENRES, RISK, SENTIMENT, THEMES, TONES]; +const AP_KEYS = ['a0', 'a1', 'p0', 'p1']; +const logMessage = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Mobian', ...args); +}; +function makeMemoizedFetch() { + let cachedResponse = null; + return async function () { + if (cachedResponse) { + return Promise.resolve(cachedResponse); + } + try { + const response = await fetchContextData(); + cachedResponse = makeDataFromResponse(response); + return cachedResponse; + } catch (error) { + logMessage('error', error); + return Promise.resolve({}); + } + }; +} +const getContextData = makeMemoizedFetch(); +const entriesToObjectReducer = (acc, _ref) => { + let [key, value] = _ref; + return { + ...acc, + [key]: value + }; +}; +function makeContextDataToKeyValuesReducer(config) { + const { + prefix + } = config; + return function contextDataToKeyValuesReducer(keyValues, _ref2) { + let [key, value] = _ref2; + if (key === AP_VALUES) { + AP_KEYS.forEach(apKey => { + if (!value?.[apKey]?.length) return; + keyValues.push([`${prefix}_ap_${apKey}`, value[apKey].map(v => String(v))]); + }); + } + if (value?.length) { + keyValues.push([`${prefix}_${key}`, value]); + } + return keyValues; + }; +} +async function fetchContextData() { + const pageUrl = encodeURIComponent(window.location.href); + const requestUrl = `${MOBIAN_URL}?url=${pageUrl}`; + const request = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajaxBuilder)(); + return new Promise((resolve, reject) => { + request(requestUrl, { + success: resolve, + error: reject + }); + }); +} +function getConfig(config) { + const [advertiserTargeting, publisherTargeting] = ['advertiserTargeting', 'publisherTargeting'].map(key => { + const value = config?.params?.[key]; + if (!value) { + return []; + } else if (value === true) { + return CONTEXT_KEYS; + } else if (Array.isArray(value) && value.length) { + return value.filter(key => CONTEXT_KEYS.includes(key)); + } + return []; + }); + const prefix = config?.params?.prefix || 'mobian'; + return { + advertiserTargeting, + prefix, + publisherTargeting + }; +} + +/** + * @param {MobianConfig} config + * @param {MobianContextData} contextData + */ +function setTargeting(config, contextData) { + logMessage('context', contextData); + const keyValues = Object.entries(contextData).filter(_ref3 => { + let [key] = _ref3; + return config.publisherTargeting.includes(key); + }).reduce(makeContextDataToKeyValuesReducer(config), []); + keyValues.forEach(_ref4 => { + let [key, value] = _ref4; + return (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_2__.setKeyValue)(key, value); + }); +} + +/** + * @param {Object|string} contextData + * @returns {MobianContextData} + */ +function makeDataFromResponse(contextData) { + const data = typeof contextData === 'string' ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.safeJSONParse)(contextData) : contextData; + const results = data.results; + if (!results) { + return {}; + } + return { + [AP_VALUES]: results.ap || {}, + [CATEGORIES]: results.mobianContentCategories, + [EMOTIONS]: results.mobianEmotions, + [GENRES]: results.mobianGenres, + [RISK]: results.mobianRisk || 'unknown', + [SENTIMENT]: results.mobianSentiment || 'unknown', + [THEMES]: results.mobianThemes, + [TONES]: results.mobianTones + }; +} + +/** + * @param {Object} bidReqConfig + * @param {MobianContextData} contextData + * @param {MobianConfig} config + */ +function extendBidRequestConfig(bidReqConfig, contextData, config) { + logMessage('extendBidRequestConfig', bidReqConfig, contextData); + const { + site: ortb2Site + } = bidReqConfig.ortb2Fragments.global; + const keyValues = Object.entries(contextData).filter(_ref5 => { + let [key] = _ref5; + return config.advertiserTargeting.includes(key); + }).reduce(makeContextDataToKeyValuesReducer(config), []).reduce(entriesToObjectReducer, {}); + ortb2Site.ext = ortb2Site.ext || {}; + ortb2Site.ext.data = { + ...(ortb2Site.ext.data || {}), + ...keyValues + }; + return bidReqConfig; +} + +/** + * @param {MobianConfig} rawConfig + * @returns {boolean} + */ +function init(rawConfig) { + logMessage('init', rawConfig); + const config = getConfig(rawConfig); + if (config.publisherTargeting.length) { + getContextData().then(contextData => setTargeting(config, contextData)); + } + return true; +} +function getBidRequestData(bidReqConfig, callback, rawConfig) { + logMessage('getBidRequestData', bidReqConfig); + const config = getConfig(rawConfig); + const { + advertiserTargeting + } = config; + if (!advertiserTargeting.length) { + callback(); + return; + } + getContextData().then(contextData => { + extendBidRequestConfig(bidReqConfig, contextData, config); + }).catch(() => {}).finally(() => callback()); +} + +/** @type {RtdSubmodule} */ +const mobianBrandSafetySubmodule = { + name: 'mobianBrandSafety', + init: init, + getBidRequestData: getBidRequestData, + gvlid: MOBIAN_TCF_ID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('realTimeData', mobianBrandSafetySubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('mobianRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mobianRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mobilefuseBidAdapter"],{ + +/***/ "./modules/mobilefuseBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/mobilefuseBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + +const ADAPTER_VERSION = '1.0.0'; +const ENDPOINT_URL = 'https://mfx.mobilefuse.com/prebidjs'; +const SYNC_URL = 'https://mfx.mobilefuse.com/usync'; +const spec = { + code: 'mobilefuse', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + gvlid: 909, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: 'USD' + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const floor = getBidfloor(bidRequest); + imp.tagid = bidRequest.params.placement_id; + imp.displaymanager = 'Prebid.js'; + imp.displaymanagerver = "9.45.0-pre"; + if (floor) { + imp.bidfloor = parseFloat(floor); + } + if (bidRequest.gpid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext.gpid', bidRequest.gpid); + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'ext.prebid.mobilefuse.version', ADAPTER_VERSION); + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'regs.us_privacy', bidderRequest.uspConsent); + } + if (bidderRequest.gppConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'regs.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections); + } + return request; + } +}); +function isBidRequestValid(bid) { + return !!bid.params.placement_id; +} +function buildRequests(validBidRequests, bidderRequest) { + return { + method: 'POST', + url: ENDPOINT_URL, + data: converter.toORTB({ + validBidRequests, + bidderRequest + }) + }; +} +function interpretResponse(response, request) { + if (!response.body || !response.body.seatbid) { + return []; + } + return converter.fromORTB({ + request: request.data, + response: response.body + }).bids; +} +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + if (syncOptions.iframeEnabled) { + const params = []; + if (gppConsent) { + params.push('gpp=' + encodeURIComponent(gppConsent.gppString)); + params.push('gpp_sid=' + gppConsent.applicableSections.join(',')); + } + if (uspConsent) { + params.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + const querystring = params.length ? `?${params.join('&')}` : ''; + return [{ + type: 'iframe', + url: `${SYNC_URL}${querystring}` + }]; + } + const pixels = []; + serverResponses.forEach(response => { + if (response.body.ext && response.body.ext.syncs) { + response.body.ext.syncs.forEach(url => { + pixels.push({ + type: 'image', + url: url + }); + }); + } + }); + return pixels; +} +function getBidfloor(bidRequest) { + if (bidRequest.params.bidfloor) { + return bidRequest.params.bidfloor; + } + if (typeof bidRequest.getFloor !== 'function') { + return null; + } + let floor = bidRequest.getFloor(); + if (floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('mobilefuseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mobilefuseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mobkoiAnalyticsAdapter"],{ + +/***/ "./modules/mobkoiAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/mobkoiAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports DEBUG_EVENT_LEVELS, LocalContext, SUB_PAYLOAD_TYPES, SUB_PAYLOAD_UNIQUE_FIELDS_LOOKUP, utils */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + +const BIDDER_CODE = 'mobkoi'; +const analyticsType = 'endpoint'; +const GVL_ID = 898; +/** + * !IMPORTANT: Must match the value in the mobkoiBidAdapter.js + * The name of the parameter that the publisher can use to specify the ad server endpoint. + */ +const PARAM_NAME_AD_SERVER_BASE_URL = 'adServerBaseUrl'; + +/** + * Order by events lifecycle + */ +const { + // Order events + AUCTION_INIT, + BID_RESPONSE, + AUCTION_END, + AD_RENDER_SUCCEEDED, + BID_WON, + BIDDER_DONE, + // Error events (Not in order) + AUCTION_TIMEOUT, + NO_BID, + BID_REJECTED, + BIDDER_ERROR, + AD_RENDER_FAILED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const CUSTOM_EVENTS = { + BID_LOSS: 'bidLoss' +}; +const DEBUG_EVENT_LEVELS = { + info: 'info', + warn: 'warn', + error: 'error' +}; + +/** + * Some fields contain large data that are not useful for debugging. This + * constant contains the fields that should be omitted from the payload and in + * error messages. + */ +const COMMON_FIELDS_TO_OMIT = ['ad', 'adm']; +class LocalContext { + /** + * A map of impression ID (ORTB terms) to BidContext object + */ + bidContexts = {}; + + /** + * Shouldn't be accessed directly. Use getPayloadByImpId method instead. + * Payload are indexed by impression ID. + */ + _impressionPayloadCache = { + // [impid]: { ... } + }; + /** + * The payload that is common to all bid contexts. The payload will be + * submitted to the server along with the debug events. + */ + getImpressionPayload(impid) { + if (!impid) { + throw new Error(`Impression ID is required. Given: "${impid}".`); + } + return this._impressionPayloadCache[impid] || {}; + } + /** + * Update the payload for all impressions. The new values will be merged to + * the existing payload. + * @param {*} subPayloads Object containing new values to be merged indexed by SUB_PAYLOAD_TYPES + */ + mergeToAllImpressionsPayload(subPayloads) { + // Create clone for each impression ID and update the payload cache + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(this.getAllBidderRequestImpIds(), currentImpid => { + // Avoid modifying the original object + const cloneSubPayloads = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(subPayloads); + + // Initialise the payload cache if it doesn't exist + if (!this._impressionPayloadCache[currentImpid]) { + this._impressionPayloadCache[currentImpid] = {}; + } + + // Merge the new values to the existing payload + utils.mergePayloadAndAddCustomFields(this._impressionPayloadCache[currentImpid], cloneSubPayloads, + // Add the identity fields to all sub payloads + { + impid: currentImpid, + publisherId: this.publisherId + }); + }); + } + + /** + * The Prebid auction object but only contains the key fields that we + * interested in. + */ + auction = null; + + /** + * Auction.bidderRequests object + */ + bidderRequests = null; + get publisherId() { + if (!this.bidderRequests) { + throw new Error('Bidder requests are not available. Accessing before assigning.'); + } + return utils.getPublisherId(this.bidderRequests[0]); + } + get adServerBaseUrl() { + if (!Array.isArray(this.bidderRequests) && this.bidderRequests.length > 0) { + throw new Error('Bidder requests are not available. Accessing before assigning.' + JSON.stringify(this.bidderRequests, null, 2)); + } + return utils.getAdServerEndpointBaseUrl(this.bidderRequests[0]); + } + + /** + * Extract all impression IDs from all bid requests. + */ + getAllBidderRequestImpIds() { + if (!Array.isArray(this.bidderRequests)) { + return []; + } + return this.bidderRequests.flatMap(br => br.bids.map(bid => utils.getImpId(bid))); + } + + /** + * Cache the debug events that are common to all bid contexts. + * When a new bid context is created, the events will be pushed to the new + * context. + */ + commonBidContextEvents = []; + initialise(auction) { + this.auction = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(auction, ['auctionId', 'auctionEnd']); + this.bidderRequests = auction.bidderRequests; + } + + /** + * Retrieve the BidContext object by the bid object. If the bid context is not + * available, it will create a new one. The new bid context will returned. + * @param {*} bid can be a prebid bid response or ortb bid response + * @returns BidContext object + */ + retrieveBidContext(bid) { + const ortbId = (() => { + try { + const id = utils.getOrtbId(bid); + if (!id) { + throw new Error('ORTB ID is not available in the given bid object:' + JSON.stringify(utils.omitRecursive(bid, COMMON_FIELDS_TO_OMIT), null, 2)); + } + return id; + } catch (error) { + throw new Error('Failed to retrieve ORTB ID from bid object. Please ensure the given object contains an ORTB ID field.\n' + `Sub Error: ${error.message}`); + } + })(); + const bidContext = this.bidContexts[ortbId]; + if (bidContext) { + return bidContext; + } + + /** + * Create a new context object and return it. + */ + let newBidContext = new BidContext({ + localContext: this, + prebidOrOrtbBidResponse: bid + }); + + /** + * Add the data that store in local context to the new bid context. + */ + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(this.commonBidContextEvents, event => newBidContext.pushEvent({ + eventInstance: event, + subPayloads: null // Merge the payload later + })); + // Merge cached payloads to the new bid context + newBidContext.mergePayload(this.getImpressionPayload(newBidContext.impid)); + this.bidContexts[ortbId] = newBidContext; + return newBidContext; + } + + /** + * Immediately trigger the loss beacon for all bids (bid contexts) that haven't won the auction. + */ + triggerAllLossBidLossBeacon() { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(this.bidContexts, bidContext => { + const { + ortbBidResponse, + bidWin, + lurlTriggered + } = bidContext; + if (ortbBidResponse.lurl && !bidWin && !lurlTriggered) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('TriggerLossBeacon. impid:', ortbBidResponse.impid); + utils.sendGetRequest(ortbBidResponse.lurl); + // Update the flog. Don't wait for the response to continue to avoid race conditions + bidContext.lurlTriggered = true; + } + }); + } + + /** + * Push an debug event to all bid contexts. This is useful for events that are + * related to all bids in the auction. + * @param {Object} params Object containing the event details + * @param {*} params.eventType Prebid event type or custom event type + * @param {*} params.level Debug level of the event. It can be one of the following: + * - info + * - warn + * - error + * @param {*} params.timestamp Default to current timestamp if not provided. + * @param {*} params.note Optional field. Additional information about the event. + * @param {*} params.subPayloads Objects containing additional data that are + * obtain from to the Prebid events indexed by SUB_PAYLOAD_TYPES. + */ + pushEventToAllBidContexts(_ref) { + let { + eventType, + level, + timestamp, + note, + subPayloads + } = _ref; + // Create one event for each impression ID + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(this.getAllBidderRequestImpIds(), impid => { + const eventClone = new Event({ + eventType, + impid, + publisherId: this.publisherId, + level, + timestamp, + note + }); + // Save to the LocalContext + this.commonBidContextEvents.push(eventClone); + this.mergeToAllImpressionsPayload(subPayloads); + }); + + // If there are no bid contexts, push the event to the common events list + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(this.bidContexts)) { + this._commonBidContextEventsFlushed = false; + return; + } + + // Once the bid contexts are available, push the event to all bid contexts + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(this.bidContexts, bidContext => { + bidContext.pushEvent({ + eventInstance: new Event({ + eventType, + impid: bidContext.impid, + publisherId: this.publisherId, + level, + timestamp, + note + }), + subPayloads: this.getImpressionPayload(bidContext.impid) + }); + }); + } + + /** + * A flag to indicate if the common events have been flushed to the server. + * This is useful to avoid submitting the same events multiple times. + */ + _commonBidContextEventsFlushed = false; + + /** + * Flush all debug events in all bid contexts as well as the common events (in + * Local Context) to the server. + */ + async flushAllDebugEvents() { + if (this.commonBidContextEvents.length < 0 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(this.bidContexts)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('No debug events to flush'); + return; + } + const flushPromises = []; + const debugEndpoint = `${this.adServerBaseUrl}/debug`; + + // If there are no bid contexts, and there are error events, submit the + // common events to the server + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(this.bidContexts) && !this._commonBidContextEventsFlushed && this.commonBidContextEvents.some(event => event.level === DEBUG_EVENT_LEVELS.error || event.level === DEBUG_EVENT_LEVELS.warn)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Flush common events to the server'); + const debugReports = this.bidderRequests.flatMap(currentBidderRequest => { + return currentBidderRequest.bids.map(bid => { + const impid = utils.getImpId(bid); + return { + impid: impid, + events: this.commonBidContextEvents, + bidWin: null, + // Unroll the payload object to the top level to make it easier for + // Grafana to process the data. + ...this.getImpressionPayload(impid) + }; + }); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(debugReports, debugReport => { + flushPromises.push(utils.postAjax(debugEndpoint, debugReport)); + }); + this._commonBidContextEventsFlushed = true; + } + flushPromises.push(...Object.values(this.bidContexts).map(async currentBidContext => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Flush bid context events to the server', currentBidContext); + return utils.postAjax(debugEndpoint, { + impid: currentBidContext.impid, + bidWin: currentBidContext.bidWin, + events: currentBidContext.events, + // Unroll the payload object to the top level to make it easier for + // Grafana to process the data. + ...currentBidContext.subPayloads + }); + })); + await Promise.all(flushPromises); + } +} + +/** + * Select key fields from the given object based on the object type. This is + * useful for debugging to reduce the size of the API call payload. + * @param {*} objType The custom type of the object. Return by determineObjType function. + * @param {*} eventArgs The args object that is passed in to the event handler + * or any supported object. + * @returns the clone of the given object but only contains the key fields + */ +function pickKeyFields(objType, eventArgs) { + switch (objType) { + case SUB_PAYLOAD_TYPES.AUCTION: + { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs, ['auctionId', 'adUnitCodes', 'auctionStart', 'auctionEnd', 'auctionStatus', 'bidderRequestId', 'timeout', 'timestamp']); + } + case SUB_PAYLOAD_TYPES.BIDDER_REQUEST: + { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs, ['auctionId', 'bidId', 'bidderCode', 'bidderRequestId', 'timeout']); + } + case SUB_PAYLOAD_TYPES.ORTB_BID: + { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs, ['impid', 'id', 'price', 'cur', 'crid', 'cid', 'lurl', 'cpm']); + } + case SUB_PAYLOAD_TYPES.PREBID_RESPONSE_INTERPRETED: + { + return { + ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs, ['requestId', 'creativeId', 'cpm', 'currency', 'bidderCode', 'adUnitCode', 'ttl', 'adId', 'width', 'height', 'requestTimestamp', 'responseTimestamp', 'seatBidId', 'statusMessage', 'timeToRespond', 'rejectionReason', 'ortbId', 'auctionId', 'mediaType', 'bidderRequestId']) + }; + } + case SUB_PAYLOAD_TYPES.PREBID_BID_REQUEST: + { + return { + ...(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs, ['bidderRequestId']), + bids: eventArgs.bids.map(bid => pickKeyFields(SUB_PAYLOAD_TYPES.PREBID_RESPONSE_NOT_INTERPRETED, bid)) + }; + } + case SUB_PAYLOAD_TYPES.AD_DOC_AND_PREBID_BID: + { + return { + // bid: 'Not included to reduce payload size', + doc: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs.doc, ['visibilityState', 'readyState', 'hidden']) + }; + } + case SUB_PAYLOAD_TYPES.AD_DOC_AND_PREBID_BID_WITH_ERROR: + { + return { + // bid: 'Not included to reduce payload size', + reason: eventArgs.reason, + message: eventArgs.message, + doc: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(eventArgs.doc, ['visibilityState', 'readyState', 'hidden']) + }; + } + case SUB_PAYLOAD_TYPES.BIDDER_ERROR_ARGS: + { + return { + bidderRequest: pickKeyFields(SUB_PAYLOAD_TYPES.BIDDER_REQUEST, eventArgs.bidderRequest), + error: eventArgs.error?.toJSON ? eventArgs.error?.toJSON() : eventArgs.error || 'Failed to convert error object to JSON' + }; + } + default: + { + // Include the entire object for debugging + return { + eventArgs + }; + } + } +} +let mobkoiAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + analyticsType +}), { + localContext: new LocalContext(), + async track(_ref2) { + let { + eventType, + args: prebidEventArgs + } = _ref2; + try { + switch (eventType) { + case AUCTION_INIT: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const auction = prebidEventArgs; + this.localContext.initialise(auction); + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.info, + timestamp: auction.timestamp, + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + case BID_RESPONSE: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const prebidBid = prebidEventArgs; + const bidContext = this.localContext.retrieveBidContext(prebidBid); + bidContext.pushEvent({ + eventInstance: new Event({ + eventType, + impid: bidContext.impid, + publisherId: this.localContext.publisherId, + level: DEBUG_EVENT_LEVELS.info, + timestamp: prebidEventArgs.timestamp || Date.now() + }), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs), + [SUB_PAYLOAD_TYPES.ORTB_BID]: pickKeyFields(SUB_PAYLOAD_TYPES.ORTB_BID, prebidEventArgs.ortbBidResponse) + } + }); + break; + } + case BID_WON: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const prebidBid = prebidEventArgs; + if (utils.isMobkoiBid(prebidBid)) { + this.localContext.retrieveBidContext(prebidBid).bidWin = true; + } + // Notify the server that the bidding results. + this.localContext.triggerAllLossBidLossBeacon(); + // Append the bid win/loss event to all bid contexts + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(this.localContext.bidContexts, currentBidContext => { + currentBidContext.pushEvent({ + eventInstance: new Event({ + eventType: currentBidContext.bidWin ? eventType : CUSTOM_EVENTS.BID_LOSS, + impid: currentBidContext.impid, + publisherId: this.localContext.publisherId, + level: DEBUG_EVENT_LEVELS.info, + timestamp: prebidEventArgs.timestamp || Date.now() + }), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + }); + break; + } + case AUCTION_TIMEOUT: + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const auction = prebidEventArgs; + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.error, + timestamp: auction.timestamp, + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + case NO_BID: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.warn, + timestamp: prebidEventArgs.timestamp || Date.now(), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + case BID_REJECTED: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const prebidBid = prebidEventArgs; + const bidContext = this.localContext.retrieveBidContext(prebidBid); + bidContext.pushEvent({ + eventInstance: new Event({ + eventType, + impid: bidContext.impid, + publisherId: this.localContext.publisherId, + level: DEBUG_EVENT_LEVELS.error, + timestamp: prebidEventArgs.timestamp || Date.now(), + note: prebidEventArgs.rejectionReason + }), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + ; + case BIDDER_ERROR: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.warn, + timestamp: prebidEventArgs.timestamp || Date.now(), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + case AD_RENDER_FAILED: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const { + bid: prebidBid + } = prebidEventArgs; + const bidContext = this.localContext.retrieveBidContext(prebidBid); + bidContext.pushEvent({ + eventInstance: new Event({ + eventType, + impid: bidContext.impid, + publisherId: this.localContext.publisherId, + level: DEBUG_EVENT_LEVELS.error, + timestamp: prebidEventArgs.timestamp || Date.now() + }), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + case AD_RENDER_SUCCEEDED: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const prebidBid = prebidEventArgs.bid; + const bidContext = this.localContext.retrieveBidContext(prebidBid); + bidContext.pushEvent({ + eventInstance: new Event({ + eventType, + impid: bidContext.impid, + publisherId: this.localContext.publisherId, + level: DEBUG_EVENT_LEVELS.info, + timestamp: prebidEventArgs.timestamp || Date.now() + }), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + case AUCTION_END: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + const auction = prebidEventArgs; + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.info, + timestamp: auction.timestamp, + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + break; + } + case BIDDER_DONE: + { + utils.logTrackEvent(eventType, prebidEventArgs); + const argsType = utils.determineObjType(prebidEventArgs); + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.info, + timestamp: prebidEventArgs.timestamp || Date.now(), + subPayloads: { + [argsType]: pickKeyFields(argsType, prebidEventArgs) + } + }); + this.localContext.triggerAllLossBidLossBeacon(); + await this.localContext.flushAllDebugEvents(); + break; + } + default: + // Do nothing in other events + break; + } + } catch (error) { + // If there is an unexpected error, such as a syntax error, we log + // log the error and submit the error to the server for debugging. + this.localContext.pushEventToAllBidContexts({ + eventType, + level: DEBUG_EVENT_LEVELS.error, + timestamp: prebidEventArgs.timestamp || Date.now(), + note: 'Error occurred when processing this event.', + subPayloads: { + // Include the entire object for debugging + [`errorInEvent_${eventType}`]: { + // Some fields contain large data. Omits them to reduce API call payload size + eventArgs: utils.omitRecursive(prebidEventArgs, COMMON_FIELDS_TO_OMIT), + error: error.message + } + } + }); + // Throw the error to skip the current Prebid event + throw error; + } + } +}); + +// save the base class function +mobkoiAnalytics.originEnableAnalytics = mobkoiAnalytics.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +mobkoiAnalytics.enableAnalytics = function (config) { + mobkoiAnalytics.originEnableAnalytics(config); // call the base class function +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].registerAnalyticsAdapter({ + adapter: mobkoiAnalytics, + code: BIDDER_CODE, + gvlid: GVL_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (mobkoiAnalytics); +class BidContext { + /** + * The impression ID (ORTB term) of the bid. This ID is initialised in Prebid + * bid requests. The ID is reserved in requests and responses but have + * different names from object to object. + */ + get impid() { + if (this.ortbBidResponse) { + return this.ortbBidResponse.impid; + } else if (this.prebidBidResponse) { + return this.prebidBidResponse.requestId; + } else if (this.prebidBidRequest) { + return this.prebidBidRequest.bidId; + } else if (this.subPayloads && utils.getImpId(this.subPayloads)) { + return utils.getImpId(this.subPayloads); + } else { + throw new Error('ORTB bid response and Prebid bid response are not available for extracting Impression ID'); + } + } + + /** + * ORTB ID generated by Ad Server + */ + get ortbId() { + if (this.ortbBidResponse) { + return utils.getOrtbId(this.ortbBidResponse); + } else if (this.prebidBidResponse) { + return utils.getOrtbId(this.prebidBidResponse); + } else if (this.subPayloads) { + return utils.getOrtbId(this.subPayloads); + } else { + throw new Error('ORTB bid response and Prebid bid response are not available for extracting ORTB ID'); + } + } + get publisherId() { + if (this.prebidBidRequest) { + return utils.getPublisherId(this.prebidBidRequest); + } else { + throw new Error('ORTB bid response and Prebid bid response are not available for extracting Publisher ID'); + } + } + + /** + * The prebid bid request object before converted to ORTB request in our + * custom adapter. + */ + get prebidBidRequest() { + if (!this.prebidBidResponse) { + throw new Error('Prebid bid response is not available. Accessing before assigning.'); + } + return this.localContext.bidderRequests.flatMap(br => br.bids).find(bidRequest => bidRequest.bidId === this.prebidBidResponse.requestId); + } + + /** + * To avoid overriding the subPayloads object, we merge the new values to the + * existing subPayloads object. + */ + _subPayloads = null; + /** + * A group of payloads that are useful for debugging. The payloads are indexed + * by SUB_PAYLOAD_TYPES. + */ + get subPayloads() { + return this._subPayloads; + } + /** + * To avoid overriding the subPayloads object, we merge the new values to the + * existing subPayloads object. Identity fields will automatically added to the + * new values. + * @param {*} newSubPayloads Object containing new values to be merged + */ + mergePayload(newSubPayloads) { + utils.mergePayloadAndAddCustomFields(this._subPayloads, newSubPayloads, + // Add the identity fields to all sub payloads + { + impid: this.impid, + publisherId: this.publisherId + }); + } + + /** + * The prebid bid response object after converted from ORTB response in our + * custom adapter. + */ + prebidBidResponse = null; + + /** + * The raw ORTB bid response object from the server. + */ + ortbBidResponse = null; + + /** + * A flag to indicate if the bid has won the auction. It only updated to true + * if the winning bid is from Mobkoi in the BID_WON event. + */ + bidWin = false; + + /** + * A flag to indicate if the loss beacon has been triggered. + */ + lurlTriggered = false; + + /** + * A list of DebugEvent objects + */ + events = []; + + /** + * Keep the reference of LocalContext object for easy accessing data. + */ + localContext = null; + + /** + * A object to store related data of a bid for easy access. + * i.e. bid request and bid response. + * @param {*} param0 + */ + constructor(_ref3) { + let { + localContext, + prebidOrOrtbBidResponse: bidResponse + } = _ref3; + this.localContext = localContext; + this._subPayloads = {}; + if (!bidResponse) { + throw new Error('prebidOrOrtbBidResponse field is required'); + } + const objType = utils.determineObjType(bidResponse); + if (![SUB_PAYLOAD_TYPES.ORTB_BID, SUB_PAYLOAD_TYPES.PREBID_RESPONSE_INTERPRETED].includes(objType)) { + throw new Error('Unable to create a new Bid Context as the given object is not a bid response object. ' + 'Expect a Prebid Bid Object or ORTB Bid Object. Given object:\n' + JSON.stringify(utils.omitRecursive(bidResponse, COMMON_FIELDS_TO_OMIT), null, 2)); + } + if (objType === SUB_PAYLOAD_TYPES.ORTB_BID) { + this.ortbBidResponse = bidResponse; + this.prebidBidResponse = null; + } else if (objType === SUB_PAYLOAD_TYPES.PREBID_RESPONSE_INTERPRETED) { + this.ortbBidResponse = bidResponse.ortbBidResponse; + this.prebidBidResponse = bidResponse; + } else { + throw new Error('Expect a Prebid Bid Object or ORTB Bid Object. Given object:\n' + JSON.stringify(utils.omitRecursive(bidResponse, COMMON_FIELDS_TO_OMIT), null, 2)); + } + } + + /** + * Push a debug event to the context which will be submitted to the server for debugging. + * @param {Object} params Object containing the following properties: + * @param {Event} params.eventInstance - DebugEvent object. If it does not contain the same impid as the BidContext, the event will be ignored. + * @param {Object|null} params.subPayloads - Object containing various payloads obtained from the Prebid Event args. The payloads will be merged into the existing subPayloads. + */ + pushEvent(_ref4) { + let { + eventInstance, + subPayloads + } = _ref4; + if (!(eventInstance instanceof Event)) { + throw new Error('bugEvent must be an instance of DebugEvent'); + } + if (eventInstance.impid != this.impid) { + // Ignore the event if the impression ID is not matched. + return; + } + // Accept only object or null + if (subPayloads !== null && typeof subPayloads !== 'object') { + throw new Error('subPayloads must be an object or null'); + } + this.events.push(eventInstance); + if (subPayloads !== null) { + this.mergePayload(subPayloads); + } + } +} + +/** + * A class to represent an event happened in the bid processing lifecycle. + */ +class Event { + /** + * Impression ID must set before appending to event lists. + */ + impid = null; + + /** + * Publisher ID. It is a unique identifier for the publisher. + */ + publisherId = null; + + /** + * Prebid Event Type or Custom Event Type + */ + eventType = null; + /** + * Debug level of the event. It can be one of the following: + * - info + * - warn + * - error + */ + level = null; + /** + * Timestamp of the event. It represents the time when the event occurred. + */ + timestamp = null; + constructor(_ref5) { + let { + eventType, + impid, + publisherId, + level, + timestamp, + note = undefined + } = _ref5; + if (!eventType) { + throw new Error('eventType is required'); + } + if (!impid) { + throw new Error(`Impression ID is required. Given: "${impid}"`); + } + if (typeof publisherId !== 'string') { + throw new Error(`Publisher ID must be a string. Given: "${publisherId}"`); + } + if (!DEBUG_EVENT_LEVELS[level]) { + throw new Error(`Event level must be one of ${Object.keys(DEBUG_EVENT_LEVELS).join(', ')}. Given: "${level}"`); + } + if (typeof timestamp !== 'number') { + throw new Error('Timestamp must be a number'); + } + this.eventType = eventType; + this.impid = impid; + this.publisherId = publisherId; + this.level = level; + this.timestamp = timestamp; + if (note) { + this.note = note; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.debugTurnedOn)() && (level === DEBUG_EVENT_LEVELS.error || level === DEBUG_EVENT_LEVELS.warn)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`New Debug Event - Type: ${eventType} Level: ${level}.`); + } + } +} + +/** + * Various types of payloads that are submitted to the server for debugging. + * Mostly they are obtain from the Prebid event args. + */ +const SUB_PAYLOAD_TYPES = { + AUCTION: 'prebid_auction', + BIDDER_REQUEST: 'bidder_request', + ORTB_BID: 'ortb_bid', + PREBID_RESPONSE_INTERPRETED: 'prebid_bid_interpreted', + PREBID_RESPONSE_NOT_INTERPRETED: 'prebid_bid_not_interpreted', + PREBID_BID_REQUEST: 'prebid_bid_request', + AD_DOC_AND_PREBID_BID: 'ad_doc_and_prebid_bid', + AD_DOC_AND_PREBID_BID_WITH_ERROR: 'ad_doc_and_prebid_bid_with_error', + BIDDER_ERROR_ARGS: 'bidder_error_args' +}; + +/** + * Fields that are unique to objects used to identify the sub-payload type. + */ +const SUB_PAYLOAD_UNIQUE_FIELDS_LOOKUP = { + [SUB_PAYLOAD_TYPES.AUCTION]: ['auctionStatus'], + [SUB_PAYLOAD_TYPES.BIDDER_REQUEST]: ['bidderRequestId'], + [SUB_PAYLOAD_TYPES.ORTB_BID]: ['adm', 'impid'], + [SUB_PAYLOAD_TYPES.PREBID_RESPONSE_INTERPRETED]: ['requestId', 'ortbBidResponse'], + [SUB_PAYLOAD_TYPES.PREBID_RESPONSE_NOT_INTERPRETED]: ['requestId'], + // This must be paste under PREBID_RESPONSE_INTERPRETED + [SUB_PAYLOAD_TYPES.PREBID_BID_REQUEST]: ['bidId'], + [SUB_PAYLOAD_TYPES.AD_DOC_AND_PREBID_BID]: ['doc', 'bid'], + [SUB_PAYLOAD_TYPES.AD_DOC_AND_PREBID_BID_WITH_ERROR]: ['bid', 'reason', 'message'], + [SUB_PAYLOAD_TYPES.BIDDER_ERROR_ARGS]: ['error', 'bidderRequest'] +}; + +/** + * Required fields for the sub payloads. The property value defines the type of the required field. + */ +const PAYLOAD_REQUIRED_FIELDS = { + impid: 'string', + publisherId: 'string' +}; +const utils = { + /** + * Make a POST request to the given URL with the given data. + * @param {*} url + * @param {*} data JSON data + * @returns + */ + postAjax: async function (url, data) { + return new Promise((resolve, reject) => { + try { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('postAjax:', url, data); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, resolve, JSON.stringify(data), { + contentType: 'application/json', + method: 'POST', + withCredentials: false, + // No user-specific data is tied to the request + referrerPolicy: 'unsafe-url', + crossOrigin: true + }); + } catch (error) { + reject(new Error(`Failed to make post request to endpoint "${url}". With data: ` + JSON.stringify(utils.omitRecursive(data, COMMON_FIELDS_TO_OMIT), null, 2), { + error: error.message + })); + } + }); + }, + /** + * Make a GET request to the given URL. If the request fails, it will fall back + * to AJAX request. + * @param {*} url URL with the query string + * @returns + */ + sendGetRequest: async function (url) { + return new Promise((resolve, reject) => { + try { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('triggerPixel', url); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(url, resolve); + } catch (error) { + try { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`triggerPixel failed. URL: (${url}) Falling back to ajax. Error: `, error); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, resolve, null, { + contentType: 'application/json', + method: 'GET', + withCredentials: false, + // No user-specific data is tied to the request + referrerPolicy: 'unsafe-url', + crossOrigin: true + }); + } catch (error) { + // If failed with both methods, reject the promise + reject(error); + } + } + }); + }, + /** + * Check if the given Prebid bid is from Mobkoi. + * @param {*} prebidBid + * @returns + */ + isMobkoiBid: function (prebidBid) { + return prebidBid && prebidBid.bidderCode === BIDDER_CODE; + }, + /** + * !IMPORTANT: Make sure the implementation of this function matches utils.getOrtbId in + * mobkoiAnalyticsAdapter.js. + * We use the bidderRequestId as the ortbId. We could do so because we only + * make one ORTB request per Prebid Bidder Request. + * The ID field named differently when the value passed on to different contexts. + * @param {*} bid Prebid Bidder Request Object or Prebid Bid Response/Request + * or ORTB Request/Response Object + * @returns {string} The ORTB ID + * @throws {Error} If the ORTB ID cannot be found in the given object. + */ + getOrtbId(bid) { + const ortbId = + // called bidderRequestId in Prebid Request + bid.bidderRequestId || + // called seatBidId in Prebid Bid Response Object + bid.seatBidId || + // called ortbId in Interpreted Prebid Response Object + bid.ortbId || + // called id in ORTB object + Object.hasOwn(bid, 'imp') && bid.id; + if (!ortbId) { + throw new Error('Failed to obtain ORTB ID from the given object. Given object:\n' + JSON.stringify(utils.omitRecursive(bid, COMMON_FIELDS_TO_OMIT), null, 2)); + } + return ortbId; + }, + /** + * Impression ID is named differently in different objects. This function will + * return the impression ID from the given bid object. + * @param {*} bid ORTB bid response or Prebid bid response or Prebid bid request + * @returns string | null + */ + getImpId: function (bid) { + return bid && (bid.impid || bid.requestId || bid.bidId) || null; + }, + /** + * !IMPORTANT: Make sure the implementation of this function matches utils.getPublisherId in + * both adapters. + * Extract the publisher ID from the given object. + * @param {*} bid Prebid Bidder Request Object or Prebid Bid Response/Request + * or ORTB Request/Response Object + * @returns string + * @throws {Error} If the publisher ID is not found in the given object. + */ + getPublisherId: function (bid) { + const ortbPath = 'site.publisher.id'; + const prebidPath = `ortb2.${ortbPath}`; + const publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, prebidPath) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, ortbPath); + if (!publisherId) { + throw new Error('Failed to obtain publisher ID from the given object. ' + `Please set it via the "${prebidPath}" field with pbjs.setBidderConfig.\n` + 'Given object:\n' + JSON.stringify(bid, null, 2)); + } + return publisherId; + }, + /** + * !IMPORTANT: Make sure the implementation of this function matches getAdServerEndpointBaseUrl + * in both adapters. + * Obtain the Ad Server Base URL from the given Prebid object. + * @param {*} bid Prebid Bidder Request Object or Prebid Bid Response/Request + * or ORTB Request/Response Object + * @returns {string} The Ad Server Base URL + * @throws {Error} If the ORTB ID cannot be found in the given + */ + getAdServerEndpointBaseUrl(bid) { + const path = `site.publisher.ext.${PARAM_NAME_AD_SERVER_BASE_URL}`; + const preBidPath = `ortb2.${path}`; + const adServerBaseUrl = + // For Prebid Bid objects + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, preBidPath) || + // For ORTB objects + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, path); + if (!adServerBaseUrl) { + throw new Error('Failed to find the Ad Server Base URL in the given object. ' + `Please set it via the "${preBidPath}" field with pbjs.setBidderConfig.\n` + 'Given Object:\n' + JSON.stringify(bid, null, 2)); + } + return adServerBaseUrl; + }, + logTrackEvent: function (eventType, eventArgs) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.debugTurnedOn)()) { + return; + } + const argsType = (() => { + try { + return utils.determineObjType(eventArgs); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Error when logging track event: [${eventType}]\n`, error); + return 'Unknown'; + } + })(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Track event: [${eventType}]. Args Type Determination: ${argsType}`, eventArgs); + }, + /** + * Determine the type of the given object based on the object's fields. + * This is useful for identifying the type of object that is passed in to the + * handler functions. + * @param {*} eventArgs + * @returns string + */ + determineObjType: function (eventArgs) { + if (typeof eventArgs !== 'object' || eventArgs === null) { + throw new Error('determineObjType: Expect an object. Given object is not an object or null. Given object:' + JSON.stringify(utils.omitRecursive(eventArgs, COMMON_FIELDS_TO_OMIT), null, 2)); + } + let objType = null; + for (const type of Object.values(SUB_PAYLOAD_TYPES)) { + const identifyFields = SUB_PAYLOAD_UNIQUE_FIELDS_LOOKUP[type]; + if (!identifyFields) { + throw new Error(`Identify fields for type "${type}" is not defined in COMMON_OBJECT_UNIT_FIELDS.`); + } + + // If all fields are available in the object, then it's the type we are looking for + if (identifyFields.every(field => eventArgs.hasOwnProperty(field))) { + objType = type; + break; + } + } + if (!objType) { + throw new Error('Unable to determine track args type. Please update COMMON_OBJECT_UNIT_FIELDS for the new object type.\n' + 'Given object:\n' + JSON.stringify(utils.omitRecursive(eventArgs, COMMON_FIELDS_TO_OMIT), null, 2)); + } + return objType; + }, + /** + * Merge a Payload object with new values. The payload object must be in + * specific format where root level keys are SUB_PAYLOAD_TYPES values and the + * property values must be an object of the given type. + * @param {*} targetPayload + * @param {*} newSubPayloads + * @param {*} customFields Custom fields that are required for the sub payloads. + */ + mergePayloadAndAddCustomFields: function (targetPayload, newSubPayloads) { + let customFields = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + if (typeof targetPayload !== 'object') { + throw new Error('Target must be an object'); + } + if (typeof newSubPayloads !== 'object') { + throw new Error('New values must be an object'); + } + + // Ensure all the required custom fields are available + if (customFields) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(customFields, (fieldType, fieldName) => { + if (fieldType === 'string' && typeof newSubPayloads[fieldName] !== 'string') { + throw new Error(`Field "${fieldName}" must be a string. Given: ${newSubPayloads[fieldName]}`); + } + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(targetPayload, newSubPayloads); + + // Add the custom fields to the sub-payloads just added to the target payload + if (customFields) { + utils.addCustomFieldsToSubPayloads(targetPayload, customFields); + } + }, + /** + * Should not use this function directly. Use mergePayloadAndCustomFields + * instead. This function add custom fields to the sub-payloads. The provided + * custom fields will be validated. + * @param {*} subPayloads A group of payloads that are useful for debugging. Indexed by SUB_PAYLOAD_TYPES. + * @param {*} customFields Custom fields that are required for the sub + * payloads. Fields are defined in PAYLOAD_REQUIRED_FIELDS. + */ + addCustomFieldsToSubPayloads: function (subPayloads, customFields) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(subPayloads, (currentSubPayload, subPayloadType) => { + if (!Object.values(SUB_PAYLOAD_TYPES).includes(subPayloadType)) { + return; + } + + // Add the custom fields to the sub-payloads + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(currentSubPayload, customFields); + }); + + // Before leaving the function, validate the payload to ensure all + // required fields are available. + utils.validateSubPayloads(subPayloads); + }, + /** + * Recursively omit the given keys from the object. + * @param {*} subPayloads - The payload objects index by their payload types. + * @throws {Error} - If the given object is not valid. + */ + validateSubPayloads: function (subPayloads) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(subPayloads, (currentSubPayload, subPayloadType) => { + if (!Object.values(SUB_PAYLOAD_TYPES).includes(subPayloadType)) { + return; + } + const validationErrors = []; + // Validate the required fields + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(PAYLOAD_REQUIRED_FIELDS, (requiredFieldType, requiredFieldName) => { + // eslint-disable-next-line valid-typeof + if (typeof currentSubPayload[requiredFieldName] !== requiredFieldType) { + validationErrors.push(new Error(`Field "${requiredFieldName}" in "${subPayloadType}" must be a ${requiredFieldType}. Given: ${currentSubPayload[requiredFieldName]}`)); + } + }); + if (validationErrors.length > 0) { + throw new Error(`Validation failed for "${subPayloadType}".\n` + `Object: ${JSON.stringify(utils.omitRecursive(currentSubPayload, COMMON_FIELDS_TO_OMIT), null, 2)}\n` + validationErrors.map(error => `Error: ${error.message}`).join('\n')); + } + }); + }, + /** + * Recursively omit the given keys from the object. + * @param {*} obj - The object to process. + * @param {Array} keysToOmit - The keys to omit from the object. + * @param {*} [placeholder='OMITTED'] - The placeholder value to use for omitted keys. + * @returns {Object} - A clone of the given object with the specified keys omitted. + */ + omitRecursive: function (obj, keysToOmit) { + let placeholder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'OMITTED'; + return Object.keys(obj).reduce((acc, currentKey) => { + // If the current key is in the keys to omit, replace the value with the placeholder + if (keysToOmit.includes(currentKey)) { + acc[currentKey] = placeholder; + return acc; + } + + // If the current value is an object and not null, recursively omit keys + if (typeof obj[currentKey] === 'object' && obj[currentKey] !== null) { + acc[currentKey] = utils.omitRecursive(obj[currentKey], keysToOmit, placeholder); + } else { + // Otherwise, directly assign the value to the accumulator object + acc[currentKey] = obj[currentKey]; + } + return acc; + }, {}); + } +}; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('mobkoiAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mobkoiAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mobkoiBidAdapter"],{ + +/***/ "./modules/mobkoiBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/mobkoiBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports DEFAULT_AD_SERVER_BASE_URL, converter, spec, utils */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +const BIDDER_CODE = 'mobkoi'; +const GVL_ID = 898; +const DEFAULT_AD_SERVER_BASE_URL = 'https://adserver.maximus.mobkoi.com'; +const PUBLISHER_PARAMS = { + /** + * !IMPORTANT: This value must match the value in mobkoiAnalyticsAdapter.js + * The name of the parameter that the publisher can use to specify the ad server endpoint. + */ + PARAM_NAME_AD_SERVER_BASE_URL: 'adServerBaseUrl', + PARAM_NAME_PLACEMENT_ID: 'placementId' +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + request(buildRequest, imps, bidderRequest, context) { + const ortbRequest = buildRequest(imps, bidderRequest, context); + const prebidBidRequest = context.bidRequests[0]; + ortbRequest.id = utils.getOrtbId(prebidBidRequest); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(ortbRequest, 'site.publisher.ext.adServerBaseUrl', utils.getAdServerEndpointBaseUrl(prebidBidRequest)); + // We only support one impression per request. + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(ortbRequest, 'imp.0.tagid', utils.getPlacementId(prebidBidRequest)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(ortbRequest, 'user.id', context.bidRequests[0].userId?.mobkoiId || null); + return ortbRequest; + }, + bidResponse(buildPrebidBidResponse, ortbBidResponse, context) { + const prebidBid = buildPrebidBidResponse(ortbBidResponse, context); + utils.addCustomFieldsToPrebidBidResponse(prebidBid, ortbBidResponse); + return prebidBid; + } +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER], + gvlid: GVL_ID, + /** + * Determines whether or not the given bid request is valid. + */ + isBidRequestValid(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `params.${PUBLISHER_PARAMS.PARAM_NAME_PLACEMENT_ID}`)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`The ${PUBLISHER_PARAMS.PARAM_NAME_PLACEMENT_ID} field is required in the bid request. ` + 'Please follow the setup guideline to set the placement ID field.'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + */ + buildRequests(prebidBidRequests, prebidBidderRequest) { + const adServerEndpoint = utils.getAdServerEndpointBaseUrl(prebidBidderRequest) + '/bid'; + return { + method: 'POST', + url: adServerEndpoint, + options: { + contentType: 'application/json' + }, + data: converter.toORTB({ + bidRequests: prebidBidRequests, + bidderRequest: prebidBidderRequest + }) + }; + }, + /** + * Unpack the response from the server into a list of bids. + */ + interpretResponse(serverResponse, customBidRequest) { + if (!serverResponse.body) return []; + const responseBody = { + ...serverResponse.body, + seatbid: serverResponse.body.seatbid + }; + const prebidBidResponse = converter.fromORTB({ + request: customBidRequest.data, + response: responseBody + }); + return prebidBidResponse.bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +const utils = { + /** + * !IMPORTANT: Make sure the implementation of this function matches getAdServerEndpointBaseUrl + * in both adapters. + * Obtain the Ad Server Base URL from the given Prebid object. + * @param {*} bid Prebid Bidder Request Object or Prebid Bid Response/Request + * or ORTB Request/Response Object + * @returns {string} The Ad Server Base URL + */ + getAdServerEndpointBaseUrl(bid) { + // Fields that would be automatically set if the publisher set it via pbjs.setBidderConfig. + const ortbPath = `site.publisher.ext.${PUBLISHER_PARAMS.PARAM_NAME_AD_SERVER_BASE_URL}`; + const prebidPath = `ortb2.${ortbPath}`; + + // Fields that would be set by the publisher in the bid + // configuration object in ad unit. + const paramPath = `params.${PUBLISHER_PARAMS.PARAM_NAME_AD_SERVER_BASE_URL}`; + const bidRequestFirstBidParam = `bids.0.${paramPath}`; + const adServerBaseUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, paramPath) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, bidRequestFirstBidParam) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, prebidPath) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, ortbPath) || DEFAULT_AD_SERVER_BASE_URL; + return adServerBaseUrl; + }, + /** + * Extract the placement ID from the given object. + * @param {*} prebidBidRequestOrOrtbBidRequest + * @returns string + * @throws {Error} If the placement ID is not found in the given object. + */ + getPlacementId: function (prebidBidRequestOrOrtbBidRequest) { + // Fields that would be set by the publisher in the bid configuration object in ad unit. + const paramPath = 'params.placementId'; + const bidRequestFirstBidParam = `bids.0.${paramPath}`; + + // ORTB path for placement ID + const ortbPath = 'imp.0.tagid'; + const placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(prebidBidRequestOrOrtbBidRequest, paramPath) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(prebidBidRequestOrOrtbBidRequest, bidRequestFirstBidParam) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(prebidBidRequestOrOrtbBidRequest, ortbPath); + if (!placementId) { + throw new Error('Failed to obtain placement ID from the given object. ' + `Please set it via the "${paramPath}" field in the bid configuration.\n` + 'Given object:\n' + JSON.stringify({ + functionParam: prebidBidRequestOrOrtbBidRequest + }, null, 3)); + } + return placementId; + }, + /** + * !IMPORTANT: Make sure the implementation of this function matches utils.getOrtbId in + * mobkoiAnalyticsAdapter.js. + * We use the bidderRequestId as the ortbId. We could do so because we only + * make one ORTB request per Prebid Bidder Request. + * The ID field named differently when the value passed on to different contexts. + * @param {*} bid Prebid Bidder Request Object or Prebid Bid Response/Request + * or ORTB Request/Response Object + * @returns {string} The ORTB ID + * @throws {Error} If the ORTB ID cannot be found in the given object. + */ + getOrtbId(bid) { + const ortbId = + // called bidderRequestId in Prebid Request + bid.bidderRequestId || + // called seatBidId in Prebid Bid Response Object + bid.seatBidId || + // called ortbId in Interpreted Prebid Response Object + bid.ortbId || + // called id in ORTB object + Object.hasOwn(bid, 'imp') && bid.id; + if (!ortbId) { + throw new Error('Unable to find the ORTB ID in the bid object. Given Object:\n' + JSON.stringify(bid, null, 2)); + } + return ortbId; + }, + /** + * Append custom fields to the prebid bid response. so that they can be accessed + * in various event handlers. + * @param {*} prebidBidResponse + * @param {*} ortbBidResponse + */ + addCustomFieldsToPrebidBidResponse(prebidBidResponse, ortbBidResponse) { + prebidBidResponse.ortbBidResponse = ortbBidResponse; + prebidBidResponse.ortbId = ortbBidResponse.id; + } +}; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('mobkoiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mobkoiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mobkoiIdSystem"],{ + +/***/ "./modules/mobkoiIdSystem.js": +/*!***********************************!*\ + !*** ./modules/mobkoiIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PROD_AD_SERVER_BASE_URL, EQUATIV_BASE_URL, EQUATIV_NETWORK_ID, storage, mobkoiIdSubmodule, utils */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + +/** + * This module adds mobkoiId support to the User ID module + * The {@link module:modules/userId} module is required. + * @module modules/mobkoiIdSystem + * @requires module:modules/userId + */ + + + + + +const GVL_ID = 898; +const MODULE_NAME = 'mobkoiId'; +const PROD_AD_SERVER_BASE_URL = 'https://adserver.maximus.mobkoi.com'; +const EQUATIV_BASE_URL = 'https://sync.smartadserver.com'; +const EQUATIV_NETWORK_ID = '5290'; +/** + * !IMPORTANT: This value must match the value in mobkoiAnalyticsAdapter.js + * The name of the parameter that the publisher can use to specify the ad server endpoint. + */ +const PARAM_NAME_AD_SERVER_BASE_URL = 'adServerBaseUrl'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const mobkoiIdSubmodule = { + name: MODULE_NAME, + gvlid: GVL_ID, + decode(value) { + return value ? { + [MODULE_NAME]: value + } : undefined; + }, + getId(userSyncOptions, gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Getting Equativ SAS ID.'); + if (!storage.cookiesAreEnabled()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Cookies are not enabled. Module will not work.'); + return { + id: null + }; + } + const storageName = userSyncOptions && userSyncOptions.storage && userSyncOptions.storage.name; + if (!storageName) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Storage name is not defined. Module will not work.'); + return { + id: null + }; + } + const existingId = storage.getCookie(storageName); + if (existingId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Found "${storageName}" from local cookie: "${existingId}"`); + return { + id: existingId + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Cannot found "${storageName}" in local cookie with name.`); + return { + callback: () => { + return new Promise((resolve, _reject) => { + utils.requestEquativSasId(userSyncOptions, gdprConsent, sasId => { + if (!sasId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Equativ SAS ID is empty'); + resolve({ + id: null + }); + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Fetched Equativ SAS ID: "${sasId}"`); + storage.setCookie(storageName, sasId, userSyncOptions.storage.expires); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Stored Equativ SAS ID in local cookie with name: "${storageName}"`); + resolve({ + id: sasId + }); + }); + }); + } + }; + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', mobkoiIdSubmodule); +const utils = { + requestEquativSasId(syncUserOptions, gdprConsent, onCompleteCallback) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Start requesting Equativ SAS ID'); + const adServerBaseUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(syncUserOptions, `params.${PARAM_NAME_AD_SERVER_BASE_URL}`) || PROD_AD_SERVER_BASE_URL; + const equativPixelUrl = utils.buildEquativPixelUrl(syncUserOptions, gdprConsent); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Equativ SAS ID request URL:', equativPixelUrl); + const url = adServerBaseUrl + '/pixeliframe?' + 'pixelUrl=' + encodeURIComponent(equativPixelUrl) + '&cookieName=sas_uid'; + + /** + * Listen for messages from the iframe + */ + window.addEventListener('message', function (event) { + switch (event.data.type) { + case 'MOBKOI_PIXEL_SYNC_COMPLETE': + const sasUid = event.data.syncData; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Parent window Sync completed. SAS ID:', sasUid); + onCompleteCallback(sasUid); + break; + case 'MOBKOI_PIXEL_SYNC_ERROR': + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Parent window Sync failed:', event.data.error); + onCompleteCallback(null); + break; + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.insertUserSyncIframe)(url, () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('insertUserSyncIframe loaded'); + }); + + // Return the URL for testing purposes + return url; + }, + /** + * Build a pixel URL that will be placed in an iframe to fetch the Equativ SAS ID + */ + buildEquativPixelUrl(syncUserOptions, gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Generating Equativ SAS ID request URL'); + const adServerBaseUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(syncUserOptions, `params.${PARAM_NAME_AD_SERVER_BASE_URL}`) || PROD_AD_SERVER_BASE_URL; + const gdprConsentString = gdprConsent && gdprConsent.gdprApplies ? gdprConsent.consentString : ''; + const smartServerUrl = EQUATIV_BASE_URL + '/getuid?' + `url=` + encodeURIComponent(`${adServerBaseUrl}/getPixel?value=`) + '[sas_uid]' + `&gdpr_consent=${gdprConsentString}` + `&nwid=${EQUATIV_NETWORK_ID}`; + return smartServerUrl; + } +}; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('mobkoiIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mobkoiIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["multibid"],{ + +/***/ "./modules/multibid/index.js": +/*!***********************************!*\ + !*** ./modules/multibid/index.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports validateMultibid, adjustBidderRequestsHook, addBidResponseHook, sortByMultibid, targetBidPoolHook, resetMultiConfig, resetMultibidUnits, setOrtbExtPrebidMultibid */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_auction_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/auction.js */ "./src/auction.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/targeting.js */ "./src/targeting.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); + +/** + * This module adds Multibid support to prebid.js + * @module modules/multibid + */ + + + + + + + + + + +const MODULE_NAME = 'multibid'; +let hasMultibid = false; +let multiConfig = {}; +let multibidUnits = {}; + +// Storing this globally on init for easy reference to configuration +_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig(MODULE_NAME, conf => { + if (!Array.isArray(conf.multibid) || !conf.multibid.length || !validateMultibid(conf.multibid)) return; + resetMultiConfig(); + hasMultibid = true; + conf.multibid.forEach(entry => { + if (entry.bidder) { + multiConfig[entry.bidder] = { + maxbids: entry.maxBids, + prefix: entry.targetBiddercodePrefix + }; + } else { + entry.bidders.forEach(key => { + multiConfig[key] = { + maxbids: entry.maxBids, + prefix: entry.targetBiddercodePrefix + }; + }); + } + }); +}); + +/** + * @summary validates multibid configuration entries + * @param {Object[]} conf - example [{bidder: 'bidderA', maxbids: 2, prefix: 'bidA'}, {bidder: 'bidderB', maxbids: 2}] + * @return {Boolean} + */ +function validateMultibid(conf) { + let check = true; + let duplicate = conf.filter(entry => { + // Check if entry.bidder is not defined or typeof string, filter entry and reset configuration + if ((!entry.bidder || typeof entry.bidder !== 'string') && (!entry.bidders || !Array.isArray(entry.bidders))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Filtering multibid entry. Missing required bidder or bidders property.'); + check = false; + return false; + } + return true; + }).map(entry => { + // Check if entry.maxbids is not defined, not typeof number, or less than 1, set maxbids to 1 and reset configuration + // Check if entry.maxbids is greater than 9, set maxbids to 9 and reset configuration + if (typeof entry.maxBids !== 'number' || entry.maxBids < 1 || entry.maxBids > 9) { + entry.maxBids = typeof entry.maxBids !== 'number' || entry.maxBids < 1 ? 1 : 9; + check = false; + } + return entry; + }); + if (!check) _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.setConfig({ + multibid: duplicate + }); + return check; +} + +/** + * @summary addBidderRequests before hook + * @param {Function} fn reference to original function (used by hook logic) + * @param {Object[]} bidderRequests containing copy of each bidderRequest object + */ +function adjustBidderRequestsHook(fn, bidderRequests) { + bidderRequests.map(bidRequest => { + // Loop through bidderRequests and check if bidderCode exists in multiconfig + // If true, add bidderRequest.bidLimit to bidder request + if (multiConfig[bidRequest.bidderCode]) { + bidRequest.bidLimit = multiConfig[bidRequest.bidderCode].maxbids; + } + return bidRequest; + }); + fn.call(this, bidderRequests); +} + +/** + * @summary addBidResponse before hook + * @param {Function} fn reference to original function (used by hook logic) + * @param {String} ad unit code for bid + * @param {Object} bid object + */ +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_2__.timedBidResponseHook)('multibid', function addBidResponseHook(fn, adUnitCode, bid, reject) { + let floor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'floorData.floorValue'); + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('multibid')) resetMultiConfig(); + // Checks if multiconfig exists and bid bidderCode exists within config and is an adpod bid + // Else checks if multiconfig exists and bid bidderCode exists within config + // Else continue with no modifications + if (hasMultibid && multiConfig[bid.bidderCode] && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'video.context') === 'adpod') { + fn.call(this, adUnitCode, bid, reject); + } else if (hasMultibid && multiConfig[bid.bidderCode]) { + // Set property multibidPrefix on bid + if (multiConfig[bid.bidderCode].prefix) bid.multibidPrefix = multiConfig[bid.bidderCode].prefix; + bid.originalBidder = bid.bidderCode; + // Check if stored bids for auction include adUnitCode.bidder and max limit not reach for ad unit + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(multibidUnits, [adUnitCode, bid.bidderCode])) { + // Store request id under new property originalRequestId, create new unique bidId, + // and push bid into multibid stored bids for auction if max not reached and bid cpm above floor + if (!multibidUnits[adUnitCode][bid.bidderCode].maxReached && (!floor || floor <= bid.cpm)) { + bid.originalRequestId = bid.requestId; + bid.requestId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getUniqueIdentifierStr)(); + multibidUnits[adUnitCode][bid.bidderCode].ads.push(bid); + let length = multibidUnits[adUnitCode][bid.bidderCode].ads.length; + if (multiConfig[bid.bidderCode].prefix) bid.targetingBidder = multiConfig[bid.bidderCode].prefix + length; + if (length === multiConfig[bid.bidderCode].maxbids) multibidUnits[adUnitCode][bid.bidderCode].maxReached = true; + fn.call(this, adUnitCode, bid, reject); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtering multibid received from bidder ${bid.bidderCode}: ` + (multibidUnits[adUnitCode][bid.bidderCode].maxReached ? `Maximum bid limit reached for ad unit code ${adUnitCode}` : 'Bid cpm under floors value.')); + } + } else { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'floorData.floorValue')) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(multibidUnits, [adUnitCode, bid.bidderCode], { + floor: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'floorData.floorValue') + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(multibidUnits, [adUnitCode, bid.bidderCode], { + ads: [bid] + }); + if (multibidUnits[adUnitCode][bid.bidderCode].ads.length === multiConfig[bid.bidderCode].maxbids) multibidUnits[adUnitCode][bid.bidderCode].maxReached = true; + fn.call(this, adUnitCode, bid, reject); + } + } else { + fn.call(this, adUnitCode, bid, reject); + } +}); + +/** + * A descending sort function that will sort the list of objects based on the following: + * - bids without dynamic aliases are sorted before bids with dynamic aliases + */ +function sortByMultibid(a, b) { + if (a.bidder !== a.bidderCode && b.bidder === b.bidderCode) { + return 1; + } + if (a.bidder === a.bidderCode && b.bidder !== b.bidderCode) { + return -1; + } + return 0; +} + +/** + * @summary getHighestCpmBidsFromBidPool before hook + * @param {Function} fn reference to original function (used by hook logic) + * @param {Object[]} bidsReceived array of objects containing all bids from bid pool + * @param {Function} highestCpmCallback function to reduce to only highest cpm value for each bidderCode + * @param {Number} adUnitBidLimit bidder targeting limit, default set to 0 + * @param {Boolean} hasModified default set to false, this hook modifies targeting and sets to true + */ +function targetBidPoolHook(fn, bidsReceived, highestCpmCallback) { + let adUnitBidLimit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + let hasModified = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + if (!_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('multibid')) resetMultiConfig(); + if (hasMultibid) { + const dealPrioritization = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('sendBidsControl.dealPrioritization'); + let modifiedBids = []; + let buckets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.groupBy)(bidsReceived, 'adUnitCode'); + let bids = [].concat.apply([], Object.keys(buckets).reduce((result, slotId) => { + let bucketBids = []; + // Get bids and group by property originalBidder + let bidsByBidderName = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.groupBy)(buckets[slotId], 'originalBidder'); + let adjustedBids = [].concat.apply([], Object.keys(bidsByBidderName).map(key => { + // Reset all bidderCodes to original bidder values and sort by CPM + return bidsByBidderName[key].sort((bidA, bidB) => { + if (bidA.originalBidder && bidA.originalBidder !== bidA.bidderCode) bidA.bidderCode = bidA.originalBidder; + if (bidA.originalBidder && bidB.originalBidder !== bidB.bidderCode) bidB.bidderCode = bidB.originalBidder; + return bidA.cpm > bidB.cpm ? -1 : bidA.cpm < bidB.cpm ? 1 : 0; + }).map((bid, index) => { + // For each bid (post CPM sort), set dynamic bidderCode using prefix and index if less than maxbid amount + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(multiConfig, `${bid.bidderCode}.prefix`) && index !== 0 && index < multiConfig[bid.bidderCode].maxbids) { + bid.bidderCode = multiConfig[bid.bidderCode].prefix + (index + 1); + } + return bid; + }); + })); + // Get adjustedBids by bidderCode and reduce using highestCpmCallback + let bidsByBidderCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.groupBy)(adjustedBids, 'bidderCode'); + Object.keys(bidsByBidderCode).forEach(key => bucketBids.push(bidsByBidderCode[key].reduce(highestCpmCallback))); + // if adUnitBidLimit is set, pass top N number bids + if (adUnitBidLimit > 0) { + bucketBids = dealPrioritization ? bucketBids.sort((0,_src_targeting_js__WEBPACK_IMPORTED_MODULE_5__.sortByDealAndPriceBucketOrCpm)(true)) : bucketBids.sort((a, b) => b.cpm - a.cpm); + bucketBids.sort(sortByMultibid); + modifiedBids.push(...bucketBids.slice(0, adUnitBidLimit)); + } else { + modifiedBids.push(...bucketBids); + } + return [].concat.apply([], modifiedBids); + }, [])); + fn.call(this, bids, highestCpmCallback, adUnitBidLimit, true); + } else { + fn.call(this, bidsReceived, highestCpmCallback, adUnitBidLimit); + } +} + +/** + * Resets globally stored multibid configuration + */ +const resetMultiConfig = () => { + hasMultibid = false; + multiConfig = {}; +}; + +/** + * Resets globally stored multibid ad unit bids + */ +const resetMultibidUnits = () => multibidUnits = {}; + +/** + * Set up hooks on init + */ +function init() { + // TODO: does this reset logic make sense - what about simultaneous auctions? + _src_events_js__WEBPACK_IMPORTED_MODULE_6__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.AUCTION_INIT, resetMultibidUnits); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.setupBeforeHookFnOnce)(_src_auction_js__WEBPACK_IMPORTED_MODULE_9__.addBidderRequests, adjustBidderRequestsHook); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.getHook)('addBidResponse').before(addBidResponseHook, 3); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_8__.setupBeforeHookFnOnce)(_src_targeting_js__WEBPACK_IMPORTED_MODULE_5__.getHighestCpmBidsFromBidPool, targetBidPoolHook); +} +init(); +function setOrtbExtPrebidMultibid(ortbRequest) { + const multibid = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('multibid'); + if (multibid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbRequest, 'ext.prebid.multibid', multibid.map(o => Object.fromEntries(Object.entries(o).map(_ref => { + let [k, v] = _ref; + return [k.toLowerCase(), v]; + })))); + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__.REQUEST, + name: 'extPrebidMultibid', + fn: setOrtbExtPrebidMultibid, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__.PBS] +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('multibid'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/multibid/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mwOpenLinkIdSystem"],{ + +/***/ "./modules/mwOpenLinkIdSystem.js": +/*!***************************************!*\ + !*** ./modules/mwOpenLinkIdSystem.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports writeCookie, mwOpenLinkIdSubModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds MediaWallah OpenLink to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/mwOpenLinkIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleParams} SubmoduleParams + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const openLinkID = { + name: 'mwol', + cookie_expiration: 86400 * 1000 * 365 * 1 // 1 year +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: openLinkID.name +}); +function getExpirationDate() { + return new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + openLinkID.cookie_expiration).toGMTString(); +} +function isValidConfig(configParams) { + if (!configParams) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - mwOlId submodule requires configParams'); + return false; + } + if (!configParams.accountId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - mwOlId submodule requires accountId to be defined'); + return false; + } + if (!configParams.partnerId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('User ID - mwOlId submodule requires partnerId to be defined'); + return false; + } + return true; +} +function deserializeMwOlId(mwOlIdStr) { + const mwOlId = {}; + const mwOlIdArr = mwOlIdStr.split(','); + mwOlIdArr.forEach(function (value) { + const pair = value.split(':'); + // unpack a value of 1 as true + mwOlId[pair[0]] = +pair[1] === 1 ? true : pair[1]; + }); + return mwOlId; +} +function serializeMwOlId(mwOlId) { + let components = []; + if (mwOlId.eid) { + components.push('eid:' + mwOlId.eid); + } + if (mwOlId.ibaOptout) { + components.push('ibaOptout:1'); + } + if (mwOlId.ccpaOptout) { + components.push('ccpaOptout:1'); + } + return components.join(','); +} +function readCookie(name) { + if (!name) name = openLinkID.name; + const mwOlIdStr = storage.getCookie(name); + if (mwOlIdStr) { + return deserializeMwOlId(decodeURIComponent(mwOlIdStr)); + } + return null; +} +function writeCookie(mwOlId) { + if (mwOlId) { + const mwOlIdStr = encodeURIComponent(serializeMwOlId(mwOlId)); + storage.setCookie(openLinkID.name, mwOlIdStr, getExpirationDate(), 'lax'); + } +} +function register(configParams, olid) { + const { + accountId, + partnerId, + uid + } = configParams; + const url = 'https://ol.mediawallahscript.com/?account_id=' + accountId + '&partner_id=' + partnerId + '&uid=' + uid + '&olid=' + olid + '&cb=' + Math.random(); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url); +} +function setID(configParams) { + if (!isValidConfig(configParams)) return undefined; + const mwOlId = readCookie(); + const newMwOlId = mwOlId ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(mwOlId) : { + eid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)() + }; + writeCookie(newMwOlId); + register(configParams, newMwOlId.eid); + return { + id: newMwOlId + }; +} +; + +/* End MW */ + + + +/** @type {Submodule} */ +const mwOpenLinkIdSubModule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'mwOpenLinkId', + /** + * decode the stored id value for passing to bid requests + * @function + * @param {Object} mwOlId + * @return {(Object|undefined)} + */ + decode(mwOlId) { + const id = mwOlId && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(mwOlId) ? mwOlId.eid : undefined; + return id ? { + 'mwOpenLinkId': id + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [submoduleConfig] + * @returns {(Object|undefined)} + */ + getId(submoduleConfig) { + const submoduleConfigParams = submoduleConfig && submoduleConfig.params || {}; + if (!isValidConfig(submoduleConfigParams)) return undefined; + return setID(submoduleConfigParams); + }, + eids: { + 'mwOpenLinkId': { + source: 'mediawallahscript.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', mwOpenLinkIdSubModule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('mwOpenLinkIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mwOpenLinkIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["my6senseBidAdapter"],{ + +/***/ "./modules/my6senseBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/my6senseBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + +const BIDDER_CODE = 'my6sense'; +const END_POINT = 'https://hb.mynativeplatform.com/pub2/web/v1.15.0/hbwidget.json'; +const END_POINT_METHOD = 'POST'; + +// called first +function isBidRequestValid(bid) { + return !(bid.bidder !== BIDDER_CODE || !bid.params || !bid.params.key); +} +function getUrl(url) { + // TODO: this should probably look at refererInfo + if (!url) { + url = window.location.href; // "clean" url of current web page + } + var canonicalLink = null; + // first look for meta data with property "og:url" + var metaElements = document.getElementsByTagName('meta'); + for (var i = 0; i < metaElements.length && !canonicalLink; i++) { + if (metaElements[i].getAttribute('property') == 'og:url') { + canonicalLink = metaElements[i].content; + } + } + if (!canonicalLink) { + var canonicalLinkContainer = document.querySelector("link[rel='canonical']"); // html element containing the canonical link + if (canonicalLinkContainer) { + // get clean url from href of + canonicalLink = canonicalLinkContainer.href; + } + } + url = canonicalLink || url; + return encodeURIComponent(url).toString(); +} + +/** + * this function is used to fix param value before sending them to server, if user did not set it, + * default value for parameter will be returned + * example1: paidClicks: '[PAID_TRACKING_PIXEL]', will return {value: '', fromUser: false} + * example2: pageURL: 'www.my6sense.com', will return {value: 'www.my6sense.com', fromUser: true} + * @param key + * @param value + * @returns {{value: *, fromUser: boolean}} + */ +function fixRequestParamForServer(key, value) { + function isEmptyValue(key, value) { + return value === parametersMap[key].emptyValue; + } + const parametersMap = { + 'pageUrl': { + emptyValue: '[PAGE_URL]', + defaultValue: getUrl() + }, + 'displayWithinIframe': { + emptyValue: '', + defaultValue: '' + }, + 'dataParams': { + emptyValue: '[KEY_VALUES]', + defaultValue: '' + }, + 'paidClicks': { + emptyValue: '[PAID_TRACKING_PIXEL]', + defaultValue: '' + }, + 'organicClicks': { + emptyValue: '[ORGANIC_TRACKING_PIXEL]', + defaultValue: '' + }, + 'dataView': { + emptyValue: '[VIEW_TRACKING_PIXEL]', + defaultValue: '' + } + // ZONE is not part of this object, handled on server side + }; + + // if param is not in list we do not change it (return it as is) + if (!parametersMap.hasOwnProperty(key)) { + return { + value: value, + fromUser: true + }; + } + + // if no value given by user set it to default + if (!value || isEmptyValue(key, value)) { + return { + value: parametersMap[key].defaultValue, + fromUser: false + }; + } + return { + value: value, + fromUser: true + }; +} + +// called second + +function buildGdprServerProperty(bidderRequest) { + var gdprObj = { + gdpr_consent: null, + gdpr: null + }; + if (bidderRequest && 'gdprConsent' in bidderRequest) { + gdprObj.gdpr_consent = bidderRequest.gdprConsent.consentString || null; + gdprObj.gdpr = gdprObj.gdpr === null && bidderRequest.gdprConsent.gdprApplies == true ? true : gdprObj.gdpr; + gdprObj.gdpr = gdprObj.gdpr === null && bidderRequest.gdprConsent.gdprApplies == false ? false : gdprObj.gdpr; + gdprObj.gdpr = gdprObj.gdpr === null && bidderRequest.gdprConsent.gdprApplies == 1 ? true : gdprObj.gdpr; + gdprObj.gdpr = gdprObj.gdpr === null && bidderRequest.gdprConsent.gdprApplies == 0 ? false : gdprObj.gdpr; + } + return gdprObj; +} +function buildRequests(validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_0__.convertOrtbRequestToProprietaryNative)(validBidRequests); + let requests = []; + if (validBidRequests && validBidRequests.length) { + validBidRequests.forEach(bidRequest => { + bidRequest.widget_num = 1; // mandatory property for server side + let isDataUrlSetByUser = false; + let debug = false; + if (bidRequest.params) { + for (let key in bidRequest.params) { + // loop over params and remove empty/untouched values + if (bidRequest.params.hasOwnProperty(key)) { + // if debug we update url string to get core debug version + if (key === 'debug' && bidRequest.params[key] === true) { + debug = true; + delete bidRequest.params[key]; + continue; + } + let fixedObj = fixRequestParamForServer(key, bidRequest.params[key]); + bidRequest.params[key] = fixedObj.value; + + // if pageUrl is set by user we should update variable for query string param + if (key === 'pageUrl' && fixedObj.fromUser === true) { + isDataUrlSetByUser = true; + } + + // remove empty params from request + if (!bidRequest.params[key]) { + delete bidRequest.params[key]; + } + } + } + } + let url = `${END_POINT}?widget_key=${bidRequest.params.key}&is_data_url_set=${isDataUrlSetByUser}`; // mandatory query string for server side + if (debug) { + url = `${END_POINT}?env=debug&widget_key=${bidRequest.params.key}&is_data_url_set=${isDataUrlSetByUser}`; // this url is for debugging + } + bidRequest.gdpr = buildGdprServerProperty(bidderRequest); + requests.push({ + url: url, + method: END_POINT_METHOD, + data: JSON.stringify(bidRequest) + }); + }); + } + return requests; +} + +// called third + +function interpretResponse(serverResponse) { + const bidResponses = []; + // currently server returns a single response which is the body property + if (serverResponse.body) { + serverResponse.body.bidderCode = BIDDER_CODE; + bidResponses.push(serverResponse.body); + } + return bidResponses; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid, + buildRequests, + interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('my6senseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/my6senseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mygaruIdSystem"],{ + +/***/ "./modules/mygaruIdSystem.js": +/*!***********************************!*\ + !*** ./modules/mygaruIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports buildUrl, mygaruIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds MyGaru Real Time User Sync to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/mygaruIdSystem + * @requires module:modules/userId + */ + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + */ + +const bidderCode = 'mygaruId'; +const syncUrl = 'https://ident.mygaru.com/v2/id'; +function buildUrl(opts) { + const queryPairs = []; + for (let key in opts) { + if (opts[key] !== undefined) { + queryPairs.push(`${key}=${encodeURIComponent(opts[key])}`); + } + } + return `${syncUrl}?${queryPairs.join('&')}`; +} +function requestRemoteIdAsync(url) { + return new Promise(resolve => { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax)(url, { + success: response => { + try { + const jsonResponse = JSON.parse(response); + const { + iuid + } = jsonResponse; + resolve(iuid); + } catch (e) { + resolve(); + } + }, + error: () => { + resolve(); + } + }, undefined, { + method: 'GET', + contentType: 'application/json' + }); + }); +} + +/** @type {Submodule} */ +const mygaruIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: bidderCode, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{id: string} | null} + */ + decode(id) { + return id; + }, + /** + * get the MyGaru Id from local storages and initiate a new user sync + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {{id: string | undefined}} + */ + getId(config, consentData) { + const gdprApplies = consentData?.gdpr?.gdprApplies === true ? 1 : 0; + const gdprConsentString = gdprApplies ? consentData.gdpr.consentString : undefined; + const url = buildUrl({ + gdprApplies, + gdprConsentString + }); + return { + url, + callback: function (done) { + return requestRemoteIdAsync(url).then(id => { + done({ + mygaruId: id + }); + }); + } + }; + }, + eids: { + 'mygaruId': { + source: 'mygaru.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.submodule)('userId', mygaruIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('mygaruIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mygaruIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["mytargetBidAdapter"],{ + +/***/ "./modules/mytargetBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/mytargetBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +const BIDDER_CODE = 'mytarget'; +const BIDDER_URL = '//ad.mail.ru/hbid_prebid/'; +const DEFAULT_CURRENCY = 'RUB'; +const DEFAULT_TTL = 180; +function buildPlacement(bidRequest) { + let { + bidId, + params + } = bidRequest; + let { + placementId, + position, + response, + bidfloor + } = params; + let placement = { + placementId, + id: bidId, + position: position || 0, + response: response || 0 + }; + if (typeof bidfloor !== 'undefined') { + placement.bidfloor = bidfloor; + } + return placement; +} +function getSiteName(referrer) { + let sitename = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('mytarget.sitename'); + if (!sitename) { + const parsed = document.createElement('a'); + parsed.href = decodeURIComponent(referrer); + sitename = parsed.hostname; + } + return sitename; +} +function generateRandomId() { + return Math.random().toString(16).substring(2); +} +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let referrer = ''; + if (bidderRequest && bidderRequest.refererInfo) { + referrer = bidderRequest.refererInfo.page; + } + const payload = { + places: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(validBidRequests, buildPlacement), + site: { + sitename: getSiteName(referrer), + page: referrer + }, + settings: { + currency: DEFAULT_CURRENCY, + windowSize: { + width: window.screen.width, + height: window.screen.height + } + } + }; + return { + method: 'POST', + url: BIDDER_URL, + data: payload + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + let { + body + } = serverResponse; + if (body.bids) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(body.bids, bid => { + let bidResponse = { + requestId: bid.id, + cpm: bid.price, + width: bid.size.width, + height: bid.size.height, + ttl: bid.ttl || DEFAULT_TTL, + currency: bid.currency || DEFAULT_CURRENCY, + creativeId: bid.creativeId || generateRandomId(), + netRevenue: true, + meta: { + advertiserDomains: bid.adomain && bid.adomain.length > 0 ? bid.adomain : [] + } + }; + if (bid.adm) { + bidResponse.ad = bid.adm; + } else { + bidResponse.adUrl = bid.displayUrl; + } + return bidResponse; + }); + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('mytargetBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/mytargetBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nativeRendering"],{ + +/***/ "./modules/nativeRendering.js": +/*!************************************!*\ + !*** ./modules/nativeRendering.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adRendering_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adRendering.js */ "./src/adRendering.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _libraries_creative_renderer_native_renderer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/creative-renderer-native/renderer.js */ "./libraries/creative-renderer-native/renderer.js"); +/* harmony import */ var _src_creativeRenderers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/creativeRenderers.js */ "./src/creativeRenderers.js"); + + + + + + +function getRenderingDataHook(next, bidResponse, options) { + if ((0,_src_native_js__WEBPACK_IMPORTED_MODULE_0__.isNativeResponse)(bidResponse)) { + next.bail({ + native: (0,_src_native_js__WEBPACK_IMPORTED_MODULE_0__.getNativeRenderingData)(bidResponse, _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_1__.auctionManager.index.getAdUnit(bidResponse)) + }); + } else { + next(bidResponse, options); + } +} +function getRendererSourceHook(next, bidResponse) { + if ((0,_src_native_js__WEBPACK_IMPORTED_MODULE_0__.isNativeResponse)(bidResponse)) { + next.bail(_libraries_creative_renderer_native_renderer_js__WEBPACK_IMPORTED_MODULE_2__.RENDERER); + } else { + next(bidResponse); + } +} +if (true) { + _src_adRendering_js__WEBPACK_IMPORTED_MODULE_3__.getRenderingData.before(getRenderingDataHook); + _src_creativeRenderers_js__WEBPACK_IMPORTED_MODULE_4__.getCreativeRendererSource.before(getRendererSourceHook); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('nativeRendering'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["creative-renderer-native","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nativeRendering.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nativoBidAdapter"],{ + +/***/ "./modules/nativoBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/nativoBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BidDataMap, spec, RequestData, BidRequestDataSource, UserEIDs, QueryStringParam, encodeToBase64, parseFloorPriceData, getSizeWildcardPrice, getMediaWildcardPrices, sizeToString, buildRequestUrl, getPageUrlFromBidRequest, hasProtocol, addProtocol */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + // `netRevenue` and `ttl` are required properties of bid responses - provide a default for them + netRevenue: true, + // or false if your adapter should set bidResponse.netRevenue = false + ttl: 30 // default bidResponse.ttl (when not specified in ORTB response.seatbid[].bid[].exp) + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + imp.tagid = bidRequest.adUnitCode; + if (imp.ext) imp.ext.placementId = bidRequest.params.placementId; + return imp; + } +}); +const BIDDER_CODE = 'nativo'; +const BIDDER_ENDPOINT = 'https://exchange.postrelease.com/prebid'; +const GVLID = 263; +const TIME_TO_LIVE = 360; +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE]; +const FLOOR_PRICE_CURRENCY = 'USD'; +const PRICE_FLOOR_WILDCARD = '*'; +const localPbjsRef = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)(); +function getMediaType(accessObj) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(accessObj, 'mediaTypes.video')) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(accessObj, 'mediaTypes.native')) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + } +} + +/** + * Keep track of bid data by keys + * @returns {Object} - Map of bid data that can be referenced by multiple keys + */ +function BidDataMap() { + const referenceMap = {}; + const bids = []; + + /** + * Add a refence to the index by key value + * @param {String} key - The key to store the index reference + * @param {number} index - The index value of the bidData + */ + function addKeyReference(key, index) { + if (!referenceMap.hasOwnProperty(key)) { + referenceMap[key] = index; + } + } + + /** + * Adds a bid to the map + * @param {Object} bid - Bid data + * @param {(Array|string)} keys - Keys to reference the index value + */ + function addBidData(bid, keys) { + const index = bids.length; + bids.push(bid); + if (Array.isArray(keys)) { + keys.forEach(key => { + addKeyReference(String(key), index); + }); + return; + } + addKeyReference(String(keys), index); + } + + /** + * Get's the bid data refrerenced by the key + * @param {String} key - The key value to find the bid data by + * @returns {Object} - The bid data + */ + function getBidData(key) { + const stringKey = String(key); + if (referenceMap.hasOwnProperty(stringKey)) { + return bids[referenceMap[stringKey]]; + } + } + + // Return API + return { + addBidData, + getBidData + }; +} +const bidRequestMap = {}; +const adUnitsRequested = {}; +const extData = {}; + +// Filtering +const adsToFilter = new Set(); +const advertisersToFilter = new Set(); +const campaignsToFilter = new Set(); + +// Prebid adapter referrence doc: https://docs.prebid.org/dev-docs/bidder-adaptor.html + +// Validity checks for optionsl paramters +const validParameter = { + url: value => typeof value === 'string', + placementId: value => { + const isString = typeof value === 'string'; + const isNumber = typeof value === 'number'; + return isString || isNumber; + } +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: ['ntv'], + // short code + supportedMediaTypes: SUPPORTED_AD_TYPES, + /** + * Determines whether or not the given bid request is valid. + * + * @param {Object} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // We don't need any specific parameters to make a bid request + if (!bid.params) return true; + + // Check if any supplied parameters are invalid + const hasInvalidParameters = Object.keys(bid.params).some(key => { + const value = bid.params[key]; + const validityCheck = validParameter[key]; + + // We don't have a test for this so it's not a paramter we care about + if (!validityCheck) return false; + + // Return if the check is not passed + return !validityCheck(value); + }); + return !hasInvalidParameters; + }, + /** + * Called when the page asks Prebid.js for bids + * Make a server request from the list of BidRequests + * + * @param {Array} validBidRequests - An array of bidRequest objects, one for each AdUnit that your module is involved in. This array has been processed for special features like sizeConfig, so it’s the list that you should be looping through + * @param {Object} bidderRequest - The master bidRequest object. This object is useful because it carries a couple of bid parameters that are global to all the bids. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // Get OpenRTB Data + const openRTBData = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + const openRTBDataString = JSON.stringify(openRTBData); + const requestData = new RequestData(); + requestData.addBidRequestDataSource(new UserEIDs()); + + // Parse values from bid requests + const placementIds = new Set(); + const bidDataMap = BidDataMap(); + const placementSizes = { + length: 0 + }; + const floorPriceData = {}; + let placementId, pageUrl; + validBidRequests.forEach(bidRequest => { + pageUrl = getPageUrlFromBidRequest(bidRequest) || bidderRequest.refererInfo.location; + placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.placementId'); + const bidDataKeys = [bidRequest.adUnitCode]; + if (placementId && !placementIds.has(placementId)) { + placementIds.add(placementId); + bidDataKeys.push(placementId); + placementSizes[placementId] = bidRequest.sizes; + placementSizes.length++; + } + const bidData = { + bidId: bidRequest.bidId, + size: getLargestSize(bidRequest.sizes) + }; + bidDataMap.addBidData(bidData, bidDataKeys); + const bidRequestFloorPriceData = parseFloorPriceData(bidRequest); + if (bidRequestFloorPriceData) { + floorPriceData[bidRequest.adUnitCode] = bidRequestFloorPriceData; + } + requestData.processBidRequestData(bidRequest, bidderRequest); + }); + bidRequestMap[bidderRequest.bidderRequestId] = bidDataMap; + + // Build adUnit data + const adUnitData = buildAdUnitData(validBidRequests); + + // Build basic required QS Params + let params = [ + // Prebid version + { + key: 'ntv_pbv', + value: localPbjsRef.version + }, + // Prebid request id + { + key: 'ntv_pb_rid', + value: bidderRequest.bidderRequestId + }, + // Ad unit data + { + key: 'ntv_ppc', + value: btoa(JSON.stringify(adUnitData)) // Convert to Base 64 + }, + // Number count of requests per ad unit + { + key: 'ntv_dbr', + value: btoa(JSON.stringify(adUnitsRequested)) // Convert to Base 64 + }, + // Page url + { + key: 'ntv_url', + value: encodeURIComponent(pageUrl) + }]; + + // Floor pricing + if (Object.keys(floorPriceData).length) { + params.unshift({ + key: 'ntv_ppf', + value: btoa(JSON.stringify(floorPriceData)) + }); + } + + // Add filtering + if (adsToFilter.size > 0) { + params.unshift({ + key: 'ntv_atf', + value: Array.from(adsToFilter).join(',') + }); + } + if (advertisersToFilter.size > 0) { + params.unshift({ + key: 'ntv_avtf', + value: Array.from(advertisersToFilter).join(',') + }); + } + if (campaignsToFilter.size > 0) { + params.unshift({ + key: 'ntv_ctf', + value: Array.from(campaignsToFilter).join(',') + }); + } + + // Placement Sizes + if (placementSizes.length) { + params.unshift({ + key: 'ntv_pas', + value: btoa(JSON.stringify(placementSizes)) + }); + } + + // Add placement IDs + if (placementIds.size > 0) { + // Convert Set to Array (IE 11 Safe) + const placements = []; + placementIds.forEach(value => placements.push(value)); + // Append to query string paramters + params.unshift({ + key: 'ntv_ptd', + value: placements.join(',') + }); + } + + // Add GDPR params + if (bidderRequest.gdprConsent) { + // Put on the beginning of the qs param array + params.unshift({ + key: 'ntv_gdpr_consent', + value: bidderRequest.gdprConsent.consentString + }); + } + + // Add GPP params + if (bidderRequest.gppConsent) { + params.unshift({ + key: 'ntv_gpp_consent', + value: bidderRequest.gppConsent.gppString + }); + } + + // Add USP params + if (bidderRequest.uspConsent) { + // Put on the beginning of the qs param array + params.unshift({ + key: 'us_privacy', + value: bidderRequest.uspConsent + }); + } + const qsParamStrings = [requestData.getRequestDataQueryString(), arrayToQS(params)]; + const requestUrl = buildRequestUrl(BIDDER_ENDPOINT, qsParamStrings); + let serverRequest = { + method: 'POST', + url: requestUrl, + data: openRTBDataString, + bidderRequest: bidderRequest + }; + return serverRequest; + }, + /** + * Will be called when the browser has received the response from your server. + * The function will parse the response and create a bidResponse object containing one or more bids. + * The adapter should indicate no valid bids by returning an empty array. + * + * @param {Object} response - Data returned from the bidding server request endpoint + * @param {Object} request - The request object used to call the server request endpoint + * @return {Array} An array of bids which were nested inside the server. + */ + interpretResponse: function (response, request) { + // If the bid response was empty, return [] + if (!response || !response.body || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(response.body)) return []; + try { + const body = typeof response.body === 'string' ? JSON.parse(response.body) : response.body; + const bidResponses = []; + const seatbids = body.seatbid; + + // Step through and grab pertinent data + let bidResponse, adUnit; + seatbids.forEach((seatbid, i) => { + seatbid.bid.forEach(bid => { + adUnit = this.getAdUnitData(body.id, bid); + bidResponse = { + requestId: adUnit.bidId, + cpm: bid.price, + currency: body.cur, + width: bid.w || adUnit.size[0], + height: bid.h || adUnit.size[1], + creativeId: bid.crid, + dealId: bid.id, + netRevenue: true, + ttl: bid.ttl || TIME_TO_LIVE, + ad: bid.adm, + meta: { + advertiserDomains: bid.adomain + }, + mediaType: getMediaType(request.bidderRequest.bids[i]) + }; + if (bid.ext) extData[bid.id] = bid.ext; + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + bidResponse.vastUrl = bid.adm; + } + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE) { + bidResponse.native = { + ortb: JSON.parse(bidResponse.ad) + }; + } + bidResponses.push(bidResponse); + }); + }); + + // Don't need the map anymore as it was unique for one request/response + delete bidRequestMap[body.id]; + return bidResponses; + } catch (error) { + // If there is an error, return [] + return []; + } + }, + /** + * All user ID sync activity should be done using the getUserSyncs callback of the BaseAdapter model. + * Given an array of all the responses from the server, getUserSyncs is used to determine which user syncs should occur. + * The order of syncs in the serverResponses array matters. The most important ones should come first, since publishers may limit how many are dropped on their page. + * @param {Object} syncOptions - Which user syncs are allowed? + * @param {Array} serverResponses - Array of server's responses + * @param {Object} gdprConsent - GDPR consent data + * @param {Object} uspConsent - USP consent data + * @return {Array} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + // Generate consent qs string + let params = ''; + // GDPR + if (gdprConsent) { + params = appendQSParamString(params, 'gdpr', gdprConsent.gdprApplies ? 1 : 0); + params = appendQSParamString(params, 'gdpr_consent', encodeURIComponent(gdprConsent.consentString || '')); + } + // CCPA + if (uspConsent) { + params = appendQSParamString(params, 'us_privacy', encodeURIComponent(uspConsent.uspConsent)); + } + + // Get sync urls from the respnse and inject cinbsent params + const types = { + iframe: syncOptions.iframeEnabled, + image: syncOptions.pixelEnabled + }; + const syncs = []; + let body; + serverResponses.forEach(response => { + // If the bid response was empty, return [] + if (!response || !response.body || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(response.body)) { + return syncs; + } + try { + body = typeof response.body === 'string' ? JSON.parse(response.body) : response.body; + } catch (err) { + return; + } + + // Make sure we have valid content + if (!body || !body.seatbid || body.seatbid.length === 0) return; + body.seatbid.forEach(seatbid => { + // Grab the syncs for each seatbid + if (seatbid.syncUrls) { + seatbid.syncUrls.forEach(sync => { + if (types[sync.type]) { + if (sync.url.trim() !== '') { + syncs.push({ + type: sync.type, + url: sync.url.replace('{GDPR_params}', params) + }); + } + } + }); + } + }); + }); + return syncs; + }, + /** + * Will be called when a bid from the adapter won the auction. + * @param {Object} bid - The bid that won the auction + */ + onBidWon: function (bid) { + const ext = extData[bid.dealId]; + if (!ext) return; + appendFilterData(adsToFilter, ext.adsToFilter); + appendFilterData(advertisersToFilter, ext.advertisersToFilter); + appendFilterData(campaignsToFilter, ext.campaignsToFilter); + }, + /** + * Maps Prebid's bidId to Nativo's placementId values per unique bidderRequestId + * @param {String} bidderRequestId - The unique ID value associated with the bidderRequest + * @param {Object} bid - The placement ID value from Nativo + * @returns {String} - The bidId value associated with the corresponding placementId + */ + getAdUnitData: function (bidderRequestId, bid) { + const bidDataMap = bidRequestMap[bidderRequestId]; + const placementId = bid.impid; + const adUnitCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ext.ad_unit_id'); + return bidDataMap.getBidData(adUnitCode) || bidDataMap.getBidData(placementId); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); + +// Utils +class RequestData { + constructor() { + this.bidRequestDataSources = []; + } + addBidRequestDataSource(bidRequestDataSource) { + if (!(bidRequestDataSource instanceof BidRequestDataSource)) return; + this.bidRequestDataSources.push(bidRequestDataSource); + } + processBidRequestData(bidRequest, bidderRequest) { + for (let bidRequestDataSource of this.bidRequestDataSources) { + bidRequestDataSource.processBidRequestData(bidRequest, bidderRequest); + } + } + getRequestDataQueryString() { + if (this.bidRequestDataSources.length == 0) return; + const queryParams = this.bidRequestDataSources.map(dataSource => dataSource.getRequestQueryString()).filter(queryString => queryString !== ''); + return queryParams.join('&'); + } +} +class BidRequestDataSource { + constructor() { + this.type = 'BidRequestDataSource'; + } + processBidRequestData(bidRequest, bidderRequest) {} + getRequestQueryString() { + return ''; + } +} +class UserEIDs extends BidRequestDataSource { + constructor() { + super(); + this.type = 'UserEIDs'; + this.qsParam = new QueryStringParam('ntv_pb_eid'); + this.eids = []; + } + processBidRequestData(bidRequest, bidderRequest) { + if (bidRequest.userIdAsEids === undefined || this.eids.length > 0) return; + this.eids = bidRequest.userIdAsEids; + } + getRequestQueryString() { + if (this.eids.length === 0) return ''; + const encodedValueArray = encodeToBase64(this.eids); + this.qsParam.value = encodedValueArray; + return this.qsParam.toString(); + } +} +class QueryStringParam { + constructor(key, value) { + this.key = key; + this.value = value; + } +} +QueryStringParam.prototype.toString = function () { + return `${this.key}=${this.value}`; +}; +function encodeToBase64(value) { + try { + return btoa(JSON.stringify(value)); + } catch (err) {} +} +function parseFloorPriceData(bidRequest) { + if (typeof bidRequest.getFloor !== 'function') return; + + // Setup price floor data per bid request + let bidRequestFloorPriceData = {}; + let bidMediaTypes = bidRequest.mediaTypes; + let sizeOptions = new Set(); + // Step through meach media type so we can get floor data for each media type per bid request + Object.keys(bidMediaTypes).forEach(mediaType => { + // Setup price floor data per media type + let mediaTypeData = bidMediaTypes[mediaType]; + let mediaTypeFloorPriceData = {}; + let mediaTypeSizes = mediaTypeData.sizes || mediaTypeData.playerSize || []; + // Step through each size of the media type so we can get floor data for each size per media type + mediaTypeSizes.forEach(size => { + // Get floor price data per the getFloor method and respective media type / size combination + const priceFloorData = bidRequest.getFloor({ + currency: FLOOR_PRICE_CURRENCY, + mediaType, + size + }); + // Save the data and track the sizes + mediaTypeFloorPriceData[sizeToString(size)] = priceFloorData?.floor; + sizeOptions.add(size); + }); + bidRequestFloorPriceData[mediaType] = mediaTypeFloorPriceData; + + // Get floor price of current media type with a wildcard size + const sizeWildcardFloor = getSizeWildcardPrice(bidRequest, mediaType); + // Save the wildcard floor price if it was retrieved successfully + if (sizeWildcardFloor?.floor > 0) { + mediaTypeFloorPriceData['*'] = sizeWildcardFloor.floor; + } + }); + + // Get floor price for wildcard media type using all of the sizes present in the previous media types + const mediaWildCardPrices = getMediaWildcardPrices(bidRequest, [PRICE_FLOOR_WILDCARD, ...Array.from(sizeOptions)]); + bidRequestFloorPriceData['*'] = mediaWildCardPrices; + return bidRequestFloorPriceData; +} + +/** + * Get price floor data by always setting the size value to the wildcard for a specific size + * @param {Object} bidRequest - The bid request + * @param {String} mediaType - The media type + * @returns {Object} - Bid floor data + */ +function getSizeWildcardPrice(bidRequest, mediaType) { + return bidRequest.getFloor({ + currency: FLOOR_PRICE_CURRENCY, + mediaType, + size: PRICE_FLOOR_WILDCARD + }); +} + +/** + * Get price data for a range of sizes and always setting the media type to the wildcard value + * @param {*} bidRequest - The bid request + * @param {*} sizes - The sizes to get the floor price data for + * @returns {Object} - Bid floor data + */ +function getMediaWildcardPrices(bidRequest) { + let sizes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [PRICE_FLOOR_WILDCARD]; + const sizePrices = {}; + sizes.forEach(size => { + // MODIFY the bid request's mediaTypes property (so we can get the wildcard media type value) + const temp = bidRequest.mediaTypes; + bidRequest.mediaTypes = { + PRICE_FLOOR_WILDCARD: temp.sizes + }; + // Get price floor data + const priceFloorData = bidRequest.getFloor({ + currency: FLOOR_PRICE_CURRENCY, + mediaType: PRICE_FLOOR_WILDCARD, + size + }); + // RESTORE initial property value + bidRequest.mediaTypes = temp; + + // Only save valid floor price data + const key = size !== PRICE_FLOOR_WILDCARD ? sizeToString(size) : PRICE_FLOOR_WILDCARD; + sizePrices[key] = priceFloorData.floor; + }); + return sizePrices; +} + +/** + * Format size array to a string + * @param {Array} size - Size data [width, height] + * @returns {String} - Formated size string + */ +function sizeToString(size) { + if (!Array.isArray(size) || size.length < 2) return ''; + return `${size[0]}x${size[1]}`; +} + +/** + * Build the ad unit data to send back to the request endpoint + * @param {Array} requests - Bid requests + * @returns {Array} - Array of ad unit data + */ +function buildAdUnitData(requests) { + return requests.map(request => { + // Track if we've already requested for this ad unit code + adUnitsRequested[request.adUnitCode] = adUnitsRequested[request.adUnitCode] !== undefined ? adUnitsRequested[request.adUnitCode] + 1 : 0; + // Return a new object with only the data we need + return { + adUnitCode: request.adUnitCode, + mediaTypes: request.mediaTypes + }; + }); +} + +/** + * Append QS param to existing string + * @param {String} str - String to append to + * @param {String} key - Key to append + * @param {String} value - Value to append + * @returns + */ +function appendQSParamString(str, key, value) { + return str + `${str.length ? '&' : ''}${key}=${value}`; +} + +/** + * Convert an object to query string parameters + * @param {Object[]} arr - Object to convert + * @returns + */ +function arrayToQS(arr) { + return arr.reduce((value, obj) => { + return appendQSParamString(value, obj.key, obj.value); + }, ''); +} + +/** + * Get the largest size array + * @param {Array} sizes - Array of size arrays + * @returns Size array with the largest area + */ +function getLargestSize(sizes) { + let method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : area; + if (!sizes || sizes.length === 0) return []; + if (sizes.length === 1) return sizes[0]; + return sizes.reduce((prev, current) => { + if (method(current) > method(prev)) { + return current; + } else { + return prev; + } + }); +} + +/** + * Build the final request url + */ +function buildRequestUrl(baseUrl) { + let qsParamStringArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + if (qsParamStringArray.length === 0 || !Array.isArray(qsParamStringArray)) { + return baseUrl; + } + const nonEmptyQSParamStrings = qsParamStringArray.filter(qsParamString => qsParamString.trim() !== ''); + if (nonEmptyQSParamStrings.length === 0) return baseUrl; + let requestUrl = `${baseUrl}?${nonEmptyQSParamStrings[0]}`; + for (let i = 1; i < nonEmptyQSParamStrings.length; i++) { + requestUrl += `&${nonEmptyQSParamStrings[i]}`; + } + return requestUrl; +} + +/** + * Calculate the area + * @param {Array} size - [width, height] + * @returns The calculated area + */ +const area = size => size[0] * size[1]; + +/** + * Save any filter data from winning bid requests for subsequent requests + * @param {Array} filter - The filter data bucket currently stored + * @param {Array} filterData - The filter data to add + */ +function appendFilterData(filter, filterData) { + if (filterData && Array.isArray(filterData) && filterData.length) { + filterData.forEach(ad => filter.add(ad)); + } +} +function getPageUrlFromBidRequest(bidRequest) { + let paramPageUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.url'); + if (paramPageUrl == undefined) return; + if (hasProtocol(paramPageUrl)) return paramPageUrl; + paramPageUrl = addProtocol(paramPageUrl); + try { + const url = new URL(paramPageUrl); + return url.href; + } catch (err) {} +} +function hasProtocol(url) { + const protocolRegexp = /^http[s]?\:/; + return protocolRegexp.test(url); +} +function addProtocol(url) { + if (hasProtocol(url)) { + return url; + } + let protocolPrefix = 'https:'; + if (url.indexOf('//') !== 0) { + protocolPrefix += '//'; + } + return `${protocolPrefix}${url}`; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('nativoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nativoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["naveggIdSystem"],{ + +/***/ "./modules/naveggIdSystem.js": +/*!***********************************!*\ + !*** ./modules/naveggIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, naveggIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds naveggId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/naveggId + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const MODULE_NAME = 'naveggId'; +const OLD_NAVEGG_ID = 'nid'; +const NAVEGG_ID = 'nvggid'; +const BASE_URL = 'https://id.navegg.com/uid/'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function getIdFromAPI() { + const resp = function (callback) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajaxBuilder)()(BASE_URL, response => { + if (response) { + let responseObj; + try { + responseObj = JSON.parse(response); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(error); + const fallbackValue = getNaveggIdFromLocalStorage() || getOldCookie(); + callback(fallbackValue); + } + if (responseObj && responseObj[NAVEGG_ID]) { + callback(responseObj[NAVEGG_ID]); + } else { + const fallbackValue = getNaveggIdFromLocalStorage() || getOldCookie(); + callback(fallbackValue); + } + } + }, error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Navegg ID fetch encountered an error', error); + const fallbackValue = getNaveggIdFromLocalStorage() || getOldCookie(); + callback(fallbackValue); + }, { + method: 'GET', + withCredentials: false + }); + }; + return resp; +} + +/** + * @returns {string | null} + */ +function readNvgIdFromCookie() { + return storage.cookiesAreEnabled ? storage.findSimilarCookies('nvg') ? storage.findSimilarCookies('nvg')[0] : null : null; +} +/** + * @returns {string | null} + */ +function readNavIdFromCookie() { + return storage.cookiesAreEnabled() ? storage.findSimilarCookies('nav') ? storage.findSimilarCookies('nav')[0] : null : null; +} +/** + * @returns {string | null} + */ +function readOldNaveggIdFromCookie() { + return storage.cookiesAreEnabled() ? storage.getCookie(OLD_NAVEGG_ID) : null; +} +/** + * @returns {string | null} + */ +function getOldCookie() { + const oldCookie = readOldNaveggIdFromCookie() || readNvgIdFromCookie() || readNavIdFromCookie(); + return oldCookie; +} +/** + * @returns {string | null} + */ +function getNaveggIdFromLocalStorage() { + return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(NAVEGG_ID) : null; +} + +/** @type {Submodule} */ +const naveggIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { Object | string | undefined } value + * @return { Object | string | undefined } + */ + decode(value) { + const naveggIdVal = value ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(value) ? value : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(value) ? value.id : undefined : undefined; + return naveggIdVal ? { + 'naveggId': naveggIdVal.split('|')[0] + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} config + * @return {{id: string | undefined } | undefined} + */ + getId(config, consentData) { + const resp = getIdFromAPI(); + return { + callback: resp + }; + }, + eids: { + 'naveggId': { + source: 'navegg.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', naveggIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('naveggIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/naveggIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["netIdSystem"],{ + +/***/ "./modules/netIdSystem.js": +/*!********************************!*\ + !*** ./modules/netIdSystem.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export netIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds netId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/netIdSystem + * @requires module:modules/userId + */ + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +/** @type {Submodule} */ +const netIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'netId', + /** + * decode the stored id value for passing to bid requests + * @function decode + * @param {(Object|string)} value + * @returns {(Object|undefined)} + */ + decode(value) { + return value && typeof value['netId'] === 'string' ? { + 'netId': value['netId'] + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + /* currently not possible */ + return {}; + }, + eids: { + 'netId': { + source: 'netid.de', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.submodule)('userId', netIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('netIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/netIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["neuwoRtdProvider"],{ + +/***/ "./modules/neuwoRtdProvider.js": +/*!*************************************!*\ + !*** ./modules/neuwoRtdProvider.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports DATA_PROVIDER, getBidRequestData, addFragment, injectTopics, convertSegment, pickSegments, neuwoRtdModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + + +const DATA_PROVIDER = 'neuwo.ai'; +const SEGTAX_IAB = 6; // IAB - Content Taxonomy version 2 +const RESPONSE_IAB_TIER_1 = 'marketing_categories.iab_tier_1'; +const RESPONSE_IAB_TIER_2 = 'marketing_categories.iab_tier_2'; +function init(config, userConsent) { + // config.params = config.params || {} + // ignore module if publicToken is missing (module setup failure) + if (!config || !config.params || !config.params.publicToken) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('publicToken missing', 'NeuwoRTDModule', 'config.params.publicToken'); + return false; + } + if (!config || !config.params || !config.params.apiUrl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('apiUrl missing', 'NeuwoRTDModule', 'config.params.apiUrl'); + return false; + } + return true; +} +function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + const confParams = config.params || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NeuwoRTDModule', 'starting getBidRequestData'); + const wrappedArgUrl = encodeURIComponent(confParams.argUrl || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_1__.getRefererInfo)().page); + /* adjust for pages api.url?prefix=test (to add params with '&') as well as api.url (to add params with '?') */ + const joiner = confParams.apiUrl.indexOf('?') < 0 ? '?' : '&'; + const url = confParams.apiUrl + joiner + ['token=' + confParams.publicToken, 'url=' + wrappedArgUrl].join('&'); + const billingId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + const success = responseContent => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NeuwoRTDModule', 'GetAiTopics: response', responseContent); + try { + const jsonContent = JSON.parse(responseContent); + if (jsonContent.marketing_categories) { + _src_events_js__WEBPACK_IMPORTED_MODULE_2__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BILLABLE_EVENT, { + type: 'request', + billingId, + vendor: neuwoRtdModule.name + }); + } + injectTopics(jsonContent, reqBidsConfigObj, billingId); + } catch (ex) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('NeuwoRTDModule', 'Response to JSON parse error', ex); + } + callback(); + }; + const error = err => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('xhr error', null, err); + callback(); + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, { + success, + error + }, null, { + // could assume Origin header is set, or + // customHeaders: { 'Origin': 'Origin' } + }); +} +function addFragment(base, path, addition) { + const container = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(container, path, addition); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(base, container); +} + +/** + * Concatenate a base array and an array within an object + * non-array bases will be arrays, non-arrays at object key will be discarded + * @param {Array} base base array to add to + * @param {object} source object to get an array from + * @param {string} key dot-notated path to array within object + * @returns base + source[key] if that's an array + */ +function combineArray(base, source, key) { + if (Array.isArray(base) === false) base = []; + const addition = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(source, key, []); + if (Array.isArray(addition)) return base.concat(addition);else return base; +} +function injectTopics(topics, bidsConfig) { + topics = topics || {}; + + // join arrays of IAB category details to single array + const combinedTiers = combineArray(combineArray([], topics, RESPONSE_IAB_TIER_1), topics, RESPONSE_IAB_TIER_2); + const segment = pickSegments(combinedTiers); + // effectively gets topics.marketing_categories.iab_tier_1, topics.marketing_categories.iab_tier_2 + // used as FPD segments content + + const IABSegments = { + name: DATA_PROVIDER, + ext: { + segtax: SEGTAX_IAB + }, + segment + }; + addFragment(bidsConfig.ortb2Fragments.global, 'site.content.data', [IABSegments]); + + // upgrade category taxonomy to IAB 2.2, inject result to page categories + if (segment.length > 0) { + addFragment(bidsConfig.ortb2Fragments.global, 'site.pagecat', segment.map(s => s.id)); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NeuwoRTDModule', 'injectTopics: post-injection bidsConfig', bidsConfig); +} +const D_IAB_ID = { + // Content Taxonomy version 2.0 final release November 2017 [sic] (Taxonomy ID Mapping, IAB versions 2.0 - 2.2) + 'IAB19-1': '603', + 'IAB6-1': '193', + 'IAB5-2': '133', + 'IAB20-1': '665', + 'IAB20-2': '656', + 'IAB23-2': '454', + 'IAB3-2': '102', + 'IAB20-3': '672', + 'IAB8-5': '211', + 'IAB8-18': '211', + 'IAB7-4': '288', + 'IAB7-5': '233', + 'IAB17-12': '484', + 'IAB19-3': '608', + 'IAB21-1': '442', + 'IAB9-2': '248', + 'IAB15-1': '456', + 'IAB9-17': '265', + 'IAB20-4': '658', + 'IAB2-3': '30', + 'IAB2-1': '32', + 'IAB17-1': '518', + 'IAB2-2': '34', + 'IAB2': '1', + 'IAB8-2': '215', + 'IAB17-2': '545', + 'IAB17-26': '547', + 'IAB9-3': '249', + 'IAB18-1': '553', + 'IAB20-5': '674', + 'IAB15-2': '465', + 'IAB3-3': '119', + 'IAB16-2': '423', + 'IAB9-4': '259', + 'IAB9-5': '270', + 'IAB18-2': '574', + 'IAB17-4': '549', + 'IAB7-33': '312', + 'IAB1-1': '42', + 'IAB17-5': '485', + 'IAB23-3': '458', + 'IAB20-6': '675', + 'IAB3': '53', + 'IAB20-7': '676', + 'IAB19-5': '633', + 'IAB20-9': '677', + 'IAB9-6': '250', + 'IAB17-6': '499', + 'IAB2-4': '25', + 'IAB9-7': '271', + 'IAB4-11': '125', + 'IAB4-1': '126', + 'IAB4': '123', + 'IAB16-3': '424', + 'IAB2-5': '18', + 'IAB17-7': '486', + 'IAB15-3': '466', + 'IAB23-5': '459', + 'IAB9-9': '260', + 'IAB2-22': '19', + 'IAB17-8': '500', + 'IAB9-10': '261', + 'IAB5-5': '137', + 'IAB9-11': '262', + 'IAB2-21': '3', + 'IAB19-2': '610', + 'IAB19-8': '600', + 'IAB19-9': '601', + 'IAB3-5': '121', + 'IAB9-15': '264', + 'IAB2-6': '8', + 'IAB2-7': '9', + 'IAB22-2': '474', + 'IAB17-9': '491', + 'IAB2-8': '10', + 'IAB20-12': '678', + 'IAB17-3': '492', + 'IAB19-12': '611', + 'IAB14-1': '188', + 'IAB6-3': '194', + 'IAB7-17': '316', + 'IAB19-13': '612', + 'IAB8-8': '217', + 'IAB9-1': '205', + 'IAB19-22': '613', + 'IAB8-9': '218', + 'IAB14-2': '189', + 'IAB16-4': '425', + 'IAB9-12': '251', + 'IAB5': '132', + 'IAB6-9': '190', + 'IAB19-15': '623', + 'IAB17-17': '496', + 'IAB20-14': '659', + 'IAB6': '186', + 'IAB20-26': '666', + 'IAB17-10': '510', + 'IAB13-4': '396', + 'IAB1-3': '201', + 'IAB16-1': '426', + 'IAB17-11': '511', + 'IAB17-13': '511', + 'IAB17-32': '511', + 'IAB7-1': '225', + 'IAB8': '210', + 'IAB8-10': '219', + 'IAB9-13': '266', + 'IAB10-4': '275', + 'IAB9-14': '273', + 'IAB15-8': '469', + 'IAB15-4': '470', + 'IAB17-15': '512', + 'IAB3-7': '77', + 'IAB19-16': '614', + 'IAB3-8': '78', + 'IAB2-10': '22', + 'IAB2-12': '22', + 'IAB2-11': '11', + 'IAB8-12': '221', + 'IAB7-35': '223', + 'IAB7-38': '223', + 'IAB7-24': '296', + 'IAB13-5': '411', + 'IAB7-25': '234', + 'IAB23-6': '460', + 'IAB9': '239', + 'IAB7-26': '235', + 'IAB10': '274', + 'IAB10-1': '278', + 'IAB10-2': '279', + 'IAB19-17': '634', + 'IAB10-5': '280', + 'IAB5-10': '145', + 'IAB5-11': '146', + 'IAB20-17': '667', + 'IAB17-16': '497', + 'IAB20-18': '668', + 'IAB3-9': '55', + 'IAB1-4': '440', + 'IAB17-18': '514', + 'IAB17-27': '515', + 'IAB10-3': '282', + 'IAB19-25': '618', + 'IAB17-19': '516', + 'IAB13-6': '398', + 'IAB10-7': '283', + 'IAB12-1': '382', + 'IAB19-24': '624', + 'IAB6-4': '195', + 'IAB23-7': '461', + 'IAB9-19': '252', + 'IAB4-4': '128', + 'IAB4-5': '127', + 'IAB23-8': '462', + 'IAB10-8': '284', + 'IAB5-8': '147', + 'IAB16-5': '427', + 'IAB11-2': '383', + 'IAB12-3': '384', + 'IAB3-10': '57', + 'IAB2-13': '23', + 'IAB9-20': '241', + 'IAB3-1': '58', + 'IAB3-11': '58', + 'IAB14-4': '191', + 'IAB17-20': '520', + 'IAB7-31': '228', + 'IAB7-37': '301', + 'IAB3-12': '107', + 'IAB2-14': '13', + 'IAB17-25': '519', + 'IAB2-15': '27', + 'IAB1-5': '324', + 'IAB1-6': '338', + 'IAB9-16': '243', + 'IAB13-8': '412', + 'IAB12-2': '385', + 'IAB9-21': '253', + 'IAB8-6': '222', + 'IAB7-32': '229', + 'IAB2-16': '14', + 'IAB17-23': '521', + 'IAB13-9': '413', + 'IAB17-24': '501', + 'IAB9-22': '254', + 'IAB15-5': '244', + 'IAB6-2': '196', + 'IAB6-5': '197', + 'IAB6-6': '198', + 'IAB2-17': '24', + 'IAB13-2': '405', + 'IAB13': '391', + 'IAB13-7': '410', + 'IAB13-12': '415', + 'IAB16': '422', + 'IAB9-23': '255', + 'IAB7-36': '236', + 'IAB15-6': '471', + 'IAB2-18': '15', + 'IAB11-4': '386', + 'IAB1-2': '432', + 'IAB5-9': '139', + 'IAB6-7': '305', + 'IAB5-12': '149', + 'IAB5-13': '134', + 'IAB19-4': '631', + 'IAB19-19': '631', + 'IAB19-20': '631', + 'IAB19-32': '631', + 'IAB9-24': '245', + 'IAB21': '441', + 'IAB21-3': '451', + 'IAB23': '453', + 'IAB10-9': '276', + 'IAB4-9': '130', + 'IAB16-6': '429', + 'IAB4-6': '129', + 'IAB13-10': '416', + 'IAB2-19': '28', + 'IAB17-28': '525', + 'IAB9-25': '272', + 'IAB17-29': '527', + 'IAB17-30': '227', + 'IAB17-31': '530', + 'IAB22-1': '481', + 'IAB15': '464', + 'IAB9-26': '246', + 'IAB9-27': '256', + 'IAB9-28': '267', + 'IAB17-33': '502', + 'IAB19-35': '627', + 'IAB2-20': '4', + 'IAB7-39': '307', + 'IAB19-30': '605', + 'IAB22': '473', + 'IAB17-34': '503', + 'IAB17-35': '531', + 'IAB7-19': '309', + 'IAB7-40': '310', + 'IAB19-6': '635', + 'IAB7-41': '237', + 'IAB17-36': '504', + 'IAB17-44': '533', + 'IAB20-23': '662', + 'IAB15-7': '472', + 'IAB20-24': '671', + 'IAB5-14': '136', + 'IAB6-8': '199', + 'IAB17': '483', + 'IAB9-29': '263', + 'IAB2-23': '5', + 'IAB13-11': '414', + 'IAB4-3': '395', + 'IAB18': '552', + 'IAB7-42': '311', + 'IAB17-37': '505', + 'IAB17-38': '537', + 'IAB17-39': '538', + 'IAB19-26': '636', + 'IAB19': '596', + 'IAB1-7': '640', + 'IAB17-40': '539', + 'IAB7-43': '293', + 'IAB20': '653', + 'IAB8-16': '212', + 'IAB8-17': '213', + 'IAB16-7': '430', + 'IAB9-30': '680', + 'IAB17-41': '541', + 'IAB17-42': '542', + 'IAB17-43': '506', + 'IAB15-10': '390', + 'IAB19-23': '607', + 'IAB19-34': '629', + 'IAB14-7': '165', + 'IAB7-44': '231', + 'IAB7-45': '238', + 'IAB9-31': '257', + 'IAB5-1': '135', + 'IAB7-2': '301', + 'IAB18-6': '580', + 'IAB7-3': '297', + 'IAB23-1': '453', + 'IAB8-1': '214', + 'IAB7-6': '312', + 'IAB7-7': '300', + 'IAB7-8': '301', + 'IAB13-1': '410', + 'IAB7-9': '301', + 'IAB15-9': '465', + 'IAB7-10': '313', + 'IAB3-4': '602', + 'IAB20-8': '660', + 'IAB8-3': '214', + 'IAB20-10': '660', + 'IAB7-11': '314', + 'IAB20-11': '660', + 'IAB23-4': '459', + 'IAB9-8': '270', + 'IAB8-4': '214', + 'IAB7-12': '306', + 'IAB7-13': '313', + 'IAB7-14': '287', + 'IAB18-5': '575', + 'IAB7-15': '315', + 'IAB8-7': '214', + 'IAB19-11': '616', + 'IAB7-16': '289', + 'IAB7-18': '301', + 'IAB7-20': '290', + 'IAB20-13': '659', + 'IAB7-21': '313', + 'IAB18-3': '579', + 'IAB13-3': '52', + 'IAB20-15': '659', + 'IAB8-11': '214', + 'IAB7-22': '318', + 'IAB20-16': '659', + 'IAB7-23': '313', + 'IAB7': '223', + 'IAB10-6': '634', + 'IAB7-27': '318', + 'IAB11-1': '388', + 'IAB7-29': '318', + 'IAB7-30': '304', + 'IAB19-18': '619', + 'IAB8-13': '214', + 'IAB20-19': '659', + 'IAB20-20': '657', + 'IAB8-14': '214', + 'IAB18-4': '565', + 'IAB23-9': '459', + 'IAB11': '379', + 'IAB8-15': '214', + 'IAB20-21': '662', + 'IAB17-21': '492', + 'IAB17-22': '518', + 'IAB12': '379', + 'IAB23-10': '453', + 'IAB7-34': '301', + 'IAB4-8': '395', + 'IAB26-3': '608', + 'IAB20-25': '151', + 'IAB20-27': '659' +}; +function convertSegment(segment) { + if (!segment) return {}; + return { + id: D_IAB_ID[segment.id || segment.ID] + }; +} + +/** + * map array of objects to segments + * @param {Array<{ID: string}>} normalizable + * @returns array of IAB "segments" + */ +function pickSegments(normalizable) { + if (Array.isArray(normalizable) === false) return []; + return normalizable.map(convertSegment).filter(t => t.id); +} +const neuwoRtdModule = { + name: 'NeuwoRTDModule', + init, + getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.submodule)('realTimeData', neuwoRtdModule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('neuwoRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/neuwoRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["newspassidBidAdapter"],{ + +/***/ "./modules/newspassidBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/newspassidBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports resolveNewpassidPublisherId, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + */ + +const BIDDER_CODE = 'newspassid'; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const DEFAULT_TTL = 300; +const ENDPOINT_URL = 'https://npid.amspbs.com/v0/bid/request'; +const GVL_ID = 1317; +const SYNC_URL = 'https://npid.amspbs.com/v0/user/sync'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.newspassid', { + publisher: resolveNewpassidPublisherId(bidRequest), + placementId: bidRequest.params.placementId + }); + return imp; + }, + context: { + ttl: DEFAULT_TTL, + netRevenue: DEFAULT_NET_REVENUE + } +}); + +/** + * Helper function to add params to url + * @param {string} url + * @param {object} params + * @returns {string} + */ +const addParamsToUrl = (url, params) => { + const urlObj = new URL(url); + Object.entries(params).forEach(_ref => { + let [key, value] = _ref; + urlObj.searchParams.set(key, value); + }); + return urlObj.toString(); +}; + +/** + * Get the global publisherId for the newspassid bidder + * @returns {string|null} + */ +const getGlobalPublisherIdOrNull = () => { + const globalPublisherId = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('newspassid.publisherId'); + if (globalPublisherId) return globalPublisherId; + return null; +}; + +/** + * Resolve the publisherId for the newspassid bidder + * @param {BidRequest|undefined} bidRequest + * @returns {string|null} + */ +const resolveNewpassidPublisherId = bidRequest => { + if (typeof bidRequest !== 'object') return getGlobalPublisherIdOrNull(); + + // get publisherId from bidRequest params + const { + params + } = bidRequest; + if (params?.publisherId) return params?.publisherId; + return getGlobalPublisherIdOrNull(); +}; + +/** + * @type {BidderSpec} + */ +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + isBidRequestValid: function (bidRequest) { + const publisherId = resolveNewpassidPublisherId(bidRequest); + return !!(bidRequest.params && publisherId && bidRequest.params.placementId); + }, + buildRequests: function (bidRequests, bidderRequest) { + // convert to ortb using the converter utility + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return [{ + method: 'POST', + url: ENDPOINT_URL, + data: data, + options: { + withCredentials: true + } + }]; + }, + interpretResponse: function (serverResponse, bidRequest) { + const response = serverResponse.body; + const bidResponses = []; + if (!response || !response.seatbid || !response.seatbid[0].bid) { + return bidResponses; + } + response.seatbid[0].bid.forEach(bid => { + bidResponses.push({ + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.id, + currency: response.cur || DEFAULT_CURRENCY, + netRevenue: true, + ttl: DEFAULT_TTL, + ad: bid.adm, + meta: { + advertiserDomains: bid.adomain || [] + } + }); + }); + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + if (!syncOptions.iframeEnabled) return []; // disable if iframe sync is disabled + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_4__.hasPurpose1Consent)(gdprConsent)) return []; // disable if no purpose1 consent + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) return []; // disable syncs for coppa + + const params = { + gdpr: gdprConsent?.gdprApplies ? 1 : 0, + gdpr_consent: gdprConsent?.gdprApplies ? encodeURIComponent(gdprConsent?.consentString || '') : '', + gpp: encodeURIComponent(gppConsent?.gppString || ''), + gpp_sid: encodeURIComponent(gppConsent?.applicableSections || ''), + us_privacy: encodeURIComponent(uspConsent || '') + }; + const globalPublisherId = resolveNewpassidPublisherId({}); + if (globalPublisherId) { + // "publisher" is a convention on the server side + params.publisher = globalPublisherId; + } + let syncs = []; + + // iframe sync + syncs.push({ + type: 'iframe', + url: addParamsToUrl(SYNC_URL, params) + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('newspassidBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/newspassidBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nextMillenniumBidAdapter"],{ + +/***/ "./modules/nextMillenniumBidAdapter.js": +/*!*********************************************!*\ + !*** ./modules/nextMillenniumBidAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, getImp, getImpBanner, getImpVideo, setImpPos, setConsentStrings, setOrtb2Parameters, setEids, replaceUsersyncMacros, getPlacementId, getSourceObj */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_targetVideoUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/targetVideoUtils/bidderUtils.js */ "./libraries/targetVideoUtils/bidderUtils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/viewport/viewport.js */ "./libraries/viewport/viewport.js"); + + + + + + + + + +const NM_VERSION = '4.3.0'; +const PBJS_VERSION = "v9.45.0-pre"; +const GVLID = 1060; +const BIDDER_CODE = 'nextMillennium'; +const ENDPOINT = 'https://pbs.nextmillmedia.com/openrtb2/auction'; +const TEST_ENDPOINT = 'https://test.pbs.nextmillmedia.com/openrtb2/auction'; +const SYNC_ENDPOINT = 'https://cookies.nextmillmedia.com/sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&type={{.TYPE_PIXEL}}'; +const REPORT_ENDPOINT = 'https://report2.hb.brainlyads.com/statistics/metric'; +const TIME_TO_LIVE = 360; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_TMAX = 1500; +const VIDEO_PARAMS_DEFAULT = { + api: undefined, + context: undefined, + delivery: undefined, + linearity: undefined, + maxduration: undefined, + mimes: ['video/mp4', 'video/x-ms-wmv', 'application/javascript'], + minduration: undefined, + placement: undefined, + plcmt: undefined, + playbackend: undefined, + playbackmethod: undefined, + pos: undefined, + protocols: undefined, + skip: undefined, + skipafter: undefined, + skipmin: undefined, + startdelay: undefined +}; +const VIDEO_PARAMS = Object.keys(VIDEO_PARAMS_DEFAULT); +const ALLOWED_ORTB2_PARAMETERS = ['site.pagecat', 'site.content.cat', 'site.content.language', 'device.sua', 'site.keywords', 'site.content.keywords', 'user.keywords', 'bcat', 'badv', 'wlang', 'wlangb']; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + gvlid: GVLID, + isBidRequestValid: function (bid) { + return !!(bid.params.placement_id && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.placement_id) || bid.params.group_id && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.group_id)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const requests = []; + window.nmmRefreshCounts = window.nmmRefreshCounts || {}; + const site = getSiteObj(); + const device = getDeviceObj(); + const source = getSourceObj(validBidRequests, bidderRequest); + const tmax = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'timeout') || DEFAULT_TMAX; + const postBody = { + id: bidderRequest?.bidderRequestId, + tmax, + ext: { + next_mil_imps: [] + }, + device, + site, + source, + imp: [] + }; + setConsentStrings(postBody, bidderRequest); + setOrtb2Parameters(postBody, bidderRequest?.ortb2); + const urlParameters = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)().location.href).search; + const isTest = urlParameters['pbs'] && urlParameters['pbs'] === 'test'; + setEids(postBody, validBidRequests); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, (bid, i) => { + window.nmmRefreshCounts[bid.adUnitCode] = window.nmmRefreshCounts[bid.adUnitCode] || 0; + const id = getPlacementId(bid); + const { + cur, + mediaTypes + } = getCurrency(bid); + if (i === 0) postBody.cur = cur; + postBody.imp.push(getImp(bid, id, mediaTypes)); + postBody.ext.next_mil_imps.push(getExtNextMilImp(bid)); + }); + this.getUrlPixelMetric(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_REQUESTED, validBidRequests); + requests.push({ + method: 'POST', + url: isTest ? TEST_ENDPOINT : ENDPOINT, + data: JSON.stringify(postBody), + options: { + contentType: 'text/plain', + withCredentials: true + } + }); + return requests; + }, + interpretResponse: function (serverResponse) { + const response = serverResponse.body; + const bidResponses = []; + const bids = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(response.seatbid, resp => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(resp.bid, bid => { + const requestId = bid.impid; + const { + ad, + adUrl, + vastUrl, + vastXml + } = (0,_libraries_targetVideoUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAd)(bid); + const bidResponse = { + requestId, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.adid, + currency: response.cur || DEFAULT_CURRENCY, + netRevenue: true, + ttl: TIME_TO_LIVE, + meta: { + advertiserDomains: bid.adomain || [] + } + }; + if (vastUrl || vastXml) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + if (vastUrl) bidResponse.vastUrl = vastUrl; + if (vastXml) bidResponse.vastXml = vastXml; + } else { + bidResponse.ad = ad; + bidResponse.adUrl = adUrl; + } + ; + bidResponses.push(bidResponse); + }); + bids.push(resp.bid); + }); + this.getUrlPixelMetric(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_RESPONSE, bids.flat()); + return bidResponses; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) return []; + const pixels = []; + const getSetPixelFunc = type => url => { + pixels.push({ + type, + url: replaceUsersyncMacros(url, gdprConsent, uspConsent, gppConsent, type) + }); + }; + const getSetPixelsFunc = type => response => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(response, `body.ext.sync.${type}`, []).forEach(getSetPixelFunc(type)); + }; + const setPixel = (type, url) => { + getSetPixelFunc(type)(url); + }; + const setPixelImages = getSetPixelsFunc('image'); + const setPixelIframes = getSetPixelsFunc('iframe'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(responses)) { + responses.forEach(response => { + if (syncOptions.pixelEnabled) setPixelImages(response); + if (syncOptions.iframeEnabled) setPixelIframes(response); + }); + } + if (!pixels.length) { + if (syncOptions.pixelEnabled) setPixel('image', SYNC_ENDPOINT); + if (syncOptions.iframeEnabled) setPixel('iframe', SYNC_ENDPOINT); + } + return pixels; + }, + getUrlPixelMetric(eventName, bid) { + const disabledSending = !!_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getBidderConfig()?.nextMillennium?.disabledSendingStatisticData; + if (disabledSending) return; + const url = this._getUrlPixelMetric(eventName, bid); + if (!url) return; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(url); + }, + _getUrlPixelMetric(eventName, bids) { + if (!Array.isArray(bids)) bids = [bids]; + const bidder = bids[0]?.bidder || bids[0]?.bidderCode; + if (bidder != BIDDER_CODE) return; + let params = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(bids, bid => { + if (bid.params) { + params.push(bid.params); + } else { + if (Array.isArray(bid.bids)) params.push(bid.bids.map(bidI => bidI.params)); + } + ; + }); + if (!params.length) return; + const placementIdsArray = []; + const groupIdsArray = []; + params.flat().forEach(paramsI => { + if (paramsI.group_id) { + groupIdsArray.push(paramsI.group_id); + } else { + if (paramsI.placement_id) placementIdsArray.push(paramsI.placement_id); + } + ; + }); + const placementIds = placementIdsArray.length && `&placements=${placementIdsArray.join(';')}` || ''; + const groupIds = groupIdsArray.length && `&groups=${groupIdsArray.join(';')}` || ''; + if (!(groupIds || placementIds)) return; + const url = `${REPORT_ENDPOINT}?event=${eventName}&bidder=${bidder}&source=pbjs${groupIds}${placementIds}`; + return url; + }, + onTimeout(bids) { + for (const bid of bids) { + this.getUrlPixelMetric(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT, bid); + } + ; + } +}; +function getExtNextMilImp(bid) { + if (typeof window?.nmmRefreshCounts[bid.adUnitCode] === 'number') ++window.nmmRefreshCounts[bid.adUnitCode]; + const nextMilImp = { + impId: bid.bidId, + nextMillennium: { + nm_version: NM_VERSION, + pbjs_version: PBJS_VERSION, + refresh_count: window?.nmmRefreshCounts[bid.adUnitCode] || 0, + scrollTop: window.pageYOffset || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().document.documentElement.scrollTop + } + }; + return nextMilImp; +} +function getImp(bid, id, mediaTypes) { + const { + banner, + video + } = mediaTypes; + const imp = { + id: bid.bidId, + ext: { + prebid: { + storedrequest: { + id + } + } + } + }; + const gpid = bid?.ortb2Imp?.ext?.gpid; + const pbadslot = bid?.ortb2Imp?.ext?.data?.pbadslot; + if (gpid) imp.ext.gpid = gpid; + if (pbadslot) imp.ext.data = { + pbadslot + }; + getImpBanner(imp, banner); + getImpVideo(imp, video); + return imp; +} +; +function getImpBanner(imp, banner) { + if (!banner) return; + if (banner.bidfloorcur) imp.bidfloorcur = banner.bidfloorcur; + if (banner.bidfloor) imp.bidfloor = banner.bidfloor; + const format = (banner.data?.sizes || []).map(s => { + return { + w: s[0], + h: s[1] + }; + }); + const { + w, + h + } = format[0] || {}; + imp.banner = { + w, + h, + format + }; + setImpPos(imp.banner, banner?.pos); +} +; +function getImpVideo(imp, video) { + if (!video) return; + if (video.bidfloorcur) imp.bidfloorcur = video.bidfloorcur; + if (video.bidfloor) imp.bidfloor = video.bidfloor; + imp.video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDefinedParams)(video.data, VIDEO_PARAMS); + Object.keys(VIDEO_PARAMS_DEFAULT).filter(videoParamName => VIDEO_PARAMS_DEFAULT[videoParamName]).forEach(videoParamName => { + if (typeof imp.video[videoParamName] === 'undefined') imp.video[videoParamName] = VIDEO_PARAMS_DEFAULT[videoParamName]; + }); + if (video.data.playerSize) { + imp.video = Object.assign(imp.video, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseGPTSingleSizeArrayToRtbSize)(video.data?.playerSize) || {}); + } else if (video.data.w && video.data.h) { + imp.video.w = video.data.w; + imp.video.h = video.data.h; + } + ; + setImpPos(imp.video, video?.pos); +} +; +function setImpPos(obj, pos) { + if (typeof pos === 'number' && pos >= 0 && pos <= 7) obj.pos = pos; +} +; +function setConsentStrings() { + let postBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + const gdprConsent = bidderRequest?.gdprConsent; + const uspConsent = bidderRequest?.uspConsent; + let gppConsent = bidderRequest?.gppConsent?.gppString && bidderRequest?.gppConsent; + if (!gppConsent && bidderRequest?.ortb2?.regs?.gpp) gppConsent = bidderRequest?.ortb2?.regs; + if (gdprConsent || uspConsent || gppConsent) { + postBody.regs = {}; + if (uspConsent) { + postBody.regs.us_privacy = uspConsent; + } + ; + if (gppConsent) { + postBody.regs.gpp = gppConsent?.gppString || gppConsent?.gpp; + postBody.regs.gpp_sid = bidderRequest.gppConsent?.applicableSections || gppConsent?.gpp_sid; + } + ; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies !== 'undefined') { + postBody.regs.gdpr = gdprConsent.gdprApplies ? 1 : 0; + } + ; + if (typeof gdprConsent.consentString !== 'undefined') { + postBody.user = { + consent: gdprConsent.consentString + }; + } + ; + } + ; + if (typeof bidderRequest?.ortb2?.regs?.coppa === 'number') { + postBody.regs.coppa = bidderRequest?.ortb2?.regs?.coppa; + } + ; + } + ; +} +; +function setOrtb2Parameters(postBody) { + let ortb2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + for (let parameter of ALLOWED_ORTB2_PARAMETERS) { + const value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ortb2, parameter); + if (value) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(postBody, parameter, value); + } + if (postBody.wlang) delete postBody.wlangb; +} +function setEids() { + let postBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let bids = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + let isFind = false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(bids, bid => { + if (isFind || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.userIdAsEids) || !bid.userIdAsEids.length) return; + if (bid.userIdAsEids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(postBody, 'user.eids', bid.userIdAsEids); + isFind = true; + } + ; + }); +} +function replaceUsersyncMacros(url) { + let gdprConsent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let uspConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + let gppConsent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + let type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; + const { + consentString = '', + gdprApplies = false + } = gdprConsent; + const gdpr = Number(gdprApplies); + url = url.replace('{{.GDPR}}', gdpr).replace('{{.GDPRConsent}}', consentString).replace('{{.USPrivacy}}', uspConsent).replace('{{.GPP}}', gppConsent.gppString || '').replace('{{.GPPSID}}', (gppConsent.applicableSections || []).join(',')).replace('{{.TYPE_PIXEL}}', type); + return url; +} +function getCurrency() { + let bid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const currency = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config?.getConfig('currency')?.adServerCurrency || DEFAULT_CURRENCY; + const cur = []; + const types = ['banner', 'video']; + const mediaTypes = {}; + for (const mediaType of types) { + const mediaTypeData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, `mediaTypes.${mediaType}`); + if (mediaTypeData) { + mediaTypes[mediaType] = { + data: mediaTypeData + }; + } else { + continue; + } + ; + if (typeof bid.getFloor === 'function') { + let floorInfo = bid.getFloor({ + currency, + mediaType, + size: '*' + }); + mediaTypes[mediaType].bidfloorcur = floorInfo?.currency; + mediaTypes[mediaType].bidfloor = floorInfo?.floor; + } else { + mediaTypes[mediaType].bidfloorcur = currency; + } + ; + if (cur.includes(mediaTypes[mediaType].bidfloorcur)) cur.push(mediaTypes[mediaType].bidfloorcur); + } + ; + if (!cur.length) cur.push(DEFAULT_CURRENCY); + return { + cur, + mediaTypes + }; +} +function getPlacementId(bid) { + const groupId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('group_id', bid.params); + const placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('placement_id', bid.params); + if (!groupId) return placementId; + let windowTop = getTopWindow(window); + let sizes = []; + if (bid.mediaTypes) { + if (bid.mediaTypes.banner) sizes = [...bid.mediaTypes.banner.sizes]; + if (bid.mediaTypes.video) sizes.push(bid.mediaTypes.video.playerSize); + } + ; + const host = windowTop && windowTop.location && windowTop.location.host || ''; + return `g${groupId};${sizes.map(size => size.join('x')).join('|')};${host}`; +} +function getTopWindow(curWindow) { + let nesting = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + if (nesting > 10) { + return curWindow; + } + ; + try { + if (curWindow.parent.document) { + return getTopWindow(curWindow.parent.window, ++nesting); + } + ; + } catch (err) { + return curWindow; + } + ; +} +function getSiteObj() { + const refInfo = _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_7__.getRefererInfo && (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_7__.getRefererInfo)() || {}; + let language = navigator.language; + let content; + if (language) { + // get ISO-639-1-alpha-2 (2 character language) + language = language.split('-')[0]; + content = { + language + }; + } + ; + return { + page: refInfo.page, + ref: refInfo.ref, + domain: refInfo.domain, + content + }; +} +function getDeviceObj() { + const { + width, + height + } = (0,_libraries_viewport_viewport_js__WEBPACK_IMPORTED_MODULE_8__.getViewportSize)(); + return { + w: width, + h: height, + ua: window.navigator.userAgent || undefined, + sua: getSua() + }; +} +function getSourceObj(validBidRequests, bidderRequest) { + const schain = validBidRequests?.[0]?.schain || bidderRequest?.ortb2?.source && (bidderRequest?.ortb2?.source?.schain || bidderRequest?.ortb2?.source?.ext?.schain); + if (!schain) return; + const source = { + schain + }; + return source; +} +function getSua() { + let { + brands, + mobile, + platform + } = window?.navigator?.userAgentData || {}; + if (!(brands && platform)) return undefined; + return { + brands, + mobile: Number(!!mobile), + platform: platform && { + brand: platform + } || undefined + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('nextMillenniumBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["targetVideoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nextMillenniumBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nextrollBidAdapter"],{ + +/***/ "./modules/nextrollBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/nextrollBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/advangUtils/index.js */ "./libraries/advangUtils/index.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ +const BIDDER_CODE = 'nextroll'; +const BIDDER_ENDPOINT = 'https://d.adroll.com/bid/prebid/'; +const ADAPTER_VERSION = 5; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {Object} bidRequest The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bidRequest) { + return bidRequest !== undefined && !!bidRequest.params && !!bidRequest.bidId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + // TODO: is 'page' the right value here? + let topLocation = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'refererInfo.page')); + return validBidRequests.map(bidRequest => { + return { + method: 'POST', + options: { + withCredentials: true + }, + url: BIDDER_ENDPOINT, + data: { + id: bidRequest.bidId, + imp: { + id: bidRequest.bidId, + bidfloor: _getFloor(bidRequest), + banner: _getBanner(bidRequest), + native: _getNative((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.native')), + ext: { + zone: { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('zoneId', bidRequest.params) + }, + nextroll: { + adapter_version: ADAPTER_VERSION + } + } + }, + site: _getSite(bidRequest, topLocation), + seller: _getSeller(bidRequest), + device: _getDevice(bidRequest), + regs: _getRegs(bidderRequest) + } + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse.body) { + return []; + } else { + let response = serverResponse.body; + let bids = response.seatbid.reduce((acc, seatbid) => acc.concat(seatbid.bid), []); + return bids.map(bid => _buildResponse(response, bid)); + } + } +}; +function _getBanner(bidRequest) { + let sizes = _getSizes(bidRequest); + if (sizes === undefined) return undefined; + return { + format: sizes + }; +} +function _getNative(mediaTypeNative) { + if (mediaTypeNative === undefined) return undefined; + let assets = _getNativeAssets(mediaTypeNative); + if (assets === undefined || assets.length == 0) return undefined; + return { + request: { + native: { + assets: assets + } + } + }; +} + +/* + id: Unique numeric id for the asset + kind: OpenRTB kind of asset. Supported: title, img and data. + key: Name of property that comes in the mediaType.native object. + type: OpenRTB type for that spefic kind of asset. + required: Overrides the asset required field configured, only overrides when is true. +*/ +const NATIVE_ASSET_MAP = [{ + id: 1, + kind: 'title', + key: 'title', + required: true +}, { + id: 2, + kind: 'img', + key: 'image', + type: 3, + required: true +}, { + id: 3, + kind: 'img', + key: 'icon', + type: 1 +}, { + id: 4, + kind: 'img', + key: 'logo', + type: 2 +}, { + id: 5, + kind: 'data', + key: 'sponsoredBy', + type: 1 +}, { + id: 6, + kind: 'data', + key: 'body', + type: 2 +}]; +const ASSET_KIND_MAP = { + title: _getTitleAsset, + img: _getImageAsset, + data: _getDataAsset +}; +function _getAsset(mediaTypeNative, assetMap) { + const asset = mediaTypeNative[assetMap.key]; + if (asset === undefined) return undefined; + const assetFunc = ASSET_KIND_MAP[assetMap.kind]; + return { + id: assetMap.id, + required: assetMap.required || !!asset.required ? 1 : 0, + [assetMap.kind]: assetFunc(asset, assetMap) + }; +} +function _getTitleAsset(title, _assetMap) { + return { + len: title.len || 0 + }; +} +function _getMinAspectRatio(aspectRatio, property) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(aspectRatio)) return 1; + const ratio = aspectRatio['ratio_' + property]; + const min = aspectRatio['min_' + property]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(ratio)) return ratio; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(min)) return min; + return 1; +} +function _getImageAsset(image, assetMap) { + const sizes = image.sizes; + const aspectRatio = image.aspect_ratios ? image.aspect_ratios[0] : undefined; + return { + type: assetMap.type, + w: sizes ? sizes[0] : undefined, + h: sizes ? sizes[1] : undefined, + wmin: _getMinAspectRatio(aspectRatio, 'width'), + hmin: _getMinAspectRatio(aspectRatio, 'height') + }; +} +function _getDataAsset(data, assetMap) { + return { + type: assetMap.type, + len: data.len || 0 + }; +} +function _getNativeAssets(mediaTypeNative) { + return NATIVE_ASSET_MAP.map(assetMap => _getAsset(mediaTypeNative, assetMap)).filter(asset => asset !== undefined); +} +function _getFloor(bidRequest) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bidRequest.getFloor)) { + return bidRequest.params.bidfloor ? bidRequest.params.bidfloor : null; + } + let floor = bidRequest.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +function _buildResponse(bidResponse, bid) { + let response = { + requestId: bidResponse.id, + cpm: bid.price, + width: bid.w, + height: bid.h, + creativeId: bid.crid, + dealId: bidResponse.dealId, + currency: 'USD', + netRevenue: true, + ttl: 300, + meta: { + advertiserDomains: bidResponse.adomain || [] + } + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(bid.adm)) { + response.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + response.ad = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bid.adm, bid.price); + } else { + response.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + response.native = _getNativeResponse(bid.adm, bid.price); + } + return response; +} +const privacyLink = 'https://app.adroll.com/optout/personalized'; +const privacyIcon = 'https://s.adroll.com/j/ad-choices-small.png'; +function _getNativeResponse(adm, price) { + let baseResponse = { + clickTrackers: adm.link && adm.link.clicktrackers || [], + jstracker: adm.jstracker || [], + clickUrl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(adm.link.url, price), + impressionTrackers: adm.imptrackers.map(impTracker => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(impTracker, price)), + privacyLink: privacyLink, + privacyIcon: privacyIcon + }; + return adm.assets.reduce((accResponse, asset) => { + const assetMaps = NATIVE_ASSET_MAP.filter(assetMap => assetMap.id === asset.id && asset[assetMap.kind] !== undefined); + if (assetMaps.length === 0) return accResponse; + const assetMap = assetMaps[0]; + accResponse[assetMap.key] = _getAssetResponse(asset, assetMap); + return accResponse; + }, baseResponse); +} +function _getAssetResponse(asset, assetMap) { + switch (assetMap.kind) { + case 'title': + return asset.title.text; + case 'img': + return { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + case 'data': + return asset.data.value; + } +} +function _getSite(bidRequest, topLocation) { + return { + page: topLocation.href, + domain: topLocation.hostname, + publisher: { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('publisherId', bidRequest.params) + } + }; +} +function _getSeller(bidRequest) { + return { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('sellerId', bidRequest.params) + }; +} +function _getSizes(bidRequest) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidRequest.sizes)) { + return undefined; + } + return bidRequest.sizes.filter(_isValidSize).map(size => { + return { + w: size[0], + h: size[1] + }; + }); +} +function _isValidSize(size) { + const isNumber = x => typeof x === 'number'; + return size.length === 2 && isNumber(size[0]) && isNumber(size[1]); +} +function _getDevice(_bidRequest) { + return { + ua: navigator.userAgent, + language: navigator['language'], + os: _getOs(navigator.userAgent.toLowerCase()), + osv: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_4__.getOsVersion)() + }; +} +function _getRegs(bidderRequest) { + if (!bidderRequest || !bidderRequest.uspConsent) { + return undefined; + } + return { + ext: { + us_privacy: bidderRequest.uspConsent + } + }; +} +function _getOs(userAgent) { + const osTable = { + 'android': /android/i, + 'ios': /iphone|ipad/i, + 'mac': /mac/i, + 'linux': /linux/i, + 'windows': /windows/i + }; + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(Object.keys(osTable), os => { + if (userAgent.match(osTable[os])) { + return os; + } + }) || 'etc'; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('nextrollBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["advangUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nextrollBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nexverseBidAdapter"],{ + +/***/ "./modules/nexverseBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/nexverseBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_connectionInfo_connectionUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/connectionInfo/connectionUtils.js */ "./libraries/connectionInfo/connectionUtils.js"); +/* harmony import */ var _libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/userAgentUtils/index.js */ "./libraries/userAgentUtils/index.js"); +/* harmony import */ var _libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/nexverseUtils/index.js */ "./libraries/nexverseUtils/index.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); +/* harmony import */ var _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/advangUtils/index.js */ "./libraries/advangUtils/index.js"); + + + + + + + + + + + +const BIDDER_CODE = 'nexverse'; +const BIDDER_ENDPOINT = 'https://rtb.nexverse.ai'; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const DEFAULT_CURRENCY = 'USD'; +const BID_TTL = 300; +const DEFAULT_LANG = 'en'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_UID, + moduleName: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: _libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.isBidRequestValid, + /** + * Builds the OpenRTB server request from the list of valid bid requests. + * + * @param {Array} validBidRequests - Array of valid bid requests. + * @param {Object} bidderRequest - The bidder request object containing additional data. + * @returns {Array} Array of server requests to be sent to the endpoint. + */ + buildRequests(validBidRequests, bidderRequest) { + const requests = validBidRequests.map(bid => { + // Build the endpoint URL with query parameters + const endpointUrl = (0,_libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.buildEndpointUrl)(BIDDER_ENDPOINT, bid); + + // Build the OpenRTB payload + const payload = buildOpenRtbRequest(bid, bidderRequest); + if (!payload) { + (0,_libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.printLog)('error', 'Payload could not be built.'); + return null; // Skip this bid + } + + // Return the server request + return { + method: 'POST', + url: endpointUrl, + data: JSON.stringify(payload), + bidRequest: bid + }; + }); + return requests.filter(request => request !== null); // Remove null entries + }, + /** + * Interprets the server's response and extracts bid information. + * + * @param {Object} serverResponse - The response from the server. + * @param {Object} request - The original server request. + * @returns {Array} Array of bids to be passed to the auction. + */ + interpretResponse(serverResponse, request) { + if (serverResponse && serverResponse.status === 204) { + (0,_libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.printLog)('info', 'No ad available (204 response).'); + return []; + } + const bidResponses = []; + const response = serverResponse.body; + if (!response || !response.seatbid || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(response.seatbid)) { + (0,_libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.printLog)('warning', 'No valid bids in the response.'); + return bidResponses; + } + response.seatbid.forEach(seatbid => { + seatbid.bid.forEach(bid => { + const bidResponse = { + requestId: bid.impid, + cpm: bid.price, + currency: response.cur || DEFAULT_CURRENCY, + width: bid.width || 0, + height: bid.height || 0, + creativeId: bid.crid || bid.id, + ttl: BID_TTL, + netRevenue: true, + meta: {} + }; + // Determine media type and assign the ad content + if (bid.ext && bid.ext.mediaType) { + bidResponse.mediaType = bid.ext.mediaType; + } else if (bid.adm && bid.adm.indexOf(' ({ + w: size[0], + h: size[1] + })), + // List of size objects + w: bid.sizes[0][0], + h: bid.sizes[0][1] + }, + secure: window.location.protocol === 'https:' ? 1 : 0 // Indicates whether the request is secure (HTTPS) + }); + } + if (bid.mediaTypes.video) { + imp.push({ + id: bid.bidId, + video: { + w: bid.sizes[0][0], + h: bid.sizes[0][1], + mimes: bid.mediaTypes.video.mimes || ['video/mp4'], + // Default to video/mp4 if not specified + protocols: bid.mediaTypes.video.protocols || [2, 3, 5, 6], + // RTB video ad serving protocols + maxduration: bid.mediaTypes.video.maxduration || 30, + linearity: bid.mediaTypes.video.linearity || 1, + playbackmethod: bid.mediaTypes.video.playbackmethod || [2] + }, + secure: window.location.protocol === 'https:' ? 1 : 0 // Indicates whether the request is secure (HTTPS) + }); + } + if (bid.mediaTypes.native) { + imp.push({ + id: bid.bidId, + native: { + request: JSON.stringify(bid.mediaTypes.native) // Convert native request to JSON string + }, + secure: window.location.protocol === 'https:' ? 1 : 0 // Indicates whether the request is secure (HTTPS) + }); + } + + // Construct the OpenRTB request object + const openRtbRequest = { + id: bidderRequest.auctionId, + imp: imp, + site: { + page: bidderRequest.refererInfo.page, + domain: bidderRequest.refererInfo.domain, + ref: bidderRequest.refererInfo.ref || '' // Referrer URL + }, + device: { + ua: navigator.userAgent, + devicetype: (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_6__.getDeviceType)(), + // 1 = Mobile/Tablet, 2 = Desktop + os: (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_6__.getOS)(), + osv: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_7__.getOsVersion)(), + make: navigator.vendor || '', + model: (0,_libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.getDeviceModel)(), + connectiontype: (0,_libraries_connectionInfo_connectionUtils_js__WEBPACK_IMPORTED_MODULE_8__.getConnectionType)(), + // Include connection type + geo: { + lat: bid.params.geoLat || 0, + lon: bid.params.geoLon || 0 + }, + language: navigator.language || DEFAULT_LANG, + dnt: navigator.doNotTrack === '1' ? 1 : 0 // Do Not Track flag + }, + user: { + id: (0,_libraries_nexverseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.getUid)(storage), + buyeruid: bidderRequest.userId || '', + // User ID or Buyer ID + ext: { + consent: bidderRequest.gdprConsent ? bidderRequest.gdprConsent.consentString : null // GDPR consent string + } + }, + regs: { + ext: { + gdpr: bidderRequest.gdprConsent ? bidderRequest.gdprConsent.gdprApplies ? 1 : 0 : 0 + } + }, + ext: { + prebid: { + auctiontimestamp: bidderRequest.auctionStart + } + } + }; + + // Add app object if the request comes from a mobile app + if (bidderRequest.app) { + openRtbRequest.app = { + id: bidderRequest.app.id, + name: bidderRequest.app.name, + bundle: bidderRequest.app.bundle, + domain: bidderRequest.app.domain, + storeurl: bidderRequest.app.storeUrl, + cat: bidderRequest.app.cat || [] + }; + } + // Add additional fields related to GDPR, US Privacy, CCPA + if (bidderRequest.uspConsent) { + openRtbRequest.regs.ext.us_privacy = bidderRequest.uspConsent; + } + return openRtbRequest; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('nexverseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","advangUtils","userAgentUtils","connectionInfo","nexverseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nexverseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nexx360BidAdapter"],{ + +/***/ "./modules/nexx360BidAdapter.js": +/*!**************************************!*\ + !*** ./modules/nexx360BidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports STORAGE, getNexx360LocalStorage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/nexx360Utils/index.js */ "./libraries/nexx360Utils/index.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'nexx360'; +const REQUEST_URL = 'https://fast.nexx360.io/booster'; +const PAGE_VIEW_ID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); +const BIDDER_VERSION = '6.0'; +const GVLID = 965; +const NEXXID_KEY = 'nexx360_storage'; +const ALIASES = [{ + code: 'revenuemaker' +}, { + code: 'first-id', + gvlid: 1178 +}, { + code: 'adwebone' +}, { + code: 'league-m', + gvlid: 965 +}, { + code: 'prjads' +}, { + code: 'pubtech' +}, { + code: '1accord', + gvlid: 965 +}, { + code: 'easybid', + gvlid: 1068 +}, { + code: 'prismassp', + gvlid: 965 +}, { + code: 'spm', + gvlid: 965 +}, { + code: 'bidstailamedia', + gvlid: 965 +}, { + code: 'scoremedia', + gvlid: 965 +}]; +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); + +/** + * Get the NexxId + * @param + * @return {object | false } false if localstorageNotEnabled + */ + +function getNexx360LocalStorage() { + if (!STORAGE.localStorageIsEnabled()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`localstorage not enabled for Nexx360`); + return false; + } + const output = STORAGE.getDataFromLocalStorage(NEXXID_KEY); + if (output === null) { + const nexx360Storage = { + nexx360Id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)() + }; + STORAGE.setDataInLocalStorage(NEXXID_KEY, JSON.stringify(nexx360Storage)); + return nexx360Storage; + } + try { + return JSON.parse(output); + } catch (e) { + return false; + } +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + // or false if your adapter should set bidResponse.netRevenue = false + ttl: 90 // default bidResponse.ttl (when not specified in ORTB response.seatbid[].bid[].exp) + }, + imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + imp = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.enrichImp)(imp, bidRequest); + const divId = bidRequest.params.divId || bidRequest.adUnitCode; + const slotEl = document.getElementById(divId); + if (slotEl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.dimensions.slotW', slotEl.offsetWidth); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.dimensions.slotH', slotEl.offsetHeight); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.dimensions.cssMaxW', slotEl.style?.maxWidth); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.dimensions.cssMaxH', slotEl.style?.maxHeight); + } + if (bidRequest.params.tagId) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.nexx360.tagId', bidRequest.params.tagId); + if (bidRequest.params.placement) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.nexx360.placement', bidRequest.params.placement); + if (bidRequest.params.videoTagId) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.nexx360.videoTagId', bidRequest.params.videoTagId); + if (bidRequest.params.adUnitPath) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.adUnitPath', bidRequest.params.adUnitPath); + if (bidRequest.params.adUnitName) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.adUnitName', bidRequest.params.adUnitName); + if (bidRequest.params.allBids) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(imp, 'ext.nexx360.allBids', bidRequest.params.allBids); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + let request = buildRequest(imps, bidderRequest, context); + const amxId = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.getAmxId)(STORAGE, BIDDER_CODE); + request = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.enrichRequest)(request, amxId, bidderRequest, PAGE_VIEW_ID, BIDDER_VERSION); + return request; + } +}); + +/** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ +function isBidRequestValid(bid) { + if (bid.params.adUnitName && (typeof bid.params.adUnitName !== 'string' || bid.params.adUnitName === '')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('bid.params.adUnitName needs to be a string'); + return false; + } + if (bid.params.adUnitPath && (typeof bid.params.adUnitPath !== 'string' || bid.params.adUnitPath === '')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('bid.params.adUnitPath needs to be a string'); + return false; + } + if (bid.params.divId && (typeof bid.params.divId !== 'string' || bid.params.divId === '')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('bid.params.divId needs to be a string'); + return false; + } + if (bid.params.allBids && typeof bid.params.allBids !== 'boolean') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('bid.params.allBids needs to be a boolean'); + return false; + } + if (!bid.params.tagId && !bid.params.videoTagId && !bid.params.nativeTagId && !bid.params.placement) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('bid.params.tagId or bid.params.videoTagId or bid.params.nativeTagId or bid.params.placement must be defined'); + return false; + } + return true; +} +; + +/** + * Make a server request from the list of BidRequests. + * + * @return ServerRequest Info describing the request to the server. + */ + +function buildRequests(bidRequests, bidderRequest) { + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: REQUEST_URL, + data + }; +} + +/** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + +function interpretResponse(serverResponse) { + const respBody = serverResponse.body; + if (!respBody || !Array.isArray(respBody.seatbid)) { + return []; + } + const { + bidderSettings + } = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)(); + const allowAlternateBidderCodes = bidderSettings && bidderSettings.standard ? bidderSettings.standard.allowAlternateBidderCodes : false; + const responses = []; + for (let i = 0; i < respBody.seatbid.length; i++) { + const seatbid = respBody.seatbid[i]; + for (let j = 0; j < seatbid.bid.length; j++) { + const bid = seatbid.bid[j]; + const response = (0,_libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.createResponse)(bid, respBody); + if (allowAlternateBidderCodes) response.bidderCode = `n360_${bid.ext.ssp}`; + responses.push(response); + } + } + return responses; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: ALIASES, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.NATIVE], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs: _libraries_nexx360Utils_index_js__WEBPACK_IMPORTED_MODULE_3__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('nexx360BidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","ortb2Utils","nexx360Utils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nexx360BidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nobidAnalyticsAdapter"],{ + +/***/ "./modules/nobidAnalyticsAdapter.js": +/*!******************************************!*\ + !*** ./modules/nobidAnalyticsAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + +const VERSION = '2.0.2'; +const MODULE_NAME = 'nobidAnalyticsAdapter'; +const ANALYTICS_OPT_FLUSH_TIMEOUT_SECONDS = 5 * 1000; +const RETENTION_SECONDS = 1 * 24 * 3600; +const TEST_ALLOCATION_PERCENTAGE = 5; // dont block 5% of the time; +window.nobidAnalyticsVersion = VERSION; +const analyticsType = 'endpoint'; +const url = 'localhost:8383/event'; +const GVLID = 816; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + gvlid: GVLID, + moduleName: MODULE_NAME, + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS +}); +const { + AUCTION_INIT, + BID_REQUESTED, + BID_TIMEOUT, + BID_RESPONSE, + BID_WON, + AUCTION_END, + AD_RENDER_SUCCEEDED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS; +function log(msg) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logMessage)(`%cNoBid Analytics ${VERSION}: ${msg}`); +} +function isJson(str) { + return str && str.startsWith('{') && str.endsWith('}'); +} +function isExpired(data, retentionSeconds) { + retentionSeconds = retentionSeconds || RETENTION_SECONDS; + if (data.ts + retentionSeconds * 1000 < Date.now()) return true; + return false; +} +function sendEvent(event, eventType) { + function resolveEndpoint() { + var ret = 'https://carbon-nv.servenobids.com/admin/status'; + var env = typeof _src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getParameterByName === 'function' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getParameterByName)('nobid-env'); + env = window.location.href.indexOf('nobid-env=dev') > 0 ? 'dev' : env; + if (!env) ret = 'https://carbon-nv.servenobids.com';else if (env == 'dev') ret = 'https://localhost:8383'; + return ret; + } + if (!nobidAnalytics.initOptions || !nobidAnalytics.initOptions.siteId || !event) return; + if (nobidAnalytics.isAnalyticsDisabled(eventType)) { + log('NoBid Analytics is Disabled'); + return; + } + try { + event.version = VERSION; + event.pbver = "9.45.0-pre"; + const endpoint = `${resolveEndpoint()}/event/${eventType}?pubid=${nobidAnalytics.initOptions.siteId}`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(endpoint, function (response) { + try { + nobidAnalytics.processServerResponse(response); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(e); + } + }, JSON.stringify(event), { + contentType: 'application/json', + method: 'POST' + }); + } catch (err) { + log(`Sending event error ${err}`); + } +} +function cleanupObjectAttributes(obj, attributes) { + if (!obj) return; + if (Array.isArray(obj)) { + obj.forEach(item => { + Object.keys(item).forEach(attr => { + if (!attributes.includes(attr)) delete item[attr]; + }); + }); + } else Object.keys(obj).forEach(attr => { + if (!attributes.includes(attr)) delete obj[attr]; + }); +} +function sendBidWonEvent(event, eventType) { + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(event); + cleanupObjectAttributes(data, ['bidderCode', 'size', 'statusMessage', 'adId', 'requestId', 'mediaType', 'adUnitCode', 'cpm', 'currency', 'originalCpm', 'originalCurrency', 'timeToRespond']); + if (nobidAnalytics.topLocation) data.topLocation = nobidAnalytics.topLocation; + sendEvent(data, eventType); +} +function sendAuctionEndEvent(event, eventType) { + if (event?.bidderRequests?.length > 0 && event?.bidderRequests[0]?.refererInfo?.topmostLocation) { + nobidAnalytics.topLocation = event.bidderRequests[0].refererInfo.topmostLocation; + } + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(event); + cleanupObjectAttributes(data, ['timestamp', 'timeout', 'auctionId', 'bidderRequests', 'bidsReceived']); + if (data) cleanupObjectAttributes(data.bidderRequests, ['bidderCode', 'bidderRequestId', 'bids', 'refererInfo']); + if (data) cleanupObjectAttributes(data.bidsReceived, ['bidderCode', 'width', 'height', 'adUnitCode', 'statusMessage', 'requestId', 'mediaType', 'cpm', 'currency', 'originalCpm', 'originalCurrency']); + if (data) cleanupObjectAttributes(data.noBids, ['bidder', 'sizes', 'bidId']); + if (data.bidderRequests) { + data.bidderRequests.forEach(bidderRequest => { + cleanupObjectAttributes(bidderRequest.bids, ['mediaTypes', 'adUnitCode', 'sizes', 'bidId']); + }); + } + if (data.bidderRequests) { + data.bidderRequests.forEach(bidderRequest => { + cleanupObjectAttributes(bidderRequest.refererInfo, ['topmostLocation']); + }); + } + sendEvent(data, eventType); +} +function auctionInit(event) { + if (event?.bidderRequests?.length > 0 && event?.bidderRequests[0]?.refererInfo?.topmostLocation) { + nobidAnalytics.topLocation = event.bidderRequests[0].refererInfo.topmostLocation; + } +} +let nobidAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + url, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_INIT: + auctionInit(args); + break; + case BID_REQUESTED: + break; + case BID_RESPONSE: + break; + case BID_WON: + sendBidWonEvent(args, eventType); + break; + case BID_TIMEOUT: + break; + case AUCTION_END: + sendAuctionEndEvent(args, eventType); + break; + case AD_RENDER_SUCCEEDED: + break; + default: + break; + } + } +}); +nobidAnalytics = { + ...nobidAnalytics, + originEnableAnalytics: nobidAnalytics.enableAnalytics, + // save the base class function + enableAnalytics: function (config) { + // override enableAnalytics so we can get access to the config passed in from the page + if (!config.options.siteId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('NoBid Analytics - siteId parameter is not defined. Analytics won\'t work'); + return; + } + this.initOptions = config.options; + this.originEnableAnalytics(config); // call the base class function + }, + retentionSeconds: RETENTION_SECONDS, + isExpired(data) { + return isExpired(data, this.retentionSeconds); + }, + isAnalyticsDisabled(eventType) { + let stored = storage.getDataFromLocalStorage(this.ANALYTICS_DATA_NAME); + if (!isJson(stored)) return false; + stored = JSON.parse(stored); + if (this.isExpired(stored)) return false; + if (stored.disabled === 1) return true;else if (stored.disabled === 0) return false; + if (eventType) { + if (stored[`disabled_${eventType}`] === 1) return true;else if (stored[`disabled_${eventType}`] === 0) return false; + } + return false; + }, + processServerResponse(response) { + if (!isJson(response)) return; + const resp = JSON.parse(response); + storage.setDataInLocalStorage(this.ANALYTICS_DATA_NAME, JSON.stringify({ + ...resp, + ts: Date.now() + })); + }, + ANALYTICS_DATA_NAME: 'analytics.nobid.io', + ANALYTICS_OPT_NAME: 'analytics.nobid.io.optData' +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: nobidAnalytics, + code: 'nobid', + gvlid: GVLID +}); +nobidAnalytics.originalAdUnits = {}; +window.nobidCarbonizer = { + getStoredLocalData: function () { + const a = storage.getDataFromLocalStorage(nobidAnalytics.ANALYTICS_DATA_NAME); + const b = storage.getDataFromLocalStorage(nobidAnalytics.ANALYTICS_OPT_NAME); + const ret = {}; + if (a) ret[nobidAnalytics.ANALYTICS_DATA_NAME] = a; + if (b) ret[nobidAnalytics.ANALYTICS_OPT_NAME] = b; + return ret; + }, + isActive: function () { + let stored = storage.getDataFromLocalStorage(nobidAnalytics.ANALYTICS_DATA_NAME); + if (!isJson(stored)) return false; + stored = JSON.parse(stored); + if (isExpired(stored, nobidAnalytics.retentionSeconds)) return false; + return stored.carbonizer_active || false; + }, + carbonizeAdunits: function (adunits, skipTestGroup) { + function processBlockedBidders(blockedBidders) { + function sendOptimizerData() { + let optData = storage.getDataFromLocalStorage(nobidAnalytics.ANALYTICS_OPT_NAME); + storage.removeDataFromLocalStorage(nobidAnalytics.ANALYTICS_OPT_NAME); + if (isJson(optData)) { + optData = JSON.parse(optData); + if (Object.getOwnPropertyNames(optData).length > 0) { + const event = { + o_bidders: optData + }; + if (nobidAnalytics.topLocation) event.topLocation = nobidAnalytics.topLocation; + sendEvent(event, 'optData'); + } + } + } + if (blockedBidders && blockedBidders.length > 0) { + let optData = storage.getDataFromLocalStorage(nobidAnalytics.ANALYTICS_OPT_NAME); + optData = isJson(optData) ? JSON.parse(optData) : {}; + const bidders = blockedBidders.map(rec => rec.bidder); + if (bidders && bidders.length > 0) { + bidders.forEach(bidder => { + if (!optData[bidder]) optData[bidder] = 1;else optData[bidder] += 1; + }); + storage.setDataInLocalStorage(nobidAnalytics.ANALYTICS_OPT_NAME, JSON.stringify(optData)); + if (window.nobidAnalyticsOptTimer) return; + window.nobidAnalyticsOptTimer = setInterval(sendOptimizerData, ANALYTICS_OPT_FLUSH_TIMEOUT_SECONDS); + } + } + } + function carbonizeAdunit(adunit) { + let stored = storage.getDataFromLocalStorage(nobidAnalytics.ANALYTICS_DATA_NAME); + if (!isJson(stored)) return; + stored = JSON.parse(stored); + if (isExpired(stored, nobidAnalytics.retentionSeconds)) return; + const carbonizerBidders = stored.bidders || []; + let originalAdUnit = null; + if (nobidAnalytics.originalAdUnits && nobidAnalytics.originalAdUnits[adunit.code]) originalAdUnit = nobidAnalytics.originalAdUnits[adunit.code]; + const allowedBidders = originalAdUnit.bids.filter(rec => carbonizerBidders.includes(rec.bidder)); + const blockedBidders = originalAdUnit.bids.filter(rec => !carbonizerBidders.includes(rec.bidder)); + processBlockedBidders(blockedBidders); + adunit.bids = allowedBidders; + } + for (const adunit of adunits) { + if (!nobidAnalytics.originalAdUnits[adunit.code]) nobidAnalytics.originalAdUnits[adunit.code] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(adunit); + } + ; + if (this.isActive()) { + // 5% of the time do not block; + if (!skipTestGroup && Math.floor(Math.random() * 101) <= TEST_ALLOCATION_PERCENTAGE) return; + for (const adunit of adunits) { + carbonizeAdunit(adunit); + } + ; + } + } +}; +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (nobidAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('nobidAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nobidAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nobidBidAdapter"],{ + +/***/ "./modules/nobidBidAdapter.js": +/*!************************************!*\ + !*** ./modules/nobidBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const GVLID = 816; +const BIDDER_CODE = 'nobid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +window.nobidVersion = '1.3.4'; +window.nobid = window.nobid || {}; +window.nobid.bidResponses = window.nobid.bidResponses || {}; +window.nobid.timeoutTotal = 0; +window.nobid.bidWonTotal = 0; +window.nobid.refreshCount = 0; +function log(msg, obj) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('-NoBid- ' + msg, obj); +} +function nobidSetCookie(cname, cvalue, hours) { + var d = new Date(); + d.setTime(d.getTime() + hours * 60 * 60 * 1000); + var expires = 'expires=' + d.toUTCString(); + storage.setCookie(cname, cvalue, expires); +} +function nobidGetCookie(cname) { + return storage.getCookie(cname); +} +function nobidBuildRequests(bids, bidderRequest) { + var serializeState = function (divIds, siteId, adunits) { + var filterAdUnitsByIds = function (divIds, adUnits) { + var filtered = []; + if (!divIds.length) { + filtered = adUnits; + } else if (adUnits) { + var a = []; + if (!(divIds instanceof Array)) a.push(divIds);else a = divIds; + for (var i = 0, l = adUnits.length; i < l; i++) { + var adUnit = adUnits[i]; + if (adUnit && adUnit.d && a.indexOf(adUnit.d) > -1) { + filtered.push(adUnit); + } + } + } + return filtered; + }; + var gdprConsent = function (bidderRequest) { + var gdprConsent = {}; + if (bidderRequest && bidderRequest.gdprConsent) { + gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + // will check if the gdprApplies field was populated with a boolean value (ie from page config). If it's undefined, then default to true + consentRequired: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : false + }; + } + return gdprConsent; + }; + var uspConsent = function (bidderRequest) { + var uspConsent = ''; + if (bidderRequest && bidderRequest.uspConsent) { + uspConsent = bidderRequest.uspConsent; + } + return uspConsent; + }; + var gppConsent = function (bidderRequest) { + let gppConsent = null; + if (bidderRequest?.gppConsent?.gppString && bidderRequest?.gppConsent?.applicableSections) { + gppConsent = {}; + gppConsent.gpp = bidderRequest.gppConsent.gppString; + gppConsent.gpp_sid = Array.isArray(bidderRequest.gppConsent.applicableSections) ? bidderRequest.gppConsent.applicableSections : []; + } else if (bidderRequest?.ortb2?.regs?.gpp && bidderRequest?.ortb2.regs?.gpp_sid) { + gppConsent = {}; + gppConsent.gpp = bidderRequest.ortb2.regs.gpp; + gppConsent.gpp_sid = Array.isArray(bidderRequest.ortb2.regs.gpp_sid) ? bidderRequest.ortb2.regs.gpp_sid : []; + } + return gppConsent; + }; + var schain = function (bids) { + if (bids && bids.length > 0) { + return bids[0].schain; + } + return null; + }; + var coppa = function () { + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + return { + 'coppa': true + }; + } + if (bids && bids.length > 0) { + return bids[0].coppa; + } + return null; + }; + var topLocation = function (bidderRequest) { + var ret = ''; + if (bidderRequest?.refererInfo?.page) { + ret = bidderRequest.refererInfo.page; + } else { + // TODO: does this fallback make sense here? + ret = window.context && window.context.location && window.context.location.href ? window.context.location.href : document.location.href; + } + return encodeURIComponent(ret.replace(/\%/g, '')); + }; + var timestamp = function () { + var date = new Date(); + var zp = function (val) { + return val <= 9 ? '0' + val : '' + val; + }; + var d = date.getDate(); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + var h = date.getHours(); + var min = date.getMinutes(); + var s = date.getSeconds(); + return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s); + }; + var clientDim = function () { + try { + const winDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)(); + var width = Math.max(winDimensions.document.documentElement.clientWidth, winDimensions.innerWidth || 0); + var height = Math.max(winDimensions.document.documentElement.clientHeight, winDimensions.innerHeight || 0); + return `${width}x${height}`; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Could not parse screen dimensions, error details:', e); + } + }; + var getEIDs = function (eids) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(eids) && eids.length > 0) { + let src = []; + eids.forEach(eid => { + let ids = []; + if (eid.uids) { + eid.uids.forEach(value => { + ids.push({ + 'id': value.id + '' + }); + }); + } + if (eid.source && ids.length > 0) { + src.push({ + source: eid.source, + uids: ids + }); + } + }); + return src; + } + }; + var state = {}; + state['sid'] = siteId; + state['l'] = topLocation(bidderRequest); + state['tt'] = encodeURIComponent(document.title); + state['tt'] = state['tt'].replace(/'|;|quot;|39;|&|&|#|\r\n|\r|\n|\t|\f|\%0A|\"|\%22|\%5C|\%23|\%26|\%26|\%09/gm, ''); + state['a'] = filterAdUnitsByIds(divIds, adunits || []); + state['t'] = timestamp(); + state['tz'] = Math.round(new Date().getTimezoneOffset()); + state['r'] = clientDim(); + state['lang'] = navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage; + state['ref'] = document.referrer; + state['gdpr'] = gdprConsent(bidderRequest); + state['usp'] = uspConsent(bidderRequest); + state['pjbdr'] = bidderRequest && bidderRequest.bidderCode ? bidderRequest.bidderCode : 'nobid'; + state['pbver'] = "9.45.0-pre"; + const sch = schain(bids); + if (sch) state['schain'] = sch; + const cop = coppa(); + if (cop) state['coppa'] = cop; + const eids = getEIDs((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bids, '0.userIdAsEids')); + if (eids && eids.length > 0) state['eids'] = eids; + const gpp = gppConsent(bidderRequest); + if (gpp?.gpp) state['gpp'] = gpp.gpp; + if (gpp?.gpp_sid) state['gpp_sid'] = gpp.gpp_sid; + if (bidderRequest && bidderRequest.ortb2) state['ortb2'] = bidderRequest.ortb2; + return state; + }; + function newAdunit(adunitObject, adunits) { + var getAdUnit = function (divid, adunits) { + for (var i = 0; i < adunits.length; i++) { + if (adunits[i].d === divid) { + return adunits[i]; + } + } + return false; + }; + var removeByAttrValue = function (array, attribute, value) { + for (var i = array.length - 1; i >= 0; i--) { + var entry = array[i]; + if (entry[attribute] && entry[attribute] === value) { + array.splice(i, 1); + } + } + }; + var a = getAdUnit(adunitObject.div, adunits) || {}; + if (adunitObject.account) { + a.s = adunitObject.account; + } + if (adunitObject.sizes) { + a.z = adunitObject.sizes; + } + if (adunitObject.div) { + a.d = adunitObject.div; + } + if (adunitObject.floor) { + a.floor = adunitObject.floor; + } + if (adunitObject.targeting) { + a.g = adunitObject.targeting; + } else { + a.g = {}; + } + if (adunitObject.div) { + removeByAttrValue(adunits, 'd', adunitObject.div); + } + if (adunitObject.sizeMapping) { + a.sm = adunitObject.sizeMapping; + } + if (adunitObject.siteId) { + a.sid = adunitObject.siteId; + } + if (adunitObject.placementId) { + a.pid = adunitObject.placementId; + } + if (adunitObject.ad_type) { + a.at = adunitObject.ad_type; + } + if (adunitObject.params) { + a.params = adunitObject.params; + } + adunits.push(a); + return adunits; + } + function getFloor(bid) { + if (bid && typeof bid.getFloor === 'function' && bid.getFloor()?.floor) { + return bid.getFloor().floor; + } + return null; + } + if (typeof window.nobid.refreshLimit !== 'undefined') { + if (window.nobid.refreshLimit < window.nobid.refreshCount) return false; + } + let ublock = nobidGetCookie('_ublock'); + if (ublock) { + log('Request blocked for user. hours: ', ublock); + return false; + } + /* DISCOVER SLOTS */ + var divids = []; + var siteId = 0; + var adunits = []; + for (var i = 0; i < bids.length; i++) { + var bid = bids[i]; + var divid = bid.adUnitCode; + divids.push(divid); + var sizes = bid.sizes; + siteId = typeof bid.params['siteId'] != 'undefined' && bid.params['siteId'] ? bid.params['siteId'] : siteId; + var placementId = bid.params['placementId']; + let adType = 'banner'; + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video'); + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.context') || ''; + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO || videoMediaType && (context === 'instream' || context === 'outstream')) { + adType = 'video'; + } + const floor = getFloor(bid); + if (siteId) { + newAdunit({ + div: divid, + sizes: sizes, + siteId: siteId, + placementId: placementId, + ad_type: adType, + params: bid.params, + floor: floor, + ctx: context + }, adunits); + } + } + if (siteId) { + return serializeState(divids, siteId, adunits); + } else { + return false; + } +} +function nobidInterpretResponse(response, bidRequest) { + var findBid = function (divid, bids) { + for (var i = 0; i < bids.length; i++) { + if (bids[i].adUnitCode == divid) { + return bids[i]; + } + } + return false; + }; + var setRefreshLimit = function (response) { + if (response && typeof response.rlimit !== 'undefined') window.nobid.refreshLimit = response.rlimit; + }; + var setUserBlock = function (response) { + if (response && typeof response.ublock !== 'undefined') { + nobidSetCookie('_ublock', '1', response.ublock); + } + }; + setRefreshLimit(response); + setUserBlock(response); + var bidResponses = []; + for (var i = 0; response.bids && i < response.bids.length; i++) { + var bid = response.bids[i]; + if (bid.bdrid < 100 || !bidRequest || !bidRequest.bidderRequest || !bidRequest.bidderRequest.bids) continue; + window.nobid.bidResponses['' + bid.id] = bid; + var reqBid = findBid(bid.divid, bidRequest.bidderRequest.bids); + if (!reqBid) continue; + const bidResponse = { + requestId: reqBid.bidId, + cpm: 1 * (bid.price ? bid.price : bid.bucket ? bid.bucket : 0), + width: bid.size.w, + height: bid.size.h, + creativeId: bid.creativeid || '', + dealId: bid.dealid || '', + currency: 'USD', + netRevenue: true, + ttl: 300, + ad: bid.adm, + mediaType: bid.atype || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER + }; + if (bid.vastUrl) { + bidResponse.vastUrl = bid.vastUrl; + } + if (bid.vastXml) { + bidResponse.vastXml = bid.vastXml; + } + if (bid.videoCacheKey) { + bidResponse.videoCacheKey = bid.videoCacheKey; + } + if (bid.meta) { + bidResponse.meta = bid.meta; + } + bidResponses.push(bidResponse); + } + return bidResponses; +} +; +window.nobid.renderTag = function (doc, id, win) { + log('nobid.renderTag()', id); + var bid = window.nobid.bidResponses['' + id]; + if (bid && bid.adm2) { + log('nobid.renderTag() found tag', id); + var markup = bid.adm2; + doc.write(markup); + doc.close(); + return; + } + log('nobid.renderTag() tag NOT FOUND *ERROR*', id); +}; +window.addEventListener('message', function (event) { + let key = event.message ? 'message' : 'data'; + var msg = '' + event[key]; + if (msg.substring(0, 'nbTagRenderer.requestAdMarkup|'.length) === 'nbTagRenderer.requestAdMarkup|') { + log('Prebid received nbTagRenderer.requestAdMarkup event'); + var adId = msg.substring(msg.indexOf('|') + 1); + if (window.nobid && window.nobid.bidResponses) { + var bid = window.nobid.bidResponses['' + adId]; + if (bid && bid.adm2) { + var markup = bid.adm2; + if (markup) { + event.source.postMessage('nbTagRenderer.renderAdInSafeFrame|' + markup, '*'); + } + } + } + } +}, false); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: [{ + code: 'duration', + gvlid: 674 + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + log('isBidRequestValid', bid); + if (bid?.params?.siteId) return true; + return false; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + function resolveEndpoint() { + var ret = 'https://ads.servenobid.com/'; + var env = typeof _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getParameterByName === 'function' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getParameterByName)('nobid-env'); + env = window.location.href.indexOf('nobid-env=dev') > 0 ? 'dev' : env; + if (!env) ret = 'https://ads.servenobid.com/';else if (env == 'beta') ret = 'https://beta.servenobid.com/';else if (env == 'dev') ret = '//localhost:8282/';else if (env == 'qa') ret = 'https://qa-ads.nobid.com/'; + return ret; + } + var buildEndpoint = function () { + return resolveEndpoint() + 'adreq?cb=' + Math.floor(Math.random() * 11000); + }; + log('validBidRequests', validBidRequests); + if (!validBidRequests || validBidRequests.length <= 0) { + log('Empty validBidRequests'); + return; + } + const payload = nobidBuildRequests(validBidRequests, bidderRequest); + if (!payload) return; + window.nobid.refreshCount++; + const payloadString = JSON.stringify(payload).replace(/'|&|#/g, ''); + const endpoint = buildEndpoint(); + let options = {}; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__.hasPurpose1Consent)(bidderRequest?.gdprConsent)) { + options = { + withCredentials: false + }; + } + return { + method: 'POST', + url: endpoint, + data: payloadString, + bidderRequest, + options + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + log('interpretResponse -> serverResponse', serverResponse); + log('interpretResponse -> bidRequest', bidRequest); + return nobidInterpretResponse(serverResponse.body, bidRequest); + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, usPrivacy, gppConsent) { + if (syncOptions.iframeEnabled) { + let params = ''; + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + // add 'gdpr' only if 'gdprApplies' is defined + if (typeof gdprConsent.gdprApplies === 'boolean') { + params += `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + params += `?gdpr_consent=${gdprConsent.consentString}`; + } + } + if (usPrivacy) { + if (params.length > 0) params += '&';else params += '?'; + params += 'usp_consent=' + usPrivacy; + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + if (params.length > 0) params += '&';else params += '?'; + params += 'gpp=' + encodeURIComponent(gppConsent.gppString); + params += 'gpp_sid=' + encodeURIComponent(gppConsent.applicableSections.join(',')); + } + return [{ + type: 'iframe', + url: 'https://public.servenobid.com/sync.html' + params + }]; + } else if (syncOptions.pixelEnabled && serverResponses.length > 0) { + let syncs = []; + if (serverResponses[0].body.syncs && serverResponses[0].body.syncs.length > 0) { + serverResponses[0].body.syncs.forEach(element => { + syncs.push({ + type: 'image', + url: element + }); + }); + } + return syncs; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('-NoBid- Please enable iframe based user sync.', syncOptions); + return []; + } + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {Object} data Containing timeout specific data + */ + onTimeout: function (data) { + window.nobid.timeoutTotal++; + log('Timeout total: ' + window.nobid.timeoutTotal, data); + return window.nobid.timeoutTotal; + }, + onBidWon: function (data) { + window.nobid.bidWonTotal++; + log('BidWon total: ' + window.nobid.bidWonTotal, data); + return window.nobid.bidWonTotal; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('nobidBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nobidBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["nodalsAiRtdProvider"],{ + +/***/ "./modules/nodalsAiRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/nodalsAiRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export nodalsAiRtdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + + +const MODULE_NAME = 'nodalsAi'; +const GVLID = 1360; +const ENGINE_VESION = '1.x.x'; +const PUB_ENDPOINT_ORIGIN = 'https://nodals.io'; +const LOCAL_STORAGE_KEY = 'signals.nodals.ai'; +const STORAGE_TTL = 3600; // 1 hour in seconds + +const fillTemplate = function (strings) { + for (var _len = arguments.length, keys = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + keys[_key - 1] = arguments[_key]; + } + return function (values) { + return strings.reduce((result, str, i) => { + const key = keys[i - 1]; + return result + (key ? values[key] || '' : '') + str; + }); + }; +}; +const PUB_ENDPOINT_PATH = fillTemplate`/p/v1/${'propertyId'}/config?${'consentParams'}`; +const { + logInfo, + logWarn, + logError +} = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)('[NodalsAiRTDProvider]'); +class NodalsAiRtdProvider { + // Public properties + name = MODULE_NAME; + gvlid = GVLID; + + // Exposed for testing + storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME + }); + STORAGE_KEY = LOCAL_STORAGE_KEY; + + // Private properties + #propertyId = null; + #overrides = {}; + #dataFetchInProgress = false; + #userConsent = null; + + // Public methods + + /** + * Initialises the class with the provided config and user consent. + * @param {Object} config - Configuration object for the module. + * @param {Object} userConsent - User consent object for GDPR or other purposes. + */ + init(config, userConsent) { + const params = config?.params || {}; + if (this.#isValidConfig(params) && this.#hasRequiredUserConsent(userConsent)) { + this.#propertyId = params.propertyId; + this.#userConsent = userConsent; + this.#setOverrides(params); + const storedData = this.#readFromStorage(); + if (storedData === null) { + this.#fetchData(); + } else { + this.#loadAdLibraries(storedData.deps || []); + } + return true; + } else { + logWarn('Invalid configuration or missing user consent.'); + return false; + } + } + + /** + * Retrieves targeting data by fetching and processing signals. + * @param {Array} adUnitArray - Array of ad units. + * @param {Object} config - Configuration object. + * @param {Object} userConsent - User consent object. + * @returns {Object} - Targeting data. + */ + getTargetingData(adUnitArray, config, userConsent) { + let targetingData = {}; + if (!this.#hasRequiredUserConsent(userConsent)) { + return targetingData; + } + this.#userConsent = userConsent; + const storedData = this.#getData(); + const engine = this.#initialiseEngine(config); + if (!storedData || !engine) { + return targetingData; + } + try { + targetingData = engine.getTargetingData(adUnitArray, userConsent, storedData); + } catch (error) { + logError(`Error determining targeting keys: ${error}`); + } + return targetingData; + } + getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { + if (!this.#hasRequiredUserConsent(userConsent)) { + callback(); + return; + } + this.#userConsent = userConsent; + const storedData = this.#getData(); + if (!storedData) { + callback(); + return; + } + const engine = this.#initialiseEngine(config); + if (!engine) { + this.#addToCommandQueue('getBidRequestData', { + config, + reqBidsConfigObj, + callback, + userConsent, + storedData + }); + } else { + try { + engine.getBidRequestData(reqBidsConfigObj, callback, userConsent, storedData); + } catch (error) { + logError(`Error getting bid request data: ${error}`); + callback(); + } + } + } + onBidResponseEvent(bidResponse, config, userConsent) { + if (!this.#hasRequiredUserConsent(userConsent)) { + return; + } + this.#userConsent = userConsent; + const storedData = this.#getData(); + if (!storedData) { + return; + } + const engine = this.#initialiseEngine(config); + if (!engine) { + this.#addToCommandQueue('onBidResponseEvent', { + config, + bidResponse, + userConsent, + storedData + }); + return; + } + try { + engine.onBidResponseEvent(bidResponse, userConsent, storedData); + } catch (error) { + logError(`Error processing bid response event: ${error}`); + } + } + onAuctionEndEvent(auctionDetails, config, userConsent) { + if (!this.#hasRequiredUserConsent(userConsent)) { + return; + } + this.#userConsent = userConsent; + const storedData = this.#getData(); + if (!storedData) { + return; + } + const engine = this.#initialiseEngine(config); + if (!engine) { + this.#addToCommandQueue('onAuctionEndEvent', { + config, + auctionDetails, + userConsent, + storedData + }); + return; + } + try { + engine.onAuctionEndEvent(auctionDetails, userConsent, storedData); + } catch (error) { + logError(`Error processing auction end event: ${error}`); + } + } + + // Private methods + #getData() { + const storedData = this.#readFromStorage(); + if (storedData === null) { + this.#fetchData(); + return null; + } + if (storedData.facts === undefined) { + storedData.facts = {}; + } + storedData.facts = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(storedData.facts, this.#getRuntimeFacts()); + return storedData; + } + #initialiseEngine(config) { + const engine = this.#getEngine(); + if (!engine) { + logInfo(`Engine v${ENGINE_VESION} not found`); + return null; + } + try { + engine.init(config); + return engine; + } catch (error) { + logError(`Error initialising engine: ${error}`); + return null; + } + } + #getEngine() { + return window?.$nodals?.adTargetingEngine[ENGINE_VESION]; + } + #setOverrides(params) { + if (params?.storage?.ttl && typeof params.storage.ttl === 'number') { + this.#overrides.storageTTL = params.storage.ttl; + } + this.#overrides.storageKey = params?.storage?.key; + this.#overrides.endpointOrigin = params?.endpoint?.origin; + } + #getRuntimeFacts() { + return { + 'page.url': (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page, + 'prebid.version': "9.45.0-pre" + }; + } + + /** + * Validates if the provided module input parameters are valid. + * @param {Object} params - Parameters object from the module configuration. + * @returns {boolean} - True if parameters are valid, false otherwise. + */ + + #isValidConfig(params) { + // Basic validation logic + if (typeof params === 'object' && params?.propertyId) { + return true; + } + logWarn('Invalid configuration'); + return false; + } + + /** + * Checks if the user has provided the required consent. + * @param {Object} userConsent - User consent object. + * @returns {boolean} - True if the user consent is valid, false otherwise. + */ + + #hasRequiredUserConsent(userConsent) { + if (userConsent.gdpr === undefined || userConsent.gdpr?.gdprApplies === false) { + return true; + } + if ([false, undefined].includes(userConsent.gdpr.vendorData?.vendor?.consents?.[this.gvlid])) { + return false; + } else if (userConsent.gdpr.vendorData?.purpose?.consents[1] === false || userConsent.gdpr.vendorData?.purpose?.consents[7] === false) { + return false; + } + return true; + } + #readFromStorage() { + const key = this.#overrides?.storageKey || this.STORAGE_KEY; + if (this.storage.hasLocalStorage() && this.storage.localStorageIsEnabled()) { + try { + const entry = this.storage.getDataFromLocalStorage(key); + if (!entry) { + return null; + } + const dataEnvelope = JSON.parse(entry); + if (this.#dataIsStale(dataEnvelope)) { + logInfo('Stale data found in storage. Refreshing data.'); + this.#fetchData(); + } + if (!dataEnvelope.data) { + throw new Error('Data envelope is missing \'data\' property.'); + } + return dataEnvelope.data; + } catch (error) { + logError(`Corrupted data in local storage: ${error}`); + return null; + } + } else { + logError('Local storage is not available or not enabled.'); + return null; + } + } + + /** + * Writes data to localStorage. + * @param {string} key - The key under which to store the data. + * @param {Object} data - The data to store. + */ + + #writeToStorage(key, data) { + if (this.storage.hasLocalStorage() && this.storage.localStorageIsEnabled()) { + const storageObject = { + createdAt: Date.now(), + data + }; + this.storage.setDataInLocalStorage(key, JSON.stringify(storageObject)); + } else { + logError('Local storage is not available or not enabled.'); + } + } + + /** + * Checks if the provided data is stale. + * @param {Object} dataEnvelope - The data envelope object. + * @returns {boolean} - True if the data is stale, false otherwise. + */ + + #dataIsStale(dataEnvelope) { + const currentTime = Date.now(); + const dataTime = dataEnvelope.createdAt || 0; + const staleThreshold = this.#overrides?.storageTTL ?? dataEnvelope?.data?.meta?.ttl ?? STORAGE_TTL; + return currentTime - dataTime >= staleThreshold * 1000; + } + #getEndpointUrl(userConsent) { + const endpointOrigin = this.#overrides.endpointOrigin || PUB_ENDPOINT_ORIGIN; + const parameterMap = { + gdpr_consent: userConsent?.gdpr?.consentString ?? '', + gdpr: userConsent?.gdpr?.gdprApplies ? '1' : '0', + us_privacy: userConsent?.uspConsent ?? '', + gpp: userConsent?.gpp?.gppString ?? '', + gpp_sid: userConsent.gpp && Array.isArray(userConsent.gpp.applicableSections) ? userConsent.gpp.applicableSections.join(',') : '' + }; + const querystring = new URLSearchParams(parameterMap).toString(); + const values = { + propertyId: this.#propertyId, + consentParams: querystring + }; + const path = PUB_ENDPOINT_PATH(values); + return `${endpointOrigin}${path}`; + } + + /** + * Initiates the request to fetch rule data from the publisher endpoint. + */ + + #fetchData() { + if (this.#dataFetchInProgress) { + return; + } + this.#dataFetchInProgress = true; + const endpointUrl = this.#getEndpointUrl(this.#userConsent); + const callback = { + success: (response, req) => { + this.#dataFetchInProgress = false; + this.#handleServerResponse(response, req); + }, + error: (error, req) => { + this.#dataFetchInProgress = false; + this.#handleServerError(error, req); + } + }; + const options = { + method: 'GET', + withCredentials: false + }; + logInfo(`Fetching ad rules from: ${endpointUrl}`); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(endpointUrl, callback, null, options); + } + #addToCommandQueue(cmd, payload) { + window.$nodals = window.$nodals || {}; + window.$nodals.cmdQueue = window.$nodals.cmdQueue || []; + window.$nodals.cmdQueue.push({ + cmd, + runtimeFacts: this.#getRuntimeFacts(), + data: payload + }); + } + + /** + * Handles the server response, processes it and extracts relevant data. + * @param {Object} response - The server response object. + * @returns {Object} - Processed data from the response. + */ + + #handleServerResponse(response, req) { + let data; + try { + data = JSON.parse(response); + } catch (error) { + throw `Error parsing response: ${error}`; + } + this.#writeToStorage(this.#overrides?.storageKey || this.STORAGE_KEY, data); + this.#loadAdLibraries(data.deps || []); + } + #handleServerError(error, req) { + logError(`Publisher endpoint response error: ${error}`); + } + #loadAdLibraries(deps) { + // eslint-disable-next-line no-unused-vars + for (const [key, value] of Object.entries(deps)) { + if (typeof value === 'string') { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_5__.loadExternalScript)(value, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, MODULE_NAME, () => { + // noop + }); + } + } + } +} +const nodalsAiRtdSubmodule = new NodalsAiRtdProvider(); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('realTimeData', nodalsAiRtdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('nodalsAiRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/nodalsAiRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["novatiqIdSystem"],{ + +/***/ "./modules/novatiqIdSystem.js": +/*!************************************!*\ + !*** ./modules/novatiqIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export novatiqIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds novatiqId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/novatiqIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const MODULE_NAME = 'novatiq'; + +/** @type {Submodule} */ +const novatiqIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * used to specify vendor id + * @type {number} + */ + gvlid: 1119, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{novatiq: {snowflake: string}}} + */ + decode(novatiqId, config) { + let responseObj = { + novatiq: { + snowflake: novatiqId + } + }; + if (novatiqId.syncResponse !== undefined) { + responseObj.novatiq.ext = {}; + responseObj.novatiq.ext.syncResponse = novatiqId.syncResponse; + } + if (typeof config != 'undefined' && typeof config.params !== 'undefined' && typeof config.params.removeAdditionalInfo !== 'undefined' && config.params.removeAdditionalInfo === true) { + delete responseObj.novatiq.snowflake.syncResponse; + } + return responseObj; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} config + * @returns {string} + */ + getId(config) { + const configParams = config.params || {}; + const urlParams = this.getUrlParams(configParams); + const srcId = this.getSrcId(configParams, urlParams); + const sharedId = this.getSharedId(configParams); + const useCallbacks = this.useCallbacks(configParams); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ config params: ' + JSON.stringify(configParams)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Sync request used sourceid param: ' + srcId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Sync request Shared ID: ' + sharedId); + return this.sendSyncRequest(useCallbacks, sharedId, srcId, urlParams); + }, + sendSyncRequest(useCallbacks, sharedId, sspid, urlParams) { + const syncUrl = this.getSyncUrl(sharedId, sspid, urlParams); + const url = syncUrl.url; + const novatiqId = syncUrl.novatiqId; + + // for testing + const sharedStatus = sharedId != undefined && sharedId != false ? 'Found' : 'Not Found'; + if (useCallbacks) { + let res = this.sendAsyncSyncRequest(novatiqId, url); + ; + res.sharedStatus = sharedStatus; + return res; + } else { + this.sendSimpleSyncRequest(novatiqId, url); + return { + 'id': novatiqId, + 'sharedStatus': sharedStatus + }; + } + }, + sendAsyncSyncRequest(novatiqId, url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Setting up ASYNC sync request'); + const resp = function (callback) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ *** Calling ASYNC sync request'); + function onSuccess(response, responseObj) { + let syncrc; + var novatiqIdJson = { + syncResponse: 0 + }; + syncrc = responseObj.status; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Sync Response Code:' + syncrc); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ *** ASYNC request returned ' + syncrc); + if (syncrc === 200) { + novatiqIdJson = { + 'id': novatiqId, + syncResponse: 1 + }; + } else { + if (syncrc === 204) { + novatiqIdJson = { + 'id': novatiqId, + syncResponse: 2 + }; + } + } + callback(novatiqIdJson); + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, { + success: onSuccess + }, undefined, { + method: 'GET', + withCredentials: false + }); + }; + return { + callback: resp + }; + }, + sendSimpleSyncRequest(novatiqId, url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Sending SIMPLE sync request'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, undefined, undefined, { + method: 'GET', + withCredentials: false + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ snowflake: ' + novatiqId); + }, + getNovatiqId(urlParams) { + // standard uuid format + let uuidFormat = [1e7] + -1e3 + -4e3 + -8e3 + -1e11; + if (urlParams.useStandardUuid === false) { + // novatiq standard uuid(like) format + uuidFormat = uuidFormat + 1e3; + } + return uuidFormat.replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); + }, + getSyncUrl(sharedId, sspid, urlParams) { + let novatiqId = this.getNovatiqId(urlParams); + let url = 'https://spadsync.com/sync?' + urlParams.novatiqId + '=' + novatiqId; + if (urlParams.useSspId) { + url = url + '&sspid=' + sspid; + } + if (urlParams.useSspHost) { + let ssphost = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowLocation)().hostname; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ partner hostname: ' + ssphost); + url = url + '&ssphost=' + ssphost; + } + + // append on the shared ID if we have one + if (sharedId != null) { + url = url + '&sharedId=' + sharedId; + } + return { + url: url, + novatiqId: novatiqId + }; + }, + getUrlParams(configParams) { + let urlParams = { + novatiqId: 'snowflake', + useStandardUuid: false, + useSspId: true, + useSspHost: true + }; + if (typeof configParams.urlParams != 'undefined') { + if (configParams.urlParams.novatiqId != undefined) { + urlParams.novatiqId = configParams.urlParams.novatiqId; + } + if (configParams.urlParams.useStandardUuid != undefined) { + urlParams.useStandardUuid = configParams.urlParams.useStandardUuid; + } + if (configParams.urlParams.useSspId != undefined) { + urlParams.useSspId = configParams.urlParams.useSspId; + } + if (configParams.urlParams.useSspHost != undefined) { + urlParams.useSspHost = configParams.urlParams.useSspHost; + } + } + return urlParams; + }, + useCallbacks(configParams) { + return typeof configParams.useCallbacks != 'undefined' && configParams.useCallbacks === true; + }, + useSharedId(configParams) { + return typeof configParams.useSharedId != 'undefined' && configParams.useSharedId === true; + }, + getCookieOrStorageID(configParams) { + let cookieOrStorageID = '_pubcid'; + if (typeof configParams.sharedIdName != 'undefined' && configParams.sharedIdName != null && configParams.sharedIdName != '') { + cookieOrStorageID = configParams.sharedIdName; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ sharedID name redefined: ' + cookieOrStorageID); + } + return cookieOrStorageID; + }, + // return null if we aren't supposed to use one or we are but there isn't one present + getSharedId(configParams) { + let sharedId = null; + if (this.useSharedId(configParams)) { + let cookieOrStorageID = this.getCookieOrStorageID(configParams); + const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_2__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_UID, + moduleName: MODULE_NAME + }); + + // first check local storage + if (storage.hasLocalStorage()) { + sharedId = storage.getDataFromLocalStorage(cookieOrStorageID); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ sharedID retrieved from local storage:' + sharedId); + } + + // if nothing check the local cookies + if (sharedId == null) { + sharedId = storage.getCookie(cookieOrStorageID); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ sharedID retrieved from cookies:' + sharedId); + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ sharedID returning: ' + sharedId); + return sharedId; + }, + getSrcId(configParams, urlParams) { + if (urlParams.useSspId == false) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Configured to NOT use sspid'); + return ''; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ Configured sourceid param: ' + configParams.sourceid); + let srcId; + if (typeof configParams.sourceid === 'undefined' || configParams.sourceid === null || configParams.sourceid === '') { + srcId = '000'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ sourceid param set to value 000 due to undefined parameter or missing value in config section'); + } else if (configParams.sourceid.length < 3 || configParams.sourceid.length > 3) { + srcId = '001'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('NOVATIQ sourceid param set to value 001 due to wrong size in config section 3 chars max e.g. 1ab'); + } else { + srcId = configParams.sourceid; + } + return srcId; + }, + eids: { + 'novatiq': { + getValue: function (data) { + if (data.snowflake.id === undefined) { + return data.snowflake; + } + return data.snowflake.id; + }, + source: 'novatiq.com' + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', novatiqIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('novatiqIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/novatiqIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["oguryBidAdapter"],{ + +/***/ "./modules/oguryBidAdapter.js": +/*!************************************!*\ + !*** ./modules/oguryBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ortbConverterProps, converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + + + +const BIDDER_CODE = 'ogury'; +const GVLID = 31; +const DEFAULT_TIMEOUT = 1000; +const BID_HOST = 'https://mweb-hb.presage.io/api/header-bidding-request'; +const TIMEOUT_MONITORING_HOST = 'https://ms-ads-monitoring-events.presage.io'; +const MS_COOKIE_SYNC_DOMAIN = 'https://ms-cookie-sync.presage.io'; +const ADAPTER_VERSION = '2.0.3'; +const ortbConverterProps = { + context: { + netRevenue: true, + ttl: 60, + mediaType: 'banner' + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + req.tmax = DEFAULT_TIMEOUT; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'device.pxratio', window.devicePixelRatio); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'site.page', getWindowContext().location.href); + req.ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({}, req.ext, { + adapterversion: ADAPTER_VERSION, + prebidversion: "9.45.0-pre" + }); + const bidWithAssetKey = bidderRequest.bids.find(bid => Boolean((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.assetKey', false))); + if (bidWithAssetKey) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'site.id', bidWithAssetKey.params.assetKey); + const bidWithUserIds = bidderRequest.bids.find(bid => Boolean(bid.userId)); + if (bidWithUserIds) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.dset)(req, 'user.ext.uids', bidWithUserIds.userId); + return req; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const timeSpentOnPage = document.timeline && document.timeline.currentTime ? document.timeline.currentTime : 0; + const gpid = bidRequest.adUnitCode; + imp.tagid = bidRequest.adUnitCode; + imp.ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({}, bidRequest.params, { + timeSpentOnPage, + gpid + }, imp.ext); + const bidfloor = getFloor(bidRequest); + if (!bidfloor) { + delete imp.bidfloor; + } else { + imp.bidfloor = bidfloor; + } + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const nurl = bid.nurl; + delete bid.nurl; + const bidResponse = buildBidResponse(bid, context); + bidResponse.currency = 'USD'; + bidResponse.nurl = nurl; + return bidResponse; + } +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)(ortbConverterProps); +function isBidRequestValid(bid) { + const adUnitSizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAdUnitSizes)(bid); + const isValidSize = Boolean(adUnitSizes) && adUnitSizes.length > 0; + const hasAssetKeyAndAdUnitId = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.adUnitId') && !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.assetKey'); + const hasPublisherIdAndAdUnitCode = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2.site.publisher.id') && !!bid.adUnitCode; + return isValidSize && (hasAssetKeyAndAdUnitId || hasPublisherIdAndAdUnitCode); +} +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + const consent = gdprConsent && gdprConsent.consentString || ''; + const gpp = gppConsent && gppConsent.gppString || ''; + const gppSid = gppConsent && gppConsent.applicableSections && gppConsent.applicableSections.toString() || ''; + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: `${MS_COOKIE_SYNC_DOMAIN}/user-sync.html?gdpr_consent=${consent}&source=prebid&gpp=${gpp}&gpp_sid=${gppSid}` + }]; + } + if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: `${MS_COOKIE_SYNC_DOMAIN}/v1/init-sync/bid-switch?iab_string=${consent}&source=prebid&gpp=${gpp}&gpp_sid=${gppSid}` + }, { + type: 'image', + url: `${MS_COOKIE_SYNC_DOMAIN}/ttd/init-sync?iab_string=${consent}&source=prebid&gpp=${gpp}&gpp_sid=${gppSid}` + }, { + type: 'image', + url: `${MS_COOKIE_SYNC_DOMAIN}/xandr/init-sync?iab_string=${consent}&source=prebid&gpp=${gpp}&gpp_sid=${gppSid}` + }]; + } + return []; +} +function buildRequests(bidRequests, bidderRequest) { + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: BID_HOST, + data, + options: { + contentType: 'application/json' + } + }; +} +function interpretResponse(response, request) { + return converter.fromORTB({ + response: response.body, + request: request.data + }).bids; +} +function getFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return 0; + } + let floorResult = bid.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '*' + }); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorResult) && floorResult.currency === 'USD' ? floorResult.floor : 0; +} +function getWindowContext() { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(); + } catch (e) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowSelf)(); + } +} +function onBidWon(bid) { + const w = getWindowContext(); + w.OG_PREBID_BID_OBJECT = { + ...(bid && { + ...bid + }) + }; + if (bid && bid.nurl) (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(bid.nurl, null); +} +function onTimeout(timeoutData) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(`${TIMEOUT_MONITORING_HOST}/bid_timeout`, null, JSON.stringify({ + ...timeoutData[0], + location: window.location.href + }), { + method: 'POST', + contentType: 'application/json' + }); +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER], + isBidRequestValid, + getUserSyncs, + buildRequests, + interpretResponse, + getFloor, + onBidWon, + getWindowContext, + onTimeout +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('oguryBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","sizeUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/oguryBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["omnidexBidAdapter"],{ + +/***/ "./modules/omnidexBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/omnidexBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, createDomain, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/vidazooUtils/bidderUtils.js */ "./libraries/vidazooUtils/bidderUtils.js"); + + + + + +const DEFAULT_SUB_DOMAIN = 'exchange'; +const BIDDER_CODE = 'omnidex'; +const BIDDER_VERSION = '1.0.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function createDomain() { + let subDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SUB_DOMAIN; + return `https://${subDomain}.omni-dex.io`; +} +function createUniqueRequestData(hashUrl, bid) { + const { + auctionId, + transactionId + } = bid; + return { + auctionId, + transactionId + }; +} +const buildRequests = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createBuildRequestsFn)(createDomain, createUniqueRequestData, storage, BIDDER_CODE, BIDDER_VERSION, false); +const interpretResponse = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createInterpretResponseFn)(BIDDER_CODE, false); +const getUserSyncs = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createUserSyncGetter)({ + iframeSyncUrl: 'https://sync.omni-dex.io/api/sync/iframe', + imageSyncUrl: 'https://sync.omni-dex.io/api/sync/image' +}); +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + onBidWon: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.onBidWon +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('omnidexBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","vidazooUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/omnidexBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["omsBidAdapter"],{ + +/***/ "./modules/omsBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/omsBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/percentInView/percentInView.js */ "./libraries/percentInView/percentInView.js"); +/* harmony import */ var _libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/userSyncUtils/userSyncUtils.js */ "./libraries/userSyncUtils/userSyncUtils.js"); + + + + + + + +const BIDDER_CODE = 'oms'; +const URL = 'https://rt.marphezis.com/hb'; +const TRACK_EVENT_URL = 'https://rt.marphezis.com/prebid'; +const USER_SYNC_URL_IFRAME = 'https://rt.marphezis.com/sync?dpid=0'; +const spec = { + code: BIDDER_CODE, + aliases: ['brightcom', 'bcmssp'], + gvlid: 883, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + onBidderError, + onBidWon, + getUserSyncs +}; +function buildRequests(bidReqs, bidderRequest) { + try { + const impressions = bidReqs.map(bid => { + let bidSizes = bid?.mediaTypes?.banner?.sizes || bid?.mediaTypes?.video?.playerSize || bid.sizes; + bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidSizes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidSizes[0]) ? bidSizes : [bidSizes]; + bidSizes = bidSizes.filter(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size)); + const processedSizes = bidSizes.map(size => ({ + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + })); + const element = document.getElementById(bid.adUnitCode); + const minSize = _getMinSize(processedSizes); + const viewabilityAmount = _isViewabilityMeasurable(element) ? _getViewability(element, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(), minSize) : 'na'; + const viewabilityAmountRounded = isNaN(viewabilityAmount) ? viewabilityAmount : Math.round(viewabilityAmount); + const gpidData = _extractGpidData(bid); + const imp = { + id: bid.bidId, + banner: { + format: processedSizes, + ext: { + viewability: viewabilityAmountRounded + } + }, + ext: { + ...gpidData + }, + tagid: String(bid.adUnitCode) + }; + if (bid?.mediaTypes?.video) { + imp.video = { + ...bid.mediaTypes.video + }; + } + const bidFloor = _getBidFloor(bid); + if (bidFloor) { + imp.bidfloor = bidFloor; + } + return imp; + }); + const referrer = bidderRequest?.refererInfo?.page || ''; + const publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('publisherId', bidReqs[0].params); + const payload = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getUniqueIdentifierStr)(), + imp: impressions, + site: { + domain: bidderRequest?.refererInfo?.domain || '', + page: referrer, + publisher: { + id: publisherId + } + }, + device: { + devicetype: _getDeviceType(navigator.userAgent, bidderRequest?.ortb2?.device?.sua), + w: screen.width, + h: screen.height + }, + tmax: bidderRequest?.timeout + }; + if (bidderRequest?.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'regs.ext.gdpr', +bidderRequest.gdprConsent.gdprApplies); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + const gpp = _getGpp(bidderRequest); + if (gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'regs.ext.gpp', gpp); + } + if (bidderRequest?.ortb2?.regs?.coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'regs.coppa', 1); + } + if (bidReqs?.[0]?.schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'source.ext.schain', bidReqs[0].schain); + } + if (bidderRequest?.ortb2?.user) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'user', bidderRequest.ortb2.user); + } + if (bidReqs?.[0]?.userIdAsEids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'user.ext.eids', bidReqs[0].userIdAsEids || []); + } + if (bidReqs?.[0].userId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'user.ext.ids', bidReqs[0].userId || []); + } + if (bidderRequest?.ortb2?.site?.content) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(payload, 'site.content', bidderRequest.ortb2.site.content); + } + return { + method: 'POST', + url: URL, + data: JSON.stringify(payload) + }; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(e, { + bidReqs, + bidderRequest + }); + } +} +function isBidRequestValid(bid) { + if (!bid.params || !bid.params.publisherId) { + return false; + } + return true; +} +function interpretResponse(serverResponse) { + let response = []; + if (!serverResponse.body || typeof serverResponse.body != 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('OMS server returned empty/non-json response: ' + JSON.stringify(serverResponse.body)); + return response; + } + const { + body: { + id, + seatbid + } + } = serverResponse; + try { + if (id && seatbid && seatbid.length > 0 && seatbid[0].bid && seatbid[0].bid.length > 0) { + response = seatbid[0].bid.map(bid => { + const bidResponse = { + requestId: bid.impid, + cpm: parseFloat(bid.price), + width: parseInt(bid.w), + height: parseInt(bid.h), + creativeId: bid.crid || bid.id, + currency: 'USD', + netRevenue: true, + ad: _getAdMarkup(bid), + ttl: 300, + meta: { + advertiserDomains: bid?.adomain || [] + } + }; + if (bid.mtype === 2) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + return bidResponse; + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(e, { + id, + seatbid + }); + } + return response; +} +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + const syncs = []; + if (syncOptions.iframeEnabled) { + let params = (0,_libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_3__.getUserSyncParams)(gdprConsent, uspConsent, gppConsent); + params = Object.keys(params).length ? `&${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(params)}` : ''; + syncs.push({ + type: 'iframe', + url: USER_SYNC_URL_IFRAME + params + }); + } + return syncs; +} +function onBidderError(errorData) { + if (errorData === null || !errorData.bidderRequest) { + return; + } + _trackEvent('error', errorData.bidderRequest); +} +function onBidWon(bid) { + if (bid === null) { + return; + } + _trackEvent('bidwon', bid); +} +function _trackEvent(endpoint, data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(`${TRACK_EVENT_URL}/${endpoint}`, null, JSON.stringify(data), { + method: 'POST', + withCredentials: false + }); +} +function _getDeviceType(ua, sua) { + if (sua?.mobile || /(ios|ipod|ipad|iphone|android)/i.test(ua)) { + return 1; + } + if (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(ua)) { + return 3; + } + return 2; +} +function _getGpp(bidderRequest) { + if (bidderRequest?.gppConsent != null) { + return bidderRequest.gppConsent; + } + return bidderRequest?.ortb2?.regs?.gpp ?? { + gppString: '', + applicableSections: '' + }; +} +function _getAdMarkup(bid) { + let adm = bid.adm; + if ('nurl' in bid) { + adm += (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(bid.nurl); + } + return adm; +} +function _isViewabilityMeasurable(element) { + return !_isIframe() && element !== null; +} +function _getViewability(element, topWin) { + let { + w, + h + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)().document.visibilityState === 'visible' ? (0,_libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_5__.percentInView)(element, { + w, + h + }) : 0; +} +function _extractGpidData(bid) { + return { + gpid: bid?.ortb2Imp?.ext?.gpid, + adserverName: bid?.ortb2Imp?.ext?.data?.adserver?.name, + adslot: bid?.ortb2Imp?.ext?.data?.adserver?.adslot, + pbadslot: bid?.ortb2Imp?.ext?.data?.pbadslot + }; +} +function _isIframe() { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowSelf)() !== (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(); + } catch (e) { + return true; + } +} +function _getMinSize(sizes) { + return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min); +} +function _getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return bid.params.bidFloor ? bid.params.bidFloor : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('omsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","percentInView","userSyncUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/omsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["oneKeyIdSystem"],{ + +/***/ "./modules/oneKeyIdSystem.js": +/*!***********************************!*\ + !*** ./modules/oneKeyIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export oneKeyIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/** + * This module adds Onekey data to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/oneKeyIdSystem + * @requires module:modules/userId + */ + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +// Pre-init OneKey if it has not load yet. +window.OneKey = window.OneKey || {}; +window.OneKey.queue = window.OneKey.queue || []; +const logPrefix = 'OneKey.Id-Module'; + +/** + * Generate callback that deserializes the result of getIdsAndPreferences. + */ +const onIdsAndPreferencesResult = callback => { + return result => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(logPrefix, `Has got Ids and Prefs with status: `, result); + callback(result.data); + }; +}; + +/** + * Call OneKey once it is loaded for retrieving + * the ids and the preferences. + */ +const getIdsAndPreferences = callback => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(logPrefix, 'Queue getIdsAndPreferences call'); + // Call OneKey in a queue so that we are sure + // it will be called when fully load and configured + // within the page. + window.OneKey.queue.push(() => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)(logPrefix, 'Get Ids and Prefs'); + window.OneKey.getIdsAndPreferences().then(onIdsAndPreferencesResult(callback)).catch(() => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(logPrefix, 'Cannot retrieve the ids and preferences from OneKey.'); + callback(undefined); + }); + }); +}; + +/** @type {Submodule} */ +const oneKeyIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'oneKeyData', + /** + * decode the stored data value for passing to bid requests + * @function decode + * @param {(Object|string)} data + * @returns {(Object|undefined)} + */ + decode(data) { + return { + oneKeyData: data + }; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + return { + callback: getIdsAndPreferences + }; + }, + eids: { + 'oneKeyData': { + getValue: function (data) { + if (data && Array.isArray(data.identifiers) && data.identifiers[0]) { + return data.identifiers[0].value; + } + }, + source: 'paf', + atype: 1, + getEidExt: function (data) { + if (data && data.preferences) { + return { + preferences: data.preferences + }; + } + }, + getUidExt: function (data) { + if (data && Array.isArray(data.identifiers) && data.identifiers[0]) { + const id = data.identifiers[0]; + return { + version: id.version, + type: id.type, + source: id.source + }; + } + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.submodule)('userId', oneKeyIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('oneKeyIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/oneKeyIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["oneKeyRtdProvider"],{ + +/***/ "./modules/oneKeyRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/oneKeyRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export oneKeyDataSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const SUBMODULE_NAME = 'oneKey'; +const prefixLog = 'OneKey.RTD-module'; + +// Pre-init OneKey if it has not load yet. +window.OneKey = window.OneKey || {}; +window.OneKey.queue = window.OneKey.queue || []; + +/** + * Generate the OneKey transmission and include it in the Bid Request. + * + * Modify the AdUnit object for each auction. + * It’s called as part of the requestBids hook. + * https://docs.prebid.org/dev-docs/add-rtd-submodule.html#getbidrequestdata + * + * @param {Object} reqBidsConfigObj + * @param {function} done + * @param {Object} rtdConfig + */ +const getTransmissionInBidRequest = (reqBidsConfigObj, done, rtdConfig) => { + const adUnits = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().adUnits; + const transactionIds = adUnits.map(() => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)()); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(prefixLog, 'Queue seed generation.'); + window.OneKey.queue.push(() => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(prefixLog, 'Generate a seed.'); + window.OneKey.generateSeed(transactionIds).then(onGetSeed(reqBidsConfigObj, rtdConfig, adUnits, transactionIds)).catch(err => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(SUBMODULE_NAME, err.message); + }).finally(done); + }); +}; +const onGetSeed = (reqBidsConfigObj, rtdConfig, adUnits, transactionIds) => { + return seed => { + if (!seed) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(prefixLog, 'No seed generated.'); + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(prefixLog, 'Has retrieved a seed:', seed); + addTransactionIdsToAdUnits(adUnits, transactionIds); + addTransmissionToOrtb2(reqBidsConfigObj, rtdConfig, seed); + }; +}; +const addTransactionIdsToAdUnits = (adUnits, transactionIds) => { + adUnits.forEach((unit, index) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(unit, `ortb2Imp.ext.data.paf.transaction_id`, transactionIds[index]); + }); +}; +const addTransmissionToOrtb2 = (reqBidsConfigObj, rtdConfig, seed) => { + const okOrtb2 = { + ortb2: { + user: { + ext: { + paf: { + transmission: { + seed + } + } + } + } + } + }; + const shareSeedWithAllBidders = !rtdConfig.params || !rtdConfig.params.bidders; + if (shareSeedWithAllBidders) { + // Change global first party data with OneKey + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(prefixLog, 'set ortb2:', okOrtb2); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global, okOrtb2.ortb2); + } else { + // Change bidder-specific first party data with OneKey + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(prefixLog, `set ortb2 for: ${rtdConfig.params.bidders.join(',')}`, okOrtb2); + rtdConfig.params.bidders.forEach(bidder => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.bidder, { + [bidder]: okOrtb2.ortb2 + }); + }); + } +}; + +/** @type {RtdSubmodule} */ +const oneKeyDataSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: SUBMODULE_NAME, + init: () => true, + getBidRequestData: getTransmissionInBidRequest +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('realTimeData', oneKeyDataSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.registerModule)('oneKeyRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/oneKeyRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["onetagBidAdapter"],{ + +/***/ "./modules/onetagBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/onetagBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports hasTypeVideo, hasTypeNative, isValid, isSchainValid, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const ENDPOINT = 'https://onetag-sys.com/prebid-request'; +const USER_SYNC_ENDPOINT = 'https://onetag-sys.com/usync/'; +const BIDDER_CODE = 'onetag'; +const GVLID = 241; +const NATIVE_SUFFIX = 'Ad'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); + +/** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ +function isBidRequestValid(bid) { + if (typeof bid === 'undefined' || typeof bid.params === 'undefined' || typeof bid.params.pubId !== 'string') { + return false; + } + return isValid(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, bid) || isValid(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, bid) || isValid(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, bid); +} +function hasTypeVideo(bid) { + return typeof bid.mediaTypes !== 'undefined' && typeof bid.mediaTypes.video !== 'undefined'; +} +function hasTypeNative(bid) { + return typeof bid.mediaTypes !== 'undefined' && typeof bid.mediaTypes.native !== 'undefined'; +} +function isValid(type, bid) { + if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + return parseSizes(bid).length > 0; + } else if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO && hasTypeVideo(bid)) { + const context = bid.mediaTypes.video.context; + if (context === 'outstream' || context === 'instream') { + return parseVideoSize(bid).length > 0; + } + } else if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE) { + if (typeof bid.mediaTypes.native !== 'object' || bid.mediaTypes.native === null) return false; + if (!isNativeOrtbVersion(bid)) { + if (bid.nativeParams === undefined) return false; + const ortbConversion = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.toOrtbNativeRequest)(bid.nativeParams); + return ortbConversion && ortbConversion.assets && Array.isArray(ortbConversion.assets) && ortbConversion.assets.length > 0 && ortbConversion.assets.every(asset => isValidAsset(asset)); + } + let isValidAssets = false; + let isValidEventTrackers = false; + const assets = bid.mediaTypes.native?.ortb?.assets; + const eventTrackers = bid.mediaTypes.native?.ortb?.eventtrackers; + if (assets && Array.isArray(assets) && assets.length > 0 && assets.every(asset => isValidAsset(asset))) { + isValidAssets = true; + } + if (eventTrackers && Array.isArray(eventTrackers) && eventTrackers.length > 0) { + if (eventTrackers.every(eventTracker => isValidEventTracker(eventTracker))) { + isValidEventTrackers = true; + } + } else if (!eventTrackers) { + isValidEventTrackers = true; + } + return isValidAssets && isValidEventTrackers; + } + return false; +} +const isValidEventTracker = function (et) { + if (!et.event || !et.methods || !Number.isInteger(et.event) || !Array.isArray(et.methods) || !et.methods.length > 0) { + return false; + } + return true; +}; +const isValidAsset = function (asset) { + if (!asset.hasOwnProperty("id") || !Number.isInteger(asset.id)) return false; + const hasValidContent = asset.title || asset.img || asset.data || asset.video; + if (!hasValidContent) return false; + if (asset.title && (!asset.title.len || !Number.isInteger(asset.title.len))) return false; + if (asset.data && (!asset.data.type || !Number.isInteger(asset.data.type))) return false; + if (asset.video && (!asset.video.mimes || !asset.video.minduration || !asset.video.maxduration || !asset.video.protocols)) return false; + return true; +}; + +/** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ +function buildRequests(validBidRequests, bidderRequest) { + const payload = { + bids: requestsToBids(validBidRequests), + ...getPageInfo(bidderRequest) + }; + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + consentRequired: bidderRequest.gdprConsent.gdprApplies, + addtlConsent: bidderRequest.gdprConsent.addtlConsent + }; + } + if (bidderRequest && bidderRequest.gppConsent) { + payload.gppConsent = { + consentString: bidderRequest.gppConsent.gppString, + applicableSections: bidderRequest.gppConsent.applicableSections + }; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.usPrivacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.ortb2) { + payload.ortb2 = bidderRequest.ortb2; + } + if (validBidRequests && validBidRequests.length !== 0 && validBidRequests[0].userIdAsEids) { + payload.userId = validBidRequests[0].userIdAsEids; + } + if (validBidRequests && validBidRequests.length !== 0 && validBidRequests[0].schain && isSchainValid(validBidRequests[0].schain)) { + payload.schain = validBidRequests[0].schain; + } + try { + if (storage.hasLocalStorage()) { + payload.onetagSid = storage.getDataFromLocalStorage('onetag_sid'); + } + } catch (e) {} + const connection = navigator.connection || navigator.webkitConnection; + payload.networkConnectionType = connection && connection.type ? connection.type : null; + payload.networkEffectiveConnectionType = connection && connection.effectiveType ? connection.effectiveType : null; + payload.fledgeEnabled = Boolean(bidderRequest?.paapi?.enabled); + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(payload) + }; +} +function interpretResponse(serverResponse, bidderRequest) { + const body = serverResponse.body; + const bids = []; + const requestData = JSON.parse(bidderRequest.data); + if (!body || body.nobid && body.nobid === true) { + return bids; + } + if (!body.fledgeAuctionConfigs && (!body.bids || !Array.isArray(body.bids) || body.bids.length === 0)) { + return bids; + } + Array.isArray(body.bids) && body.bids.forEach(bid => { + const responseBid = { + requestId: bid.requestId, + cpm: bid.cpm, + width: bid.width, + height: bid.height, + creativeId: bid.creativeId, + dealId: bid.dealId == null ? bid.dealId : '', + currency: bid.currency, + netRevenue: bid.netRevenue || false, + mediaType: bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE + NATIVE_SUFFIX ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE : bid.mediaType, + meta: { + mediaType: bid.mediaType, + advertiserDomains: bid.adomain + }, + ttl: bid.ttl || 300 + }; + if (bid.dsa) { + responseBid.meta.dsa = bid.dsa; + } + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + responseBid.ad = bid.ad; + } else if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + const { + context, + adUnitCode + } = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(requestData.bids, item => item.bidId === bid.requestId && item.type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO); + if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.INSTREAM) { + responseBid.vastUrl = bid.vastUrl; + responseBid.videoCacheKey = bid.videoCacheKey; + } else if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_4__.OUTSTREAM) { + responseBid.vastXml = bid.ad; + responseBid.vastUrl = bid.vastUrl; + if (bid.rendererUrl) { + responseBid.renderer = createRenderer({ + ...bid, + adUnitCode + }); + } + } + } else if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE || bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE + NATIVE_SUFFIX) { + responseBid.native = bid.native; + } + bids.push(responseBid); + }); + if (body.fledgeAuctionConfigs && Array.isArray(body.fledgeAuctionConfigs)) { + const fledgeAuctionConfigs = body.fledgeAuctionConfigs; + return { + bids, + paapi: fledgeAuctionConfigs + }; + } else { + return bids; + } +} +function createRenderer(bid) { + let rendererOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bid.requestId, + url: bid.rendererUrl, + config: rendererOptions, + adUnitCode: bid.adUnitCode, + loaded: false + }); + try { + renderer.setRender(_ref => { + let { + renderer, + width, + height, + vastXml, + adUnitCode + } = _ref; + renderer.push(() => { + window.onetag.Player.init({ + ...bid, + width, + height, + vastXml, + nodeId: adUnitCode, + config: renderer.getConfig() + }); + }); + }); + } catch (e) {} + return renderer; +} +function getFrameNesting() { + let topmostFrame = window; + let parent = window.parent; + try { + while (topmostFrame !== topmostFrame.parent) { + parent = topmostFrame.parent; + // eslint-disable-next-line no-unused-expressions + parent.location.href; + topmostFrame = topmostFrame.parent; + } + } catch (e) {} + return topmostFrame; +} +function getDocumentVisibility(window) { + try { + if (typeof window.document.hidden !== 'undefined') { + return window.document.hidden; + } else if (typeof window.document['msHidden'] !== 'undefined') { + return window.document['msHidden']; + } else if (typeof window.document['webkitHidden'] !== 'undefined') { + return window.document['webkitHidden']; + } else { + return null; + } + } catch (e) { + return null; + } +} + +/** + * Returns information about the page needed by the server in an object to be converted in JSON + * @returns {{location: *, referrer: (*|string), stack: (*|Array.), numIframes: (*|Number), wWidth: (*|Number), wHeight: (*|Number), sWidth, sHeight, date: string, timeOffset: number}} + */ +function getPageInfo(bidderRequest) { + const winDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getWinDimensions)(); + const topmostFrame = getFrameNesting(); + return { + location: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidderRequest, 'refererInfo.page', null), + referrer: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidderRequest, 'refererInfo.ref', null), + stack: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidderRequest, 'refererInfo.stack', []), + numIframes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidderRequest, 'refererInfo.numIframes', 0), + wWidth: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getWinDimensions)().innerWidth, + wHeight: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.getWinDimensions)().innerHeight, + oWidth: winDimensions.outerWidth, + oHeight: winDimensions.outerHeight, + sWidth: winDimensions.screen.width, + sHeight: winDimensions.screen.height, + aWidth: winDimensions.screen.availWidth, + aHeight: winDimensions.screen.availHeight, + sLeft: 'screenLeft' in topmostFrame ? topmostFrame.screenLeft : topmostFrame.screenX, + sTop: 'screenTop' in topmostFrame ? topmostFrame.screenTop : topmostFrame.screenY, + xOffset: topmostFrame.pageXOffset, + yOffset: topmostFrame.pageYOffset, + docHidden: getDocumentVisibility(topmostFrame), + docHeight: topmostFrame.document.body ? topmostFrame.document.body.scrollHeight : null, + hLength: history.length, + timing: getTiming(), + version: { + prebid: "9.45.0-pre", + adapter: '1.1.3' + } + }; +} +function requestsToBids(bidRequests) { + const videoBidRequests = bidRequests.filter(bidRequest => hasTypeVideo(bidRequest)).map(bidRequest => { + const videoObj = {}; + setGeneralInfo.call(videoObj, bidRequest); + // Pass parameters + // Context: instream - outstream - adpod + videoObj['context'] = bidRequest.mediaTypes.video.context; + // Sizes + videoObj['playerSize'] = parseVideoSize(bidRequest); + // Other params + videoObj['mediaTypeInfo'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(bidRequest.mediaTypes.video); + videoObj['type'] = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + videoObj['priceFloors'] = getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, videoObj['playerSize']); + return videoObj; + }); + const bannerBidRequests = bidRequests.filter(bidRequest => isValid(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, bidRequest)).map(bidRequest => { + const bannerObj = {}; + setGeneralInfo.call(bannerObj, bidRequest); + bannerObj['sizes'] = parseSizes(bidRequest); + bannerObj['type'] = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + bannerObj['mediaTypeInfo'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(bidRequest.mediaTypes.banner); + bannerObj['priceFloors'] = getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, bannerObj['sizes']); + return bannerObj; + }); + const nativeBidRequests = bidRequests.filter(bidRequest => isValid(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, bidRequest)).map(bidRequest => { + const nativeObj = {}; + setGeneralInfo.call(nativeObj, bidRequest); + nativeObj['sizes'] = parseSizes(bidRequest); + nativeObj['type'] = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE + NATIVE_SUFFIX; + nativeObj['mediaTypeInfo'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(bidRequest.mediaTypes.native); + if (!isNativeOrtbVersion(bidRequest)) { + const ortbConversion = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.toOrtbNativeRequest)(bidRequest.nativeParams); + nativeObj['mediaTypeInfo'] = {}; + nativeObj['mediaTypeInfo'].adTemplate = bidRequest.nativeParams.adTemplate; + nativeObj['mediaTypeInfo'].ortb = ortbConversion; + } + nativeObj['priceFloors'] = getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, nativeObj['sizes']); + return nativeObj; + }); + return videoBidRequests.concat(bannerBidRequests).concat(nativeBidRequests); +} +function isNativeOrtbVersion(bidRequest) { + return bidRequest.mediaTypes.native.ortb && typeof bidRequest.mediaTypes.native.ortb === 'object'; +} +function setGeneralInfo(bidRequest) { + const params = bidRequest.params; + this['adUnitCode'] = bidRequest.adUnitCode; + this['bidId'] = bidRequest.bidId; + this['bidderRequestId'] = bidRequest.bidderRequestId; + this['auctionId'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidRequest, 'ortb2.source.tid'); + this['transactionId'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidRequest, 'ortb2Imp.ext.tid'); + this['gpid'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidRequest, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidRequest, 'ortb2Imp.ext.data.pbadslot'); + this['pubId'] = params.pubId; + this['ext'] = params.ext; + this['ortb2Imp'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bidRequest, 'ortb2Imp'); + if (params.pubClick) { + this['click'] = params.pubClick; + } + if (params.dealId) { + this['dealId'] = params.dealId; + } + const coords = getSpaceCoords(bidRequest.adUnitCode); + if (coords) { + this['coords'] = coords; + } +} +function getSpaceCoords(id) { + const space = document.getElementById(id); + try { + const { + top, + left, + width, + height + } = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__.getBoundingClientRect)(space); + let window = space.ownerDocument.defaultView; + const coords = { + top: top + window.pageYOffset, + left: left + window.pageXOffset, + width, + height + }; + let frame = window.frameElement; + while (frame != null) { + const { + top, + left + } = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__.getBoundingClientRect)(frame); + coords.top += top + window.pageYOffset; + coords.left += left + window.pageXOffset; + window = window.parent; + frame = window.frameElement; + } + return coords; + } catch (e) { + return null; + } +} +function getTiming() { + try { + if (window.performance != null && window.performance.timing != null) { + const timing = {}; + const perf = window.performance.timing; + timing.pageLoadTime = perf.loadEventEnd - perf.navigationStart; + timing.connectTime = perf.responseEnd - perf.requestStart; + timing.renderTime = perf.domComplete - perf.domLoading; + return timing; + } + } catch (e) { + return null; + } + return null; +} +function parseVideoSize(bid) { + const playerSize = bid.mediaTypes.video.playerSize; + if (typeof playerSize !== 'undefined' && Array.isArray(playerSize) && playerSize.length > 0) { + return getSizes(playerSize); + } + return []; +} +function parseSizes(bid) { + let ret = []; + if (typeof bid.mediaTypes !== 'undefined' && typeof bid.mediaTypes.banner !== 'undefined' && typeof bid.mediaTypes.banner.sizes !== 'undefined' && Array.isArray(bid.mediaTypes.banner.sizes) && bid.mediaTypes.banner.sizes.length > 0) { + return getSizes(bid.mediaTypes.banner.sizes); + } + const isVideoBidRequest = hasTypeVideo(bid); + if (!isVideoBidRequest && bid.sizes && Array.isArray(bid.sizes)) { + return getSizes(bid.sizes); + } + return ret; +} +function getSizes(sizes) { + const ret = []; + for (let i = 0; i < sizes.length; i++) { + const size = sizes[i]; + ret.push({ + width: size[0], + height: size[1] + }); + } + return ret; +} +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + let syncs = []; + let params = ''; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params += '&gdpr=' + (gdprConsent.gdprApplies ? 1 : 0); + } + if (typeof gdprConsent.consentString === 'string') { + params += '&gdpr_consent=' + gdprConsent.consentString; + } + } + if (gppConsent) { + if (typeof gppConsent.gppString === 'string') { + params += '&gpp_consent=' + gppConsent.gppString; + } + } + if (uspConsent && typeof uspConsent === 'string') { + params += '&us_privacy=' + uspConsent; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: USER_SYNC_ENDPOINT + '?cb=' + new Date().getTime() + params + }); + } + if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: USER_SYNC_ENDPOINT + '?tag=img' + params + }); + } + return syncs; +} +function getBidFloor(bidRequest, mediaType, sizes) { + if (typeof bidRequest.getFloor !== 'function') return []; + const getFloorObject = size => { + const floorData = bidRequest.getFloor({ + currency: 'EUR', + mediaType: mediaType || '*', + size: size || '*' + }) || {}; + return { + ...floorData, + size: size ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.deepClone)(size) : undefined, + floor: floorData.floor != null ? floorData.floor : null + }; + }; + if (Array.isArray(sizes) && sizes.length > 0) { + return sizes.map(size => getFloorObject([size.width, size.height])); + } + return [getFloorObject('*')]; +} +function isSchainValid(schain) { + let isValid = false; + const requiredFields = ['asi', 'sid', 'hp']; + if (!schain || !schain.nodes) return isValid; + isValid = schain.nodes.reduce((status, node) => { + if (!status) return status; + return requiredFields.every(field => node.hasOwnProperty(field)); + }, true); + if (!isValid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)('OneTag: required schain params missing'); + } + return isValid; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid: isBidRequestValid, + buildRequests: buildRequests, + interpretResponse: interpretResponse, + getUserSyncs: getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('onetagBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/onetagBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["onomagicBidAdapter"],{ + +/***/ "./modules/onomagicBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/onomagicBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/percentInView/percentInView.js */ "./libraries/percentInView/percentInView.js"); + + + + + +const BIDDER_CODE = 'onomagic'; +const URL = 'https://bidder.onomagic.com/hb'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +function buildRequests(bidReqs, bidderRequest) { + try { + let referrer = ''; + if (bidderRequest && bidderRequest.refererInfo) { + referrer = bidderRequest.refererInfo.page; + } + const onomagicImps = []; + const publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('publisherId', bidReqs[0].params); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(bidReqs, function (bid) { + let bidSizes = bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes || bid.sizes; + bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidSizes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidSizes[0]) ? bidSizes : [bidSizes]; + bidSizes = bidSizes.filter(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size)); + const processedSizes = bidSizes.map(size => ({ + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + })); + const element = document.getElementById(bid.adUnitCode); + const minSize = _getMinSize(processedSizes); + const viewabilityAmount = _isViewabilityMeasurable(element) ? _getViewability(element, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(), minSize) : 'na'; + const viewabilityAmountRounded = isNaN(viewabilityAmount) ? viewabilityAmount : Math.round(viewabilityAmount); + const imp = { + id: bid.bidId, + banner: { + format: processedSizes, + ext: { + viewability: viewabilityAmountRounded + } + }, + tagid: String(bid.adUnitCode) + }; + const bidFloor = _getBidFloor(bid); + if (bidFloor) { + imp.bidfloor = bidFloor; + } + onomagicImps.push(imp); + }); + const onomagicBidReq = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getUniqueIdentifierStr)(), + imp: onomagicImps, + site: { + // TODO: does the fallback make sense here? + domain: bidderRequest?.refererInfo?.domain || window.location.host, + page: referrer, + publisher: { + id: publisherId + } + }, + device: { + devicetype: _getDeviceType(), + w: screen.width, + h: screen.height + }, + tmax: bidderRequest?.timeout + }; + return { + method: 'POST', + url: URL, + data: JSON.stringify(onomagicBidReq), + options: { + contentType: 'text/plain', + withCredentials: false + } + }; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(e, { + bidReqs, + bidderRequest + }); + } +} +function isBidRequestValid(bid) { + if (bid.bidder !== BIDDER_CODE || typeof bid.params === 'undefined') { + return false; + } + if (typeof bid.params.publisherId === 'undefined') { + return false; + } + return true; +} +function interpretResponse(serverResponse) { + if (!serverResponse.body || typeof serverResponse.body != 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Onomagic server returned empty/non-json response: ' + JSON.stringify(serverResponse.body)); + return []; + } + const { + body: { + id, + seatbid + } + } = serverResponse; + try { + const onomagicBidResponses = []; + if (id && seatbid && seatbid.length > 0 && seatbid[0].bid && seatbid[0].bid.length > 0) { + seatbid[0].bid.map(onomagicBid => { + onomagicBidResponses.push({ + requestId: onomagicBid.impid, + cpm: parseFloat(onomagicBid.price), + width: parseInt(onomagicBid.w), + height: parseInt(onomagicBid.h), + creativeId: onomagicBid.crid || onomagicBid.id, + currency: 'USD', + netRevenue: true, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + ad: _getAdMarkup(onomagicBid), + ttl: 60, + meta: { + advertiserDomains: onomagicBid && onomagicBid.adomain ? onomagicBid.adomain : [] + } + }); + }); + } + return onomagicBidResponses; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(e, { + id, + seatbid + }); + } +} + +// Don't do user sync for now +function getUserSyncs(syncOptions, responses, gdprConsent) { + return []; +} +function _isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +function _isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +function _getDeviceType() { + return _isMobile() ? 1 : _isConnectedTV() ? 3 : 2; +} +function _getAdMarkup(bid) { + let adm = bid.adm; + if ('nurl' in bid) { + adm += (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(bid.nurl); + } + return adm; +} +function _isViewabilityMeasurable(element) { + return !_isIframe() && element !== null; +} +function _getViewability(element, topWin) { + let { + w, + h + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)().document.visibilityState === 'visible' ? (0,_libraries_percentInView_percentInView_js__WEBPACK_IMPORTED_MODULE_2__.percentInView)(element, { + w, + h + }) : 0; +} +function _isIframe() { + try { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowSelf)() !== (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)(); + } catch (e) { + return true; + } +} +function _getMinSize(sizes) { + return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min); +} +function _getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return bid.params.bidFloor ? bid.params.bidFloor : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('onomagicBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","percentInView","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/onomagicBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ooloAnalyticsAdapter"],{ + +/***/ "./modules/ooloAnalyticsAdapter.js": +/*!*****************************************!*\ + !*** ./modules/ooloAnalyticsAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PAGEVIEW_ID, buildAuctionData, generatePageViewId */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_getOrigin_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/getOrigin/index.js */ "./libraries/getOrigin/index.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + + + +const baseUrl = 'https://pbdata.oolo.io/'; +const ENDPOINTS = { + CONFIG: 'https://config-pbdata.oolo.io', + PAGE_DATA: baseUrl + 'page', + AUCTION: baseUrl + 'auctionData', + BID_WON: baseUrl + 'bidWonData', + AD_RENDER_FAILED: baseUrl + 'adRenderFailedData', + RAW: baseUrl + 'raw', + HBCONFIG: baseUrl + 'hbconfig' +}; +const pbModuleVersion = '1.0.0'; +const prebidVersion = "9.45.0-pre"; +const analyticsType = 'endpoint'; +const ADAPTER_CODE = 'oolo'; +const AUCTION_END_SEND_TIMEOUT = 1500; +const PAGEVIEW_ID = +generatePageViewId(); +const { + AUCTION_INIT, + AUCTION_END, + BID_REQUESTED, + BID_RESPONSE, + NO_BID, + BID_WON, + BID_TIMEOUT, + AD_RENDER_FAILED +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const SERVER_EVENTS = { + AUCTION: 'auction', + WON: 'bidWon', + AD_RENDER_FAILED: 'adRenderFailed' +}; +const SERVER_BID_STATUS = { + NO_BID: 'noBid', + BID_REQUESTED: 'bidRequested', + BID_RECEIVED: 'bidReceived', + BID_TIMEDOUT: 'bidTimedOut', + BID_WON: 'bidWon' +}; +let auctions = {}; +let initOptions = {}; +let eventsQueue = []; +const onAuctionInit = args => { + const { + auctionId, + adUnits, + timestamp + } = args; + let auction = auctions[auctionId] = { + ...args, + adUnits: {}, + auctionStart: timestamp, + _sentToServer: false + }; + handleCustomFields(auction, AUCTION_INIT, args); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(adUnits, adUnit => { + auction.adUnits[adUnit.code] = { + ...adUnit, + auctionId, + adunid: adUnit.code, + bids: {} + }; + }); +}; +const onBidRequested = args => { + const { + auctionId, + bids, + start, + timeout + } = args; + const _start = start || Date.now(); + const auction = auctions[auctionId]; + const auctionAdUnits = auction.adUnits; + bids.forEach(bid => { + const { + adUnitCode + } = bid; + const bidId = parseBidId(bid); + auctionAdUnits[adUnitCode].bids[bidId] = { + ...bid, + timeout, + start: _start, + rs: _start - auction.auctionStart, + bidStatus: SERVER_BID_STATUS.BID_REQUESTED + }; + }); +}; +const onBidResponse = args => { + const { + auctionId, + adUnitCode + } = args; + const auction = auctions[auctionId]; + const bidId = parseBidId(args); + let bid = auction.adUnits[adUnitCode].bids[bidId]; + Object.assign(bid, args, { + bidStatus: SERVER_BID_STATUS.BID_RECEIVED, + end: args.responseTimestamp, + re: args.responseTimestamp - auction.auctionStart + }); +}; +const onNoBid = args => { + const { + auctionId, + adUnitCode + } = args; + const bidId = parseBidId(args); + const end = Date.now(); + const auction = auctions[auctionId]; + let bid = auction.adUnits[adUnitCode].bids[bidId]; + Object.assign(bid, args, { + bidStatus: SERVER_BID_STATUS.NO_BID, + end, + re: end - auction.auctionStart + }); +}; +const onBidWon = args => { + const { + auctionId, + adUnitCode + } = args; + const bidId = parseBidId(args); + const bid = auctions[auctionId].adUnits[adUnitCode].bids[bidId]; + Object.assign(bid, args, { + bidStatus: SERVER_BID_STATUS.BID_WON, + isW: true, + isH: true + }); + if (auctions[auctionId]._sentToServer) { + const payload = { + auctionId, + adunid: adUnitCode, + bid: mapBid(bid, BID_WON) + }; + sendEvent(SERVER_EVENTS.WON, payload); + } +}; +const onBidTimeout = args => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(args, bid => { + const { + auctionId, + adUnitCode + } = bid; + const bidId = parseBidId(bid); + let bidCache = auctions[auctionId].adUnits[adUnitCode].bids[bidId]; + Object.assign(bidCache, bid, { + bidStatus: SERVER_BID_STATUS.BID_TIMEDOUT + }); + }); +}; +const onAuctionEnd = args => { + const { + auctionId, + adUnits, + ...restAuctionEnd + } = args; + Object.assign(auctions[auctionId], restAuctionEnd, { + auctionEnd: args.auctionEnd || Date.now() + }); + + // wait for bidWon before sending to server + setTimeout(() => { + auctions[auctionId]._sentToServer = true; + const finalAuctionData = buildAuctionData(auctions[auctionId]); + sendEvent(SERVER_EVENTS.AUCTION, finalAuctionData); + }, initOptions.serverConfig.BID_WON_TIMEOUT || AUCTION_END_SEND_TIMEOUT); +}; +const onAdRenderFailed = args => { + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(args); + data.timestamp = Date.now(); + if (data.bid) { + data.bid = mapBid(data.bid, AD_RENDER_FAILED); + } + sendEvent(SERVER_EVENTS.AD_RENDER_FAILED, data); +}; +var ooloAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + // wait for server configuration before processing the events + if (typeof initOptions.serverConfig !== 'undefined' && eventsQueue.length === 0) { + handleEvent(eventType, args); + } else { + eventsQueue.push({ + eventType, + args + }); + } + } +}); +function handleEvent(eventType, args) { + try { + const { + sendRaw + } = initOptions.serverConfig.events[eventType]; + if (sendRaw) { + sendEvent(eventType, args, true); + } + } catch (e) {} + switch (eventType) { + case AUCTION_INIT: + onAuctionInit(args); + break; + case BID_REQUESTED: + onBidRequested(args); + break; + case NO_BID: + onNoBid(args); + break; + case BID_RESPONSE: + onBidResponse(args); + break; + case BID_WON: + onBidWon(args); + break; + case BID_TIMEOUT: + onBidTimeout(args); + break; + case AUCTION_END: + onAuctionEnd(args); + break; + case AD_RENDER_FAILED: + onAdRenderFailed(args); + break; + } +} +function sendEvent(eventType, args, isRaw) { + let data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(args); + Object.assign(data, buildCommonDataProperties(), { + eventType + }); + if (isRaw) { + let rawEndpoint; + try { + const { + endpoint, + omitRawFields + } = initOptions.serverConfig.events[eventType]; + rawEndpoint = endpoint; + handleCustomRawFields(data, omitRawFields); + } catch (e) {} + ajaxCall(rawEndpoint || ENDPOINTS.RAW, () => {}, JSON.stringify(data)); + } else { + let endpoint; + if (eventType === SERVER_EVENTS.AD_RENDER_FAILED) { + endpoint = ENDPOINTS.AD_RENDER_FAILED; + } else if (eventType === SERVER_EVENTS.WON) { + endpoint = ENDPOINTS.BID_WON; + } else { + endpoint = ENDPOINTS.AUCTION; + } + ajaxCall(endpoint, () => {}, JSON.stringify(data)); + } +} +function checkEventsQueue() { + while (eventsQueue.length) { + const event = eventsQueue.shift(); + handleEvent(event.eventType, event.args); + } +} +function buildAuctionData(auction) { + const auctionData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(auction); + const keysToRemove = ['adUnitCodes', 'auctionStatus', 'bidderRequests', 'bidsReceived', 'noBids', 'winningBids', 'timestamp', 'config']; + keysToRemove.forEach(key => { + delete auctionData[key]; + }); + handleCustomFields(auctionData, AUCTION_END, auction); + + // turn bids object into array of objects + Object.keys(auctionData.adUnits).forEach(adUnit => { + const adUnitObj = auctionData.adUnits[adUnit]; + adUnitObj.bids = Object.keys(adUnitObj.bids).map(key => mapBid(adUnitObj.bids[key])); + delete adUnitObj['adUnitCode']; + delete adUnitObj['code']; + delete adUnitObj['transactionId']; + }); + + // turn adUnits objects into array of adUnits + auctionData.adUnits = Object.keys(auctionData.adUnits).map(key => auctionData.adUnits[key]); + return auctionData; +} +function buildCommonDataProperties() { + return { + pvid: PAGEVIEW_ID, + pid: initOptions.pid, + pbModuleVersion + }; +} +function buildLogMessage(message) { + return `oolo: ${message}`; +} +function parseBidId(bid) { + return bid.bidId || bid.requestId; +} +function mapBid(_ref2, eventType) { + let { + bidStatus, + start, + end, + mediaType, + creativeId, + originalCpm, + originalCurrency, + source, + netRevenue, + currency, + width, + height, + timeToRespond, + responseTimestamp, + ...rest + } = _ref2; + const bidObj = { + bst: bidStatus, + s: start, + e: responseTimestamp || end, + mt: mediaType, + crId: creativeId, + oCpm: originalCpm, + oCur: originalCurrency, + src: source, + nrv: netRevenue, + cur: currency, + w: width, + h: height, + ttr: timeToRespond, + ...rest + }; + delete bidObj['bidRequestsCount']; + delete bidObj['bidderRequestId']; + delete bidObj['bidderRequestsCount']; + delete bidObj['bidderWinsCount']; + delete bidObj['schain']; + delete bidObj['refererInfo']; + delete bidObj['statusMessage']; + delete bidObj['status']; + delete bidObj['adUrl']; + delete bidObj['ad']; + delete bidObj['usesGenericKeys']; + delete bidObj['requestTimestamp']; + try { + handleCustomFields(bidObj, eventType || BID_RESPONSE, rest); + } catch (e) {} + return bidObj; +} +function handleCustomFields(obj, eventType, args) { + try { + const { + pickFields, + omitFields + } = initOptions.serverConfig.events[eventType]; + if (pickFields && obj && args) { + Object.assign(obj, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(args, pickFields)); + } + if (omitFields && obj && args) { + omitFields.forEach(field => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(obj, field, undefined); + }); + } + } catch (e) {} +} +function handleCustomRawFields(obj, omitRawFields) { + try { + if (omitRawFields && obj) { + omitRawFields.forEach(field => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(obj, field, undefined); + }); + } + } catch (e) {} +} +function getServerConfig() { + const defaultConfig = { + events: {} + }; + ajaxCall(ENDPOINTS.CONFIG + '?pid=' + initOptions.pid, { + success: function (data) { + try { + initOptions.serverConfig = JSON.parse(data) || defaultConfig; + } catch (e) { + initOptions.serverConfig = defaultConfig; + } + checkEventsQueue(); + }, + error: function () { + initOptions.serverConfig = defaultConfig; + checkEventsQueue(); + } + }, null); +} +function sendPage() { + setTimeout(() => { + const payload = { + timestamp: Date.now(), + screenWidth: window.screen.width, + screenHeight: window.screen.height, + url: window.location.href, + protocol: window.location.protocol, + origin: (0,_libraries_getOrigin_index_js__WEBPACK_IMPORTED_MODULE_4__.getOrigin)(), + referrer: getTopWindowReferrer(), + pbVersion: prebidVersion + }; + Object.assign(payload, buildCommonDataProperties(), getPagePerformance()); + ajaxCall(ENDPOINTS.PAGE_DATA, () => {}, JSON.stringify(payload)); + }, 0); +} +function sendHbConfigData() { + const conf = {}; + const pbjsConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig(); + // Check if pbjsConfig.userSync exists and has userIds property + if (pbjsConfig.userSync && pbjsConfig.userSync.userIds) { + // Delete the userIds property + delete pbjsConfig.userSync.userIds; + } + Object.keys(pbjsConfig).forEach(key => { + if (key[0] !== '_') { + conf[key] = pbjsConfig[key]; + } + }); + ajaxCall(ENDPOINTS.HBCONFIG, () => {}, JSON.stringify(conf)); +} +function getPagePerformance() { + let timing; + try { + timing = window.top.performance.timing; + } catch (e) {} + if (!timing) { + return; + } + const { + navigationStart, + domContentLoadedEventEnd, + loadEventEnd + } = timing; + const domContentLoadTime = domContentLoadedEventEnd - navigationStart; + const pageLoadTime = loadEventEnd - navigationStart; + return { + domContentLoadTime, + pageLoadTime + }; +} +function getTopWindowReferrer() { + try { + return window.top.document.referrer; + } catch (e) { + return ''; + } +} +function generatePageViewId() { + let min = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10000; + let max = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 90000; + var randomNumber = Math.floor(Math.random() * max + min); + var currentdate = new Date(); + var currentTime = { + getDate: currentdate.getDate(), + getMonth: currentdate.getMonth(), + getFullYear: currentdate.getFullYear(), + getHours: currentdate.getHours(), + getMinutes: currentdate.getMinutes(), + getSeconds: currentdate.getSeconds(), + getMilliseconds: currentdate.getMilliseconds() + }; + return (currentTime.getDate <= 9 ? '0' + currentTime.getDate : currentTime.getDate) + '' + (currentTime.getMonth + 1 <= 9 ? '0' + (currentTime.getMonth + 1) : currentTime.getMonth + 1) + '' + currentTime.getFullYear % 100 + '' + (currentTime.getHours <= 9 ? '0' + currentTime.getHours : currentTime.getHours) + '' + (currentTime.getMinutes <= 9 ? '0' + currentTime.getMinutes : currentTime.getMinutes) + '' + (currentTime.getSeconds <= 9 ? '0' + currentTime.getSeconds : currentTime.getSeconds) + '' + (currentTime.getMilliseconds % 100 <= 9 ? '0' + currentTime.getMilliseconds % 100 : currentTime.getMilliseconds % 100) + '' + randomNumber; +} +function ajaxCall(endpoint, callback, data) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + if (data) { + options.contentType = 'application/json'; + } + return (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(endpoint, callback, data, options); +} +ooloAdapter.originEnableAnalytics = ooloAdapter.enableAnalytics; +ooloAdapter.enableAnalytics = function (config) { + ooloAdapter.originEnableAnalytics(config); + initOptions = config ? config.options : {}; + if (!initOptions.pid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(buildLogMessage('enableAnalytics missing config object with "pid"')); + return; + } + getServerConfig(); + sendHbConfigData(); + if (document.readyState === 'complete') { + sendPage(); + } else { + window.addEventListener('load', sendPage); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(buildLogMessage('enabled analytics adapter'), config); + ooloAdapter.enableAnalytics = function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(buildLogMessage('Analytics adapter already enabled..')); + }; +}; +ooloAdapter.originDisableAnalytics = ooloAdapter.disableAnalytics; +ooloAdapter.disableAnalytics = function () { + auctions = {}; + initOptions = {}; + ooloAdapter.originDisableAnalytics(); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: ooloAdapter, + code: ADAPTER_CODE +}); + +// export for testing + +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (ooloAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('ooloAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","getOrigin","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ooloAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["opaMarketplaceBidAdapter"],{ + +/***/ "./modules/opaMarketplaceBidAdapter.js": +/*!*********************************************!*\ + !*** ./modules/opaMarketplaceBidAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, createDomain, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/vidazooUtils/bidderUtils.js */ "./libraries/vidazooUtils/bidderUtils.js"); + + + + + +const DEFAULT_SUB_DOMAIN = 'exchange'; +const BIDDER_CODE = 'opamarketplace'; +const BIDDER_VERSION = '1.0.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function createDomain() { + let subDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SUB_DOMAIN; + return `https://${subDomain}.opamarketplace.com`; +} +function createUniqueRequestData(hashUrl, bid) { + const { + auctionId, + transactionId + } = bid; + return { + auctionId, + transactionId + }; +} +const buildRequests = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createBuildRequestsFn)(createDomain, createUniqueRequestData, storage, BIDDER_CODE, BIDDER_VERSION, false); +const interpretResponse = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createInterpretResponseFn)(BIDDER_CODE, false); +const getUserSyncs = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createUserSyncGetter)({ + iframeSyncUrl: 'https://sync.opamarketplace.com/api/sync/iframe', + imageSyncUrl: 'https://sync.opamarketplace.com/api/sync/image' +}); +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + onBidWon: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.onBidWon +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('opaMarketplaceBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","vidazooUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/opaMarketplaceBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["open8BidAdapter"],{ + +/***/ "./modules/open8BidAdapter.js": +/*!************************************!*\ + !*** ./modules/open8BidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + + +const BIDDER_CODE = 'open8'; +const URL = 'https://as.vt.open8.com/v1/control/prebid'; +const AD_TYPE = { + VIDEO: 1, + BANNER: 2 +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.slotKey; + }, + buildRequests: function (validBidRequests, bidderRequest) { + var requests = []; + for (var i = 0; i < validBidRequests.length; i++) { + var bid = validBidRequests[i]; + var queryString = ''; + var slotKey = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('slotKey', bid.params); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'slot_key', slotKey); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'imp_id', generateImpId()); + queryString += 'bid_id=' + bid.bidId; + requests.push({ + method: 'GET', + url: URL, + data: queryString + }); + } + return requests; + }, + interpretResponse: function (serverResponse, request) { + var bidderResponse = serverResponse.body; + if (!bidderResponse.isAdReturn) { + return []; + } + var ad = bidderResponse.ad; + const bid = { + slotKey: bidderResponse.slotKey, + userId: bidderResponse.userId, + impId: bidderResponse.impId, + media: bidderResponse.media, + ds: ad.ds, + spd: ad.spd, + fa: ad.fa, + pr: ad.pr, + mr: ad.mr, + nurl: ad.nurl, + requestId: ad.bidId, + cpm: ad.price, + creativeId: ad.creativeId, + dealId: ad.dealId, + currency: ad.currency || 'JPY', + netRevenue: true, + ttl: 360, + // 6 minutes + meta: { + advertiserDomains: ad.adomain || [] + } + }; + if (ad.adType === AD_TYPE.VIDEO) { + const videoAd = bidderResponse.ad.video; + Object.assign(bid, { + vastXml: videoAd.vastXml, + width: videoAd.w, + height: videoAd.h, + renderer: newRenderer(bidderResponse), + adResponse: bidderResponse, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO + }); + } else if (ad.adType === AD_TYPE.BANNER) { + const bannerAd = bidderResponse.ad.banner; + Object.assign(bid, { + width: bannerAd.w, + height: bannerAd.h, + ad: bannerAd.adm, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER + }); + if (bannerAd.imps) { + try { + bannerAd.imps.forEach(impTrackUrl => { + const tracker = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.createTrackPixelHtml)(impTrackUrl); + bid.ad += tracker; + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error appending imp tracking pixel', error); + } + } + } + return [bid]; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (syncOptions.iframeEnabled && serverResponses.length) { + const syncIFs = serverResponses[0].body.syncIFs; + if (syncIFs) { + syncIFs.forEach(sync => { + syncs.push({ + type: 'iframe', + url: sync + }); + }); + } + } + if (syncOptions.pixelEnabled && serverResponses.length) { + const syncPixs = serverResponses[0].body.syncPixels; + if (syncPixs) { + syncPixs.forEach(sync => { + syncs.push({ + type: 'image', + url: sync + }); + }); + } + } + return syncs; + }, + onBidWon: function (bid) { + if (!bid.nurl) { + return; + } + const winUrl = bid.nurl.replace(/\$\{AUCTION_PRICE\}/, bid.cpm); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(winUrl, null); + } +}; +function generateImpId() { + var l = 16; + var c = 'abcdefghijklmnopqrstuvwsyz0123456789'; + var cl = c.length; + var r = ''; + for (var i = 0; i < l; i++) { + r += c[Math.floor(Math.random() * cl)]; + } + return r; +} +function newRenderer(bidderResponse) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__.Renderer.install({ + id: bidderResponse.ad.bidId, + url: bidderResponse.ad.video.purl, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Prebid Error calling setRender on newRenderer', err); + } + return renderer; +} +function outstreamRender(bid) { + bid.renderer.push(() => { + window.op8.renderPrebid({ + vastXml: bid.vastXml, + adUnitCode: bid.adUnitCode, + slotKey: bid.slotKey, + impId: bid.impId, + userId: bid.userId, + media: bid.media, + ds: bid.ds, + spd: bid.spd, + fa: bid.fa, + pr: bid.pr, + mr: bid.mr, + adResponse: bid.adResponse, + mediaType: bid.mediaType + }); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('open8BidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/open8BidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["openPairIdSystem"],{ + +/***/ "./modules/openPairIdSystem.js": +/*!*************************************!*\ + !*** ./modules/openPairIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, openPairIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/consentHandler.js */ "./src/consentHandler.js"); + +/** + * This module adds Open PAIR Id to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/openPairIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + */ + +const MODULE_NAME = 'openPairId'; +const DEFAULT_PUBLISHER_ID_KEY = 'pairId'; +const DEFAULT_STORAGE_PUBLISHER_ID_KEYS = { + liveramp: '_lr_pairId' +}; +const DEFAULT_ATYPE = 3; +const DEFAULT_SOURCE = 'pair-protocol.com'; +const MATCH_METHOD = 3; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function publisherIdFromLocalStorage(key) { + return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(key) : null; +} +function publisherIdFromCookie(key) { + return storage.cookiesAreEnabled() ? storage.getCookie(key) : null; +} + +/** @type {Submodule} */ +const openPairIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * used to specify vendor id + * @type {number} + */ + gvlid: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__.VENDORLESS_GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { string | undefined } value + * @returns {{pairId:string} | undefined } + */ + decode(value) { + return value && Array.isArray(value) ? { + 'openPairId': value + } : undefined; + }, + /** + * Performs action to obtain ID and return a value in the callback's response argument. + * @function getId + * @param {Object} config - The configuration object. + * @param {Object} config.params - The parameters from the configuration. + * @returns {{id: string[] | undefined}} The obtained IDs or undefined if no IDs are found. + */ + getId(config) { + const publisherIdsString = publisherIdFromLocalStorage(DEFAULT_PUBLISHER_ID_KEY) || publisherIdFromCookie(DEFAULT_PUBLISHER_ID_KEY); + let ids = []; + if (publisherIdsString && typeof publisherIdsString == 'string') { + try { + ids = ids.concat(JSON.parse(atob(publisherIdsString))); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(error); + } + } + const configParams = config && config.params ? config.params : {}; + const cleanRooms = Object.keys(configParams); + for (let i = 0; i < cleanRooms.length; i++) { + const cleanRoom = cleanRooms[i]; + const cleanRoomParams = configParams[cleanRoom]; + const cleanRoomStorageLocation = cleanRoomParams.storageKey || DEFAULT_STORAGE_PUBLISHER_ID_KEYS[cleanRoom]; + const cleanRoomValue = publisherIdFromLocalStorage(cleanRoomStorageLocation) || publisherIdFromCookie(cleanRoomStorageLocation); + if (cleanRoomValue) { + try { + const parsedValue = atob(cleanRoomValue); + if (parsedValue) { + const obj = JSON.parse(parsedValue); + if (obj && typeof obj === 'object' && obj.envelope) { + ids = ids.concat(obj.envelope); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Open Pair ID: Parsed object is not valid or does not contain envelope'); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Open Pair ID: Decoded value is empty'); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Open Pair ID: Error parsing JSON: ', error); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Open Pair ID: data clean room value for pairId from storage is empty or null'); + } + } + if (ids.length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Open Pair ID: no ids found'); + return undefined; + } + return { + 'id': ids + }; + }, + eids: { + openPairId: function (values) { + let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const inserter = config.inserter; + const matcher = config.matcher; + const source = DEFAULT_SOURCE; + const atype = DEFAULT_ATYPE; + return [{ + source: source, + mm: MATCH_METHOD, + inserter: inserter, + matcher: matcher, + uids: values.map(function (value) { + return { + id: value, + atype: atype + }; + }) + }]; + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', openPairIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('openPairIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/openPairIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["openwebBidAdapter"],{ + +/***/ "./modules/openwebBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/openwebBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/riseUtils/index.js */ "./libraries/riseUtils/index.js"); + + + + +const BIDDER_CODE = 'openweb'; +const BASE_URL = 'https://hb.openwebmp.com/'; +const GVLID = 280; +const MODES = { + PRODUCTION: 'hb-multi', + TEST: 'hb-multi-test' +}; +const spec = { + ...(0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.makeBaseSpec)(BASE_URL, MODES), + code: BIDDER_CODE, + gvlid: GVLID, + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('no params have been set to OpenWeb adapter'); + return false; + } + if (!bidRequest.params.org) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('org is a mandatory param for OpenWeb adapter'); + return false; + } + if (!bidRequest.params.placementId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('placementId is a mandatory param for OpenWeb adapter'); + return false; + } + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('openwebBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["riseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/openwebBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["openxBidAdapter"],{ + +/***/ "./modules/openxBidAdapter.js": +/*!************************************!*\ + !*** ./modules/openxBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports REQUEST_URL, SYNC_URL, DEFAULT_PH, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + +const bidderConfig = 'hb_pb_ortb'; +const bidderVersion = '2.0'; +const REQUEST_URL = 'https://rtb.openx.net/openrtbb/prebidjs'; +const SYNC_URL = 'https://u.openx.net/w/1.0/pd'; +const DEFAULT_PH = '2d1251ae-7f3a-47cf-bd2a-2f288854a0ba'; +const spec = { + code: 'openx', + gvlid: 69, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + nativeRequest: { + eventtrackers: [{ + event: 1, + methods: [1, 2] + }] + } + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(imp, { + tagid: bidRequest.params.unit, + ext: { + divid: bidRequest.adUnitCode + } + }); + if (bidRequest.params.customParams) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'ext.customParams', bidRequest.params.customParams); + } + if (bidRequest.params.customFloor && !imp.bidfloor) { + imp.bidfloor = bidRequest.params.customFloor; + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(req, { + at: 1, + ext: { + bc: `${bidderConfig}_${bidderVersion}`, + pv: "9.45.0-pre" + } + }); + const bid = context.bidRequests[0]; + if (bid.params.coppa) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'regs.coppa', 1); + } + if (bid.params.doNotTrack) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'device.dnt', 1); + } + if (bid.params.platform) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'ext.platform', bid.params.platform); + } + if (bid.params.delDomain) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'ext.delDomain', bid.params.delDomain); + } + if (bid.params.response_template_name) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'ext.response_template_name', bid.params.response_template_name); + } + if (bid.params.test) { + req.test = 1; + } + return req; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + if (bid.ext) { + bidResponse.meta.networkId = bid.ext.dsp_id; + bidResponse.meta.advertiserId = bid.ext.buyer_id; + bidResponse.meta.brandId = bid.ext.brand_id; + } + return bidResponse; + }, + response(buildResponse, bidResponses, ortbResponse, context) { + // pass these from request to the responses for use in userSync + const { + ortbRequest + } = context; + if (ortbRequest.ext) { + if (ortbRequest.ext.delDomain) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(ortbResponse, 'ext.delDomain', ortbRequest.ext.delDomain); + } + if (ortbRequest.ext.platform) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(ortbResponse, 'ext.platform', ortbRequest.ext.platform); + } + } + const response = buildResponse(bidResponses, ortbResponse, context); + // TODO: we may want to standardize this and move fledge logic to ortbConverter + let fledgeAuctionConfigs = _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](ortbResponse, 'ext.fledge_auction_configs'); + if (fledgeAuctionConfigs) { + fledgeAuctionConfigs = Object.entries(fledgeAuctionConfigs).map(_ref => { + let [bidId, cfg] = _ref; + return { + bidId, + config: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(Object.assign({}, cfg), { + auctionSignals: { + ortb2Imp: context.impContext[bidId]?.imp + } + }) + }; + }); + return { + bids: response.bids, + paapi: fledgeAuctionConfigs + }; + } else { + return response; + } + }, + overrides: { + imp: { + bidfloor(setBidFloor, imp, bidRequest, context) { + // enforce floors should always be in USD + // TODO: does it make sense that request.cur can be any currency, but request.imp[].bidfloorcur must be USD? + const floor = {}; + setBidFloor(floor, bidRequest, { + ...context, + currency: 'USD' + }); + if (floor.bidfloorcur === 'USD') { + Object.assign(imp, floor); + } + }, + video(orig, imp, bidRequest, context) { + if (true) { + // `orig` is the video imp processor, which looks at bidRequest.mediaTypes[VIDEO] + // to populate imp.video + // alter its input `bidRequest` to also pick up parameters from `bidRequest.params` + let videoParams = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; + if (videoParams) { + videoParams = Object.assign({}, videoParams, bidRequest.params.video); + bidRequest = { + ...bidRequest, + mediaTypes: { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]: videoParams + } + }; + } + orig(imp, bidRequest, context); + } + } + } + } +}); +function isBidRequestValid(bidRequest) { + const hasDelDomainOrPlatform = bidRequest.params.delDomain || bidRequest.params.platform; + if (_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, 'mediaTypes.banner') && hasDelDomainOrPlatform) { + return !!bidRequest.params.unit || _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, 'mediaTypes.banner.sizes.length') > 0; + } + return !!(bidRequest.params.unit && hasDelDomainOrPlatform); +} +function buildRequests(bidRequests, bidderRequest) { + let videoRequests = bidRequests.filter(bidRequest => isVideoBidRequest(bidRequest)); + let bannerAndNativeRequests = bidRequests.filter(bidRequest => isBannerBidRequest(bidRequest) || isNativeBidRequest(bidRequest)) + // In case of multi-format bids remove `video` from mediaTypes as for video a separate bid request is built + .map(bid => ({ + ...bid, + mediaTypes: { + ...bid.mediaTypes, + video: undefined + } + })); + let requests = bannerAndNativeRequests.length ? [createRequest(bannerAndNativeRequests, bidderRequest, null)] : []; + videoRequests.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)); + }); + return requests; +} +function createRequest(bidRequests, bidderRequest, mediaType) { + return { + method: 'POST', + url: _src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('openxOrtbUrl') || REQUEST_URL, + data: converter.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }) + }; +} +function isVideoBidRequest(bidRequest) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, 'mediaTypes.video'); +} +function isNativeBidRequest(bidRequest) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, 'mediaTypes.native'); +} +function isBannerBidRequest(bidRequest) { + const isNotVideoOrNativeBid = !isVideoBidRequest(bidRequest) && !isNativeBidRequest(bidRequest); + return _src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"](bidRequest, 'mediaTypes.banner') || isNotVideoOrNativeBid; +} +function interpretResponse(resp, req) { + if (!resp.body) { + resp.body = { + nbr: 0 + }; + } + return converter.fromORTB({ + request: req.data, + response: resp.body + }); +} + +/** + * @param syncOptions + * @param responses + * @param gdprConsent + * @param uspConsent + * @return {{type: (string), url: (*|string)}[]} + */ +function getUserSyncs(syncOptions, responses, gdprConsent, uspConsent) { + if (syncOptions.iframeEnabled || syncOptions.pixelEnabled) { + let pixelType = syncOptions.iframeEnabled ? 'iframe' : 'image'; + let queryParamStrings = []; + let syncUrl = SYNC_URL; + if (gdprConsent) { + queryParamStrings.push('gdpr=' + (gdprConsent.gdprApplies ? 1 : 0)); + queryParamStrings.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } + if (uspConsent) { + queryParamStrings.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + if (responses.length > 0 && responses[0].body && responses[0].body.ext) { + const ext = responses[0].body.ext; + if (ext.delDomain) { + syncUrl = `https://${ext.delDomain}/w/1.0/pd`; + } else if (ext.platform) { + queryParamStrings.push('ph=' + ext.platform); + } + } else { + queryParamStrings.push('ph=' + DEFAULT_PH); + } + return [{ + type: pixelType, + url: `${syncUrl}${queryParamStrings.length > 0 ? '?' + queryParamStrings.join('&') : ''}` + }]; + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('openxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/openxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["operaadsBidAdapter"],{ + +/***/ "./modules/operaadsBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/operaadsBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ +const BIDDER_CODE = 'operaads'; +const ENDPOINT = 'https://s.adx.opera.com/ortb/v2/'; +const USER_SYNC_ENDPOINT = 'https://s.adx.opera.com/usersync/page'; +const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_LANGUAGE = 'en'; +const NET_REVENUE = true; +const BANNER_DEFAULTS = { + SIZE: [300, 250] +}; +const VIDEO_DEFAULTS = { + PROTOCOLS: [2, 3, 5, 6], + MIMES: ['video/mp4'], + PLAYBACK_METHODS: [1, 2, 3, 4], + DELIVERY: [1], + API: [1, 2, 5], + SIZE: [640, 480] +}; +const NATIVE_DEFAULTS = { + IMAGE_TYPE: { + ICON: 1, + MAIN: 3 + }, + ASSET_ID: { + TITLE: 1, + IMAGE: 2, + ICON: 3, + BODY: 4, + SPONSORED: 5, + CTA: 6 + }, + DATA_ASSET_TYPE: { + SPONSORED: 1, + DESC: 2, + CTA_TEXT: 12 + }, + LENGTH: { + TITLE: 90, + BODY: 140, + SPONSORED: 25, + CTA: 20 + } +}; +const spec = { + code: BIDDER_CODE, + gvlid: 1135, + // short code + aliases: ['opera'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid + * @returns boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + if (!bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(BIDDER_CODE, 'Invalid bid,', bid); + return false; + } + if (!bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(BIDDER_CODE, 'bid.params is required.'); + return false; + } + if (!bid.params.placementId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(BIDDER_CODE, 'bid.params.placementId is required.'); + return false; + } + if (!bid.params.endpointId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(BIDDER_CODE, 'bid.params.endpointId is required.'); + return false; + } + if (!bid.params.publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(BIDDER_CODE, 'bid.params.publisherId is required.'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests An array of bidRequest objects + * @param {bidderRequest} bidderRequest The master bidRequest object. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + return validBidRequests.map(validBidRequest => buildOpenRtbBidRequest(validBidRequest, bidderRequest)); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bidResponses = []; + let serverBody; + if ((serverBody = serverResponse.body) && serverBody.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverBody.seatbid)) { + serverBody.seatbid.forEach(seatbidder => { + if (seatbidder.bid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(seatbidder.bid)) { + bidResponses = seatbidder.bid.map(bid => buildBidResponse(bid, bidRequest.originalBidRequest, serverBody)); + } + }); + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if ('iframeEnabled' in syncOptions && syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: USER_SYNC_ENDPOINT + }]; + } + if ('pixelEnabled' in syncOptions && syncOptions.pixelEnabled) { + const pixels = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(serverResponses, '0.body.pixels'); + if (Array.isArray(pixels)) { + const userSyncPixels = []; + for (const pixel of pixels) { + userSyncPixels.push({ + type: 'image', + url: pixel + }); + } + return userSyncPixels; + } + } + return []; + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * + * @param {Object} timeoutData Containing timeout specific data + */ + onTimeout: function (timeoutData) {}, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * + * @param {Object} bid The bid that won the auction + */ + onBidWon: function (bid) { + if (!bid || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.nurl)) { + return; + } + let winCpm, winCurr; + if (Object.prototype.hasOwnProperty.call(bid, 'originalCpm')) { + winCpm = bid.originalCpm; + winCurr = bid.originalCurrency; + } else { + winCpm = bid.cpm; + winCurr = bid.currency; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(bid.nurl.replace(/\$\{AUCTION_PRICE\}/g, winCpm).replace(/\$\{AUCTION_CURRENCY\}/g, winCurr)); + }, + /** + * Register bidder specific code, which will execute when the adserver targeting has been set for a bid from this bidder + * + * @param {Bid} bid The bid of which the targeting has been set + */ + onSetTargeting: function (bid) {} +}; + +/** + * Buid openRtb request from bidRequest and bidderRequest + * + * @param {BidRequest} bidRequest + * @param {BidderRequest} bidderRequest + * @returns {Request} + */ +function buildOpenRtbBidRequest(bidRequest, bidderRequest) { + // build OpenRTB request body + const payload = { + id: bidderRequest.bidderRequestId, + tmax: bidderRequest.timeout, + test: _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('debug') ? 1 : 0, + imp: createImp(bidRequest), + device: getDevice(), + at: 1, + bcat: getBcat(bidRequest), + cur: [DEFAULT_CURRENCY], + regs: { + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') ? 1 : 0, + ext: {} + }, + user: { + buyeruid: getUserId(bidRequest) + } + }; + fulfillInventoryInfo(payload, bidRequest, bidderRequest); + const gdprConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent'); + if (!!gdprConsent && gdprConsent.gdprApplies) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.gdpr', 1); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'user.ext.consent', gdprConsent.consentString); + } + const uspConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'uspConsent'); + if (uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.us_privacy', uspConsent); + } + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'userIdAsEids', []); + if (eids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'user.eids', eids); + } + return { + method: 'POST', + url: ENDPOINT + String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.publisherId')) + '?ep=' + String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.endpointId')), + data: JSON.stringify(payload), + options: { + contentType: 'application/json', + customHeaders: { + 'x-openrtb-version': 2.5 + } + }, + // set original bid request, so we can get it from interpretResponse + originalBidRequest: bidRequest + }; +} + +/** + * Build bid response from openrtb bid response. + * + * @param {Object} bid + * @param {BidRequest} bidRequest + * @param {Object} responseBody + * @returns {Object} bid response + */ +function buildBidResponse(bid, bidRequest, responseBody) { + let mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + let nativeResponse; + if (/VAST\s+version/.test(bid.adm)) { + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + let markup; + try { + markup = JSON.parse(bid.adm); + } catch (e) { + markup = null; + } + + // OpenRtb Markup Response Object + // https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-Native-Ads-Specification-1-1_2016.pdf#5.1 + if (markup && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(markup.native)) { + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + nativeResponse = markup.native; + } + } + const currency = responseBody.cur || DEFAULT_CURRENCY; + const cpm = (parseFloat(bid.price) || 0).toFixed(2); + const categories = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'cat', []); + const bidResponse = { + requestId: bid.impid, + cpm: cpm, + currency: currency, + mediaType: mediaType, + ttl: 300, + creativeId: bid.crid || bid.id, + netRevenue: NET_REVENUE, + nurl: bid.nurl, + lurl: bid.lurl, + meta: { + mediaType: mediaType, + primaryCatId: categories[0], + secondaryCatIds: categories.slice(1) + } + }; + if (bid.adomain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.adomain) && bid.adomain.length > 0) { + bidResponse.meta.advertiserDomains = bid.adomain; + bidResponse.meta.clickUrl = bid.adomain[0]; + } + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + { + const playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.playerSize', VIDEO_DEFAULTS.SIZE); + const size = canonicalizeSizesArray(playerSize)[0]; + bidResponse.vastXml = bid.adm; + bidResponse.width = bid.w || size[0]; + bidResponse.height = bid.h || size[1]; + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.context'); + + // if outstream video, add a default render for it. + if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_6__.OUTSTREAM) { + // fill adResponse, will be used in ANOutstreamVideo.renderAd + bidResponse.adResponse = { + content: bidResponse.vastXml, + width: bidResponse.width, + height: bidResponse.height, + player_width: size[0], + player_height: size[1] + }; + bidResponse.renderer = createRenderer(bidRequest); + } + break; + } + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + { + bidResponse.native = interpretNativeAd(nativeResponse, currency, cpm); + break; + } + default: + { + bidResponse.ad = bid.adm; + bidResponse.width = bid.w; + bidResponse.height = bid.h; + } + } + return bidResponse; +} + +/** + * Convert OpenRtb native response to bid native object. + * + * @param {Object} nativeResponse + * @param {String} currency + * @param {String} cpm + * @returns {Object} native + */ +function interpretNativeAd(nativeResponse, currency, cpm) { + const native = {}; + + // OpenRtb Link Object + // https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-Native-Ads-Specification-1-1_2016.pdf#5.7 + const clickUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(nativeResponse, 'link.url'); + if (clickUrl && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(clickUrl)) { + native.clickUrl = decodeURIComponent(clickUrl); + } + const clickTrackers = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(nativeResponse, 'link.clicktrackers'); + if (clickTrackers && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(clickTrackers)) { + native.clickTrackers = clickTrackers.filter(Boolean).map(url => decodeURIComponent(url).replace(/\$\{AUCTION_PRICE\}/g, cpm).replace(/\$\{AUCTION_CURRENCY\}/g, currency)); + } + if (nativeResponse.imptrackers && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(nativeResponse.imptrackers)) { + native.impressionTrackers = nativeResponse.imptrackers.filter(Boolean).map(url => decodeURIComponent(url).replace(/\$\{AUCTION_PRICE\}/g, cpm).replace(/\$\{AUCTION_CURRENCY\}/g, currency)); + } + if (nativeResponse.jstracker && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(nativeResponse.jstracker)) { + native.javascriptTrackers = [nativeResponse.jstracker]; + } + let assets; + if ((assets = nativeResponse.assets) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(assets)) { + assets.forEach(asset => { + switch (asset.id) { + case NATIVE_DEFAULTS.ASSET_ID.TITLE: + { + const title = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(asset, 'title.text'); + if (title) { + native.title = title; + } + break; + } + case NATIVE_DEFAULTS.ASSET_ID.IMAGE: + { + if (asset.img) { + native.image = { + url: decodeURIComponent(asset.img.url), + width: asset.img.w, + height: asset.img.h + }; + } + break; + } + case NATIVE_DEFAULTS.ASSET_ID.ICON: + { + if (asset.img) { + native.icon = { + url: decodeURIComponent(asset.img.url), + width: asset.img.w, + height: asset.img.h + }; + } + break; + } + case NATIVE_DEFAULTS.ASSET_ID.BODY: + { + const body = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(asset, 'data.value'); + if (body) { + native.body = body; + } + break; + } + case NATIVE_DEFAULTS.ASSET_ID.SPONSORED: + { + const sponsoredBy = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(asset, 'data.value'); + if (sponsoredBy) { + native.sponsoredBy = sponsoredBy; + } + break; + } + case NATIVE_DEFAULTS.ASSET_ID.CTA: + { + const cta = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(asset, 'data.value'); + if (cta) { + native.cta = cta; + } + break; + } + } + }); + } + return native; +} + +/** + * Create an imp array + * + * @param {Object} bidRequest + * @returns {Array} + */ +function createImp(bidRequest) { + const imp = []; + const impItem = { + id: bidRequest.bidId, + tagid: String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.placementId')) + }; + let mediaType, size; + let bannerReq, videoReq, nativeReq; + if (bannerReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.banner')) { + size = canonicalizeSizesArray(bannerReq.sizes || BANNER_DEFAULTS.SIZE)[0]; + impItem.banner = { + w: size[0], + h: size[1], + pos: 0 + }; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } else if (videoReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video')) { + size = canonicalizeSizesArray(videoReq.playerSize || VIDEO_DEFAULTS.SIZE)[0]; + impItem.video = { + w: size[0], + h: size[1], + pos: 0, + mimes: videoReq.mimes || VIDEO_DEFAULTS.MIMES, + protocols: videoReq.protocols || VIDEO_DEFAULTS.PROTOCOLS, + startdelay: typeof videoReq.startdelay === 'number' ? videoReq.startdelay : 0, + skip: typeof videoReq.skip === 'number' ? videoReq.skip : 0, + playbackmethod: videoReq.playbackmethod || VIDEO_DEFAULTS.PLAYBACK_METHODS, + delivery: videoReq.delivery || VIDEO_DEFAULTS.DELIVERY, + api: videoReq.api || VIDEO_DEFAULTS.API + }; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else if (nativeReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.native')) { + const params = bidRequest.nativeParams || nativeReq; + const request = { + native: { + ver: '1.1', + assets: createNativeAssets(params) + } + }; + impItem.native = { + ver: '1.1', + request: JSON.stringify(request) + }; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } + const floorDetail = getBidFloor(bidRequest, { + mediaType: mediaType || '*', + size: size || '*' + }); + impItem.bidfloor = floorDetail.floor; + impItem.bidfloorcur = floorDetail.currency; + if (mediaType) { + imp.push(impItem); + } + return imp; +} + +/** + * Convert bid sizes to size array + * + * @param {number[]|number[][]} sizes + * @returns {number[][]} + */ +function canonicalizeSizesArray(sizes) { + if (sizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes[0])) { + return [sizes]; + } + return sizes; +} + +/** + * Create Assets Object for Native request + * + * @param {Object} params + * @returns {Object[]} + */ +function createNativeAssets(params) { + const assets = []; + if (params.title) { + assets.push({ + id: NATIVE_DEFAULTS.ASSET_ID.TITLE, + required: params.title.required ? 1 : 0, + title: { + len: params.title.len || NATIVE_DEFAULTS.LENGTH.TITLE + } + }); + } + if (params.image) { + assets.push({ + id: NATIVE_DEFAULTS.ASSET_ID.IMAGE, + required: params.image.required ? 1 : 0, + img: mapNativeImage(params.image, NATIVE_DEFAULTS.IMAGE_TYPE.MAIN) + }); + } + if (params.icon) { + assets.push({ + id: NATIVE_DEFAULTS.ASSET_ID.ICON, + required: params.icon.required ? 1 : 0, + img: mapNativeImage(params.icon, NATIVE_DEFAULTS.IMAGE_TYPE.ICON) + }); + } + if (params.sponsoredBy) { + assets.push({ + id: NATIVE_DEFAULTS.ASSET_ID.SPONSORED, + required: params.sponsoredBy.required ? 1 : 0, + data: { + type: NATIVE_DEFAULTS.DATA_ASSET_TYPE.SPONSORED, + len: params.sponsoredBy.len | NATIVE_DEFAULTS.LENGTH.SPONSORED + } + }); + } + if (params.body) { + assets.push({ + id: NATIVE_DEFAULTS.ASSET_ID.BODY, + required: params.body.required ? 1 : 0, + data: { + type: NATIVE_DEFAULTS.DATA_ASSET_TYPE.DESC, + len: params.body.len || NATIVE_DEFAULTS.LENGTH.BODY + } + }); + } + if (params.cta) { + assets.push({ + id: NATIVE_DEFAULTS.ASSET_ID.CTA, + required: params.cta.required ? 1 : 0, + data: { + type: NATIVE_DEFAULTS.DATA_ASSET_TYPE.CTA_TEXT, + len: params.cta.len || NATIVE_DEFAULTS.LENGTH.CTA + } + }); + } + return assets; +} + +/** + * Create native image object + * + * @param {Object} image + * @param {Number} type + * @returns {Object} + */ +function mapNativeImage(image, type) { + const img = { + type: type + }; + if (image.aspect_ratios) { + const ratio = image.aspect_ratios[0]; + const minWidth = ratio.min_width || 100; + img.wmin = minWidth; + img.hmin = minWidth / ratio.ratio_width * ratio.ratio_height; + } + if (image.sizes) { + const size = canonicalizeSizesArray(image.sizes)[0]; + img.w = size[0]; + img.h = size[1]; + } + return img; +} + +/** + * Get user id from bid request. if no user id module used, return a new uuid. + * + * @param {BidRequest} bidRequest + * @returns {String} userId + */ +function getUserId(bidRequest) { + let operaId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'userId.operaId'); + if (operaId) { + return operaId; + } + let sharedId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'userId.sharedid.id'); + if (sharedId) { + return sharedId; + } + for (const idModule of ['pubcid', 'tdid']) { + let userId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, `userId.${idModule}`); + if (userId) { + return userId; + } + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(); +} + +/** + * Get bid floor price + * + * @param {BidRequest} bid + * @param {Object} params + * @param {string} params.mediaType + * @param {*} params.size + * @returns {Object} floor price + */ +function getBidFloor(bid, _ref) { + let { + mediaType = '*', + size = '*' + } = _ref; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + const floorInfo = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType, + size + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && !isNaN(floorInfo.floor)) { + return { + currency: floorInfo.currency || DEFAULT_CURRENCY, + floor: floorInfo.floor + }; + } + } + return { + currency: DEFAULT_CURRENCY, + floor: 0.0 + }; +} + +/** + * Get bcat + * + * @param {BidRequest} bidRequest + * @returns {String[]} + */ +function getBcat(bidRequest) { + let bcat = []; + const pBcat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.bcat'); + if (pBcat) { + bcat = bcat.concat(pBcat); + } + return bcat; +} + +/** + * Get device info + * + * @returns {Object} + */ +function getDevice() { + const device = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('device') || {}; + device.w = device.w || window.screen.width; + device.h = device.h || window.screen.height; + device.ua = device.ua || navigator.userAgent; + device.language = device.language || getLanguage(); + device.dnt = typeof device.dnt === 'number' ? device.dnt : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0; + return device; +} + +/** + * Fulfill inventory info + * + * @param payload + * @param bidRequest + * @param bidderRequest + */ +function fulfillInventoryInfo(payload, bidRequest, bidderRequest) { + let info = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.site'); + // 1.If the inventory info for site specified, use the site object provided in params. + let key = 'site'; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(info)) { + info = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.app'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(info)) { + // 2.If the inventory info for app specified, use the app object provided in params. + key = 'app'; + } else { + // 3.Otherwise, we use site by default. + info = {}; + } + } + // Fulfill key parameters. + info.id = String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'params.publisherId')); + info.domain = info.domain || bidderRequest?.refererInfo?.domain || window.location.host; + if (key === 'site') { + info.ref = info.ref || bidderRequest?.refererInfo?.ref || ''; + info.page = info.page || bidderRequest?.refererInfo?.page; + } + payload[key] = info; +} + +/** + * Get browser language + * + * @returns {String} language + */ +function getLanguage() { + const lang = navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage; + return lang ? lang.split('-')[0] : DEFAULT_LANGUAGE; +} + +/** + * Create render for outstream video. + * + * @param {BidRequest} bidRequest + * @returns + */ +function createRenderer(bidRequest) { + const globalRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'renderer'); + const currentRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'mediaTypes.video.renderer'); + let url = OUTSTREAM_RENDERER_URL; + let config = {}; + let render = function (bid) { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [bid.width, bid.height], + targetId: bid.adUnitCode, + adResponse: bid.adResponse + }); + }); + }; + if (currentRenderer) { + url = currentRenderer.url; + config = currentRenderer.options; + render = currentRenderer.render; + } else if (globalRenderer) { + url = globalRenderer.url; + config = globalRenderer.options; + render = globalRenderer.render; + } + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: bidRequest.bidId, + url: url, + loaded: false, + config: config, + adUnitCode: bidRequest.adUnitCode + }); + try { + renderer.setRender(render); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE, 'Error calling setRender on renderer', e); + } + return renderer; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('operaadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/operaadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["operaadsIdSystem"],{ + +/***/ "./modules/operaadsIdSystem.js": +/*!*************************************!*\ + !*** ./modules/operaadsIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export operaIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/** + * This module adds operaId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/operaadsIdSystem + * @requires module:modules/userId + */ + + + + +/** + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'operaId'; +const ID_KEY = MODULE_NAME; +const version = '1.0'; +const SYNC_URL = 'https://t.adx.opera.com/identity/'; +const AJAX_TIMEOUT = 300; +const AJAX_OPTIONS = { + method: 'GET', + withCredentials: true, + contentType: 'application/json' +}; +function constructUrl(pairs) { + const queries = []; + for (let key in pairs) { + queries.push(`${key}=${encodeURIComponent(pairs[key])}`); + } + return `${SYNC_URL}?${queries.join('&')}`; +} +function asyncRequest(url, cb) { + _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder(AJAX_TIMEOUT)(url, { + success: response => { + try { + const jsonResponse = JSON.parse(response); + const { + uid: operaId + } = jsonResponse; + cb(operaId); + return; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${MODULE_NAME}: invalid response`, response); + } + cb(); + }, + error: err => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${MODULE_NAME}: ID error response`, err); + cb(); + } + }, null, AJAX_OPTIONS); +} +const operaIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * @type {string} + */ + version, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} id + * @returns {{'operaId': string}} + */ + decode: id => id != null && id.length > 0 ? { + [ID_KEY]: id + } : undefined, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config, consentData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(`${MODULE_NAME}: start synchronizing opera uid`); + const params = config && config.params || {}; + if (typeof params.pid !== 'string' || params.pid.length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`${MODULE_NAME}: submodule requires a publisher ID to be defined`); + return; + } + const { + pid, + syncUrl = SYNC_URL + } = params; + const url = constructUrl(syncUrl, { + publisherId: pid + }); + return { + callback: cb => { + asyncRequest(url, cb); + } + }; + }, + eids: { + 'operaId': { + source: 't.adx.opera.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', operaIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('operaadsIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/operaadsIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["opscoBidAdapter"],{ + +/***/ "./modules/opscoBidAdapter.js": +/*!************************************!*\ + !*** ./modules/opscoBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const ENDPOINT = 'https://exchange.ops.co/openrtb2/auction'; +const BIDDER_CODE = 'opsco'; +const DEFAULT_BID_TTL = 300; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: bid => !!(bid.params && bid.params.placementId && bid.params.publisherId && bid.mediaTypes?.banner?.sizes && Array.isArray(bid.mediaTypes?.banner?.sizes)), + buildRequests: (validBidRequests, bidderRequest) => { + if (!validBidRequests || !bidderRequest) { + return; + } + const { + publisherId, + siteId + } = validBidRequests[0].params; + const payload = { + id: bidderRequest.bidderRequestId, + imp: validBidRequests.map(bidRequest => ({ + id: bidRequest.bidId, + banner: { + format: extractSizes(bidRequest) + }, + ext: { + opsco: { + placementId: bidRequest.params.placementId, + publisherId: publisherId + } + } + })), + site: { + id: siteId, + publisher: { + id: publisherId + }, + domain: bidderRequest.refererInfo?.domain, + page: bidderRequest.refererInfo?.page, + ref: bidderRequest.refererInfo?.ref + } + }; + if (isTest(validBidRequests[0])) { + payload.test = 1; + } + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'userIdAsEids'); + if (eids && eids.length !== 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'user.ext.eids', eids); + } + const schainData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'schain.nodes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(schainData) && schainData.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'source.ext.schain', validBidRequests[0].schain); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(payload) + }; + }, + interpretResponse: serverResponse => { + const response = (serverResponse || {}).body; + const bidResponses = response?.seatbid?.[0]?.bid?.map(bid => ({ + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ad: bid.adm, + ttl: typeof bid.exp === 'number' ? bid.exp : DEFAULT_BID_TTL, + creativeId: bid.crid, + netRevenue: DEFAULT_NET_REVENUE, + currency: DEFAULT_CURRENCY, + meta: { + advertiserDomains: bid?.adomain || [] + }, + mediaType: bid.mediaType || bid.mtype + })) || []; + if (!bidResponses.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('opsco.interpretResponse :: No valid responses'); + } + return bidResponses; + }, + getUserSyncs: (syncOptions, serverResponses) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('opsco.getUserSyncs', 'syncOptions', syncOptions, 'serverResponses', serverResponses); + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return []; + } + let syncs = []; + serverResponses.forEach(resp => { + const userSync = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(resp, 'body.ext.usersync'); + if (userSync) { + const syncDetails = Object.values(userSync).flatMap(value => value.syncs || []); + syncDetails.forEach(syncDetail => { + const type = syncDetail.type === 'iframe' ? 'iframe' : 'image'; + if (type === 'iframe' && syncOptions.iframeEnabled || type === 'image' && syncOptions.pixelEnabled) { + syncs.push({ + type, + url: syncDetail.url + }); + } + }); + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('opsco.getUserSyncs result=%o', syncs); + return syncs; + } +}; +function extractSizes(bidRequest) { + return (bidRequest.mediaTypes?.banner?.sizes || []).map(_ref => { + let [width, height] = _ref; + return { + w: width, + h: height + }; + }); +} +function isTest(validBidRequest) { + return validBidRequest.params?.test === true; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('opscoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/opscoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["optableBidAdapter"],{ + +/***/ "./modules/optableBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/optableBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep(imp, { + tagid: bidRequest.params.site + }); + return imp; + } +}); +const BIDDER_CODE = 'optable'; +const DEFAULT_REGION = 'ca'; +const DEFAULT_ORIGIN = 'https://ads.optable.co'; +function getOrigin() { + return _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('optable.origin') ?? DEFAULT_ORIGIN; +} +function getBaseUrl() { + const region = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('optable.region') ?? DEFAULT_REGION; + return `${getOrigin()}/${region}`; +} +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + return !!bid.params?.site; + }, + buildRequests: function (bidRequests, bidderRequest) { + const requestURL = `${getBaseUrl()}/ortb2/v1/ssp/bid`; + const data = converter.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER + } + }); + return { + method: 'POST', + url: requestURL, + data + }; + }, + buildPAAPIConfigs: function (bidRequests) { + const origin = getOrigin(); + return bidRequests.filter(req => req.ortb2Imp?.ext?.ae).map(bid => ({ + bidId: bid.bidId, + config: { + seller: origin, + decisionLogicURL: `${getBaseUrl()}/paapi/v1/ssp/decision-logic.js?origin=${bid.params.site}`, + interestGroupBuyers: [origin], + perBuyerMultiBidLimits: { + [origin]: 100 + }, + perBuyerCurrencies: { + [origin]: 'USD' + } + } + })); + }, + interpretResponse: function (response, request) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + const auctionConfigs = (response.body.ext?.optable?.fledge?.auctionconfigs ?? []).map(cfg => { + const { + impid, + ...config + } = cfg; + return { + bidId: impid, + config + }; + }); + return { + bids, + paapi: auctionConfigs + }; + }, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('optableBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/optableBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["optableRtdProvider"],{ + +/***/ "./modules/optableRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/optableRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports LOG_PREFIX, parseConfig, defaultHandleRtd, mergeOptableData, getBidRequestData, getTargetingData, optableSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + +const MODULE_NAME = 'optable'; +const LOG_PREFIX = `[${MODULE_NAME} RTD]:`; +const optableLog = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)(LOG_PREFIX); +const { + logMessage, + logWarn, + logError +} = optableLog; + +/** + * Extracts the parameters for Optable RTD module from the config object passed at instantiation + * @param {Object} moduleConfig Configuration object for the module + */ +const parseConfig = moduleConfig => { + let bundleUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(moduleConfig, 'params.bundleUrl', null); + let adserverTargeting = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(moduleConfig, 'params.adserverTargeting', true); + let handleRtd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(moduleConfig, 'params.handleRtd', null); + + // If present, trim the bundle URL + if (typeof bundleUrl === 'string') { + bundleUrl = bundleUrl.trim(); + } + + // Verify that bundleUrl is a valid URL: only secure (HTTPS) URLs are allowed + if (typeof bundleUrl === 'string' && bundleUrl.length && !bundleUrl.startsWith('https://')) { + throw new Error(LOG_PREFIX + ' Invalid URL format for bundleUrl in moduleConfig. Only HTTPS URLs are allowed.'); + } + if (handleRtd && typeof handleRtd !== 'function') { + throw new Error(LOG_PREFIX + ' handleRtd must be a function'); + } + return { + bundleUrl, + adserverTargeting, + handleRtd + }; +}; + +/** + * Default function to handle/enrich RTD data + * @param reqBidsConfigObj Bid request configuration object + * @param optableExtraData Additional data to be used by the Optable SDK + * @param mergeFn Function to merge data + * @returns {Promise} + */ +const defaultHandleRtd = async (reqBidsConfigObj, optableExtraData, mergeFn) => { + const optableBundle = /** @type {Object} */window.optable; + // Get targeting data from cache, if available + let targetingData = optableBundle?.instance?.targetingFromCache(); + // If no targeting data is found in the cache, call the targeting function + if (!targetingData) { + // Call Optable DCN for targeting data and return the ORTB2 object + targetingData = await optableBundle?.instance?.targeting(); + } + logMessage('Original targeting data from targeting(): ', targetingData); + if (!targetingData || !targetingData.ortb2) { + logWarn('No targeting data found'); + return; + } + mergeFn(reqBidsConfigObj.ortb2Fragments.global, targetingData.ortb2); + logMessage('Prebid\'s global ORTB2 object after merge: ', reqBidsConfigObj.ortb2Fragments.global); +}; + +/** + * Get data from Optable and merge it into the global ORTB2 object + * @param {Function} handleRtdFn Function to handle RTD data + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Object} optableExtraData Additional data to be used by the Optable SDK + * @param {Function} mergeFn Function to merge data + */ +const mergeOptableData = async (handleRtdFn, reqBidsConfigObj, optableExtraData, mergeFn) => { + if (handleRtdFn.constructor.name === 'AsyncFunction') { + await handleRtdFn(reqBidsConfigObj, optableExtraData, mergeFn); + } else { + handleRtdFn(reqBidsConfigObj, optableExtraData, mergeFn); + } +}; + +/** + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Function} callback Called on completion + * @param {Object} moduleConfig Configuration for Optable RTD module + * @param {Object} userConsent + */ +const getBidRequestData = (reqBidsConfigObj, callback, moduleConfig, userConsent) => { + try { + // Extract the bundle URL from the module configuration + const { + bundleUrl, + handleRtd + } = parseConfig(moduleConfig); + const handleRtdFn = handleRtd || defaultHandleRtd; + const optableExtraData = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('optableRtdConfig') || {}; + if (bundleUrl) { + // If bundleUrl is present, load the Optable JS bundle + // by using the loadExternalScript function + logMessage('Custom bundle URL found in config: ', bundleUrl); + + // Load Optable JS bundle and merge the data + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(bundleUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, MODULE_NAME, () => { + logMessage('Successfully loaded Optable JS bundle'); + mergeOptableData(handleRtdFn, reqBidsConfigObj, optableExtraData, _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep).then(callback, callback); + }, document); + } else { + // At this point, we assume that the Optable JS bundle is already + // present on the page. If it is, we can directly merge the data + // by passing the callback to the optable.cmd.push function. + logMessage('Custom bundle URL not found in config. ' + 'Assuming Optable JS bundle is already present on the page'); + window.optable = window.optable || { + cmd: [] + }; + window.optable.cmd.push(() => { + logMessage('Optable JS bundle found on the page'); + mergeOptableData(handleRtdFn, reqBidsConfigObj, optableExtraData, _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep).then(callback, callback); + }); + } + } catch (error) { + // If an error occurs, log it and call the callback + // to continue with the auction + logError(error); + callback(); + } +}; + +/** + * Get Optable targeting data and merge it into the ad units + * @param adUnits Array of ad units + * @param moduleConfig Module configuration + * @param userConsent User consent + * @param auction Auction object + * @returns {Object} Targeting data + */ +const getTargetingData = (adUnits, moduleConfig, userConsent, auction) => { + // Extract `adserverTargeting` from the module configuration + const { + adserverTargeting + } = parseConfig(moduleConfig); + logMessage('Ad Server targeting: ', adserverTargeting); + if (!adserverTargeting) { + logMessage('Ad server targeting is disabled'); + return {}; + } + const targetingData = {}; + + // Get the Optable targeting data from the cache + const optableTargetingData = window?.optable?.instance?.targetingKeyValuesFromCache() || {}; + + // If no Optable targeting data is found, return an empty object + if (!Object.keys(optableTargetingData).length) { + logWarn('No Optable targeting data found'); + return targetingData; + } + + // Merge the Optable targeting data into the ad units + adUnits.forEach(adUnit => { + targetingData[adUnit] = targetingData[adUnit] || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(targetingData[adUnit], optableTargetingData); + }); + + // If the key contains no data, remove it + Object.keys(targetingData).forEach(adUnit => { + Object.keys(targetingData[adUnit]).forEach(key => { + if (!targetingData[adUnit][key] || !targetingData[adUnit][key].length) { + delete targetingData[adUnit][key]; + } + }); + + // If the ad unit contains no data, remove it + if (!Object.keys(targetingData[adUnit]).length) { + delete targetingData[adUnit]; + } + }); + logMessage('Optable targeting data: ', targetingData); + return targetingData; +}; + +/** + * Dummy init function + * @param {Object} config Module configuration + * @param {boolean} userConsent User consent + * @returns true + */ +const init = (config, userConsent) => { + return true; +}; + +// Optable RTD submodule +const optableSubmodule = { + name: MODULE_NAME, + init, + getBidRequestData, + getTargetingData +}; + +// Register the Optable RTD submodule +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', optableSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('optableRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/optableRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["optidigitalBidAdapter"],{ + +/***/ "./modules/optidigitalBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/optidigitalBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, resetSync */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'optidigital'; +const GVL_ID = 915; +const ENDPOINT_URL = 'https://pbs.optidigital.com/bidder'; +const USER_SYNC_URL_IFRAME = 'https://scripts.opti-digital.com/js/presync.html?endpoint=optidigital'; +let CUR = 'USD'; +let isSynced = false; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let isValid = false; + if (typeof bid.params !== 'undefined' && bid.params.placementId && bid.params.publisherId) { + isValid = true; + } + return isValid; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + if (!validBidRequests || validBidRequests.length === 0 || !bidderRequest || !bidderRequest.bids) { + return []; + } + const ortb2 = bidderRequest.ortb2 || { + bcat: [], + badv: [] + }; + const payload = { + referrer: bidderRequest.refererInfo && bidderRequest.refererInfo.page ? bidderRequest.refererInfo.page : '', + hb_version: "9.45.0-pre", + deviceWidth: document.documentElement.clientWidth, + bidderRequestId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'bidderRequestId'), + publisherId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'params.publisherId'), + imp: validBidRequests.map(bidRequest => buildImp(bidRequest, ortb2)), + badv: ortb2.badv || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'params.badv') || [], + bcat: ortb2.bcat || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'params.bcat') || [], + bapp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(validBidRequests[0], 'params.bapp') || [] + }; + if (validBidRequests[0].auctionId) { + payload.auctionId = validBidRequests[0].auctionId; + } + if (validBidRequests[0].params.pageTemplate && validBidRequests[0].params.pageTemplate !== '') { + payload.pageTemplate = validBidRequests[0].params.pageTemplate; + } + if (validBidRequests[0].schain) { + payload.schain = validBidRequests[0].schain; + } + const gdpr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent'); + if (bidderRequest && gdpr) { + const isConsentString = typeof gdpr.consentString === 'string'; + payload.gdpr = { + consent: isConsentString ? gdpr.consentString : '', + required: true + }; + } + if (bidderRequest && !gdpr) { + payload.gdpr = { + consent: '', + required: false + }; + } + if (bidderRequest?.gppConsent?.gppString) { + payload.gpp = { + consent: bidderRequest.gppConsent.gppString, + sid: bidderRequest.gppConsent.applicableSections + }; + } else if (bidderRequest?.ortb2?.regs?.gpp) { + payload.gpp = { + consent: bidderRequest.ortb2.regs.gpp, + sid: bidderRequest.ortb2.regs.gpp_sid + }; + } + if (window.location.href.indexOf('optidigitalTestMode=true') !== -1) { + payload.testMode = true; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + if (_getEids(validBidRequests[0])) { + payload.user = { + eids: _getEids(validBidRequests[0]) + }; + } + const payloadObject = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadObject + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + serverResponse = serverResponse.body; + if (serverResponse.bids) { + serverResponse.bids.forEach(bid => { + const bidResponse = { + placementId: bid.placementId, + requestId: bid.bidId, + ttl: bid.ttl, + creativeId: bid.creativeId, + currency: bid.cur, + cpm: bid.cpm, + width: bid.w, + height: bid.h, + ad: bid.adm, + netRevenue: true, + meta: { + advertiserDomains: bid.adomain && bid.adomain.length > 0 ? bid.adomain : [] + } + }; + bidResponses.push(bidResponse); + }); + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + let syncurl = ''; + if (!isSynced) { + // Attaching GDPR Consent Params in UserSync url + if (gdprConsent) { + syncurl += '&gdpr=' + (gdprConsent.gdprApplies ? 1 : 0); + syncurl += '&gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || ''); + } + if (uspConsent) { + syncurl += '&us_privacy=' + encodeURIComponent(uspConsent); + } + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + syncurl += '&gpp=' + encodeURIComponent(gppConsent.gppString); + syncurl += '&gpp_sid=' + encodeURIComponent(gppConsent?.applicableSections?.join(',')); + } + if (syncOptions.iframeEnabled) { + isSynced = true; + return [{ + type: 'iframe', + url: USER_SYNC_URL_IFRAME + syncurl + }]; + } + } + } +}; +function buildImp(bidRequest, ortb2) { + let imp = {}; + imp = { + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.sizes')), + bidId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'bidId'), + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'adUnitCode'), + transactionId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'ortb2Imp.ext.tid'), + placementId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.placementId') + }; + if (bidRequest.params.divId && bidRequest.params.divId !== '') { + if (getAdContainer(bidRequest.params.divId)) { + imp.adContainerWidth = getAdContainer(bidRequest.params.divId).offsetWidth; + imp.adContainerHeight = getAdContainer(bidRequest.params.divId).offsetHeight; + } + } + let floorSizes = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner')) { + floorSizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_3__.getAdUnitSizes)(bidRequest); + } + if (bidRequest.params.currency && bidRequest.params.currency !== '') { + CUR = bidRequest.params.currency; + } + let bidFloor = _getFloor(bidRequest, floorSizes, CUR); + if (bidFloor) { + imp.bidFloor = bidFloor; + } + let battr = ortb2.battr || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.battr'); + if (battr && Array.isArray(battr) && battr.length) { + imp.battr = battr; + } + return imp; +} +function getAdContainer(container) { + if (document.getElementById(container)) { + return document.getElementById(container); + } +} +function _getFloor(bid, sizes, currency) { + let floor = null; + let size = sizes.length === 1 ? sizes[0] : '*'; + if (typeof bid.getFloor === 'function') { + try { + const floorInfo = bid.getFloor({ + currency: currency, + mediaType: 'banner', + size: size + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(floorInfo) && floorInfo.currency === CUR && !isNaN(parseFloat(floorInfo.floor))) { + floor = parseFloat(floorInfo.floor); + } + } catch (err) {} + } + return floor !== null ? floor : bid.params.floor; +} +function _getEids(bidRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userIdAsEids')) { + return bidRequest.userIdAsEids; + } +} +function resetSync() { + isSynced = false; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('optidigitalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/optidigitalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["optimeraRtdProvider"],{ + +/***/ "./modules/optimeraRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/optimeraRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports optimeraKeyName, scoresBaseURL, scoresURL, clientID, device, apiVersion, optimeraTargeting, fetchScoreFile, scoreFileRequest, returnTargetingData, onAuctionInit, init, setScoresURL, setScores, optimeraSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + +/** + * This module adds optimera provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * + * The module will fetch targeting values from the Optimera server + * and apply the tageting to each ad request. These values are created + * from the Optimera Mesaurement script which is installed on the + * Publisher's site. + * + * @module modules/optimeraRtdProvider + * @requires module:modules/realTimeData + */ + +/** + * @typedef {Object} ModuleParams + * @property {string} clientID + * @property {string} optimeraKeyName + * @property {string} device + * @property {string} apiVersion + */ + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** @type {ModuleParams} */ +let _moduleParams = {}; + +/** + * Default Optimera Key Name + * This can default to hb_deal_optimera for publishers + * who used the previous Optimera Bidder Adapter. + * @type {string} + */ +let optimeraKeyName = 'hb_deal_optimera'; + +/** + * Optimera Score File Base URL. + * This is the base URL for the data endpoint request to fetch + * the targeting values. + * @type {string} + */ +const scoresBaseURL = { + v0: 'https://dyv1bugovvq1g.cloudfront.net/', + v1: 'https://v1.oapi26b.com/' +}; + +/** + * Optimera Score File URL. + * @type {string} + */ +let scoresURL; + +/** + * Optimera Client ID. + * @type {string} + */ +let clientID; + +/** + * Optional device parameter. + * @type {string} + */ +let device = 'default'; + +/** + * Optional apiVersion parameter. + * @type {string} + */ +let apiVersion = 'v0'; + +/** + * Targeting object for all ad positions. + * @type {string} + */ +let optimeraTargeting = {}; + +/** + * Flag to indicateo if a new score file should be fetched. + * @type {string} + */ +let fetchScoreFile = true; + +/** + * Make the request for the Score File. + */ +function scoreFileRequest() { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Fetch Optimera score file.'); + const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajaxBuilder)(); + ajax(scoresURL, { + success: (res, req) => { + if (req.status === 200) { + try { + setScores(res); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Unable to parse Optimera Score File.', err); + } + } else if (req.status === 403) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Unable to fetch the Optimera Score File - 403'); + } + }, + error: () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Unable to fetch the Optimera Score File.'); + } + }); +} + +/** + * Apply the Optimera targeting to the ad slots. + */ +function returnTargetingData(adUnits, config) { + const targeting = {}; + try { + adUnits.forEach(adUnit => { + if (optimeraTargeting[adUnit]) { + targeting[adUnit] = {}; + targeting[adUnit][optimeraKeyName] = [optimeraTargeting[adUnit]]; + } + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('error', err); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('Apply Optimera targeting'); + return targeting; +} + +/** + * Fetch a new score file when an auction starts. + * Only fetch the new file if a new score file is needed. + */ +function onAuctionInit(auctionDetails, config, userConsent) { + setScoresURL(); + if (fetchScoreFile) { + scoreFileRequest(); + } +} + +/** + * Initialize the Module. + * moduleConfig.params.apiVersion can be either v0 or v1. + */ +function init(moduleConfig) { + _moduleParams = moduleConfig.params; + if (_moduleParams && _moduleParams.clientID) { + clientID = _moduleParams.clientID; + if (_moduleParams.optimeraKeyName) { + optimeraKeyName = _moduleParams.optimeraKeyName; + } + if (_moduleParams.device) { + device = _moduleParams.device; + } + if (_moduleParams.apiVersion) { + apiVersion = _moduleParams.apiVersion.includes('v1', 'v0') ? _moduleParams.apiVersion : 'v0'; + } + setScoresURL(); + scoreFileRequest(); + return true; + } + if (!_moduleParams.clientID) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Optimera clientID is missing in the Optimera RTD configuration.'); + } + return false; +} + +/** + * Set the score file url. + * + * This fully-formed URL is for the data endpoint request to fetch + * the targeting values. This is not a js library, rather JSON + * which has the targeting values for the page. + * + * The score file url is based on the web page url. If the new score file URL + * has been updated, set the fetchScoreFile flag to true to is can be fetched. + * + */ +function setScoresURL() { + const optimeraHost = window.location.host; + const optimeraPathName = window.location.pathname; + const baseUrl = scoresBaseURL[apiVersion] ? scoresBaseURL[apiVersion] : scoresBaseURL.v0; + let newScoresURL; + if (apiVersion === 'v1') { + newScoresURL = `${baseUrl}api/products/scores?c=${clientID}&h=${optimeraHost}&p=${optimeraPathName}&s=${device}`; + } else { + let encoded = encodeURIComponent(`${optimeraHost}${optimeraPathName}`).replaceAll('%2F', '/').replaceAll('%20', '+'); + newScoresURL = `${baseUrl}${clientID}/${encoded}.js`; + } + if (scoresURL !== newScoresURL) { + scoresURL = newScoresURL; + fetchScoreFile = true; + } else { + fetchScoreFile = false; + } +} + +/** + * Set the scores for the device if given. + * Add data and insights to the winddow.optimera object. + * + * @param {*} result + * @returns {string} JSON string of Optimera Scores. + */ +function setScores(result) { + let scores = {}; + try { + scores = JSON.parse(result); + if (device !== 'default' && scores.device[device]) { + scores = scores.device[device]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(scores); + window.optimera = window.optimera || {}; + window.optimera.data = window.optimera.data || {}; + window.optimera.insights = window.optimera.insights || {}; + Object.keys(scores).map(key => { + if (key !== 'insights') { + window.optimera.data[key] = scores[key]; + } + }); + if (scores.insights) { + window.optimera.insights = scores.insights; + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('Optimera score file could not be parsed.'); + } + optimeraTargeting = scores; +} + +/** @type {RtdSubmodule} */ +const optimeraSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: 'optimeraRTD', + /** + * get data when an auction starts + * @function + */ + onAuctionInitEvent: onAuctionInit, + /** + * get data and send back to realTimeData module + * @function + */ + getTargetingData: returnTargetingData, + init +}; + +/** + * Register the Sub Module. + */ +function registerSubModule() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('realTimeData', optimeraSubmodule); +} +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('optimeraRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/optimeraRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["optimonAnalyticsAdapter"],{ + +/***/ "./modules/optimonAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/optimonAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + +/** + * + ********************************************************* + * + * Optimon.io Prebid Analytics Adapter + * + ********************************************************* + * + */ + + + +const optimonAnalyticsAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + global: 'OptimonAnalyticsAdapter', + handler: 'on', + analyticsType: 'bundle' +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: optimonAnalyticsAdapter, + code: 'optimon' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (optimonAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('optimonAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/optimonAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["optoutBidAdapter"],{ + +/***/ "./modules/optoutBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/optoutBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); + + + + + +const BIDDER_CODE = 'optout'; +function getDomain(bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidderRequest, 'refererInfo.canonicalUrl') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(window, 'location.href'); +} +function getCurrency() { + let cur = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('currency'); + if (cur === undefined) { + cur = { + adServerCurrency: 'EUR', + granularityMultiplier: 1 + }; + } + return cur; +} +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + return !!bid.params.publisher && !!bid.params.adslot; + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + let endPoint = 'https://adscience-nocookie.nl/prebid/display'; + let consentString = ''; + let gdpr = 0; + if (bidRequest.gdprConsent) { + gdpr = typeof bidRequest.gdprConsent.gdprApplies === 'boolean' ? Number(bidRequest.gdprConsent.gdprApplies) : 0; + consentString = bidRequest.gdprConsent.consentString; + if (!gdpr || (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__.hasPurpose1Consent)(bidRequest.gdprConsent)) { + endPoint = 'https://prebid.adscience.nl/prebid/display'; + } + } + return { + method: 'POST', + url: endPoint, + data: { + requestId: bidRequest.bidId, + publisher: bidRequest.params.publisher, + adSlot: bidRequest.params.adslot, + cur: getCurrency(), + url: getDomain(bidRequest), + ortb2: bidderRequest.ortb2, + consent: consentString, + gdpr: gdpr + } + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + return serverResponse.body; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent) { + if (gdprConsent) { + let gdpr = typeof gdprConsent.gdprApplies === 'boolean' ? Number(gdprConsent.gdprApplies) : 0; + if (syncOptions.iframeEnabled && (!gdprConsent.gdprApplies || (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_2__.hasPurpose1Consent)(gdprConsent))) { + return [{ + type: 'iframe', + url: 'https://umframe.adscience.nl/matching/iframe?gdpr=' + gdpr + '&gdpr_consent=' + gdprConsent.consentString + }]; + } + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('optoutBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/optoutBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["orakiBidAdapter"],{ + +/***/ "./modules/orakiBidAdapter.js": +/*!************************************!*\ + !*** ./modules/orakiBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'oraki'; +const AD_URL = 'https://eu1.oraki.io/pbjs'; +const SYNC_URL = 'https://sync.oraki.io'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('orakiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/orakiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["orbidderBidAdapter"],{ + +/***/ "./modules/orbidderBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/orbidderBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ +const storageManager = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: 'orbidder' +}); + +/** + * Determines whether or not the given bid response is valid. + * + * @param {object} bidResponse The bid response to validate. + * @return boolean True if this is a valid bid response, and false if it is not valid. + */ +function isBidResponseValid(bidResponse) { + let requiredKeys = ['requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency']; + switch (bidResponse.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER: + requiredKeys = requiredKeys.concat(['width', 'height', 'ad']); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE: + if (!bidResponse.native.hasOwnProperty('impressionTrackers')) { + return false; + } + break; + default: + return false; + } + for (const key of requiredKeys) { + if (!bidResponse.hasOwnProperty(key)) { + return false; + } + } + return true; +} +const spec = { + code: 'orbidder', + gvlid: 559, + hostname: 'https://orbidder.otto.de', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + /** + * Returns a customzied hostname if 'ov_orbidder_host' is set in the browser's local storage. + * This is only used for integration testing. + * + * @return The hostname bid requests should be sent to. + */ + getHostname() { + let ret = this.hostname; + try { + ret = storageManager.getDataFromLocalStorage('ov_orbidder_host') || ret; + } catch (e) {} + return ret; + }, + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false if it is not valid. + */ + isBidRequestValid(bid) { + return !!(bid.sizes && bid.bidId && bid.params && bid.params.accountId && typeof bid.params.accountId === 'string' && bid.params.placementId && typeof bid.params.placementId === 'string' && (typeof bid.params.keyValues === 'undefined' || typeof bid.params.keyValues === 'object')); + }, + /** + * Build a request from the list of valid BidRequests that will be sent by prebid to the orbidder /bid endpoint, i.e. the server. + * + * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the orbidder /bid endpoint, + * i.e. the server. + * @return The requests for the orbidder /bid endpoint, i.e. the server. + */ + buildRequests(validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const hostname = this.getHostname(); + return validBidRequests.map(bidRequest => { + let referer = ''; + if (bidderRequest && bidderRequest.refererInfo) { + referer = bidderRequest.refererInfo.page || ''; + } + if (bidRequest?.mediaTypes?.video) { + delete bidRequest.mediaTypes.video; + } + bidRequest.params.bidfloor = getBidFloor(bidRequest); + let httpReq = { + url: `${hostname}/bid`, + method: 'POST', + options: { + withCredentials: true + }, + data: { + v: 'v' + "9.45.0-pre", + pageUrl: referer, + ...bidRequest // get all data provided by bid request + } + }; + if (bidderRequest && bidderRequest.gdprConsent) { + httpReq.data.gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + consentRequired: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' && bidderRequest.gdprConsent.gdprApplies + }; + } + return httpReq; + }); + }, + /** + * Unpack the response from the orbidder /bid endpoint into a list of bids. + * + * @param {*} serverResponse A successful response from the orbidder /bid endpoint, i.e. the server. + * @return {Bid[]} An array of bids from orbidder. + */ + interpretResponse(serverResponse) { + const bidResponses = []; + serverResponse = serverResponse.body; + if (serverResponse && serverResponse.length > 0) { + serverResponse.forEach(bidResponse => { + if (isBidResponseValid(bidResponse)) { + if (Array.isArray(bidResponse.advertiserDomains)) { + bidResponse.meta = { + advertiserDomains: bidResponse.advertiserDomains + }; + } + bidResponses.push(bidResponse); + } + }); + } + return bidResponses; + } +}; + +/** + * Get bid floor from Price Floors Module + * @param {Object} bid + * @returns {(number|undefined)} + */ +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(bid.getFloor)) { + return bid.params.bidfloor; + } + const floor = bid.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') { + return floor.floor; + } + return undefined; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('orbidderBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/orbidderBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["orbitsoftBidAdapter"],{ + +/***/ "./modules/orbitsoftBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/orbitsoftBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +const BIDDER_CODE = 'orbitsoft'; +let styleParamsMap = { + 'title.family': 'f1', + // headerFont + 'title.size': 'fs1', + // headerFontSize + 'title.weight': 'w1', + // headerWeight + 'title.style': 's1', + // headerStyle + 'title.color': 'c3', + // headerColor + 'description.family': 'f2', + // descriptionFont + 'description.size': 'fs2', + // descriptionFontSize + 'description.weight': 'w2', + // descriptionWeight + 'description.style': 's2', + // descriptionStyle + 'description.color': 'c4', + // descriptionColor + 'url.family': 'f3', + // urlFont + 'url.size': 'fs3', + // urlFontSize + 'url.weight': 'w3', + // urlWeight + 'url.style': 's3', + // urlStyle + 'url.color': 'c5', + // urlColor + 'colors.background': 'c2', + // borderColor + 'colors.border': 'c1', + // borderColor + 'colors.link': 'c6' // lnkColor +}; +const spec = { + code: BIDDER_CODE, + aliases: ['oas', '152media', 'paradocs'], + // short code and customer aliases + isBidRequestValid: function (bid) { + switch (true) { + case !('params' in bid): + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(bid.bidder + ': No required params'); + return false; + case !bid.params.placementId: + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(bid.bidder + ': No required param placementId'); + return false; + case !bid.params.requestUrl: + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(bid.bidder + ': No required param requestUrl'); + return false; + } + return true; + }, + buildRequests: function (validBidRequests) { + let bidRequest; + let serverRequests = []; + for (let i = 0; i < validBidRequests.length; i++) { + bidRequest = validBidRequests[i]; + let bidRequestParams = bidRequest.params; + let placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('placementId', bidRequestParams); + let requestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('requestUrl', bidRequestParams); + let referrer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('ref', bidRequestParams); + let location = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('loc', bidRequestParams); + // Append location & referrer + if (location === '') { + location = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowLocation(); + } + if (referrer === '' && bidRequest && bidRequest.refererInfo) { + referrer = bidRequest.refererInfo.referer; + } + + // Styles params + let stylesParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('style', bidRequestParams); + let stylesParamsArray = {}; + for (let currentValue in stylesParams) { + if (stylesParams.hasOwnProperty(currentValue)) { + let currentStyle = stylesParams[currentValue]; + for (let field in currentStyle) { + if (currentStyle.hasOwnProperty(field)) { + let styleField = styleParamsMap[currentValue + '.' + field]; + if (typeof styleField !== 'undefined') { + stylesParamsArray[styleField] = currentStyle[field]; + } + } + } + } + } + // Custom params + let customParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('customParams', bidRequestParams); + let customParamsArray = {}; + for (let customField in customParams) { + if (customParams.hasOwnProperty(customField)) { + customParamsArray['c.' + customField] = customParams[customField]; + } + } + + // Sizes params (not supports by server, for future features) + let sizesParams = bidRequest.sizes; + let parsedSizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput(sizesParams); + let requestData = Object.assign({ + 'scid': placementId, + 'callback_uid': _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID(), + 'loc': location, + 'ref': referrer, + 'size': parsedSizes + }, stylesParamsArray, customParamsArray); + serverRequests.push({ + method: 'POST', + url: requestUrl, + data: requestData, + options: { + withCredentials: false + }, + bidRequest: bidRequest + }); + } + return serverRequests; + }, + interpretResponse: function (serverResponse, request) { + let bidResponses = []; + if (!serverResponse || serverResponse.error) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(BIDDER_CODE + ': Server response error'); + return bidResponses; + } + const serverBody = serverResponse.body; + if (!serverBody) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError(BIDDER_CODE + ': Empty bid response'); + return bidResponses; + } + const CPM = serverBody.cpm; + const WIDTH = serverBody.width; + const HEIGHT = serverBody.height; + const CREATIVE = serverBody.content_url; + const CALLBACK_UID = serverBody.callback_uid; + const TIME_TO_LIVE = 60; + const REFERER = _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop(); + let bidRequest = request.bidRequest; + if (CPM > 0 && WIDTH > 0 && HEIGHT > 0) { + let bidResponse = { + requestId: bidRequest.bidId, + cpm: CPM, + width: WIDTH, + height: HEIGHT, + creativeId: CALLBACK_UID, + ttl: TIME_TO_LIVE, + referrer: REFERER, + currency: 'USD', + netRevenue: true, + adUrl: CREATIVE, + meta: { + advertiserDomains: serverBody.adomain ? serverBody.adomain : [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('orbitsoftBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/orbitsoftBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["otmBidAdapter"],{ + +/***/ "./modules/otmBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/otmBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'otm'; +const OTM_BID_URL = 'https://ssp.otm-r.com/adjson'; +const DEFAULT_CURRENCY = 'RUB'; +const spec = { + code: BIDDER_CODE, + url: OTM_BID_URL, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return Boolean(bid.params.tid); + }, + /** + * Build bidder requests. + * + * @param validBidRequests + * @param bidderRequest + * @returns {[]} + */ + buildRequests: function (validBidRequests, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('validBidRequests', validBidRequests); + const bidRequests = []; + const tz = new Date().getTimezoneOffset(); + // TODO: are these the right referer values? + const referrer = bidderRequest?.refererInfo?.page || ''; + const topOrigin = bidderRequest?.refererInfo?.domain || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, bid => { + const domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.domain) ? bid.params.domain : topOrigin; + const cur = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'currency') || DEFAULT_CURRENCY; + const bidid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidId', bid); + const transactionid = bid.ortb2Imp?.ext?.tid || ''; + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + const auctionid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('auctionId', bid); + const bidfloor = _getBidFloor(bid); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(bid.sizes, size => { + const hasSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(size[0]) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(size[1]); + const width = hasSizes ? size[0] : 0; + const height = hasSizes ? size[1] : 0; + bidRequests.push({ + method: 'GET', + url: OTM_BID_URL, + data: { + tz, + w: width, + h: height, + domain, + l: referrer, + s: bid.params.tid, + cur, + bidid, + transactionid, + auctionid, + bidfloor + } + }); + }); + }); + return bidRequests; + }, + /** + * Generate response. + * + * @param serverResponse + * @returns {[]|*[]} + */ + interpretResponse: function (serverResponse) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('serverResponse', serverResponse.body); + const responsesBody = serverResponse ? serverResponse.body : {}; + const bidResponses = []; + try { + if (responsesBody.length === 0) { + return []; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(responsesBody, bid => { + if (bid.ad) { + bidResponses.push({ + requestId: bid.bidid, + cpm: bid.cpm, + width: bid.w, + height: bid.h, + creativeId: bid.creativeid, + currency: bid.currency || DEFAULT_CURRENCY, + netRevenue: true, + ad: bid.ad, + ttl: bid.ttl, + meta: { + advertiserDomains: bid.adDomain ? [bid.adDomain] : [] + } + }); + } + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(error); + } + return bidResponses; + } +}; + +/** + * Get floor value + * @param bid + * @returns {null|*} + * @private + */ +function _getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + return bid.params.bidfloor ? bid.params.bidfloor : 0; + } + const floor = bid.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === DEFAULT_CURRENCY) { + return floor.floor; + } + return 0; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('otmBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/otmBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["outbrainBidAdapter"],{ + +/***/ "./modules/outbrainBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/outbrainBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + + + + + +const BIDDER_CODE = 'outbrain'; +const GVLID = 164; +const CURRENCY = 'USD'; +const NATIVE_PARAMS = { + title: { + id: 0, + name: 'title' + }, + icon: { + id: 2, + type: 1, + name: 'img' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + sponsoredBy: { + id: 5, + name: 'data', + type: 1 + }, + body: { + id: 4, + name: 'data', + type: 2 + }, + cta: { + id: 1, + type: 12, + name: 'data' + } +}; +const NATIVE_ASSET_IDS = Object.entries(NATIVE_PARAMS).reduce((acc, _ref) => { + let [key, value] = _ref; + acc[value.id] = key; + return acc; +}, {}); +const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const OB_USER_TOKEN_KEY = 'OB-USER-TOKEN'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: bid => { + if (typeof bid.params !== 'object') { + return false; + } + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.publisher.id') !== 'string') { + return false; + } + if (!!bid.params.tagid && typeof bid.params.tagid !== 'string') { + return false; + } + if (!!bid.params.bcat && (typeof bid.params.bcat !== 'object' || !bid.params.bcat.every(item => typeof item === 'string'))) { + return false; + } + if (!!bid.params.badv && (typeof bid.params.badv !== 'object' || !bid.params.badv.every(item => typeof item === 'string'))) { + return false; + } + return !!_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('outbrain.bidderUrl') && (!!(bid.nativeParams || bid.sizes) || isValidVideoRequest(bid)); + }, + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const ortb2 = bidderRequest.ortb2 || {}; + const page = bidderRequest.refererInfo.page; + const ua = navigator.userAgent; + const test = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.setOnAny)(validBidRequests, 'params.test'); + const publisher = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.setOnAny)(validBidRequests, 'params.publisher'); + const bcat = ortb2.bcat || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.setOnAny)(validBidRequests, 'params.bcat'); + const badv = ortb2.badv || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.setOnAny)(validBidRequests, 'params.badv'); + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.setOnAny)(validBidRequests, 'userIdAsEids'); + const wlang = ortb2.wlang; + const cur = CURRENCY; + const endpointUrl = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('outbrain.bidderUrl'); + const timeout = bidderRequest.timeout; + const imps = validBidRequests.map((bid, id) => { + const imp = { + id: id + 1 + '' + }; + if (bid.params.tagid) { + imp.tagid = bid.params.tagid; + } + if (bid.nativeParams) { + imp.native = { + request: JSON.stringify({ + assets: getNativeAssets(bid) + }) + }; + } else if (isVideoRequest(bid)) { + imp.video = getVideoAsset(bid); + } else { + imp.banner = { + format: bid.sizes?.map(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.parseGPTSingleSizeArrayToRtbSize)(size)) + }; + } + if (typeof bid.getFloor === 'function') { + const floor = _getFloor(bid, bid.nativeParams ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER); + if (floor) { + imp.bidfloor = floor; + } + } + return imp; + }); + const request = { + id: bidderRequest.bidderRequestId, + site: { + page, + publisher + }, + device: ortb2?.device || { + ua + }, + source: { + fd: 1 + }, + cur: [cur], + tmax: timeout, + imp: imps, + bcat: bcat, + badv: badv, + wlang: wlang, + ext: { + prebid: { + channel: { + name: 'pbjs', + version: "9.45.0-pre" + } + } + } + }; + if (test) { + request.is_debug = !!test; + request.test = 1; + } + const obUserToken = storage.getDataFromLocalStorage(OB_USER_TOKEN_KEY); + if (obUserToken) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.obusertoken', obUserToken); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gdprConsent.gdprApplies')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies & 1); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.coppa', _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') & 1); + } + if (bidderRequest.gppConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gpp_sid', bidderRequest.gppConsent.applicableSections); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.regs.gpp')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gpp', bidderRequest.ortb2.regs.gpp); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'regs.ext.gpp_sid', bidderRequest.ortb2.regs.gpp_sid); + } + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request, 'user.ext.eids', eids); + } + return { + method: 'POST', + url: endpointUrl, + data: JSON.stringify(request), + bids: validBidRequests + }; + }, + interpretResponse: (serverResponse, _ref2) => { + let { + bids + } = _ref2; + if (!serverResponse.body) { + return []; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidResponses = seatbid.map(seat => seat.bid).flat().reduce((result, bid) => { + result[bid.impid - 1] = bid; + return result; + }, []); + return bids.map((bid, id) => { + const bidResponse = bidResponses[id]; + if (bidResponse) { + let type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + if (bid.nativeParams) { + type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE; + } else if (isVideoRequest(bid)) { + type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + } + const bidObject = { + requestId: bid.bidId, + cpm: bidResponse.price, + creativeId: bidResponse.crid, + ttl: 360, + netRevenue: true, + currency: cur, + mediaType: type, + nurl: bidResponse.nurl + }; + if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE) { + bidObject.native = parseNative(bidResponse); + } else if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + bidObject.ad = bidResponse.adm; + bidObject.width = bidResponse.w; + bidObject.height = bidResponse.h; + } else if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO) { + bidObject.vastXml = bidResponse.adm; + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context'); + if (videoContext === _src_video_js__WEBPACK_IMPORTED_MODULE_7__.OUTSTREAM) { + bidObject.renderer = createRenderer(bid); + } + } + bidObject.meta = {}; + if (bidResponse.adomain && bidResponse.adomain.length > 0) { + bidObject.meta.advertiserDomains = bidResponse.adomain; + } + return bidObject; + } + }).filter(Boolean); + }, + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent, gppConsent) => { + const syncs = []; + let syncUrl = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('outbrain.usersyncUrl'); + let query = []; + if (syncOptions.pixelEnabled && syncUrl) { + if (gdprConsent) { + query.push('gdpr=' + (gdprConsent.gdprApplies & 1)); + query.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '')); + } + if (uspConsent) { + query.push('us_privacy=' + encodeURIComponent(uspConsent)); + } + if (gppConsent) { + query.push('gpp=' + encodeURIComponent(gppConsent.gppString)); + query.push('gpp_sid=' + encodeURIComponent(gppConsent.applicableSections.join(','))); + } + syncs.push({ + type: 'image', + url: syncUrl + (query.length ? '?' + query.join('&') : '') + }); + } + return syncs; + }, + onBidWon: bid => { + // for native requests we put the nurl as an imp tracker, otherwise if the auction takes place on prebid server + // the server JS adapter puts the nurl in the adm as a tracking pixel and removes the attribute + if (bid.nurl) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_8__.ajax)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.replaceAuctionPrice)(bid.nurl, bid.originalCpm)); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +function parseNative(bid) { + const { + assets, + link, + privacy, + eventtrackers + } = JSON.parse(bid.adm); + const result = { + clickUrl: link.url, + clickTrackers: link.clicktrackers || undefined + }; + assets.forEach(asset => { + const kind = NATIVE_ASSET_IDS[asset.id]; + const content = kind && asset[NATIVE_PARAMS[kind].name]; + if (content) { + result[kind] = content.text || content.value || { + url: content.url, + width: content.w, + height: content.h + }; + } + }); + if (privacy) { + result.privacyLink = privacy; + } + if (eventtrackers) { + result.impressionTrackers = []; + eventtrackers.forEach(tracker => { + if (tracker.event !== 1) return; + switch (tracker.method) { + case 1: + // img + result.impressionTrackers.push(tracker.url); + break; + case 2: + // js + result.javascriptTrackers = ``; + break; + } + }); + } + return result; +} +function getNativeAssets(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__._map)(bid.nativeParams, (bidParams, key) => { + const props = NATIVE_PARAMS[key]; + const asset = { + required: bidParams.required & 1 + }; + if (props) { + asset.id = props.id; + let wmin, hmin, w, h; + let aRatios = bidParams.aspect_ratios; + if (aRatios && aRatios[0]) { + aRatios = aRatios[0]; + wmin = aRatios.min_width || 0; + hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0; + } + if (bidParams.sizes) { + const sizes = bidParams.sizes.flat(); + w = parseInt(sizes[0], 10); + h = parseInt(sizes[1], 10); + } + asset[props.name] = { + len: bidParams.len, + type: props.type, + wmin, + hmin, + w, + h + }; + return asset; + } + }).filter(Boolean); +} +function getVideoAsset(bid) { + const sizes = bid.mediaTypes.video.playerSize.flat(); + return { + w: parseInt(sizes[0], 10), + h: parseInt(sizes[1], 10), + protocols: bid.mediaTypes.video.protocols, + playbackmethod: bid.mediaTypes.video.playbackmethod, + mimes: bid.mediaTypes.video.mimes, + skip: bid.mediaTypes.video.skip, + delivery: bid.mediaTypes.video.delivery, + api: bid.mediaTypes.video.api, + minbitrate: bid.mediaTypes.video.minbitrate, + maxbitrate: bid.mediaTypes.video.maxbitrate, + minduration: bid.mediaTypes.video.minduration, + maxduration: bid.mediaTypes.video.maxduration, + startdelay: bid.mediaTypes.video.startdelay, + placement: bid.mediaTypes.video.placement, + plcmt: bid.mediaTypes.video.plcmt, + linearity: bid.mediaTypes.video.linearity + }; +} +function _getFloor(bid, type) { + const floorInfo = bid.getFloor({ + currency: CURRENCY, + mediaType: type, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isPlainObject)(floorInfo) && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { + return parseFloat(floorInfo.floor); + } + return null; +} +function isVideoRequest(bid) { + return bid.mediaType === 'video' || !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); +} +function createRenderer(bid) { + let config = {}; + let playerUrl = OUTSTREAM_RENDERER_URL; + let render = function (bid) { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: bid.sizes, + targetId: bid.adUnitCode, + adResponse: { + content: bid.vastXml + } + }); + }); + }; + let externalRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.renderer'); + if (!externalRenderer) { + externalRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'renderer'); + } + if (externalRenderer) { + config = externalRenderer.options; + playerUrl = externalRenderer.url; + render = externalRenderer.render; + } + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_10__.Renderer.install({ + id: bid.adUnitCode, + url: playerUrl, + config: config, + adUnitCode: bid.adUnitCode, + loaded: false + }); + try { + renderer.setRender(render); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function isValidVideoRequest(bid) { + const videoAdUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); + if (!videoAdUnit) { + return false; + } + if (!Array.isArray(videoAdUnit.playerSize)) { + return false; + } + if (videoAdUnit.context == '') { + return false; + } + return true; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('outbrainBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/outbrainBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["overtoneRtdProvider"],{ + +/***/ "./modules/overtoneRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/overtoneRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports OVERTONE_URL, fetchContextData, overtoneRtdProvider, overtoneModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + +const OVERTONE_URL = 'https://prebid-1.overtone.ai/contextual'; +const logMessage = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Overtone', ...args); +}; +async function fetchContextData() { + let url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.href; + const pageUrl = encodeURIComponent(url); + const requestUrl = `${OVERTONE_URL}?URL=${pageUrl}&InApp=False`; + const request = window.ajaxBuilder || (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajaxBuilder)(); + return new Promise((resolve, reject) => { + logMessage('Sending request to:', requestUrl); + request(requestUrl, { + success: response => { + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.safeJSONParse)(response); + logMessage('Fetched data:', data); + if (!data || typeof data.status !== 'number') { + reject(new Error('Invalid response format')); + return; + } + switch (data.status) { + case 1: + // Success + resolve({ + categories: data.categories || [] + }); + break; + case 3: // Fail + case 4: + // Ignore + resolve({ + categories: [] + }); + break; + default: + reject(new Error(`Unexpected response status: ${data.status}`)); + } + }, + error: err => { + logMessage('Error during request:', err); + reject(err); + } + }); + }); +} +function init(config) { + logMessage('init', config); + return true; +} +const overtoneRtdProvider = { + name: 'overtone', + init: init, + getBidRequestData: function (bidReqConfig, callback) { + fetchContextData().then(contextData => { + if (contextData) { + if (!bidReqConfig.ortb2Fragments.global.site.ext) { + bidReqConfig.ortb2Fragments.global.site.ext = {}; + } + bidReqConfig.ortb2Fragments.global.site.ext.data = contextData; + } + callback(); + }).catch(error => { + logMessage('Error fetching context data', error); + callback(); + }); + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('realTimeData', overtoneRtdProvider); +const overtoneModule = { + fetchContextData +}; +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('overtoneRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/overtoneRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ownadxBidAdapter"],{ + +/***/ "./modules/ownadxBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/ownadxBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'ownadx'; +const CUR = 'USD'; +const CREATIVE_TTL = 300; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.tokenId && bid.params.sspId && bid.params.seatId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param validBidRequests + * @param bidderRequest + * @return Array Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bidRequest.params.size || bidRequest.sizes); + let mtype = 0; + if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + mtype = 1; + } else { + mtype = 2; + } + let tkn = bidRequest.params.tokenId; + let seatid = bidRequest.params.seatId; + let sspid = bidRequest.params.sspId; + const payload = { + sizes: sizes, + slotBidId: bidRequest.bidId, + PageUrl: bidderRequest.refererInfo.page, + mediaChannel: mtype + }; + return { + method: 'POST', + url: `https://pbs-js.prebid-ownadx.com/publisher/prebid/${seatid}/${sspid}?token=${tkn}`, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const response = serverResponse.body; + const bids = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(response)) { + return bids; + } + const responseBid = { + width: response.width, + height: response.height, + token: response.tokenId, + ttl: CREATIVE_TTL, + requestId: response.slotBidId, + aType: response.adType || '1', + cpm: response.cpm, + creativeId: response.creativeId || 0, + netRevenue: response.netRevenue || false, + currency: response.currency || CUR, + meta: { + mediaType: response.mediaType || _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + advertiserDomains: response.advertiserDomains || [] + }, + ad: response.adm + }; + bids.push(responseBid); + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('ownadxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ownadxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["oxxionAnalyticsAdapter"],{ + +/***/ "./modules/oxxionAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/oxxionAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export dereferenceWithoutRenderer */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +const analyticsType = 'endpoint'; +const url = 'URL_TO_SERVER_ENDPOINT'; +const { + AUCTION_END, + BID_WON, + BID_RESPONSE, + BID_REQUESTED, + BID_TIMEOUT +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +let saveEvents = {}; +let allEvents = {}; +let auctionEnd = {}; +let initOptions = {}; +let mode = {}; +let endpoint = 'https://default'; +let requestsAttributes = ['adUnitCode', 'auctionId', 'bidder', 'bidderCode', 'bidId', 'cpm', 'creativeId', 'currency', 'width', 'height', 'mediaType', 'netRevenue', 'originalCpm', 'originalCurrency', 'requestId', 'size', 'source', 'status', 'timeToRespond', 'transactionId', 'ttl', 'sizes', 'mediaTypes', 'src', 'params', 'userId', 'labelAny', 'bids', 'adId', 'ova']; +function getAdapterNameForAlias(aliasName) { + return _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].aliasRegistry[aliasName] || aliasName; +} +function filterAttributes(arg, removead) { + let response = {}; + if (typeof arg == 'object') { + if (typeof arg['bidderCode'] == 'string') { + response['originalBidder'] = getAdapterNameForAlias(arg['bidderCode']); + } else if (typeof arg['bidder'] == 'string') { + response['originalBidder'] = getAdapterNameForAlias(arg['bidder']); + } + if (!removead && typeof arg['ad'] != 'undefined') { + response['ad'] = arg['ad']; + } + if (typeof arg['gdprConsent'] != 'undefined') { + response['gdprConsent'] = {}; + if (typeof arg['gdprConsent']['consentString'] != 'undefined') { + response['gdprConsent']['consentString'] = arg['gdprConsent']['consentString']; + } + } + if (typeof arg['meta'] == 'object') { + response['meta'] = {}; + if (typeof arg['meta']['advertiserDomains'] != 'undefined') { + response['meta']['advertiserDomains'] = arg['meta']['advertiserDomains']; + } + if (typeof arg['meta']['demandSource'] == 'string') { + response['meta']['demandSource'] = arg['meta']['demandSource']; + } + } + requestsAttributes.forEach(attr => { + if (typeof arg[attr] != 'undefined') { + response[attr] = arg[attr]; + } + }); + if (typeof response['creativeId'] == 'number') { + response['creativeId'] = response['creativeId'].toString(); + } + } + response['oxxionMode'] = mode; + return response; +} +function cleanAuctionEnd(args) { + let response = {}; + let filteredObj; + let objects = ['bidderRequests', 'bidsReceived', 'noBids', 'adUnits']; + objects.forEach(attr => { + if (Array.isArray(args[attr])) { + response[attr] = []; + args[attr].forEach(obj => { + filteredObj = filterAttributes(obj, true); + if (typeof obj['bids'] == 'object') { + filteredObj['bids'] = []; + obj['bids'].forEach(bid => { + filteredObj['bids'].push(filterAttributes(bid, true)); + }); + } + response[attr].push(filteredObj); + }); + } + }); + return response; +} +function cleanCreatives(args) { + let stringArgs = JSON.parse(dereferenceWithoutRenderer(args)); + return filterAttributes(stringArgs, false); +} +function enhanceMediaType(arg) { + saveEvents['bidRequested'].forEach(bidRequested => { + if (bidRequested['auctionId'] == arg['auctionId'] && Array.isArray(bidRequested['bids'])) { + bidRequested['bids'].forEach(bid => { + if (bid['transactionId'] == arg['transactionId'] && bid['bidId'] == arg['requestId']) { + arg['mediaTypes'] = bid['mediaTypes']; + } + }); + } + }); + return arg; +} +function addBidResponse(args) { + let eventType = BID_RESPONSE; + let argsCleaned = cleanCreatives(args); + ; + if (allEvents[eventType] == undefined) { + allEvents[eventType] = []; + } + allEvents[eventType].push(argsCleaned); +} +function addBidRequested(args) { + let eventType = BID_REQUESTED; + let argsCleaned = filterAttributes(args, true); + if (saveEvents[eventType] == undefined) { + saveEvents[eventType] = []; + } + saveEvents[eventType].push(argsCleaned); +} +function addTimeout(args) { + let eventType = BID_TIMEOUT; + if (saveEvents[eventType] == undefined) { + saveEvents[eventType] = []; + } + saveEvents[eventType].push(args); + let argsCleaned = []; + let argsDereferenced = {}; + let stringArgs = JSON.parse(dereferenceWithoutRenderer(args)); + argsDereferenced = stringArgs; + argsDereferenced.forEach(attr => { + argsCleaned.push(filterAttributes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(attr), false)); + }); + if (auctionEnd[eventType] == undefined) { + auctionEnd[eventType] = []; + } + auctionEnd[eventType].push(argsCleaned); +} +const dereferenceWithoutRenderer = function (args) { + if (args.renderer) { + let tmp = args.renderer; + delete args.renderer; + let stringified = JSON.stringify(args); + args['renderer'] = tmp; + return stringified; + } + if (args.bidsReceived) { + let tmp = {}; + for (let key in args.bidsReceived) { + if (args.bidsReceived[key].renderer) { + tmp[key] = args.bidsReceived[key].renderer; + delete args.bidsReceived[key].renderer; + } + } + let stringified = JSON.stringify(args); + for (let key in tmp) { + args.bidsReceived[key].renderer = tmp[key]; + } + return stringified; + } + return JSON.stringify(args); +}; +function addAuctionEnd(args) { + let eventType = AUCTION_END; + if (saveEvents[eventType] == undefined) { + saveEvents[eventType] = []; + } + saveEvents[eventType].push(args); + let argsCleaned = cleanAuctionEnd(JSON.parse(dereferenceWithoutRenderer(args))); + if (auctionEnd[eventType] == undefined) { + auctionEnd[eventType] = []; + } + auctionEnd[eventType].push(argsCleaned); +} +function handleBidWon(args) { + args = enhanceMediaType(filterAttributes(JSON.parse(dereferenceWithoutRenderer(args)), true)); + let increment = args['cpm']; + if (typeof saveEvents['auctionEnd'] == 'object') { + saveEvents['auctionEnd'].forEach(auction => { + if (auction['auctionId'] == args['auctionId'] && typeof auction['bidsReceived'] == 'object') { + auction['bidsReceived'].forEach(bid => { + if (bid['transactionId'] == args['transactionId'] && bid['adId'] != args['adId']) { + if (args['cpm'] < bid['cpm']) { + increment = 0; + } else if (increment > args['cpm'] - bid['cpm']) { + increment = args['cpm'] - bid['cpm']; + } + } + }); + } + if (auction['auctionId'] == args['auctionId'] && typeof auction['bidderRequests'] == 'object') { + auction['bidderRequests'].forEach(req => { + req.bids.forEach(bid => { + if (bid['bidId'] == args['requestId'] && bid['transactionId'] == args['transactionId']) { + args['ova'] = bid['ova']; + } + }); + }); + } + }); + } + args['cpmIncrement'] = increment; + args['referer'] = encodeURIComponent((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().topmostLocation); + if (typeof saveEvents.bidRequested == 'object' && saveEvents.bidRequested.length > 0 && saveEvents.bidRequested[0].gdprConsent) { + args.gdpr = saveEvents.bidRequested[0].gdprConsent; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(endpoint + '.oxxion.io/analytics/bid_won', null, JSON.stringify(args), { + method: 'POST', + withCredentials: true + }); +} +function handleAuctionEnd() { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(endpoint + '.oxxion.io/analytics/auctions', function (data) { + let list = JSON.parse(data); + if (Array.isArray(list) && typeof allEvents['bidResponse'] != 'undefined') { + let alreadyCalled = []; + allEvents['bidResponse'].forEach(bidResponse => { + let tmpId = bidResponse['originalBidder'] + '_' + bidResponse['creativeId']; + if (list.includes(tmpId) && !alreadyCalled.includes(tmpId)) { + alreadyCalled.push(tmpId); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(endpoint + '.oxxion.io/analytics/creatives', null, JSON.stringify(bidResponse), { + method: 'POST', + withCredentials: true + }); + } + }); + } + allEvents = {}; + }, JSON.stringify(auctionEnd), { + method: 'POST', + withCredentials: true + }); + auctionEnd = {}; +} +let oxxionAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + url, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_END: + addAuctionEnd(args); + handleAuctionEnd(); + break; + case BID_WON: + handleBidWon(args); + break; + case BID_RESPONSE: + addBidResponse(args); + break; + case BID_REQUESTED: + addBidRequested(args); + break; + case BID_TIMEOUT: + addTimeout(args); + break; + } + } +}); + +// save the base class function +oxxionAnalytics.originEnableAnalytics = oxxionAnalytics.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +oxxionAnalytics.enableAnalytics = function (config) { + oxxionAnalytics.originEnableAnalytics(config); // call the base class function + initOptions = config.options; + if (initOptions.domain) { + endpoint = 'https://' + initOptions.domain; + } + if (window.OXXION_MODE) { + mode = window.OXXION_MODE; + } +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: oxxionAnalytics, + code: 'oxxion' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (oxxionAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('oxxionAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/oxxionAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["oxxionRtdProvider"],{ + +/***/ "./modules/oxxionRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/oxxionRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export oxxionSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const LOG_PREFIX = 'oxxionRtdProvider submodule: '; +const bidderAliasRegistry = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"].aliasRegistry || {}; + +/** @type {RtdSubmodule} */ +const oxxionSubmodule = { + name: 'oxxionRtd', + init: init, + getBidRequestData: getAdUnits, + getRequestsList: getRequestsList, + getFilteredAdUnitsOnBidRates: getFilteredAdUnitsOnBidRates +}; +function init(config, userConsent) { + if (!config.params || !config.params.domain) { + return false; + } + if (typeof config.params.threshold != 'undefined' && typeof config.params.samplingRate == 'number') { + return true; + } + return false; +} +function getAdUnits(reqBidsConfigObj, callback, config, userConsent) { + const moduleStarted = new Date(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_PREFIX + 'started with ', config); + if (typeof config.params.threshold != 'undefined' && typeof config.params.samplingRate == 'number') { + let filteredBids; + const requests = getRequestsList(reqBidsConfigObj); + const gdpr = userConsent && userConsent.gdpr ? userConsent.gdpr.consentString : null; + const payload = { + gdpr, + requests + }; + const endpoint = 'https://' + config.params.domain + '.oxxion.io/analytics/bid_rate_interests'; + getPromisifiedAjax(endpoint, JSON.stringify(payload), { + method: 'POST', + withCredentials: true + }).then(bidsRateInterests => { + if (bidsRateInterests.length) { + [reqBidsConfigObj.adUnits, filteredBids] = getFilteredAdUnitsOnBidRates(bidsRateInterests, reqBidsConfigObj.adUnits, config.params, true); + } + if (filteredBids.length > 0) { + getPromisifiedAjax('https://' + config.params.domain + '.oxxion.io/analytics/request_rejecteds', JSON.stringify({ + 'bids': filteredBids, + 'gdpr': gdpr + }), { + method: 'POST', + withCredentials: true + }); + } + if (typeof callback == 'function') { + callback(); + } + const timeToRun = new Date() - moduleStarted; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_PREFIX + ' time to run: ' + timeToRun); + if (getRandomNumber(50) == 1) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)('https://' + config.params.domain + '.oxxion.io/ova/time', null, JSON.stringify({ + 'duration': timeToRun, + 'auctionId': reqBidsConfigObj.auctionId + }), { + method: 'POST', + withCredentials: true + }); + } + }).catch(error => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(LOG_PREFIX, 'bidInterestError', error)); + } +} +function getPromisifiedAjax(url) { + let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return new Promise((resolve, reject) => { + const callbacks = { + success(responseText, _ref) { + let { + response + } = _ref; + resolve(JSON.parse(response)); + }, + error(error) { + reject(error); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(url, callbacks, data, options); + }); +} +function getFilteredAdUnitsOnBidRates(bidsRateInterests, adUnits, params, useSampling) { + const { + threshold, + samplingRate + } = params; + const sampling = getRandomNumber(100) < samplingRate && useSampling; + const filteredBids = []; + // Separate bidsRateInterests in two groups against threshold & samplingRate + const { + interestingBidsRates, + uninterestingBidsRates, + sampledBidsRates + } = bidsRateInterests.reduce((acc, interestingBid) => { + const isBidRateUpper = typeof threshold == 'number' ? interestingBid.rate === true || interestingBid.rate > threshold : interestingBid.suggestion; + const isBidInteresting = isBidRateUpper || sampling; + const key = isBidInteresting ? 'interestingBidsRates' : 'uninterestingBidsRates'; + acc[key].push(interestingBid); + if (!isBidRateUpper && sampling) { + acc['sampledBidsRates'].push(interestingBid); + } + return acc; + }, { + interestingBidsRates: [], + uninterestingBidsRates: [], + // Do something with later + sampledBidsRates: [] + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_PREFIX, 'getFilteredAdUnitsOnBidRates()', interestingBidsRates, uninterestingBidsRates); + // Filter bids and adUnits against interesting bids rates + const newAdUnits = adUnits.filter((_ref2, adUnitIndex) => { + let { + bids = [] + } = _ref2; + adUnits[adUnitIndex].bids = bids.filter((bid, bidIndex) => { + if (!params.bidders || params.bidders.includes(bid.bidder)) { + const index = interestingBidsRates.findIndex(_ref3 => { + let { + id + } = _ref3; + return id === bid._id; + }); + if (index == -1) { + let tmpBid = bid; + tmpBid['code'] = adUnits[adUnitIndex].code; + tmpBid['mediaTypes'] = adUnits[adUnitIndex].mediaTypes; + tmpBid['originalBidder'] = bidderAliasRegistry[bid.bidder] || bid.bidder; + if (tmpBid.floorData) { + delete tmpBid.floorData; + } + filteredBids.push(tmpBid); + adUnits[adUnitIndex].bids[bidIndex]['ova'] = 'filtered'; + } else { + if (sampledBidsRates.findIndex(_ref4 => { + let { + id + } = _ref4; + return id === bid._id; + }) == -1) { + adUnits[adUnitIndex].bids[bidIndex]['ova'] = 'cleared'; + } else { + adUnits[adUnitIndex].bids[bidIndex]['ova'] = 'sampled'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_PREFIX + ' sampled ! '); + } + } + delete bid._id; + return index !== -1; + } else { + adUnits[adUnitIndex].bids[bidIndex]['ova'] = 'protected'; + return true; + } + }); + return !!adUnits[adUnitIndex].bids.length; + }); + return [newAdUnits, filteredBids]; +} +function getRandomNumber() { + let max = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10; + return Math.round(Math.random() * max); +} +function getRequestsList(reqBidsConfigObj) { + let count = 0; + return reqBidsConfigObj.adUnits.flatMap(_ref5 => { + let { + bids = [], + mediaTypes = {}, + code = '' + } = _ref5; + return bids.reduce((acc, _ref6, index) => { + let { + bidder = '', + params = {} + } = _ref6; + const id = count++; + bids[index]._id = id; + return acc.concat({ + id, + adUnit: code, + bidder, + mediaTypes + }); + }, []); + }); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('realTimeData', oxxionSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('oxxionRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/oxxionRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ozoneBidAdapter"],{ + +/***/ "./modules/ozoneBidAdapter.js": +/*!************************************!*\ + !*** ./modules/ozoneBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, injectAdIdsIntoAllBidResponses, checkDeepArray, defaultSize, ozoneGetWinnerForRequestBid, ozoneGetAllBidsForBidId, getRoundedBid, getGranularityKeyName, getGranularityObject, ozoneAddStandardProperties, getWidthAndHeightFromVideoObject, playerSizeIsNestedArray */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/cpmBucketManager.js */ "./src/cpmBucketManager.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + +const BIDDER_CODE = 'ozone'; +const ORIGIN = 'https://elb.the-ozone-project.com'; // applies only to auction & cookie +const AUCTIONURI = '/openrtb2/auction'; +const OZONECOOKIESYNC = '/static/load-cookie.html'; +const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js'; +const ORIGIN_DEV = 'https://test.ozpr.net'; +const OZONEVERSION = '3.0.0'; +const spec = { + gvlid: 524, + aliases: [{ + code: 'venatus', + gvlid: 524 + }], + version: OZONEVERSION, + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + cookieSyncBag: { + publisherId: null, + siteId: null, + userIdObject: {} + }, + // variables we want to make available to cookie sync + propertyBag: { + pageId: null, + buildRequestsStart: 0, + buildRequestsEnd: 0, + endpointOverride: null + }, + /* allow us to store vars in instance scope - needs to be an object to be mutable */ + whitelabel_defaults: { + 'logId': 'OZONE', + 'bidder': 'ozone', + 'keyPrefix': 'oz', + 'auctionUrl': ORIGIN + AUCTIONURI, + 'cookieSyncUrl': ORIGIN + OZONECOOKIESYNC, + 'rendererUrl': OZONE_RENDERER_URL, + 'batchRequests': false /* you can change this to true OR numeric OR override it in the config: config.ozone.batchRequests = true/false/number */ + }, + loadWhitelabelData(bid) { + if (this.propertyBag.whitelabel) { + return; + } + this.propertyBag.whitelabel = JSON.parse(JSON.stringify(this.whitelabel_defaults)); + let bidder = bid.bidder || 'ozone'; // eg. ozone + this.propertyBag.whitelabel.logId = bidder.toUpperCase(); + this.propertyBag.whitelabel.bidder = bidder; + let bidderConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(bidder) || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('got bidderConfig: ', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(bidderConfig)); + if (bidderConfig.kvpPrefix) { + this.propertyBag.whitelabel.keyPrefix = bidderConfig.kvpPrefix; + } + let arr = this.getGetParametersAsObject(); + if (bidderConfig.endpointOverride) { + if (bidderConfig.endpointOverride.origin) { + this.propertyBag.endpointOverride = bidderConfig.endpointOverride.origin; + this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.origin + AUCTIONURI; + this.propertyBag.whitelabel.cookieSyncUrl = bidderConfig.endpointOverride.origin + OZONECOOKIESYNC; + } + if (arr.hasOwnProperty('renderer')) { + if (arr.renderer.match('%3A%2F%2F')) { + this.propertyBag.whitelabel.rendererUrl = decodeURIComponent(arr['renderer']); + } else { + this.propertyBag.whitelabel.rendererUrl = arr['renderer']; + } + } else if (bidderConfig.endpointOverride.rendererUrl) { + this.propertyBag.whitelabel.rendererUrl = bidderConfig.endpointOverride.rendererUrl; + } + if (bidderConfig.endpointOverride.cookieSyncUrl) { + this.propertyBag.whitelabel.cookieSyncUrl = bidderConfig.endpointOverride.cookieSyncUrl; + } + if (bidderConfig.endpointOverride.auctionUrl) { + this.propertyBag.endpointOverride = bidderConfig.endpointOverride.auctionUrl; + this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.auctionUrl; + } + } + if (bidderConfig.hasOwnProperty('batchRequests')) { + if (this.batchValueIsValid(bidderConfig.batchRequests)) { + this.propertyBag.whitelabel.batchRequests = bidderConfig.batchRequests; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('invalid config: batchRequest'); + } + } + if (bidderConfig.hasOwnProperty('videoParams')) { + this.propertyBag.whitelabel.videoParams = bidderConfig.videoParams; + } + if (arr.hasOwnProperty('batchRequests')) { + let getBatch = parseInt(arr.batchRequests); + if (this.batchValueIsValid(getBatch)) { + this.propertyBag.whitelabel.batchRequests = getBatch; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('invalid GET: batchRequests'); + } + } + try { + if (arr.hasOwnProperty('auction') && arr.auction === 'dev') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('GET: auction=dev'); + this.propertyBag.whitelabel.auctionUrl = ORIGIN_DEV + AUCTIONURI; + } + if (arr.hasOwnProperty('cookiesync') && arr.cookiesync === 'dev') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('GET: cookiesync=dev'); + this.propertyBag.whitelabel.cookieSyncUrl = ORIGIN_DEV + OZONECOOKIESYNC; + } + } catch (e) {} + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('whitelabel: ', this.propertyBag.whitelabel); + }, + batchValueIsValid(batch) { + return typeof batch === 'boolean' || typeof batch === 'number' && batch > 0; + }, + getAuctionUrl() { + return this.propertyBag.whitelabel.auctionUrl; + }, + getCookieSyncUrl() { + return this.propertyBag.whitelabel.cookieSyncUrl; + }, + getRendererUrl() { + return this.propertyBag.whitelabel.rendererUrl; + }, + getVideoPlacementValue: function (context) { + if (['instream', 'outstream'].indexOf(context) < 0) return null; /* do not allow arbitrary strings */ + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(this.propertyBag, `whitelabel.videoParams.${context}`, null); + }, + getBatchRequests() { + if (this.propertyBag.whitelabel.batchRequests === true) { + return 10; + } + if (typeof this.propertyBag.whitelabel.batchRequests === 'number' && this.propertyBag.whitelabel.batchRequests > 0) { + return this.propertyBag.whitelabel.batchRequests; + } + return false; + }, + isBidRequestValid(bid) { + let vf = 'VALIDATION FAILED'; + this.loadWhitelabelData(bid); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('isBidRequestValid : ', _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(), bid); + let adUnitCode = bid.adUnitCode; // adunit[n].code + let err1 = `${vf} : missing {param} : siteId, placementId and publisherId are REQUIRED`; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('placementId', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err1.replace('{param}', 'placementId'), adUnitCode); + return false; + } + if (!this.isValidPlacementId(bid.params.placementId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : placementId must be exactly 10 numbers`, adUnitCode); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('publisherId', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err1.replace('{param}', 'publisherId'), adUnitCode); + return false; + } + if (!bid.params.publisherId.toString().match(/^[a-zA-Z0-9\-]{12}$/)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : publisherId must be /^[a-zA-Z0-9\\-]{12}$/`, adUnitCode); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('siteId', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(err1.replace('{param}', 'siteId'), adUnitCode); + return false; + } + if (!bid.params.siteId.toString().match(/^[0-9]{10}$/)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : siteId must be /^[0-9]{10}$/`, adUnitCode); + return false; + } + if (bid.params.hasOwnProperty('customParams')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : customParams should be renamed: customData`, adUnitCode); + return false; + } + if (bid.params.hasOwnProperty('customData')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.params.customData)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : customData is not an Array`, adUnitCode); + return false; + } + if (bid.params.customData.length < 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : empty customData`, adUnitCode); + return false; + } + if (!bid.params.customData[0].hasOwnProperty('targeting')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} :no customData[0].targeting`, adUnitCode); + return false; + } + if (typeof bid.params.customData[0]['targeting'] != 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} : customData[0].targeting is not an Object`, adUnitCode); + return false; + } + } + if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)) { + if (!bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]?.context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} No video context key/value`); + return false; + } + if (['instream', 'outstream'].indexOf(bid.mediaTypes?.[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]?.context) < 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${vf} video.context is invalid.`); + return false; + } + } + return true; + }, + isValidPlacementId(placementId) { + return placementId.toString().match(/^[0-9]{10}$/); + }, + buildRequests(validBidRequests, bidderRequest) { + this.loadWhitelabelData(validBidRequests[0]); + this.propertyBag.buildRequestsStart = new Date().getTime(); + let whitelabelBidder = this.propertyBag.whitelabel.bidder; // by default = ozone + let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`buildRequests time: ${this.propertyBag.buildRequestsStart} v ${OZONEVERSION} validBidRequests`, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(validBidRequests), 'bidderRequest', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(bidderRequest)); + if (this.blockTheRequest()) { + return []; + } + let fledgeEnabled = !!bidderRequest.fledgeEnabled; // IF true then this is added as each bid[].ext.ae=1 + let htmlParams = { + 'publisherId': '', + 'siteId': '' + }; + if (validBidRequests.length > 0) { + Object.assign(this.cookieSyncBag.userIdObject, this.findAllUserIdsFromEids(validBidRequests[0])); + this.cookieSyncBag.siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'params.siteId'); + this.cookieSyncBag.publisherId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests[0], 'params.publisherId'); + htmlParams = validBidRequests[0].params; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('cookie sync bag', this.cookieSyncBag); + let singleRequest = this.getWhitelabelConfigItem('ozone.singleRequest'); + singleRequest = singleRequest !== false; // undefined & true will be true + let ozoneRequest = {}; // we only want to set specific properties on this, not validBidRequests[0].params + let fpd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2', null); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('got ortb2 fpd: ', fpd); + if (fpd && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(fpd, 'user')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('added FPD user object'); + ozoneRequest.user = fpd.user; + } + const getParams = this.getGetParametersAsObject(); + const wlOztestmodeKey = whitelabelPrefix + 'testmode'; + const isTestMode = getParams[wlOztestmodeKey] || null; // this can be any string, it's used for testing ads + ozoneRequest.device = bidderRequest?.ortb2?.device || {}; // 20240925 rupesh changed this + let placementIdOverrideFromGetParam = this.getPlacementIdOverrideFromGetParam(); // null or string + let schain = null; + var auctionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests, '0.ortb2.source.tid'); + if (auctionId === '0') { + auctionId = null; + } + let tosendtags = validBidRequests.map(ozoneBidRequest => { + var obj = {}; + let placementId = placementIdOverrideFromGetParam || this.getPlacementId(ozoneBidRequest); // prefer to use a valid override param, else the bidRequest placement Id + obj.id = ozoneBidRequest.bidId; // this causes an error if we change it to something else, even if you update the bidRequest object: "WARNING: Bidder ozone made bid for unknown request ID: mb7953.859498327448. Ignoring." + obj.tagid = placementId; + obj.secure = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)().page).protocol === 'https' ? 1 : 0; + let arrBannerSizes = []; + if (!ozoneBidRequest.hasOwnProperty('mediaTypes')) { + if (ozoneBidRequest.hasOwnProperty('sizes')) { + arrBannerSizes = ozoneBidRequest.sizes; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('no mediaTypes or sizes array. Cannot set sizes for banner type'); + } + } else { + if (ozoneBidRequest.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)) { + arrBannerSizes = ozoneBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; /* Note - if there is a sizes element in the config root it will be pushed into here */ + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('setting banner size from mediaTypes.banner for bidId ' + obj.id + ': ', arrBannerSizes); + } + if (ozoneBidRequest.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('openrtb 2.5 compliant video'); + if (typeof ozoneBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] == 'object') { + let childConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ozoneBidRequest, 'params.video', {}); + obj.video = this.unpackVideoConfigIntoIABformat(ozoneBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], childConfig); + obj.video = this.addVideoDefaults(obj.video, ozoneBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], childConfig); + } + let wh = getWidthAndHeightFromVideoObject(obj.video); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`setting video object ${obj.id} from mediaTypes.video: `, obj.video, 'wh=', wh); + let settingToBe = 'setting obj.video.format to be '; // partial, reusable phrase + if (wh && typeof wh === 'object') { + obj.video.w = wh['w']; + obj.video.h = wh['h']; + if (playerSizeIsNestedArray(obj.video)) { + // this should never happen; it was in the original spec for this change though. + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${settingToBe} an array of objects`); + obj.video.ext.format = [wh]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${settingToBe} an object`); + obj.video.ext.format = wh; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`Failed ${settingToBe} anything - bad config`); + } + } + if (ozoneBidRequest.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE)) { + obj.native = ozoneBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`setting native object ${obj.id} from mediaTypes.native element:`, obj.native); + } + if (ozoneBidRequest.hasOwnProperty('getFloor')) { + obj.floor = this.getFloorObjectForAuction(ozoneBidRequest); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('obj.floor is : ', obj.floor); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('no getFloor property'); + } + } + if (arrBannerSizes.length > 0) { + obj.banner = { + topframe: 1, + w: arrBannerSizes[0][0] || 0, + h: arrBannerSizes[0][1] || 0, + format: arrBannerSizes.map(s => { + return { + w: s[0], + h: s[1] + }; + }) + }; + } + obj.placementId = placementId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(obj, 'ext.prebid', { + 'storedrequest': { + 'id': placementId + } + }); + obj.ext[whitelabelBidder] = {}; + obj.ext[whitelabelBidder].adUnitCode = ozoneBidRequest.adUnitCode; // eg. 'mpu' + if (ozoneBidRequest.params.hasOwnProperty('customData')) { + obj.ext[whitelabelBidder].customData = ozoneBidRequest.params.customData; + } + if (ozoneBidRequest.params.hasOwnProperty('ozFloor')) { + let ozFloorParsed = parseFloat(ozoneBidRequest.params.ozFloor); + if (!isNaN(ozFloorParsed)) { + obj.ext[whitelabelBidder].ozFloor = ozFloorParsed; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Ignoring invalid ozFloor value for adunit code: ${ozoneBidRequest.adUnitCode}`); + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`obj.ext.${whitelabelBidder} is `, obj.ext[whitelabelBidder]); + if (isTestMode != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`setting isTestMode: ${isTestMode}`); + if (obj.ext[whitelabelBidder].hasOwnProperty('customData')) { + for (let i = 0; i < obj.ext[whitelabelBidder].customData.length; i++) { + obj.ext[whitelabelBidder].customData[i]['targeting'][wlOztestmodeKey] = isTestMode; + } + } else { + obj.ext[whitelabelBidder].customData = [{ + 'settings': {}, + 'targeting': {} + }]; + obj.ext[whitelabelBidder].customData[0].targeting[wlOztestmodeKey] = isTestMode; + } + } + if (fpd && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(fpd, 'site')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('adding fpd.site'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(obj, `ext.${whitelabelBidder}.customData.0.targeting`, false)) { + Object.assign(obj.ext[whitelabelBidder].customData[0].targeting, fpd.site); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(obj, `ext.${whitelabelBidder}.customData.0.targeting`, fpd.site); + } + } + if (!schain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ozoneBidRequest, 'schain')) { + schain = ozoneBidRequest.schain; + } + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ozoneBidRequest, 'ortb2Imp.ext.gpid'); + if (gpid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(obj, 'ext.gpid', gpid); + } + let transactionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ozoneBidRequest, 'ortb2Imp.ext.tid'); + if (transactionId) { + obj.ext[whitelabelBidder].transactionId = transactionId; // this is the transactionId PER adUnit, common across bidders for this unit + } + if (auctionId) { + obj.ext[whitelabelBidder].auctionId = auctionId; // we were sent a valid auctionId to use - this will also be used as the root id value for the request + } + if (fledgeEnabled) { + // fledge is enabled at some config level - pbjs.setBidderConfig or pbjs.setConfig + const auctionEnvironment = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ozoneBidRequest, 'ortb2Imp.ext.ae'); // this will be set for one of 3 reasons; adunit, setBidderConfig, setConfig + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isInteger)(auctionEnvironment)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(obj, 'ext.ae', auctionEnvironment); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`ignoring ortb2Imp.ext.ae - not an integer for obj.id=${obj.id}`); + } + } + return obj; + }); + let extObj = {}; + extObj[whitelabelBidder] = {}; + extObj[whitelabelBidder][`${whitelabelPrefix}_pb_v`] = OZONEVERSION; + extObj[whitelabelBidder][`${whitelabelPrefix}_rw`] = placementIdOverrideFromGetParam ? 1 : 0; + if (validBidRequests.length > 0) { + let userIds = this.cookieSyncBag.userIdObject; // 2021-01-06 - slight optimisation - we've already found this info + if (userIds.hasOwnProperty('pubcid.org')) { + extObj[whitelabelBidder].pubcid = userIds['pubcid.org']; + } + } + extObj[whitelabelBidder].pv = this.getPageId(); // attach the page ID that will be common to all auction calls for this page if refresh() is called + let ozOmpFloorDollars = this.getWhitelabelConfigItem('ozone.oz_omp_floor'); // valid only if a dollar value (typeof == 'number') + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${whitelabelPrefix}_omp_floor dollar value = `, ozOmpFloorDollars); + if (typeof ozOmpFloorDollars === 'number') { + extObj[whitelabelBidder][`${whitelabelPrefix}_omp_floor`] = ozOmpFloorDollars; + } else if (typeof ozOmpFloorDollars !== 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`IF set, ${whitelabelPrefix}_omp_floor must be a number eg. 1.55. Found:` + typeof ozOmpFloorDollars); + } + let ozWhitelistAdserverKeys = this.getWhitelabelConfigItem('ozone.oz_whitelist_adserver_keys'); + let useOzWhitelistAdserverKeys = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(ozWhitelistAdserverKeys) && ozWhitelistAdserverKeys.length > 0; + extObj[whitelabelBidder][whitelabelPrefix + '_kvp_rw'] = useOzWhitelistAdserverKeys ? 1 : 0; + if (whitelabelBidder !== 'ozone') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('setting aliases object'); + extObj.prebid = { + aliases: { + 'ozone': whitelabelBidder + } + }; + } + if (this.propertyBag.endpointOverride != null) { + extObj[whitelabelBidder]['origin'] = this.propertyBag.endpointOverride; + } + let userExtEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(validBidRequests, '0.userIdAsEids', []); // generate the UserIDs in the correct format for UserId module + ozoneRequest.site = { + 'publisher': { + 'id': htmlParams.publisherId + }, + 'page': (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)().page, + 'id': htmlParams.siteId + }; + ozoneRequest.test = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('debug') ? 1 : 0; + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ADDING GDPR'); + let apiVersion = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent.apiVersion', 1); + ozoneRequest.regs = { + ext: { + gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0, + apiVersion: apiVersion + } + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ozoneRequest, 'regs.ext.gdpr')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('**** Strange CMP info: bidderRequest.gdprConsent exists BUT bidderRequest.gdprConsent.gdprApplies is false. See bidderRequest logged above. ****'); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('WILL NOT ADD GDPR info; no bidderRequest.gdprConsent object'); + } + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('ADDING USP consent info'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('WILL NOT ADD USP consent info; no bidderRequest.uspConsent.'); + } + if (bidderRequest?.ortb2?.regs?.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'regs.gpp', bidderRequest.ortb2.regs.gpp); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid); + } + if (schain) { + // we set this while iterating over the bids + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('schain found'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'source.ext.schain', schain); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'regs.coppa', 1); + } + extObj[whitelabelBidder].cookieDeprecationLabel = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.device.ext.cdep', 'none'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`cookieDeprecationLabel ortb2.device.ext.cdep = ${extObj[whitelabelBidder].cookieDeprecationLabel}`); + let batchRequestsVal = this.getBatchRequests(); // false|numeric + if (typeof batchRequestsVal === 'number') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Batching = ${batchRequestsVal}`); + let arrRet = []; // return an array of objects containing data describing max 10 bids + for (let i = 0; i < tosendtags.length; i += batchRequestsVal) { + ozoneRequest.id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); // Unique ID of the bid request, provided by the exchange. (REQUIRED) + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'user.ext.eids', userExtEids); + if (auctionId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'source.tid', auctionId); + } + ozoneRequest.imp = tosendtags.slice(i, i + batchRequestsVal); + ozoneRequest.ext = extObj; + if (ozoneRequest.imp.length > 0) { + arrRet.push({ + method: 'POST', + url: this.getAuctionUrl(), + data: JSON.stringify(ozoneRequest), + bidderRequest: bidderRequest + }); + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('batch request going to return : ', arrRet); + return arrRet; + } + if (singleRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('single request starting'); + ozoneRequest.id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); // Unique ID of the bid request, provided by the exchange. (REQUIRED) + ozoneRequest.imp = tosendtags; + ozoneRequest.ext = extObj; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'user.ext.eids', userExtEids); + if (auctionId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequest, 'source.tid', auctionId); + } + var ret = { + method: 'POST', + url: this.getAuctionUrl(), + data: JSON.stringify(ozoneRequest), + bidderRequest: bidderRequest + }; + this.propertyBag.buildRequestsEnd = new Date().getTime(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`buildRequests going to return for single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(ret)); + return ret; + } + let arrRet = tosendtags.map(imp => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('non-single response, working on imp : ', imp); + let ozoneRequestSingle = Object.assign({}, ozoneRequest); + ozoneRequestSingle.id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); // Unique ID of the bid request, provided by the exchange. (REQUIRED) + ozoneRequestSingle.imp = [imp]; + ozoneRequestSingle.ext = extObj; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequestSingle, 'user.ext.eids', userExtEids); + if (auctionId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ozoneRequestSingle, 'source.tid', auctionId); + } + return { + method: 'POST', + url: this.getAuctionUrl(), + data: JSON.stringify(ozoneRequestSingle), + bidderRequest: bidderRequest + }; + }); + this.propertyBag.buildRequestsEnd = new Date().getTime(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`buildRequests going to return for non-single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, arrRet); + return arrRet; + }, + getFloorObjectForAuction(bidRequestRef) { + const mediaTypesSizes = { + banner: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequestRef, 'mediaTypes.banner.sizes', null), + video: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequestRef, 'mediaTypes.video.playerSize', null), + native: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequestRef, 'mediaTypes.native.image.sizes', null) + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getFloorObjectForAuction mediaTypesSizes : ', mediaTypesSizes); + let ret = {}; + if (mediaTypesSizes.banner) { + ret.banner = bidRequestRef.getFloor({ + mediaType: 'banner', + currency: 'USD', + size: mediaTypesSizes.banner[0] + }); + } + if (mediaTypesSizes.video) { + ret.video = bidRequestRef.getFloor({ + mediaType: 'video', + currency: 'USD', + size: mediaTypesSizes.video[0] + }); + } + if (mediaTypesSizes.native) { + ret.native = bidRequestRef.getFloor({ + mediaType: 'native', + currency: 'USD', + size: mediaTypesSizes.native[0] + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getFloorObjectForAuction returning : ', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(ret)); + return ret; + }, + interpretResponse(serverResponse, request) { + if (request && request.bidderRequest && request.bidderRequest.bids) { + this.loadWhitelabelData(request.bidderRequest.bids[0]); + } + let startTime = new Date().getTime(); + let whitelabelBidder = this.propertyBag.whitelabel.bidder; // by default = ozone + let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`interpretResponse time: ${startTime} . Time between buildRequests done and interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`serverResponse, request`, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(serverResponse), (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(request)); + serverResponse = serverResponse.body || {}; + let aucId = serverResponse.id; // this will be correct for single requests and non-single + if (!serverResponse.hasOwnProperty('seatbid')) { + return []; + } + if (typeof serverResponse.seatbid !== 'object') { + return []; + } + let arrAllBids = []; + let labels; + let enhancedAdserverTargeting = this.getWhitelabelConfigItem('ozone.enhancedAdserverTargeting'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('enhancedAdserverTargeting', enhancedAdserverTargeting); + if (typeof enhancedAdserverTargeting == 'undefined') { + enhancedAdserverTargeting = true; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('enhancedAdserverTargeting', enhancedAdserverTargeting); + serverResponse.seatbid = injectAdIdsIntoAllBidResponses(serverResponse.seatbid); // we now make sure that each bid in the bidresponse has a unique (within page) adId attribute. + serverResponse.seatbid = this.removeSingleBidderMultipleBids(serverResponse.seatbid); + let ozOmpFloorDollars = this.getWhitelabelConfigItem('ozone.oz_omp_floor'); // valid only if a dollar value (typeof == 'number') + let addOzOmpFloorDollars = typeof ozOmpFloorDollars === 'number'; + let ozWhitelistAdserverKeys = this.getWhitelabelConfigItem('ozone.oz_whitelist_adserver_keys'); + let useOzWhitelistAdserverKeys = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(ozWhitelistAdserverKeys) && ozWhitelistAdserverKeys.length > 0; + for (let i = 0; i < serverResponse.seatbid.length; i++) { + let sb = serverResponse.seatbid[i]; + for (let j = 0; j < sb.bid.length; j++) { + let thisRequestBid = this.getBidRequestForBidId(sb.bid[j].impid, request.bidderRequest.bids); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`seatbid:${i}, bid:${j} Going to set default w h for seatbid/bidRequest`, sb.bid[j], thisRequestBid); + let { + defaultWidth, + defaultHeight + } = defaultSize(thisRequestBid); + let thisBid = ozoneAddStandardProperties(sb.bid[j], defaultWidth, defaultHeight); + thisBid.meta = { + advertiserDomains: thisBid.adomain || [] + }; + let videoContext = null; + let isVideo = false; + let bidType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.type'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`this bid type is : ${bidType}`); + let adserverTargeting = {}; + if (bidType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + isVideo = true; + this.setBidMediaTypeIfNotExist(thisBid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + videoContext = this.getVideoContextForBidId(thisBid.bidId, request.bidderRequest.bids); // should be instream or outstream (or null if error) + if (videoContext === 'outstream') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('setting thisBid.mediaType = VIDEO & attach a renderer to OUTSTREAM video'); + thisBid.renderer = newRenderer(thisBid.bidId); + thisBid.vastUrl = `https://${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_cache_host', 'missing_host')}${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_cache_path', 'missing_path')}?uuid=${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_uuid', 'missing_uuid')}`; + thisBid.vastXml = thisBid.adm; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('not an outstream video (presumably instream), will set thisBid.mediaType = VIDEO and thisBid.vastUrl and not attach a renderer'); + thisBid.vastUrl = `https://${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_cache_host', 'missing_host')}${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_cache_path', 'missing_path')}?uuid=${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_uuid', 'missing_uuid')}`; // need to see if this works ok for ozone + if (!thisBid.hasOwnProperty('videoCacheKey')) { + let videoCacheUuid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_uuid', 'no_hb_uuid'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Adding videoCacheKey: ${videoCacheUuid}`); + thisBid.videoCacheKey = videoCacheUuid; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('videoCacheKey already exists on the bid object, will not add it'); + } + } + } else { + this.setBidMediaTypeIfNotExist(thisBid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER); + } + adserverTargeting = Object.assign(adserverTargeting, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting', {})); + if (enhancedAdserverTargeting) { + let allBidsForThisBidid = ozoneGetAllBidsForBidId(thisBid.bidId, serverResponse.seatbid, defaultWidth, defaultHeight); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Going to iterate allBidsForThisBidId', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(allBidsForThisBidid)); + Object.keys(allBidsForThisBidid).forEach((bidderName, index, ar2) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`adding adserverTargeting for ${bidderName} for bidId ${thisBid.bidId}`); + adserverTargeting[whitelabelPrefix + '_' + bidderName] = bidderName; + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_crid'] = String(allBidsForThisBidid[bidderName].crid); + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_adv'] = String(allBidsForThisBidid[bidderName].adomain); + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_adId'] = String(allBidsForThisBidid[bidderName].adId); + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_pb_r'] = getRoundedBid(allBidsForThisBidid[bidderName].price, allBidsForThisBidid[bidderName].ext.prebid.type); + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_size'] = String(allBidsForThisBidid[bidderName].width) + 'x' + String(allBidsForThisBidid[bidderName].height); + if (allBidsForThisBidid[bidderName].hasOwnProperty('dealid')) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_dealid'] = String(allBidsForThisBidid[bidderName].dealid); + } + if (addOzOmpFloorDollars) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_omp'] = allBidsForThisBidid[bidderName].price >= ozOmpFloorDollars ? '1' : '0'; + } + if (isVideo) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_vid'] = videoContext; // outstream or instream + } + let flr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(allBidsForThisBidid[bidderName], `ext.bidder.${whitelabelBidder}.floor`, null); + if (flr != null) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_flr'] = flr; + } + let rid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(allBidsForThisBidid[bidderName], `ext.bidder.${whitelabelBidder}.ruleId`, null); + if (rid != null) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_rid'] = rid; + } + if (bidderName.match(/^ozappnexus/)) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_sid'] = String(allBidsForThisBidid[bidderName].cid); + } + labels = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(allBidsForThisBidid[bidderName], 'ext.prebid.labels', null); + if (labels) { + adserverTargeting[whitelabelPrefix + '_' + bidderName + '_labels'] = labels.join(','); + } + }); + } else { + let perBidInfo = `${whitelabelBidder}.enhancedAdserverTargeting is set to false. No per-bid keys will be sent to adserver.`; + if (useOzWhitelistAdserverKeys) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`Your adserver keys whitelist will be ignored - ${perBidInfo}`); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(perBidInfo); + } + } + let { + seat: winningSeat, + bid: winningBid + } = ozoneGetWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid); + winningBid = ozoneAddStandardProperties(winningBid, defaultWidth, defaultHeight); + adserverTargeting[whitelabelPrefix + '_auc_id'] = String(aucId); // was request.bidderRequest.auctionId + adserverTargeting[whitelabelPrefix + '_winner'] = String(winningSeat); + adserverTargeting[whitelabelPrefix + '_bid'] = 'true'; + adserverTargeting[whitelabelPrefix + '_cache_id'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_cache_id', 'no-id'); + adserverTargeting[whitelabelPrefix + '_uuid'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(thisBid, 'ext.prebid.targeting.hb_uuid', 'no-id'); + if (enhancedAdserverTargeting) { + labels = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(winningBid, 'ext.prebid.labels', null); + if (labels) { + adserverTargeting[whitelabelPrefix + '_labels'] = labels.join(','); + } + adserverTargeting[whitelabelPrefix + '_imp_id'] = String(winningBid.impid); + adserverTargeting[whitelabelPrefix + '_pb_v'] = OZONEVERSION; + adserverTargeting[whitelabelPrefix + '_pb'] = winningBid.price; + adserverTargeting[whitelabelPrefix + '_pb_r'] = getRoundedBid(winningBid.price, bidType); + adserverTargeting[whitelabelPrefix + '_adId'] = String(winningBid.adId); + adserverTargeting[whitelabelPrefix + '_size'] = `${winningBid.width}x${winningBid.height}`; + } + if (useOzWhitelistAdserverKeys) { + // delete any un-whitelisted keys + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Filtering out adserver targeting keys not in the whitelist: ', ozWhitelistAdserverKeys); + Object.keys(adserverTargeting).forEach(function (key) { + if (ozWhitelistAdserverKeys.indexOf(key) === -1) { + delete adserverTargeting[key]; + } + }); + } + thisBid.adserverTargeting = adserverTargeting; + arrAllBids.push(thisBid); + } + } + let ret = arrAllBids; + let fledgeAuctionConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(serverResponse, 'ext.igi') || []; // 20240606 standardising + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(fledgeAuctionConfigs) && fledgeAuctionConfigs.length > 0) { + fledgeAuctionConfigs = fledgeAuctionConfigs.filter(config => { + if (!this.isValidAuctionConfig(config)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Removing malformed fledge auction config:', config); + return false; + } + return true; + }); + ret = { + bids: arrAllBids, + fledgeAuctionConfigs + }; + } + let endTime = new Date().getTime(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`interpretResponse going to return at time ${endTime} (took ${endTime - startTime}ms) Time from buildRequests Start -> interpretRequests End = ${endTime - this.propertyBag.buildRequestsStart}ms`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('will return: ', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(ret)); // this is ok to log because the renderer has not been attached yet + return ret; + }, + isValidAuctionConfig(config) { + return typeof config === 'object' && config !== null; + }, + setBidMediaTypeIfNotExist(thisBid, mediaType) { + if (!thisBid.hasOwnProperty('mediaType')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`setting thisBid.mediaType = ${mediaType}`); + thisBid.mediaType = mediaType; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`found value for thisBid.mediaType: ${thisBid.mediaType}`); + } + }, + getWhitelabelConfigItem(ozoneVersion) { + if (this.propertyBag.whitelabel.bidder === 'ozone') { + return _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(ozoneVersion); + } + let whitelabelledSearch = ozoneVersion.replace('ozone', this.propertyBag.whitelabel.bidder); + whitelabelledSearch = whitelabelledSearch.replace('oz_', this.propertyBag.whitelabel.keyPrefix + '_'); + return _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(whitelabelledSearch); + }, + removeSingleBidderMultipleBids(seatbid) { + var ret = []; + for (let i = 0; i < seatbid.length; i++) { + let sb = seatbid[i]; + var retSeatbid = { + 'seat': sb.seat, + 'bid': [] + }; + var bidIds = []; + for (let j = 0; j < sb.bid.length; j++) { + var candidate = sb.bid[j]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.contains)(bidIds, candidate.impid)) { + continue; // we've already fully assessed this impid, found the highest bid from this seat for it + } + bidIds.push(candidate.impid); + for (let k = j + 1; k < sb.bid.length; k++) { + if (sb.bid[k].impid === candidate.impid && sb.bid[k].price > candidate.price) { + candidate = sb.bid[k]; + } + } + retSeatbid.bid.push(candidate); + } + ret.push(retSeatbid); + } + return ret; + }, + getUserSyncs(optionsType, serverResponse, gdprConsent, usPrivacy) { + let gppConsent = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getUserSyncs optionsType', optionsType, 'serverResponse', serverResponse, 'gdprConsent', gdprConsent, 'usPrivacy', usPrivacy, 'cookieSyncBag', this.cookieSyncBag); + if (!serverResponse || serverResponse.length === 0) { + return []; + } + let { + gppString = '', + applicableSections = [] + } = gppConsent; + if (optionsType.iframeEnabled) { + var arrQueryString = []; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('debug')) { + arrQueryString.push('pbjs_debug=true'); + } + arrQueryString.push('gdpr=' + ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gdprConsent, 'gdprApplies', false) ? '1' : '0')); + arrQueryString.push('gdpr_consent=' + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gdprConsent, 'consentString', '')); + arrQueryString.push('usp_consent=' + (usPrivacy || '')); + arrQueryString.push('gpp=' + gppString); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(applicableSections)) { + arrQueryString.push(`gpp_sid=${applicableSections.join()}`); + } + for (let keyname in this.cookieSyncBag.userIdObject) { + arrQueryString.push(keyname + '=' + this.cookieSyncBag.userIdObject[keyname]); + } + arrQueryString.push('publisherId=' + this.cookieSyncBag.publisherId); + arrQueryString.push('siteId=' + this.cookieSyncBag.siteId); + arrQueryString.push('cb=' + Date.now()); + arrQueryString.push('bidder=' + this.propertyBag.whitelabel.bidder); + var strQueryString = arrQueryString.join('&'); + if (strQueryString.length > 0) { + strQueryString = '?' + strQueryString; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getUserSyncs going to return cookie sync url : ' + this.getCookieSyncUrl() + strQueryString); + return [{ + type: 'iframe', + url: this.getCookieSyncUrl() + strQueryString + }]; + } + }, + getBidRequestForBidId(bidId, arrBids) { + for (let i = 0; i < arrBids.length; i++) { + if (arrBids[i].bidId === bidId) { + // bidId in the request comes back as impid in the seatbid bids + return arrBids[i]; + } + } + return null; + }, + getVideoContextForBidId(bidId, arrBids) { + let requestBid = this.getBidRequestForBidId(bidId, arrBids); + if (requestBid != null) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(requestBid, 'mediaTypes.video.context', 'unknown'); + } + return null; + }, + findAllUserIdsFromEids(bidRequest) { + let ret = {}; + if (!bidRequest.hasOwnProperty('userIdAsEids')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('findAllUserIdsFromEids - no bidRequest.userIdAsEids object was found on the bid!'); + this.tryGetPubCidFromOldLocation(ret, bidRequest); // legacy + return ret; + } + for (let obj of bidRequest.userIdAsEids) { + ret[obj.source] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(obj, 'uids.0.id'); + } + this.tryGetPubCidFromOldLocation(ret, bidRequest); // legacy + return ret; + }, + tryGetPubCidFromOldLocation(ret, bidRequest) { + if (!ret.hasOwnProperty('pubcid')) { + let pubcid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidRequest, 'crumbs.pubcid'); + if (pubcid) { + ret['pubcid.org'] = pubcid; // if built with old pubCommonId module (use the new eid key) + } + } + }, + getPlacementId(bidRequest) { + return bidRequest.params.placementId.toString(); + }, + getPlacementIdOverrideFromGetParam() { + let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix; + let arr = this.getGetParametersAsObject(); + if (arr.hasOwnProperty(whitelabelPrefix + 'storedrequest')) { + if (this.isValidPlacementId(arr[whitelabelPrefix + 'storedrequest'])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`using GET ${whitelabelPrefix}storedrequest=` + arr[whitelabelPrefix + 'storedrequest'] + ' to replace placementId'); + return arr[whitelabelPrefix + 'storedrequest']; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`GET ${whitelabelPrefix}storedrequest FAILED VALIDATION - will not use it`); + } + } + return null; + }, + getGetParametersAsObject() { + let parsed = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_4__.getRefererInfo)().location); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getGetParametersAsObject found:', parsed.search); + return parsed.search; + }, + blockTheRequest() { + let ozRequest = this.getWhitelabelConfigItem('ozone.oz_request'); + if (ozRequest === false) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`Will not allow the auction : ${this.propertyBag.whitelabel.keyPrefix}_request is set to false`); + return true; + } + return false; + }, + getPageId: function () { + if (this.propertyBag.pageId == null) { + let randPart = ''; + let allowable = '0123456789abcdefghijklmnopqrstuvwxyz'; + for (let i = 20; i > 0; i--) { + randPart += allowable[Math.floor(Math.random() * 36)]; + } + this.propertyBag.pageId = new Date().getTime() + '_' + randPart; + } + return this.propertyBag.pageId; + }, + unpackVideoConfigIntoIABformat(videoConfig, childConfig) { + let ret = { + 'ext': {} + }; + ret = this._unpackVideoConfigIntoIABformat(ret, videoConfig); + ret = this._unpackVideoConfigIntoIABformat(ret, childConfig); + return ret; + }, + _unpackVideoConfigIntoIABformat(ret, objConfig) { + let arrVideoKeysAllowed = ['mimes', 'minduration', 'maxduration', 'protocols', 'w', 'h', 'startdelay', 'placement', 'plcmt', 'linearity', 'skip', 'skipmin', 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate', 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend', 'delivery', 'pos', 'companionad', 'api', 'companiontype']; + for (const key in objConfig) { + var found = false; + arrVideoKeysAllowed.forEach(function (arg) { + if (arg === key) { + ret[key] = objConfig[key]; + found = true; + } + }); + if (!found) { + ret.ext[key] = objConfig[key]; + } + } + if (objConfig.hasOwnProperty('ext') && typeof objConfig.ext === 'object') { + if (ret.hasOwnProperty('ext')) { + ret.ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ret.ext, objConfig.ext); + } else { + ret.ext = objConfig.ext; + } + } + return ret; + }, + addVideoDefaults(objRet, videoConfig, childConfig) { + objRet = this._addVideoDefaults(objRet, videoConfig, false); + objRet = this._addVideoDefaults(objRet, childConfig, true); // child config will override parent config + return objRet; + }, + _addVideoDefaults(objRet, objConfig, addIfMissing) { + let placementValue = this.getVideoPlacementValue((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(objConfig, 'context')); + if (placementValue) { + objRet.placement = placementValue; + } + let skippable = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(objConfig, 'skippable', null); + if (skippable == null) { + if (addIfMissing && !objRet.hasOwnProperty('skip')) { + objRet.skip = 0; + } + } else { + objRet.skip = skippable ? 1 : 0; + } + return objRet; + }, + getLoggableBidObject(bid) { + let logObj = { + ad: bid.ad, + adId: bid.adId, + adUnitCode: bid.adUnitCode, + adm: bid.adm, + adomain: bid.adomain, + adserverTargeting: bid.adserverTargeting, + auctionId: bid.auctionId, + bidId: bid.bidId, + bidder: bid.bidder, + bidderCode: bid.bidderCode, + cpm: bid.cpm, + creativeId: bid.creativeId, + crid: bid.crid, + currency: bid.currency, + h: bid.h, + w: bid.w, + impid: bid.impid, + mediaType: bid.mediaType, + params: bid.params, + price: bid.price, + transactionId: bid.transactionId, + ttl: bid.ttl, + ortb2: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2'), + ortb2Imp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp') + }; + if (bid.hasOwnProperty('floorData')) { + logObj.floorData = bid.floorData; + } + return logObj; + } +}; +function injectAdIdsIntoAllBidResponses(seatbid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('injectAdIdsIntoAllBidResponses', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(seatbid)); + for (let i = 0; i < seatbid.length; i++) { + let sb = seatbid[i]; + for (let j = 0; j < sb.bid.length; j++) { + sb.bid[j]['adId'] = `${sb.bid[j]['impid']}-${i}-${spec.propertyBag.whitelabel.keyPrefix}-${j}`; + } + } + return seatbid; +} +function checkDeepArray(Arr) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(Arr)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(Arr[0])) { + return Arr[0]; + } else { + return Arr; + } + } else { + return Arr; + } +} +function defaultSize(thebidObj) { + if (!thebidObj) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('defaultSize received empty bid obj! going to return fixed default size'); + return { + 'defaultHeight': 250, + 'defaultWidth': 300 + }; + } + const { + sizes + } = thebidObj; + const returnObject = {}; + returnObject.defaultWidth = checkDeepArray(sizes)[0]; + returnObject.defaultHeight = checkDeepArray(sizes)[1]; + return returnObject; +} +function ozoneGetWinnerForRequestBid(requestBidId, serverResponseSeatBid) { + let thisBidWinner = null; + let winningSeat = null; + for (let j = 0; j < serverResponseSeatBid.length; j++) { + let theseBids = serverResponseSeatBid[j].bid; + let thisSeat = serverResponseSeatBid[j].seat; + for (let k = 0; k < theseBids.length; k++) { + if (theseBids[k].impid === requestBidId) { + if (thisBidWinner == null || thisBidWinner.price < theseBids[k].price) { + thisBidWinner = theseBids[k]; + winningSeat = thisSeat; + break; + } + } + } + } + return { + 'seat': winningSeat, + 'bid': thisBidWinner + }; +} +function ozoneGetAllBidsForBidId(matchBidId, serverResponseSeatBid, defaultWidth, defaultHeight) { + let objBids = {}; + for (let j = 0; j < serverResponseSeatBid.length; j++) { + let theseBids = serverResponseSeatBid[j].bid; + let thisSeat = serverResponseSeatBid[j].seat; + for (let k = 0; k < theseBids.length; k++) { + if (theseBids[k].impid === matchBidId) { + if (objBids.hasOwnProperty(thisSeat)) { + // > 1 bid for an adunit from a bidder - only use the one with the highest bid + if (objBids[thisSeat]['price'] < theseBids[k].price) { + objBids[thisSeat] = ozoneAddStandardProperties(theseBids[k], defaultWidth, defaultHeight); + } + } else { + objBids[thisSeat] = theseBids[k]; + objBids[thisSeat] = ozoneAddStandardProperties(theseBids[k], defaultWidth, defaultHeight); + } + } + } + } + return objBids; +} +function getRoundedBid(price, mediaType) { + const mediaTypeGranularity = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig(`mediaTypePriceGranularity.${mediaType}`); // might be string or object or nothing; if set then this takes precedence over 'priceGranularity' + let objBuckets = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('customPriceBucket'); // this is always an object - {} if strBuckets is not 'custom' + let strBuckets = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('priceGranularity'); // priceGranularity value, always a string ** if priceGranularity is set to an object then it's always 'custom' ** + let theConfigObject = getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets); + let theConfigKey = getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getRoundedBid. price:', price, 'mediaType:', mediaType, 'configkey:', theConfigKey, 'configObject:', theConfigObject, 'mediaTypeGranularity:', mediaTypeGranularity, 'strBuckets:', strBuckets); + let priceStringsObj = (0,_src_cpmBucketManager_js__WEBPACK_IMPORTED_MODULE_6__.getPriceBucketString)(price, theConfigObject, _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('currency.granularityMultiplier')); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('priceStringsObj', priceStringsObj); + let granularityNamePriceStringsKeyMapping = { + 'medium': 'med', + 'custom': 'custom', + 'high': 'high', + 'low': 'low', + 'dense': 'dense' + }; + if (granularityNamePriceStringsKeyMapping.hasOwnProperty(theConfigKey)) { + let priceStringsKey = granularityNamePriceStringsKeyMapping[theConfigKey]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getRoundedBid: looking for priceStringsKey:', priceStringsKey); + return priceStringsObj[priceStringsKey]; + } + return priceStringsObj['auto']; +} +function getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets) { + if (typeof mediaTypeGranularity === 'string') { + return mediaTypeGranularity; + } + if (typeof mediaTypeGranularity === 'object') { + return 'custom'; + } + if (typeof strBuckets === 'string') { + return strBuckets; + } + return 'auto'; // fall back to a default key - should literally never be needed. +} +function getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets) { + if (typeof mediaTypeGranularity === 'object') { + return mediaTypeGranularity; + } + if (strBuckets === 'custom') { + return objBuckets; + } + return ''; +} +function ozoneAddStandardProperties(seatBid, defaultWidth, defaultHeight) { + seatBid.cpm = seatBid.price; + seatBid.bidId = seatBid.impid; + seatBid.requestId = seatBid.impid; + seatBid.width = seatBid.w || defaultWidth; + seatBid.height = seatBid.h || defaultHeight; + seatBid.ad = seatBid.adm; + seatBid.netRevenue = true; + seatBid.creativeId = seatBid.crid; + seatBid.currency = 'USD'; + seatBid.ttl = 300; + return seatBid; +} +function getWidthAndHeightFromVideoObject(objVideo) { + let playerSize = getPlayerSizeFromObject(objVideo); + if (!playerSize) { + return null; + } + if (playerSize[0] && typeof playerSize[0] === 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getWidthAndHeightFromVideoObject found nested array inside playerSize.', playerSize[0]); + playerSize = playerSize[0]; + if (typeof playerSize[0] !== 'number' && typeof playerSize[0] !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('getWidthAndHeightFromVideoObject found non-number/string type inside the INNER array in playerSize. This is totally wrong - cannot continue.', playerSize[0]); + return null; + } + } + if (playerSize.length !== 2) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('getWidthAndHeightFromVideoObject found playerSize with length of ' + playerSize.length + '. This is totally wrong - cannot continue.'); + return null; + } + return { + 'w': playerSize[0], + 'h': playerSize[1] + }; +} +function playerSizeIsNestedArray(objVideo) { + let playerSize = getPlayerSizeFromObject(objVideo); + if (!playerSize) { + return null; + } + if (playerSize.length < 1) { + return null; + } + return playerSize[0] && typeof playerSize[0] === 'object'; +} +function getPlayerSizeFromObject(objVideo) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('getPlayerSizeFromObject received object', objVideo); + let playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(objVideo, 'playerSize'); + if (!playerSize) { + playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(objVideo, 'ext.playerSize'); + } + if (!playerSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('getPlayerSizeFromObject FAILED: no playerSize in video object or ext', objVideo); + return null; + } + if (typeof playerSize !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('getPlayerSizeFromObject FAILED: playerSize is not an object/array', objVideo); + return null; + } + return playerSize; +} +function newRenderer(adUnitCode) { + let rendererOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let isLoaded = window.ozoneVideo; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`newRenderer will set loaded to ${isLoaded ? 'true' : 'false'}`); + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + url: spec.getRendererUrl(), + config: rendererOptions, + loaded: isLoaded, + adUnitCode + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Prebid Error calling renderer.setRender', renderer, err); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('returning renderer object'); + return renderer; +} +function outstreamRender(bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('outstreamRender got', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(spec.getLoggableBidObject(bid))); + bid.renderer.push(() => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('outstreamRender: Going to execute window.ozoneVideo.outstreamRender'); + window.ozoneVideo.outstreamRender(bid); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`*BidAdapter ${OZONEVERSION} was loaded`); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('ozoneBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ozoneBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["paapi"],{ + +/***/ "./modules/paapi.js": +/*!**************************!*\ + !*** ./modules/paapi.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports registerSubmodule, reset, init, adAuctionHeadersHook, buyersToAuctionConfigs, addPaapiConfigHook, IGB_TO_CONFIG, mergeBuyers, partitionBuyers, partitionBuyersByBidder, getPAAPIConfig, getPAAPISize, addPaapiData, NAVIGATOR_APIS, markForFledge, ASYNC_SIGNALS, parallelPaapiProcessing, AsyncPAAPIParam, buildPAAPIParams, onAuctionInit, setImpExtAe, parseExtIgi, parseExtPrebidFledge, setResponsePaapiConfigs */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/currencyUtils/currency.js */ "./libraries/currencyUtils/currency.js"); +/* harmony import */ var _src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils/reducers.js */ "./src/utils/reducers.js"); +/* harmony import */ var _libraries_weakStore_weakStore_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/weakStore/weakStore.js */ "./libraries/weakStore/weakStore.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); + +/** + * Collect PAAPI component auction configs from bid adapters and make them available through `pbjs.getPAAPIConfig()` + */ + + + + + + + + + + + + + +const MODULE = 'PAAPI'; +const submodules = []; +const USED = new WeakSet(); +function registerSubmodule(submod) { + submodules.push(submod); + submod.init && submod.init({ + getPAAPIConfig, + expandFilters + }); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.module)('paapi', registerSubmodule); + +/* auction configs as returned by getPAAPIConfigs */ +const configsForAuction = (0,_libraries_weakStore_weakStore_js__WEBPACK_IMPORTED_MODULE_1__.auctionStore)(); + +/* auction configs returned by adapters, but waiting for end-of-auction signals before they're added to configsForAuction */ +const pendingConfigsForAuction = (0,_libraries_weakStore_weakStore_js__WEBPACK_IMPORTED_MODULE_1__.auctionStore)(); + +/* igb returned by adapters, waiting for end-of-auction signals before they're merged into configForAuctions */ +const pendingBuyersForAuction = (0,_libraries_weakStore_weakStore_js__WEBPACK_IMPORTED_MODULE_1__.auctionStore)(); + +/* for auction configs that were generated in parallel with auctions (and contain promises), their resolve/reject methods */ +const deferredConfigsForAuction = (0,_libraries_weakStore_weakStore_js__WEBPACK_IMPORTED_MODULE_1__.auctionStore)(); +let latestAuctionForAdUnit = {}; +let moduleConfig = {}; +_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('paapi', config => { + init(config.paapi); +}); +function reset() { + submodules.splice(0, submodules.length); + latestAuctionForAdUnit = {}; +} +function init(cfg) { + if (cfg && cfg.enabled === true) { + if (!moduleConfig.enabled) { + attachHandlers(); + } + moduleConfig = cfg; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${MODULE} enabled (browser ${isFledgeSupported() ? 'supports' : 'does NOT support'} runAdAuction)`, cfg); + } else { + if (moduleConfig.enabled) { + detachHandlers(); + } + moduleConfig = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${MODULE} disabled`, cfg); + } +} +function attachHandlers() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('addPaapiConfig').before(addPaapiConfigHook); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('makeBidRequests').before(addPaapiData); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('makeBidRequests').after(markForFledge); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('processBidderRequests').before(parallelPaapiProcessing, 9); + // resolve params before parallel processing + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('processBidderRequests').before(buildPAAPIParams, 10); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('processBidderRequests').before(adAuctionHeadersHook); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.AUCTION_INIT, onAuctionInit); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.AUCTION_END, onAuctionEnd); +} +function detachHandlers() { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('addPaapiConfig').getHooks({ + hook: addPaapiConfigHook + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('makeBidRequests').getHooks({ + hook: addPaapiData + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('makeBidRequests').getHooks({ + hook: markForFledge + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('processBidderRequests').getHooks({ + hook: parallelPaapiProcessing + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('processBidderRequests').getHooks({ + hook: buildPAAPIParams + }).remove(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.getHook)('processBidderRequests').getHooks({ + hook: adAuctionHeadersHook + }).remove(); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.off(_src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.AUCTION_INIT, onAuctionInit); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.off(_src_constants_js__WEBPACK_IMPORTED_MODULE_5__.EVENTS.AUCTION_END, onAuctionEnd); +} +function adAuctionHeadersHook(next, spec, bids, bidderRequest, ajax) { + if (bidderRequest.paapi?.enabled) { + ajax = (orig => { + return function (url, callback, data, options) { + options = options ?? {}; + options.adAuctionHeaders = options.adAuctionHeaders ?? true; + return orig.call(this, url, callback, data, options); + }; + })(ajax); + } + for (var _len = arguments.length, args = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) { + args[_key - 5] = arguments[_key]; + } + return next.call(this, spec, bids, bidderRequest, ajax, ...args); +} +function getStaticSignals() { + let adUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const cfg = {}; + const requestedSize = getRequestedSize(adUnit); + if (requestedSize) { + cfg.requestedSize = requestedSize; + } + return cfg; +} +function getSlotSignals() { + let bidsReceived = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidRequests = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + let bidfloor, bidfloorcur; + if (bidsReceived.length > 0) { + const bestBid = bidsReceived.reduce((0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_6__.maximum)((0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_7__.currencyCompare)(bid => [bid.cpm, bid.currency]))); + bidfloor = bestBid.cpm; + bidfloorcur = bestBid.currency; + } else { + const floors = bidRequests.map(bid => typeof bid.getFloor === 'function' && bid.getFloor()).filter(f => f); + const minFloor = floors.length && floors.reduce((0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_6__.minimum)((0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_7__.currencyCompare)(floor => [floor.floor, floor.currency]))); + bidfloor = minFloor?.floor; + bidfloorcur = minFloor?.currency; + } + const cfg = {}; + if (bidfloor) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(cfg, 'auctionSignals.prebid.bidfloor', bidfloor); + bidfloorcur && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(cfg, 'auctionSignals.prebid.bidfloorcur', bidfloorcur); + } + return cfg; +} +function buyersToAuctionConfigs(igbRequests) { + let merge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : mergeBuyers; + let config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : moduleConfig?.componentSeller ?? {}; + let partitioners = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { + compact: igbRequests => partitionBuyers(igbRequests.map(req => req[1])).map(part => [{}, part]), + expand: partitionBuyersByBidder + }; + if (!config.auctionConfig) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(MODULE, 'Cannot use IG buyers: paapi.componentSeller.auctionConfig not set', igbRequests.map(req => req[1])); + return []; + } + const partition = partitioners[config.separateAuctions ? 'expand' : 'compact']; + return partition(igbRequests).map(_ref => { + let [request, igbs] = _ref; + const auctionConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(merge(igbs), config.auctionConfig); + auctionConfig.auctionSignals = setFPD(auctionConfig.auctionSignals || {}, request); + return [request, auctionConfig]; + }); +} +function onAuctionEnd(_ref2) { + let { + auctionId, + bidsReceived, + bidderRequests, + adUnitCodes, + adUnits + } = _ref2; + const adUnitsByCode = Object.fromEntries(adUnits?.map(au => [au.code, au]) || []); + const allReqs = bidderRequests?.flatMap(br => br.bids); + const paapiConfigs = configsForAuction(auctionId); + (adUnitCodes || []).forEach(au => { + if (!paapiConfigs.hasOwnProperty(au)) { + paapiConfigs[au] = null; + } + !latestAuctionForAdUnit.hasOwnProperty(au) && (latestAuctionForAdUnit[au] = null); + }); + const pendingConfigs = pendingConfigsForAuction(auctionId); + const pendingBuyers = pendingBuyersForAuction(auctionId); + if (pendingConfigs && pendingBuyers) { + Object.entries(pendingBuyers).forEach(_ref3 => { + let [adUnitCode, igbRequests] = _ref3; + buyersToAuctionConfigs(igbRequests).forEach(_ref4 => { + let [{ + bidder + }, auctionConfig] = _ref4; + return append(pendingConfigs, adUnitCode, { + id: getComponentSellerConfigId(bidder), + config: auctionConfig + }); + }); + }); + } + const deferredConfigs = deferredConfigsForAuction(auctionId); + const adUnitsWithConfigs = Array.from(new Set(Object.keys(pendingConfigs).concat(Object.keys(deferredConfigs)))); + const signals = Object.fromEntries(adUnitsWithConfigs.map(adUnitCode => { + latestAuctionForAdUnit[adUnitCode] = auctionId; + const forThisAdUnit = bid => bid.adUnitCode === adUnitCode; + return [adUnitCode, { + ...getStaticSignals(adUnitsByCode[adUnitCode]), + ...getSlotSignals(bidsReceived?.filter(forThisAdUnit), allReqs?.filter(forThisAdUnit)) + }]; + })); + const configsById = {}; + Object.entries(pendingConfigs || {}).forEach(_ref5 => { + let [adUnitCode, auctionConfigs] = _ref5; + auctionConfigs.forEach(_ref6 => { + let { + id, + config + } = _ref6; + return append(configsById, id, { + adUnitCode, + config: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, signals[adUnitCode], config) + }); + }); + }); + function resolveSignals(signals, deferrals) { + Object.entries(deferrals).forEach(_ref7 => { + let [signal, { + resolve, + default: defaultValue + }] = _ref7; + let value = signals.hasOwnProperty(signal) ? signals[signal] : null; + if (value == null && defaultValue == null) { + value = undefined; + } else if (typeof defaultValue === 'object' && typeof value === 'object') { + value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, defaultValue, value); + } else { + value = value ?? defaultValue; + } + resolve(value); + }); + } + Object.entries(deferredConfigs).forEach(_ref8 => { + let [adUnitCode, { + top, + components + }] = _ref8; + resolveSignals(signals[adUnitCode], top); + Object.entries(components).forEach(_ref9 => { + let [configId, { + deferrals + }] = _ref9; + const matchingConfigs = configsById.hasOwnProperty(configId) ? configsById[configId] : []; + if (matchingConfigs.length > 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Received multiple PAAPI configs for the same bidder and seller (${configId}), active PAAPI auctions will only see the first`); + } + const { + config + } = matchingConfigs.shift() ?? { + config: { + ...signals[adUnitCode] + } + }; + resolveSignals(config, deferrals); + }); + }); + const newConfigs = Object.values(configsById).flatMap(configs => configs); + const hasDeferredConfigs = Object.keys(deferredConfigs).length > 0; + if (moduleConfig.parallel && hasDeferredConfigs && newConfigs.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Received PAAPI configs after PAAPI auctions were already started in parallel with their contextual auction`, newConfigs); + } + newConfigs.forEach(_ref10 => { + let { + adUnitCode, + config + } = _ref10; + if (paapiConfigs[adUnitCode] == null) { + paapiConfigs[adUnitCode] = { + ...signals[adUnitCode], + componentAuctions: [] + }; + } + paapiConfigs[adUnitCode].componentAuctions.push((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, signals[adUnitCode], config)); + }); + if (!moduleConfig.parallel || !hasDeferredConfigs) { + submodules.forEach(submod => submod.onAuctionConfig?.(auctionId, paapiConfigs)); + } +} +function append(target, key, value) { + !target.hasOwnProperty(key) && (target[key] = []); + target[key].push(value); +} +function setFPD(target, _ref11) { + let { + ortb2, + ortb2Imp + } = _ref11; + ortb2 != null && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(target, 'prebid.ortb2', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, ortb2, target.prebid?.ortb2)); + ortb2Imp != null && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(target, 'prebid.ortb2Imp', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, ortb2Imp, target.prebid?.ortb2Imp)); + return target; +} +function getConfigId(bidderCode, seller) { + return `${bidderCode}::${seller}`; +} +function getComponentSellerConfigId(bidderCode) { + return moduleConfig.componentSeller.separateAuctions ? `igb::${bidderCode}` : 'igb'; +} +function addPaapiConfigHook(next, request, paapiConfig) { + if (getFledgeConfig(_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getCurrentBidder()).enabled) { + const { + adUnitCode, + auctionId, + bidder + } = request; + function storePendingData(store, data) { + const target = store(auctionId); + if (target != null) { + append(target, adUnitCode, data); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(MODULE, `Received PAAPI config for auction that has closed (auction '${auctionId}', adUnit '${adUnitCode}')`, data); + } + } + const { + config, + igb + } = paapiConfig; + if (config) { + config.auctionSignals = setFPD(config.auctionSignals || {}, request); + const pbs = config.perBuyerSignals = config.perBuyerSignals ?? {}; + (config.interestGroupBuyers || []).forEach(buyer => { + pbs[buyer] = setFPD(pbs[buyer] ?? {}, request); + }); + storePendingData(pendingConfigsForAuction, { + id: getConfigId(bidder, config.seller), + config + }); + } + if (igb && checkOrigin(igb)) { + igb.pbs = setFPD(igb.pbs || {}, request); + storePendingData(pendingBuyersForAuction, [request, igb]); + } + } + next(request, paapiConfig); +} +const IGB_TO_CONFIG = { + cur: 'perBuyerCurrencies', + pbs: 'perBuyerSignals', + ps: 'perBuyerPrioritySignals', + maxbid: 'auctionSignals.prebid.perBuyerMaxbid' +}; +function checkOrigin(igb) { + if (igb.origin) return true; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('PAAPI buyer does not specify origin and will be ignored', igb); +} + +/** + * Convert a list of InterestGroupBuyer (igb) objects into a partial auction config. + * https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/Protected%20Audience%20Support.md + */ +function mergeBuyers(igbs) { + const buyers = new Set(); + return Object.assign(igbs.reduce((config, igb) => { + if (checkOrigin(igb)) { + if (!buyers.has(igb.origin)) { + buyers.add(igb.origin); + Object.entries(IGB_TO_CONFIG).forEach(_ref12 => { + let [igbField, configField] = _ref12; + if (igb[igbField] != null) { + const entry = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_9__["default"])(config, configField) || {}; + entry[igb.origin] = igb[igbField]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(config, configField, entry); + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(MODULE, `Duplicate buyer: ${igb.origin}. All but the first will be ignored`, igbs); + } + } + return config; + }, {}), { + interestGroupBuyers: Array.from(buyers.keys()) + }); +} + +/** + * Partition a list of InterestGroupBuyer (igb) object into sets that can each be merged into a single auction. + * If the same buyer (origin) appears more than once, it will be split across different partition unless the igb objects + * are identical. + */ +function partitionBuyers(igbs) { + return igbs.reduce((partitions, igb) => { + if (checkOrigin(igb)) { + let partition = partitions.find(part => !part.hasOwnProperty(igb.origin) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepEqual)(part[igb.origin], igb)); + if (!partition) { + partition = {}; + partitions.push(partition); + } + partition[igb.origin] = igb; + } + return partitions; + }, []).map(part => Object.values(part)); +} +function partitionBuyersByBidder(igbRequests) { + const requests = {}; + const igbs = {}; + igbRequests.forEach(_ref13 => { + let [request, igb] = _ref13; + !requests.hasOwnProperty(request.bidder) && (requests[request.bidder] = request); + append(igbs, request.bidder, igb); + }); + return Object.entries(igbs).map(_ref14 => { + let [bidder, igbs] = _ref14; + return [requests[bidder], igbs]; + }); +} + +/** + * Expand PAAPI api filters into a map from ad unit code to auctionId. + * + * @param {Object} [options] + * @param {string} [options.auctionId] when specified, the result will have this as the value for each entry. + * when not specified, each ad unit will map to the latest auction that involved that ad unit. + * @param {string} [options.adUnitCode] when specified, the result will contain only one entry (for this ad unit) or be empty (if this ad + * unit was never involved in an auction). + * when not specified, the result will contain an entry for every ad unit that was involved in any auction. + * @return {{[adUnitCode: string]: string}} + */ +function expandFilters() { + let { + auctionId, + adUnitCode + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let adUnitCodes = []; + if (adUnitCode == null) { + adUnitCodes = Object.keys(latestAuctionForAdUnit); + } else if (latestAuctionForAdUnit.hasOwnProperty(adUnitCode)) { + adUnitCodes = [adUnitCode]; + } + return Object.fromEntries(adUnitCodes.map(au => [au, auctionId ?? latestAuctionForAdUnit[au]])); +} + +/** + * Get PAAPI auction configuration. + * + * @param {Object} [filters] - Filters object + * @param {string} [filters.auctionId] optional auction filter; if omitted, the latest auction for each ad unit is used + * @param {string} [filters.adUnitCode] optional ad unit filter + * @param {boolean} [includeBlanks=false] if true, include null entries for ad units that match the given filters but do not have any available auction configs. + * @returns {Object} a map from ad unit code to auction config for the ad unit. + */ +function getPAAPIConfig() { + let filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let includeBlanks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + const output = {}; + Object.entries(expandFilters(filters)).forEach(_ref15 => { + let [au, auctionId] = _ref15; + const auctionConfigs = configsForAuction(auctionId); + if (auctionConfigs?.hasOwnProperty(au)) { + // ad unit was involved in a PAAPI auction + const candidate = auctionConfigs[au]; + if (candidate && !USED.has(candidate)) { + output[au] = candidate; + USED.add(candidate); + } else if (includeBlanks) { + output[au] = null; + } + } else if (auctionId == null && includeBlanks) { + // ad unit was involved in a non-PAAPI auction + output[au] = null; + } + }); + return output; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().getPAAPIConfig = filters => getPAAPIConfig(filters); +function isFledgeSupported() { + return 'runAdAuction' in navigator && 'joinAdInterestGroup' in navigator; +} +function getFledgeConfig(bidder) { + const enabled = moduleConfig.enabled && (bidder == null || !moduleConfig.bidders?.length || moduleConfig.bidders?.includes(bidder)); + return { + enabled, + ae: enabled ? moduleConfig.defaultForSlots : undefined + }; +} + +/** + * Given an array of size tuples, return the one that should be used for PAAPI. + */ +const getPAAPISize = (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_0__.hook)('sync', function (sizes) { + sizes = sizes?.filter(_ref16 => { + let [w, h] = _ref16; + return !(w === h && w <= 5); + }); + if (sizes?.length) { + return sizes.reduce((0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_6__.maximum)((0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_6__.keyCompare)(_ref17 => { + let [w, h] = _ref17; + return w * h; + }))); + } +}, 'getPAAPISize'); +function getRequestedSize(adUnit) { + return adUnit.ortb2Imp?.ext?.paapi?.requestedSize || (() => { + const size = getPAAPISize((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.sizesToSizeTuples)(adUnit.mediaTypes?.banner?.sizes)); + if (size) { + return { + width: size[0], + height: size[1] + }; + } + })(); +} +function addPaapiData(next, adUnits) { + if (isFledgeSupported() && moduleConfig.enabled) { + adUnits.forEach(adUnit => { + // https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/Protected%20Audience%20Support.md + const igsAe = adUnit.ortb2Imp?.ext?.igs != null ? adUnit.ortb2Imp.ext.igs.ae || 1 : null; + const extAe = adUnit.ortb2Imp?.ext?.ae; + if (igsAe !== extAe && igsAe != null && extAe != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(MODULE, `Ad unit defines conflicting ortb2Imp.ext.ae and ortb2Imp.ext.igs, using the latter`, adUnit); + } + const ae = igsAe ?? extAe ?? moduleConfig.defaultForSlots; + if (ae) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(adUnit, 'ortb2Imp.ext.ae', ae); + adUnit.ortb2Imp.ext.igs = Object.assign({ + ae: ae, + biddable: 1 + }, adUnit.ortb2Imp.ext.igs); + const requestedSize = getRequestedSize(adUnit); + if (requestedSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(adUnit, 'ortb2Imp.ext.paapi.requestedSize', requestedSize); + } + adUnit.bids.forEach(bidReq => { + if (!getFledgeConfig(bidReq.bidder).enabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(bidReq, 'ortb2Imp.ext.ae', 0); + bidReq.ortb2Imp.ext.igs = { + ae: 0, + biddable: 0 + }; + } + }); + } + }); + } + for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { + args[_key2 - 2] = arguments[_key2]; + } + next(adUnits, ...args); +} +const NAVIGATOR_APIS = ['createAuctionNonce', 'getInterestGroupAdAuctionData']; +function markForFledge(next, bidderRequests) { + if (isFledgeSupported()) { + bidderRequests.forEach(bidderReq => { + const { + enabled + } = getFledgeConfig(bidderReq.bidderCode); + Object.assign(bidderReq, { + paapi: { + enabled, + componentSeller: !!moduleConfig.componentSeller?.auctionConfig + } + }); + if (enabled) { + NAVIGATOR_APIS.forEach(method => { + bidderReq.paapi[method] = function () { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + return new AsyncPAAPIParam(() => navigator[method](...args)); + }; + }); + } + }); + } + next(bidderRequests); +} +const ASYNC_SIGNALS = ['auctionSignals', 'sellerSignals', 'perBuyerSignals', 'perBuyerTimeouts', 'directFromSellerSignals', 'perBuyerCurrencies', 'perBuyerCumulativeTimeouts', 'serverResponse']; +const validatePartialConfig = (() => { + const REQUIRED_SYNC_SIGNALS = [{ + props: ['seller'], + validate: val => typeof val === 'string' + }, { + props: ['interestGroupBuyers'], + validate: val => Array.isArray(val) && val.length > 0 + }, { + props: ['decisionLogicURL', 'decisionLogicUrl'], + validate: val => typeof val === 'string' + }]; + return function (config) { + const invalid = REQUIRED_SYNC_SIGNALS.find(_ref18 => { + let { + props, + validate + } = _ref18; + return props.every(prop => !config.hasOwnProperty(prop) || !config[prop] || !validate(config[prop])); + }); + if (invalid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Partial PAAPI config has missing or invalid property "${invalid.props[0]}"`, config); + return false; + } + return true; + }; +})(); +function callAdapterApi(spec, method, bids, bidderRequest) { + const metrics = (0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__.adapterMetrics)(bidderRequest); + const tidGuard = (0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__.guardTids)(bidderRequest); + let result; + metrics.measureTime(method, () => { + try { + result = spec[method](bids.map(tidGuard.bidRequest), tidGuard.bidderRequest(bidderRequest)); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Error invoking "${method}":`, e); + } + }); + return result; +} + +/** + * Adapters can provide a `spec.buildPAAPIConfigs(validBidRequests, bidderRequest)` to be included in PAAPI auctions + * that can be started in parallel with contextual auctions. + * + * If PAAPI is enabled, and an adapter provides `buildPAAPIConfigs`, it is invoked just before `buildRequests`, + * and takes the same arguments. It should return an array of PAAPI configuration objects with the same format + * as in `interpretResponse` (`{bidId, config?, igb?}`). + * + * Everything returned by `buildPAAPIConfigs` is treated in the same way as if it was returned by `interpretResponse` - + * except for signals that can be provided asynchronously (cfr. `ASYNC_SIGNALS`), which are replaced by promises. + * When the (contextual) auction ends, the promises are resolved. + * + * If during the auction the adapter's `interpretResponse` returned matching configurations (same `bidId`, + * and a `config` with the same `seller`, or an `igb` with the same `origin`), the promises resolve to their contents. + * Otherwise, they resolve to the values provided by `buildPAAPIConfigs`, or an empty object if no value was provided. + * + * Promisified auction configs are available from `getPAAPIConfig` immediately after `requestBids`. + * If the `paapi.parallel` config flag is set, PAAPI submodules are also triggered at the same time + * (instead of when the auction ends). + */ +function parallelPaapiProcessing(next, spec, bids, bidderRequest) { + function makeDeferrals() { + let defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let promises = {}; + const deferrals = Object.fromEntries(ASYNC_SIGNALS.map(signal => { + const def = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_12__.defer)({ + promiseFactory: resolver => new Promise(resolver) + }); + def.default = defaults.hasOwnProperty(signal) ? defaults[signal] : null; + promises[signal] = def.promise; + return [signal, def]; + })); + return [deferrals, promises]; + } + const { + auctionId, + paapi: { + enabled, + componentSeller + } = {} + } = bidderRequest; + const auctionConfigs = configsForAuction(auctionId); + bids.map(bid => bid.adUnitCode).forEach(adUnitCode => { + latestAuctionForAdUnit[adUnitCode] = auctionId; + if (!auctionConfigs.hasOwnProperty(adUnitCode)) { + auctionConfigs[adUnitCode] = null; + } + }); + if (enabled && spec.buildPAAPIConfigs) { + const partialConfigs = callAdapterApi(spec, 'buildPAAPIConfigs', bids, bidderRequest); + const requestsById = Object.fromEntries(bids.map(bid => [bid.bidId, bid])); + (partialConfigs ?? []).forEach(_ref19 => { + let { + bidId, + config, + igb + } = _ref19; + const bidRequest = requestsById.hasOwnProperty(bidId) && requestsById[bidId]; + if (!bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Received partial PAAPI config for unknown bidId`, { + bidId, + config + }); + } else { + const adUnitCode = bidRequest.adUnitCode; + latestAuctionForAdUnit[adUnitCode] = auctionId; + const deferredConfigs = deferredConfigsForAuction(auctionId); + const getDeferredConfig = () => { + if (!deferredConfigs.hasOwnProperty(adUnitCode)) { + const [deferrals, promises] = makeDeferrals(); + auctionConfigs[adUnitCode] = { + ...getStaticSignals(_src_auctionManager_js__WEBPACK_IMPORTED_MODULE_13__.auctionManager.index.getAdUnit(bidRequest)), + ...promises, + componentAuctions: [] + }; + deferredConfigs[adUnitCode] = { + top: deferrals, + components: {}, + auctionConfig: auctionConfigs[adUnitCode] + }; + } + return deferredConfigs[adUnitCode]; + }; + if (config && validatePartialConfig(config)) { + const configId = getConfigId(bidRequest.bidder, config.seller); + const deferredConfig = getDeferredConfig(); + if (deferredConfig.components.hasOwnProperty(configId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Received multiple PAAPI configs for the same bidder and seller; config will be ignored`, { + config, + bidder: bidRequest.bidder + }); + } else { + const [deferrals, promises] = makeDeferrals(config); + const auctionConfig = { + ...getStaticSignals(bidRequest), + ...config, + ...promises + }; + deferredConfig.auctionConfig.componentAuctions.push(auctionConfig); + deferredConfig.components[configId] = { + auctionConfig, + deferrals + }; + } + } + if (componentSeller && igb && checkOrigin(igb)) { + const configId = getComponentSellerConfigId(spec.code); + const deferredConfig = getDeferredConfig(); + const partialConfig = buyersToAuctionConfigs([[bidRequest, igb]])[0][1]; + if (deferredConfig.components.hasOwnProperty(configId)) { + const { + auctionConfig, + deferrals + } = deferredConfig.components[configId]; + if (!auctionConfig.interestGroupBuyers.includes(igb.origin)) { + const immediate = {}; + Object.entries(partialConfig).forEach(_ref20 => { + let [key, value] = _ref20; + if (deferrals.hasOwnProperty(key)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(deferrals[key], { + default: value + }); + } else { + immediate[key] = value; + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(auctionConfig, immediate); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(`Received the same PAAPI buyer multiple times for the same PAAPI auction. Consider setting paapi.componentSeller.separateAuctions: true`, igb); + } + } else { + const [deferrals, promises] = makeDeferrals(partialConfig); + const auctionConfig = { + ...partialConfig, + ...getStaticSignals(bidRequest), + ...promises + }; + deferredConfig.components[configId] = { + auctionConfig, + deferrals + }; + deferredConfig.auctionConfig.componentAuctions.push(auctionConfig); + } + } + } + }); + } + for (var _len4 = arguments.length, args = new Array(_len4 > 4 ? _len4 - 4 : 0), _key4 = 4; _key4 < _len4; _key4++) { + args[_key4 - 4] = arguments[_key4]; + } + return next.call(this, spec, bids, bidderRequest, ...args); +} +class AsyncPAAPIParam { + constructor(resolve) { + this.resolve = resolve; + } +} +function buildPAAPIParams(next, spec, bids, bidderRequest) { + for (var _len5 = arguments.length, args = new Array(_len5 > 4 ? _len5 - 4 : 0), _key5 = 4; _key5 < _len5; _key5++) { + args[_key5 - 4] = arguments[_key5]; + } + if (bidderRequest.paapi?.enabled && spec.paapiParameters) { + const params = callAdapterApi(spec, 'paapiParameters', bids, bidderRequest); + return _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_12__.PbPromise.all(Object.entries(params ?? {}).map(_ref21 => { + let [key, value] = _ref21; + return value instanceof AsyncPAAPIParam ? value.resolve().then(result => [key, result]) : Promise.resolve([key, value]); + })).then(resolved => { + bidderRequest.paapi.params = Object.fromEntries(resolved); + }).catch(err => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`Could not resolve PAAPI parameters`, err); + }).then(() => { + next.call(this, spec, bids, bidderRequest, ...args); + }); + } else { + next.call(this, spec, bids, bidderRequest, ...args); + } +} +function onAuctionInit(_ref22) { + let { + auctionId + } = _ref22; + if (moduleConfig.parallel) { + _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_13__.auctionManager.index.getAuction({ + auctionId + }).requestsDone.then(() => { + if (Object.keys(deferredConfigsForAuction(auctionId)).length > 0) { + submodules.forEach(submod => submod.onAuctionConfig?.(auctionId, configsForAuction(auctionId))); + } + }); + } +} +function setImpExtAe(imp, bidRequest, context) { + if (!context.bidderRequest.paapi?.enabled) { + delete imp.ext?.ae; + delete imp.ext?.igs; + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.IMP, + name: 'impExtAe', + fn: setImpExtAe +}); +function parseExtIgi(response, ortbResponse, context) { + paapiResponseParser((ortbResponse.ext?.igi || []).flatMap(igi => { + return (igi?.igs || []).map(igs => { + if (igs.impid !== igi.impid && igs.impid != null && igi.impid != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(MODULE, 'ORTB response ext.igi.igs.impid conflicts with parent\'s impid', igi); + } + return { + config: igs.config, + impid: igs.impid ?? igi.impid + }; + }).concat((igi?.igb || []).map(igb => ({ + igb, + impid: igi.impid + }))); + }), response, context); +} +function paapiResponseParser(configs, response, context) { + configs.forEach(config => { + const impCtx = context.impContext[config.impid]; + if (!impCtx?.imp?.ext?.ae) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)(MODULE, 'Received auction configuration for an impression that was not in the request or did not ask for it', config, impCtx?.imp); + } else { + impCtx.paapiConfigs = impCtx.paapiConfigs || []; + impCtx.paapiConfigs.push(config); + } + }); +} + +// to make it easier to share code between the PBS adapter and adapters whose backend is PBS, break up +// fledge response processing in two steps: first aggregate all the auction configs by their imp... + +function parseExtPrebidFledge(response, ortbResponse, context) { + paapiResponseParser(ortbResponse.ext?.prebid?.fledge?.auctionconfigs || [], response, context); +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.RESPONSE, + name: 'extPrebidFledge', + fn: parseExtPrebidFledge, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.PBS] +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.RESPONSE, + name: 'extIgiIgs', + fn: parseExtIgi +}); + +// ...then, make them available in the adapter's response. This is the client side version, for which the +// interpretResponse api is {fledgeAuctionConfigs: [{bidId, config}]} + +function setResponsePaapiConfigs(response, ortbResponse, context) { + const configs = Object.values(context.impContext).flatMap(impCtx => (impCtx.paapiConfigs || []).map(cfg => ({ + bidId: impCtx.bidRequest.bidId, + ...cfg + }))); + if (configs.length > 0) { + response.paapi = configs; + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_14__.RESPONSE, + name: 'paapiConfigs', + priority: -1, + fn: setResponsePaapiConfigs +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('paapi'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","currencyUtils","weakStore","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/paapi.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["paapiForGpt"],{ + +/***/ "./modules/paapiForGpt.js": +/*!********************************!*\ + !*** ./modules/paapiForGpt.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports setTargetingHookFactory, slotConfigurator, getPAAPISizeHook, setPAAPIConfigFactory */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils/reducers.js */ "./src/utils/reducers.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/targeting.js */ "./src/targeting.js"); + +/** + * GPT-specific slot configuration logic for PAAPI. + */ + + + + + + +const MODULE = 'paapiForGpt'; +let getPAAPIConfig; +_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('paapi', cfg => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(cfg, 'paapi.gpt.configWithTargeting', true)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(MODULE, 'enabling PAAPI configuration with setTargetingForGPTAsync'); + _src_targeting_js__WEBPACK_IMPORTED_MODULE_3__.targeting.setTargetingForGPT.before(setTargetingHook); + } else { + _src_targeting_js__WEBPACK_IMPORTED_MODULE_3__.targeting.setTargetingForGPT.getHooks({ + hook: setTargetingHook + }).remove(); + } +}); +function setTargetingHookFactory() { + let setPaapiConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().setPAAPIConfigForGPT; + return function (next, adUnit, customSlotMatching) { + const adUnitCodes = Array.isArray(adUnit) ? adUnit : [adUnit]; + adUnitCodes.map(adUnitCode => adUnitCode == null ? undefined : { + adUnitCode + }).forEach(filters => setPaapiConfig(filters, customSlotMatching)); + next(adUnit, customSlotMatching); + }; +} +function slotConfigurator() { + const PREVIOUSLY_SET = {}; + return function setComponentAuction(adUnitCode, gptSlots, auctionConfigs) { + let reset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + if (gptSlots.length > 0) { + let previous = PREVIOUSLY_SET[adUnitCode] ?? {}; + let configsBySeller = Object.fromEntries(auctionConfigs.map(cfg => [cfg.seller, cfg])); + const sellers = Object.keys(configsBySeller); + if (reset) { + configsBySeller = Object.assign(previous, configsBySeller); + previous = Object.fromEntries(sellers.map(seller => [seller, null])); + } else { + sellers.forEach(seller => { + previous[seller] = null; + }); + } + Object.keys(previous).length ? PREVIOUSLY_SET[adUnitCode] = previous : delete PREVIOUSLY_SET[adUnitCode]; + const componentAuction = Object.entries(configsBySeller).map(_ref => { + let [configKey, auctionConfig] = _ref; + return { + configKey, + auctionConfig + }; + }); + if (componentAuction.length > 0) { + gptSlots.forEach(gptSlot => { + gptSlot.setConfig({ + componentAuction + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(MODULE, `register component auction configs for: ${adUnitCode}: ${gptSlot.getAdUnitPath()}`, auctionConfigs); + // reference https://developers.google.com/publisher-tag/reference#googletag.config.ComponentAuctionConfig + }); + } + } else if (auctionConfigs.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(MODULE, `unable to register component auction config for ${adUnitCode}`, auctionConfigs); + } + }; +} +const setComponentAuction = slotConfigurator(); +const getPAAPISizeHook = (() => { + /* + https://github.com/google/ads-privacy/tree/master/proposals/fledge-multiple-seller-testing#faq + https://support.google.com/admanager/answer/1100453?hl=en + Ignore any placeholder sizes, where placeholder is defined as a square creative with a side of <= 5 pixels + Look if there are any sizes that are part of the set of supported ad sizes defined here. If there are, choose the largest supported size by area (width * height) + For clarity, the set of supported ad sizes includes all of the ad sizes listed under “Top-performing ad sizes”, “Other supported ad sizes”, and “Regional ad sizes”. + If not, choose the largest remaining size (i.e. that isn’t in the list of supported ad sizes) by area (width * height) + */ + const SUPPORTED_SIZES = [[728, 90], [336, 280], [300, 250], [300, 50], [160, 600], [1024, 768], [970, 250], [970, 90], [768, 1024], [480, 320], [468, 60], [320, 480], [320, 100], [320, 50], [300, 600], [300, 100], [250, 250], [234, 60], [200, 200], [180, 150], [125, 125], [120, 600], [120, 240], [120, 60], [88, 31], [980, 120], [980, 90], [950, 90], [930, 180], [750, 300], [750, 200], [750, 100], [580, 400], [250, 360], [240, 400]].sort((0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_5__.keyCompare)(_ref2 => { + let [w, h] = _ref2; + return -(w * h); + })).map(size => [size, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.sizeTupleToSizeString)(size)]); + return function (next, sizes) { + if (sizes?.length) { + const sizeStrings = new Set(sizes.map(_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.sizeTupleToSizeString)); + const preferredSize = SUPPORTED_SIZES.find(_ref3 => { + let [_, sizeStr] = _ref3; + return sizeStrings.has(sizeStr); + }); + if (preferredSize) { + next.bail(preferredSize[0]); + return; + } + } + next(sizes); + }; +})(); +function setPAAPIConfigFactory() { + let getConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : filters => getPAAPIConfig(filters, true); + let setGptConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : setComponentAuction; + let getSlots = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _src_targeting_js__WEBPACK_IMPORTED_MODULE_3__.getGPTSlotsForAdUnits; + /** + * Configure GPT slots with PAAPI auction configs. + * `filters` are the same filters accepted by `pbjs.getPAAPIConfig`; + */ + return function () { + let filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let customSlotMatching = arguments.length > 1 ? arguments[1] : undefined; + let some = false; + const cfg = getConfig(filters) || {}; + const auToSlots = getSlots(Object.keys(cfg), customSlotMatching); + Object.entries(cfg).forEach(_ref4 => { + let [au, config] = _ref4; + if (config != null) { + some = true; + } + setGptConfig(au, auToSlots[au], config?.componentAuctions || [], true); + }); + if (!some) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE}: No component auctions available to set`); + } + }; +} +/** + * Configure GPT slots with PAAPI component auctions. Accepts the same filter arguments as `pbjs.getPAAPIConfig`. + */ +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().setPAAPIConfigForGPT = setPAAPIConfigFactory(); +const setTargetingHook = setTargetingHookFactory(); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)('paapi', { + name: 'gpt', + init(params) { + getPAAPIConfig = params.getPAAPIConfig; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.getHook)('getPAAPISize').before(getPAAPISizeHook); + } +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('paapiForGpt'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/paapiForGpt.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["padsquadBidAdapter"],{ + +/***/ "./modules/padsquadBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/padsquadBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const ENDPOINT_URL = 'https://x.padsquad.com/auction'; +const DEFAULT_BID_TTL = 30; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const spec = { + code: 'padsquad', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.unitId && typeof bid.params.unitId === 'string' || !!bid.params.networkId && typeof bid.params.networkId === 'string' || !!bid.params.publisherId && typeof bid.params.publisherId === 'string'; + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (!validBidRequests || !bidderRequest) { + return; + } + const publisherId = validBidRequests[0].params.publisherId; + const networkId = validBidRequests[0].params.networkId; + const impressions = validBidRequests.map(bidRequest => ({ + id: bidRequest.bidId, + banner: { + format: bidRequest.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1] + })) + }, + ext: { + exchange: { + unitId: bidRequest.params.unitId + } + } + })); + const openrtbRequest = { + id: bidderRequest.bidderRequestId, + imp: impressions, + site: { + domain: bidderRequest?.refererInfo?.domain, + page: bidderRequest?.refererInfo?.page, + ref: bidderRequest?.refererInfo?.ref + }, + ext: { + exchange: { + publisherId: publisherId, + networkId: networkId + } + } + }; + + // apply gdpr + if (bidderRequest.gdprConsent) { + openrtbRequest.regs = { + ext: { + gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 + } + }; + openrtbRequest.user = { + ext: { + consent: bidderRequest.gdprConsent.consentString + } + }; + } + const payloadString = JSON.stringify(openrtbRequest); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + const response = (serverResponse || {}).body; + // response is always one seat with (optional) bids for each impression + if (response && response.seatbid && response.seatbid.length === 1 && response.seatbid[0].bid && response.seatbid[0].bid.length) { + response.seatbid[0].bid.forEach(bid => { + bidResponses.push({ + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ad: bid.adm, + ttl: DEFAULT_BID_TTL, + creativeId: bid.crid, + meta: { + advertiserDomains: bid.adomain + }, + netRevenue: DEFAULT_NET_REVENUE, + currency: DEFAULT_CURRENCY + }); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('padsquad.interpretResponse :: no valid responses to interpret'); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('padsquad.getUserSyncs', 'syncOptions', syncOptions, 'serverResponses', serverResponses); + let syncs = []; + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return syncs; + } + serverResponses.forEach(resp => { + const userSync = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(resp, 'body.ext.usersync'); + if (userSync) { + let syncDetails = []; + Object.keys(userSync).forEach(key => { + const value = userSync[key]; + if (value.syncs && value.syncs.length) { + syncDetails = syncDetails.concat(value.syncs); + } + }); + syncDetails.forEach(syncDetails => { + syncs.push({ + type: syncDetails.type === 'iframe' ? 'iframe' : 'image', + url: syncDetails.url + }); + }); + if (!syncOptions.iframeEnabled) { + syncs = syncs.filter(s => s.type !== 'iframe'); + } + if (!syncOptions.pixelEnabled) { + syncs = syncs.filter(s => s.type !== 'image'); + } + } + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('padsquadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/padsquadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pairIdSystem"],{ + +/***/ "./modules/pairIdSystem.js": +/*!*********************************!*\ + !*** ./modules/pairIdSystem.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, pairIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds PAIR Id to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/pairIdSystem + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + */ + +const MODULE_NAME = 'pairId'; +const PAIR_ID_KEY = 'pairId'; +const DEFAULT_LIVERAMP_PAIR_ID_KEY = '_lr_pairId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function pairIdFromLocalStorage(key) { + return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(key) : null; +} +function pairIdFromCookie(key) { + return storage.cookiesAreEnabled() ? storage.getCookie(key) : null; +} + +/** @type {Submodule} */ +const pairIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * used to specify vendor id + * @type {number} + */ + gvlid: 755, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { string | undefined } value + * @returns {{pairId:string} | undefined } + */ + decode(value) { + return value && Array.isArray(value) ? { + 'pairId': value + } : undefined; + }, + /** + * Performs action to obtain ID and return a value in the callback's response argument. + * @function getId + * @param {Object} config - The configuration object. + * @param {Object} config.params - The parameters from the configuration. + * @returns {{id: string[] | undefined}} The obtained IDs or undefined if no IDs are found. + */ + getId(config) { + const pairIdsString = pairIdFromLocalStorage(PAIR_ID_KEY) || pairIdFromCookie(PAIR_ID_KEY); + let ids = []; + if (pairIdsString && typeof pairIdsString == 'string') { + try { + ids = ids.concat(JSON.parse(atob(pairIdsString))); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(error); + } + } + const configParams = config && config.params || {}; + if (configParams && configParams.liveramp) { + let LRStorageLocation = configParams.liveramp.storageKey || DEFAULT_LIVERAMP_PAIR_ID_KEY; + const liverampValue = pairIdFromLocalStorage(LRStorageLocation) || pairIdFromCookie(LRStorageLocation); + if (liverampValue) { + try { + const parsedValue = atob(liverampValue); + if (parsedValue) { + const obj = JSON.parse(parsedValue); + if (obj && typeof obj === 'object' && obj.envelope) { + ids = ids.concat(obj.envelope); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Pairid: Parsed object is not valid or does not contain envelope'); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Pairid: Decoded value is empty'); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Pairid: Error parsing JSON: ', error); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Pairid: liverampValue for pairId from storage is empty or null'); + } + } + if (ids.length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('PairId not found.'); + return undefined; + } + return { + 'id': ids + }; + }, + eids: { + 'pairId': { + source: 'google.com', + atype: 571187 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', pairIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('pairIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pairIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pangleBidAdapter"],{ + +/***/ "./modules/pangleBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/pangleBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, isValidUuid, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + + + +const BIDDER_CODE = 'pangle'; +const ENDPOINT = 'https://pangle.pangleglobal.com/api/ad/union/web_js/common/get_ads'; +const OUTSTREAM_RENDERER_URL = 'https://sf16-static.i18n-pglstatp.com/obj/ad-pattern-sg/pangle/web/ads/video.js'; +const DEFAULT_BID_TTL = 30; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const PANGLE_COOKIE = '_pangle_id'; +const COOKIE_EXP = 86400 * 1000 * 365 * 1; // 1 year +const MEDIA_TYPES = { + Banner: 1, + Video: 2 +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: BIDDER_CODE +}); +function isValidUuid(uuid) { + return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid); +} +function getPangleCookieId() { + let sid = storage.cookiesAreEnabled() && storage.getCookie(PANGLE_COOKIE); + if (!sid || !isValidUuid(sid)) { + sid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + setPangleCookieId(sid); + } + return sid; +} +function setPangleCookieId(sid) { + if (storage.cookiesAreEnabled()) { + const expires = new Date((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)() + COOKIE_EXP).toGMTString(); + storage.setCookie(PANGLE_COOKIE, sid, expires); + } +} +function createRequest(bidRequests, bidderRequest, mediaType) { + const data = converter.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }); + const devicetype = spec.getDeviceType(navigator.userAgent); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'device.devicetype', devicetype); + if (bidderRequest.userId && typeof bidderRequest.userId === 'object') { + const pangleId = getPangleCookieId(); + // add pangle cookie + const _eids = data.user?.ext?.eids ?? []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'user.ext.eids', [..._eids, { + source: document.location.host, + uids: [{ + id: pangleId, + atype: 1 + }] + }]); + } + bidRequests.forEach((item, idx) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data.imp[idx], 'ext.networkids', item.params); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data.imp[idx], 'banner.api', [5]); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'test', item.params.test ?? 0); + }); + return { + method: 'POST', + url: ENDPOINT, + data, + options: { + contentType: 'application/json', + withCredentials: true + } + }; +} +function isVideoBid(bid) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.video'); +} +function isBannerBid(bid) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'mediaTypes.banner'); +} +function renderOutstream(bid) { + bid.renderer.push(() => { + window.outstreamPlayer({ + bid, + codeId: bid.adUnitCode + }); + }); +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_5__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL, + currency: DEFAULT_CURRENCY + }, + bidResponse(buildBidResponse, bid, context) { + const { + bidRequest + } = context; + let bidResponse; + if (bid.mtype === MEDIA_TYPES.Video) { + context.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO; + bidResponse = buildBidResponse(bid, context); + if (bidRequest.mediaTypes.video?.context === 'outstream') { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: bid.bidId, + url: OUTSTREAM_RENDERER_URL, + adUnitCode: bid.adUnitCode + }); + renderer.setRender(renderOutstream); + bidResponse.renderer = renderer; + } + } + if (bid.mtype === MEDIA_TYPES.Banner) { + context.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER; + bidResponse = buildBidResponse(bid, context); + } + return bidResponse; + } +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO], + getDeviceType: function (ua) { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(ua.toLowerCase())) { + return 5; // 'tablet' + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(ua.toLowerCase())) { + return 4; // 'mobile' + } + return 2; // 'desktop' + }, + isBidRequestValid: function (bid) { + return Boolean(bid.params.token); + }, + buildRequests(bidRequests, bidderRequest) { + const reqArr = []; + const videoBids = bidRequests.filter(bid => isVideoBid(bid)); + const bannerBids = bidRequests.filter(bid => isBannerBid(bid)); + bannerBids.forEach(bid => { + reqArr.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER)); + }); + videoBids.forEach(bid => { + reqArr.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO)); + }); + return reqArr; + }, + interpretResponse(response, request) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_8__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('pangleBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pangleBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["performaxBidAdapter"],{ + +/***/ "./modules/performaxBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/performaxBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + +const BIDDER_CODE = 'performax'; +const BIDDER_SHORT_CODE = 'px'; +const GVLID = 732; +const ENDPOINT = 'https://dale.performax.cz/ortb'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'tagid', bidRequest.params.tagid); + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + context.netRevenue = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'netRevenue'); + context.mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaType'); + context.currency = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'currency'); + return buildBidResponse(bid, context); + }, + context: { + ttl: 360 + } +}); +const spec = { + code: BIDDER_CODE, + aliases: [BIDDER_SHORT_CODE], + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.tagid; + }, + buildRequests: function (bidRequests, bidderRequest) { + let data = converter.toORTB({ + bidderRequest, + bidRequests + }); + return [{ + method: 'POST', + url: ENDPOINT, + options: { + 'contentType': 'application/json' + }, + data: data + }]; + }, + interpretResponse: function (bidderResponse, request) { + if (!bidderResponse.body) return []; + const response = bidderResponse.body; + const data = { + seatbid: response.seatbid.map(seatbid => ({ + seat: seatbid.seat, + bid: seatbid.bid.map(bid => ({ + impid: bid.imp_id, + w: bid.w, + h: bid.h, + requestId: request.data.id, + price: bid.price, + currency: response.cur, + adm: bid.adm, + crid: bid.id, + netRevenue: true, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER + })) + })) + }; + return converter.fromORTB({ + response: data, + request: request.data + }).bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('performaxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/performaxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["permutiveIdentityManagerIdSystem"],{ + +/***/ "./modules/permutiveIdentityManagerIdSystem.js": +/*!*****************************************************!*\ + !*** ./modules/permutiveIdentityManagerIdSystem.js ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, permutiveIdentityManagerIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'permutiveIdentityManagerId'; +const PERMUTIVE_ID_DATA_STORAGE_KEY = 'permutive-prebid-id'; +const ID5_DOMAIN = 'id5-sync.com'; +const LIVERAMP_DOMAIN = 'liveramp.com'; +const UID_DOMAIN = 'uidapi.com'; +const PRIMARY_IDS = ['id5id', 'idl_env', 'uid2']; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +const logger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.prefixLog)('[PermutiveID]'); +const readFromSdkLocalStorage = () => { + const data = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.safeJSONParse)(storage.getDataFromLocalStorage(PERMUTIVE_ID_DATA_STORAGE_KEY)); + const id = {}; + if (data && typeof data === 'object' && 'providers' in data && typeof data.providers === 'object') { + const now = Date.now(); + for (const [idName, value] of Object.entries(data.providers)) { + if (PRIMARY_IDS.includes(idName) && value.userId) { + if (!value.expiryTime || value.expiryTime > now) { + id[idName] = value.userId; + } + } + } + } + return id; +}; + +/** + * Catch and log errors + * @param {function} fn - Function to safely evaluate + */ +function makeSafe(fn) { + try { + return fn(); + } catch (e) { + logger.logError(e); + } +} +const waitAndRetrieveFromSdk = timeoutMs => new Promise(resolve => { + const fallback = setTimeout(() => { + logger.logInfo('timeout expired waiting for SDK - attempting read from local storage again'); + resolve(readFromSdkLocalStorage()); + }, timeoutMs); + return window?.permutive?.ready(() => makeSafe(() => { + logger.logInfo('Permutive SDK is ready'); + const onReady = makeSafe(() => window.permutive.addons.identity_manager.prebid.onReady); + if (typeof onReady === 'function') { + onReady(ids => { + logger.logInfo('Permutive SDK has provided ids'); + resolve(ids); + clearTimeout(fallback); + }); + } else { + logger.logError('Permutive SDK initialised but identity manager prebid api not present'); + } + })); +}); + +/** @type {Submodule} */ +const permutiveIdentityManagerIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * decode the stored id value for passing to bid requests + * @function decode + * @param {(Object|string)} value + * @param {SubmoduleConfig|undefined} config + * @returns {(Object|undefined)} + */ + decode(value, config) { + return value; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function getId + * @param {SubmoduleConfig} submoduleConfig + * @param {ConsentData} consentData + * @param {(Object|undefined)} cacheIdObj + * @returns {IdResponse|undefined} + */ + getId(submoduleConfig, consentData, cacheIdObj) { + const id = readFromSdkLocalStorage(); + if (Object.entries(id).length > 0) { + logger.logInfo('found id in sdk storage'); + return { + id + }; + } else if ('params' in submoduleConfig && submoduleConfig.params.ajaxTimeout) { + logger.logInfo('failed to find id in sdk storage - waiting for sdk'); + // Is ajaxTimeout an appropriate timeout to use here? + return { + callback: done => waitAndRetrieveFromSdk(submoduleConfig.params.ajaxTimeout).then(done) + }; + } else { + logger.logInfo('failed to find id in sdk storage and no wait time specified'); + } + }, + primaryIds: PRIMARY_IDS, + eids: { + 'id5id': { + getValue: function (data) { + return data.uid; + }, + source: ID5_DOMAIN, + atype: 1, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + }, + 'idl_env': { + source: LIVERAMP_DOMAIN, + atype: 3 + }, + 'uid2': { + source: UID_DOMAIN, + atype: 3, + getValue: function (data) { + return data.id; + }, + getUidExt: function (data) { + if (data.ext) { + return data.ext; + } + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', permutiveIdentityManagerIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('permutiveIdentityManagerIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/permutiveIdentityManagerIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["permutiveRtdProvider"],{ + +/***/ "./modules/permutiveRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/permutiveRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PERMUTIVE_SUBMODULE_CONFIG_KEY, PERMUTIVE_STANDARD_KEYWORD, PERMUTIVE_CUSTOM_COHORTS_KEYWORD, PERMUTIVE_STANDARD_AUD_KEYWORD, storage, getModuleConfig, setBidderRtb, isAcEnabled, isPermutiveOnPage, getSegments, readAndSetCohorts, permutiveSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds permutive provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will add custom segment targeting to ad units of specific bidders + * @module modules/permutiveRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'permutive'; +const logger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)('[PermutiveRTD]'); +const PERMUTIVE_SUBMODULE_CONFIG_KEY = 'permutive-prebid-rtd'; +const PERMUTIVE_STANDARD_KEYWORD = 'p_standard'; +const PERMUTIVE_CUSTOM_COHORTS_KEYWORD = 'permutive'; +const PERMUTIVE_STANDARD_AUD_KEYWORD = 'p_standard_aud'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, + moduleName: MODULE_NAME +}); +function init(moduleConfig, userConsent) { + readPermutiveModuleConfigFromCache(); + return true; +} +function liftIntoParams(params) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(params) ? { + params + } : {}; +} +let cachedPermutiveModuleConfig = {}; + +/** + * Access the submodules RTD params that are cached to LocalStorage by the Permutive SDK. This lets the RTD submodule + * apply publisher defined params set in the Permutive platform, so they may still be applied if the Permutive SDK has + * not initialised before this submodule is initialised. + */ +function readPermutiveModuleConfigFromCache() { + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.safeJSONParse)(storage.getDataFromLocalStorage(PERMUTIVE_SUBMODULE_CONFIG_KEY)); + return cachedPermutiveModuleConfig = liftIntoParams(params); +} + +/** + * Access the submodules RTD params attached to the Permutive SDK. + * + * @return The Permutive config available by the Permutive SDK or null if the operation errors. + */ +function getParamsFromPermutive() { + try { + return liftIntoParams(window.permutive.addons.prebid.getPermutiveRtdConfig()); + } catch (e) { + return null; + } +} + +/** + * Merges segments into existing bidder config in reverse priority order. The highest priority is 1. + * + * 1. customModuleConfig <- set by publisher with pbjs.setConfig + * 2. permutiveRtdConfig <- set by the publisher using the Permutive platform + * 3. defaultConfig + * + * As items with a higher priority will be deeply merged into the previous config, deep merges are performed by + * reversing the priority order. + * + * @param {Object} customModuleConfig - Publisher config for module + * @return {Object} Deep merges of the default, Permutive and custom config. + */ +function getModuleConfig(customModuleConfig) { + // Use the params from Permutive if available, otherwise fallback to the cached value set by Permutive. + const permutiveModuleConfig = getParamsFromPermutive() || cachedPermutiveModuleConfig; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)({ + waitForIt: false, + params: { + maxSegs: 500, + acBidders: [], + overwrites: {} + } + }, permutiveModuleConfig, customModuleConfig); +} + +/** + * Sets ortb2 config for ac bidders + * @param {Object} bidderOrtb2 - The ortb2 object for the all bidders + * @param {Object} moduleConfig - Publisher config for module + * @param {Object} segmentData - Segment data grouped by bidder or type + */ +function setBidderRtb(bidderOrtb2, moduleConfig, segmentData) { + const acBidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, 'params.acBidders'); + const maxSegs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, 'params.maxSegs'); + const transformationConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, 'params.transformations') || []; + const ssps = segmentData?.ssp?.ssps ?? []; + const sspCohorts = segmentData?.ssp?.cohorts ?? []; + const topics = segmentData?.topics ?? {}; + const bidders = new Set([...acBidders, ...ssps]); + bidders.forEach(function (bidder) { + const currConfig = { + ortb2: bidderOrtb2[bidder] || {} + }; + let cohorts = []; + const isAcBidder = acBidders.indexOf(bidder) > -1; + if (isAcBidder) { + cohorts = segmentData.ac; + } + const isSspBidder = ssps.indexOf(bidder) > -1; + if (isSspBidder) { + cohorts = [...new Set([...cohorts, ...sspCohorts])].slice(0, maxSegs); + } + const nextConfig = updateOrtbConfig(bidder, currConfig, cohorts, sspCohorts, topics, transformationConfigs, segmentData); + bidderOrtb2[bidder] = nextConfig.ortb2; + }); +} + +/** + * Updates `user.data` object in existing bidder config with Permutive segments + * @param {string} bidder - The bidder identifier + * @param {Object} currConfig - Current bidder config + * @param {string[]} segmentIDs - Permutive segment IDs + * @param {string[]} sspSegmentIDs - Permutive SSP segment IDs + * @param {Object} topics - Privacy Sandbox Topics, keyed by IAB taxonomy version (600, 601, etc.) + * @param {Object[]} transformationConfigs - array of objects with `id` and `config` properties, used to determine + * the transformations on user data to include the ORTB2 object + * @param {Object} segmentData - The segments available for targeting + * @return {Object} Merged ortb2 object + */ +function updateOrtbConfig(bidder, currConfig, segmentIDs, sspSegmentIDs, topics, transformationConfigs, segmentData) { + logger.logInfo(`Current ortb2 config`, { + bidder, + config: currConfig + }); + const customCohortsData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(segmentData, bidder) || []; + const name = 'permutive.com'; + const permutiveUserData = { + name, + segment: segmentIDs.map(segmentId => ({ + id: segmentId + })) + }; + const transformedUserData = transformationConfigs.filter(_ref => { + let { + id + } = _ref; + return ortb2UserDataTransformations.hasOwnProperty(id); + }).map(_ref2 => { + let { + id, + config + } = _ref2; + return ortb2UserDataTransformations[id](permutiveUserData, config); + }); + const customCohortsUserData = { + name: PERMUTIVE_CUSTOM_COHORTS_KEYWORD, + segment: customCohortsData.map(cohortID => ({ + id: cohortID + })) + }; + const ortbConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)({}, currConfig); + const currentUserData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortbConfig, 'ortb2.user.data') || []; + let topicsUserData = []; + for (const [k, value] of Object.entries(topics)) { + topicsUserData.push({ + name, + ext: { + segtax: Number(k) + }, + segment: value.map(topic => ({ + id: topic.toString() + })) + }); + } + const updatedUserData = currentUserData.filter(el => el.name !== permutiveUserData.name && el.name !== customCohortsUserData.name).concat(permutiveUserData, transformedUserData, customCohortsUserData).concat(topicsUserData); + logger.logInfo(`Updating ortb2.user.data`, { + bidder, + user_data: updatedUserData + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbConfig, 'ortb2.user.data', updatedUserData); + + // Set ortb2.user.keywords + const currentKeywords = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortbConfig, 'ortb2.user.keywords'); + const keywordGroups = { + [PERMUTIVE_STANDARD_KEYWORD]: segmentIDs, + [PERMUTIVE_STANDARD_AUD_KEYWORD]: sspSegmentIDs, + [PERMUTIVE_CUSTOM_COHORTS_KEYWORD]: customCohortsData + }; + + // Transform groups of key-values into a single array of strings + // i.e { permutive: ['1', '2'], p_standard: ['3', '4'] } => ['permutive=1', 'permutive=2', 'p_standard=3',' p_standard=4'] + const transformedKeywordGroups = Object.entries(keywordGroups).flatMap(_ref3 => { + let [keyword, ids] = _ref3; + return ids.map(id => `${keyword}=${id}`); + }); + const keywords = [currentKeywords, ...transformedKeywordGroups].filter(Boolean).join(','); + logger.logInfo(`Updating ortb2.user.keywords`, { + bidder, + keywords + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbConfig, 'ortb2.user.keywords', keywords); + + // Set user extensions + if (segmentIDs.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbConfig, `ortb2.user.ext.data.${PERMUTIVE_STANDARD_KEYWORD}`, segmentIDs); + logger.logInfo(`Extending ortb2.user.ext.data with "${PERMUTIVE_STANDARD_KEYWORD}"`, segmentIDs); + } + if (customCohortsData.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbConfig, `ortb2.user.ext.data.${PERMUTIVE_CUSTOM_COHORTS_KEYWORD}`, customCohortsData.map(String)); + logger.logInfo(`Extending ortb2.user.ext.data with "${PERMUTIVE_CUSTOM_COHORTS_KEYWORD}"`, customCohortsData); + } + + // Set site extensions + if (segmentIDs.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbConfig, `ortb2.site.ext.permutive.${PERMUTIVE_STANDARD_KEYWORD}`, segmentIDs); + logger.logInfo(`Extending ortb2.site.ext.permutive with "${PERMUTIVE_STANDARD_KEYWORD}"`, segmentIDs); + } + logger.logInfo(`Updated ortb2 config`, { + bidder, + config: ortbConfig + }); + return ortbConfig; +} + +/** + * Set segments on bid request object + * @param {Object} reqBidsConfigObj - Bid request object + * @param {Object} moduleConfig - Module configuration + * @param {Object} segmentData - Segment object + */ +function setSegments(reqBidsConfigObj, moduleConfig, segmentData) { + const adUnits = reqBidsConfigObj && reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.getGlobal)().adUnits; + const utils = { + deepSetValue: _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset, + deepAccess: _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"], + isFn: _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn, + mergeDeep: _src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep + }; + const aliasMap = { + appnexusAst: 'appnexus' + }; + if (!adUnits) { + return; + } + adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + let { + bidder + } = bid; + if (typeof aliasMap[bidder] !== 'undefined') { + bidder = aliasMap[bidder]; + } + const acEnabled = isAcEnabled(moduleConfig, bidder); + const customFn = getCustomBidderFn(moduleConfig, bidder); + if (customFn) { + // For backwards compatibility we pass an identity function to any custom bidder function set by a publisher + const bidIdentity = bid => bid; + customFn(bid, segmentData, acEnabled, utils, bidIdentity); + } + }); + }); +} + +/** + * Catch and log errors + * @param {function} fn - Function to safely evaluate + */ +function makeSafe(fn) { + try { + return fn(); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e); + } +} +function getCustomBidderFn(moduleConfig, bidder) { + const overwriteFn = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, `params.overwrites.${bidder}`); + if (overwriteFn && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(overwriteFn)) { + return overwriteFn; + } else { + return null; + } +} + +/** + * Check whether ac is enabled for bidder + * @param {Object} moduleConfig - Module configuration + * @param {string} bidder - Bidder name + * @return {boolean} + */ +function isAcEnabled(moduleConfig, bidder) { + const acBidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, 'params.acBidders') || []; + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.includes)(acBidders, bidder); +} + +/** + * Check whether Permutive is on page + * @return {boolean} + */ +function isPermutiveOnPage() { + return typeof window.permutive !== 'undefined' && typeof window.permutive.ready === 'function'; +} + +/** + * Get all relevant segment IDs in an object + * @param {number} maxSegs - Maximum number of segments to be included + * @return {Object} + */ +function getSegments(maxSegs) { + const segments = { + ac: makeSafe(() => { + const legacySegs = makeSafe(() => readSegments('_psegs', []).map(Number).filter(seg => seg >= 1000000).map(String)) || []; + const _ppam = makeSafe(() => readSegments('_ppam', []).map(String)) || []; + const _pcrprs = makeSafe(() => readSegments('_pcrprs', []).map(String)) || []; + return [..._pcrprs, ..._ppam, ...legacySegs]; + }) || [], + ix: makeSafe(() => { + const _pindexs = readSegments('_pindexs', []); + return _pindexs.map(String); + }) || [], + rubicon: makeSafe(() => { + const _prubicons = readSegments('_prubicons', []); + return _prubicons.map(String); + }) || [], + appnexus: makeSafe(() => { + const _papns = readSegments('_papns', []); + return _papns.map(String); + }) || [], + gam: makeSafe(() => { + const _pdfps = readSegments('_pdfps', []); + return _pdfps.map(String); + }) || [], + ssp: makeSafe(() => { + const _pssps = readSegments('_pssps', { + cohorts: [], + ssps: [] + }); + return { + cohorts: makeSafe(() => _pssps.cohorts.map(String)) || [], + ssps: makeSafe(() => _pssps.ssps.map(String)) || [] + }; + }), + topics: makeSafe(() => { + const _ppsts = readSegments('_ppsts', {}); + const topics = {}; + for (const [k, value] of Object.entries(_ppsts)) { + topics[k] = makeSafe(() => value.map(String)) || []; + } + return topics; + }) || {} + }; + for (const bidder in segments) { + if (bidder === 'ssp') { + if (segments[bidder].cohorts && Array.isArray(segments[bidder].cohorts)) { + segments[bidder].cohorts = segments[bidder].cohorts.slice(0, maxSegs); + } + } else if (bidder === 'topics') { + for (const taxonomy in segments[bidder]) { + segments[bidder][taxonomy] = segments[bidder][taxonomy].slice(0, maxSegs); + } + } else { + segments[bidder] = segments[bidder].slice(0, maxSegs); + } + } + logger.logInfo(`Read segments`, segments); + return segments; +} + +/** + * Gets an array of segment IDs from LocalStorage + * or return the default value provided. + * @template A + * @param {string} key + * @param {A} defaultValue + * @return {A} + */ +function readSegments(key, defaultValue) { + try { + return JSON.parse(storage.getDataFromLocalStorage(key)) || defaultValue; + } catch (e) { + return defaultValue; + } +} +const unknownIabSegmentId = '_unknown_'; + +/** + * Functions to apply to ORT2B2 `user.data` objects. + * Each function should return an a new object containing a `name`, (optional) `ext` and `segment` + * properties. The result of the each transformation defined here will be appended to the array + * under `user.data` in the bid request. + */ +const ortb2UserDataTransformations = { + iab: (userData, config) => ({ + name: userData.name, + ext: { + segtax: config.segtax + }, + segment: (userData.segment || []).map(segment => ({ + id: iabSegmentId(segment.id, config.iabIds) + })).filter(segment => segment.id !== unknownIabSegmentId) + }) +}; + +/** + * Transform a Permutive segment ID into an IAB audience taxonomy ID. + * @param {string} permutiveSegmentId + * @param {Object} iabIds object of mappings between Permutive and IAB segment IDs (key: permutive ID, value: IAB ID) + * @return {string} IAB audience taxonomy ID associated with the Permutive segment ID + */ +function iabSegmentId(permutiveSegmentId, iabIds) { + return iabIds[permutiveSegmentId] || unknownIabSegmentId; +} + +/** + * Pull the latest configuration and cohort information and update accordingly. + * + * @param reqBidsConfigObj - Bidder provided config for request + * @param moduleConfig - Publisher provided config + */ +function readAndSetCohorts(reqBidsConfigObj, moduleConfig) { + const segmentData = getSegments((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(moduleConfig, 'params.maxSegs')); + makeSafe(function () { + // Legacy route with custom parameters + // ACK policy violation, in process of removing + setSegments(reqBidsConfigObj, moduleConfig, segmentData); + }); + makeSafe(function () { + // Route for bidders supporting ORTB2 + setBidderRtb(reqBidsConfigObj.ortb2Fragments?.bidder, moduleConfig, segmentData); + }); +} +let permutiveSDKInRealTime = false; + +/** @type {RtdSubmodule} */ +const permutiveSubmodule = { + name: MODULE_NAME, + getBidRequestData: function (reqBidsConfigObj, callback, customModuleConfig) { + const completeBidRequestData = () => { + logger.logInfo(`Request data updated`); + callback(); + }; + const moduleConfig = getModuleConfig(customModuleConfig); + readAndSetCohorts(reqBidsConfigObj, moduleConfig); + makeSafe(function () { + if (permutiveSDKInRealTime || !(moduleConfig.waitForIt && isPermutiveOnPage())) { + return completeBidRequestData(); + } + window.permutive.ready(function () { + logger.logInfo(`SDK is realtime, updating cohorts`); + permutiveSDKInRealTime = true; + readAndSetCohorts(reqBidsConfigObj, getModuleConfig(customModuleConfig)); + completeBidRequestData(); + }, 'realtime'); + logger.logInfo(`Registered cohort update when SDK is realtime`); + }); + }, + init: init +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.submodule)('realTimeData', permutiveSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('permutiveRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/permutiveRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pgamsspBidAdapter"],{ + +/***/ "./modules/pgamsspBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/pgamsspBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'pgamssp'; +const GVLID = 1353; +const AD_URL = 'https://us-east.pgammedia.com/pbjs'; +const SYNC_URL = 'https://cs.pgammedia.com'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pgamsspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pgamsspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pianoDmpAnalyticsAdapter"],{ + +/***/ "./modules/pianoDmpAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/pianoDmpAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + +const pianoDmpAnalytics = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + analyticsType: 'bundle', + handler: 'on' +}); +const { + enableAnalytics: _enableAnalytics +} = pianoDmpAnalytics; +Object.assign(pianoDmpAnalytics, { + /** + * Save event in the global array that will be consumed later by cx.js + */ + track: _ref => { + let { + eventType, + args: params + } = _ref; + window.cX.callQueue.push(['prebid', { + eventType, + params, + time: Date.now() + }]); + }, + /** + * Before forwarding the call to the original enableAnalytics function - + * create (if needed) the global array that is used to pass events to the cx.js library + * by the 'track' function above. + */ + enableAnalytics: function () { + window.cX = window.cX || {}; + window.cX.callQueue = window.cX.callQueue || []; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return _enableAnalytics.call(this, ...args); + } +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: pianoDmpAnalytics, + code: 'pianoDmp', + gvlid: 412 +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pianoDmpAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('pianoDmpAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pianoDmpAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pilotxBidAdapter"],{ + +/***/ "./modules/pilotxBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/pilotxBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'pilotx'; +const ENDPOINT_URL = '//adn.pilotx.tv/hb'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: ['banner', 'video'], + aliases: ['pilotx'], + // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let sizesCheck = !!bid.sizes; + let paramSizesCheck = !!bid.params.sizes; + var sizeConfirmed = false; + if (sizesCheck) { + if (bid.sizes.length < 1) { + return false; + } else { + sizeConfirmed = true; + } + } + if (paramSizesCheck) { + if (bid.params.sizes.length < 1 && !sizeConfirmed) { + return false; + } else { + sizeConfirmed = true; + } + } + if (!sizeConfirmed) { + return false; + } + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let payloadItems = {}; + validBidRequests.forEach(bidRequest => { + let sizes = []; + let placementId = this.setPlacementID(bidRequest.params.placementId); + payloadItems[placementId] = {}; + if (bidRequest.sizes.length > 0) { + if (Array.isArray(bidRequest.sizes[0])) { + for (let i = 0; i < bidRequest.sizes.length; i++) { + sizes[i] = [bidRequest.sizes[i][0], bidRequest.sizes[i][1]]; + } + } else { + sizes[0] = [bidRequest.sizes[0], bidRequest.sizes[1]]; + } + payloadItems[placementId]['sizes'] = sizes; + } + if (bidRequest.mediaTypes != null) { + for (let i in bidRequest.mediaTypes) { + payloadItems[placementId][i] = { + ...bidRequest.mediaTypes[i] + }; + } + } + let consentTemp = ''; + let consentRequiredTemp = false; + if (bidderRequest && bidderRequest.gdprConsent) { + consentTemp = bidderRequest.gdprConsent.consentString; + // will check if the gdprApplies field was populated with a boolean value (ie from page config). If it's undefined, then default to true + consentRequiredTemp = typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : true; + } + payloadItems[placementId]['gdprConsentString'] = consentTemp; + payloadItems[placementId]['gdprConsentRequired'] = consentRequiredTemp; + payloadItems[placementId]['bidId'] = bidRequest.bidId; + }); + const payload = payloadItems; + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const serverBody = serverResponse.body; + const bidResponses = []; + if (serverBody.mediaType == 'banner') { + const bidResponse = { + requestId: serverBody.requestId, + cpm: serverBody.cpm, + width: serverBody.width, + height: serverBody.height, + creativeId: serverBody.creativeId, + currency: serverBody.currency, + netRevenue: false, + ttl: serverBody.ttl, + ad: serverBody.ad, + mediaType: 'banner', + meta: { + mediaType: 'banner', + advertiserDomains: serverBody.advertiserDomains + } + }; + bidResponses.push(bidResponse); + } else if (serverBody.mediaType == 'video') { + const bidResponse = { + requestId: serverBody.requestId, + cpm: serverBody.cpm, + width: serverBody.width, + height: serverBody.height, + creativeId: serverBody.creativeId, + currency: serverBody.currency, + netRevenue: false, + ttl: serverBody.ttl, + vastUrl: serverBody.vastUrl, + mediaType: 'video', + meta: { + mediaType: 'video', + advertiserDomains: serverBody.advertiserDomains + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; + }, + /** + * Formats placement ids for adserver ingestion purposes + * @param {string[]} placementId the placement ID/s in an array + */ + setPlacementID: function (placementId) { + if (Array.isArray(placementId)) { + return placementId.join('#'); + } + return placementId; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_0__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_1__.registerModule)('pilotxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pilotxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pixfutureBidAdapter"],{ + +/***/ "./modules/pixfutureBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/pixfutureBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/appnexusUtils/anKeywords.js */ "./libraries/appnexusUtils/anKeywords.js"); +/* harmony import */ var _libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/appnexusUtils/anUtils.js */ "./libraries/appnexusUtils/anUtils.js"); + + + + + + + + + + +const SOURCE = 'pbjs'; +const storageManager = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: 'pixfuture' +}); +const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language']; +let pixID = ''; +const GVLID = 839; +const spec = { + code: 'pixfuture', + gvlid: GVLID, + hostname: 'https://gosrv.pixfuture.com', + getHostname() { + let ret = this.hostname; + try { + ret = storageManager.getDataFromLocalStorage('ov_pixbidder_host') || ret; + } catch (e) {} + return ret; + }, + isBidRequestValid(bid) { + return !!(bid.sizes && bid.bidId && bid.params && bid.params.pix_id && typeof bid.params.pix_id === 'string'); + }, + buildRequests(validBidRequests, bidderRequest) { + const tags = validBidRequests.map(bidToTag); + const hostname = this.getHostname(); + return validBidRequests.map(bidRequest => { + if (bidRequest.params.pix_id) { + pixID = bidRequest.params.pix_id; + } + let referer = ''; + if (bidderRequest && bidderRequest.refererInfo) { + referer = bidderRequest.refererInfo.page || ''; + } + const userObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(validBidRequests, hasUserInfo); + let userObj = {}; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + userObj = { + 'coppa': true + }; + } + if (userObjBid) { + Object.keys(userObjBid.params.user).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(USER_PARAMS, param)).forEach(param => { + let uparam = (0,_libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_3__.convertCamelToUnderscore)(param); + if (param === 'segments' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(userObjBid.params.user[param])) { + let segs = []; + userObjBid.params.user[param].forEach(val => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(val)) { + segs.push({ + 'id': val + }); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(val)) { + segs.push(val); + } + }); + userObj[uparam] = segs; + } else if (param !== 'segments') { + userObj[uparam] = userObjBid.params.user[param]; + } + }); + } + const schain = validBidRequests[0].schain; + const payload = { + tags: [...tags], + user: userObj, + sdk: { + source: SOURCE, + version: "9.45.0-pre" + }, + schain: schain + }; + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.refererInfo) { + let refererinfo = { + // TODO: this collects everything it finds, except for canonicalUrl + rd_ref: encodeURIComponent(bidderRequest.refererInfo.topmostLocation), + rd_top: bidderRequest.refererInfo.reachedTop, + rd_ifs: bidderRequest.refererInfo.numIframes, + rd_stk: bidderRequest.refererInfo.stack.map(url => encodeURIComponent(url)).join(',') + }; + payload.referrer_detection = refererinfo; + } + if (validBidRequests[0].userId) { + let eids = []; + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.criteoId`), 'criteo.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.unifiedId`), 'thetradedesk.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.id5Id`), 'id5.io', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.sharedId`), 'thetradedesk.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.identityLink`), 'liveramp.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.liveIntentId`), 'liveintent.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(validBidRequests[0], `userId.fabrickId`), 'home.neustar', null); + if (eids.length) { + payload.eids = eids; + } + } + if (tags[0].publisher_id) { + payload.publisher_id = tags[0].publisher_id; + } + const ret = { + url: `${hostname}/pixservices`, + method: 'POST', + options: { + withCredentials: true + }, + data: { + v: 'v' + "9.45.0-pre", + pageUrl: referer, + bidId: bidRequest.bidId, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidRequest.auctionId, + transactionId: bidRequest.ortb2Imp?.ext?.tid, + adUnitCode: bidRequest.adUnitCode, + bidRequestCount: bidRequest.bidRequestCount, + sizes: bidRequest.sizes, + params: bidRequest.params, + pubext: payload + } + }; + if (bidderRequest && bidderRequest.gdprConsent) { + ret.data.gdprConsent = { + consentString: bidderRequest.gdprConsent.consentString, + consentRequired: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' && bidderRequest.gdprConsent.gdprApplies + }; + } + return ret; + }); + }, + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + const bids = []; + if (serverResponse.creatives.bids && serverResponse.placements) { + serverResponse.placements.forEach(serverBid => { + serverBid.creatives.forEach(creative => { + const bid = newBid(serverBid, creative, serverBid.placement_id, serverBid.uuid); + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER; + bids.push(bid); + }); + }); + } + return bids; + }, + getUserSyncs: function (syncOptions, bid, gdprConsent, uspConsent) { + const syncs = []; + let syncurl = 'pixid=' + pixID; + let gdpr = gdprConsent && gdprConsent.gdprApplies ? 1 : 0; + let consent = gdprConsent ? encodeURIComponent(gdprConsent.consentString || '') : ''; + + // Attaching GDPR Consent Params in UserSync url + syncurl += '&gdprconcent=' + gdpr + '&adsync=' + consent; + + // CCPA + if (uspConsent) { + syncurl += '&us_privacy=' + encodeURIComponent(uspConsent); + } + + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + syncurl += '&coppa=1'; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: 'https://gosrv.pixfuture.com/cookiesync?f=b&' + syncurl + }); + } else { + syncs.push({ + type: 'image', + url: 'https://gosrv.pixfuture.com/cookiesync?f=i&' + syncurl + }); + } + return syncs; + } +}; +function newBid(serverBid, rtbBid, placementId, uuid) { + const bid = { + requestId: uuid, + cpm: rtbBid.cpm, + creativeId: rtbBid.creative_id, + currency: 'USD', + netRevenue: true, + ttl: 300, + adUnitCode: placementId + }; + if (rtbBid.adomain) { + bid.meta = Object.assign({}, bid.meta, { + advertiserDomains: [rtbBid.adomain] + }); + } + ; + Object.assign(bid, { + width: rtbBid.width, + height: rtbBid.height, + ad: rtbBid.code + }); + return bid; +} + +// Functions related optional parameters +function bidToTag(bid) { + const tag = {}; + tag.sizes = transformSizes(bid.sizes); + tag.primary_size = tag.sizes[0]; + tag.ad_types = []; + tag.uuid = bid.bidId; + if (bid.params.placementId) { + tag.id = parseInt(bid.params.placementId, 10); + } else { + tag.code = bid.params.invCode; + } + tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false; + tag.use_pmt_rule = bid.params.usePaymentRule || false; + tag.prebid = true; + tag.disable_psa = true; + let bidFloor = getBidFloor(bid); + if (bidFloor) { + tag.reserve = bidFloor; + } + if (bid.params.position) { + tag.position = { + 'above': 1, + 'below': 2 + }[bid.params.position] || 0; + } else { + let mediaTypePos = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, `mediaTypes.banner.pos`) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, `mediaTypes.video.pos`); + // only support unknown, atf, and btf values for position at this time + if (mediaTypePos === 0 || mediaTypePos === 1 || mediaTypePos === 3) { + // ortb spec treats btf === 3, but our system interprets btf === 2; so converting the ortb value here for consistency + tag.position = mediaTypePos === 3 ? 2 : mediaTypePos; + } + } + if (bid.params.trafficSourceCode) { + tag.traffic_source_code = bid.params.trafficSourceCode; + } + if (bid.params.privateSizes) { + tag.private_sizes = transformSizes(bid.params.privateSizes); + } + if (bid.params.supplyType) { + tag.supply_type = bid.params.supplyType; + } + if (bid.params.pubClick) { + tag.pubclick = bid.params.pubClick; + } + if (bid.params.extInvCode) { + tag.ext_inv_code = bid.params.extInvCode; + } + if (bid.params.publisherId) { + tag.publisher_id = parseInt(bid.params.publisherId, 10); + } + if (bid.params.externalImpId) { + tag.external_imp_id = bid.params.externalImpId; + } + tag.keywords = (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_7__.getANKeywordParam)(bid.ortb2, bid.params.keywords); + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + tag.gpid = gpid; + } + if (bid.renderer) { + tag.video = Object.assign({}, tag.video, { + custom_renderer_present: true + }); + } + if (bid.params.frameworks && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(bid.params.frameworks)) { + tag['banner_frameworks'] = bid.params.frameworks; + } + // TODO: why does this need to iterate through every adUnit? + let adUnit = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(_src_auctionManager_js__WEBPACK_IMPORTED_MODULE_8__.auctionManager.getAdUnits(), au => bid.transactionId === au.transactionId); + if (adUnit && adUnit.mediaTypes && adUnit.mediaTypes.banner) { + tag.ad_types.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER); + } + if (tag.ad_types.length === 0) { + delete tag.ad_types; + } + return tag; +} +function addUserId(eids, id, source, rti) { + if (id) { + if (rti) { + eids.push({ + source, + id, + rti_partner: rti + }); + } else { + eids.push({ + source, + id + }); + } + } + return eids; +} +function hasUserInfo(bid) { + return !!bid.params.user; +} +function transformSizes(requestSizes) { + let sizes = []; + let sizeObj = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(requestSizes) && requestSizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(requestSizes[0])) { + sizeObj.width = parseInt(requestSizes[0], 10); + sizeObj.height = parseInt(requestSizes[1], 10); + sizes.push(sizeObj); + } else if (typeof requestSizes === 'object') { + for (let i = 0; i < requestSizes.length; i++) { + let size = requestSizes[i]; + sizeObj = {}; + sizeObj.width = parseInt(size[0], 10); + sizeObj.height = parseInt(size[1], 10); + sizes.push(sizeObj); + } + } + return sizes; +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(bid.getFloor)) { + return bid.params.reserve ? bid.params.reserve : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('pixfutureBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["keywords","appnexusUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pixfutureBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["playdigoBidAdapter"],{ + +/***/ "./modules/playdigoBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/playdigoBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'playdigo'; +const GVLID = 1302; +const AD_URL = 'https://server.playdigo.com/pbjs'; +const SYNC_URL = 'https://cs.playdigo.com'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('playdigoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/playdigoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["prebidServerBidAdapter"],{ + +/***/ "./modules/prebidServerBidAdapter/bidderConfig.js": +/*!********************************************************!*\ + !*** ./modules/prebidServerBidAdapter/bidderConfig.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ premergeFpd: () => (/* binding */ premergeFpd) +/* harmony export */ }); +/* unused harmony exports getPBSBidderConfig, extractEids, consolidateEids */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/activities/redactor.js */ "./src/activities/redactor.js"); + + + +/** + * Perform a partial pre-merge of bidder config for PBS. + * + * Prebid.js and Prebid Server use different strategies for merging global and bidder-specific config; JS attemps to + * merge arrays (concatenating them, with some deduping, cfr. mergeDeep), while PBS only merges objects - + * a bidder-specific array will replace a global array. + * + * This returns bidder config (from `bidder`) where arrays are replaced with what you get from merging them with `global`, + * so that the result of merging in PBS is the same as in JS. + */ +function getPBSBidderConfig(_ref) { + let { + global, + bidder + } = _ref; + return Object.fromEntries(Object.entries(bidder).map(_ref2 => { + let [bidderCode, bidderConfig] = _ref2; + return [bidderCode, replaceArrays(bidderConfig, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)({}, global, bidderConfig))]; + })); +} +function replaceArrays(config, mergedConfig) { + return Object.fromEntries(Object.entries(config).map(_ref3 => { + let [key, value] = _ref3; + const mergedValue = mergedConfig[key]; + if (Array.isArray(value)) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepEqual)(value, mergedValue) && Array.isArray(mergedValue)) { + value = mergedValue; + } + } else if (value != null && typeof value === 'object') { + value = replaceArrays(value, mergedValue); + } + return [key, value]; + })); +} + +/** + * Extract all EIDs from FPD. + * + * Returns {eids, conflicts}, where: + * + * - `eids` contains an object of the form `{eid, bidders}` for each unique EID object found anywhere in FPD; + * `bidders` is a list of all the bidders that refer to that specific EID object, or false if that EID object is defined globally. + * - `conflicts` is a set containing all EID sources that appear in multiple, otherwise different, EID objects. + */ +function extractEids(_ref4) { + let { + global, + bidder + } = _ref4; + const entries = []; + const bySource = {}; + const conflicts = new Set(); + function getEntry(eid) { + let entry = entries.find(candidate => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepEqual)(candidate.eid, eid)); + if (entry == null) { + entry = { + eid, + bidders: new Set() + }; + entries.push(entry); + } + if (bySource[eid.source] == null) { + bySource[eid.source] = entry.eid; + } else if (entry.eid === eid) { + // if this is the first time we see this eid, but not the first time we see its source, we have a conflict + conflicts.add(eid.source); + } + return entry; + } + _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_1__.ORTB_EIDS_PATHS.forEach(path => { + ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(global, path) || []).forEach(eid => { + getEntry(eid).bidders = false; + }); + }); + Object.entries(bidder).forEach(_ref5 => { + let [bidderCode, bidderConfig] = _ref5; + _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_1__.ORTB_EIDS_PATHS.forEach(path => { + ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderConfig, path) || []).forEach(eid => { + const entry = getEntry(eid); + if (entry.bidders !== false) { + entry.bidders.add(bidderCode); + } + }); + }); + }); + return { + eids: entries.map(_ref6 => { + let { + eid, + bidders + } = _ref6; + return { + eid, + bidders: bidders && Array.from(bidders) + }; + }), + conflicts + }; +} + +/** + * Consolidate extracted EIDs to take advantage of PBS's eidpermissions feature: + * https://docs.prebid.org/prebid-server/endpoints/openrtb2/pbs-endpoint-auction.html#eid-permissions + * + * If different bidders have different EID configurations, in most cases we can avoid repeating it in each bidder's + * specific config. As long as there are no conflicts (different EID objects that refer to the same source constitute a conflict), + * the EID can be set as global, and eidpermissions can restrict its access only to specific bidders. + * + * Returns {global, bidder, permissions}, where: + * - `global` is a list of global EID objects (some of which may be restricted through `permissions` + * - `bidder` is a map from bidder code to EID objects that are specific to that bidder, and cannot be restricted through `permissions` + * - `permissions` is a list of EID permissions as expected by PBS. + */ +function consolidateEids(_ref7) { + let { + eids, + conflicts = new Set() + } = _ref7; + const globalEntries = []; + const bidderEntries = []; + const byBidder = {}; + eids.forEach(eid => { + (eid.bidders === false ? globalEntries : bidderEntries).push(eid); + }); + bidderEntries.forEach(_ref8 => { + let { + eid, + bidders + } = _ref8; + if (!conflicts.has(eid.source)) { + globalEntries.push({ + eid, + bidders + }); + } else { + bidders.forEach(bidderCode => { + (byBidder[bidderCode] = byBidder[bidderCode] || []).push(eid); + }); + } + }); + return { + global: globalEntries.map(_ref9 => { + let { + eid + } = _ref9; + return eid; + }), + permissions: globalEntries.filter(_ref10 => { + let { + bidders + } = _ref10; + return bidders !== false; + }).map(_ref11 => { + let { + eid, + bidders + } = _ref11; + return { + source: eid.source, + bidders + }; + }), + bidder: byBidder + }; +} +function replaceEids(_ref12, requestedBidders) { + let { + global, + bidder + } = _ref12; + const consolidated = consolidateEids(extractEids({ + global, + bidder + })); + global = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(global); + bidder = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bidder); + function removeEids(target) { + delete target?.user?.eids; + delete target?.user?.ext?.eids; + } + removeEids(global); + Object.values(bidder).forEach(removeEids); + if (consolidated.global.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(global, 'user.ext.eids', consolidated.global); + } + if (requestedBidders?.length) { + consolidated.permissions.forEach(permission => permission.bidders = permission.bidders.filter(bidder => requestedBidders.includes(bidder))); + } + if (consolidated.permissions.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(global, 'ext.prebid.data.eidpermissions', consolidated.permissions); + } + Object.entries(consolidated.bidder).forEach(_ref13 => { + let [bidderCode, bidderEids] = _ref13; + if (bidderEids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidder[bidderCode], 'user.ext.eids', bidderEids); + } + }); + return { + global, + bidder + }; +} +function premergeFpd(ortb2Fragments, requestedBidders) { + if (ortb2Fragments == null || Object.keys(ortb2Fragments.bidder || {}).length === 0) { + return ortb2Fragments; + } else { + ortb2Fragments = replaceEids(ortb2Fragments, requestedBidders); + return { + ...ortb2Fragments, + bidder: getPBSBidderConfig(ortb2Fragments) + }; + } +} + +/***/ }), + +/***/ "./modules/prebidServerBidAdapter/config.js": +/*!**************************************************!*\ + !*** ./modules/prebidServerBidAdapter/config.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ S2S_VENDORS: () => (/* binding */ S2S_VENDORS) +/* harmony export */ }); +// accountId and bidders params are not included here, should be configured by end-user +const S2S_VENDORS = { + 'appnexuspsp': { + adapter: 'prebidServer', + enabled: true, + endpoint: { + p1Consent: 'https://ib.adnxs.com/openrtb2/prebid', + noP1Consent: 'https://ib.adnxs-simple.com/openrtb2/prebid' + }, + syncEndpoint: { + p1Consent: 'https://prebid.adnxs.com/pbs/v1/cookie_sync', + noP1Consent: 'https://prebid.adnxs-simple.com/pbs/v1/cookie_sync' + }, + maxTimeout: 1000 + }, + 'rubicon': { + adapter: 'prebidServer', + enabled: true, + endpoint: { + p1Consent: 'https://prebid-server.rubiconproject.com/openrtb2/auction', + noP1Consent: 'https://prebid-server.rubiconproject.com/openrtb2/auction' + }, + syncEndpoint: { + p1Consent: 'https://prebid-server.rubiconproject.com/cookie_sync', + noP1Consent: 'https://prebid-server.rubiconproject.com/cookie_sync' + }, + maxTimeout: 500 + }, + 'openwrap': { + adapter: 'prebidServer', + enabled: true, + endpoint: { + p1Consent: 'https://ow.pubmatic.com/openrtb2/auction?source=pbjs', + noP1Consent: 'https://ow.pubmatic.com/openrtb2/auction?source=pbjs' + }, + maxTimeout: 500 + } +}; + +/***/ }), + +/***/ "./modules/prebidServerBidAdapter/index.js": +/*!*************************************************!*\ + !*** ./modules/prebidServerBidAdapter/index.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ s2sDefaultConfig: () => (/* binding */ s2sDefaultConfig) +/* harmony export */ }); +/* unused harmony exports validateConfig, resetSyncedStatus, PrebidServer, processPBSRequest */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapter_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/adapter.js */ "./src/adapter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./config.js */ "./modules/prebidServerBidAdapter/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _ortbConverter_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ortbConverter.js */ "./modules/prebidServerBidAdapter/ortbConverter.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); + + + + + + + + + + + + + + + + + +const getConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig; +const TYPE = _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.S2S.SRC; +let _syncCount = 0; +let _s2sConfigs; + +/** + * @typedef {Object} AdapterOptions + * @summary s2sConfig parameter that adds arguments to resulting OpenRTB payload that goes to Prebid Server + * @property {string} adapter + * @property {boolean} enabled + * @property {string} endpoint + * @property {string} syncEndpoint + * @property {number} timeout + * @example + * // example of multiple bidder configuration + * pbjs.setConfig({ + * s2sConfig: { + * adapterOptions: { + * rubicon: {singleRequest: false} + * appnexus: {key: "value"} + * } + * } + * }); + */ + +/** + * @typedef {Object} S2SDefaultConfig + * @summary Base config properties for server to server header bidding + * @property {string} [adapter='prebidServer'] adapter code to use for S2S + * @property {boolean} [allowUnknownBidderCodes=false] allow bids from bidders that were not explicitly requested + * @property {boolean} [enabled=false] enables S2S bidding + * @property {number} [timeout=1000] timeout for S2S bidders - should be lower than `pbjs.requestBids({timeout})` + * @property {number} [syncTimeout=1000] timeout for cookie sync iframe / image rendering + * @property {number} [maxBids=1] + * @property {AdapterOptions} [adapterOptions] adds arguments to resulting OpenRTB payload to Prebid Server + * @property {Object} [syncUrlModifier] + */ + +/** + * @typedef {S2SDefaultConfig} S2SConfig + * @summary Configuration for server to server header bidding + * @property {string[]} bidders bidders to request S2S + * @property {string} endpoint endpoint to contact + * @property {string} [defaultVendor] used as key to select the bidder's default config from ßprebidServer/config.js + * @property {boolean} [cacheMarkup] whether to cache the adm result + * @property {string} [syncEndpoint] endpoint URL for syncing cookies + * @property {Object} [extPrebid] properties will be merged into request.ext.prebid + * @property {Object} [ortbNative] base value for imp.native.request + * @property {Number} [maxTimeout] + */ + +/** + * @type {S2SDefaultConfig} + */ +const s2sDefaultConfig = { + bidders: Object.freeze([]), + syncTimeout: 1000, + maxBids: 1, + adapter: 'prebidServer', + allowUnknownBidderCodes: false, + adapterOptions: {}, + syncUrlModifier: {}, + ortbNative: { + eventtrackers: [{ + event: 1, + methods: [1, 2] + }] + }, + maxTimeout: 1500 +}; +_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.setDefaults({ + 's2sConfig': s2sDefaultConfig +}); + +/** + * @param {S2SConfig} s2sConfig + * @return {boolean} + */ +function updateConfigDefaults(s2sConfig) { + if (s2sConfig.defaultVendor) { + let vendor = s2sConfig.defaultVendor; + let optionKeys = Object.keys(s2sConfig); + if (_config_js__WEBPACK_IMPORTED_MODULE_2__.S2S_VENDORS[vendor]) { + // vendor keys will be set if either: the key was not specified by user + // or if the user did not set their own distinct value (ie using the system default) to override the vendor + Object.keys(_config_js__WEBPACK_IMPORTED_MODULE_2__.S2S_VENDORS[vendor]).forEach(vendorKey => { + if (s2sDefaultConfig[vendorKey] === s2sConfig[vendorKey] || !(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(optionKeys, vendorKey)) { + s2sConfig[vendorKey] = _config_js__WEBPACK_IMPORTED_MODULE_2__.S2S_VENDORS[vendor][vendorKey]; + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Incorrect or unavailable prebid server default vendor option: ' + vendor); + return false; + } + } else { + if (s2sConfig.adapter == null) { + s2sConfig.adapter = 'prebidServer'; + } + } + return true; +} + +/** + * @param {S2SConfig} s2sConfig + * @return {boolean} + */ +function validateConfigRequiredProps(s2sConfig) { + for (const key of ['accountId', 'endpoint']) { + if (s2sConfig[key] == null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(key + ' missing in server to server config'); + return false; + } + } + return true; +} + +// temporary change to modify the s2sConfig for new format used for endpoint URLs; +// could be removed later as part of a major release, if we decide to not support the old format +function formatUrlParams(option) { + ['endpoint', 'syncEndpoint'].forEach(prop => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isStr)(option[prop])) { + let temp = option[prop]; + option[prop] = { + p1Consent: temp, + noP1Consent: temp + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(option[prop]) && (!option[prop].p1Consent || !option[prop].noP1Consent)) { + ['p1Consent', 'noP1Consent'].forEach(conUrl => { + if (!option[prop][conUrl]) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`s2sConfig.${prop}.${conUrl} not defined. PBS request will be skipped in some P1 scenarios.`); + } + }); + } + }); +} +function validateConfig(options) { + if (!options) { + return; + } + options = Array.isArray(options) ? options : [options]; + const activeBidders = new Set(); + return options.filter(s2sConfig => { + formatUrlParams(s2sConfig); + if (updateConfigDefaults(s2sConfig) && validateConfigRequiredProps(s2sConfig) && s2sConfig.enabled) { + if (Array.isArray(s2sConfig.bidders)) { + s2sConfig.bidders = s2sConfig.bidders.filter(bidder => { + if (activeBidders.has(bidder)) { + return false; + } else { + activeBidders.add(bidder); + return true; + } + }); + } + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('prebidServer: s2s config is disabled', s2sConfig); + } + }); +} + +/** + * @param {(S2SConfig[]|S2SConfig)} options + */ +function setS2sConfig(options) { + options = validateConfig(options); + if (options.length) { + _s2sConfigs = options; + } +} +getConfig('s2sConfig', _ref => { + let { + s2sConfig + } = _ref; + return setS2sConfig(s2sConfig); +}); + +/** + * resets the _synced variable back to false, primiarily used for testing purposes + */ +function resetSyncedStatus() { + _syncCount = 0; +} + +/** + * @param {Array} bidderCodes list of bidders to request user syncs for. + */ +function queueSync(bidderCodes, gdprConsent, uspConsent, gppConsent, s2sConfig) { + if (_s2sConfigs.length === _syncCount) { + return; + } + _syncCount++; + let filterSettings = {}; + const userSyncFilterSettings = getConfig('userSync.filterSettings'); + if (userSyncFilterSettings) { + const { + all, + iframe, + image + } = userSyncFilterSettings; + const ifrm = iframe || all; + const img = image || all; + if (ifrm) filterSettings = Object.assign({ + iframe: ifrm + }, filterSettings); + if (img) filterSettings = Object.assign({ + image: img + }, filterSettings); + } + const payload = { + uuid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(), + bidders: bidderCodes, + account: s2sConfig.accountId, + filterSettings + }; + let userSyncLimit = s2sConfig.userSyncLimit; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(userSyncLimit) && userSyncLimit > 0) { + payload['limit'] = userSyncLimit; + } + if (gdprConsent) { + payload.gdpr = gdprConsent.gdprApplies ? 1 : 0; + // attempt to populate gdpr_consent if we know gdprApplies or it may apply + if (gdprConsent.gdprApplies !== false) { + payload.gdpr_consent = gdprConsent.consentString; + } + } + + // US Privacy (CCPA) support + if (uspConsent) { + payload.us_privacy = uspConsent; + } + if (gppConsent) { + payload.gpp_sid = gppConsent.applicableSections.join(); + // should we add check if applicableSections was not equal to -1 (where user was out of scope)? + // this would be similar to what was done above for TCF + payload.gpp = gppConsent.gppString; + } + if (typeof s2sConfig.coopSync === 'boolean') { + payload.coopSync = s2sConfig.coopSync; + } + const jsonPayload = JSON.stringify(payload); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(getMatchingConsentUrl(s2sConfig.syncEndpoint, gdprConsent), response => { + try { + response = JSON.parse(response); + doAllSyncs(response.bidder_status, s2sConfig); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(e); + } + }, jsonPayload, { + contentType: 'text/plain', + withCredentials: true + }); +} +function doAllSyncs(bidders, s2sConfig) { + if (bidders.length === 0) { + return; + } + + // pull the syncs off the list in the order that prebid server sends them + const thisSync = bidders.shift(); + + // if PBS reports this bidder doesn't have an ID, then call the sync and recurse to the next sync entry + if (thisSync.no_cookie) { + doPreBidderSync(thisSync.usersync.type, thisSync.usersync.url, thisSync.bidder, doAllSyncs.bind(null, bidders, s2sConfig), s2sConfig); + } else { + // bidder already has an ID, so just recurse to the next sync entry + doAllSyncs(bidders, s2sConfig); + } +} + +/** + * Modify the cookie sync url from prebid server to add new params. + * + * @param {string} type the type of sync, "image", "redirect", "iframe" + * @param {string} url the url to sync + * @param {string} bidder name of bidder doing sync for + * @param {function} done an exit callback; to signify this pixel has either: finished rendering or something went wrong + * @param {S2SConfig} s2sConfig + */ +function doPreBidderSync(type, url, bidder, done, s2sConfig) { + if (s2sConfig.syncUrlModifier && typeof s2sConfig.syncUrlModifier[bidder] === 'function') { + url = s2sConfig.syncUrlModifier[bidder](type, url, bidder); + } + doBidderSync(type, url, bidder, done, s2sConfig.syncTimeout); +} + +/** + * Run a cookie sync for the given type, url, and bidder + * + * @param {string} type the type of sync, "image", "redirect", "iframe" + * @param {string} url the url to sync + * @param {string} bidder name of bidder doing sync for + * @param {function} done an exit callback; to signify this pixel has either: finished rendering or something went wrong + * @param {number} timeout maximum time to wait for rendering in milliseconds + */ +function doBidderSync(type, url, bidder, done, timeout) { + if (!url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`No sync url for bidder "${bidder}": ${url}`); + done(); + } else if (type === 'image' || type === 'redirect') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)(`Invoking image pixel user sync for bidder: "${bidder}"`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.triggerPixel)(url, done, timeout); + } else if (type === 'iframe') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)(`Invoking iframe user sync for bidder: "${bidder}"`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.insertUserSyncIframe)(url, done, timeout); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`User sync type "${type}" not supported for bidder: "${bidder}"`); + done(); + } +} + +/** + * Do client-side syncs for bidders. + * + * @param {Array} bidders a list of bidder names + */ +function doClientSideSyncs(bidders, gdprConsent, uspConsent, gppConsent) { + bidders.forEach(bidder => { + let clientAdapter = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].getBidAdapter(bidder); + if (clientAdapter && clientAdapter.registerSyncs) { + _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.runWithBidder(bidder, clientAdapter.registerSyncs.bind(clientAdapter, [], gdprConsent, uspConsent, gppConsent)); + } + }); +} +function getMatchingConsentUrl(urlProp, gdprConsent) { + const hasPurpose = (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__.hasPurpose1Consent)(gdprConsent); + const url = hasPurpose ? urlProp.p1Consent : urlProp.noP1Consent; + if (!url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('Missing matching consent URL when gdpr=' + hasPurpose); + } + return url; +} +function getConsentData(bidRequests) { + let gdprConsent, uspConsent, gppConsent; + if (Array.isArray(bidRequests) && bidRequests.length > 0) { + gdprConsent = bidRequests[0].gdprConsent; + uspConsent = bidRequests[0].uspConsent; + gppConsent = bidRequests[0].gppConsent; + } + return { + gdprConsent, + uspConsent, + gppConsent + }; +} + +/** + * Bidder adapter for Prebid Server + */ +function PrebidServer() { + const baseAdapter = new _src_adapter_js__WEBPACK_IMPORTED_MODULE_8__["default"]('prebidServer'); + + /* Prebid executes this function when the page asks to send out bid requests */ + baseAdapter.callBids = function (s2sBidRequest, bidRequests, addBidResponse, done, ajax) { + const adapterMetrics = s2sBidRequest.metrics = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_9__.useMetrics)(bidRequests?.[0]?.metrics).newMetrics().renameWith(n => [`adapter.s2s.${n}`, `adapters.s2s.${s2sBidRequest.s2sConfig.defaultVendor}.${n}`]); + done = adapterMetrics.startTiming('total').stopBefore(done); + bidRequests.forEach(req => (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_9__.useMetrics)(req.metrics).join(adapterMetrics, { + continuePropagation: false + })); + let { + gdprConsent, + uspConsent, + gppConsent + } = getConsentData(bidRequests); + if (Array.isArray(_s2sConfigs)) { + if (s2sBidRequest.s2sConfig && s2sBidRequest.s2sConfig.syncEndpoint && getMatchingConsentUrl(s2sBidRequest.s2sConfig.syncEndpoint, gdprConsent)) { + const s2sAliases = (s2sBidRequest.s2sConfig.extPrebid && s2sBidRequest.s2sConfig.extPrebid.aliases) ?? {}; + let syncBidders = s2sBidRequest.s2sConfig.bidders.map(bidder => _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].aliasRegistry[bidder] || s2sAliases[bidder] || bidder).filter((bidder, index, array) => array.indexOf(bidder) === index); + queueSync(syncBidders, gdprConsent, uspConsent, gppConsent, s2sBidRequest.s2sConfig); + } + processPBSRequest(s2sBidRequest, bidRequests, ajax, { + onResponse: function (isValid, requestedBidders, response) { + if (isValid) { + bidRequests.forEach(bidderRequest => _src_events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE, bidderRequest)); + } + const { + seatNonBidData, + atagData + } = getAnalyticsFlags(s2sBidRequest.s2sConfig, response); + if (seatNonBidData) { + _src_events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.SEAT_NON_BID, { + seatnonbid: response.ext.seatnonbid, + auctionId: bidRequests[0].auctionId, + requestedBidders, + response, + adapterMetrics + }); + } + // pbs analytics event + if (seatNonBidData || atagData) { + const data = { + seatnonbid: seatNonBidData, + atag: atagData, + auctionId: bidRequests[0].auctionId, + requestedBidders, + response, + adapterMetrics + }; + _src_events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.PBS_ANALYTICS, data); + } + done(false); + doClientSideSyncs(requestedBidders, gdprConsent, uspConsent, gppConsent); + }, + onError(msg, error) { + const { + p1Consent = '', + noP1Consent = '' + } = s2sBidRequest?.s2sConfig?.endpoint || {}; + if (p1Consent === noP1Consent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Prebid server call failed: '${msg}'. Endpoint: "${p1Consent}"}`, error); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Prebid server call failed: '${msg}'. Endpoints: p1Consent "${p1Consent}", noP1Consent "${noP1Consent}"}`, error); + } + bidRequests.forEach(bidderRequest => _src_events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_ERROR, { + error, + bidderRequest + })); + done(error.timedOut); + }, + onBid: function (_ref2) { + let { + adUnit, + bid + } = _ref2; + const metrics = bid.metrics = s2sBidRequest.metrics.fork().renameWith(); + metrics.checkpoint('addBidResponse'); + if ((bid.requestId == null || bid.requestBidder == null) && !s2sBidRequest.s2sConfig.allowUnknownBidderCodes) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`PBS adapter received bid from unknown bidder (${bid.bidder}), but 's2sConfig.allowUnknownBidderCodes' is not set. Ignoring bid.`); + addBidResponse.reject(adUnit, bid, _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.REJECTION_REASON.BIDDER_DISALLOWED); + } else { + if (metrics.measureTime('addBidResponse.validate', () => (0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__.isValid)(adUnit, bid))) { + addBidResponse(adUnit, bid); + } else { + addBidResponse.reject(adUnit, bid, _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.REJECTION_REASON.INVALID); + } + } + }, + onFledge: params => { + _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.runWithBidder(params.bidder, () => { + (0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__.addPaapiConfig)({ + auctionId: bidRequests[0].auctionId, + ...params + }, { + config: params.config + }); + }); + } + }); + } + }; + return Object.assign(this, { + callBids: baseAdapter.callBids, + setBidderCode: baseAdapter.setBidderCode, + type: TYPE + }); +} + +/** + * Build and send the appropriate HTTP request over the network, then interpret the response. + * @param s2sBidRequest + * @param bidRequests + * @param ajax + * @param onResponse {function(boolean, Array[String])} invoked on a successful HTTP response - with a flag indicating whether it was successful, + * and a list of the unique bidder codes that were sent in the request + * @param onError {function(String, {})} invoked on HTTP failure - with status message and XHR error + * @param onBid {function({})} invoked once for each bid in the response - with the bid as returned by interpretResponse + */ +const processPBSRequest = (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_12__.hook)('async', function (s2sBidRequest, bidRequests, ajax, _ref3) { + let { + onResponse, + onError, + onBid, + onFledge + } = _ref3; + let { + gdprConsent + } = getConsentData(bidRequests); + const adUnits = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(s2sBidRequest.ad_units); + + // in case config.bidders contains invalid bidders, we only process those we sent requests for + const requestedBidders = adUnits.map(adUnit => adUnit.bids.map(bid => bid.bidder).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.uniques)).reduce(_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.flatten, []).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.uniques); + const request = s2sBidRequest.metrics.measureTime('buildRequests', () => (0,_ortbConverter_js__WEBPACK_IMPORTED_MODULE_13__.buildPBSRequest)(s2sBidRequest, bidRequests, adUnits, requestedBidders)); + const requestData = { + endpointUrl: getMatchingConsentUrl(s2sBidRequest.s2sConfig.endpoint, gdprConsent), + requestJson: request && JSON.stringify(request), + customHeaders: s2sBidRequest?.s2sConfig?.customHeaders ?? {} + }; + _src_events_js__WEBPACK_IMPORTED_MODULE_10__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BEFORE_PBS_HTTP, requestData); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)('BidRequest: ' + requestData); + if (request && requestData.requestJson && requestData.endpointUrl) { + const networkDone = s2sBidRequest.metrics.startTiming('net'); + ajax(requestData.endpointUrl, { + success: function (response) { + networkDone(); + let result; + try { + result = JSON.parse(response); + const { + bids, + paapi + } = s2sBidRequest.metrics.measureTime('interpretResponse', () => (0,_ortbConverter_js__WEBPACK_IMPORTED_MODULE_13__.interpretPBSResponse)(result, request)); + bids.forEach(onBid); + if (paapi) { + paapi.forEach(onFledge); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(error); + } + if (!result || result.status && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(result.status, 'Error')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('error parsing response: ', result ? result.status : 'not valid JSON'); + onResponse(false, requestedBidders); + } else { + onResponse(true, requestedBidders, result); + } + }, + error: function () { + networkDone(); + onError.apply(this, arguments); + } + }, requestData.requestJson, { + contentType: 'text/plain', + withCredentials: true, + browsingTopics: (0,_src_activities_rules_js__WEBPACK_IMPORTED_MODULE_14__.isActivityAllowed)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_15__.ACTIVITY_TRANSMIT_UFPD, (0,_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__.s2sActivityParams)(s2sBidRequest.s2sConfig)), + customHeaders: requestData.customHeaders + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('PBS request not made. Check endpoints.'); + } +}, 'processPBSRequest'); +function getAnalyticsFlags(s2sConfig, response) { + return { + atagData: getAtagData(response), + seatNonBidData: getNonBidData(s2sConfig, response) + }; +} +function getNonBidData(s2sConfig, response) { + return s2sConfig?.extPrebid?.returnallbidstatus ? response?.ext?.seatnonbid : undefined; +} +function getAtagData(response) { + return response?.ext?.prebid?.analytics?.tags; +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerBidAdapter(new PrebidServer(), 'prebidServer'); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_16__.registerModule)('prebidServerBidAdapter'); + +/***/ }), + +/***/ "./modules/prebidServerBidAdapter/ortbConverter.js": +/*!*********************************************************!*\ + !*** ./modules/prebidServerBidAdapter/ortbConverter.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ buildPBSRequest: () => (/* binding */ buildPBSRequest), +/* harmony export */ interpretPBSResponse: () => (/* binding */ interpretPBSResponse) +/* harmony export */ }); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_bidfactory_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/bidfactory.js */ "./src/bidfactory.js"); +/* harmony import */ var _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../libraries/pbsExtensions/pbsExtensions.js */ "./libraries/pbsExtensions/pbsExtensions.js"); +/* harmony import */ var _libraries_pbsExtensions_processors_params_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../libraries/pbsExtensions/processors/params.js */ "./libraries/pbsExtensions/processors/params.js"); +/* harmony import */ var _libraries_pbsExtensions_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../libraries/pbsExtensions/processors/mediaType.js */ "./libraries/pbsExtensions/processors/mediaType.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../src/activities/redactor.js */ "./src/activities/redactor.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../src/activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../libraries/currencyUtils/currency.js */ "./libraries/currencyUtils/currency.js"); +/* harmony import */ var _src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils/reducers.js */ "./src/utils/reducers.js"); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./modules/prebidServerBidAdapter/index.js"); +/* harmony import */ var _bidderConfig_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./bidderConfig.js */ "./modules/prebidServerBidAdapter/bidderConfig.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + + + + + + + + + + + + + + + +const DEFAULT_S2S_TTL = 60; +const DEFAULT_S2S_CURRENCY = 'USD'; +const DEFAULT_S2S_NETREVENUE = true; +const BIDDER_SPECIFIC_REQUEST_PROPS = new Set(['bidderCode', 'bidderRequestId', 'uniquePbsTid', 'bids', 'timeout']); +const getMinimumFloor = (() => { + const getMin = (0,_src_utils_reducers_js__WEBPACK_IMPORTED_MODULE_1__.minimum)((0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_2__.currencyCompare)(floor => [floor.bidfloor, floor.bidfloorcur])); + return function (candidates) { + let min; + for (const candidate of candidates) { + if (candidate?.bidfloorcur == null || candidate?.bidfloor == null) return null; + min = min == null ? candidate : getMin(min, candidate); + } + return min; + }; +})(); +const PBS_CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + processors: _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_4__.pbsExtensions, + context: { + netRevenue: DEFAULT_S2S_NETREVENUE + }, + imp(buildImp, proxyBidRequest, context) { + Object.assign(context, proxyBidRequest.pbsData); + const imp = buildImp(proxyBidRequest, context); + (proxyBidRequest.bids || []).forEach(bid => { + if (bid.ortb2Imp && Object.keys(bid.ortb2Imp).length > 0) { + // set bidder-level imp attributes; see https://github.com/prebid/prebid-server/issues/2335 + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(imp, `ext.prebid.imp.${bid.bidder}`, bid.ortb2Imp); + } + }); + if (Object.values(_libraries_pbsExtensions_processors_mediaType_js__WEBPACK_IMPORTED_MODULE_6__.SUPPORTED_MEDIA_TYPES).some(mtype => imp[mtype])) { + imp.secure = proxyBidRequest.ortb2Imp?.secure ?? 1; + return imp; + } + }, + request(buildRequest, imps, proxyBidderRequest, context) { + if (!imps.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.logError)('Request to Prebid Server rejected due to invalid media type(s) in adUnit.'); + } else { + let { + s2sBidRequest + } = context; + const request = buildRequest(imps, proxyBidderRequest, context); + request.tmax = s2sBidRequest.s2sConfig.timeout ?? Math.min(s2sBidRequest.requestBidsTimeout * 0.75, s2sBidRequest.s2sConfig.maxTimeout ?? _index_js__WEBPACK_IMPORTED_MODULE_0__.s2sDefaultConfig.maxTimeout); + request.ext.tmaxmax = request.ext.tmaxmax || s2sBidRequest.requestBidsTimeout; + [request.app, request.dooh, request.site].forEach(section => { + if (section && !section.publisher?.id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(section, 'publisher.id', s2sBidRequest.s2sConfig.accountId); + } + }); + if (!context.transmitTids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(request, 'ext.prebid.createtids', false); + } + return request; + } + }, + bidResponse(buildBidResponse, bid, context) { + // before sending the response throgh "stock" ortb conversion, here we need to: + // - filter out ones that come from an "unknown" bidder (if allowUnknownBidderCode is not set) + // - overwrite context.bidRequest with the actual bid request for this seat / imp combination + + let bidRequest = context.actualBidRequests.get(context.seatbid.seat); + if (bidRequest == null) { + // for stored impressions, a request was made with bidder code `null`. Pick it up here so that NO_BID, BID_WON, etc events + // can work as expected (otherwise, the original request will always result in NO_BID). + bidRequest = context.actualBidRequests.get(null); + } + if (bidRequest) { + Object.assign(context, { + bidRequest, + bidderRequest: context.actualBidderRequests.find(req => req.bidderCode === bidRequest.bidder) + }); + } + const bidResponse = buildBidResponse(bid, context); + bidResponse.requestBidder = bidRequest?.bidder; + if (bidResponse.native?.ortb) { + // TODO: do we need to set bidResponse.adm here? + // Any consumers can now get the same object from bidResponse.native.ortb; + // I could not find any, which raises the question - who is looking for this? + bidResponse.adm = bidResponse.native.ortb; + } + + // because core has special treatment for PBS adapter responses, we need some additional processing + bidResponse.requestTimestamp = context.requestTimestamp; + return { + bid: Object.assign((0,_src_bidfactory_js__WEBPACK_IMPORTED_MODULE_8__.createBid)(_src_constants_js__WEBPACK_IMPORTED_MODULE_9__.STATUS.GOOD, { + src: _src_constants_js__WEBPACK_IMPORTED_MODULE_9__.S2S.SRC, + bidId: bidRequest ? bidRequest.bidId || bidRequest.bid_Id : null, + transactionId: context.adUnit.transactionId, + adUnitId: context.adUnit.adUnitId, + auctionId: context.bidderRequest.auctionId + }), bidResponse, { + deferRendering: !!context.adUnit.deferBilling, + deferBilling: !!context.adUnit.deferBilling + }), + adUnit: context.adUnit.code + }; + }, + overrides: { + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__.IMP]: { + id(orig, imp, proxyBidRequest, context) { + imp.id = context.impId; + }, + params(orig, imp, proxyBidRequest, context) { + // override params processing to do it for each bidRequest in this imp; + // also, take overrides from s2sConfig.adapterOptions + const adapterOptions = context.s2sBidRequest.s2sConfig.adapterOptions; + for (const req of context.actualBidRequests.values()) { + (0,_libraries_pbsExtensions_processors_params_js__WEBPACK_IMPORTED_MODULE_11__.setImpBidParams)(imp, req, context, context); + if (adapterOptions && adapterOptions[req.bidder]) { + Object.assign(imp.ext.prebid.bidder[req.bidder], adapterOptions[req.bidder]); + } + } + }, + // for bid floors, we pass each bidRequest associated with this imp through normal bidfloor/extBidfloor processing, + // and aggregate all of them into a single, minimum floor to put in the request + bidfloor(orig, imp, proxyBidRequest, context) { + const min = getMinimumFloor(function* () { + for (const req of context.actualBidRequests.values()) { + const floor = {}; + orig(floor, req, context); + yield floor; + } + }()); + if (min != null) { + Object.assign(imp, min); + } + }, + extBidfloor(orig, imp, proxyBidRequest, context) { + function setExtFloor(target, minFloor) { + if (minFloor != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(target, 'ext.bidfloor', minFloor.bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(target, 'ext.bidfloorcur', minFloor.bidfloorcur); + } + } + const imps = Array.from(context.actualBidRequests.values()).map(request => { + const requestImp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.deepClone)(imp); + orig(requestImp, request, context); + return requestImp; + }); + Object.values(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_12__.ALL_MEDIATYPES).forEach(mediaType => { + setExtFloor(imp[mediaType], getMinimumFloor(imps.map(imp => imp[mediaType]?.ext))); + }); + (imp[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_12__.BANNER]?.format || []).forEach((format, i) => { + setExtFloor(format, getMinimumFloor(imps.map(imp => imp[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_12__.BANNER].format[i]?.ext))); + }); + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__.REQUEST]: { + fpd(orig, ortbRequest, proxyBidderRequest, context) { + // FPD is handled different for PBS - the base request will only contain global FPD; + // bidder-specific values are set in ext.prebid.bidderconfig + + if (context.transmitTids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortbRequest, 'source.tid', proxyBidderRequest.auctionId); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.mergeDeep)(ortbRequest, context.s2sBidRequest.ortb2Fragments?.global); + + // also merge in s2sConfig.extPrebid + if (context.s2sBidRequest.s2sConfig.extPrebid && typeof context.s2sBidRequest.s2sConfig.extPrebid === 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortbRequest, 'ext.prebid', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.mergeDeep)(ortbRequest.ext?.prebid || {}, context.s2sBidRequest.s2sConfig.extPrebid)); + } + + // for global FPD, check allowed activities against "prebid.pbsBidAdapter"... + context.getRedactor().ortb2(ortbRequest); + const fpdConfigs = Object.entries(context.s2sBidRequest.ortb2Fragments?.bidder || {}).filter(_ref => { + let [bidder] = _ref; + const bidders = context.s2sBidRequest.s2sConfig.bidders; + const allowUnknownBidderCodes = context.s2sBidRequest.s2sConfig.allowUnknownBidderCodes; + return allowUnknownBidderCodes || bidders && bidders.includes(bidder); + }).map(_ref2 => { + let [bidder, ortb2] = _ref2; + return { + // ... but for bidder specific FPD we can use the actual bidder + bidders: [bidder], + config: { + ortb2: context.getRedactor(bidder).ortb2(ortb2) + } + }; + }); + if (fpdConfigs.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortbRequest, 'ext.prebid.bidderconfig', fpdConfigs); + } + }, + extPrebidAliases(orig, ortbRequest, proxyBidderRequest, context) { + // override alias processing to do it for each bidder in the request + context.actualBidderRequests.forEach(req => orig(ortbRequest, req, context)); + }, + sourceExtSchain(orig, ortbRequest, proxyBidderRequest, context) { + // pass schains in ext.prebid.schains + let chains = ortbRequest?.ext?.prebid?.schains || []; + const chainBidders = new Set(chains.flatMap(item => item.bidders)); + chains = Object.values(chains.concat(context.actualBidderRequests.filter(req => !chainBidders.has(req.bidderCode)) // schain defined in s2sConfig.extPrebid takes precedence + .map(req => ({ + bidders: [req.bidderCode], + schain: req?.bids?.[0]?.schain + }))).filter(_ref3 => { + let { + bidders, + schain + } = _ref3; + return bidders?.length > 0 && schain; + }).reduce((chains, _ref4) => { + let { + bidders, + schain + } = _ref4; + const key = JSON.stringify(schain); + if (!chains.hasOwnProperty(key)) { + chains[key] = { + bidders: new Set(), + schain + }; + } + bidders.forEach(bidder => chains[key].bidders.add(bidder)); + return chains; + }, {})).map(_ref5 => { + let { + bidders, + schain + } = _ref5; + return { + bidders: Array.from(bidders), + schain + }; + }); + if (chains.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(ortbRequest, 'ext.prebid.schains', chains); + } + } + }, + [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_10__.RESPONSE]: { + serverSideStats(orig, response, ortbResponse, context) { + // override to process each request + context.actualBidderRequests.forEach(req => orig(response, ortbResponse, { + ...context, + bidderRequest: req, + bidRequests: req.bids + })); + }, + paapiConfigs(orig, response, ortbResponse, context) { + const configs = Object.values(context.impContext).flatMap(impCtx => (impCtx.paapiConfigs || []).map(cfg => { + const bidderReq = impCtx.actualBidderRequests.find(br => br.bidderCode === cfg.bidder); + const bidReq = impCtx.actualBidRequests.get(cfg.bidder); + return { + adUnitCode: impCtx.adUnit.code, + ortb2: bidderReq?.ortb2, + ortb2Imp: bidReq?.ortb2Imp, + bidder: cfg.bidder, + config: cfg.config + }; + })); + if (configs.length > 0) { + response.paapi = configs; + } + } + } + } +}); +function buildPBSRequest(s2sBidRequest, bidderRequests, adUnits, requestedBidders) { + const requestTimestamp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.timestamp)(); + const impIds = new Set(); + const proxyBidRequests = []; + const s2sParams = (0,_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_13__.s2sActivityParams)(s2sBidRequest.s2sConfig); + const getRedactor = (() => { + const global = (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_14__.redactor)(s2sParams); + const bidders = {}; + return bidder => { + if (bidder == null) return global; + if (!bidders.hasOwnProperty(bidder)) { + bidders[bidder] = (0,_src_activities_redactor_js__WEBPACK_IMPORTED_MODULE_14__.redactor)((0,_src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_15__.activityParams)(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_16__.MODULE_TYPE_BIDDER, bidder)); + } + return bidders[bidder]; + }; + })(); + adUnits = adUnits.map(au => getRedactor().bidRequest(au)); + adUnits.forEach(adUnit => { + const actualBidRequests = new Map(); + adUnits.bids = adUnit.bids.map(br => getRedactor(br.bidder).bidRequest(br)); + adUnit.bids.forEach(bid => { + if (bid.mediaTypes != null) { + // TODO: support labels / conditional bids + // for now, just warn about them + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.logWarn)(`Prebid Server adapter does not (yet) support bidder-specific mediaTypes for the same adUnit. Size mapping configuration will be ignored for adUnit: ${adUnit.code}, bidder: ${bid.bidder}`); + } + actualBidRequests.set(bid.bidder, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.getBidRequest)(bid.bid_id, bidderRequests)); + }); + let impId = adUnit.code; + let i = 1; + while (impIds.has(impId)) { + i++; + impId = `${adUnit.code}-${i}`; + } + impIds.add(impId); + proxyBidRequests.push({ + ...adUnit, + adUnitCode: adUnit.code, + pbsData: { + impId, + actualBidRequests, + adUnit + } + }); + }); + const proxyBidderRequest = { + ...Object.fromEntries(Object.entries(bidderRequests[0]).filter(_ref6 => { + let [k] = _ref6; + return !BIDDER_SPECIFIC_REQUEST_PROPS.has(k); + })), + paapi: { + enabled: bidderRequests.some(br => br.paapi?.enabled) + } + }; + return PBS_CONVERTER.toORTB({ + bidderRequest: proxyBidderRequest, + bidRequests: proxyBidRequests, + context: { + currency: _src_config_js__WEBPACK_IMPORTED_MODULE_17__.config.getConfig('currency.adServerCurrency') || DEFAULT_S2S_CURRENCY, + ttl: s2sBidRequest.s2sConfig.defaultTtl || DEFAULT_S2S_TTL, + requestTimestamp, + s2sBidRequest: { + ...s2sBidRequest, + ortb2Fragments: (0,_bidderConfig_js__WEBPACK_IMPORTED_MODULE_18__.premergeFpd)(s2sBidRequest.ortb2Fragments, requestedBidders) + }, + requestedBidders, + actualBidderRequests: bidderRequests, + nativeRequest: s2sBidRequest.s2sConfig.ortbNative, + getRedactor, + transmitTids: (0,_src_activities_rules_js__WEBPACK_IMPORTED_MODULE_19__.isActivityAllowed)(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_20__.ACTIVITY_TRANSMIT_TID, s2sParams) + } + }); +} +function interpretPBSResponse(response, request) { + return PBS_CONVERTER.fromORTB({ + response, + request + }); +} + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","currencyUtils","pbsExtensions","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/prebidServerBidAdapter/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["precisoBidAdapter"],{ + +/***/ "./modules/precisoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/precisoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_precisoUtils_bidUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/precisoUtils/bidUtils.js */ "./libraries/precisoUtils/bidUtils.js"); +/* harmony import */ var _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/precisoUtils/bidUtilsCommon.js */ "./libraries/precisoUtils/bidUtilsCommon.js"); + + + + + + + + +const BIDDER__CODE = 'preciso'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: BIDDER__CODE +}); +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE]; +const GVLID = 874; +let precisoId = 'NA'; +let sharedId = 'NA'; +const endpoint = 'https://ssp-bidder.2trk.info/bid_request/openrtb'; +let syncEndpoint = 'https://ck.2trk.info/rtb/user/usersync.aspx?'; +const spec = { + code: BIDDER__CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + gvlid: GVLID, + isBidRequestValid: bid => { + sharedId = storage.getDataFromLocalStorage('_sharedid') || storage.getCookie('_sharedid'); + let precisoBid = true; + const preCall = 'https://ssp-usersync.mndtrk.com/getUUID?sharedId=' + sharedId; + precisoId = storage.getDataFromLocalStorage('_pre|id'); + if (Object.is(precisoId, 'NA') || Object.is(precisoId, null) || Object.is(precisoId, undefined)) { + if (!bid.precisoBid) { + precisoBid = false; + getapi(preCall); + } + } + return Boolean(bid.bidId && bid.params && bid.params.publisherId && precisoBid); + }, + buildRequests: (0,_libraries_precisoUtils_bidUtils_js__WEBPACK_IMPORTED_MODULE_3__.buildRequests)(endpoint), + interpretResponse: _libraries_precisoUtils_bidUtils_js__WEBPACK_IMPORTED_MODULE_3__.buildBidResponse, + onBidWon: _libraries_precisoUtils_bidUtils_js__WEBPACK_IMPORTED_MODULE_3__.onBidWon, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + syncEndpoint = syncEndpoint + 'id=' + sharedId; + return (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_4__.buildUserSyncs)(syncOptions, serverResponses, gdprConsent, uspConsent, syncEndpoint); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +async function getapi(url) { + try { + const response = await fetch(url); + var data = await response.json(); + const dataMap = new Map(Object.entries(data)); + const uuidValue = dataMap.get('UUID'); + if (!Object.is(uuidValue, null) && !Object.is(uuidValue, undefined)) { + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage('_pre|id', uuidValue); + } + } + return data; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)('Error in preciso precall' + error); + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('precisoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["precisoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/precisoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["previousAuctionInfo"],{ + +/***/ "./modules/previousAuctionInfo/index.js": +/*!**********************************************!*\ + !*** ./modules/previousAuctionInfo/index.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports CONFIG_NS, previousAuctionInfoEnabled, auctionState, resetPreviousAuctionInfo, initHandlers, onAuctionEndHandler, onBidWonHandler, startAuctionHook */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/prebid.js */ "./src/prebid.js"); + + + + + + +const CONFIG_NS = 'previousAuctionInfo'; +let previousAuctionInfoEnabled = false; +let enabledBidders = []; +let maxQueueLength = 10; +let handlersAttached = false; +let auctionState = {}; +function resetPreviousAuctionInfo() { + previousAuctionInfoEnabled = false; + enabledBidders = []; + auctionState = {}; + deinitHandlers(); +} +function initPreviousAuctionInfo() { + _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('previousAuctionInfo', _ref => { + let { + [CONFIG_NS]: config = {} + } = _ref; + if (!config?.enabled) { + resetPreviousAuctionInfo(); + return; + } + if (config?.bidders) { + enabledBidders = config.bidders; + } + if (config?.maxQueueLength) { + maxQueueLength = config.maxQueueLength; + } + previousAuctionInfoEnabled = true; + initHandlers(); + }); +} +const initHandlers = () => { + if (!handlersAttached) { + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_2__.on)(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END, onAuctionEndHandler); + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_2__.on)(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_WON, onBidWonHandler); + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.before(startAuctionHook); + handlersAttached = true; + } +}; +const deinitHandlers = () => { + if (handlersAttached) { + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_2__.off)(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END, onAuctionEndHandler); + (0,_src_events_js__WEBPACK_IMPORTED_MODULE_2__.off)(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_WON, onBidWonHandler); + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.getHooks({ + hook: startAuctionHook + }).remove(); + handlersAttached = false; + } +}; +const onAuctionEndHandler = auctionDetails => { + try { + const receivedBidsMap = {}; + const rejectedBidsMap = {}; + const highestBidsByAdUnitCode = {}; + if (auctionDetails.bidsReceived?.length) { + auctionDetails.bidsReceived.forEach(bid => { + receivedBidsMap[bid.requestId] = bid; + if (!highestBidsByAdUnitCode[bid.adUnitCode] || bid.cpm > highestBidsByAdUnitCode[bid.adUnitCode].cpm) { + highestBidsByAdUnitCode[bid.adUnitCode] = bid; + } + }); + } + if (auctionDetails.bidsRejected?.length) { + auctionDetails.bidsRejected.forEach(bidRejected => { + rejectedBidsMap[bidRejected.requestId] = bidRejected; + }); + } + if (auctionDetails.bidderRequests?.length) { + auctionDetails.bidderRequests.forEach(bidderRequest => { + const enabledBidder = enabledBidders.length === 0 || enabledBidders.find(bidderCode => bidderCode === bidderRequest.bidderCode); + if (enabledBidder) { + auctionState[bidderRequest.bidderCode] = auctionState[bidderRequest.bidderCode] || []; + bidderRequest.bids.forEach(bid => { + const previousAuctionInfoPayload = { + bidderRequestId: bidderRequest.bidderRequestId, + bidId: bid.bidId, + rendered: 0, + source: 'pbjs', + adUnitCode: bid.adUnitCode, + highestBidCpm: highestBidsByAdUnitCode[bid.adUnitCode]?.cpm || null, + highestBidCurrency: highestBidsByAdUnitCode[bid.adUnitCode]?.currency || null, + bidderCpm: receivedBidsMap[bid.bidId]?.cpm || null, + bidderOriginalCpm: receivedBidsMap[bid.bidId]?.originalCpm || null, + bidderCurrency: receivedBidsMap[bid.bidId]?.currency || null, + bidderOriginalCurrency: receivedBidsMap[bid.bidId]?.originalCurrency || null, + rejectionReason: rejectedBidsMap[bid.bidId]?.rejectionReason || null, + timestamp: auctionDetails.timestamp, + transactionId: bid.transactionId // this field gets removed before injecting previous auction info into the bid stream + }; + if (auctionState[bidderRequest.bidderCode].length >= maxQueueLength) { + auctionState[bidderRequest.bidderCode].shift(); + } + auctionState[bidderRequest.bidderCode].push(previousAuctionInfoPayload); + }); + } + }); + } + } catch (error) {} +}; +const onBidWonHandler = winningBid => { + const winningTid = winningBid.transactionId; + Object.values(auctionState).flat().forEach(prevAuctPayload => { + if (prevAuctPayload.transactionId === winningTid) { + prevAuctPayload.rendered = 1; + } + }); +}; +function startAuctionHook(next, req) { + const bidders = enabledBidders.length ? enabledBidders : Object.keys(auctionState); + bidders.filter(bidder => auctionState[bidder]?.length).forEach(bidder => { + auctionState[bidder].forEach(payload => { + delete payload.transactionId; + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(req.ortb2Fragments, `bidder.${bidder}.ext.prebid.previousauctioninfo`, auctionState[bidder]); + delete auctionState[bidder]; + }); + next.call(this, req); +} +initPreviousAuctionInfo(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('previousAuctionInfo'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/previousAuctionInfo/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["priceFloors"],{ + +/***/ "./modules/priceFloors.js": +/*!********************************!*\ + !*** ./modules/priceFloors.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ continueAuction: () => (/* binding */ continueAuction), +/* harmony export */ createFloorsDataForAuction: () => (/* binding */ createFloorsDataForAuction) +/* harmony export */ }); +/* unused harmony exports FLOOR_SKIPPED_REASON, allowedFields, _floorDataForAuction, fieldMatchingFunctions, getFirstMatchingFloor, getBiddersCpmAdjustment, calculateAdjustedFloor, getFloor, getFloorsDataForAuction, getFloorDataFromAdUnits, updateAdUnitsForAuction, pickRandomModel, normalizeDefault, isFloorsDataValid, parseFloorData, requestBidsHook, handleFetchResponse, generateAndHandleFetch, handleSetFloorsConfig, addBidResponseHook, setOrtbImpBidFloor, setGranularBidfloors, setImpExtPrebidFloors, setOrtbExtPrebidFloors */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_utils_cpm_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/utils/cpm.js */ "./src/utils/cpm.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../libraries/currencyUtils/currency.js */ "./libraries/currencyUtils/currency.js"); +/* harmony import */ var _libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/timeoutQueue/timeoutQueue.js */ "./libraries/timeoutQueue/timeoutQueue.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + + + + + + + + + + + + + + +const FLOOR_SKIPPED_REASON = { + NOT_FOUND: 'not_found', + RANDOM: 'random' +}; + +/** + * @summary This Module is intended to provide users with the ability to dynamically set and enforce price floors on a per auction basis. + */ +const MODULE_NAME = 'Price Floors'; + +/** + * @summary Instantiate Ajax so we control the timeout + */ +const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder)(10000); + +// eslint-disable-next-line symbol-description +const SYN_FIELD = Symbol(); + +/** + * @summary Allowed fields for rules to have + */ +let allowedFields = [SYN_FIELD, 'gptSlot', 'adUnitCode', 'size', 'domain', 'mediaType']; + +/** + * @summary This is a flag to indicate if a AJAX call is processing for a floors request + */ +let fetching = false; + +/** + * @summary so we only register for our hooks once + */ +let addedFloorsHook = false; + +/** + * @summary The config to be used. Can be updated via: setConfig or a real time fetch + */ +let _floorsConfig = {}; + +/** + * @summary If a auction is to be delayed by an ongoing fetch we hold it here until it can be resumed + */ +const _delayedAuctions = (0,_libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__.timeoutQueue)(); + +/** + * @summary Each auction can have differing floors data depending on execution time or per adunit setup + * So we will be saving each auction offset by it's auctionId in order to make sure data is not changed + * Once the auction commences + */ +let _floorDataForAuction = {}; + +/** + * @summary Simple function to round up to a certain decimal degree + */ +function roundUp(number, precision) { + return Math.ceil((parseFloat(number) * Math.pow(10, precision)).toFixed(1)) / Math.pow(10, precision); +} +const getHostname = (() => { + let domain; + return function () { + if (domain == null) { + domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().topmostLocation, { + noDecodeWholeURL: true + }).hostname; + } + return domain; + }; +})(); + +// First look into bidRequest! +function getGptSlotFromAdUnit(adUnitId) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const adUnit = index.getAdUnit({ + adUnitId + }); + const isGam = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(adUnit, 'ortb2Imp.ext.data.adserver.name') === 'gam'; + return isGam && adUnit.ortb2Imp.ext.data.adserver.adslot; +} +function getAdUnitCode(request, response) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return request?.adUnitCode || index.getAdUnit(response).code; +} + +/** + * @summary floor field types with their matching functions to resolve the actual matched value + */ +let fieldMatchingFunctions = { + [SYN_FIELD]: () => '*', + 'size': (bidRequest, bidResponse) => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArray)(bidResponse.size) || '*', + 'mediaType': (bidRequest, bidResponse) => bidResponse.mediaType || 'banner', + 'gptSlot': (bidRequest, bidResponse) => getGptSlotFromAdUnit((bidRequest || bidResponse).adUnitId) || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.getGptSlotInfoForAdUnitCode)(getAdUnitCode(bidRequest, bidResponse)).gptSlot, + 'domain': getHostname, + 'adUnitCode': (bidRequest, bidResponse) => getAdUnitCode(bidRequest, bidResponse) +}; + +/** + * @summary Based on the fields array in floors data, it enumerates all possible matches based on exact match coupled with + * a "*" catch-all match + * Returns array of Tuple [exact match, catch all] for each field in rules file + */ +function enumeratePossibleFieldValues(floorFields, bidObject, responseObject) { + if (!floorFields.length) return []; + // generate combination of all exact matches and catch all for each field type + return floorFields.reduce((accum, field) => { + let exactMatch = fieldMatchingFunctions[field](bidObject, responseObject) || '*'; + // storing exact matches as lowerCase since we want to compare case insensitively + accum.push(exactMatch === '*' ? ['*'] : [exactMatch.toLowerCase(), '*']); + return accum; + }, []); +} + +/** + * @summary get's the first matching floor based on context provided. + * Generates all possible rule matches and picks the first matching one. + */ +function getFirstMatchingFloor(floorData, bidObject) { + let responseObject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let fieldValues = enumeratePossibleFieldValues((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'schema.fields') || [], bidObject, responseObject); + if (!fieldValues.length) { + return { + matchingFloor: undefined + }; + } + + // look to see if a request for this context was made already + let matchingInput = fieldValues.map(field => field[0]).join('-'); + // if we already have gotten the matching rule from this matching input then use it! No need to look again + let previousMatch = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, `matchingInputs.${matchingInput}`); + if (previousMatch) { + return { + ...previousMatch + }; + } + let allPossibleMatches = generatePossibleEnumerations(fieldValues, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'schema.delimiter') || '|'); + let matchingRule = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.find)(allPossibleMatches, hashValue => floorData.values.hasOwnProperty(hashValue)); + let matchingData = { + floorMin: floorData.floorMin || 0, + floorRuleValue: floorData.values[matchingRule], + matchingData: allPossibleMatches[0], + // the first possible match is an "exact" so contains all data relevant for anlaytics adapters + matchingRule: matchingRule === floorData.meta?.defaultRule ? undefined : matchingRule + }; + // use adUnit floorMin as priority! + const floorMin = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidObject, 'ortb2Imp.ext.prebid.floors.floorMin'); + if (typeof floorMin === 'number') { + matchingData.floorMin = floorMin; + } + matchingData.matchingFloor = Math.max(matchingData.floorMin, matchingData.floorRuleValue); + // save for later lookup if needed + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(floorData, `matchingInputs.${matchingInput}`, { + ...matchingData + }); + return matchingData; +} + +/** + * @summary Generates all possible rule hash's based on input array of array's + * The generated list is of all possible key matches based on fields input + * The list is sorted by least amount of * in rule to most with left most fields taking precedence + */ +function generatePossibleEnumerations(arrayOfFields, delimiter) { + return arrayOfFields.reduce((accum, currentVal) => { + let ret = []; + accum.map(obj => { + currentVal.map(obj1 => { + ret.push(obj + delimiter + obj1); + }); + }); + return ret; + }).sort((left, right) => left.split('*').length - right.split('*').length); +} + +/** + * @summary If a the input bidder has a registered cpmadjustment it returns the input CPM after being adjusted + */ +function getBiddersCpmAdjustment(inputCpm, bid, bidRequest) { + return parseFloat((0,_src_utils_cpm_js__WEBPACK_IMPORTED_MODULE_9__.adjustCpm)(inputCpm, { + ...bid, + cpm: inputCpm + }, bidRequest)); +} + +/** + * @summary This function takes the original floor and the adjusted floor in order to determine the bidders actual floor + * With js rounding errors with decimal division we utilize similar method as shown in cpmBucketManager.js + */ +function calculateAdjustedFloor(oldFloor, newFloor) { + const pow = Math.pow(10, 10); + return oldFloor * pow / (newFloor * pow) * (oldFloor * pow) / pow; +} + +/** + * @summary gets the prebid set sizes depending on the input mediaType + */ +const getMediaTypesSizes = { + banner: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.banner.sizes') || [], + video: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.playerSize') || [], + native: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.image.sizes') ? [(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.image.sizes')] : [] +}; + +/** + * @summary for getFloor only, before selecting a rule, if a bidAdapter asks for * in their getFloor params + * Then we may be able to get a better rule than the * ones depending on context of the adUnit + */ +function updateRequestParamsFromContext(bidRequest, requestParams) { + // if adapter asks for *'s then we can do some logic to infer if we can get a more specific rule based on context of bid + let mediaTypesOnBid = Object.keys(bidRequest.mediaTypes || {}); + // if there is only one mediaType then we can just use it + if (requestParams.mediaType === '*' && mediaTypesOnBid.length === 1) { + requestParams.mediaType = mediaTypesOnBid[0]; + } + // if they asked for * size, but for the given mediaType there is only one size, we can just use it + if (requestParams.size === '*' && mediaTypesOnBid.indexOf(requestParams.mediaType) !== -1 && getMediaTypesSizes[requestParams.mediaType] && getMediaTypesSizes[requestParams.mediaType](bidRequest).length === 1) { + requestParams.size = getMediaTypesSizes[requestParams.mediaType](bidRequest)[0]; + } + return requestParams; +} + +/** + * @summary This is the function which will return a single floor based on the input requests + * and matching it to a rule for the current auction + */ +function getFloor() { + let requestParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + currency: 'USD', + mediaType: '*', + size: '*' + }; + let bidRequest = this; + let floorData = _floorDataForAuction[bidRequest.auctionId]; + if (!floorData || floorData.skipped) return {}; + requestParams = updateRequestParamsFromContext(bidRequest, requestParams); + let floorInfo = getFirstMatchingFloor(floorData.data, { + ...bidRequest + }, { + mediaType: requestParams.mediaType, + size: requestParams.size + }); + let currency = requestParams.currency || floorData.data.currency; + + // if bidder asked for a currency which is not what floors are set in convert + if (floorInfo.matchingFloor && currency !== floorData.data.currency) { + try { + floorInfo.matchingFloor = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency(floorInfo.matchingFloor, floorData.data.currency, currency); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Unable to get currency conversion for getFloor for bidder ${bidRequest.bidder}. You must have currency module enabled with defaultRates in your currency config`); + // since we were unable to convert to the bidders requested currency, we send back just the actual floors currency to them + currency = floorData.data.currency; + } + } + + // if cpmAdjustment flag is true and we have a valid floor then run the adjustment on it + if (floorData.enforcement.bidAdjustment && floorInfo.matchingFloor) { + // pub provided inverse function takes precedence, otherwise do old adjustment stuff + const inverseFunction = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_11__.bidderSettings.get(bidRequest.bidder, 'inverseBidAdjustment'); + if (inverseFunction) { + const definedParams = Object.fromEntries(Object.entries(requestParams).filter(_ref => { + let [key, val] = _ref; + return val !== '*' && ['mediaType', 'size'].includes(key); + })); + floorInfo.matchingFloor = inverseFunction(floorInfo.matchingFloor, bidRequest, definedParams); + } else { + let cpmAdjustment = getBiddersCpmAdjustment(floorInfo.matchingFloor, null, bidRequest); + floorInfo.matchingFloor = cpmAdjustment ? calculateAdjustedFloor(floorInfo.matchingFloor, cpmAdjustment) : floorInfo.matchingFloor; + } + } + if (floorInfo.floorRuleValue === null) { + return null; + } + if (floorInfo.matchingFloor) { + return { + floor: roundUp(floorInfo.matchingFloor, 4), + currency + }; + } + return {}; +} + +/** + * @summary Takes a floorsData object and converts it into a hash map with appropriate keys + */ +function getFloorsDataForAuction(floorData, adUnitCode) { + let auctionFloorData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(floorData); + auctionFloorData.schema.delimiter = floorData.schema.delimiter || '|'; + auctionFloorData.values = normalizeRulesForAuction(auctionFloorData, adUnitCode); + // default the currency to USD if not passed in + auctionFloorData.currency = auctionFloorData.currency || 'USD'; + return auctionFloorData; +} + +/** + * @summary if adUnitCode needs to be added to the offset then it will add it else just return the values + */ +function normalizeRulesForAuction(floorData, adUnitCode) { + let fields = floorData.schema.fields; + let delimiter = floorData.schema.delimiter; + + // if we are building the floor data form an ad unit, we need to append adUnit code as to not cause collisions + let prependAdUnitCode = adUnitCode && fields.indexOf('adUnitCode') === -1 && fields.unshift('adUnitCode'); + return Object.keys(floorData.values).reduce((rulesHash, oldKey) => { + let newKey = prependAdUnitCode ? `${adUnitCode}${delimiter}${oldKey}` : oldKey; + // we store the rule keys as lower case for case insensitive compare + rulesHash[newKey.toLowerCase()] = floorData.values[oldKey]; + return rulesHash; + }, {}); +} + +/** + * @summary This function will take the adUnits and generate a floor data object to be used during the auction + * Only called if no set config or fetch level data has returned + */ +function getFloorDataFromAdUnits(adUnits) { + const schemaAu = adUnits.find(au => au.floors?.schema != null); + return adUnits.reduce((accum, adUnit) => { + if (adUnit.floors?.schema != null && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(adUnit.floors.schema, schemaAu?.floors?.schema)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: adUnit '${adUnit.code}' declares a different schema from one previously declared by adUnit '${schemaAu.code}'. Floor config for '${adUnit.code}' will be ignored.`); + return accum; + } + const floors = Object.assign({}, schemaAu?.floors, { + values: undefined + }, adUnit.floors); + if (isFloorsDataValid(floors)) { + // if values already exist we want to not overwrite them + if (!accum.values) { + accum = getFloorsDataForAuction(floors, adUnit.code); + accum.location = 'adUnit'; + } else { + let newRules = getFloorsDataForAuction(floors, adUnit.code).values; + // copy over the new rules into our values object + Object.assign(accum.values, newRules); + } + } else if (adUnit.floors != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`adUnit '${adUnit.code}' provides an invalid \`floor\` definition, it will be ignored for floor calculations`, adUnit); + } + return accum; + }, {}); +} +function getNoFloorSignalBidersArray(floorData) { + const { + data, + enforcement + } = floorData; + // The data.noFloorSignalBidders higher priority then the enforcment + if (data?.noFloorSignalBidders?.length > 0) { + return data.noFloorSignalBidders; + } else if (enforcement?.noFloorSignalBidders?.length > 0) { + return enforcement.noFloorSignalBidders; + } + return []; +} + +/** + * @summary This function takes the adUnits for the auction and update them accordingly as well as returns the rules hashmap for the auction + */ +function updateAdUnitsForAuction(adUnits, floorData, auctionId) { + const noFloorSignalBiddersArray = getNoFloorSignalBidersArray(floorData); + adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + // check if the bidder is in the no signal list + const isNoFloorSignaled = noFloorSignalBiddersArray.some(bidderName => bidderName === bid.bidder); + if (floorData.skipped || isNoFloorSignaled) { + isNoFloorSignaled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`noFloorSignal to ${bid.bidder}`); + delete bid.getFloor; + } else { + bid.getFloor = getFloor; + } + // information for bid and analytics adapters + bid.auctionId = auctionId; + bid.floorData = { + noFloorSignaled: isNoFloorSignaled, + skipped: floorData.skipped, + skipRate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.skipRate') ?? floorData.skipRate, + skippedReason: floorData.skippedReason, + floorMin: floorData.floorMin, + modelVersion: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelVersion'), + modelWeight: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelWeight'), + modelTimestamp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelTimestamp'), + location: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.location', 'noData'), + floorProvider: floorData.floorProvider, + fetchStatus: _floorsConfig.fetchStatus + }; + }); + }); +} +function pickRandomModel(modelGroups, weightSum) { + // we loop through the models subtracting the current model weight from our random number + // once we are at or below zero, we return the associated model + let random = Math.floor(Math.random() * weightSum + 1); + for (let i = 0; i < modelGroups.length; i++) { + random -= modelGroups[i].modelWeight; + if (random <= 0) { + return modelGroups[i]; + } + } +} +; + +/** + * @summary Updates the adUnits accordingly and returns the necessary floorsData for the current auction + */ +function createFloorsDataForAuction(adUnits, auctionId) { + let resolvedFloorsData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(_floorsConfig); + // if using schema 2 pick a model here: + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.floorsSchemaVersion') === 2) { + // merge the models specific stuff into the top level data settings (now it looks like floorsSchemaVersion 1!) + let { + modelGroups, + ...rest + } = resolvedFloorsData.data; + resolvedFloorsData.data = Object.assign(rest, pickRandomModel(modelGroups, rest.modelWeightSum)); + } + + // if we do not have a floors data set, we will try to use data set on adUnits + let useAdUnitData = Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.values') || {}).length === 0; + if (useAdUnitData) { + resolvedFloorsData.data = getFloorDataFromAdUnits(adUnits); + } else { + resolvedFloorsData.data = getFloorsDataForAuction(resolvedFloorsData.data); + } + // if we still do not have a valid floor data then floors is not on for this auction, so skip + if (Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.values') || {}).length === 0) { + resolvedFloorsData.skipped = true; + resolvedFloorsData.skippedReason = FLOOR_SKIPPED_REASON.NOT_FOUND; + } else { + // determine the skip rate now + const auctionSkipRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getParameterByName)('pbjs_skipRate') || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.skipRate') ?? resolvedFloorsData.skipRate); + const isSkipped = Math.random() * 100 < parseFloat(auctionSkipRate); + resolvedFloorsData.skipped = isSkipped; + if (isSkipped) resolvedFloorsData.skippedReason = FLOOR_SKIPPED_REASON.RANDOM; + } + // copy FloorMin to floorData.data + if (resolvedFloorsData.hasOwnProperty('floorMin')) resolvedFloorsData.data.floorMin = resolvedFloorsData.floorMin; + // add floorData to bids + updateAdUnitsForAuction(adUnits, resolvedFloorsData, auctionId); + return resolvedFloorsData; +} + +/** + * @summary This is the function which will be called to exit our module and continue the auction. + */ +function continueAuction(hookConfig) { + if (!hookConfig.hasExited) { + // We need to know the auctionId at this time. So we will use the passed in one or generate and set it ourselves + hookConfig.reqBidsConfigObj.auctionId = hookConfig.reqBidsConfigObj.auctionId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + // now we do what we need to with adUnits and save the data object to be used for getFloor and enforcement calls + _floorDataForAuction[hookConfig.reqBidsConfigObj.auctionId] = createFloorsDataForAuction(hookConfig.reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().adUnits, hookConfig.reqBidsConfigObj.auctionId); + hookConfig.nextFn.apply(hookConfig.context, [hookConfig.reqBidsConfigObj]); + hookConfig.hasExited = true; + } +} +function validateSchemaFields(fields) { + if (Array.isArray(fields) && fields.length > 0) { + if (fields.every(field => allowedFields.includes(field))) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Fields received do not match allowed fields`); + } + } + return false; +} +function isValidRule(key, floor, numFields, delimiter) { + if (typeof key !== 'string' || key.split(delimiter).length !== numFields) { + return false; + } + return typeof floor === 'number' || floor === null; +} +function validateRules(floorsData, numFields, delimiter) { + if (typeof floorsData.values !== 'object') { + return false; + } + // if an invalid rule exists we remove it + floorsData.values = Object.keys(floorsData.values).reduce((filteredRules, key) => { + if (isValidRule(key, floorsData.values[key], numFields, delimiter)) { + filteredRules[key] = floorsData.values[key]; + } + return filteredRules; + }, {}); + // rules is only valid if at least one rule remains + return Object.keys(floorsData.values).length > 0; +} +function normalizeDefault(model) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(model.default)) { + let defaultRule = '*'; + const numFields = (model.schema?.fields || []).length; + if (!numFields) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(model, 'schema.fields', [SYN_FIELD]); + } else { + defaultRule = Array(numFields).fill('*').join(model.schema?.delimiter || '|'); + } + model.values = model.values || {}; + if (model.values[defaultRule] == null) { + model.values[defaultRule] = model.default; + model.meta = { + defaultRule + }; + } + } + return model; +} +function modelIsValid(model) { + model = normalizeDefault(model); + // schema.fields has only allowed attributes + if (!validateSchemaFields((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(model, 'schema.fields'))) { + return false; + } + return validateRules(model, model.schema.fields.length, model.schema.delimiter || '|'); +} + +/** + * @summary Mapping of floor schema version to it's corresponding validation + */ +const floorsSchemaValidation = { + 1: data => modelIsValid(data), + 2: data => { + // model groups should be an array with at least one element + if (!Array.isArray(data.modelGroups) || data.modelGroups.length === 0) { + return false; + } + // every model should have valid schema, as well as an accompanying modelWeight + data.modelWeightSum = 0; + return data.modelGroups.every(model => { + if (typeof model.modelWeight === 'number' && modelIsValid(model)) { + data.modelWeightSum += model.modelWeight; + return true; + } + return false; + }); + } +}; + +/** + * @summary Fields array should have at least one entry and all should match allowed fields + * Each rule in the values array should have a 'key' and 'floor' param + * And each 'key' should have the correct number of 'fields' after splitting + * on the delim. If rule does not match remove it. return if still at least 1 rule + */ +function isFloorsDataValid(floorsData) { + if (typeof floorsData !== 'object') { + return false; + } + floorsData.floorsSchemaVersion = floorsData.floorsSchemaVersion || 1; + if (typeof floorsSchemaValidation[floorsData.floorsSchemaVersion] !== 'function') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Unknown floorsSchemaVersion: `, floorsData.floorsSchemaVersion); + return false; + } + return floorsSchemaValidation[floorsData.floorsSchemaVersion](floorsData); +} + +/** + * @summary This function updates the global Floors Data field based on the new one passed in if it is valid + */ +function parseFloorData(floorsData, location) { + if (floorsData && typeof floorsData === 'object' && isFloorsDataValid(floorsData)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE_NAME}: A ${location} set the auction floor data set to `, floorsData); + return { + ...floorsData, + location + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: The floors data did not contain correct values`, floorsData); +} + +/** + * + * @param {Object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + * @param {function} fn required; The next function in the chain, used by hook.js + */ +const requestBidsHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__.timedAuctionHook)('priceFloors', function requestBidsHook(fn, reqBidsConfigObj) { + // preserves all module related variables for the current auction instance (used primiarily for concurrent auctions) + const hookConfig = { + reqBidsConfigObj, + context: this, + nextFn: fn, + hasExited: false, + timer: null + }; + + // If auction delay > 0 AND we are fetching -> Then wait until it finishes + if (_floorsConfig.auctionDelay > 0 && fetching) { + _delayedAuctions.submit(_floorsConfig.auctionDelay, () => continueAuction(hookConfig), () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Fetch attempt did not return in time for auction`); + _floorsConfig.fetchStatus = 'timeout'; + continueAuction(hookConfig); + }); + } else { + continueAuction(hookConfig); + } +}); + +/** + * This function handles the ajax response which comes from the user set URL to fetch floors data from + * @param {object} fetchResponse The floors data response which came back from the url configured in config.floors + */ +function handleFetchResponse(fetchResponse) { + fetching = false; + _floorsConfig.fetchStatus = 'success'; + let floorResponse; + try { + floorResponse = JSON.parse(fetchResponse); + } catch (ex) { + floorResponse = fetchResponse; + } + // Update the global floors object according to the fetched data + const fetchData = parseFloorData(floorResponse, 'fetch'); + if (fetchData) { + // set .data to it + _floorsConfig.data = fetchData; + // set skipRate override if necessary + _floorsConfig.skipRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(fetchData.skipRate) ? fetchData.skipRate : _floorsConfig.skipRate; + _floorsConfig.floorProvider = fetchData.floorProvider || _floorsConfig.floorProvider; + } + + // if any auctions are waiting for fetch to finish, we need to continue them! + _delayedAuctions.resume(); +} +function handleFetchError(status) { + fetching = false; + _floorsConfig.fetchStatus = 'error'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Fetch errored with: `, status); + + // if any auctions are waiting for fetch to finish, we need to continue them! + _delayedAuctions.resume(); +} + +/** + * This function handles sending and receiving the AJAX call for a floors fetch + * @param {object} floorEndpoint the floors config coming from setConfig + */ +function generateAndHandleFetch(floorEndpoint) { + // if a fetch url is defined and one is not already occuring, fire it! + if (floorEndpoint.url && !fetching) { + // default to GET and we only support GET for now + let requestMethod = floorEndpoint.method || 'GET'; + if (requestMethod !== 'GET') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: 'GET' is the only request method supported at this time!`); + } else { + ajax(floorEndpoint.url, { + success: handleFetchResponse, + error: handleFetchError + }, null, { + method: 'GET' + }); + fetching = true; + } + } else if (fetching) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: A fetch is already occuring. Skipping.`); + } +} + +/** + * @summary Updates our allowedFields and fieldMatchingFunctions with the publisher defined new ones + */ +function addFieldOverrides(overrides) { + Object.keys(overrides).forEach(override => { + // we only add it if it is not already in the allowed fields and if the passed in value is a function + if (allowedFields.indexOf(override) === -1 && typeof overrides[override] === 'function') { + allowedFields.push(override); + fieldMatchingFunctions[override] = overrides[override]; + } + }); +} + +/** + * @summary This is the function which controls what happens during a pbjs.setConfig({...floors: {}}) is called + */ +function handleSetFloorsConfig(config) { + _floorsConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(config, ['floorMin', 'enabled', enabled => enabled !== false, + // defaults to true + 'auctionDelay', auctionDelay => auctionDelay || 0, 'floorProvider', floorProvider => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(config, 'data.floorProvider', floorProvider), 'endpoint', endpoint => endpoint || {}, 'skipRate', () => !isNaN((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(config, 'data.skipRate')) ? config.data.skipRate : config.skipRate || 0, 'enforcement', enforcement => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(enforcement || {}, ['enforceJS', enforceJS => enforceJS !== false, + // defaults to true + 'enforcePBS', enforcePBS => enforcePBS === true, + // defaults to false + 'floorDeals', floorDeals => floorDeals === true, + // defaults to false + 'bidAdjustment', bidAdjustment => bidAdjustment !== false, + // defaults to true, + 'noFloorSignalBidders', noFloorSignalBidders => noFloorSignalBidders || []]), 'additionalSchemaFields', additionalSchemaFields => typeof additionalSchemaFields === 'object' && Object.keys(additionalSchemaFields).length > 0 ? addFieldOverrides(additionalSchemaFields) : undefined, 'data', data => data && parseFloorData(data, 'setConfig') || undefined]); + + // if enabled then do some stuff + if (_floorsConfig.enabled) { + // handle the floors fetch + generateAndHandleFetch(_floorsConfig.endpoint); + if (!addedFloorsHook) { + // register hooks / listening events + // when auction finishes remove it's associated floor data after 3 seconds so we stil have it for latent responses + _src_events_js__WEBPACK_IMPORTED_MODULE_13__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.EVENTS.AUCTION_END, args => { + setTimeout(() => delete _floorDataForAuction[args.auctionId], 3000); + }); + + // we want our hooks to run after the currency hooks + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().requestBids.before(requestBidsHook, 50); + // if user has debug on then we want to allow the debugging module to run before this, assuming they are testing priceFloors + // debugging is currently set at 5 priority + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_15__.getHook)('addBidResponse').before(addBidResponseHook, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.debugTurnedOn)() ? 4 : 50); + addedFloorsHook = true; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE_NAME}: Turning off module`); + _floorsConfig = {}; + _floorDataForAuction = {}; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_15__.getHook)('addBidResponse').getHooks({ + hook: addBidResponseHook + }).remove(); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().requestBids.getHooks({ + hook: requestBidsHook + }).remove(); + addedFloorsHook = false; + } +} + +/** + * @summary Analytics adapters especially need context of what the floors module is doing in order + * to best create informed models. This function attaches necessary information to the bidResponse object for processing + */ +function addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm) { + bid.floorData = { + floorValue: floorInfo.matchingFloor, + floorRule: floorInfo.matchingRule, + floorRuleValue: floorInfo.floorRuleValue, + floorCurrency: floorData.data.currency, + cpmAfterAdjustments: adjustedCpm, + enforcements: { + ...floorData.enforcement + }, + matchedFields: {} + }; + floorData.data.schema.fields.forEach((field, index) => { + let matchedValue = floorInfo.matchingData.split(floorData.data.schema.delimiter)[index]; + bid.floorData.matchedFields[field] = matchedValue; + }); +} + +/** + * @summary takes the enforcement flags and the bid itself and determines if it should be floored + */ +function shouldFloorBid(floorData, floorInfo, bid) { + let enforceJS = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'enforcement.enforceJS') !== false; + let shouldFloorDeal = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'enforcement.floorDeals') === true || !bid.dealId; + let bidBelowFloor = bid.floorData.cpmAfterAdjustments < floorInfo.matchingFloor; + return enforceJS && bidBelowFloor && shouldFloorDeal; +} + +/** + * @summary The main driving force of floors. On bidResponse we hook in and intercept bidResponses. + * And if the rule we find determines a bid should be floored we will do so. + */ +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__.timedBidResponseHook)('priceFloors', function addBidResponseHook(fn, adUnitCode, bid, reject) { + let floorData = _floorDataForAuction[bid.auctionId]; + // if no floor data then bail + if (!floorData || !bid || floorData.skipped) { + return fn.call(this, adUnitCode, bid, reject); + } + const matchingBidRequest = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index.getBidRequest(bid); + + // get the matching rule + let floorInfo = getFirstMatchingFloor(floorData.data, matchingBidRequest, { + ...bid, + size: [bid.width, bid.height] + }); + if (!floorInfo.matchingFloor) { + if (floorInfo.matchingFloor !== 0) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: unable to determine a matching price floor for bidResponse`, bid); + return fn.call(this, adUnitCode, bid, reject); + } + + // determine the base cpm to use based on if the currency matches the floor currency + let adjustedCpm; + let floorCurrency = floorData.data.currency.toUpperCase(); + let bidResponseCurrency = bid.currency || 'USD'; // if an adapter does not set a bid currency and currency module not on it may come in as undefined + if (floorCurrency === bidResponseCurrency.toUpperCase()) { + adjustedCpm = bid.cpm; + } else if (bid.originalCurrency && floorCurrency === bid.originalCurrency.toUpperCase()) { + adjustedCpm = bid.originalCpm; + } else { + try { + adjustedCpm = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency(bid.cpm, bidResponseCurrency.toUpperCase(), floorCurrency); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Unable do get currency conversion for bidResponse to Floor Currency. Do you have Currency module enabled? ${bid}`); + return fn.call(this, adUnitCode, bid, reject); + } + } + + // ok we got the bid response cpm in our desired currency. Now we need to run the bidders CPMAdjustment function if it exists + adjustedCpm = getBiddersCpmAdjustment(adjustedCpm, bid, matchingBidRequest); + + // add necessary data information for analytics adapters / floor providers would possibly need + addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm); + + // now do the compare! + if (shouldFloorBid(floorData, floorInfo, bid)) { + // bid fails floor -> throw it out + reject(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.REJECTION_REASON.FLOOR_NOT_MET); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: ${bid.bidderCode}'s Bid Response for ${adUnitCode} was rejected due to floor not met (adjusted cpm: ${bid?.floorData?.cpmAfterAdjustments}, floor: ${floorInfo?.matchingFloor})`, bid); + return; + } + return fn.call(this, adUnitCode, bid, reject); +}); +_src_config_js__WEBPACK_IMPORTED_MODULE_16__.config.getConfig('floors', config => handleSetFloorsConfig(config.floors)); +function tryGetFloor(bidRequest, _ref2, fn) { + let { + currency = _src_config_js__WEBPACK_IMPORTED_MODULE_16__.config.getConfig('currency.adServerCurrency') || 'USD', + mediaType = '*', + size = '*' + } = _ref2; + if (typeof bidRequest.getFloor === 'function') { + let floor; + try { + floor = bidRequest.getFloor({ + currency, + mediaType, + size + }) || {}; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Cannot compute floor for bid', bidRequest); + return; + } + floor.floor = parseFloat(floor.floor); + if (floor.currency != null && floor.floor && !isNaN(floor.floor)) { + fn(floor.floor, floor.currency); + } + } +} + +/** + * Sets bidfloor and bidfloorcur for ORTB imp objects + */ +function setOrtbImpBidFloor(imp, bidRequest, context) { + tryGetFloor(bidRequest, { + currency: context.currency, + mediaType: context.mediaType || '*', + size: '*' + }, (bidfloor, bidfloorcur) => { + Object.assign(imp, { + bidfloor, + bidfloorcur + }); + }); +} + +/** + * Set per-mediatype and per-format bidfloor + */ +function setGranularBidfloors(imp, bidRequest, context) { + function setIfDifferent(bidfloor, bidfloorcur) { + if (bidfloor !== imp.bidfloor || bidfloorcur !== imp.bidfloorcur) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(this, 'ext.bidfloor', bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(this, 'ext.bidfloorcur', bidfloorcur); + } + } + Object.values(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.ALL_MEDIATYPES).filter(mediaType => imp[mediaType] != null).forEach(mediaType => { + tryGetFloor(bidRequest, { + currency: imp.bidfloorcur || context?.currency, + mediaType + }, setIfDifferent.bind(imp[mediaType])); + }); + (imp[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.BANNER]?.format || []).filter(_ref3 => { + let { + w, + h + } = _ref3; + return w != null && h != null; + }).forEach(format => { + tryGetFloor(bidRequest, { + currency: imp.bidfloorcur || context?.currency, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.BANNER, + size: [format.w, format.h] + }, setIfDifferent.bind(format)); + }); +} +function setImpExtPrebidFloors(imp, bidRequest, context) { + // logic below relates to https://github.com/prebid/Prebid.js/issues/8749 and does the following: + // 1. check client-side floors (ref bidfloor/bidfloorcur & ortb2Imp floorMin/floorMinCur (if present)) + // 2. set pbs req wide floorMinCur to the first floor currency found when iterating over imp's + // (if currency conversion logic present, convert all imp floor values to this currency) + // 3. compare/store ref to lowest floorMin value as each imp is iterated over + // 4. set req wide floorMin and floorMinCur values for pbs after iterations are done + + if (imp.bidfloor != null) { + let { + floorMinCur, + floorMin + } = context.reqContext.floorMin || {}; + if (floorMinCur == null) { + floorMinCur = imp.bidfloorcur; + } + const ortb2ImpFloorCur = imp.ext?.prebid?.floors?.floorMinCur || imp.ext?.prebid?.floorMinCur || floorMinCur; + const ortb2ImpFloorMin = imp.ext?.prebid?.floors?.floorMin || imp.ext?.prebid?.floorMin; + const convertedFloorMinValue = (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__.convertCurrency)(imp.bidfloor, imp.bidfloorcur, floorMinCur); + const convertedOrtb2ImpFloorMinValue = ortb2ImpFloorMin && ortb2ImpFloorCur ? (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__.convertCurrency)(ortb2ImpFloorMin, ortb2ImpFloorCur, floorMinCur) : false; + const lowestImpFloorMin = convertedOrtb2ImpFloorMinValue && convertedOrtb2ImpFloorMinValue < convertedFloorMinValue ? convertedOrtb2ImpFloorMinValue : convertedFloorMinValue; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, 'ext.prebid.floors.floorMin', lowestImpFloorMin); + if (floorMin == null || floorMin > lowestImpFloorMin) { + floorMin = lowestImpFloorMin; + } + context.reqContext.floorMin = { + floorMin, + floorMinCur + }; + } +} + +/** + * PBS specific extension: set ext.prebid.floors.enabled = false if floors are processed client-side + */ +function setOrtbExtPrebidFloors(ortbRequest, bidderRequest, context) { + if (addedFloorsHook) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(ortbRequest, 'ext.prebid.floors.enabled', ortbRequest.ext?.prebid?.floors?.enabled || false); + } + if (context?.floorMin) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ortbRequest, { + ext: { + prebid: { + floors: context.floorMin + } + } + }); + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'bidfloor', + fn: setOrtbImpBidFloor +}); +// granular floors should be set after both "normal" bidfloors and mediaypes +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'extBidfloor', + fn: setGranularBidfloors, + priority: -10 +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'extPrebidFloors', + fn: setImpExtPrebidFloors, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.PBS], + priority: -1 +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.REQUEST, + name: 'extPrebidFloors', + fn: setOrtbExtPrebidFloors, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.PBS] +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('priceFloors'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","gptUtils","currencyUtils","timeoutQueue","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/priceFloors.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["prismaBidAdapter"],{ + +/***/ "./modules/prismaBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/prismaBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/appnexusUtils/anKeywords.js */ "./libraries/appnexusUtils/anKeywords.js"); +/* harmony import */ var _libraries_connectionInfo_connectionUtils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/connectionInfo/connectionUtils.js */ "./libraries/connectionInfo/connectionUtils.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'prisma'; +const BIDDER_URL = 'https://prisma.nexx360.io/prebid'; +const CACHE_URL = 'https://prisma.nexx360.io/cache'; +const METRICS_TRACKER_URL = 'https://prisma.nexx360.io/track-imp'; +const GVLID = 965; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: ['prismadirect'], + // short code + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params.account && bid.params.tagId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const adUnits = []; + const test = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('debug') ? 1 : 0; + let adunitValue = null; + let userEids = null; + Object.keys(validBidRequests).forEach(key => { + adunitValue = validBidRequests[key]; + const foo = { + account: adunitValue.params.account, + tagId: adunitValue.params.tagId, + label: adunitValue.adUnitCode, + bidId: adunitValue.bidId, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: adunitValue.auctionId, + transactionId: adunitValue.ortb2Imp?.ext?.tid, + mediatypes: adunitValue.mediaTypes, + bidfloor: 0, + bidfloorCurrency: 'USD', + keywords: (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_2__.getANKeywordParam)(bidderRequest.ortb2, adunitValue.params.keywords) + }; + adUnits.push(foo); + if (adunitValue.userIdAsEids) userEids = adunitValue.userIdAsEids; + }); + const payload = { + adUnits, + // TODO: does the fallback make sense here? + href: encodeURIComponent(bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation) + }; + if (bidderRequest) { + // modules informations (gdpr, ccpa, schain, userId) + if (bidderRequest.gdprConsent) { + payload.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + payload.gdprConsent = bidderRequest.gdprConsent.consentString; + } else { + payload.gdpr = 0; + payload.gdprConsent = ''; + } + if (bidderRequest.uspConsent) { + payload.uspConsent = bidderRequest.uspConsent; + } + if (bidderRequest.schain) { + payload.schain = bidderRequest.schain; + } + if (userEids !== null) payload.userEids = userEids; + } + ; + payload.connectionType = (0,_libraries_connectionInfo_connectionUtils_js__WEBPACK_IMPORTED_MODULE_3__.getConnectionType)(); + if (test) payload.test = 1; + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: BIDDER_URL, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const serverBody = serverResponse.body; + const bidResponses = []; + let bidResponse = null; + let value = null; + if (serverBody.hasOwnProperty('responses')) { + Object.keys(serverBody['responses']).forEach(key => { + value = serverBody['responses'][key]; + const url = `${CACHE_URL}?uuid=${value['uuid']}`; + bidResponse = { + requestId: value['bidId'], + cpm: value['cpm'], + currency: value['currency'], + width: value['width'], + height: value['height'], + ttl: value['ttl'], + creativeId: value['creativeId'], + netRevenue: true, + prisma: { + 'ssp': value['bidder'], + 'consent': value['consent'], + 'tagId': value['tagId'] + }, + meta: { + 'advertiserDomains': value['adomain'] || [] + } + }; + if (value.type === 'banner') bidResponse.adUrl = url; + if (value.type === 'video') { + const params = { + type: 'prebid', + mediatype: 'video', + ssp: value.bidder, + tag_id: value.tagId, + consent: value.consent, + price: value.cpm + }; + bidResponse.cpm = value.cpm; + bidResponse.mediaType = 'video'; + bidResponse.vastUrl = url; + bidResponse.vastImpUrl = `${METRICS_TRACKER_URL}?${new URLSearchParams(params).toString()}`; + } + bidResponses.push(bidResponse); + }); + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (typeof serverResponses === 'object' && serverResponses != null && serverResponses.length > 0 && serverResponses[0].hasOwnProperty('body') && serverResponses[0].body.hasOwnProperty('cookies') && typeof serverResponses[0].body.cookies === 'object') { + return serverResponses[0].body.cookies.slice(0, 5); + } else { + return []; + } + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Bid} bid the bid that won the auction + */ + onBidWon: function (bid) { + // fires a pixel to confirm a winning bid + const params = { + type: 'prebid', + mediatype: 'banner' + }; + if (bid.hasOwnProperty('prisma')) { + if (bid.prisma.hasOwnProperty('ssp')) params.ssp = bid.prisma.ssp; + if (bid.prisma.hasOwnProperty('tagId')) params.tag_id = bid.prisma.tagId; + if (bid.prisma.hasOwnProperty('consent')) params.consent = bid.prisma.consent; + } + ; + params.price = bid.cpm; + const url = `${METRICS_TRACKER_URL}?${new URLSearchParams(params).toString()}`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, null, undefined, { + method: 'GET', + withCredentials: true + }); + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('prismaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["keywords","appnexusUtils","connectionInfo","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/prismaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["programmaticXBidAdapter"],{ + +/***/ "./modules/programmaticXBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/programmaticXBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'programmaticX'; +const GVLID = 1344; +const AD_URL = 'https://us-east.progrtb.com/pbjs'; +const SYNC_URL = 'https://sync.progrtb.com'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('programmaticXBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/programmaticXBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["programmaticaBidAdapter"],{ + +/***/ "./modules/programmaticaBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/programmaticaBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const BIDDER_CODE = 'programmatica'; +const DEFAULT_ENDPOINT = 'asr.programmatica.com'; +const SYNC_ENDPOINT = 'sync.programmatica.com'; +const ADOMAIN = 'programmatica.com'; +const TIME_TO_LIVE = 360; +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + let valid = bid.params.siteId && bid.params.placementId; + return !!valid; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let requests = []; + for (const bid of validBidRequests) { + let endpoint = bid.params.endpoint || DEFAULT_ENDPOINT; + requests.push({ + method: 'GET', + url: `https://${endpoint}/get`, + data: { + site_id: bid.params.siteId, + placement_id: bid.params.placementId, + prebid: true + }, + bidRequest: bid + }); + } + return requests; + }, + interpretResponse: function (serverResponse, request) { + if (!serverResponse?.body?.content?.data) { + return []; + } + const bidResponses = []; + const body = serverResponse.body; + let mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + let ad, vastXml; + let width; + let height; + let sizes = getSize(body.size); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes)) { + [width, height] = sizes; + } + if (body.type.format != '') { + // banner + ad = body.content.data; + if (body.content.imps?.length) { + for (const imp of body.content.imps) { + ad += ``; + } + } + } else { + // video + vastXml = body.content.data; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + if (!width || !height) { + const pSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request.bidRequest, 'mediaTypes.video.playerSize'); + const reqSize = getSize(pSize); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(reqSize)) { + [width, height] = reqSize; + } + } + } + const bidResponse = { + requestId: request.bidRequest.bidId, + cpm: body.cpm, + currency: body.currency || 'USD', + width: parseInt(width), + height: parseInt(height), + creativeId: body.id, + netRevenue: true, + ttl: TIME_TO_LIVE, + ad: ad, + mediaType: mediaType, + vastXml: vastXml, + meta: { + advertiserDomains: [ADOMAIN] + } + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && request.bidRequest.mediaTypes?.video || mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER && request.bidRequest.mediaTypes?.banner) { + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_3__.hasPurpose1Consent)(gdprConsent)) { + return syncs; + } + let params = `usp=${uspConsent ?? ''}&consent=${gdprConsent?.consentString ?? ''}`; + if (typeof gdprConsent?.gdprApplies === 'boolean') { + params += `&gdpr=${Number(gdprConsent.gdprApplies)}`; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `//${SYNC_ENDPOINT}/match/sp.ifr?${params}` + }); + } + if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `//${SYNC_ENDPOINT}/match/sp?${params}` + }); + } + return syncs; + }, + onTimeout: function (timeoutData) {}, + onBidWon: function (bid) {}, + onSetTargeting: function (bid) {}, + onBidderError: function () {}, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +function getSize(paramSizes) { + const parsedSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(paramSizes); + const sizes = parsedSizes.map(size => { + const [width, height] = size.split('x'); + const w = parseInt(width, 10); + const h = parseInt(height, 10); + return [w, h]; + }); + return sizes[0] || null; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('programmaticaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/programmaticaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["proxistoreBidAdapter"],{ + +/***/ "./modules/proxistoreBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/proxistoreBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +const BIDDER_CODE = 'proxistore'; +const PROXISTORE_VENDOR_ID = 418; +const COOKIE_BASE_URL = 'https://abs.proxistore.com/v3/rtb/prebid/multi'; +const COOKIE_LESS_URL = 'https://abs.cookieless-proxistore.com/v3/rtb/prebid/multi'; +function _createServerRequest(bidRequests, bidderRequest) { + var sizeIds = []; + bidRequests.forEach(function (bid) { + var sizeId = { + id: bid.bidId, + sizes: bid.sizes.map(function (size) { + return { + width: size[0], + height: size[1] + }; + }), + floor: _assignFloor(bid), + segments: _assignSegments(bid) + }; + sizeIds.push(sizeId); + }); + var payload = { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidRequests[0].auctionId, + transactionId: bidRequests[0].ortb2Imp?.ext?.tid, + bids: sizeIds, + website: bidRequests[0].params.website, + language: bidRequests[0].params.language, + gdpr: { + applies: false, + consentGiven: false + } + }; + if (bidderRequest && bidderRequest.gdprConsent) { + var gdprConsent = bidderRequest.gdprConsent; + if (typeof gdprConsent.gdprApplies === 'boolean' && gdprConsent.gdprApplies) { + payload.gdpr.applies = true; + } + if (typeof gdprConsent.consentString === 'string' && gdprConsent.consentString) { + payload.gdpr.consentString = bidderRequest.gdprConsent.consentString; + } + if (gdprConsent.vendorData) { + var vendorData = gdprConsent.vendorData; + if (vendorData.vendor && vendorData.vendor.consents && typeof vendorData.vendor.consents[PROXISTORE_VENDOR_ID.toString(10)] !== 'undefined') { + payload.gdpr.consentGiven = !!vendorData.vendor.consents[PROXISTORE_VENDOR_ID.toString(10)]; + } + } + } + var options = { + contentType: 'application/json', + withCredentials: payload.gdpr.consentGiven, + customHeaders: { + version: '1.0.4' + } + }; + var endPointUri = payload.gdpr.consentGiven || !payload.gdpr.applies ? COOKIE_BASE_URL : COOKIE_LESS_URL; + return { + method: 'POST', + url: endPointUri, + data: JSON.stringify(payload), + options: options + }; +} +function _assignSegments(bid) { + var segs = bid.ortb2 && bid.ortb2.user && bid.ortb2.user.ext && bid.ortb2.user.ext.data && bid.ortb2.user.ext.data.sd_rtd && bid.ortb2.user.ext.data.sd_rtd.segments ? bid.ortb2.user.ext.data.sd_rtd.segments : []; + var cats = {}; + if (bid.ortb2 && bid.ortb2.site && bid.ortb2.site.ext && bid.ortb2.site.ext.data && bid.ortb2.site.ext.data.sd_rtd) { + if (bid.ortb2.site.ext.data.sd_rtd.categories) { + segs = segs.concat(bid.ortb2.site.ext.data.sd_rtd.categories); + } + if (bid.ortb2.site.ext.data.sd_rtd.categories_score) { + cats = bid.ortb2.site.ext.data.sd_rtd.categories_score; + } + } + return { + segments: segs, + contextual_categories: cats + }; +} +function _createBidResponse(response) { + return { + requestId: response.requestId, + cpm: response.cpm, + width: response.width, + height: response.height, + ad: response.ad, + ttl: response.ttl, + creativeId: response.creativeId, + currency: response.currency, + netRevenue: response.netRevenue, + vastUrl: response.vastUrl, + vastXml: response.vastXml, + dealId: response.dealId, + meta: response.meta + }; +} +/** + * Determines whether or not the given bid request is valid. + * + * @param bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + +function isBidRequestValid(bid) { + return !!(bid.params.website && bid.params.language); +} +/** + * Make a server request from the list of BidRequests. + * + * @param bidRequests - an array of bids + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + +function buildRequests(bidRequests, bidderRequest) { + var request = _createServerRequest(bidRequests, bidderRequest); + return request; +} +/** + * Unpack the response from the server into a list of bids. + * + * @param serverResponse A successful response from the server. + * @param bidRequest Request original server request + * @return An array of bids which were nested inside the server. + */ + +function interpretResponse(serverResponse, bidRequest) { + return serverResponse.body.map(_createBidResponse); +} +function _assignFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return bid.params.bidFloor ? bid.params.bidFloor : null; + } + const floor = bid.getFloor({ + currency: 'EUR', + mediaType: 'banner', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') { + return floor.floor; + } + return null; +} +const spec = { + code: BIDDER_CODE, + isBidRequestValid: isBidRequestValid, + buildRequests: buildRequests, + interpretResponse: interpretResponse, + gvlid: PROXISTORE_VENDOR_ID +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('proxistoreBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/proxistoreBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pstudioBidAdapter"],{ + +/***/ "./modules/pstudioBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/pstudioBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + +const BIDDER_CODE = 'pstudio'; +const ENDPOINT = 'https://exchange.pstudio.tadex.id/prebid-bid'; +const TIME_TO_LIVE = 300; +// in case that the publisher limits number of user syncs, these syncs will be discarded from the end of the list +// so more important syncing calls should be at the start of the list +const USER_SYNCS = [ +// PARTNER_UID is a partner user id +{ + type: 'img', + url: 'https://match.adsrvr.org/track/cmf/generic?ttd_pid=k1on5ig&ttd_tpi=1&ttd_puid=%PARTNER_UID%&dsp=ttd', + macro: '%PARTNER_UID%' +}, { + type: 'img', + url: 'https://dsp.myads.telkomsel.com/api/v1/pixel?uid=%USERID%', + macro: '%USERID%' +}]; +const COOKIE_NAME = '__tadexid'; +const COOKIE_TTL_DAYS = 365; +const DAY_IN_MS = 24 * 60 * 60 * 1000; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const VIDEO_PARAMS = ['mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'placement', 'plcmt', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + isBidRequestValid: function (bid) { + const params = bid.params || {}; + return !!params.pubid && !!params.adtagid && isVideoRequestValid(bid); + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bid => ({ + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(buildRequestData(bid, bidderRequest)), + options: { + contentType: 'application/json', + withCredentials: true + } + })); + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + if (!serverResponse.body.bids) return []; + const { + id + } = JSON.parse(bidRequest.data); + serverResponse.body.bids.map(bid => { + const { + cpm, + width, + height, + currency, + ad, + meta + } = bid; + let bidResponse = { + requestId: id, + cpm, + width, + height, + creativeId: bid.creative_id, + currency, + netRevenue: bid.net_revenue, + ttl: TIME_TO_LIVE, + meta: { + advertiserDomains: meta.advertiser_domains + } + }; + if (bid.vast_url || bid.vast_xml) { + bidResponse.vastUrl = bid.vast_url; + bidResponse.vastXml = bid.vast_xml; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + bidResponse.ad = ad; + } + bidResponses.push(bidResponse); + }); + return bidResponses; + }, + getUserSyncs(_optionsType, _serverResponse, _gdprConsent, _uspConsent) { + const syncs = []; + let userId = readUserIdFromCookie(COOKIE_NAME); + if (!userId) { + userId = generateId(); + writeIdToCookie(COOKIE_NAME, userId); + } + USER_SYNCS.map(userSync => { + if (userSync.type === 'img') { + syncs.push({ + type: 'image', + url: userSync.url.replace(userSync.macro, userId) + }); + } + }); + return syncs; + } +}; +function buildRequestData(bid, bidderRequest) { + let payloadObject = buildBaseObject(bid, bidderRequest); + if (bid.mediaTypes.banner) { + return buildBannerObject(bid, payloadObject); + } else if (bid.mediaTypes.video) { + return buildVideoObject(bid, payloadObject); + } +} +function buildBaseObject(bid, bidderRequest) { + const firstPartyData = prepareFirstPartyData(bidderRequest.ortb2); + const { + pubid, + adtagid, + bcat, + badv, + bapp + } = bid.params; + const { + userId + } = bid; + const uid2Token = userId?.uid2?.id; + if (uid2Token) { + if (firstPartyData.user) { + firstPartyData.user.uid2_token = uid2Token; + } else { + firstPartyData.user = { + uid2_token: uid2Token + }; + } + } + const userCookieId = readUserIdFromCookie(COOKIE_NAME); + if (userCookieId) { + if (firstPartyData.user) { + firstPartyData.user.id = userCookieId; + } else { + firstPartyData.user = { + id: userCookieId + }; + } + } + return { + id: bid.bidId, + pubid, + adtagid: adtagid, + ...(bcat && { + bcat + }), + ...(badv && { + badv + }), + ...(bapp && { + bapp + }), + ...firstPartyData + }; +} +function buildBannerObject(bid, payloadObject) { + const { + sizes, + pos, + name + } = bid.mediaTypes.banner; + payloadObject.banner_properties = { + name, + sizes, + pos + }; + return payloadObject; +} +function buildVideoObject(bid, payloadObject) { + const { + context, + playerSize, + w, + h + } = bid.mediaTypes.video; + payloadObject.video_properties = { + context, + w: w || playerSize[0][0], + h: h || playerSize[0][1] + }; + for (const param of VIDEO_PARAMS) { + const paramValue = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, `mediaTypes.video.${param}`); + if (paramValue) { + payloadObject.video_properties[param] = paramValue; + } + } + return payloadObject; +} +function readUserIdFromCookie(key) { + try { + const storedValue = storage.getCookie(key); + if (storedValue !== null) { + return storedValue; + } + } catch (error) {} +} +function generateId() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(); +} +function daysToMs(days) { + return days * DAY_IN_MS; +} +function writeIdToCookie(key, value) { + if (storage.cookiesAreEnabled()) { + const expires = new Date(Date.now() + daysToMs(parseInt(COOKIE_TTL_DAYS))).toUTCString(); + storage.setCookie(key, value, expires, '/'); + } +} +function prepareFirstPartyData(_ref) { + let { + user, + device, + site, + app, + regs + } = _ref; + let userData; + let deviceData; + let siteData; + let appData; + let regsData; + if (user) { + userData = { + yob: user.yob, + gender: user.gender + }; + } + if (device) { + deviceData = { + ua: device.ua, + dnt: device.dnt, + lmt: device.lmt, + ip: device.ip, + ipv6: device.ipv6, + devicetype: device.devicetype, + make: device.make, + model: device.model, + os: device.os, + osv: device.osv, + js: device.js, + language: device.language, + carrier: device.carrier, + connectiontype: device.connectiontype, + ifa: device.ifa, + ...(device.geo && { + geo: { + lat: device.geo.lat, + lon: device.geo.lon, + country: device.geo.country, + region: device.geo.region, + regionfips104: device.geo.regionfips104, + metro: device.geo.metro, + city: device.geo.city, + zip: device.geo.zip, + type: device.geo.type + } + }), + ...(device.ext && { + ext: { + ifatype: device.ext.ifatype + } + }) + }; + } + if (site) { + siteData = { + id: site.id, + name: site.name, + domain: site.domain, + page: site.page, + cat: site.cat, + sectioncat: site.sectioncat, + pagecat: site.pagecat, + ref: site.ref, + ...(site.publisher && { + publisher: { + name: site.publisher.name, + cat: site.publisher.cat, + domain: site.publisher.domain + } + }), + ...(site.content && { + content: { + id: site.content.id, + episode: site.content.episode, + title: site.content.title, + series: site.content.series, + artist: site.content.artist, + genre: site.content.genre, + album: site.content.album, + isrc: site.content.isrc, + season: site.content.season + } + }), + mobile: site.mobile + }; + } + if (app) { + appData = { + id: app.id, + name: app.name, + bundle: app.bundle, + domain: app.domain, + storeurl: app.storeurl, + cat: app.cat, + sectioncat: app.sectioncat, + pagecat: app.pagecat, + ver: app.ver, + privacypolicy: app.privacypolicy, + paid: app.paid, + ...(app.publisher && { + publisher: { + name: app.publisher.name, + cat: app.publisher.cat, + domain: app.publisher.domain + } + }), + keywords: app.keywords, + ...(app.content && { + content: { + id: app.content.id, + episode: app.content.episode, + title: app.content.title, + series: app.content.series, + artist: app.content.artist, + genre: app.content.genre, + album: app.content.album, + isrc: app.content.isrc, + season: app.content.season + } + }) + }; + } + if (regs) { + regsData = { + coppa: regs.coppa + }; + } + return cleanObject({ + user: userData, + device: deviceData, + site: siteData, + app: appData, + regs: regsData + }); +} +function cleanObject(data) { + for (let key in data) { + if (typeof data[key] == 'object') { + cleanObject(data[key]); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(data[key])) delete data[key]; + } + if (data[key] === undefined) delete data[key]; + } + return data; +} +function isVideoRequestValid(bidRequest) { + if (bidRequest.mediaTypes.video) { + const { + w, + h, + playerSize, + mimes, + protocols + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video', {}); + const areSizesValid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(w) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(h) || validateSizes(playerSize); + const areMimesValid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(mimes) && mimes.length > 0; + const areProtocolsValid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(protocols) && protocols.length > 0 && protocols.every(_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber); + return areSizesValid && areMimesValid && areProtocolsValid; + } + return true; +} +function validateSizes(sizes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(sizes) && sizes.length > 0 && sizes.every(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(size) && size.length === 2 && size.every(_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)); +} + +/* function getBidFloor(bid) { + if (!isFn(bid.getFloor)) { + return bid.params.floorPrice ? bid.params.floorPrice : null; + } + + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*', + }); + if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} */ + +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('pstudioBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pstudioBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubCircleBidAdapter"],{ + +/***/ "./modules/pubCircleBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/pubCircleBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'pubcircle'; +const AD_URL = 'https://ml.pubcircle.ai/pbjs'; +const SYNC_URL = 'https://cs.pubcircle.ai'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(['placementId']), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pubCircleBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubCircleBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubProvidedIdSystem"],{ + +/***/ "./modules/pubProvidedIdSystem.js": +/*!****************************************!*\ + !*** ./modules/pubProvidedIdSystem.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export pubProvidedIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/consentHandler.js */ "./src/consentHandler.js"); + +/** + * This module adds Publisher Provided ids support to the User ID module + * The {@link module:modules/userId} module is required. + * @module modules/pubProvidedSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const MODULE_NAME = 'pubProvidedId'; + +/** @type {Submodule} */ +const pubProvidedIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + gvlid: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_0__.VENDORLESS_GVLID, + /** + * decode the stored id value for passing to bid request + * @function + * @param {string} value + * @returns {{pubProvidedId: Array}} or undefined if value doesn't exists + */ + decode(value) { + const res = value ? { + pubProvidedId: value + } : undefined; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('PubProvidedId: Decoded value ' + JSON.stringify(res)); + return res; + }, + /** + * performs action to obtain id and return a value. + * @function + * @param {SubmoduleConfig} [config] + * @returns {{id: Array}} + */ + getId(config) { + const configParams = config && config.params || {}; + let res = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(configParams.eids)) { + res = res.concat(configParams.eids); + } + if (typeof configParams.eidsFunction === 'function') { + res = res.concat(configParams.eidsFunction()); + } + return { + id: res + }; + } +}; + +// Register submodule for userId +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('userId', pubProvidedIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pubProvidedIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubProvidedIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubgeniusBidAdapter"],{ + +/***/ "./modules/pubgeniusBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/pubgeniusBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + +const BIDDER_VERSION = '1.1.0'; +const BASE_URL = 'https://auction.adpearl.io'; +const spec = { + code: 'pubgenius', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid(bid) { + const adUnitId = bid.params.adUnitId; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(adUnitId) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(adUnitId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('pubgenius bidder params: adUnitId must be a string or integer.'); + return false; + } + const { + mediaTypes + } = bid; + if (mediaTypes.banner) { + return isValidBanner(mediaTypes.banner); + } + return isValidVideo(mediaTypes.video, bid.params.video); + }, + buildRequests: function (bidRequests, bidderRequest) { + const data = { + id: bidderRequest.bidderRequestId, + imp: bidRequests.map(buildImp), + tmax: bidderRequest.timeout, + ext: { + pbadapter: { + version: BIDDER_VERSION + } + } + }; + const site = buildSite(bidderRequest); + if (site) { + data.site = site; + } + const gdpr = bidderRequest.gdprConsent; + if (gdpr) { + const applies = gdpr.gdprApplies; + const consent = gdpr.consentString; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(data, 'regs.ext.gdpr', numericBoolean(applies)); + if (applies && consent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(data, 'user.ext.consent', consent); + } + } + const usp = bidderRequest.uspConsent; + if (usp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(data, 'regs.ext.us_privacy', usp); + } + const schain = bidRequests[0].schain; + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(data, 'source.ext.schain', schain); + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(data, 'regs.coppa', 1); + } + const bidUserIdAsEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequests, '0.userIdAsEids'); + if (bidUserIdAsEids && bidUserIdAsEids.length) { + const eids = bidUserIdAsEids.filter(eid => eid.source === 'adserver.org'); + if (eids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(data, 'user.ext.eids', eids); + } + } + return { + method: 'POST', + url: `${getBaseUrl()}/prebid/auction`, + data + }; + }, + interpretResponse(_ref) { + let { + body + } = _ref; + const bidResponses = []; + const currency = body.cur || 'USD'; + const seatbids = body.seatbid; + if (seatbids) { + seatbids.forEach(seatbid => { + seatbid.bid.forEach(bid => { + const bidResponse = interpretBid(bid); + bidResponse.currency = currency; + bidResponses.push(bidResponse); + }); + }); + } + return bidResponses; + }, + getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (syncOptions.iframeEnabled) { + let params = {}; + if (gdprConsent) { + params.gdpr = numericBoolean(gdprConsent.gdprApplies); + if (gdprConsent.consentString) { + params.consent = gdprConsent.consentString; + } + } + if (uspConsent) { + params.us_privacy = uspConsent; + } + const qs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseQueryStringParameters)(params); + syncs.push({ + type: 'iframe', + url: `${getBaseUrl()}/usersync/pixels.html?${qs}` + }); + } + return syncs; + }, + onTimeout(data) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(`${getBaseUrl()}/prebid/events?type=timeout`, null, JSON.stringify(data), { + method: 'POST' + }); + } +}; +function buildVideoParams(videoMediaType, videoParams) { + videoMediaType = videoMediaType || {}; + const params = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(videoMediaType, ['mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'plcmt', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']); + if (videoMediaType.playerSize) { + params.w = videoMediaType.playerSize[0][0]; + params.h = videoMediaType.playerSize[0][1]; + } + return Object.assign(params, videoParams); +} +function buildImp(bid) { + const imp = { + id: bid.bidId, + tagid: String(bid.params.adUnitId) + }; + if (bid.mediaTypes.banner) { + imp.banner = { + format: bid.mediaTypes.banner.sizes.map(size => ({ + w: size[0], + h: size[1] + })), + topframe: numericBoolean(!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)()) + }; + } else { + imp.video = buildVideoParams(bid.mediaTypes.video, bid.params.video); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + const { + floor + } = bid.getFloor({ + mediaType: bid.mediaTypes.banner ? 'banner' : 'video', + size: '*', + currency: 'USD' + }) || {}; + if (floor) { + imp.bidfloor = floor; + } + } + const pos = bid.params.position; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(pos)) { + imp.banner.pos = pos; + } + if (bid.params.test) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext.test', 1); + } + return imp; +} +function buildSite(bidderRequest) { + let site = null; + const { + refererInfo + } = bidderRequest; + const pageUrl = refererInfo.page; + if (pageUrl) { + site = site || {}; + site.page = pageUrl; + } + if (refererInfo.ref) { + site = site || {}; + site.ref = refererInfo.ref; + } + return site; +} +function interpretBid(bid) { + const bidResponse = { + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ttl: bid.exp, + creativeId: bid.crid, + netRevenue: true + }; + if (bid.adomain && bid.adomain.length) { + bidResponse.meta = { + advertiserDomains: bid.adomain + }; + } + const pbadapter = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bid, 'ext.pbadapter') || {}; + switch (pbadapter.mediaType) { + case 'video': + if (bid.nurl) { + bidResponse.vastUrl = bid.nurl; + } + if (bid.adm) { + bidResponse.vastXml = bid.adm; + } + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + break; + default: + // banner by default + bidResponse.ad = bid.adm; + break; + } + return bidResponse; +} +function numericBoolean(value) { + return value ? 1 : 0; +} +function getBaseUrl() { + const pubg = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('pubgenius'); + return pubg && pubg.endpoint || BASE_URL; +} +function isValidSize(size) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(size, 2) && size[0] > 0 && size[1] > 0; +} +function isValidBanner(banner) { + const sizes = banner.sizes; + return !!(sizes && sizes.length) && sizes.every(isValidSize); +} +function isValidVideo(videoMediaType, videoParams) { + const params = buildVideoParams(videoMediaType, videoParams); + return !!(isValidSize([params.w, params.h]) && params.mimes && params.mimes.length && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(params.protocols) && params.protocols.length); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('pubgeniusBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubgeniusBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["publinkIdSystem"],{ + +/***/ "./modules/publinkIdSystem.js": +/*!************************************!*\ + !*** ./modules/publinkIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, publinkIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the PublinkId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/publinkIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'publinkId'; +const GVLID = 24; +const PUBLINK_COOKIE = '_publink'; +const PUBLINK_S2S_COOKIE = '_publink_srv'; +const PUBLINK_REQUEST_PATH = '/cvx/client/sync/publink'; +const PUBLINK_REFRESH_PATH = '/cvx/client/sync/publink/refresh'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function isHex(s) { + return /^[A-F0-9]+$/i.test(s); +} +function publinkIdUrl(params, consentData, storedId) { + let url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)('https://proc.ad.cpe.dotomi.com' + PUBLINK_REFRESH_PATH); + url.search = { + mpn: 'Prebid.js', + mpv: "9.45.0-pre" + }; + if (consentData?.gdpr) { + url.search.gdpr = consentData.gdpr.gdprApplies ? 1 : 0; + url.search.gdpr_consent = consentData.gdpr.consentString; + } + if (params) { + if (params.e) { + // if there's an email parameter call the request path + url.search.deh = params.e; + url.pathname = PUBLINK_REQUEST_PATH; + } + if (params.site_id) { + url.search.sid = params.site_id; + } + if (params.api_key) { + url.search.apikey = params.api_key; + } + } + if (storedId) { + url.search.publink = storedId; + } + const usPrivacyString = consentData?.usp; + if (usPrivacyString && typeof usPrivacyString === 'string') { + url.search.us_privacy = usPrivacyString; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)(url); +} +function makeCallback() { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let consentData = arguments.length > 1 ? arguments[1] : undefined; + let storedId = arguments.length > 2 ? arguments[2] : undefined; + return function (prebidCallback) { + const options = { + method: 'GET', + withCredentials: true + }; + let handleResponse = function (responseText, xhr) { + if (xhr.status === 200) { + let response = JSON.parse(responseText); + if (response) { + prebidCallback(response.publink); + } + } + }; + if (config.params && config.params.e && isHex(config.params.e) || storedId) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(publinkIdUrl(config.params, consentData, storedId), handleResponse, undefined, options); + } else if (config.params.e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('params.e must be a hex string'); + } + }; +} +function getlocalValue() { + let result; + function getData(key) { + let value; + if (storage.hasLocalStorage()) { + value = storage.getDataFromLocalStorage(key); + } + if (!value) { + value = storage.getCookie(key); + } + if (typeof value === 'string') { + // if it's a json object parse it and return the publink value, otherwise assume the value is the id + if (value.charAt(0) === '{') { + try { + const obj = JSON.parse(value); + if (obj) { + return obj.publink; + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } + } else { + return value; + } + } + } + result = getData(PUBLINK_S2S_COOKIE); + if (!result) { + result = getData(PUBLINK_COOKIE); + } + return result; +} + +/** @type {Submodule} */ +const publinkIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + gvlid: GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} publinkId encrypted userid + * @returns {{publinkId: string} | undefined} + */ + decode(publinkId) { + return { + publinkId: publinkId + }; + }, + /** + * performs action to obtain id + * Use a publink cookie first if it is present, otherwise use prebids copy, if neither are available callout to get a new id + * @function + * @param {SubmoduleConfig} [config] Config object with params and storage properties + * @param {ConsentData|undefined} consentData GDPR consent + * @param {(Object|undefined)} storedId Previously cached id + * @returns {IdResponse} + */ + getId: function (config, consentData, storedId) { + const localValue = getlocalValue(); + if (localValue) { + return { + id: localValue + }; + } + return { + callback: makeCallback(config, consentData, storedId) + }; + }, + eids: { + 'publinkId': { + source: 'epsilon.com', + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', publinkIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('publinkIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/publinkIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["publirBidAdapter"],{ + +/***/ "./modules/publirBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/publirBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/riseUtils/index.js */ "./libraries/riseUtils/index.js"); + + + + + + + +const SUPPORTED_AD_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const BIDDER_CODE = 'publir'; +const ADAPTER_VERSION = '1.0.0'; +const TTL = 360; +const CURRENCY = 'USD'; +const BASE_URL = 'https://prebid.publir.com/publirPrebidEndPoint'; +const DEFAULT_IMPS_ENDPOINT = 'https://prebidimpst.publir.com/publirPrebidImpressionTracker'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const spec = { + code: BIDDER_CODE, + version: ADAPTER_VERSION, + aliases: ['plr'], + supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params.pubId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('pubId is a mandatory param for Publir adapter'); + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const combinedRequestsObject = {}; + const generalObject = validBidRequests[0]; + combinedRequestsObject.params = (0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.generateGeneralParams)(generalObject, bidderRequest, ADAPTER_VERSION); + combinedRequestsObject.bids = (0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.generateBidsParams)(validBidRequests, bidderRequest); + combinedRequestsObject.bids.timestamp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)(); + let options = { + withCredentials: false + }; + return { + method: 'POST', + url: BASE_URL, + data: combinedRequestsObject, + options + }; + }, + interpretResponse: function (_ref) { + let { + body + } = _ref; + const bidResponses = []; + if (body.bids) { + body.bids.forEach(adUnit => { + const bidResponse = { + requestId: adUnit.requestId, + cpm: adUnit.cpm, + currency: adUnit.currency || CURRENCY, + width: adUnit.width, + height: adUnit.height, + ttl: adUnit.ttl || TTL, + creativeId: adUnit.creativeId, + netRevenue: adUnit.netRevenue || true, + nurl: adUnit.nurl, + mediaType: adUnit.mediaType, + meta: { + mediaType: adUnit.mediaType + } + }; + if (adUnit.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bidResponse.vastXml = adUnit.vastXml; + } else if (adUnit.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + bidResponse.ad = adUnit.ad; + } + if (adUnit.adomain && adUnit.adomain.length) { + bidResponse.meta.advertiserDomains = adUnit.adomain; + } else { + bidResponse.meta.advertiserDomains = []; + } + if (adUnit?.meta?.ad_key) { + bidResponse.meta.ad_key = adUnit.meta.ad_key ?? null; + } + if (adUnit.campId) { + bidResponse.campId = adUnit.campId; + } + bidResponse.bidder = BIDDER_CODE; + bidResponses.push(bidResponse); + }); + } else { + return []; + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + for (const response of serverResponses) { + if (response.body && response.body.params) { + if (syncOptions.iframeEnabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(response, 'body.params.userSyncURL')) { + syncs.push({ + type: 'iframe', + url: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(response, 'body.params.userSyncURL') + }); + } + if (syncOptions.pixelEnabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(response, 'body.params.userSyncPixels'))) { + const pixels = response.body.params.userSyncPixels.map(pixel => { + return { + type: 'image', + url: pixel + }; + }); + syncs.push(...pixels); + } + } + } + return syncs; + }, + onBidWon: function (bid) { + if (bid == null) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('onBidWon:', bid); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(DEFAULT_IMPS_ENDPOINT, null, JSON.stringify(bid), { + method: 'POST', + mode: 'no-cors', + credentials: 'include', + headers: { + 'Content-Type': 'application/json' + } + }); + if (bid.hasOwnProperty('nurl') && bid.nurl.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(bid.nurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('publirBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["riseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/publirBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubmaticAnalyticsAdapter"],{ + +/***/ "./modules/pubmaticAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/pubmaticAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export getMetadata */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + + + + + + + + + +const FLOOR_VALUES = { + NO_DATA: 'noData', + AD_UNIT: 'adUnit', + SET_CONFIG: 'setConfig', + FETCH: 'fetch', + SUCCESS: 'success', + ERROR: 'error', + TIMEOUT: 'timeout' +}; + +/// /////////// CONSTANTS /////////////// +const ADAPTER_CODE = 'pubmatic'; +const VENDOR_OPENWRAP = 'openwrap'; +const DISPLAY_MANAGER = 'Prebid.js'; +const SEND_TIMEOUT = 2000; +const END_POINT_HOST = 'https://t.pubmatic.com/'; +const END_POINT_BID_LOGGER = END_POINT_HOST + 'wl?'; +const END_POINT_WIN_BID_LOGGER = END_POINT_HOST + 'wt?'; +const LOG_PRE_FIX = 'PubMatic-Analytics: '; +const cache = { + auctions: {} +}; +const SUCCESS = 'success'; +const NO_BID = 'no-bid'; +const ERROR = 'error'; +const REQUEST_ERROR = 'request-error'; +const TIMEOUT_ERROR = 'timeout-error'; +const EMPTY_STRING = ''; +const OPEN_AUCTION_DEAL_ID = '-1'; +const MEDIA_TYPE_BANNER = 'banner'; +const CURRENCY_USD = 'USD'; +const BID_PRECISION = 2; +// todo: input profileId and profileVersionId ; defaults to zero or one +const DEFAULT_PUBLISHER_ID = 0; +const DEFAULT_PROFILE_ID = 0; +const DEFAULT_PROFILE_VERSION_ID = 0; +const enc = window.encodeURIComponent; +const MEDIATYPE = { + BANNER: 0, + VIDEO: 1, + NATIVE: 2 +}; + +// TODO : Remove - Once BM calculation moves to Server Side +const BROWSER_MAP = [{ + value: /(firefox)\/([\w\.]+)/i, + key: 12 +}, +// Firefox +{ + value: /\b(?:crios)\/([\w\.]+)/i, + key: 1 +}, +// Chrome for iOS +{ + value: /edg(?:e|ios|a)?\/([\w\.]+)/i, + key: 2 +}, +// Edge +{ + value: /(opera|opr)(?:.+version\/|[\/ ]+)([\w\.]+)/i, + key: 3 +}, +// Opera +{ + value: /(?:ms|\()(ie) ([\w\.]+)|(?:trident\/[\w\.]+)/i, + key: 4 +}, +// Internet Explorer +{ + value: /fxios\/([-\w\.]+)/i, + key: 5 +}, +// Firefox for iOS +{ + value: /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i, + key: 6 +}, +// Facebook In-App Browser +{ + value: / wv\).+(chrome)\/([\w\.]+)/i, + key: 7 +}, +// Chrome WebView +{ + value: /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i, + key: 8 +}, +// Android Browser +{ + value: /(chrome|chromium|crios)\/v?([\w\.]+)/i, + key: 9 +}, +// Chrome +{ + value: /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i, + key: 10 +}, +// Safari Mobile +{ + value: /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i, + key: 11 +} // Safari +]; + +/// /////////// VARIABLES ////////////// +let publisherId = DEFAULT_PUBLISHER_ID; // int: mandatory +let profileId = DEFAULT_PROFILE_ID; // int: optional +let profileVersionId = DEFAULT_PROFILE_VERSION_ID; // int: optional +let s2sBidders = []; + +/// /////////// HELPER FUNCTIONS ////////////// + +function sizeToDimensions(size) { + return { + width: size.w || size[0], + height: size.h || size[1] + }; +} +function validMediaType(type) { + return { + 'banner': 1, + 'native': 1, + 'video': 1 + }.hasOwnProperty(type); +} +function formatSource(src) { + if (typeof src === 'undefined') { + src = 'client'; + } else if (src === 's2s') { + src = 'server'; + } + return src.toLowerCase(); +} +function setMediaTypes(types, bid) { + if (bid.mediaType && validMediaType(bid.mediaType)) { + return [bid.mediaType]; + } + if (Array.isArray(types)) { + return types.filter(validMediaType); + } + if (typeof types === 'object') { + if (!bid.sizes) { + bid.dimensions = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(types, type => bid.dimensions = bid.dimensions.concat(type.sizes.map(sizeToDimensions))); + } + return Object.keys(types).filter(validMediaType); + } + return [MEDIA_TYPE_BANNER]; +} +function copyRequiredBidDetails(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(bid, ['bidder', 'bidderCode', 'adapterCode', 'bidId', 'status', () => NO_BID, + // default a bid to NO_BID until response is received or bid is timed out + 'finalSource as source', 'params', 'floorData', 'adUnit', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(bid, ['adUnitCode', 'transactionId', 'sizes as dimensions', sizes => sizes && sizes.map(sizeToDimensions), 'mediaTypes', types => setMediaTypes(types, bid)])]); +} +function setBidStatus(bid, args) { + switch (args.getStatusCode()) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.STATUS.GOOD: + bid.status = SUCCESS; + delete bid.error; // it's possible for this to be set by a previous timeout + break; + default: + bid.status = ERROR; + bid.error = { + code: REQUEST_ERROR + }; + } +} +function parseBidResponse(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(bid, ['bidPriceUSD', () => { + // todo: check whether currency cases are handled here + if (typeof bid.currency === 'string' && bid.currency.toUpperCase() === CURRENCY_USD) { + return window.parseFloat(Number(bid.cpm).toFixed(BID_PRECISION)); + } + // use currency conversion function if present + if (typeof bid.getCpmInNewCurrency === 'function') { + return window.parseFloat(Number(bid.getCpmInNewCurrency(CURRENCY_USD)).toFixed(BID_PRECISION)); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(LOG_PRE_FIX + 'Could not determine the Net cpm in USD for the bid thus using bid.cpm', bid); + return bid.cpm; + }, 'bidGrossCpmUSD', () => { + if (typeof bid.originalCurrency === 'string' && bid.originalCurrency.toUpperCase() === CURRENCY_USD) { + return window.parseFloat(Number(bid.originalCpm).toFixed(BID_PRECISION)); + } + // use currency conversion function if present + if (typeof (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().convertCurrency === 'function') { + return window.parseFloat(Number((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().convertCurrency(bid.originalCpm, bid.originalCurrency, CURRENCY_USD)).toFixed(BID_PRECISION)); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(LOG_PRE_FIX + 'Could not determine the Gross cpm in USD for the bid, thus using bid.originalCpm', bid); + return bid.originalCpm; + }, 'dealId', 'currency', 'cpm', () => window.parseFloat(Number(bid.cpm).toFixed(BID_PRECISION)), 'originalCpm', () => window.parseFloat(Number(bid.originalCpm).toFixed(BID_PRECISION)), 'originalCurrency', 'adserverTargeting', 'dealChannel', 'meta', 'status', 'error', 'bidId', 'mediaType', 'params', 'floorData', 'mi', 'regexPattern', () => bid.regexPattern || undefined, 'partnerImpId', + // partner impression ID + 'dimensions', () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(bid, ['width', 'height'])]); +} +function getDomainFromUrl(url) { + let a = window.document.createElement('a'); + a.href = url; + return a.hostname; +} +function getDevicePlatform() { + var deviceType = 3; + try { + var ua = navigator.userAgent; + if (ua && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(ua) && ua.trim() != '') { + ua = ua.toLowerCase().trim(); + var isMobileRegExp = new RegExp('(mobi|tablet|ios).*'); + if (ua.match(isMobileRegExp)) { + deviceType = 2; + } else { + deviceType = 1; + } + } + } catch (ex) {} + return deviceType; +} + +// TODO : Remove - Once BM calculation moves to Server Side +function getBrowserType() { + const userAgent = navigator?.userAgent; + let browserIndex = userAgent == null ? -1 : 0; + if (userAgent) { + browserIndex = BROWSER_MAP.find(_ref => { + let { + value + } = _ref; + return value.test(userAgent); + })?.key || 0; + } + return browserIndex; +} +function getValueForKgpv(bid, adUnitId) { + if (bid.params && bid.params.regexPattern) { + return bid.params.regexPattern; + } else if (bid.bidResponse && bid.bidResponse.regexPattern) { + return bid.bidResponse.regexPattern; + } else if (bid.params && bid.params.kgpv) { + return bid.params.kgpv; + } else { + return adUnitId; + } +} +function getAdapterNameForAlias(aliasName) { + return _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].aliasRegistry[aliasName] || aliasName; +} +function getAdDomain(bidResponse) { + if (bidResponse.meta && bidResponse.meta.advertiserDomains) { + let adomain = bidResponse.meta.advertiserDomains[0]; + if (adomain) { + try { + let hostname = new URL(adomain); + return hostname.hostname.replace('www.', ''); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(LOG_PRE_FIX + 'Adomain URL (Not a proper URL):', adomain); + return adomain.replace('www.', ''); + } + } + } +} +function isObject(object) { + return typeof object === 'object' && object !== null; +} +; +function isEmptyObject(object) { + return isObject(object) && Object.keys(object).length === 0; +} +; + +/** + * Prepare meta object to pass in logger call + * @param {*} meta + */ +function getMetadata(meta) { + if (!meta || isEmptyObject(meta)) return; + const metaObj = {}; + if (meta.networkId) metaObj.nwid = meta.networkId; + if (meta.advertiserId) metaObj.adid = meta.advertiserId; + if (meta.networkName) metaObj.nwnm = meta.networkName; + if (meta.primaryCatId) metaObj.pcid = meta.primaryCatId; + if (meta.advertiserName) metaObj.adnm = meta.advertiserName; + if (meta.agencyId) metaObj.agid = meta.agencyId; + if (meta.agencyName) metaObj.agnm = meta.agencyName; + if (meta.brandId) metaObj.brid = meta.brandId; + if (meta.brandName) metaObj.brnm = meta.brandName; + if (meta.dchain) metaObj.dc = meta.dchain; + if (meta.demandSource) metaObj.ds = meta.demandSource; + if (meta.secondaryCatIds) metaObj.scids = meta.secondaryCatIds; + if (isEmptyObject(metaObj)) return; + return metaObj; +} +function isS2SBidder(bidder) { + return s2sBidders.indexOf(bidder) > -1 ? 1 : 0; +} +function isOWPubmaticBid(adapterName) { + let s2sConf = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('s2sConfig'); + let s2sConfArray = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(s2sConf) ? s2sConf : [s2sConf]; + return s2sConfArray.some(conf => { + if (adapterName === ADAPTER_CODE && conf.defaultVendor === VENDOR_OPENWRAP && conf.bidders.indexOf(ADAPTER_CODE) > -1) { + return true; + } + }); +} +function getFloorsCommonField(floorData) { + if (!floorData) return; + const { + location, + fetchStatus, + floorProvider, + modelVersion + } = floorData; + return { + ffs: { + [FLOOR_VALUES.SUCCESS]: 1, + [FLOOR_VALUES.ERROR]: 2, + [FLOOR_VALUES.TIMEOUT]: 4, + undefined: 0 + }[fetchStatus], + fsrc: { + [FLOOR_VALUES.FETCH]: 2, + [FLOOR_VALUES.NO_DATA]: 0, + [FLOOR_VALUES.AD_UNIT]: 1, + [FLOOR_VALUES.SET_CONFIG]: 1 + }[location], + fp: floorProvider, + mv: modelVersion + }; +} +function getFloorType(floorResponseData) { + return floorResponseData ? floorResponseData.enforcements.enforceJS == false ? 0 : 1 : undefined; +} +function gatherPartnerBidsForAdUnitForLogger(adUnit, adUnitId, highestBid, e) { + highestBid = highestBid && highestBid.length > 0 ? highestBid[0] : null; + return Object.keys(adUnit.bids).reduce(function (partnerBids, bidId) { + adUnit.bids[bidId].forEach(function (bid) { + let adapterName = getAdapterNameForAlias(bid.adapterCode || bid.bidder); + if (isOWPubmaticBid(adapterName) && isS2SBidder(bid.bidder)) { + return; + } + const pg = window.parseFloat(Number(bid.bidResponse?.adserverTargeting?.hb_pb || bid.bidResponse?.adserverTargeting?.pwtpb).toFixed(BID_PRECISION)); + const prebidBidsReceived = e?.bidsReceived; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(prebidBidsReceived) && prebidBidsReceived.length > 0) { + prebidBidsReceived.forEach(function (iBid) { + if (iBid.adId === bid.adId) { + bid.bidderCode = iBid.bidderCode; + } + }); + } + partnerBids.push({ + 'pn': adapterName, + 'bc': bid.bidderCode || bid.bidder, + 'bidid': bid.bidId || bidId, + 'origbidid': bid?.bidResponse?.partnerImpId || bid?.bidResponse?.prebidBidId || bid.bidId || bidId, + 'db': bid.bidResponse ? 0 : 1, + 'kgpv': getValueForKgpv(bid, adUnitId), + 'kgpsv': bid.params && bid.params.kgpv ? bid.params.kgpv : adUnitId, + 'psz': bid.bidResponse ? bid.bidResponse.dimensions.width + 'x' + bid.bidResponse.dimensions.height : '0x0', + 'eg': bid.bidResponse ? bid.bidResponse.bidGrossCpmUSD : 0, + 'en': bid.bidResponse ? bid.bidResponse.bidPriceUSD : 0, + 'di': bid.bidResponse ? bid.bidResponse.dealId || OPEN_AUCTION_DEAL_ID : OPEN_AUCTION_DEAL_ID, + 'dc': bid.bidResponse ? bid.bidResponse.dealChannel || EMPTY_STRING : EMPTY_STRING, + 'l1': bid.bidResponse ? bid.partnerTimeToRespond : 0, + 'ol1': bid.bidResponse ? bid.clientLatencyTimeMs : 0, + 'l2': 0, + 'adv': bid.bidResponse ? getAdDomain(bid.bidResponse) || undefined : undefined, + 'ss': isS2SBidder(bid.bidder), + 't': bid.status == ERROR && bid.error.code == TIMEOUT_ERROR ? 1 : 0, + 'wb': highestBid && highestBid.adId === bid.adId ? 1 : 0, + 'mi': bid.bidResponse ? bid.bidResponse.mi || undefined : undefined, + 'af': bid.bidResponse ? bid.bidResponse.mediaType || undefined : undefined, + 'ocpm': bid.bidResponse ? bid.bidResponse.originalCpm || 0 : 0, + 'ocry': bid.bidResponse ? bid.bidResponse.originalCurrency || CURRENCY_USD : CURRENCY_USD, + 'frv': bid.bidResponse ? bid.bidResponse.floorData?.floorRuleValue : undefined, + 'fv': bid.bidResponse ? bid.bidResponse.floorData?.floorValue : undefined, + 'md': bid.bidResponse ? getMetadata(bid.bidResponse.meta) : undefined, + 'pb': pg || undefined + }); + }); + return partnerBids; + }, []); +} +function getSizesForAdUnit(adUnit) { + var bid = Object.values(adUnit.bids).filter(bid => !!bid.bidResponse && bid.bidResponse.mediaType === 'native')[0]; + if (!!bid || bid === undefined && adUnit.dimensions.length === 0) { + return ['1x1']; + } else { + return adUnit.dimensions.map(function (e) { + return e[0] + 'x' + e[1]; + }); + } +} +function getAdUnitAdFormats(adUnit) { + var af = adUnit ? Object.keys(adUnit.mediaTypes || {}).map(format => MEDIATYPE[format.toUpperCase()]) : []; + return af; +} +function getAdUnit(adUnits, adUnitId) { + return adUnits.filter(adUnit => adUnit.divID && adUnit.divID == adUnitId || adUnit.code == adUnitId)[0]; +} +function getTgId() { + var testGroupId = parseInt(_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('testGroupId') || 0); + if (testGroupId <= 15 && testGroupId >= 0) { + return testGroupId; + } + return 0; +} +function getFloorFetchStatus(floorData) { + if (!floorData?.floorRequestData) { + return false; + } + const { + location, + fetchStatus + } = floorData?.floorRequestData; + const isDataValid = location !== FLOOR_VALUES.NO_DATA; + const isFetchSuccessful = location === FLOOR_VALUES.FETCH && fetchStatus === FLOOR_VALUES.SUCCESS; + const isAdUnitOrSetConfig = location === FLOOR_VALUES.AD_UNIT || location === FLOOR_VALUES.SET_CONFIG; + return isDataValid && (isAdUnitOrSetConfig || isFetchSuccessful); +} +function executeBidsLoggerCall(e, highestCpmBids) { + let auctionId = e.auctionId; + let referrer = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('pageUrl') || cache.auctions[auctionId]?.referer || ''; + let auctionCache = cache.auctions[auctionId]; + let wiid = auctionCache?.wiid || auctionId; + let floorData = auctionCache?.floorData; + let floorFetchStatus = getFloorFetchStatus(floorData); + let outputObj = { + s: [] + }; + let pixelURL = END_POINT_BID_LOGGER; + const country = e.bidderRequests?.length > 0 ? e.bidderRequests.find(bidder => bidder?.bidderCode === ADAPTER_CODE)?.ortb2?.user?.ext?.ctr || '' : ''; + if (!auctionCache || auctionCache.sent) { + return; + } + pixelURL += 'pubid=' + publisherId; + outputObj['pubid'] = '' + publisherId; + outputObj['iid'] = '' + wiid; + outputObj['to'] = '' + auctionCache.timeout; + outputObj['purl'] = referrer; + outputObj['orig'] = getDomainFromUrl(referrer); + outputObj['tst'] = Math.round(new window.Date().getTime() / 1000); + outputObj['pid'] = '' + profileId; + outputObj['pdvid'] = '' + profileVersionId; + outputObj['dvc'] = { + 'plt': getDevicePlatform() + }; + outputObj['tgid'] = getTgId(); + outputObj['dm'] = DISPLAY_MANAGER; + outputObj['dmv'] = "9.45.0-pre" || 0; + outputObj['bm'] = getBrowserType(); + outputObj['ctr'] = country || ''; + if (floorData) { + const floorRootValues = getFloorsCommonField(floorData?.floorRequestData); + if (floorRootValues) { + const { + ffs, + fsrc, + fp, + mv + } = floorRootValues; + if (floorData?.floorRequestData) { + outputObj['ffs'] = ffs; + outputObj['fsrc'] = fsrc; + outputObj['fp'] = fp; + } + if (floorFetchStatus) { + outputObj['fmv'] = mv || undefined; + } + } + if (floorFetchStatus) { + outputObj['ft'] = getFloorType(floorData?.floorResponseData); + } + } + outputObj.s = Object.keys(auctionCache.adUnitCodes).reduce(function (slotsArray, adUnitId) { + let adUnit = auctionCache.adUnitCodes[adUnitId]; + let origAdUnit = getAdUnit(auctionCache.origAdUnits, adUnitId) || {}; + // getGptSlotInfoForAdUnitCode returns gptslot corresponding to adunit provided as input. + let slotObject = { + 'sn': adUnitId, + 'au': origAdUnit.owAdUnitId || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__.getGptSlotInfoForAdUnitCode)(adUnitId)?.gptSlot || adUnitId, + 'mt': getAdUnitAdFormats(origAdUnit), + 'sz': getSizesForAdUnit(adUnit, adUnitId), + 'ps': gatherPartnerBidsForAdUnitForLogger(adUnit, adUnitId, highestCpmBids.filter(bid => bid.adUnitCode === adUnitId), e), + 'fskp': floorData && floorFetchStatus ? floorData.floorRequestData ? floorData.floorRequestData.skipped == false ? 0 : 1 : undefined : undefined, + 'sid': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)() + }; + slotsArray.push(slotObject); + return slotsArray; + }, []); + auctionCache.sent = true; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(pixelURL, null, 'json=' + enc(JSON.stringify(outputObj)), { + contentType: 'application/x-www-form-urlencoded', + withCredentials: true, + method: 'POST' + }); +} +function executeBidWonLoggerCall(auctionId, adUnitId) { + const winningBidId = cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.bidWon; + const winningBids = cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.bids[winningBidId]; + if (!winningBids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(LOG_PRE_FIX + 'Could not find winningBids for : ', auctionId); + return; + } + let winningBid = winningBids[0]; + if (winningBids.length > 1) { + winningBid = winningBids.filter(bid => bid.adId === cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.bidWonAdId)[0]; + } + const adapterName = getAdapterNameForAlias(winningBid.adapterCode || winningBid.bidder); + if (isOWPubmaticBid(adapterName) && isS2SBidder(winningBid.bidder)) { + return; + } + let origAdUnit = getAdUnit(cache.auctions[auctionId]?.origAdUnits, adUnitId) || {}; + let owAdUnitId = origAdUnit.owAdUnitId || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__.getGptSlotInfoForAdUnitCode)(adUnitId)?.gptSlot || adUnitId; + let auctionCache = cache.auctions[auctionId]; + let floorData = auctionCache?.floorData; + let wiid = cache.auctions[auctionId]?.wiid || auctionId; + let referrer = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('pageUrl') || cache.auctions[auctionId]?.referer || ''; + let adv = winningBid.bidResponse ? getAdDomain(winningBid.bidResponse) || undefined : undefined; + let fskp = floorData ? floorData.floorRequestData ? floorData.floorRequestData.skipped == false ? 0 : 1 : undefined : undefined; + let pg = window.parseFloat(Number(winningBid?.bidResponse?.adserverTargeting?.hb_pb || winningBid?.bidResponse?.adserverTargeting?.pwtpb)) || undefined; + let pixelURL = END_POINT_WIN_BID_LOGGER; + pixelURL += 'pubid=' + publisherId; + pixelURL += '&purl=' + enc(_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('pageUrl') || cache.auctions[auctionId]?.referer || ''); + pixelURL += '&tst=' + Math.round(new window.Date().getTime() / 1000); + pixelURL += '&iid=' + enc(wiid); + pixelURL += '&bidid=' + enc(winningBidId); + pixelURL += '&pid=' + enc(profileId); + pixelURL += '&pdvid=' + enc(profileVersionId); + pixelURL += '&slot=' + enc(adUnitId); + pixelURL += '&au=' + enc(owAdUnitId); + pixelURL += '&pn=' + enc(adapterName); + pixelURL += '&bc=' + enc(winningBid.bidderCode || winningBid.bidder); + pixelURL += '&en=' + enc(winningBid.bidResponse?.bidPriceUSD); + pixelURL += '&eg=' + enc(winningBid.bidResponse?.bidGrossCpmUSD); + pixelURL += '&kgpv=' + enc(getValueForKgpv(winningBid, adUnitId)); + pixelURL += '&dm=' + enc(DISPLAY_MANAGER); + pixelURL += '&dmv=' + enc("9.45.0-pre" || 0); + pixelURL += '&origbidid=' + enc(winningBid?.bidResponse?.partnerImpId || winningBid?.bidResponse?.prebidBidId || winningBid.bidId); + pixelURL += '&di=' + enc(winningBid?.bidResponse?.dealId || OPEN_AUCTION_DEAL_ID); + const ds = winningBid.bidResponse?.meta ? getMetadata(winningBid.bidResponse.meta)?.ds : undefined; + if (ds) { + pixelURL += '&ds=' + enc(ds); + } + pg && (pixelURL += '&pb=' + enc(pg)); + pixelURL += '&plt=' + enc(getDevicePlatform()); + pixelURL += '&psz=' + enc((winningBid?.bidResponse?.dimensions?.width || '0') + 'x' + (winningBid?.bidResponse?.dimensions?.height || '0')); + pixelURL += '&tgid=' + enc(getTgId()); + adv && (pixelURL += '&adv=' + enc(adv)); + pixelURL += '&orig=' + enc(getDomainFromUrl(referrer)); + pixelURL += '&ss=' + enc(isS2SBidder(winningBid.bidder)); + fskp != undefined && (pixelURL += '&fskp=' + enc(fskp)); + if (floorData) { + const floorRootValues = getFloorsCommonField(floorData.floorRequestData); + if (floorRootValues) { + const { + ffs, + fsrc, + fp, + mv + } = floorRootValues || {}; + const params = { + ffs, + fsrc, + fp, + fmv: mv + }; + Object.entries(params).forEach(_ref2 => { + let [key, value] = _ref2; + if (value !== undefined) { + pixelURL += `&${key}=${enc(value)}`; + } + }); + } + const floorType = getFloorType(floorData.floorResponseData); + if (floorType !== undefined) { + pixelURL += '&ft=' + enc(floorType); + } + const floorRuleValue = winningBid?.bidResponse?.floorData?.floorRuleValue; + floorRuleValue !== undefined && (pixelURL += '&frv=' + enc(floorRuleValue)); + const floorValue = winningBid?.bidResponse?.floorData?.floorValue; + floorValue !== undefined && (pixelURL += '&fv=' + enc(floorValue)); + } + pixelURL += '&af=' + enc(winningBid.bidResponse ? winningBid.bidResponse.mediaType || undefined : undefined); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(pixelURL, null, null, { + contentType: 'application/x-www-form-urlencoded', + withCredentials: true, + method: 'GET' + }); +} + +/// /////////// ADAPTER EVENT HANDLER FUNCTIONS ////////////// + +function auctionInitHandler(args) { + s2sBidders = function () { + let s2sConf = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('s2sConfig'); + let s2sBidders = []; + (s2sConf || []) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(s2sConf) ? s2sConf.map(conf => s2sBidders.push(...conf.bidders)) : s2sBidders.push(...s2sConf.bidders); + return s2sBidders || []; + }(); + let cacheEntry = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.pick)(args, ['timestamp', 'timeout', 'bidderDonePendingCount', () => args.bidderRequests.length]); + cacheEntry.adUnitCodes = {}; + cacheEntry.floorData = {}; + cacheEntry.origAdUnits = args.adUnits; + cacheEntry.referer = args.bidderRequests[0].refererInfo.topmostLocation; + cache.auctions[args.auctionId] = cacheEntry; +} +function bidRequestedHandler(args) { + args.bids.forEach(function (bid) { + if (!cache.auctions[args.auctionId].adUnitCodes.hasOwnProperty(bid.adUnitCode)) { + cache.auctions[args.auctionId].adUnitCodes[bid.adUnitCode] = { + bids: {}, + bidWon: false, + dimensions: bid.sizes + }; + } + if (bid.bidder === 'pubmatic' && !!bid?.params?.wiid) { + cache.auctions[args.auctionId].wiid = bid.params.wiid; + } + cache.auctions[args.auctionId].adUnitCodes[bid.adUnitCode].bids[bid.bidId] = [copyRequiredBidDetails(bid)]; + if (bid.floorData) { + cache.auctions[args.auctionId].floorData['floorRequestData'] = bid.floorData; + } + }); +} +function bidResponseHandler(args) { + if (!args.requestId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(LOG_PRE_FIX + 'Got null requestId in bidResponseHandler'); + return; + } + let requestId = args.originalRequestId || args.requestId; + let bid = cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[requestId][0]; + if (!bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_PRE_FIX + 'Could not find associated bid request for bid response with requestId: ', args.requestId); + return; + } + if (bid.bidder && args.bidderCode && bid.bidder !== args.bidderCode || bid.bidder === args.bidderCode && bid.status === SUCCESS) { + bid = copyRequiredBidDetails(args); + cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[requestId].push(bid); + } else if (args.originalRequestId) { + bid.bidId = args.requestId; + } + if (args.floorData) { + cache.auctions[args.auctionId].floorData['floorResponseData'] = args.floorData; + } + bid.adId = args.adId; + bid.source = formatSource(bid.source || args.source); + setBidStatus(bid, args); + const latency = args?.timeToRespond || Date.now() - cache.auctions[args.auctionId].timestamp; + const auctionTime = cache.auctions[args.auctionId].timeout; + // Check if latency is greater than auctiontime+150, then log auctiontime+150 to avoid large numbers + bid.partnerTimeToRespond = latency > auctionTime + 150 ? auctionTime + 150 : latency; + bid.clientLatencyTimeMs = Date.now() - cache.auctions[args.auctionId].timestamp; + bid.bidResponse = parseBidResponse(args); +} +function bidRejectedHandler(args) { + // If bid is rejected due to floors value did not met + // make cpm as 0, status as bidRejected and forward the bid for logging + if (args.rejectionReason === _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.REJECTION_REASON.FLOOR_NOT_MET) { + args.cpm = 0; + args.status = _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.BID_STATUS.BID_REJECTED; + bidResponseHandler(args); + } +} +function bidderDoneHandler(args) { + cache.auctions[args.auctionId].bidderDonePendingCount--; + args.bids.forEach(bid => { + let cachedBid = cache.auctions[bid.auctionId].adUnitCodes[bid.adUnitCode].bids[bid.bidId || bid.originalRequestId || bid.requestId]; + if (typeof bid.serverResponseTimeMs !== 'undefined') { + cachedBid.serverLatencyTimeMs = bid.serverResponseTimeMs; + } + if (!cachedBid.status) { + cachedBid.status = NO_BID; + } + if (!cachedBid.clientLatencyTimeMs) { + cachedBid.clientLatencyTimeMs = Date.now() - cache.auctions[bid.auctionId].timestamp; + } + }); +} +function bidWonHandler(args) { + let auctionCache = cache.auctions[args.auctionId]; + auctionCache.adUnitCodes[args.adUnitCode].bidWon = args.originalRequestId || args.requestId; + auctionCache.adUnitCodes[args.adUnitCode].bidWonAdId = args.adId; + executeBidWonLoggerCall(args.auctionId, args.adUnitCode); +} +function auctionEndHandler(args) { + // if for the given auction bidderDonePendingCount == 0 then execute logger call sooners + let highestCpmBids = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.getGlobal)().getHighestCpmBids() || []; + setTimeout(() => { + executeBidsLoggerCall.call(this, args, highestCpmBids); + }, cache.auctions[args.auctionId]?.bidderDonePendingCount === 0 ? 500 : SEND_TIMEOUT); +} +function bidTimeoutHandler(args) { + // db = 1 and t = 1 means bidder did NOT respond with a bid but we got a timeout notification + // db = 0 and t = 1 means bidder did respond with a bid but post timeout + args.forEach(badBid => { + let auctionCache = cache.auctions[badBid.auctionId]; + let bid = auctionCache.adUnitCodes[badBid.adUnitCode].bids[badBid.bidId || badBid.originalRequestId || badBid.requestId][0]; + if (bid) { + bid.status = ERROR; + bid.error = { + code: TIMEOUT_ERROR + }; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(LOG_PRE_FIX + 'bid not found'); + } + }); +} + +/// /////////// ADAPTER DEFINITION ////////////// + +let baseAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_7__["default"])({ + analyticsType: 'endpoint' +}); +let pubmaticAdapter = Object.assign({}, baseAdapter, { + enableAnalytics() { + let conf = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let error = false; + if (typeof conf.options === 'object') { + if (conf.options.publisherId) { + publisherId = Number(conf.options.publisherId); + } + profileId = Number(conf.options.profileId) || DEFAULT_PROFILE_ID; + profileVersionId = Number(conf.options.profileVersionId) || DEFAULT_PROFILE_VERSION_ID; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_PRE_FIX + 'Config not found.'); + error = true; + } + if (!publisherId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_PRE_FIX + 'Missing publisherId(Number).'); + error = true; + } + if (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(LOG_PRE_FIX + 'Not collecting data due to error(s).'); + } else { + baseAdapter.enableAnalytics.call(this, conf); + } + }, + disableAnalytics() { + publisherId = DEFAULT_PUBLISHER_ID; + profileId = DEFAULT_PROFILE_ID; + profileVersionId = DEFAULT_PROFILE_VERSION_ID; + s2sBidders = []; + baseAdapter.disableAnalytics.apply(this, arguments); + }, + track(_ref3) { + let { + eventType, + args + } = _ref3; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT: + auctionInitHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED: + bidRequestedHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE: + bidResponseHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REJECTED: + bidRejectedHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE: + bidderDoneHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON: + bidWonHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_END: + auctionEndHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT: + bidTimeoutHandler(args); + break; + } + } +}); + +/// /////////// ADAPTER REGISTRATION ////////////// + +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].registerAnalyticsAdapter({ + adapter: pubmaticAdapter, + code: ADAPTER_CODE +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pubmaticAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('pubmaticAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubmaticAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubmaticBidAdapter"],{ + +/***/ "./modules/pubmaticBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/pubmaticBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports cpmAdjustment, _calculateBidCpmAdjustment, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'pubmatic'; +const LOG_WARN_PREFIX = 'PubMatic: '; +const ENDPOINT = 'https://hbopenbid.pubmatic.com/translator?source=prebid-client'; +const USER_SYNC_URL_IFRAME = 'https://ads.pubmatic.com/AdServer/js/user_sync.html?kdntuid=1&p='; +const USER_SYNC_URL_IMAGE = 'https://image8.pubmatic.com/AdServer/ImgSync?p='; +const DEFAULT_CURRENCY = 'USD'; +const AUCTION_TYPE = 1; +const UNDEFINED = undefined; +const DEFAULT_WIDTH = 0; +const DEFAULT_HEIGHT = 0; +const PUBLICATION = 'pubmatic'; // Your publication on Blue Billywig, potentially with environment (e.g. publication.bbvms.com or publication.test.bbvms.com) +const RENDERER_URL = 'https://pubmatic.bbvms.com/r/'.concat('$RENDERER', '.js'); // URL of the renderer application +const MSG_VIDEO_PLCMT_MISSING = 'Video.plcmt param missing'; +const PREBID_NATIVE_DATA_KEY_VALUES = Object.values(_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB); +const DEFAULT_TTL = 360; +const CUSTOM_PARAMS = { + 'kadpageurl': '', + // Custom page url + 'gender': '', + // User gender + 'yob': '', + // User year of birth + 'lat': '', + // User location - Latitude + 'lon': '', + // User Location - Longitude + 'wiid': '' // OpenWrap Wrapper Impression ID +}; +const dealChannel = { + 1: 'PMP', + 5: 'PREF', + 6: 'PMPG' +}; +const MEDIATYPE_TTL = { + 'banner': 360, + 'video': 1800, + 'native': 1800 +}; +let conf = {}; +let blockedIabCategories = []; +let allowedIabCategories = []; +let pubId = 0; +let cpmAdjustment; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + netRevenue: true, + ttl: DEFAULT_TTL + }, + imp(buildImp, bidRequest, context) { + const { + kadfloor, + currency, + adSlot = '', + deals, + dctr, + pmzoneid, + hashedKey + } = bidRequest.params; + const { + adUnitCode, + mediaTypes, + rtd + } = bidRequest; + const imp = buildImp(bidRequest, context); + if (deals) addPMPDeals(imp, deals); + if (dctr) addDealCustomTargetings(imp, dctr); + if (rtd?.jwplayer) addJWPlayerSegmentData(imp, rtd.jwplayer); + imp.bidfloor = _parseSlotParam('kadfloor', kadfloor); + imp.bidfloorcur = currency ? _parseSlotParam('currency', currency) : DEFAULT_CURRENCY; + setFloorInImp(imp, bidRequest); + if (imp.hasOwnProperty('banner')) updateBannerImp(imp.banner, adSlot); + if (imp.hasOwnProperty('video')) updateVideoImp(imp.video, mediaTypes?.video, adUnitCode, imp); + if (imp.hasOwnProperty('native')) updateNativeImp(imp, mediaTypes?.native); + // Check if the imp object does not have banner, video, or native + if (!imp.hasOwnProperty('banner') && !imp.hasOwnProperty('video') && !imp.hasOwnProperty('native')) { + return null; + } + if (pmzoneid) imp.ext.pmZoneId = pmzoneid; + setImpTagId(imp, adSlot.trim(), hashedKey); + setImpFields(imp); + // check for battr data types + ['banner', 'video', 'native'].forEach(key => { + if (imp[key]?.battr && !Array.isArray(imp[key].battr)) { + delete imp[key].battr; + } + }); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + if (blockedIabCategories.length || request.bcat) { + const validatedBCategories = validateBlockedCategories([...(blockedIabCategories || []), ...(request.bcat || [])]); + if (validatedBCategories.length) request.bcat = validatedBCategories; + } + if (allowedIabCategories.length || request.acat) { + const validatedACategories = validateAllowedCategories([...(allowedIabCategories || []), ...(request.acat || [])]); + if (validatedACategories.length) request.acat = validatedACategories; + } + reqLevelParams(request); + updateUserSiteDevice(request, context?.bidRequests); + addExtenstionParams(request); + const marketPlaceEnabled = bidderRequest?.bidderCode ? _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_2__.bidderSettings.get(bidderRequest.bidderCode, 'allowAlternateBidderCodes') : undefined; + if (marketPlaceEnabled) updateRequestExt(request, bidderRequest); + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + if (bidResponse.meta) bidResponse.meta.mediaType = bidResponse.mediaType; + updateResponseWithCustomFields(bidResponse, bid, context); + const { + mediaType, + playerWidth, + playerHeight + } = bidResponse; + const { + params, + adUnitCode, + mediaTypes + } = context?.bidRequest; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + if (!bidResponse.width) bidResponse.width = playerWidth; + if (!bidResponse.height) bidResponse.height = playerHeight; + const { + context, + maxduration + } = mediaTypes[mediaType]; + if (context === 'outstream' && params.outstreamAU && adUnitCode) { + bidResponse.rendererCode = params.outstreamAU; + bidResponse.renderer = BB_RENDERER.newRenderer(bidResponse.rendererCode, adUnitCode); + } + assignDealTier(bidResponse, context, maxduration); + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE && bid.adm) { + try { + const adm = JSON.parse(bid.adm.replace(/\\/g, '')); + bidResponse.native = { + ortb: { + ...adm.native + } + }; + } catch (ex) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}Error: Cannot parse native response for ad response: ${bid.adm}`); + return; + } + bidResponse.width = bid.w || DEFAULT_WIDTH; + bidResponse.height = bid.h || DEFAULT_HEIGHT; + } + return bidResponse; + }, + response(buildResponse, bidResponses, ortbResponse, context) { + return buildResponse(bidResponses, ortbResponse, context); + }, + overrides: { + imp: { + bidfloor: false, + extBidfloor: false + }, + bidResponse: { + native: false + } + } +}); +function _calculateBidCpmAdjustment(bid) { + if (!bid) return; + const { + originalCurrency, + currency, + cpm, + originalCpm, + meta + } = bid; + const convertedCpm = originalCurrency !== currency && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(bid.getCpmInNewCurrency) ? bid.getCpmInNewCurrency(originalCurrency) : cpm; + const mediaType = bid.mediaType; + const metaMediaType = meta?.mediaType; + cpmAdjustment = cpmAdjustment || { + currency, + originalCurrency, + adjustment: [] + }; + const adjustmentValue = Number(((originalCpm - convertedCpm) / originalCpm).toFixed(2)); + const adjustmentEntry = { + cpmAdjustment: adjustmentValue, + mediaType, + metaMediaType, + cpm: convertedCpm, + originalCpm + }; + const existingIndex = cpmAdjustment?.adjustment?.findIndex(entry => entry?.mediaType === mediaType && entry?.metaMediaType === metaMediaType); + existingIndex !== -1 ? cpmAdjustment.adjustment.splice(existingIndex, 1, adjustmentEntry) : cpmAdjustment.adjustment.push(adjustmentEntry); +} +const handleImageProperties = asset => { + const imgProps = {}; + if (asset.aspect_ratios && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(asset.aspect_ratios) && asset.aspect_ratios.length) { + const { + min_width: minWidth, + min_height: minHeight + } = asset.aspect_ratios[0]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isInteger)(minWidth) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isInteger)(minHeight)) { + imgProps.wmin = minWidth; + imgProps.hmin = minHeight; + } + // eslint-disable-next-line camelcase + imgProps.ext = { + aspectratios: asset.aspect_ratios.filter(_ref => { + let { + ratio_width, + ratio_height + } = _ref; + return ratio_width && ratio_height; + }).map(_ref2 => { + let { + ratio_width, + ratio_height + } = _ref2; + return `${ratio_width}:${ratio_height}`; + }) + }; + } + imgProps.w = asset.w || asset.width; + imgProps.h = asset.h || asset.height; + if (asset.sizes && asset.sizes.length === 2 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isInteger)(asset.sizes[0]) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isInteger)(asset.sizes[1])) { + imgProps.w = asset.sizes[0]; + imgProps.h = asset.sizes[1]; + delete imgProps.wmin; + delete imgProps.hmin; + } + asset.ext && (imgProps.ext = asset.ext); + asset.mimes && (imgProps.mimes = asset.mimes); + return imgProps; +}; +const toOrtbNativeRequest = legacyNativeAssets => { + const ortb = { + ver: '1.2', + assets: [] + }; + for (let key in legacyNativeAssets) { + if (_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS_THAT_ARE_NOT_ASSETS.includes(key)) continue; + if (!_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_KEYS.hasOwnProperty(key) && !PREBID_NATIVE_DATA_KEY_VALUES.includes(key)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}: Unrecognized asset: ${key}. Ignored.`); + continue; + } + const asset = legacyNativeAssets[key]; + const required = asset.required && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isBoolean)(asset.required) ? 1 : 0; + const ortbAsset = { + id: ortb.assets.length, + required + }; + if (key in _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB) { + ortbAsset.data = { + type: _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_ASSET_TYPES[_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]], + ...(asset.len && { + len: asset.len + }), + ...(asset.ext && { + ext: asset.ext + }) + }; + } else if (key === 'icon' || key === 'image') { + ortbAsset.img = { + type: key === 'icon' ? _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.ICON : _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE_IMAGE_TYPES.MAIN, + ...handleImageProperties(asset) + }; + } else if (key === 'title') { + ortbAsset.title = { + len: asset.len || 140, + ...(asset.ext && { + ext: asset.ext + }) + }; + } else if (key === 'ext') { + ortbAsset.ext = asset; + delete ortbAsset.required; + } + ortb.assets.push(ortbAsset); + } + return ortb; +}; +const setImpFields = imp => { + imp.displaymanager ||= 'Prebid.js'; + imp.displaymanagerver ||= "9.45.0-pre"; + const gptAdSlot = imp.ext?.data?.adserver?.adslot; + if (gptAdSlot) imp.ext.dfp_ad_unit_code = gptAdSlot; + // Delete ext.data in case of no-adserver + if (imp.ext?.data && Object.keys(imp.ext.data).length === 0) delete imp.ext.data; +}; +function removeGranularFloor(imp, mediaTypes) { + mediaTypes.forEach(mt => { + if (imp[mt]?.ext && imp[mt].ext.bidfloor === imp.bidfloor && imp[mt].ext.bidfloorcur === imp.bidfloorcur) { + delete imp[mt].ext; + } + }); +} +const setFloorInImp = (imp, bid) => { + let bidFloor = -1; + let requestedMediatypes = Object.keys(bid.mediaTypes); + let isMultiFormatRequest = requestedMediatypes.length > 1; + if (typeof bid.getFloor === 'function' && !_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('pubmatic.disableFloors')) { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE].forEach(mediaType => { + if (!imp.hasOwnProperty(mediaType)) return; + const sizes = (mediaType === 'banner' ? imp[mediaType]?.format?.map(_ref3 => { + let { + w, + h + } = _ref3; + return [w, h]; + }) : ['*']) || ['*']; + sizes.forEach(size => { + const floorInfo = bid.getFloor({ + currency: imp.bidfloorcur, + mediaType, + size + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_WARN_PREFIX, 'floor from floor module returned for mediatype:', mediaType, ' and size:', size, ' is: currency', floorInfo.currency, 'floor', floorInfo.floor); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(floorInfo) && floorInfo?.currency === imp.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) { + const mediaTypeFloor = parseFloat(floorInfo.floor); + if (isMultiFormatRequest && mediaType !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_WARN_PREFIX, 'floor from floor module returned for mediatype:', mediaType, 'is : ', mediaTypeFloor, 'with currency :', imp.bidfloorcur); + imp[mediaType]['ext'] = { + 'bidfloor': mediaTypeFloor, + 'bidfloorcur': imp.bidfloorcur + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_WARN_PREFIX, 'floor from floor module:', mediaTypeFloor, 'previous floor value', bidFloor, 'Min:', Math.min(mediaTypeFloor, bidFloor)); + bidFloor = bidFloor === -1 ? mediaTypeFloor : Math.min(mediaTypeFloor, bidFloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_WARN_PREFIX, 'new floor value:', bidFloor); + } + }); + if (isMultiFormatRequest && mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + imp[mediaType]['ext'] = { + 'bidfloor': bidFloor, + 'bidfloorcur': imp.bidfloorcur + }; + } + }); + } + // Determine the highest value between imp.bidfloor and the floor from the floor module. + // Since we're using Math.max, it's safe if no floor is returned from the floor module, as bidFloor defaults to -1. + if (imp.bidfloor) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_WARN_PREFIX, 'Comparing floors:', 'from floor module:', bidFloor, 'impObj.bidfloor:', imp.bidfloor, 'Max:', Math.max(bidFloor, imp.bidfloor)); + bidFloor = Math.max(bidFloor, imp.bidfloor); + } + + // Set imp.bidfloor only if bidFloor is greater than 0. + imp.bidfloor = bidFloor > 0 ? bidFloor : UNDEFINED; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_WARN_PREFIX, 'Updated imp.bidfloor:', imp.bidfloor); + // remove granular floor if impression level floor is same as granular + if (isMultiFormatRequest) removeGranularFloor(imp, requestedMediatypes); +}; +const updateBannerImp = (bannerObj, adSlot) => { + let slot = adSlot.split(':'); + let splits = slot[0]?.split('@'); + splits = splits?.length == 2 ? splits[1].split('x') : splits.length == 3 ? splits[2].split('x') : []; + const primarySize = bannerObj.format[0]; + if (splits.length !== 2 || parseInt(splits[0]) == 0 && parseInt(splits[1]) == 0) { + bannerObj.w = primarySize.w; + bannerObj.h = primarySize.h; + } else { + bannerObj.w = parseInt(splits[0]); + bannerObj.h = parseInt(splits[1]); + } + bannerObj.format = bannerObj.format.filter(item => !(item.w === bannerObj.w && item.h === bannerObj.h)); + bannerObj.pos ??= 0; +}; +const setImpTagId = (imp, adSlot, hashedKey) => { + const splits = adSlot.split(':')[0].split('@'); + imp.tagid = hashedKey || splits[0]; +}; +const updateNativeImp = (imp, nativeParams) => { + if (!nativeParams?.ortb) { + imp.native.request = JSON.stringify(toOrtbNativeRequest(nativeParams)); + } + if (nativeParams?.ortb) { + let nativeConfig = JSON.parse(imp.native.request); + const { + assets + } = nativeConfig; + if (!assets?.some(asset => asset.title || asset.img || asset.data || asset.video)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}: Native assets object is empty or contains invalid objects`); + delete imp.native; + } else { + imp.native.request = JSON.stringify({ + ver: '1.2', + ...nativeConfig + }); + } + } +}; +const updateVideoImp = (videoImp, videoParams, adUnitCode, imp) => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(videoParams, 'plcmt')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(MSG_VIDEO_PLCMT_MISSING + ' for ' + adUnitCode); + } + ; + if (!videoParams || !videoImp.w && !videoImp.h) { + delete imp.video; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}Error: Missing ${!videoParams ? 'video config params' : 'video size params (playersize or w&h)'} for adunit: ${adUnitCode} with mediaType set as video. Ignoring video impression in the adunit.`); + } +}; +const addJWPlayerSegmentData = (imp, jwplayer) => { + const jwSegData = jwplayer?.targeting; + if (!jwSegData || !jwSegData.segments?.length) return; + const jwMark = 'jw-'; + const contentId = `${jwMark}id=${jwSegData.content.id}`; + const segmentData = jwSegData.segments.map(segment => `${jwMark}${segment}=1`).join('|'); + const jwPlayerData = `${contentId}|${segmentData}`; + imp.ext = imp.ext || {}; + imp.ext.key_val = imp.ext.key_val ? `${imp.ext.key_val}|${jwPlayerData}` : jwPlayerData; +}; +const addDealCustomTargetings = (imp, dctr) => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isStr)(dctr) && dctr.length > 0) { + const arr = dctr.split('|').filter(val => val.trim().length > 0); + dctr = arr.map(val => val.trim()).join('|'); + imp.ext['key_val'] = dctr; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(LOG_WARN_PREFIX + 'Ignoring param : dctr with value : ' + dctr + ', expects string-value, found empty or non-string value'); + } +}; +const addPMPDeals = (imp, deals) => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(deals)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}Error: bid.params.deals should be an array of strings.`); + return; + } + deals.forEach(deal => { + if (typeof deal === 'string' && deal.length > 3) { + if (!imp.pmp) { + imp.pmp = { + private_auction: 0, + deals: [] + }; + } + imp.pmp.deals.push({ + id: deal + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}Error: deal-id present in array bid.params.deals should be a string with more than 3 characters length, deal-id ignored: ${deal}`); + } + }); +}; +const updateRequestExt = (req, bidderRequest) => { + const allBiddersList = ['all']; + let allowedBiddersList = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_2__.bidderSettings.get(bidderRequest.bidderCode, 'allowedAlternateBidderCodes'); + const biddersList = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(allowedBiddersList) ? allowedBiddersList.map(val => val.trim().toLowerCase()).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.uniques) : allBiddersList; + req.ext.marketplace = { + allowedbidders: biddersList.includes('*') || biddersList.includes('all') ? allBiddersList : [...new Set(['pubmatic', ...biddersList.filter(val => val && val.trim())])] + }; +}; +const reqLevelParams = req => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(req, 'at', AUCTION_TYPE); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__.dset)(req, 'cur', [DEFAULT_CURRENCY]); + req.test = window.location.href.includes('pubmaticTest=true') ? 1 : undefined; + if (req.source && !Object.keys(req.source).length) delete req.source; + if (req.app?.publisher) req.app.publisher.id = pubId; +}; +const updateUserSiteDevice = (req, bidRequest) => { + const { + gender, + yob, + pubId, + refURL, + kadpageurl + } = conf; + const { + user + } = req; + if (req.device) { + Object.assign(req.device, { + js: 1, + connectiontype: getConnectionType() + }); + } + req.user = { + ...req.user, + gender: user?.gender || gender?.trim() || UNDEFINED, + yob: user?.yob || _parseSlotParam('yob', yob) + }; + + // start - IH eids for Prebid + const userIdAsEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, '0.userIdAsEids'); + if (bidRequest.length && userIdAsEids?.length && !req.user.ext?.eids) { + req.user.ext = req.user.ext || {}; + req.user.ext.eids = userIdAsEids; + } // end - IH eids for Prebid + + if (req.site?.publisher) { + req.site.ref = req.site.ref || refURL; + req.site.publisher.id = pubId?.trim(); + } + // if kadpageurl present then update site.page url with kadpageurl + if (req.site?.page && kadpageurl) req.site.page = kadpageurl.trim(); + // Check if geo information is present in device or user object + if (req.device.geo && !req.user.geo) { + req.user.geo = req.device.geo; + } else if (req.user.geo && !req.device.geo) { + req.device.geo = req.user.geo; + } +}; +const updateResponseWithCustomFields = (res, bid, ctx) => { + const { + ortbRequest, + seatbid + } = ctx; + res.referrer = ortbRequest.site?.ref || ''; + res.sspID = res.partnerImpId = bid.id || ''; + res.ad = bid.adm; + res.pm_dspid = bid.ext?.dspid ? bid.ext.dspid : null; + res.pm_seat = seatbid.seat; + if (!res.creativeId) res.creativeId = bid.id; + if (res.ttl == DEFAULT_TTL) res.ttl = MEDIATYPE_TTL[res.mediaType]; + if (bid.dealid) { + res.dealChannel = bid.ext?.deal_channel ? dealChannel[bid.ext.deal_channel] || null : 'PMP'; + } + if (seatbid.ext?.buyid) { + res.adserverTargeting = { + 'hb_buyid_pubmatic': seatbid.ext.buyid + }; + } + if (bid.ext?.marketplace) { + res.bidderCode = bid.ext.marketplace; + } + + // add meta fields + // NOTE: We will not recieve below fields from the translator response also not sure on what will be the key names for these in the response, + // when we needed we can add it back. + // New fields added, assignee fields name may change + // if (bid.ext.networkName) res.meta.networkName = bid.ext.networkName; + // if (bid.ext.advertiserName) res.meta.advertiserName = bid.ext.advertiserName; + // if (bid.ext.agencyName) res.meta.agencyName = bid.ext.agencyName; + // if (bid.ext.brandName) res.meta.brandName = bid.ext.brandName; + if (bid.ext) { + const { + dspid, + dchain, + dsa, + ibv + } = bid.ext; + if (dspid) res.meta.networkId = res.meta.demandSource = dspid; + if (dchain) res.meta.dchain = dchain; + if (dsa && Object.keys(dsa).length) res.meta.dsa = dsa; + if (ibv) { + res.ext = res.ext || {}; + res.ext['ibv'] = ibv; + res.meta.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + } + } + const advid = seatbid.seat || bid.ext?.advid; + if (advid) res.meta.advertiserId = res.meta.agencyId = res.meta.buyerId = advid; + if (isNonEmptyArray(bid.adomain)) { + res.meta.clickUrl = res.meta.brandId = bid.adomain[0]; + } +}; +const addExtenstionParams = req => { + const { + profId, + verId, + wiid, + transactionId + } = conf; + req.ext = { + epoch: new Date().getTime(), + // Sending epoch timestamp in request.ext object + wrapper: { + profile: profId ? parseInt(profId) : undefined, + version: verId ? parseInt(verId) : undefined, + wiid: wiid, + wv: "prebid_prebid_9.45.0-pre", + transactionId, + wp: 'pbjs' + }, + cpmAdjustment: cpmAdjustment + }; +}; + +/** + * In case of adpod video context, assign prebiddealpriority to the dealtier property of adpod-video bid, + * so that adpod module can set the hb_pb_cat_dur targetting key. + * @param {*} bid + * @param {*} context + * @param {*} maxduration + * @returns + */ +const assignDealTier = (bid, context, maxduration) => { + if (!bid?.ext?.prebiddealpriority || !true) return; + if (context != _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.ADPOD) return; + const duration = bid?.ext?.video?.duration || maxduration; + // if (!duration) return; + bid.video = { + context: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.ADPOD, + durationSeconds: duration, + dealTier: bid.ext.prebiddealpriority + }; +}; +const validateAllowedCategories = acat => { + return [...new Set(acat.filter(item => { + if (typeof item === 'string') { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(LOG_WARN_PREFIX + 'acat: Each category should be a string, ignoring category: ' + item); + } + }).map(item => item.trim()))]; +}; +const validateBlockedCategories = bcats => { + bcats = bcats.map(item => typeof item === 'string' ? item.trim() : item); + const droppedCategories = bcats.filter(item => typeof item !== 'string' || item.length < 3); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(LOG_WARN_PREFIX + 'bcat: Each category must be a string with a length greater than 3, ignoring ' + droppedCategories); + return [...new Set(bcats.filter(item => typeof item === 'string' && item.length >= 3))]; +}; +const getConnectionType = () => { + let connection = window.navigator && (window.navigator.connection || window.navigator.mozConnection || window.navigator.webkitConnection); + const types = { + ethernet: 1, + wifi: 2, + 'slow-2g': 4, + '2g': 4, + '3g': 5, + '4g': 6 + }; + return types[connection?.effectiveType] || 0; +}; + +// BB stands for Blue BillyWig +const BB_RENDERER = { + bootstrapPlayer: function (bid) { + const config = { + code: bid.adUnitCode, + vastXml: bid.vastXml || null, + vastUrl: bid.vastUrl || null + }; + if (!config.vastXml && !config.vastUrl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}: No vastXml or vastUrl on bid, bailing...`); + return; + } + const rendererId = BB_RENDERER.getRendererId(PUBLICATION, bid.rendererCode); + const ele = document.getElementById(bid.adUnitCode); // NB convention + + const renderer = window.bluebillywig.renderers.find(r => r._id === rendererId); + if (renderer) renderer.bootstrap(config, ele);else (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}: Couldn't find a renderer with ${rendererId}`); + }, + newRenderer: function (rendererCode, adUnitCode) { + const rendererUrl = RENDERER_URL.replace('$RENDERER', rendererCode); + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_8__.Renderer.install({ + url: rendererUrl, + loaded: false, + adUnitCode + }); + try { + renderer.setRender(BB_RENDERER.outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}: Error tying to setRender on renderer`, err); + } + return renderer; + }, + outstreamRender: function (bid) { + bid.renderer.push(() => BB_RENDERER.bootstrapPlayer(bid)); + }, + getRendererId: function (pub, renderer) { + return `${pub}-${renderer}`; // NB convention! + } +}; +function _parseSlotParam(paramName, paramValue) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isStr)(paramValue)) { + paramValue && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(LOG_WARN_PREFIX + 'Ignoring param key: ' + paramName + ', expects string-value, found ' + typeof paramValue); + return UNDEFINED; + } + const parsers = { + pmzoneid: () => paramValue.split(',').slice(0, 50).map(id => id.trim()).join(), + kadfloor: () => parseFloat(paramValue), + lat: () => parseFloat(paramValue), + lon: () => parseFloat(paramValue), + yob: () => parseInt(paramValue) + }; + return parsers[paramName]?.() || paramValue; +} +function isNonEmptyArray(test) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(test) === true) { + if (test.length > 0) { + return true; + } + } + return false; +} +const getPublisherId = bids => Array.isArray(bids) && bids.length > 0 ? bids.find(bid => bid.params?.publisherId?.trim())?.params.publisherId || null : null; +const _handleCustomParams = (params, conf) => { + Object.keys(CUSTOM_PARAMS).forEach(key => { + const value = params[key]; + if (value) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isStr)(value)) { + conf[key] = value; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}Ignoring param: ${key} with value: ${CUSTOM_PARAMS[key]}, expects string value, found ${typeof value}`); + } + } + }); + return conf; +}; +const spec = { + code: BIDDER_CODE, + gvlid: 76, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE], + /** + * Determines whether or not the given bid request is valid. Valid bid request must have placementId and hbid + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + if (!(bid && bid.params)) return false; + const { + publisherId + } = bid.params; + const mediaTypes = bid.mediaTypes || {}; + const videoMediaTypes = mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO] || {}; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isStr)(publisherId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(LOG_WARN_PREFIX + 'Error: publisherId is mandatory and cannot be numeric (wrap it in quotes in your config). Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(bid)); + return false; + } + if ( true && mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO)) { + // bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array + const mediaTypesVideoMimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.video.mimes'); + const paramsVideoMimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.video.mimes'); + if (!isNonEmptyArray(mediaTypesVideoMimes) && !isNonEmptyArray(paramsVideoMimes)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(LOG_WARN_PREFIX + 'Error: For video ads, bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(bid)); + return false; + } + if (!videoMediaTypes.context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${LOG_WARN_PREFIX}: No context specified in bid. Rejecting bid: `, bid); + return false; + } + if (videoMediaTypes.context === 'outstream' && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isStr)(bid.params.outstreamAU) && !bid.renderer && !videoMediaTypes.renderer) { + if (mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) || mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE)) { + delete mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${LOG_WARN_PREFIX}: for "outstream" bids either outstreamAU parameter must be provided or ad unit supplied renderer is required. Rejecting mediatype Video of bid: `, bid); + return true; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`${LOG_WARN_PREFIX}: for "outstream" bids either outstreamAU parameter must be provided or ad unit supplied renderer is required. Rejecting bid: `, bid); + return false; + } + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: (validBidRequests, bidderRequest) => { + const { + page, + ref + } = bidderRequest?.refererInfo || {}; + const { + publisherId, + profId, + verId + } = bidderRequest?.bids?.[0]?.params || {}; + pubId = publisherId?.trim() || getPublisherId(bidderRequest?.bids)?.trim(); + const wiid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.generateUUID)(); + let bid; + blockedIabCategories = []; + allowedIabCategories = []; + conf = { + pageURL: page || window.location.href, + refURL: ref || window.document.referrer, + pubId, + kadpageurl: page || window.location.href, + profId: profId, + verId: verId + }; + validBidRequests.forEach(originalBid => { + originalBid.params.wiid = originalBid.params.wiid || bidderRequest.auctionId || wiid; + bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(originalBid); + _handleCustomParams(bid.params, conf); + conf.transactionId = bid.ortb2Imp?.ext?.tid; + const { + bcat, + acat + } = bid.params; + if (bcat) { + blockedIabCategories = blockedIabCategories.concat(bcat); + } + if (acat) { + allowedIabCategories = allowedIabCategories.concat(acat); + } + }); + const data = converter.toORTB({ + validBidRequests, + bidderRequest + }); + let serverRequest = { + method: 'POST', + url: ENDPOINT, + data: data, + bidderRequest: bidderRequest, + options: { + endpointCompression: true + } + }; + return data?.imp?.length ? serverRequest : null; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} response A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (response, request) => { + const { + bids + } = converter.fromORTB({ + response: response.body, + request: request.data + }); + const fledgeAuctionConfigs = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(response.body, 'ext.fledge_auction_configs'); + if (fledgeAuctionConfigs) { + return { + bids, + paapi: Object.entries(fledgeAuctionConfigs).map(_ref4 => { + let [bidId, cfg] = _ref4; + return { + bidId, + config: { + auctionSignals: {}, + ...cfg + } + }; + }) + }; + } + return bids; + }, + /** + * Register User Sync. + */ + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent, gppConsent) => { + let syncurl = pubId; + + // Attaching GDPR Consent Params in UserSync url + if (gdprConsent) { + syncurl += `&gdpr=${gdprConsent.gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(gdprConsent.consentString || '')}`; + } + + // CCPA + if (uspConsent) { + syncurl += `&us_privacy=${encodeURIComponent(uspConsent)}`; + } + + // GPP Consent + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + syncurl += `&gpp=${encodeURIComponent(gppConsent.gppString)}&gpp_sid=${encodeURIComponent(gppConsent.applicableSections.join(','))}`; + } + + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('coppa') === true) { + syncurl += '&coppa=1'; + } + const type = syncOptions.iframeEnabled ? 'iframe' : 'image'; + const url = (type === 'iframe' ? USER_SYNC_URL_IFRAME : USER_SYNC_URL_IMAGE) + syncurl; + return [{ + type, + url + }]; + }, + onBidWon: bid => { + _calculateBidCpmAdjustment(bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('pubmaticBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubmaticBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubmaticIdSystem"],{ + +/***/ "./modules/pubmaticIdSystem.js": +/*!*************************************!*\ + !*** ./modules/pubmaticIdSystem.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports STORAGE_NAME, storage, pubmaticIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); + + + + + + + +const MODULE_NAME = 'pubmaticId'; +const GVLID = 76; +const STORAGE_NAME = 'pubmaticId'; +const STORAGE_EXPIRES = 30; // days +const STORAGE_REFRESH_IN_SECONDS = 24 * 3600; // 24 Hours +const LOG_PREFIX = 'PubMatic User ID: '; +const VERSION = '1'; +const API_URL = 'https://image6.pubmatic.com/AdServer/UCookieSetPug?oid=5&p='; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function generateQueryStringParams(config, consentData) { + const uspString = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.uspDataHandler.getConsentData(); + const coppaValue = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.coppaDataHandler.getCoppa(); + const gppConsent = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData(); + const params = { + publisherId: config.params.publisherId, + gdpr: consentData && consentData?.gdprApplies ? 1 : 0, + gdpr_consent: consentData && consentData?.consentString ? encodeURIComponent(consentData.consentString) : '', + src: 'pbjs_uid', + ver: VERSION, + coppa: Number(coppaValue), + us_privacy: uspString ? encodeURIComponent(uspString) : '', + gpp: gppConsent?.gppString ? encodeURIComponent(gppConsent.gppString) : '', + gpp_sid: gppConsent?.applicableSections?.length ? encodeURIComponent(gppConsent.applicableSections.join(',')) : '' + }; + return params; +} +function buildUrl(config, consentData) { + let baseUrl = `${API_URL}${config.params.publisherId}`; + const params = generateQueryStringParams(config, consentData); + Object.keys(params).forEach(key => { + baseUrl += `&${key}=${params[key]}`; + }); + return baseUrl; +} +function deleteFromAllStorages(key) { + const cKeys = [key, `${key}_cst`, `${key}_last`, `${key}_exp`]; + cKeys.forEach(cKey => { + if (storage.getCookie(cKey)) { + storage.setCookie(cKey, '', new Date(0).toUTCString()); + } + }); + const lsKeys = [key, `${key}_cst`, `${key}_last`, `${key}_exp`]; + lsKeys.forEach(lsKey => { + if (storage.getDataFromLocalStorage(lsKey)) { + storage.removeDataFromLocalStorage(lsKey); + } + }); +} +function getSuccessAndErrorHandler(callback) { + return { + success: response => { + let responseObj; + try { + responseObj = JSON.parse(response); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(LOG_PREFIX + 'response received from the server', responseObj); + } catch (error) {} + if (responseObj && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(responseObj.id) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr)(responseObj.id)) { + callback(responseObj); + } else { + deleteFromAllStorages(STORAGE_NAME); + callback(); + } + }, + error: error => { + deleteFromAllStorages(STORAGE_NAME); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX + 'getId fetch encountered an error', error); + callback(); + } + }; +} +function hasRequiredConfig(config) { + if (!config || !config.storage || !config.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX + 'config.storage and config.params should be passed.'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(config.params.publisherId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX + 'config.params.publisherId (int) should be provided.'); + return false; + } + if (config.storage.name !== STORAGE_NAME) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX + `config.storage.name should be '${STORAGE_NAME}'.`); + return false; + } + if (config.storage.expires !== STORAGE_EXPIRES) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX + `config.storage.expires should be ${STORAGE_EXPIRES}.`); + return false; + } + if (config.storage.refreshInSeconds !== STORAGE_REFRESH_IN_SECONDS) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(LOG_PREFIX + `config.storage.refreshInSeconds should be ${STORAGE_REFRESH_IN_SECONDS}.`); + return false; + } + return true; +} +const pubmaticIdSubmodule = { + name: MODULE_NAME, + gvlid: GVLID, + decode(value) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(value.id) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmptyStr)(value.id)) { + return { + pubmaticId: value.id + }; + } + return undefined; + }, + getId(config, consentData) { + if (!hasRequiredConfig(config)) { + return undefined; + } + const resp = callback => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(LOG_PREFIX + 'requesting an ID from the server'); + const url = buildUrl(config, consentData); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(url, getSuccessAndErrorHandler(callback), null, { + method: 'GET', + withCredentials: true + }); + }; + return { + callback: resp + }; + }, + eids: { + 'pubmaticId': { + source: 'esp.pubmatic.com', + atype: 1, + getValue: data => { + return data; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('userId', pubmaticIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('pubmaticIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubmaticIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubmaticRtdProvider"],{ + +/***/ "./modules/priceFloors.js": +/*!********************************!*\ + !*** ./modules/priceFloors.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ continueAuction: () => (/* binding */ continueAuction), +/* harmony export */ createFloorsDataForAuction: () => (/* binding */ createFloorsDataForAuction) +/* harmony export */ }); +/* unused harmony exports FLOOR_SKIPPED_REASON, allowedFields, _floorDataForAuction, fieldMatchingFunctions, getFirstMatchingFloor, getBiddersCpmAdjustment, calculateAdjustedFloor, getFloor, getFloorsDataForAuction, getFloorDataFromAdUnits, updateAdUnitsForAuction, pickRandomModel, normalizeDefault, isFloorsDataValid, parseFloorData, requestBidsHook, handleFetchResponse, generateAndHandleFetch, handleSetFloorsConfig, addBidResponseHook, setOrtbImpBidFloor, setGranularBidfloors, setImpExtPrebidFloors, setOrtbExtPrebidFloors */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_utils_cpm_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/utils/cpm.js */ "./src/utils/cpm.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../libraries/currencyUtils/currency.js */ "./libraries/currencyUtils/currency.js"); +/* harmony import */ var _libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/timeoutQueue/timeoutQueue.js */ "./libraries/timeoutQueue/timeoutQueue.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + + + + + + + + + + + + + + +const FLOOR_SKIPPED_REASON = { + NOT_FOUND: 'not_found', + RANDOM: 'random' +}; + +/** + * @summary This Module is intended to provide users with the ability to dynamically set and enforce price floors on a per auction basis. + */ +const MODULE_NAME = 'Price Floors'; + +/** + * @summary Instantiate Ajax so we control the timeout + */ +const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder)(10000); + +// eslint-disable-next-line symbol-description +const SYN_FIELD = Symbol(); + +/** + * @summary Allowed fields for rules to have + */ +let allowedFields = [SYN_FIELD, 'gptSlot', 'adUnitCode', 'size', 'domain', 'mediaType']; + +/** + * @summary This is a flag to indicate if a AJAX call is processing for a floors request + */ +let fetching = false; + +/** + * @summary so we only register for our hooks once + */ +let addedFloorsHook = false; + +/** + * @summary The config to be used. Can be updated via: setConfig or a real time fetch + */ +let _floorsConfig = {}; + +/** + * @summary If a auction is to be delayed by an ongoing fetch we hold it here until it can be resumed + */ +const _delayedAuctions = (0,_libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__.timeoutQueue)(); + +/** + * @summary Each auction can have differing floors data depending on execution time or per adunit setup + * So we will be saving each auction offset by it's auctionId in order to make sure data is not changed + * Once the auction commences + */ +let _floorDataForAuction = {}; + +/** + * @summary Simple function to round up to a certain decimal degree + */ +function roundUp(number, precision) { + return Math.ceil((parseFloat(number) * Math.pow(10, precision)).toFixed(1)) / Math.pow(10, precision); +} +const getHostname = (() => { + let domain; + return function () { + if (domain == null) { + domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().topmostLocation, { + noDecodeWholeURL: true + }).hostname; + } + return domain; + }; +})(); + +// First look into bidRequest! +function getGptSlotFromAdUnit(adUnitId) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const adUnit = index.getAdUnit({ + adUnitId + }); + const isGam = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(adUnit, 'ortb2Imp.ext.data.adserver.name') === 'gam'; + return isGam && adUnit.ortb2Imp.ext.data.adserver.adslot; +} +function getAdUnitCode(request, response) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return request?.adUnitCode || index.getAdUnit(response).code; +} + +/** + * @summary floor field types with their matching functions to resolve the actual matched value + */ +let fieldMatchingFunctions = { + [SYN_FIELD]: () => '*', + 'size': (bidRequest, bidResponse) => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArray)(bidResponse.size) || '*', + 'mediaType': (bidRequest, bidResponse) => bidResponse.mediaType || 'banner', + 'gptSlot': (bidRequest, bidResponse) => getGptSlotFromAdUnit((bidRequest || bidResponse).adUnitId) || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.getGptSlotInfoForAdUnitCode)(getAdUnitCode(bidRequest, bidResponse)).gptSlot, + 'domain': getHostname, + 'adUnitCode': (bidRequest, bidResponse) => getAdUnitCode(bidRequest, bidResponse) +}; + +/** + * @summary Based on the fields array in floors data, it enumerates all possible matches based on exact match coupled with + * a "*" catch-all match + * Returns array of Tuple [exact match, catch all] for each field in rules file + */ +function enumeratePossibleFieldValues(floorFields, bidObject, responseObject) { + if (!floorFields.length) return []; + // generate combination of all exact matches and catch all for each field type + return floorFields.reduce((accum, field) => { + let exactMatch = fieldMatchingFunctions[field](bidObject, responseObject) || '*'; + // storing exact matches as lowerCase since we want to compare case insensitively + accum.push(exactMatch === '*' ? ['*'] : [exactMatch.toLowerCase(), '*']); + return accum; + }, []); +} + +/** + * @summary get's the first matching floor based on context provided. + * Generates all possible rule matches and picks the first matching one. + */ +function getFirstMatchingFloor(floorData, bidObject) { + let responseObject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let fieldValues = enumeratePossibleFieldValues((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'schema.fields') || [], bidObject, responseObject); + if (!fieldValues.length) { + return { + matchingFloor: undefined + }; + } + + // look to see if a request for this context was made already + let matchingInput = fieldValues.map(field => field[0]).join('-'); + // if we already have gotten the matching rule from this matching input then use it! No need to look again + let previousMatch = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, `matchingInputs.${matchingInput}`); + if (previousMatch) { + return { + ...previousMatch + }; + } + let allPossibleMatches = generatePossibleEnumerations(fieldValues, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'schema.delimiter') || '|'); + let matchingRule = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.find)(allPossibleMatches, hashValue => floorData.values.hasOwnProperty(hashValue)); + let matchingData = { + floorMin: floorData.floorMin || 0, + floorRuleValue: floorData.values[matchingRule], + matchingData: allPossibleMatches[0], + // the first possible match is an "exact" so contains all data relevant for anlaytics adapters + matchingRule: matchingRule === floorData.meta?.defaultRule ? undefined : matchingRule + }; + // use adUnit floorMin as priority! + const floorMin = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidObject, 'ortb2Imp.ext.prebid.floors.floorMin'); + if (typeof floorMin === 'number') { + matchingData.floorMin = floorMin; + } + matchingData.matchingFloor = Math.max(matchingData.floorMin, matchingData.floorRuleValue); + // save for later lookup if needed + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(floorData, `matchingInputs.${matchingInput}`, { + ...matchingData + }); + return matchingData; +} + +/** + * @summary Generates all possible rule hash's based on input array of array's + * The generated list is of all possible key matches based on fields input + * The list is sorted by least amount of * in rule to most with left most fields taking precedence + */ +function generatePossibleEnumerations(arrayOfFields, delimiter) { + return arrayOfFields.reduce((accum, currentVal) => { + let ret = []; + accum.map(obj => { + currentVal.map(obj1 => { + ret.push(obj + delimiter + obj1); + }); + }); + return ret; + }).sort((left, right) => left.split('*').length - right.split('*').length); +} + +/** + * @summary If a the input bidder has a registered cpmadjustment it returns the input CPM after being adjusted + */ +function getBiddersCpmAdjustment(inputCpm, bid, bidRequest) { + return parseFloat((0,_src_utils_cpm_js__WEBPACK_IMPORTED_MODULE_9__.adjustCpm)(inputCpm, { + ...bid, + cpm: inputCpm + }, bidRequest)); +} + +/** + * @summary This function takes the original floor and the adjusted floor in order to determine the bidders actual floor + * With js rounding errors with decimal division we utilize similar method as shown in cpmBucketManager.js + */ +function calculateAdjustedFloor(oldFloor, newFloor) { + const pow = Math.pow(10, 10); + return oldFloor * pow / (newFloor * pow) * (oldFloor * pow) / pow; +} + +/** + * @summary gets the prebid set sizes depending on the input mediaType + */ +const getMediaTypesSizes = { + banner: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.banner.sizes') || [], + video: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.playerSize') || [], + native: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.image.sizes') ? [(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.image.sizes')] : [] +}; + +/** + * @summary for getFloor only, before selecting a rule, if a bidAdapter asks for * in their getFloor params + * Then we may be able to get a better rule than the * ones depending on context of the adUnit + */ +function updateRequestParamsFromContext(bidRequest, requestParams) { + // if adapter asks for *'s then we can do some logic to infer if we can get a more specific rule based on context of bid + let mediaTypesOnBid = Object.keys(bidRequest.mediaTypes || {}); + // if there is only one mediaType then we can just use it + if (requestParams.mediaType === '*' && mediaTypesOnBid.length === 1) { + requestParams.mediaType = mediaTypesOnBid[0]; + } + // if they asked for * size, but for the given mediaType there is only one size, we can just use it + if (requestParams.size === '*' && mediaTypesOnBid.indexOf(requestParams.mediaType) !== -1 && getMediaTypesSizes[requestParams.mediaType] && getMediaTypesSizes[requestParams.mediaType](bidRequest).length === 1) { + requestParams.size = getMediaTypesSizes[requestParams.mediaType](bidRequest)[0]; + } + return requestParams; +} + +/** + * @summary This is the function which will return a single floor based on the input requests + * and matching it to a rule for the current auction + */ +function getFloor() { + let requestParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + currency: 'USD', + mediaType: '*', + size: '*' + }; + let bidRequest = this; + let floorData = _floorDataForAuction[bidRequest.auctionId]; + if (!floorData || floorData.skipped) return {}; + requestParams = updateRequestParamsFromContext(bidRequest, requestParams); + let floorInfo = getFirstMatchingFloor(floorData.data, { + ...bidRequest + }, { + mediaType: requestParams.mediaType, + size: requestParams.size + }); + let currency = requestParams.currency || floorData.data.currency; + + // if bidder asked for a currency which is not what floors are set in convert + if (floorInfo.matchingFloor && currency !== floorData.data.currency) { + try { + floorInfo.matchingFloor = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency(floorInfo.matchingFloor, floorData.data.currency, currency); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Unable to get currency conversion for getFloor for bidder ${bidRequest.bidder}. You must have currency module enabled with defaultRates in your currency config`); + // since we were unable to convert to the bidders requested currency, we send back just the actual floors currency to them + currency = floorData.data.currency; + } + } + + // if cpmAdjustment flag is true and we have a valid floor then run the adjustment on it + if (floorData.enforcement.bidAdjustment && floorInfo.matchingFloor) { + // pub provided inverse function takes precedence, otherwise do old adjustment stuff + const inverseFunction = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_11__.bidderSettings.get(bidRequest.bidder, 'inverseBidAdjustment'); + if (inverseFunction) { + const definedParams = Object.fromEntries(Object.entries(requestParams).filter(_ref => { + let [key, val] = _ref; + return val !== '*' && ['mediaType', 'size'].includes(key); + })); + floorInfo.matchingFloor = inverseFunction(floorInfo.matchingFloor, bidRequest, definedParams); + } else { + let cpmAdjustment = getBiddersCpmAdjustment(floorInfo.matchingFloor, null, bidRequest); + floorInfo.matchingFloor = cpmAdjustment ? calculateAdjustedFloor(floorInfo.matchingFloor, cpmAdjustment) : floorInfo.matchingFloor; + } + } + if (floorInfo.floorRuleValue === null) { + return null; + } + if (floorInfo.matchingFloor) { + return { + floor: roundUp(floorInfo.matchingFloor, 4), + currency + }; + } + return {}; +} + +/** + * @summary Takes a floorsData object and converts it into a hash map with appropriate keys + */ +function getFloorsDataForAuction(floorData, adUnitCode) { + let auctionFloorData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(floorData); + auctionFloorData.schema.delimiter = floorData.schema.delimiter || '|'; + auctionFloorData.values = normalizeRulesForAuction(auctionFloorData, adUnitCode); + // default the currency to USD if not passed in + auctionFloorData.currency = auctionFloorData.currency || 'USD'; + return auctionFloorData; +} + +/** + * @summary if adUnitCode needs to be added to the offset then it will add it else just return the values + */ +function normalizeRulesForAuction(floorData, adUnitCode) { + let fields = floorData.schema.fields; + let delimiter = floorData.schema.delimiter; + + // if we are building the floor data form an ad unit, we need to append adUnit code as to not cause collisions + let prependAdUnitCode = adUnitCode && fields.indexOf('adUnitCode') === -1 && fields.unshift('adUnitCode'); + return Object.keys(floorData.values).reduce((rulesHash, oldKey) => { + let newKey = prependAdUnitCode ? `${adUnitCode}${delimiter}${oldKey}` : oldKey; + // we store the rule keys as lower case for case insensitive compare + rulesHash[newKey.toLowerCase()] = floorData.values[oldKey]; + return rulesHash; + }, {}); +} + +/** + * @summary This function will take the adUnits and generate a floor data object to be used during the auction + * Only called if no set config or fetch level data has returned + */ +function getFloorDataFromAdUnits(adUnits) { + const schemaAu = adUnits.find(au => au.floors?.schema != null); + return adUnits.reduce((accum, adUnit) => { + if (adUnit.floors?.schema != null && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(adUnit.floors.schema, schemaAu?.floors?.schema)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: adUnit '${adUnit.code}' declares a different schema from one previously declared by adUnit '${schemaAu.code}'. Floor config for '${adUnit.code}' will be ignored.`); + return accum; + } + const floors = Object.assign({}, schemaAu?.floors, { + values: undefined + }, adUnit.floors); + if (isFloorsDataValid(floors)) { + // if values already exist we want to not overwrite them + if (!accum.values) { + accum = getFloorsDataForAuction(floors, adUnit.code); + accum.location = 'adUnit'; + } else { + let newRules = getFloorsDataForAuction(floors, adUnit.code).values; + // copy over the new rules into our values object + Object.assign(accum.values, newRules); + } + } else if (adUnit.floors != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`adUnit '${adUnit.code}' provides an invalid \`floor\` definition, it will be ignored for floor calculations`, adUnit); + } + return accum; + }, {}); +} +function getNoFloorSignalBidersArray(floorData) { + const { + data, + enforcement + } = floorData; + // The data.noFloorSignalBidders higher priority then the enforcment + if (data?.noFloorSignalBidders?.length > 0) { + return data.noFloorSignalBidders; + } else if (enforcement?.noFloorSignalBidders?.length > 0) { + return enforcement.noFloorSignalBidders; + } + return []; +} + +/** + * @summary This function takes the adUnits for the auction and update them accordingly as well as returns the rules hashmap for the auction + */ +function updateAdUnitsForAuction(adUnits, floorData, auctionId) { + const noFloorSignalBiddersArray = getNoFloorSignalBidersArray(floorData); + adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + // check if the bidder is in the no signal list + const isNoFloorSignaled = noFloorSignalBiddersArray.some(bidderName => bidderName === bid.bidder); + if (floorData.skipped || isNoFloorSignaled) { + isNoFloorSignaled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`noFloorSignal to ${bid.bidder}`); + delete bid.getFloor; + } else { + bid.getFloor = getFloor; + } + // information for bid and analytics adapters + bid.auctionId = auctionId; + bid.floorData = { + noFloorSignaled: isNoFloorSignaled, + skipped: floorData.skipped, + skipRate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.skipRate') ?? floorData.skipRate, + skippedReason: floorData.skippedReason, + floorMin: floorData.floorMin, + modelVersion: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelVersion'), + modelWeight: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelWeight'), + modelTimestamp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelTimestamp'), + location: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.location', 'noData'), + floorProvider: floorData.floorProvider, + fetchStatus: _floorsConfig.fetchStatus + }; + }); + }); +} +function pickRandomModel(modelGroups, weightSum) { + // we loop through the models subtracting the current model weight from our random number + // once we are at or below zero, we return the associated model + let random = Math.floor(Math.random() * weightSum + 1); + for (let i = 0; i < modelGroups.length; i++) { + random -= modelGroups[i].modelWeight; + if (random <= 0) { + return modelGroups[i]; + } + } +} +; + +/** + * @summary Updates the adUnits accordingly and returns the necessary floorsData for the current auction + */ +function createFloorsDataForAuction(adUnits, auctionId) { + let resolvedFloorsData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(_floorsConfig); + // if using schema 2 pick a model here: + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.floorsSchemaVersion') === 2) { + // merge the models specific stuff into the top level data settings (now it looks like floorsSchemaVersion 1!) + let { + modelGroups, + ...rest + } = resolvedFloorsData.data; + resolvedFloorsData.data = Object.assign(rest, pickRandomModel(modelGroups, rest.modelWeightSum)); + } + + // if we do not have a floors data set, we will try to use data set on adUnits + let useAdUnitData = Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.values') || {}).length === 0; + if (useAdUnitData) { + resolvedFloorsData.data = getFloorDataFromAdUnits(adUnits); + } else { + resolvedFloorsData.data = getFloorsDataForAuction(resolvedFloorsData.data); + } + // if we still do not have a valid floor data then floors is not on for this auction, so skip + if (Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.values') || {}).length === 0) { + resolvedFloorsData.skipped = true; + resolvedFloorsData.skippedReason = FLOOR_SKIPPED_REASON.NOT_FOUND; + } else { + // determine the skip rate now + const auctionSkipRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getParameterByName)('pbjs_skipRate') || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.skipRate') ?? resolvedFloorsData.skipRate); + const isSkipped = Math.random() * 100 < parseFloat(auctionSkipRate); + resolvedFloorsData.skipped = isSkipped; + if (isSkipped) resolvedFloorsData.skippedReason = FLOOR_SKIPPED_REASON.RANDOM; + } + // copy FloorMin to floorData.data + if (resolvedFloorsData.hasOwnProperty('floorMin')) resolvedFloorsData.data.floorMin = resolvedFloorsData.floorMin; + // add floorData to bids + updateAdUnitsForAuction(adUnits, resolvedFloorsData, auctionId); + return resolvedFloorsData; +} + +/** + * @summary This is the function which will be called to exit our module and continue the auction. + */ +function continueAuction(hookConfig) { + if (!hookConfig.hasExited) { + // We need to know the auctionId at this time. So we will use the passed in one or generate and set it ourselves + hookConfig.reqBidsConfigObj.auctionId = hookConfig.reqBidsConfigObj.auctionId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + // now we do what we need to with adUnits and save the data object to be used for getFloor and enforcement calls + _floorDataForAuction[hookConfig.reqBidsConfigObj.auctionId] = createFloorsDataForAuction(hookConfig.reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().adUnits, hookConfig.reqBidsConfigObj.auctionId); + hookConfig.nextFn.apply(hookConfig.context, [hookConfig.reqBidsConfigObj]); + hookConfig.hasExited = true; + } +} +function validateSchemaFields(fields) { + if (Array.isArray(fields) && fields.length > 0) { + if (fields.every(field => allowedFields.includes(field))) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Fields received do not match allowed fields`); + } + } + return false; +} +function isValidRule(key, floor, numFields, delimiter) { + if (typeof key !== 'string' || key.split(delimiter).length !== numFields) { + return false; + } + return typeof floor === 'number' || floor === null; +} +function validateRules(floorsData, numFields, delimiter) { + if (typeof floorsData.values !== 'object') { + return false; + } + // if an invalid rule exists we remove it + floorsData.values = Object.keys(floorsData.values).reduce((filteredRules, key) => { + if (isValidRule(key, floorsData.values[key], numFields, delimiter)) { + filteredRules[key] = floorsData.values[key]; + } + return filteredRules; + }, {}); + // rules is only valid if at least one rule remains + return Object.keys(floorsData.values).length > 0; +} +function normalizeDefault(model) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(model.default)) { + let defaultRule = '*'; + const numFields = (model.schema?.fields || []).length; + if (!numFields) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(model, 'schema.fields', [SYN_FIELD]); + } else { + defaultRule = Array(numFields).fill('*').join(model.schema?.delimiter || '|'); + } + model.values = model.values || {}; + if (model.values[defaultRule] == null) { + model.values[defaultRule] = model.default; + model.meta = { + defaultRule + }; + } + } + return model; +} +function modelIsValid(model) { + model = normalizeDefault(model); + // schema.fields has only allowed attributes + if (!validateSchemaFields((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(model, 'schema.fields'))) { + return false; + } + return validateRules(model, model.schema.fields.length, model.schema.delimiter || '|'); +} + +/** + * @summary Mapping of floor schema version to it's corresponding validation + */ +const floorsSchemaValidation = { + 1: data => modelIsValid(data), + 2: data => { + // model groups should be an array with at least one element + if (!Array.isArray(data.modelGroups) || data.modelGroups.length === 0) { + return false; + } + // every model should have valid schema, as well as an accompanying modelWeight + data.modelWeightSum = 0; + return data.modelGroups.every(model => { + if (typeof model.modelWeight === 'number' && modelIsValid(model)) { + data.modelWeightSum += model.modelWeight; + return true; + } + return false; + }); + } +}; + +/** + * @summary Fields array should have at least one entry and all should match allowed fields + * Each rule in the values array should have a 'key' and 'floor' param + * And each 'key' should have the correct number of 'fields' after splitting + * on the delim. If rule does not match remove it. return if still at least 1 rule + */ +function isFloorsDataValid(floorsData) { + if (typeof floorsData !== 'object') { + return false; + } + floorsData.floorsSchemaVersion = floorsData.floorsSchemaVersion || 1; + if (typeof floorsSchemaValidation[floorsData.floorsSchemaVersion] !== 'function') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Unknown floorsSchemaVersion: `, floorsData.floorsSchemaVersion); + return false; + } + return floorsSchemaValidation[floorsData.floorsSchemaVersion](floorsData); +} + +/** + * @summary This function updates the global Floors Data field based on the new one passed in if it is valid + */ +function parseFloorData(floorsData, location) { + if (floorsData && typeof floorsData === 'object' && isFloorsDataValid(floorsData)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE_NAME}: A ${location} set the auction floor data set to `, floorsData); + return { + ...floorsData, + location + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: The floors data did not contain correct values`, floorsData); +} + +/** + * + * @param {Object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + * @param {function} fn required; The next function in the chain, used by hook.js + */ +const requestBidsHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__.timedAuctionHook)('priceFloors', function requestBidsHook(fn, reqBidsConfigObj) { + // preserves all module related variables for the current auction instance (used primiarily for concurrent auctions) + const hookConfig = { + reqBidsConfigObj, + context: this, + nextFn: fn, + hasExited: false, + timer: null + }; + + // If auction delay > 0 AND we are fetching -> Then wait until it finishes + if (_floorsConfig.auctionDelay > 0 && fetching) { + _delayedAuctions.submit(_floorsConfig.auctionDelay, () => continueAuction(hookConfig), () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Fetch attempt did not return in time for auction`); + _floorsConfig.fetchStatus = 'timeout'; + continueAuction(hookConfig); + }); + } else { + continueAuction(hookConfig); + } +}); + +/** + * This function handles the ajax response which comes from the user set URL to fetch floors data from + * @param {object} fetchResponse The floors data response which came back from the url configured in config.floors + */ +function handleFetchResponse(fetchResponse) { + fetching = false; + _floorsConfig.fetchStatus = 'success'; + let floorResponse; + try { + floorResponse = JSON.parse(fetchResponse); + } catch (ex) { + floorResponse = fetchResponse; + } + // Update the global floors object according to the fetched data + const fetchData = parseFloorData(floorResponse, 'fetch'); + if (fetchData) { + // set .data to it + _floorsConfig.data = fetchData; + // set skipRate override if necessary + _floorsConfig.skipRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(fetchData.skipRate) ? fetchData.skipRate : _floorsConfig.skipRate; + _floorsConfig.floorProvider = fetchData.floorProvider || _floorsConfig.floorProvider; + } + + // if any auctions are waiting for fetch to finish, we need to continue them! + _delayedAuctions.resume(); +} +function handleFetchError(status) { + fetching = false; + _floorsConfig.fetchStatus = 'error'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Fetch errored with: `, status); + + // if any auctions are waiting for fetch to finish, we need to continue them! + _delayedAuctions.resume(); +} + +/** + * This function handles sending and receiving the AJAX call for a floors fetch + * @param {object} floorEndpoint the floors config coming from setConfig + */ +function generateAndHandleFetch(floorEndpoint) { + // if a fetch url is defined and one is not already occuring, fire it! + if (floorEndpoint.url && !fetching) { + // default to GET and we only support GET for now + let requestMethod = floorEndpoint.method || 'GET'; + if (requestMethod !== 'GET') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: 'GET' is the only request method supported at this time!`); + } else { + ajax(floorEndpoint.url, { + success: handleFetchResponse, + error: handleFetchError + }, null, { + method: 'GET' + }); + fetching = true; + } + } else if (fetching) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: A fetch is already occuring. Skipping.`); + } +} + +/** + * @summary Updates our allowedFields and fieldMatchingFunctions with the publisher defined new ones + */ +function addFieldOverrides(overrides) { + Object.keys(overrides).forEach(override => { + // we only add it if it is not already in the allowed fields and if the passed in value is a function + if (allowedFields.indexOf(override) === -1 && typeof overrides[override] === 'function') { + allowedFields.push(override); + fieldMatchingFunctions[override] = overrides[override]; + } + }); +} + +/** + * @summary This is the function which controls what happens during a pbjs.setConfig({...floors: {}}) is called + */ +function handleSetFloorsConfig(config) { + _floorsConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(config, ['floorMin', 'enabled', enabled => enabled !== false, + // defaults to true + 'auctionDelay', auctionDelay => auctionDelay || 0, 'floorProvider', floorProvider => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(config, 'data.floorProvider', floorProvider), 'endpoint', endpoint => endpoint || {}, 'skipRate', () => !isNaN((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(config, 'data.skipRate')) ? config.data.skipRate : config.skipRate || 0, 'enforcement', enforcement => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(enforcement || {}, ['enforceJS', enforceJS => enforceJS !== false, + // defaults to true + 'enforcePBS', enforcePBS => enforcePBS === true, + // defaults to false + 'floorDeals', floorDeals => floorDeals === true, + // defaults to false + 'bidAdjustment', bidAdjustment => bidAdjustment !== false, + // defaults to true, + 'noFloorSignalBidders', noFloorSignalBidders => noFloorSignalBidders || []]), 'additionalSchemaFields', additionalSchemaFields => typeof additionalSchemaFields === 'object' && Object.keys(additionalSchemaFields).length > 0 ? addFieldOverrides(additionalSchemaFields) : undefined, 'data', data => data && parseFloorData(data, 'setConfig') || undefined]); + + // if enabled then do some stuff + if (_floorsConfig.enabled) { + // handle the floors fetch + generateAndHandleFetch(_floorsConfig.endpoint); + if (!addedFloorsHook) { + // register hooks / listening events + // when auction finishes remove it's associated floor data after 3 seconds so we stil have it for latent responses + _src_events_js__WEBPACK_IMPORTED_MODULE_13__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.EVENTS.AUCTION_END, args => { + setTimeout(() => delete _floorDataForAuction[args.auctionId], 3000); + }); + + // we want our hooks to run after the currency hooks + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().requestBids.before(requestBidsHook, 50); + // if user has debug on then we want to allow the debugging module to run before this, assuming they are testing priceFloors + // debugging is currently set at 5 priority + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_15__.getHook)('addBidResponse').before(addBidResponseHook, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.debugTurnedOn)() ? 4 : 50); + addedFloorsHook = true; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE_NAME}: Turning off module`); + _floorsConfig = {}; + _floorDataForAuction = {}; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_15__.getHook)('addBidResponse').getHooks({ + hook: addBidResponseHook + }).remove(); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().requestBids.getHooks({ + hook: requestBidsHook + }).remove(); + addedFloorsHook = false; + } +} + +/** + * @summary Analytics adapters especially need context of what the floors module is doing in order + * to best create informed models. This function attaches necessary information to the bidResponse object for processing + */ +function addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm) { + bid.floorData = { + floorValue: floorInfo.matchingFloor, + floorRule: floorInfo.matchingRule, + floorRuleValue: floorInfo.floorRuleValue, + floorCurrency: floorData.data.currency, + cpmAfterAdjustments: adjustedCpm, + enforcements: { + ...floorData.enforcement + }, + matchedFields: {} + }; + floorData.data.schema.fields.forEach((field, index) => { + let matchedValue = floorInfo.matchingData.split(floorData.data.schema.delimiter)[index]; + bid.floorData.matchedFields[field] = matchedValue; + }); +} + +/** + * @summary takes the enforcement flags and the bid itself and determines if it should be floored + */ +function shouldFloorBid(floorData, floorInfo, bid) { + let enforceJS = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'enforcement.enforceJS') !== false; + let shouldFloorDeal = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'enforcement.floorDeals') === true || !bid.dealId; + let bidBelowFloor = bid.floorData.cpmAfterAdjustments < floorInfo.matchingFloor; + return enforceJS && bidBelowFloor && shouldFloorDeal; +} + +/** + * @summary The main driving force of floors. On bidResponse we hook in and intercept bidResponses. + * And if the rule we find determines a bid should be floored we will do so. + */ +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__.timedBidResponseHook)('priceFloors', function addBidResponseHook(fn, adUnitCode, bid, reject) { + let floorData = _floorDataForAuction[bid.auctionId]; + // if no floor data then bail + if (!floorData || !bid || floorData.skipped) { + return fn.call(this, adUnitCode, bid, reject); + } + const matchingBidRequest = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index.getBidRequest(bid); + + // get the matching rule + let floorInfo = getFirstMatchingFloor(floorData.data, matchingBidRequest, { + ...bid, + size: [bid.width, bid.height] + }); + if (!floorInfo.matchingFloor) { + if (floorInfo.matchingFloor !== 0) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: unable to determine a matching price floor for bidResponse`, bid); + return fn.call(this, adUnitCode, bid, reject); + } + + // determine the base cpm to use based on if the currency matches the floor currency + let adjustedCpm; + let floorCurrency = floorData.data.currency.toUpperCase(); + let bidResponseCurrency = bid.currency || 'USD'; // if an adapter does not set a bid currency and currency module not on it may come in as undefined + if (floorCurrency === bidResponseCurrency.toUpperCase()) { + adjustedCpm = bid.cpm; + } else if (bid.originalCurrency && floorCurrency === bid.originalCurrency.toUpperCase()) { + adjustedCpm = bid.originalCpm; + } else { + try { + adjustedCpm = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency(bid.cpm, bidResponseCurrency.toUpperCase(), floorCurrency); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Unable do get currency conversion for bidResponse to Floor Currency. Do you have Currency module enabled? ${bid}`); + return fn.call(this, adUnitCode, bid, reject); + } + } + + // ok we got the bid response cpm in our desired currency. Now we need to run the bidders CPMAdjustment function if it exists + adjustedCpm = getBiddersCpmAdjustment(adjustedCpm, bid, matchingBidRequest); + + // add necessary data information for analytics adapters / floor providers would possibly need + addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm); + + // now do the compare! + if (shouldFloorBid(floorData, floorInfo, bid)) { + // bid fails floor -> throw it out + reject(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.REJECTION_REASON.FLOOR_NOT_MET); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: ${bid.bidderCode}'s Bid Response for ${adUnitCode} was rejected due to floor not met (adjusted cpm: ${bid?.floorData?.cpmAfterAdjustments}, floor: ${floorInfo?.matchingFloor})`, bid); + return; + } + return fn.call(this, adUnitCode, bid, reject); +}); +_src_config_js__WEBPACK_IMPORTED_MODULE_16__.config.getConfig('floors', config => handleSetFloorsConfig(config.floors)); +function tryGetFloor(bidRequest, _ref2, fn) { + let { + currency = _src_config_js__WEBPACK_IMPORTED_MODULE_16__.config.getConfig('currency.adServerCurrency') || 'USD', + mediaType = '*', + size = '*' + } = _ref2; + if (typeof bidRequest.getFloor === 'function') { + let floor; + try { + floor = bidRequest.getFloor({ + currency, + mediaType, + size + }) || {}; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Cannot compute floor for bid', bidRequest); + return; + } + floor.floor = parseFloat(floor.floor); + if (floor.currency != null && floor.floor && !isNaN(floor.floor)) { + fn(floor.floor, floor.currency); + } + } +} + +/** + * Sets bidfloor and bidfloorcur for ORTB imp objects + */ +function setOrtbImpBidFloor(imp, bidRequest, context) { + tryGetFloor(bidRequest, { + currency: context.currency, + mediaType: context.mediaType || '*', + size: '*' + }, (bidfloor, bidfloorcur) => { + Object.assign(imp, { + bidfloor, + bidfloorcur + }); + }); +} + +/** + * Set per-mediatype and per-format bidfloor + */ +function setGranularBidfloors(imp, bidRequest, context) { + function setIfDifferent(bidfloor, bidfloorcur) { + if (bidfloor !== imp.bidfloor || bidfloorcur !== imp.bidfloorcur) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(this, 'ext.bidfloor', bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(this, 'ext.bidfloorcur', bidfloorcur); + } + } + Object.values(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.ALL_MEDIATYPES).filter(mediaType => imp[mediaType] != null).forEach(mediaType => { + tryGetFloor(bidRequest, { + currency: imp.bidfloorcur || context?.currency, + mediaType + }, setIfDifferent.bind(imp[mediaType])); + }); + (imp[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.BANNER]?.format || []).filter(_ref3 => { + let { + w, + h + } = _ref3; + return w != null && h != null; + }).forEach(format => { + tryGetFloor(bidRequest, { + currency: imp.bidfloorcur || context?.currency, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.BANNER, + size: [format.w, format.h] + }, setIfDifferent.bind(format)); + }); +} +function setImpExtPrebidFloors(imp, bidRequest, context) { + // logic below relates to https://github.com/prebid/Prebid.js/issues/8749 and does the following: + // 1. check client-side floors (ref bidfloor/bidfloorcur & ortb2Imp floorMin/floorMinCur (if present)) + // 2. set pbs req wide floorMinCur to the first floor currency found when iterating over imp's + // (if currency conversion logic present, convert all imp floor values to this currency) + // 3. compare/store ref to lowest floorMin value as each imp is iterated over + // 4. set req wide floorMin and floorMinCur values for pbs after iterations are done + + if (imp.bidfloor != null) { + let { + floorMinCur, + floorMin + } = context.reqContext.floorMin || {}; + if (floorMinCur == null) { + floorMinCur = imp.bidfloorcur; + } + const ortb2ImpFloorCur = imp.ext?.prebid?.floors?.floorMinCur || imp.ext?.prebid?.floorMinCur || floorMinCur; + const ortb2ImpFloorMin = imp.ext?.prebid?.floors?.floorMin || imp.ext?.prebid?.floorMin; + const convertedFloorMinValue = (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__.convertCurrency)(imp.bidfloor, imp.bidfloorcur, floorMinCur); + const convertedOrtb2ImpFloorMinValue = ortb2ImpFloorMin && ortb2ImpFloorCur ? (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__.convertCurrency)(ortb2ImpFloorMin, ortb2ImpFloorCur, floorMinCur) : false; + const lowestImpFloorMin = convertedOrtb2ImpFloorMinValue && convertedOrtb2ImpFloorMinValue < convertedFloorMinValue ? convertedOrtb2ImpFloorMinValue : convertedFloorMinValue; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, 'ext.prebid.floors.floorMin', lowestImpFloorMin); + if (floorMin == null || floorMin > lowestImpFloorMin) { + floorMin = lowestImpFloorMin; + } + context.reqContext.floorMin = { + floorMin, + floorMinCur + }; + } +} + +/** + * PBS specific extension: set ext.prebid.floors.enabled = false if floors are processed client-side + */ +function setOrtbExtPrebidFloors(ortbRequest, bidderRequest, context) { + if (addedFloorsHook) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(ortbRequest, 'ext.prebid.floors.enabled', ortbRequest.ext?.prebid?.floors?.enabled || false); + } + if (context?.floorMin) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ortbRequest, { + ext: { + prebid: { + floors: context.floorMin + } + } + }); + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'bidfloor', + fn: setOrtbImpBidFloor +}); +// granular floors should be set after both "normal" bidfloors and mediaypes +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'extBidfloor', + fn: setGranularBidfloors, + priority: -10 +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'extPrebidFloors', + fn: setImpExtPrebidFloors, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.PBS], + priority: -1 +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.REQUEST, + name: 'extPrebidFloors', + fn: setOrtbExtPrebidFloors, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.PBS] +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('priceFloors'); + +/***/ }), + +/***/ "./modules/pubmaticRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/pubmaticRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports defaultValueTemplate, configMerged, _country, withTimeout, getCurrentTimeOfDay, getBrowserType, getOs, getDeviceType, getCountry, getUtm, getFloorsConfig, fetchData, pubmaticSubmodule, registerSubModule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/userAgentUtils/index.js */ "./libraries/userAgentUtils/index.js"); +/* harmony import */ var _src_fpd_sua_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/fpd/sua.js */ "./src/fpd/sua.js"); +/* harmony import */ var _priceFloors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./priceFloors.js */ "./modules/priceFloors.js"); + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** + * This RTD module has a dependency on the priceFloors module. + * We utilize the continueAuction function from the priceFloors module to incorporate price floors data into the current auction. + */ + // eslint-disable-line prebid/validate-imports + +const CONSTANTS = Object.freeze({ + SUBMODULE_NAME: 'pubmatic', + REAL_TIME_MODULE: 'realTimeData', + LOG_PRE_FIX: 'PubMatic-Rtd-Provider: ', + UTM: 'utm_', + UTM_VALUES: { + TRUE: '1', + FALSE: '0' + }, + TIME_OF_DAY_VALUES: { + MORNING: 'morning', + AFTERNOON: 'afternoon', + EVENING: 'evening', + NIGHT: 'night' + }, + ENDPOINTS: { + BASEURL: 'https://ads.pubmatic.com/AdServer/js/pwt', + FLOORS: 'floors.json', + CONFIGS: 'config.json' + } +}); +const BROWSER_REGEX_MAP = [{ + regex: /\b(?:crios)\/([\w\.]+)/i, + id: 1 +}, +// Chrome for iOS +{ + regex: /(edg|edge)(?:e|ios|a)?(?:\/([\w\.]+))?/i, + id: 2 +}, +// Edge +{ + regex: /(opera|opr)(?:.+version\/|[\/ ]+)([\w\.]+)/i, + id: 3 +}, +// Opera +{ + regex: /(?:ms|\()(ie) ([\w\.]+)|(?:trident\/[\w\.]+)/i, + id: 4 +}, +// Internet Explorer +{ + regex: /fxios\/([-\w\.]+)/i, + id: 5 +}, +// Firefox for iOS +{ + regex: /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i, + id: 6 +}, +// Facebook In-App Browser +{ + regex: / wv\).+(chrome)\/([\w\.]+)/i, + id: 7 +}, +// Chrome WebView +{ + regex: /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i, + id: 8 +}, +// Android Browser +{ + regex: /(chrome|crios)(?:\/v?([\w\.]+))?\b/i, + id: 9 +}, +// Chrome +{ + regex: /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i, + id: 10 +}, +// Safari Mobile +{ + regex: /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i, + id: 11 +}, +// Safari +{ + regex: /(firefox)\/([\w\.]+)/i, + id: 12 +} // Firefox +]; +const defaultValueTemplate = { + currency: 'USD', + skipRate: 0, + schema: { + fields: ['mediaType', 'size'] + } +}; +let initTime; +let _fetchFloorRulesPromise = null; +let _fetchConfigPromise = null; +let configMerged; +// configMerged is a reference to the function that can resolve configMergedPromise whenever we want +let configMergedPromise = new Promise(resolve => { + configMerged = resolve; +}); +let _country; + +// Waits for a given promise to resolve within a timeout +function withTimeout(promise, ms) { + let timeout; + const timeoutPromise = new Promise(resolve => { + timeout = setTimeout(() => resolve(undefined), ms); + }); + return Promise.race([promise.finally(() => clearTimeout(timeout)), timeoutPromise]); +} + +// Utility Functions +const getCurrentTimeOfDay = () => { + const currentHour = new Date().getHours(); + return currentHour < 5 ? CONSTANTS.TIME_OF_DAY_VALUES.NIGHT : currentHour < 12 ? CONSTANTS.TIME_OF_DAY_VALUES.MORNING : currentHour < 17 ? CONSTANTS.TIME_OF_DAY_VALUES.AFTERNOON : currentHour < 19 ? CONSTANTS.TIME_OF_DAY_VALUES.EVENING : CONSTANTS.TIME_OF_DAY_VALUES.NIGHT; +}; +const getBrowserType = () => { + const brandName = (0,_src_fpd_sua_js__WEBPACK_IMPORTED_MODULE_1__.getLowEntropySUA)()?.browsers?.map(b => b.brand.toLowerCase()).join(' ') || ''; + const browserMatch = brandName ? BROWSER_REGEX_MAP.find(_ref => { + let { + regex + } = _ref; + return regex.test(brandName); + }) : -1; + if (browserMatch?.id) return browserMatch.id.toString(); + const userAgent = navigator?.userAgent; + let browserIndex = userAgent == null ? -1 : 0; + if (userAgent) { + browserIndex = BROWSER_REGEX_MAP.find(_ref2 => { + let { + regex + } = _ref2; + return regex.test(userAgent); + })?.id || 0; + } + return browserIndex.toString(); +}; + +// Getter Functions +const getOs = () => (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_2__.getOS)().toString(); +const getDeviceType = () => (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_2__.getDeviceType)().toString(); +const getCountry = () => _country; +const getUtm = () => { + const url = new URL(window.location?.href); + const urlParams = new URLSearchParams(url?.search); + return urlParams && urlParams.toString().includes(CONSTANTS.UTM) ? CONSTANTS.UTM_VALUES.TRUE : CONSTANTS.UTM_VALUES.FALSE; +}; +const getFloorsConfig = (floorsData, profileConfigs) => { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(profileConfigs) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(profileConfigs)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${CONSTANTS.LOG_PRE_FIX} profileConfigs is not an object or is empty`); + return undefined; + } + + // Floor configs from adunit / setconfig + const defaultFloorConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('floors') ?? {}; + if (defaultFloorConfig?.endpoint) { + delete defaultFloorConfig.endpoint; + } + // Plugin data from profile + const dynamicFloors = profileConfigs?.plugins?.dynamicFloors; + + // If plugin disabled or config not present, return undefined + if (!dynamicFloors?.enabled || !dynamicFloors?.config) { + return undefined; + } + let config = { + ...dynamicFloors.config + }; + + // default values provided by publisher on profile + const defaultValues = config.defaultValues ?? {}; + // If floorsData is not present, use default values + const finalFloorsData = floorsData ?? { + ...defaultValueTemplate, + values: { + ...defaultValues + } + }; + delete config.defaultValues; + // If skiprate is provided in configs, overwrite the value in finalFloorsData + config.skipRate !== undefined && (finalFloorsData.skipRate = config.skipRate); + + // merge default configs from page, configs + return { + floors: { + ...defaultFloorConfig, + ...config, + data: finalFloorsData, + additionalSchemaFields: { + deviceType: getDeviceType, + timeOfDay: getCurrentTimeOfDay, + browser: getBrowserType, + os: getOs, + utm: getUtm, + country: getCountry + } + } + }; +}; +const fetchData = async (publisherId, profileId, type) => { + try { + const endpoint = CONSTANTS.ENDPOINTS[type]; + const baseURL = type == 'FLOORS' ? `${CONSTANTS.ENDPOINTS.BASEURL}/floors` : CONSTANTS.ENDPOINTS.BASEURL; + const url = `${baseURL}/${publisherId}/${profileId}/${endpoint}`; + const response = await fetch(url); + if (!response.ok) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${CONSTANTS.LOG_PRE_FIX} Error while fetching ${type}: Not ok`); + return; + } + if (type === "FLOORS") { + const cc = response.headers?.get('country_code'); + _country = cc ? cc.split(',')?.map(code => code.trim())[0] : undefined; + } + return await response.json(); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${CONSTANTS.LOG_PRE_FIX} Error while fetching ${type}:`, error); + } +}; + +/** + * Initialize the Pubmatic RTD Module. + * @param {Object} config + * @param {Object} _userConsent + * @returns {boolean} + */ +const init = (config, _userConsent) => { + initTime = Date.now(); // Capture the initialization time + const { + publisherId, + profileId + } = config?.params || {}; + if (!publisherId || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(publisherId) || !profileId || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(profileId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${CONSTANTS.LOG_PRE_FIX} ${!publisherId ? 'Missing publisher Id.' : !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(publisherId) ? 'Publisher Id should be a string.' : !profileId ? 'Missing profile Id.' : 'Profile Id should be a string.'}`); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(_priceFloors_js__WEBPACK_IMPORTED_MODULE_0__.continueAuction)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(`${CONSTANTS.LOG_PRE_FIX} continueAuction is not a function. Please ensure to add priceFloors module.`); + return false; + } + _fetchFloorRulesPromise = fetchData(publisherId, profileId, "FLOORS"); + _fetchConfigPromise = fetchData(publisherId, profileId, "CONFIGS"); + _fetchConfigPromise.then(async profileConfigs => { + const auctionDelay = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('realTimeData').auctionDelay; + const maxWaitTime = 0.8 * auctionDelay; + const elapsedTime = Date.now() - initTime; + const remainingTime = Math.max(maxWaitTime - elapsedTime, 0); + const floorsData = await withTimeout(_fetchFloorRulesPromise, remainingTime); + const floorsConfig = getFloorsConfig(floorsData, profileConfigs); + floorsConfig && _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.setConfig(floorsConfig); + configMerged(); + }); + return true; +}; + +/** + * @param {Object} reqBidsConfigObj + * @param {function} callback + */ +const getBidRequestData = (reqBidsConfigObj, callback) => { + configMergedPromise.then(() => { + const hookConfig = { + reqBidsConfigObj, + context: undefined, + nextFn: () => true, + haveExited: false, + timer: null + }; + (0,_priceFloors_js__WEBPACK_IMPORTED_MODULE_0__.continueAuction)(hookConfig); + if (_country) { + const ortb2 = { + user: { + ext: { + ctr: _country + } + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.bidder, { + [CONSTANTS.SUBMODULE_NAME]: ortb2 + }); + } + callback(); + }).catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)(CONSTANTS.LOG_PRE_FIX, 'Error in updating floors :', error); + callback(); + }); +}; + +/** @type {RtdSubmodule} */ +const pubmaticSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: CONSTANTS.SUBMODULE_NAME, + init, + getBidRequestData +}; +const registerSubModule = () => { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)(CONSTANTS.REAL_TIME_MODULE, pubmaticSubmodule); +}; +registerSubModule(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('pubmaticRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","gptUtils","currencyUtils","userAgentUtils","timeoutQueue","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubmaticRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubperfAnalyticsAdapter"],{ + +/***/ "./modules/pubperfAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/pubperfAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/** + * Analytics Adapter for Pubperf + */ + + + + +var pubperfAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + global: 'pubperf_pbjs', + analyticsType: 'bundle', + handler: 'on' +}); +pubperfAdapter.originEnableAnalytics = pubperfAdapter.enableAnalytics; +pubperfAdapter.enableAnalytics = config => { + if (!config || !config.provider || config.provider !== 'pubperf') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('expected config.provider to equal pubperf'); + return; + } + if (!window['pubperf_pbjs']) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Make sure that Pubperf tag from https://www.pubperf.com is included before the Prebid configuration.`); + return; + } + pubperfAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].registerAnalyticsAdapter({ + adapter: pubperfAdapter, + code: 'pubperf' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pubperfAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pubperfAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubperfAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubriseBidAdapter"],{ + +/***/ "./modules/pubriseBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/pubriseBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'pubrise'; +const AD_URL = 'https://backend.pubrise.ai/pbjs'; +const SYNC_URL = 'https://sync.pubrise.ai'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pubriseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubriseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubstackAnalyticsAdapter"],{ + +/***/ "./modules/pubstackAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/pubstackAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + +const pubstackAnalytics = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + global: 'PubstackAnalytics', + handler: 'on', + analyticsType: 'bundle' +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: pubstackAnalytics, + code: 'pubstack' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pubstackAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('pubstackAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubstackAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubwiseAnalyticsAdapter"],{ + +/***/ "./modules/pubwiseAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/pubwiseAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + +const MODULE_CODE = 'pubwise'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); + +/**** + * PubWise.io Analytics + * Contact: support@pubwise.io + * Developer: Stephen Johnston + * + * For testing: + * + pbjs.enableAnalytics({ + provider: 'pubwise', + options: { + site: 'b1ccf317-a6fc-428d-ba69-0c9c208aa61c' + } + }); + +Changes in 4.0 Version +4.0.1 - Initial Version for Prebid 4.x, adds activationId, adds additiona testing, removes prebid global in favor of a prebid.version const +4.0.2 - Updates to include dedicated default site to keep everything from getting rate limited + +*/ + +const analyticsType = 'endpoint'; +const analyticsName = 'PubWise:'; +const prebidVersion = "9.45.0-pre"; +let pubwiseVersion = '4.0.1'; +let configOptions = { + site: '', + endpoint: 'https://api.pubwise.io/api/v5/event/add/', + debug: null +}; +let pwAnalyticsEnabled = false; +let utmKeys = { + utm_source: '', + utm_medium: '', + utm_campaign: '', + utm_term: '', + utm_content: '' +}; +let sessionData = { + sessionId: '', + activationId: '' +}; +let pwNamespace = 'pubwise'; +let pwEvents = []; +let metaData = {}; +let auctionEnded = false; +let sessTimeout = 60 * 30 * 1000; // 30 minutes, G Analytics default session length +let sessName = 'sess_id'; +let sessTimeoutName = 'sess_timeout'; +function enrichWithSessionInfo(dataBag) { + try { + // console.log(sessionData); + dataBag['session_id'] = sessionData.sessionId; + dataBag['activation_id'] = sessionData.activationId; + } catch (e) { + dataBag['error_sess'] = 1; + } + return dataBag; +} +function enrichWithMetrics(dataBag) { + try { + if (window.PREBID_TIMEOUT) { + dataBag['target_timeout'] = window.PREBID_TIMEOUT; + } else { + dataBag['target_timeout'] = 'NA'; + } + dataBag['pw_version'] = pubwiseVersion; + dataBag['pbjs_version'] = prebidVersion; + dataBag['debug'] = configOptions.debug; + } catch (e) { + dataBag['error_metric'] = 1; + } + return dataBag; +} +function enrichWithUTM(dataBag) { + let newUtm = false; + try { + for (let prop in utmKeys) { + utmKeys[prop] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getParameterByName)(prop); + if (utmKeys[prop]) { + newUtm = true; + dataBag[prop] = utmKeys[prop]; + } + } + if (newUtm === false) { + for (let prop in utmKeys) { + let itemValue = storage.getDataFromLocalStorage(setNamespace(prop)); + if (itemValue !== null && typeof itemValue !== 'undefined' && itemValue.length !== 0) { + dataBag[prop] = itemValue; + } + } + } else { + for (let prop in utmKeys) { + storage.setDataInLocalStorage(setNamespace(prop), utmKeys[prop]); + } + } + } catch (e) { + pwInfo(`Error`, e); + dataBag['error_utm'] = 1; + } + return dataBag; +} +function expireUtmData() { + pwInfo(`Session Expiring UTM Data`); + for (let prop in utmKeys) { + storage.removeDataFromLocalStorage(setNamespace(prop)); + } +} +function enrichWithCustomSegments(dataBag) { + // c_script_type: '', c_slot1: '', c_slot2: '', c_slot3: '', c_slot4: '' + if (configOptions.custom) { + if (configOptions.custom.c_script_type) { + dataBag['c_script_type'] = configOptions.custom.c_script_type; + } + if (configOptions.custom.c_host) { + dataBag['c_host'] = configOptions.custom.c_host; + } + if (configOptions.custom.c_slot1) { + dataBag['c_slot1'] = configOptions.custom.c_slot1; + } + if (configOptions.custom.c_slot2) { + dataBag['c_slot2'] = configOptions.custom.c_slot2; + } + if (configOptions.custom.c_slot3) { + dataBag['c_slot3'] = configOptions.custom.c_slot3; + } + if (configOptions.custom.c_slot4) { + dataBag['c_slot4'] = configOptions.custom.c_slot4; + } + } + return dataBag; +} +function setNamespace(itemText) { + return pwNamespace.concat('_' + itemText); +} +function localStorageSessTimeoutName() { + return setNamespace(sessTimeoutName); +} +function localStorageSessName() { + return setNamespace(sessName); +} +function extendUserSessionTimeout() { + storage.setDataInLocalStorage(localStorageSessTimeoutName(), Date.now().toString()); +} +function userSessionID() { + return storage.getDataFromLocalStorage(localStorageSessName()) || ''; +} +function sessionExpired() { + let sessLastTime = storage.getDataFromLocalStorage(localStorageSessTimeoutName()); + return Date.now() - parseInt(sessLastTime) > sessTimeout; +} +function flushEvents() { + if (pwEvents.length > 0) { + let dataBag = { + metaData: metaData, + eventList: pwEvents.splice(0) + }; // put all the events together with the metadata and send + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(configOptions.endpoint, result => pwInfo(`Result`, result), JSON.stringify(dataBag)); + } +} +function isIngestedEvent(eventType) { + const ingested = [_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_INIT, _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_REQUESTED, _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_RESPONSE, _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_WON, _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_TIMEOUT, _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AD_RENDER_FAILED, _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.TCF2_ENFORCEMENT]; + return ingested.indexOf(eventType) !== -1; +} +function markEnabled() { + pwInfo(`Enabled`, configOptions); + pwAnalyticsEnabled = true; + setInterval(flushEvents, 100); +} +function pwInfo(info, context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${analyticsName} ` + info, context); +} +function filterBidResponse(data) { + let modified = Object.assign({}, data); + // clean up some properties we don't track in public version + if (typeof modified.ad !== 'undefined') { + modified.ad = ''; + } + if (typeof modified.adUrl !== 'undefined') { + modified.adUrl = ''; + } + if (typeof modified.adserverTargeting !== 'undefined') { + modified.adserverTargeting = ''; + } + if (typeof modified.ts !== 'undefined') { + modified.ts = ''; + } + // clean up a property to make simpler + if (typeof modified.statusMessage !== 'undefined' && modified.statusMessage === 'Bid returned empty or error response') { + modified.statusMessage = 'eoe'; + } + modified.auctionEnded = auctionEnded; + return modified; +} +function filterAuctionInit(data) { + let modified = Object.assign({}, data); + modified.refererInfo = {}; + // handle clean referrer, we only need one + if (typeof modified.bidderRequests !== 'undefined' && typeof modified.bidderRequests[0] !== 'undefined' && typeof modified.bidderRequests[0].refererInfo !== 'undefined') { + // TODO: please do not send internal data structures over the network + modified.refererInfo = modified.bidderRequests[0].refererInfo.legacy; + } + if (typeof modified.adUnitCodes !== 'undefined') { + delete modified.adUnitCodes; + } + if (typeof modified.adUnits !== 'undefined') { + delete modified.adUnits; + } + if (typeof modified.bidderRequests !== 'undefined') { + delete modified.bidderRequests; + } + if (typeof modified.bidsReceived !== 'undefined') { + delete modified.bidsReceived; + } + if (typeof modified.config !== 'undefined') { + delete modified.config; + } + if (typeof modified.noBids !== 'undefined') { + delete modified.noBids; + } + if (typeof modified.winningBids !== 'undefined') { + delete modified.winningBids; + } + return modified; +} +let pubwiseAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + analyticsType +}), { + // Override AnalyticsAdapter functions by supplying custom methods + track(_ref) { + let { + eventType, + args + } = _ref; + this.handleEvent(eventType, args); + } +}); +pubwiseAnalytics.handleEvent = function (eventType, data) { + // we log most events, but some are information + if (isIngestedEvent(eventType)) { + pwInfo(`Emitting Event ${eventType} ${pwAnalyticsEnabled}`, data); + + // record metadata + metaData = { + target_site: configOptions.site, + debug: configOptions.debug ? 1 : 0 + }; + metaData = enrichWithSessionInfo(metaData); + metaData = enrichWithMetrics(metaData); + metaData = enrichWithUTM(metaData); + metaData = enrichWithCustomSegments(metaData); + + // add data on init to the metadata container + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_INIT) { + data = filterAuctionInit(data); + } else if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_RESPONSE) { + data = filterBidResponse(data); + } + + // add all ingested events + pwEvents.push({ + eventType: eventType, + args: data + }); + } else { + pwInfo(`Skipping Event ${eventType} ${pwAnalyticsEnabled}`, data); + } + + // once the auction ends, or the event is a bid won send events + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END || eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_WON) { + flushEvents(); + } +}; +pubwiseAnalytics.storeSessionID = function (userSessID) { + storage.setDataInLocalStorage(localStorageSessName(), userSessID); + pwInfo(`New Session Generated`, userSessID); +}; + +// ensure a session exists, if not make one, always store it +pubwiseAnalytics.ensureSession = function () { + let sessionId = userSessionID(); + if (sessionExpired() === true || sessionId === null || sessionId === '') { + let generatedId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + expireUtmData(); + this.storeSessionID(generatedId); + sessionData.sessionId = generatedId; + } else if (sessionId != null) { + sessionData.sessionId = sessionId; + } + + // console.log('ensured session'); + extendUserSessionTimeout(); +}; +pubwiseAnalytics.adapterEnableAnalytics = pubwiseAnalytics.enableAnalytics; +pubwiseAnalytics.enableAnalytics = function (config) { + configOptions = Object.assign(configOptions, config.options); + // take the PBJS debug for our debug setting if no PW debug is defined + if (configOptions.debug === null) { + configOptions.debug = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.debugTurnedOn)(); + } + markEnabled(); + sessionData.activationId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + this.ensureSession(); + pubwiseAnalytics.adapterEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: pubwiseAnalytics, + code: MODULE_CODE, + gvlid: 842 +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pubwiseAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('pubwiseAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubwiseAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubwiseBidAdapter"],{ + +/***/ "./modules/pubwiseBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/pubwiseBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, _checkVideoPlacement, _checkMediaType, _parseAdSlot */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const VERSION = '0.3.0'; +const GVLID = 842; +const NET_REVENUE = true; +const UNDEFINED = undefined; +const DEFAULT_CURRENCY = 'USD'; +const AUCTION_TYPE = 1; +const BIDDER_CODE = 'pwbid'; +const LOG_PREFIX = 'PubWise: '; +const ENDPOINT_URL = 'https://bid.pubwise.io/prebid'; +// const ENDPOINT_URL = 'https://bid.pubwise.io/prebid'; // testing observable endpoint +const DEFAULT_WIDTH = 0; +const DEFAULT_HEIGHT = 0; +const PREBID_NATIVE_HELP_LINK = 'https://prebid.org/dev-docs/show-native-ads.html'; +// const USERSYNC_URL = '//127.0.0.1:8080/usersync' +const MSG_VIDEO_PLACEMENT_MISSING = 'Video.Placement param missing'; +const MEDIATYPE = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const CUSTOM_PARAMS = { + 'gender': '', + // User gender + 'yob': '', + // User year of birth + 'lat': '', + // User location - Latitude + 'lon': '' // User Location - Longitude +}; +const DATA_TYPES = { + 'NUMBER': 'number', + 'STRING': 'string', + 'BOOLEAN': 'boolean', + 'ARRAY': 'array', + 'OBJECT': 'object' +}; +const VIDEO_CUSTOM_PARAMS = { + 'mimes': DATA_TYPES.ARRAY, + 'minduration': DATA_TYPES.NUMBER, + 'maxduration': DATA_TYPES.NUMBER, + 'startdelay': DATA_TYPES.NUMBER, + 'playbackmethod': DATA_TYPES.ARRAY, + 'api': DATA_TYPES.ARRAY, + 'protocols': DATA_TYPES.ARRAY, + 'w': DATA_TYPES.NUMBER, + 'h': DATA_TYPES.NUMBER, + 'battr': DATA_TYPES.ARRAY, + 'linearity': DATA_TYPES.NUMBER, + 'placement': DATA_TYPES.NUMBER, + 'plcmt': DATA_TYPES.NUMBER, + 'minbitrate': DATA_TYPES.NUMBER, + 'maxbitrate': DATA_TYPES.NUMBER, + 'skip': DATA_TYPES.NUMBER +}; + +// rtb native types are meant to be dynamic and extendable +// the extendable data asset types are nicely aligned +// in practice we set an ID that is distinct for each real type of return +const NATIVE_ASSETS = { + 'TITLE': { + ID: 1, + KEY: 'title', + TYPE: 0 + }, + 'IMAGE': { + ID: 2, + KEY: 'image', + TYPE: 0 + }, + 'ICON': { + ID: 3, + KEY: 'icon', + TYPE: 0 + }, + 'SPONSOREDBY': { + ID: 4, + KEY: 'sponsoredBy', + TYPE: 1 + }, + 'BODY': { + ID: 5, + KEY: 'body', + TYPE: 2 + }, + 'CLICKURL': { + ID: 6, + KEY: 'clickUrl', + TYPE: 0 + }, + 'VIDEO': { + ID: 7, + KEY: 'video', + TYPE: 0 + }, + 'EXT': { + ID: 8, + KEY: 'ext', + TYPE: 0 + }, + 'DATA': { + ID: 9, + KEY: 'data', + TYPE: 0 + }, + 'LOGO': { + ID: 10, + KEY: 'logo', + TYPE: 0 + }, + 'SPONSORED': { + ID: 11, + KEY: 'sponsored', + TYPE: 1 + }, + 'DESC': { + ID: 12, + KEY: 'data', + TYPE: 2 + }, + 'RATING': { + ID: 13, + KEY: 'rating', + TYPE: 3 + }, + 'LIKES': { + ID: 14, + KEY: 'likes', + TYPE: 4 + }, + 'DOWNLOADS': { + ID: 15, + KEY: 'downloads', + TYPE: 5 + }, + 'PRICE': { + ID: 16, + KEY: 'price', + TYPE: 6 + }, + 'SALEPRICE': { + ID: 17, + KEY: 'saleprice', + TYPE: 7 + }, + 'PHONE': { + ID: 18, + KEY: 'phone', + TYPE: 8 + }, + 'ADDRESS': { + ID: 19, + KEY: 'address', + TYPE: 9 + }, + 'DESC2': { + ID: 20, + KEY: 'desc2', + TYPE: 10 + }, + 'DISPLAYURL': { + ID: 21, + KEY: 'displayurl', + TYPE: 11 + }, + 'CTA': { + ID: 22, + KEY: 'cta', + TYPE: 12 + } +}; +const NATIVE_ASSET_IMAGE_TYPE = { + 'ICON': 1, + 'LOGO': 2, + 'IMAGE': 3 +}; + +// to render any native unit we have to have a few items +const NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS = [{ + id: NATIVE_ASSETS.SPONSOREDBY.ID, + required: true, + data: { + type: 1 + } +}, { + id: NATIVE_ASSETS.TITLE.ID, + required: true +}, { + id: NATIVE_ASSETS.IMAGE.ID, + required: true +}]; +let isInvalidNativeRequest = false; +let NATIVE_ASSET_ID_TO_KEY_MAP = {}; +let NATIVE_ASSET_KEY_TO_ASSET_MAP = {}; + +// together allows traversal of NATIVE_ASSETS_LIST in any direction +// id -> key +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(NATIVE_ASSETS, anAsset => { + NATIVE_ASSET_ID_TO_KEY_MAP[anAsset.ID] = anAsset.KEY; +}); +// key -> asset +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(NATIVE_ASSETS, anAsset => { + NATIVE_ASSET_KEY_TO_ASSET_MAP[anAsset.KEY] = anAsset; +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // siteId is required for any type + if (bid.params && bid.params.siteId) { + // it must be a string + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.siteId)) { + _logWarn('siteId is required for bid', bid); + return false; + } + + // video ad validation + if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)) { + // bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array + let mediaTypesVideoMimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid.mediaTypes, 'video.mimes'); + let paramsVideoMimes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.mimes'); + if (_isNonEmptyArray(mediaTypesVideoMimes) === false && _isNonEmptyArray(paramsVideoMimes) === false) { + _logWarn('Error: For video ads, bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array. Call suppressed:', JSON.stringify(bid)); + return false; + } + if (!bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].hasOwnProperty('context')) { + _logError(`no context specified in bid. Rejecting bid: `, JSON.stringify(bid)); + return false; + } + if (bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].context === 'outstream') { + delete bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; + _logWarn(`outstream not currently supported `, JSON.stringify(bid)); + return false; + } + } + return true; + } + return false; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_3__.convertOrtbRequestToProprietaryNative)(validBidRequests); + var refererInfo; + if (bidderRequest && bidderRequest.refererInfo) { + refererInfo = bidderRequest.refererInfo; + } + var conf = _initConf(refererInfo); + var payload = _createOrtbTemplate(conf); + var bidCurrency = ''; + var bid; + var blockedIabCategories = []; + validBidRequests.forEach(originalBid => { + bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(originalBid); + bid.params.adSlot = bid.params.adSlot || ''; + _parseAdSlot(bid); + conf = _handleCustomParams(bid.params, conf); + conf.transactionId = bid.ortb2Imp?.ext?.tid; + bidCurrency = bid.params.currency || UNDEFINED; + bid.params.currency = bidCurrency; + if (bid.params.hasOwnProperty('bcat') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.params.bcat)) { + blockedIabCategories = blockedIabCategories.concat(bid.params.bcat); + } + var impObj = _createImpressionObject(bid, conf); + if (impObj) { + payload.imp.push(impObj); + } + }); + + // no payload imps, no rason to continue + if (payload.imp.length == 0) { + return; + } + + // test bids can also be turned on here + if (window.location.href.indexOf('pubwiseTestBid=true') !== -1) { + payload.test = 1; + } + if (bid.params.isTest) { + payload.test = Number(bid.params.isTest); // should be 1 or 0 + } + payload.site.publisher.id = bid.params.siteId.trim(); + payload.user.gender = conf.gender ? conf.gender.trim() : UNDEFINED; + payload.user.geo = {}; + // TODO: fix lat and long to only come from ortb2 object so publishers can control precise location + payload.user.geo.lat = _parseSlotParam('lat', 0); + payload.user.geo.lon = _parseSlotParam('lon', 0); + payload.user.yob = _parseSlotParam('yob', conf.yob); + payload.device.geo = payload.user.geo; + payload.site.page = payload.site?.page?.trim(); + payload.site.domain = _getDomainFromURL(payload.site.page); + + // add the content object from config in request + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('content') === 'object') { + payload.site.content = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('content'); + } + + // merge the device from config.getConfig('device') + if (typeof _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('device') === 'object') { + payload.device = Object.assign(payload.device, _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('device')); + } + + // passing transactionId in source.tid + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'source.tid', bidderRequest?.ortb2?.source?.tid); + + // schain + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'source.ext.schain', validBidRequests[0].schain); + } + + // gdpr consent + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // ccpa on the root object + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + + // if coppa is in effect then note it + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(payload, 'regs.coppa', 1); + } + var options = { + contentType: 'text/plain' + }; + _logInfo('buildRequests payload', payload); + _logInfo('buildRequests bidderRequest', bidderRequest); + return { + method: 'POST', + url: _getEndpointURL(bid), + data: payload, + options: options, + bidderRequest: bidderRequest + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} response A successful response from the server. + * @param {Object} request + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (response, request) { + const bidResponses = []; + var respCur = DEFAULT_CURRENCY; + _logInfo('interpretResponse request', request); + let parsedRequest = request.data; // not currently stringified + // let parsedReferrer = parsedRequest.site && parsedRequest.site.ref ? parsedRequest.site.ref : ''; + + // try { + if (response.body && response.body.seatbid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response.body.seatbid)) { + _logInfo('interpretResponse response body', response.body); + // Supporting multiple bid responses for same adSize + respCur = response.body.cur || respCur; + response.body.seatbid.forEach(seatbidder => { + seatbidder.bid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(seatbidder.bid) && seatbidder.bid.forEach(bid => { + let newBid = { + requestId: bid.impid, + cpm: (parseFloat(bid.price) || 0).toFixed(2), + width: bid.w, + height: bid.h, + creativeId: bid.crid || bid.id, + currency: respCur, + netRevenue: NET_REVENUE, + ttl: 300, + ad: bid.adm, + pw_seat: seatbidder.seat || null, + pw_dspid: bid.ext && bid.ext.dspid ? bid.ext.dspid : null, + partnerImpId: bid.id || '' // partner impression Id + }; + if (parsedRequest.imp && parsedRequest.imp.length > 0) { + parsedRequest.imp.forEach(req => { + if (bid.impid === req.id) { + _checkMediaType(bid, newBid); + switch (newBid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'mediaTypes.video.context'); + switch (videoContext) { + case _src_video_js__WEBPACK_IMPORTED_MODULE_6__.OUTSTREAM: + // not currently supported + break; + case _src_video_js__WEBPACK_IMPORTED_MODULE_6__.INSTREAM: + break; + } + newBid.width = bid.hasOwnProperty('w') ? bid.w : req.video.w; + newBid.height = bid.hasOwnProperty('h') ? bid.h : req.video.h; + newBid.vastXml = bid.adm; + newBid.vastUrl = bid.vastUrl; + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + _parseNativeResponse(bid, newBid); + break; + } + } + }); + } + newBid.meta = {}; + if (bid.ext && bid.ext.dspid) { + newBid.meta.networkId = bid.ext.dspid; + } + if (bid.ext && bid.ext.advid) { + newBid.meta.buyerId = bid.ext.advid; + } + if (bid.adomain && bid.adomain.length > 0) { + newBid.meta.advertiserDomains = bid.adomain; + newBid.meta.clickUrl = bid.adomain[0]; + } + bidResponses.push(newBid); + }); + }); + } + // } catch (error) { + // _logError(error); + // } + return bidResponses; + } +}; +function _checkMediaType(bid, newBid) { + // Check Various ADM Aspects to Determine Media Type + if (bid.ext && bid.ext['bidtype'] != undefined) { + // this is the most explicity check + newBid.mediaType = MEDIATYPE[bid.ext.bidtype]; + } else { + _logInfo('bid.ext.bidtype does not exist, checking alternatively for mediaType'); + var adm = bid.adm; + var videoRegex = new RegExp(/VAST\s+version/); + if (adm.indexOf('"ver":') >= 0) { + try { + var admJSON = ''; + admJSON = JSON.parse(adm.replace(/\\/g, '')); + if (admJSON && admJSON.assets) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + } + } catch (e) { + _logWarn('Error: Cannot parse native reponse for ad response: ', adm); + } + } else if (videoRegex.test(adm)) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + } +} +function _parseNativeResponse(bid, newBid) { + newBid.native = {}; + if (bid.hasOwnProperty('adm')) { + var adm = ''; + try { + adm = JSON.parse(bid.adm.replace(/\\/g, '')); + } catch (ex) { + _logWarn('Error: Cannot parse native reponse for ad response: ' + newBid.adm); + return; + } + if (adm && adm.assets && adm.assets.length > 0) { + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + for (let i = 0, len = adm.assets.length; i < len; i++) { + switch (adm.assets[i].id) { + case NATIVE_ASSETS.TITLE.ID: + newBid.native.title = adm.assets[i].title && adm.assets[i].title.text; + break; + case NATIVE_ASSETS.IMAGE.ID: + newBid.native.image = { + url: adm.assets[i].img && adm.assets[i].img.url, + height: adm.assets[i].img && adm.assets[i].img.h, + width: adm.assets[i].img && adm.assets[i].img.w + }; + break; + case NATIVE_ASSETS.ICON.ID: + newBid.native.icon = { + url: adm.assets[i].img && adm.assets[i].img.url, + height: adm.assets[i].img && adm.assets[i].img.h, + width: adm.assets[i].img && adm.assets[i].img.w + }; + break; + case NATIVE_ASSETS.SPONSOREDBY.ID: + case NATIVE_ASSETS.BODY.ID: + case NATIVE_ASSETS.LIKES.ID: + case NATIVE_ASSETS.DOWNLOADS.ID: + case NATIVE_ASSETS.PRICE: + case NATIVE_ASSETS.SALEPRICE.ID: + case NATIVE_ASSETS.PHONE.ID: + case NATIVE_ASSETS.ADDRESS.ID: + case NATIVE_ASSETS.DESC2.ID: + case NATIVE_ASSETS.CTA.ID: + case NATIVE_ASSETS.RATING.ID: + case NATIVE_ASSETS.DISPLAYURL.ID: + newBid.native[NATIVE_ASSET_ID_TO_KEY_MAP[adm.assets[i].id]] = adm.assets[i].data && adm.assets[i].data.value; + break; + } + } + newBid.clickUrl = adm.link && adm.link.url; + newBid.clickTrackers = adm.link && adm.link.clicktrackers || []; + newBid.impressionTrackers = adm.imptrackers || []; + newBid.jstracker = adm.jstracker || []; + if (!newBid.width) { + newBid.width = DEFAULT_WIDTH; + } + if (!newBid.height) { + newBid.height = DEFAULT_HEIGHT; + } + } + } +} +function _getDomainFromURL(url) { + let anchor = document.createElement('a'); + anchor.href = url; + return anchor.hostname; +} +function _handleCustomParams(params, conf) { + var key, value, entry; + for (key in CUSTOM_PARAMS) { + if (CUSTOM_PARAMS.hasOwnProperty(key)) { + value = params[key]; + if (value) { + entry = CUSTOM_PARAMS[key]; + if (typeof entry === 'object') { + // will be used in future when we want to + // process a custom param before using + // 'keyname': {f: function() {}} + value = entry.f(value, conf); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(value)) { + conf[key] = value; + } else { + _logWarn('Ignoring param : ' + key + ' with value : ' + CUSTOM_PARAMS[key] + ', expects string-value, found ' + typeof value); + } + } + } + } + return conf; +} +function _createOrtbTemplate(conf) { + return { + id: '' + new Date().getTime(), + at: AUCTION_TYPE, + cur: [DEFAULT_CURRENCY], + imp: [], + site: { + page: conf.pageURL, + ref: conf.refURL, + publisher: {} + }, + device: { + ua: navigator.userAgent, + js: 1, + dnt: navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1' ? 1 : 0, + h: screen.height, + w: screen.width, + language: navigator.language, + devicetype: _getDeviceType() + }, + user: {}, + ext: { + version: VERSION + } + }; +} +function _createImpressionObject(bid, conf) { + var impObj = {}; + var bannerObj; + var videoObj; + var nativeObj = {}; + var mediaTypes = ''; + impObj = { + id: bid.bidId, + tagid: bid.params.adUnit || undefined, + bidfloor: _parseSlotParam('bidFloor', bid.params.bidFloor), + // capitalization dicated by 3.2.4 spec + secure: 1, + bidfloorcur: bid.params.currency ? _parseSlotParam('currency', bid.params.currency) : DEFAULT_CURRENCY, + // capitalization dicated by 3.2.4 spec + ext: { + tid: bid.ortb2Imp?.ext?.tid || '' + } + }; + if (bid.hasOwnProperty('mediaTypes')) { + for (mediaTypes in bid.mediaTypes) { + switch (mediaTypes) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + bannerObj = _createBannerRequest(bid); + if (bannerObj !== UNDEFINED) { + impObj.banner = bannerObj; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE: + nativeObj['request'] = JSON.stringify(_createNativeRequest(bid.nativeParams)); + if (!isInvalidNativeRequest) { + impObj.native = nativeObj; + } else { + _logWarn('Error: Error in Native adunit ' + bid.params.adUnit + '. Ignoring the adunit. Refer to ' + PREBID_NATIVE_HELP_LINK + ' for more details.'); + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + videoObj = _createVideoRequest(bid); + if (videoObj !== UNDEFINED) { + impObj.video = videoObj; + } + break; + } + } + } else { + _logWarn('MediaTypes are Required for all Adunit Configs', bid); + } + _addFloorFromFloorModule(impObj, bid); + return impObj.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) || impObj.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) || impObj.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) ? impObj : UNDEFINED; +} +function _parseSlotParam(paramName, paramValue) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(paramValue)) { + paramValue && _logWarn('Ignoring param key: ' + paramName + ', expects string-value, found ' + typeof paramValue); + return UNDEFINED; + } + switch (paramName) { + case 'bidFloor': + return parseFloat(paramValue) || UNDEFINED; + case 'lat': + return parseFloat(paramValue) || UNDEFINED; + case 'lon': + return parseFloat(paramValue) || UNDEFINED; + case 'yob': + return parseInt(paramValue) || UNDEFINED; + default: + return paramValue; + } +} +function _parseAdSlot(bid) { + _logInfo('parseAdSlot bid', bid); + if (bid.adUnitCode) { + bid.params.adUnit = bid.adUnitCode; + } else { + bid.params.adUnit = ''; + } + bid.params.width = 0; + bid.params.height = 0; + bid.params.adSlot = _cleanSlotName(bid.params.adSlot); + if (bid.hasOwnProperty('mediaTypes')) { + if (bid.mediaTypes.hasOwnProperty(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) && bid.mediaTypes.banner.hasOwnProperty('sizes')) { + // if its a banner, has mediaTypes and sizes + var i = 0; + var sizeArray = []; + for (; i < bid.mediaTypes.banner.sizes.length; i++) { + if (bid.mediaTypes.banner.sizes[i].length === 2) { + // sizes[i].length will not be 2 in case where size is set as fluid, we want to skip that entry + sizeArray.push(bid.mediaTypes.banner.sizes[i]); + } + } + bid.mediaTypes.banner.sizes = sizeArray; + if (bid.mediaTypes.banner.sizes.length >= 1) { + // if there is more than one size then pop one onto the banner params width + // pop the first into the params, then remove it from mediaTypes + bid.params.width = bid.mediaTypes.banner.sizes[0][0]; + bid.params.height = bid.mediaTypes.banner.sizes[0][1]; + bid.mediaTypes.banner.sizes = bid.mediaTypes.banner.sizes.splice(1, bid.mediaTypes.banner.sizes.length - 1); + } + } + } else { + _logWarn('MediaTypes are Required for all Adunit Configs', bid); + } +} +function _cleanSlotName(slotName) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(slotName)) { + return slotName.replace(/^\s+/g, '').replace(/\s+$/g, ''); + } + return ''; +} +function _initConf(refererInfo) { + return { + pageURL: refererInfo?.page, + refURL: refererInfo?.ref + }; +} +function _commonNativeRequestObject(nativeAsset, params) { + var key = nativeAsset.KEY; + return { + id: nativeAsset.ID, + required: params[key].required ? 1 : 0, + data: { + type: nativeAsset.TYPE, + len: params[key].len, + ext: params[key].ext + } + }; +} +function _addFloorFromFloorModule(impObj, bid) { + let bidFloor = -1; // indicates no floor + + // get lowest floor from floorModule + if (typeof bid.getFloor === 'function' && !_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('pubwise.disableFloors')) { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].forEach(mediaType => { + if (impObj.hasOwnProperty(mediaType)) { + let floorInfo = bid.getFloor({ + currency: impObj.bidFloorCur, + mediaType: mediaType, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === impObj.bidFloorCur && !isNaN(parseInt(floorInfo.floor))) { + let mediaTypeFloor = parseFloat(floorInfo.floor); + bidFloor = bidFloor == -1 ? mediaTypeFloor : Math.min(mediaTypeFloor, bidFloor); + } + } + }); + } + + // get highest, if none then take the default -1 + if (impObj.bidfloor) { + bidFloor = Math.max(bidFloor, impObj.bidfloor); + } + + // assign if it has a valid floor - > 0 + impObj.bidfloor = !isNaN(bidFloor) && bidFloor > 0 ? bidFloor : UNDEFINED; +} +function _createNativeRequest(params) { + var nativeRequestObject = { + assets: [] + }; + for (var key in params) { + if (params.hasOwnProperty(key)) { + var assetObj = {}; + if (!(nativeRequestObject.assets && nativeRequestObject.assets.length > 0 && nativeRequestObject.assets.hasOwnProperty(key))) { + switch (key) { + case NATIVE_ASSETS.TITLE.KEY: + if (params[key].len || params[key].length) { + assetObj = { + id: NATIVE_ASSETS.TITLE.ID, + required: params[key].required ? 1 : 0, + title: { + len: params[key].len || params[key].length, + ext: params[key].ext + } + }; + } else { + _logWarn('Error: Title Length is required for native ad: ' + JSON.stringify(params)); + } + break; + case NATIVE_ASSETS.IMAGE.KEY: + if (params[key].sizes && params[key].sizes.length > 0) { + assetObj = { + id: NATIVE_ASSETS.IMAGE.ID, + required: params[key].required ? 1 : 0, + img: { + type: NATIVE_ASSET_IMAGE_TYPE.IMAGE, + w: params[key].w || params[key].width || (params[key].sizes ? params[key].sizes[0] : UNDEFINED), + h: params[key].h || params[key].height || (params[key].sizes ? params[key].sizes[1] : UNDEFINED), + wmin: params[key].wmin || params[key].minimumWidth || (params[key].minsizes ? params[key].minsizes[0] : UNDEFINED), + hmin: params[key].hmin || params[key].minimumHeight || (params[key].minsizes ? params[key].minsizes[1] : UNDEFINED), + mimes: params[key].mimes, + ext: params[key].ext + } + }; + } else { + _logWarn('Error: Image sizes is required for native ad: ' + JSON.stringify(params)); + } + break; + case NATIVE_ASSETS.ICON.KEY: + if (params[key].sizes && params[key].sizes.length > 0) { + assetObj = { + id: NATIVE_ASSETS.ICON.ID, + required: params[key].required ? 1 : 0, + img: { + type: NATIVE_ASSET_IMAGE_TYPE.ICON, + w: params[key].w || params[key].width || (params[key].sizes ? params[key].sizes[0] : UNDEFINED), + h: params[key].h || params[key].height || (params[key].sizes ? params[key].sizes[1] : UNDEFINED) + } + }; + } else { + _logWarn('Error: Icon sizes is required for native ad: ' + JSON.stringify(params)); + } + ; + break; + case NATIVE_ASSETS.VIDEO.KEY: + assetObj = { + id: NATIVE_ASSETS.VIDEO.ID, + required: params[key].required ? 1 : 0, + video: { + minduration: params[key].minduration, + maxduration: params[key].maxduration, + protocols: params[key].protocols, + mimes: params[key].mimes, + ext: params[key].ext + } + }; + break; + case NATIVE_ASSETS.EXT.KEY: + assetObj = { + id: NATIVE_ASSETS.EXT.ID, + required: params[key].required ? 1 : 0 + }; + break; + case NATIVE_ASSETS.LOGO.KEY: + assetObj = { + id: NATIVE_ASSETS.LOGO.ID, + required: params[key].required ? 1 : 0, + img: { + type: NATIVE_ASSET_IMAGE_TYPE.LOGO, + w: params[key].w || params[key].width || (params[key].sizes ? params[key].sizes[0] : UNDEFINED), + h: params[key].h || params[key].height || (params[key].sizes ? params[key].sizes[1] : UNDEFINED) + } + }; + break; + case NATIVE_ASSETS.SPONSOREDBY.KEY: + case NATIVE_ASSETS.BODY.KEY: + case NATIVE_ASSETS.RATING.KEY: + case NATIVE_ASSETS.LIKES.KEY: + case NATIVE_ASSETS.DOWNLOADS.KEY: + case NATIVE_ASSETS.PRICE.KEY: + case NATIVE_ASSETS.SALEPRICE.KEY: + case NATIVE_ASSETS.PHONE.KEY: + case NATIVE_ASSETS.ADDRESS.KEY: + case NATIVE_ASSETS.DESC2.KEY: + case NATIVE_ASSETS.DISPLAYURL.KEY: + case NATIVE_ASSETS.CTA.KEY: + assetObj = _commonNativeRequestObject(NATIVE_ASSET_KEY_TO_ASSET_MAP[key], params); + break; + } + } + } + if (assetObj && assetObj.id) { + nativeRequestObject.assets[nativeRequestObject.assets.length] = assetObj; + } + } + ; + + // for native image adtype prebid has to have few required assests i.e. title,sponsoredBy, image + // if any of these are missing from the request then request will not be sent + var requiredAssetCount = NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS.length; + var presentrequiredAssetCount = 0; + NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS.forEach(ele => { + var lengthOfExistingAssets = nativeRequestObject.assets.length; + for (var i = 0; i < lengthOfExistingAssets; i++) { + if (ele.id == nativeRequestObject.assets[i].id) { + presentrequiredAssetCount++; + break; + } + } + }); + if (requiredAssetCount == presentrequiredAssetCount) { + isInvalidNativeRequest = false; + } else { + isInvalidNativeRequest = true; + } + return nativeRequestObject; +} +function _createBannerRequest(bid) { + var sizes = bid.mediaTypes.banner.sizes; + var format = []; + var bannerObj; + if (sizes !== UNDEFINED && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes)) { + bannerObj = {}; + if (!bid.params.width && !bid.params.height) { + if (sizes.length === 0) { + // i.e. since bid.params does not have width or height, and length of sizes is 0, need to ignore this banner imp + bannerObj = UNDEFINED; + _logWarn('Error: mediaTypes.banner.size missing for adunit: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.'); + return bannerObj; + } else { + bannerObj.w = parseInt(sizes[0][0], 10); + bannerObj.h = parseInt(sizes[0][1], 10); + sizes = sizes.splice(1, sizes.length - 1); + } + } else { + bannerObj.w = bid.params.width; + bannerObj.h = bid.params.height; + } + if (sizes.length > 0) { + format = []; + sizes.forEach(function (size) { + if (size.length > 1) { + format.push({ + w: size[0], + h: size[1] + }); + } + }); + if (format.length > 0) { + bannerObj.format = format; + } + } + bannerObj.pos = 0; + bannerObj.topframe = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1; + } else { + _logWarn('Error: mediaTypes.banner.size missing for adunit: ' + bid.params.adUnit + '. Ignoring the banner impression in the adunit.'); + bannerObj = UNDEFINED; + } + return bannerObj; +} + +// various error levels are not always used +// eslint-disable-next-line no-unused-vars +function _logMessage(textValue, objectValue) { + objectValue = objectValue || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(LOG_PREFIX + textValue, objectValue); +} +function _logInfo(textValue, objectValue) { + objectValue = objectValue || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(LOG_PREFIX + textValue, objectValue); +} +function _logWarn(textValue, objectValue) { + objectValue = objectValue || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(LOG_PREFIX + textValue, objectValue); +} +function _logError(textValue, objectValue) { + objectValue = objectValue || ''; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(LOG_PREFIX + textValue, objectValue); +} +function _checkVideoPlacement(videoData, adUnitCode) { + // Check for video.placement property. If property is missing display log message. + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(videoData, 'placement')) { + _logWarn(`${MSG_VIDEO_PLACEMENT_MISSING} for ${adUnitCode}`, adUnitCode); + } + ; +} +function _createVideoRequest(bid) { + var videoData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid.mediaTypes, 'video'), bid.params.video); + var videoObj; + if (videoData !== UNDEFINED) { + videoObj = {}; + _checkVideoPlacement(videoData, bid.adUnitCode); + for (var key in VIDEO_CUSTOM_PARAMS) { + if (videoData.hasOwnProperty(key)) { + videoObj[key] = _checkParamDataType(key, videoData[key], VIDEO_CUSTOM_PARAMS[key]); + } + } + // read playersize and assign to h and w. + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.mediaTypes.video.playerSize[0])) { + videoObj.w = parseInt(bid.mediaTypes.video.playerSize[0][0], 10); + videoObj.h = parseInt(bid.mediaTypes.video.playerSize[0][1], 10); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.mediaTypes.video.playerSize[0])) { + videoObj.w = parseInt(bid.mediaTypes.video.playerSize[0], 10); + videoObj.h = parseInt(bid.mediaTypes.video.playerSize[1], 10); + } + } else { + videoObj = UNDEFINED; + _logWarn('Error: Video config params missing for adunit: ' + bid.params.adUnit + ' with mediaType set as video. Ignoring video impression in the adunit.', bid.params); + } + return videoObj; +} + +/** + * Determines if the array has values + * + * @param {object} test + * @returns {boolean} + */ +function _isNonEmptyArray(test) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(test) === true) { + if (test.length > 0) { + return true; + } + } + return false; +} + +/** + * Returns the overridden bid endpoint_url if it is set, primarily used for testing + * + * @param {object} bid the current bid + * @returns + */ +function _getEndpointURL(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr)(bid?.params?.endpoint_url) && bid?.params?.endpoint_url != UNDEFINED) { + return bid.params.endpoint_url; + } + return ENDPOINT_URL; +} + +/** + * + * @param {object} key + * @param {object} value + * @param {object} datatype + * @returns {*} + */ +function _checkParamDataType(key, value, datatype) { + var errMsg = 'Ignoring param key: ' + key + ', expects ' + datatype + ', found ' + typeof value; + var functionToExecute; + switch (datatype) { + case DATA_TYPES.BOOLEAN: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean; + break; + case DATA_TYPES.NUMBER: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber; + break; + case DATA_TYPES.STRING: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr; + break; + case DATA_TYPES.ARRAY: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray; + break; + } + if (functionToExecute(value)) { + return value; + } + _logWarn(errMsg, key); + return UNDEFINED; +} +function _isMobile() { + if (navigator.userAgentData && navigator.userAgentData.mobile) { + return true; + } else { + return /(mobi)/i.test(navigator.userAgent); + } +} +function _isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +function _isTablet() { + return /ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase()); +} + +/** + * Very high level device detection, order matters + */ +function _getDeviceType() { + if (_isTablet()) { + return 5; + } + if (_isMobile()) { + return 4; + } + if (_isConnectedTV()) { + return 3; + } + return 2; +} + +// function _decorateLog() { +// arguments[0] = 'PubWise' + arguments[0]; +// return arguments +// } + +// these are exported only for testing so maintaining the JS convention of _ to indicate the intent + +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('pubwiseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubwiseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubxBidAdapter"],{ + +/***/ "./modules/pubxBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/pubxBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +const BIDDER_CODE = 'pubx'; +const BID_ENDPOINT = 'https://api.primecaster.net/adlogue/api/slot/bid'; +const USER_SYNC_URL = 'https://api.primecaster.net/primecaster_dmppv.html'; +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + if (!bid.params.sid) { + return false; + } else { + return true; + } + }, + buildRequests: function (validBidRequests) { + return validBidRequests.map(bidRequest => { + const bidId = bidRequest.bidId; + const params = bidRequest.params; + const sid = params.sid; + const pageUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, 'ortb2.site.page').replace(/\?.*$/, ''); + const pageEnc = encodeURIComponent(pageUrl); + const payload = { + sid: sid, + pu: pageEnc + }; + return { + id: bidId, + method: 'GET', + url: BID_ENDPOINT, + data: payload + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + const body = serverResponse.body; + const bidResponses = []; + if (body.cid) { + const bidResponse = { + requestId: bidRequest.id, + cpm: body.cpm, + currency: body.currency, + width: body.width, + height: body.height, + creativeId: body.cid, + netRevenue: true, + ttl: body.TTL, + ad: body.adm + }; + if (body.adomains) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(bidResponse, 'meta.advertiserDomains', Array.isArray(body.adomains) ? body.adomains : [body.adomains]); + } + bidResponses.push(bidResponse); + } else {} + ; + return bidResponses; + }, + /** + * Determine which user syncs should occur + * @param {object} syncOptions + * @param {Array} serverResponses + * @returns {Array} User sync pixels + */ + getUserSyncs: function (syncOptions, serverResponses) { + const kwTag = document.getElementsByName('keywords'); + let kwString = ''; + let kwEnc = ''; + let titleContent = !!document.title && document.title; + let titleEnc = ''; + let descContent = !!document.getElementsByName('description') && !!document.getElementsByName('description')[0] && document.getElementsByName('description')[0].content; + let descEnc = ''; + const pageUrl = location.href.replace(/\?.*$/, ''); + const pageEnc = encodeURIComponent(pageUrl); + const refUrl = document.referrer.replace(/\?.*$/, ''); + const refEnc = encodeURIComponent(refUrl); + if (kwTag.length) { + const kwContents = kwTag[0].content; + if (kwContents.length > 20) { + const kwArray = kwContents.substr(0, 20).split(','); + kwArray.pop(); + kwString = kwArray.join(); + } else { + kwString = kwContents; + } + kwEnc = encodeURIComponent(kwString); + } else {} + if (titleContent) { + if (titleContent.length > 30) { + titleContent = titleContent.substr(0, 30); + } else {} + ; + titleEnc = encodeURIComponent(titleContent); + } else {} + ; + if (descContent) { + if (descContent.length > 60) { + descContent = descContent.substr(0, 60); + } else {} + ; + descEnc = encodeURIComponent(descContent); + } else {} + ; + return syncOptions.iframeEnabled ? [{ + type: 'iframe', + url: USER_SYNC_URL + '?pkw=' + kwEnc + '&pd=' + descEnc + '&pu=' + pageEnc + '&pref=' + refEnc + '&pt=' + titleEnc + }] : []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pubxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubxaiAnalyticsAdapter"],{ + +/***/ "./modules/pubxaiAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/pubxaiAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports sendCache, auctionCache */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/userAgentUtils/index.js */ "./libraries/userAgentUtils/index.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + + + + + + +let initOptions; +const emptyUrl = ''; +const analyticsType = 'endpoint'; +const adapterCode = 'pubxai'; +const pubxaiAnalyticsVersion = 'v2.1.0'; +const defaultHost = 'api.pbxai.com'; +const auctionPath = '/analytics/auction'; +const winningBidPath = '/analytics/bidwon'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: adapterCode +}); + +/** + * The sendCache is a global cache object which tracks the pending sends + * back to pubx.ai. The data may be removed from this cache, post send. + */ +const sendCache = new Proxy({}, { + get: (target, name) => { + if (!target.hasOwnProperty(name)) { + target[name] = []; + } + return target[name]; + } +}); + +/** + * auctionCache is a global cache object which stores all auction histories + * for the session. When getting a key from the auction cache, any + * information already known about the auction or associated data (floor + * data configured by prebid, browser data, user data etc) is added to + * the cache automatically. + */ +const auctionCache = new Proxy({}, { + get: (target, name) => { + if (!target.hasOwnProperty(name)) { + target[name] = { + bids: [], + auctionDetail: { + refreshRank: Object.keys(target).length, + auctionId: name + }, + floorDetail: {}, + pageDetail: { + host: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowLocation)().host, + path: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowLocation)().pathname, + search: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowLocation)().search + }, + deviceDetail: { + platform: navigator.platform, + deviceType: (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.getDeviceType)(), + deviceOS: (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.getOS)(), + browser: (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_3__.getBrowser)() + }, + userDetail: { + userIdTypes: Object.keys((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().getUserIds?.() || {}) + }, + consentDetail: { + consentTypes: Object.keys((0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().getConsentMetadata?.() || {}) + }, + pmacDetail: JSON.parse(storage.getDataFromLocalStorage('pubx:pmac')) || {}, + // {auction_1: {floor:0.23,maxBid:0.34,bidCount:3},auction_2:{floor:0.13,maxBid:0.14,bidCount:2} + extraData: JSON.parse(storage.getDataFromLocalStorage('pubx:extraData')) || {}, + initOptions: { + ...initOptions, + auctionId: name // back-compat + }, + sendAs: [] + }; + } + return target[name]; + } +}); + +/** + * Fetch extra ad server data for a specific ad slot (bid) + * @param {object} bid an output from extractBid + * @returns {object} key value pairs from the adserver + */ +const getAdServerDataForBid = bid => { + const gptSlot = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__.getGptSlotForAdUnitCode)(bid); + if (gptSlot) { + return Object.fromEntries(gptSlot.getTargetingKeys().filter(key => key.startsWith('pubx-') || key.startsWith('hb_') && (key.match(/_/g) || []).length === 1).map(key => [key, gptSlot.getTargeting(key)])); + } + return {}; // TODO: support more ad servers +}; + +/** + * extracts and derives valuable data from a prebid bidder bidResponse object + * @param {object} bidResponse a prebid bidder bidResponse (see + * https://docs.prebid.org/dev-docs/publisher-api-reference/getBidResponses.html) + * @returns {object} + */ +const extractBid = bidResponse => { + return { + adUnitCode: bidResponse.adUnitCode, + gptSlotCode: (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_5__.getGptSlotInfoForAdUnitCode)(bidResponse.adUnitCode).gptSlot || null, + auctionId: bidResponse.auctionId, + bidderCode: bidResponse.bidder, + cpm: bidResponse.cpm, + creativeId: bidResponse.creativeId, + dealId: bidResponse.dealId, + currency: bidResponse.currency, + floorData: bidResponse.floorData, + mediaType: bidResponse.mediaType, + netRevenue: bidResponse.netRevenue, + requestTimestamp: bidResponse.requestTimestamp, + responseTimestamp: bidResponse.responseTimestamp, + status: bidResponse.status, + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(bidResponse.size).toString(), + statusMessage: bidResponse.statusMessage, + timeToRespond: bidResponse.timeToRespond, + transactionId: bidResponse.transactionId, + bidId: bidResponse.bidId || bidResponse.requestId, + placementId: bidResponse.params ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidResponse, 'params.0.placementId') : null, + source: bidResponse.source || 'null' + }; +}; + +/** + * Track the events emitted by prebid and handle each case. See https://docs.prebid.org/dev-docs/publisher-api-reference/getEvents.html for more info + * @param {object} event the prebid event emmitted + * @param {string} event.eventType the type of the event + * @param {object} event.args the arguments of the emitted event + */ +const track = _ref => { + let { + eventType, + args + } = _ref; + switch (eventType) { + // handle invalid bids, and remove them from the adUnit cache + case _src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_TIMEOUT: + args.map(extractBid).forEach(bid => { + bid.bidType = 3; + auctionCache[bid.auctionId].bids.push(bid); + }); + break; + // handle valid bid responses and record them as part of an auction + case _src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_RESPONSE: + const bid = Object.assign(extractBid(args), { + bidType: 2 + }); + auctionCache[bid.auctionId].bids.push(bid); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_REJECTED: + const rejectedBid = Object.assign(extractBid(args), { + bidType: 1 + }); + auctionCache[rejectedBid.auctionId].bids.push(rejectedBid); + break; + // capture extra information from the auction, and if there were no bids + // (and so no chance of a win) send the auction + case _src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.AUCTION_END: + Object.assign(auctionCache[args.auctionId].floorDetail, args.adUnits.map(i => i?.bids.length && i.bids[0]?.floorData).find(i => i) || {}); + auctionCache[args.auctionId].deviceDetail.cdep = args.bidderRequests.map(bidRequest => bidRequest.ortb2?.device?.ext?.cdep).find(i => i); + Object.assign(auctionCache[args.auctionId].auctionDetail, { + adUnitCodes: args.adUnits.map(i => i.code), + timestamp: args.timestamp + }); + if (auctionCache[args.auctionId].bids.every(bid => [1, 3].includes(bid.bidType))) { + prepareSend(args.auctionId); + } + break; + // send the prebid winning bid back to pubx + case _src_constants_js__WEBPACK_IMPORTED_MODULE_7__.EVENTS.BID_WON: + const winningBid = extractBid(args); + const floorDetail = auctionCache[winningBid.auctionId].floorDetail; + Object.assign(winningBid, { + floorProvider: floorDetail?.floorProvider || null, + floorFetchStatus: floorDetail?.fetchStatus || null, + floorLocation: floorDetail?.location || null, + floorModelVersion: floorDetail?.modelVersion || null, + floorSkipRate: floorDetail?.skipRate || 0, + isFloorSkipped: floorDetail?.skipped || false, + isWinningBid: true, + renderedSize: args.size, + bidType: 4 + }); + winningBid.adServerData = getAdServerDataForBid(winningBid); + auctionCache[winningBid.auctionId].winningBid = winningBid; + prepareSend(winningBid.auctionId); + break; + // do nothing + default: + break; + } +}; + +/** + * If true, send data back to pubxai + * @param {string} auctionId + * @param {number} samplingRate + * @returns {boolean} + */ +const shouldFireEventRequest = function (auctionId) { + let samplingRate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + return parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.cyrb53Hash)(auctionId)) % samplingRate === 0; +}; + +/** + * prepare the payload for sending auction data back to pubx.ai + * @param {string} auctionId the auction to send + */ +const prepareSend = auctionId => { + const auctionData = Object.assign({}, auctionCache[auctionId]); + if (!shouldFireEventRequest(auctionId, initOptions.samplingRate)) { + return; + } + [{ + path: winningBidPath, + requiredKeys: ['winningBid', 'pageDetail', 'deviceDetail', 'floorDetail', 'auctionDetail', 'userDetail', 'consentDetail', 'pmacDetail', 'extraData', 'initOptions'], + eventType: 'win' + }, { + path: auctionPath, + requiredKeys: ['bids', 'pageDetail', 'deviceDetail', 'floorDetail', 'auctionDetail', 'userDetail', 'consentDetail', 'pmacDetail', 'extraData', 'initOptions'], + eventType: 'auction' + }].forEach(_ref2 => { + let { + path, + requiredKeys, + eventType + } = _ref2; + const data = Object.fromEntries(requiredKeys.map(key => [key, auctionData[key]])); + if (auctionCache[auctionId].sendAs.includes(eventType) || !requiredKeys.every(key => !!auctionData[key])) { + return; + } + const pubxaiAnalyticsRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + hostname: auctionData.initOptions && auctionData.initOptions.hostName || defaultHost, + pathname: path, + search: { + auctionTimestamp: auctionData.auctionDetail.timestamp, + pubxaiAnalyticsVersion: pubxaiAnalyticsVersion, + prebidVersion: "9.45.0-pre", + pubxId: initOptions.pubxId + } + }); + sendCache[pubxaiAnalyticsRequestUrl].push(data); + auctionCache[auctionId].sendAs.push(eventType); + }); +}; +const send = () => { + const toBlob = d => new Blob([JSON.stringify(d)], { + type: 'text/json' + }); + Object.entries(sendCache).forEach(_ref3 => { + let [requestUrl, events] = _ref3; + let payloadStart = 0; + events.forEach((event, index, arr) => { + const payload = arr.slice(payloadStart, index + 2); + const payloadTooLarge = toBlob(payload).size > 65536; + if (payloadTooLarge || index + 1 === arr.length) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_8__.sendBeacon)(requestUrl, toBlob(payloadTooLarge ? payload.slice(0, -1) : payload)); + payloadStart = index; + } + }); + events.splice(0); + }); +}; + +// register event listener to send logs when user leaves page +if (document.visibilityState) { + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'hidden') { + send(); + } + }); +} + +// declare the analytics adapter +var pubxaiAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_9__["default"])({ + emptyUrl, + analyticsType +}), { + track +}); +pubxaiAnalyticsAdapter.originEnableAnalytics = pubxaiAnalyticsAdapter.enableAnalytics; +pubxaiAnalyticsAdapter.enableAnalytics = config => { + initOptions = config.options; + pubxaiAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_10__["default"].registerAnalyticsAdapter({ + adapter: pubxaiAnalyticsAdapter, + code: adapterCode +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pubxaiAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('pubxaiAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","gptUtils","userAgentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubxaiAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pubxaiRtdProvider"],{ + +/***/ "./modules/priceFloors.js": +/*!********************************!*\ + !*** ./modules/priceFloors.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ continueAuction: () => (/* binding */ continueAuction), +/* harmony export */ createFloorsDataForAuction: () => (/* binding */ createFloorsDataForAuction) +/* harmony export */ }); +/* unused harmony exports FLOOR_SKIPPED_REASON, allowedFields, _floorDataForAuction, fieldMatchingFunctions, getFirstMatchingFloor, getBiddersCpmAdjustment, calculateAdjustedFloor, getFloor, getFloorsDataForAuction, getFloorDataFromAdUnits, updateAdUnitsForAuction, pickRandomModel, normalizeDefault, isFloorsDataValid, parseFloorData, requestBidsHook, handleFetchResponse, generateAndHandleFetch, handleSetFloorsConfig, addBidResponseHook, setOrtbImpBidFloor, setGranularBidfloors, setImpExtPrebidFloors, setOrtbExtPrebidFloors */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/bidderSettings.js */ "./src/bidderSettings.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_utils_cpm_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/utils/cpm.js */ "./src/utils/cpm.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../libraries/currencyUtils/currency.js */ "./libraries/currencyUtils/currency.js"); +/* harmony import */ var _libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/timeoutQueue/timeoutQueue.js */ "./libraries/timeoutQueue/timeoutQueue.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + + + + + + + + + + + + + + +const FLOOR_SKIPPED_REASON = { + NOT_FOUND: 'not_found', + RANDOM: 'random' +}; + +/** + * @summary This Module is intended to provide users with the ability to dynamically set and enforce price floors on a per auction basis. + */ +const MODULE_NAME = 'Price Floors'; + +/** + * @summary Instantiate Ajax so we control the timeout + */ +const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajaxBuilder)(10000); + +// eslint-disable-next-line symbol-description +const SYN_FIELD = Symbol(); + +/** + * @summary Allowed fields for rules to have + */ +let allowedFields = [SYN_FIELD, 'gptSlot', 'adUnitCode', 'size', 'domain', 'mediaType']; + +/** + * @summary This is a flag to indicate if a AJAX call is processing for a floors request + */ +let fetching = false; + +/** + * @summary so we only register for our hooks once + */ +let addedFloorsHook = false; + +/** + * @summary The config to be used. Can be updated via: setConfig or a real time fetch + */ +let _floorsConfig = {}; + +/** + * @summary If a auction is to be delayed by an ongoing fetch we hold it here until it can be resumed + */ +const _delayedAuctions = (0,_libraries_timeoutQueue_timeoutQueue_js__WEBPACK_IMPORTED_MODULE_1__.timeoutQueue)(); + +/** + * @summary Each auction can have differing floors data depending on execution time or per adunit setup + * So we will be saving each auction offset by it's auctionId in order to make sure data is not changed + * Once the auction commences + */ +let _floorDataForAuction = {}; + +/** + * @summary Simple function to round up to a certain decimal degree + */ +function roundUp(number, precision) { + return Math.ceil((parseFloat(number) * Math.pow(10, precision)).toFixed(1)) / Math.pow(10, precision); +} +const getHostname = (() => { + let domain; + return function () { + if (domain == null) { + domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)((0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().topmostLocation, { + noDecodeWholeURL: true + }).hostname; + } + return domain; + }; +})(); + +// First look into bidRequest! +function getGptSlotFromAdUnit(adUnitId) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const adUnit = index.getAdUnit({ + adUnitId + }); + const isGam = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(adUnit, 'ortb2Imp.ext.data.adserver.name') === 'gam'; + return isGam && adUnit.ortb2Imp.ext.data.adserver.adslot; +} +function getAdUnitCode(request, response) { + let { + index = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return request?.adUnitCode || index.getAdUnit(response).code; +} + +/** + * @summary floor field types with their matching functions to resolve the actual matched value + */ +let fieldMatchingFunctions = { + [SYN_FIELD]: () => '*', + 'size': (bidRequest, bidResponse) => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseGPTSingleSizeArray)(bidResponse.size) || '*', + 'mediaType': (bidRequest, bidResponse) => bidResponse.mediaType || 'banner', + 'gptSlot': (bidRequest, bidResponse) => getGptSlotFromAdUnit((bidRequest || bidResponse).adUnitId) || (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.getGptSlotInfoForAdUnitCode)(getAdUnitCode(bidRequest, bidResponse)).gptSlot, + 'domain': getHostname, + 'adUnitCode': (bidRequest, bidResponse) => getAdUnitCode(bidRequest, bidResponse) +}; + +/** + * @summary Based on the fields array in floors data, it enumerates all possible matches based on exact match coupled with + * a "*" catch-all match + * Returns array of Tuple [exact match, catch all] for each field in rules file + */ +function enumeratePossibleFieldValues(floorFields, bidObject, responseObject) { + if (!floorFields.length) return []; + // generate combination of all exact matches and catch all for each field type + return floorFields.reduce((accum, field) => { + let exactMatch = fieldMatchingFunctions[field](bidObject, responseObject) || '*'; + // storing exact matches as lowerCase since we want to compare case insensitively + accum.push(exactMatch === '*' ? ['*'] : [exactMatch.toLowerCase(), '*']); + return accum; + }, []); +} + +/** + * @summary get's the first matching floor based on context provided. + * Generates all possible rule matches and picks the first matching one. + */ +function getFirstMatchingFloor(floorData, bidObject) { + let responseObject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let fieldValues = enumeratePossibleFieldValues((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'schema.fields') || [], bidObject, responseObject); + if (!fieldValues.length) { + return { + matchingFloor: undefined + }; + } + + // look to see if a request for this context was made already + let matchingInput = fieldValues.map(field => field[0]).join('-'); + // if we already have gotten the matching rule from this matching input then use it! No need to look again + let previousMatch = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, `matchingInputs.${matchingInput}`); + if (previousMatch) { + return { + ...previousMatch + }; + } + let allPossibleMatches = generatePossibleEnumerations(fieldValues, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'schema.delimiter') || '|'); + let matchingRule = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.find)(allPossibleMatches, hashValue => floorData.values.hasOwnProperty(hashValue)); + let matchingData = { + floorMin: floorData.floorMin || 0, + floorRuleValue: floorData.values[matchingRule], + matchingData: allPossibleMatches[0], + // the first possible match is an "exact" so contains all data relevant for anlaytics adapters + matchingRule: matchingRule === floorData.meta?.defaultRule ? undefined : matchingRule + }; + // use adUnit floorMin as priority! + const floorMin = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bidObject, 'ortb2Imp.ext.prebid.floors.floorMin'); + if (typeof floorMin === 'number') { + matchingData.floorMin = floorMin; + } + matchingData.matchingFloor = Math.max(matchingData.floorMin, matchingData.floorRuleValue); + // save for later lookup if needed + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(floorData, `matchingInputs.${matchingInput}`, { + ...matchingData + }); + return matchingData; +} + +/** + * @summary Generates all possible rule hash's based on input array of array's + * The generated list is of all possible key matches based on fields input + * The list is sorted by least amount of * in rule to most with left most fields taking precedence + */ +function generatePossibleEnumerations(arrayOfFields, delimiter) { + return arrayOfFields.reduce((accum, currentVal) => { + let ret = []; + accum.map(obj => { + currentVal.map(obj1 => { + ret.push(obj + delimiter + obj1); + }); + }); + return ret; + }).sort((left, right) => left.split('*').length - right.split('*').length); +} + +/** + * @summary If a the input bidder has a registered cpmadjustment it returns the input CPM after being adjusted + */ +function getBiddersCpmAdjustment(inputCpm, bid, bidRequest) { + return parseFloat((0,_src_utils_cpm_js__WEBPACK_IMPORTED_MODULE_9__.adjustCpm)(inputCpm, { + ...bid, + cpm: inputCpm + }, bidRequest)); +} + +/** + * @summary This function takes the original floor and the adjusted floor in order to determine the bidders actual floor + * With js rounding errors with decimal division we utilize similar method as shown in cpmBucketManager.js + */ +function calculateAdjustedFloor(oldFloor, newFloor) { + const pow = Math.pow(10, 10); + return oldFloor * pow / (newFloor * pow) * (oldFloor * pow) / pow; +} + +/** + * @summary gets the prebid set sizes depending on the input mediaType + */ +const getMediaTypesSizes = { + banner: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.banner.sizes') || [], + video: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.video.playerSize') || [], + native: bid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.image.sizes') ? [(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes.native.image.sizes')] : [] +}; + +/** + * @summary for getFloor only, before selecting a rule, if a bidAdapter asks for * in their getFloor params + * Then we may be able to get a better rule than the * ones depending on context of the adUnit + */ +function updateRequestParamsFromContext(bidRequest, requestParams) { + // if adapter asks for *'s then we can do some logic to infer if we can get a more specific rule based on context of bid + let mediaTypesOnBid = Object.keys(bidRequest.mediaTypes || {}); + // if there is only one mediaType then we can just use it + if (requestParams.mediaType === '*' && mediaTypesOnBid.length === 1) { + requestParams.mediaType = mediaTypesOnBid[0]; + } + // if they asked for * size, but for the given mediaType there is only one size, we can just use it + if (requestParams.size === '*' && mediaTypesOnBid.indexOf(requestParams.mediaType) !== -1 && getMediaTypesSizes[requestParams.mediaType] && getMediaTypesSizes[requestParams.mediaType](bidRequest).length === 1) { + requestParams.size = getMediaTypesSizes[requestParams.mediaType](bidRequest)[0]; + } + return requestParams; +} + +/** + * @summary This is the function which will return a single floor based on the input requests + * and matching it to a rule for the current auction + */ +function getFloor() { + let requestParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + currency: 'USD', + mediaType: '*', + size: '*' + }; + let bidRequest = this; + let floorData = _floorDataForAuction[bidRequest.auctionId]; + if (!floorData || floorData.skipped) return {}; + requestParams = updateRequestParamsFromContext(bidRequest, requestParams); + let floorInfo = getFirstMatchingFloor(floorData.data, { + ...bidRequest + }, { + mediaType: requestParams.mediaType, + size: requestParams.size + }); + let currency = requestParams.currency || floorData.data.currency; + + // if bidder asked for a currency which is not what floors are set in convert + if (floorInfo.matchingFloor && currency !== floorData.data.currency) { + try { + floorInfo.matchingFloor = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency(floorInfo.matchingFloor, floorData.data.currency, currency); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Unable to get currency conversion for getFloor for bidder ${bidRequest.bidder}. You must have currency module enabled with defaultRates in your currency config`); + // since we were unable to convert to the bidders requested currency, we send back just the actual floors currency to them + currency = floorData.data.currency; + } + } + + // if cpmAdjustment flag is true and we have a valid floor then run the adjustment on it + if (floorData.enforcement.bidAdjustment && floorInfo.matchingFloor) { + // pub provided inverse function takes precedence, otherwise do old adjustment stuff + const inverseFunction = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_11__.bidderSettings.get(bidRequest.bidder, 'inverseBidAdjustment'); + if (inverseFunction) { + const definedParams = Object.fromEntries(Object.entries(requestParams).filter(_ref => { + let [key, val] = _ref; + return val !== '*' && ['mediaType', 'size'].includes(key); + })); + floorInfo.matchingFloor = inverseFunction(floorInfo.matchingFloor, bidRequest, definedParams); + } else { + let cpmAdjustment = getBiddersCpmAdjustment(floorInfo.matchingFloor, null, bidRequest); + floorInfo.matchingFloor = cpmAdjustment ? calculateAdjustedFloor(floorInfo.matchingFloor, cpmAdjustment) : floorInfo.matchingFloor; + } + } + if (floorInfo.floorRuleValue === null) { + return null; + } + if (floorInfo.matchingFloor) { + return { + floor: roundUp(floorInfo.matchingFloor, 4), + currency + }; + } + return {}; +} + +/** + * @summary Takes a floorsData object and converts it into a hash map with appropriate keys + */ +function getFloorsDataForAuction(floorData, adUnitCode) { + let auctionFloorData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(floorData); + auctionFloorData.schema.delimiter = floorData.schema.delimiter || '|'; + auctionFloorData.values = normalizeRulesForAuction(auctionFloorData, adUnitCode); + // default the currency to USD if not passed in + auctionFloorData.currency = auctionFloorData.currency || 'USD'; + return auctionFloorData; +} + +/** + * @summary if adUnitCode needs to be added to the offset then it will add it else just return the values + */ +function normalizeRulesForAuction(floorData, adUnitCode) { + let fields = floorData.schema.fields; + let delimiter = floorData.schema.delimiter; + + // if we are building the floor data form an ad unit, we need to append adUnit code as to not cause collisions + let prependAdUnitCode = adUnitCode && fields.indexOf('adUnitCode') === -1 && fields.unshift('adUnitCode'); + return Object.keys(floorData.values).reduce((rulesHash, oldKey) => { + let newKey = prependAdUnitCode ? `${adUnitCode}${delimiter}${oldKey}` : oldKey; + // we store the rule keys as lower case for case insensitive compare + rulesHash[newKey.toLowerCase()] = floorData.values[oldKey]; + return rulesHash; + }, {}); +} + +/** + * @summary This function will take the adUnits and generate a floor data object to be used during the auction + * Only called if no set config or fetch level data has returned + */ +function getFloorDataFromAdUnits(adUnits) { + const schemaAu = adUnits.find(au => au.floors?.schema != null); + return adUnits.reduce((accum, adUnit) => { + if (adUnit.floors?.schema != null && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepEqual)(adUnit.floors.schema, schemaAu?.floors?.schema)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: adUnit '${adUnit.code}' declares a different schema from one previously declared by adUnit '${schemaAu.code}'. Floor config for '${adUnit.code}' will be ignored.`); + return accum; + } + const floors = Object.assign({}, schemaAu?.floors, { + values: undefined + }, adUnit.floors); + if (isFloorsDataValid(floors)) { + // if values already exist we want to not overwrite them + if (!accum.values) { + accum = getFloorsDataForAuction(floors, adUnit.code); + accum.location = 'adUnit'; + } else { + let newRules = getFloorsDataForAuction(floors, adUnit.code).values; + // copy over the new rules into our values object + Object.assign(accum.values, newRules); + } + } else if (adUnit.floors != null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`adUnit '${adUnit.code}' provides an invalid \`floor\` definition, it will be ignored for floor calculations`, adUnit); + } + return accum; + }, {}); +} +function getNoFloorSignalBidersArray(floorData) { + const { + data, + enforcement + } = floorData; + // The data.noFloorSignalBidders higher priority then the enforcment + if (data?.noFloorSignalBidders?.length > 0) { + return data.noFloorSignalBidders; + } else if (enforcement?.noFloorSignalBidders?.length > 0) { + return enforcement.noFloorSignalBidders; + } + return []; +} + +/** + * @summary This function takes the adUnits for the auction and update them accordingly as well as returns the rules hashmap for the auction + */ +function updateAdUnitsForAuction(adUnits, floorData, auctionId) { + const noFloorSignalBiddersArray = getNoFloorSignalBidersArray(floorData); + adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + // check if the bidder is in the no signal list + const isNoFloorSignaled = noFloorSignalBiddersArray.some(bidderName => bidderName === bid.bidder); + if (floorData.skipped || isNoFloorSignaled) { + isNoFloorSignaled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`noFloorSignal to ${bid.bidder}`); + delete bid.getFloor; + } else { + bid.getFloor = getFloor; + } + // information for bid and analytics adapters + bid.auctionId = auctionId; + bid.floorData = { + noFloorSignaled: isNoFloorSignaled, + skipped: floorData.skipped, + skipRate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.skipRate') ?? floorData.skipRate, + skippedReason: floorData.skippedReason, + floorMin: floorData.floorMin, + modelVersion: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelVersion'), + modelWeight: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelWeight'), + modelTimestamp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.modelTimestamp'), + location: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'data.location', 'noData'), + floorProvider: floorData.floorProvider, + fetchStatus: _floorsConfig.fetchStatus + }; + }); + }); +} +function pickRandomModel(modelGroups, weightSum) { + // we loop through the models subtracting the current model weight from our random number + // once we are at or below zero, we return the associated model + let random = Math.floor(Math.random() * weightSum + 1); + for (let i = 0; i < modelGroups.length; i++) { + random -= modelGroups[i].modelWeight; + if (random <= 0) { + return modelGroups[i]; + } + } +} +; + +/** + * @summary Updates the adUnits accordingly and returns the necessary floorsData for the current auction + */ +function createFloorsDataForAuction(adUnits, auctionId) { + let resolvedFloorsData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(_floorsConfig); + // if using schema 2 pick a model here: + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.floorsSchemaVersion') === 2) { + // merge the models specific stuff into the top level data settings (now it looks like floorsSchemaVersion 1!) + let { + modelGroups, + ...rest + } = resolvedFloorsData.data; + resolvedFloorsData.data = Object.assign(rest, pickRandomModel(modelGroups, rest.modelWeightSum)); + } + + // if we do not have a floors data set, we will try to use data set on adUnits + let useAdUnitData = Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.values') || {}).length === 0; + if (useAdUnitData) { + resolvedFloorsData.data = getFloorDataFromAdUnits(adUnits); + } else { + resolvedFloorsData.data = getFloorsDataForAuction(resolvedFloorsData.data); + } + // if we still do not have a valid floor data then floors is not on for this auction, so skip + if (Object.keys((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.values') || {}).length === 0) { + resolvedFloorsData.skipped = true; + resolvedFloorsData.skippedReason = FLOOR_SKIPPED_REASON.NOT_FOUND; + } else { + // determine the skip rate now + const auctionSkipRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getParameterByName)('pbjs_skipRate') || ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(resolvedFloorsData, 'data.skipRate') ?? resolvedFloorsData.skipRate); + const isSkipped = Math.random() * 100 < parseFloat(auctionSkipRate); + resolvedFloorsData.skipped = isSkipped; + if (isSkipped) resolvedFloorsData.skippedReason = FLOOR_SKIPPED_REASON.RANDOM; + } + // copy FloorMin to floorData.data + if (resolvedFloorsData.hasOwnProperty('floorMin')) resolvedFloorsData.data.floorMin = resolvedFloorsData.floorMin; + // add floorData to bids + updateAdUnitsForAuction(adUnits, resolvedFloorsData, auctionId); + return resolvedFloorsData; +} + +/** + * @summary This is the function which will be called to exit our module and continue the auction. + */ +function continueAuction(hookConfig) { + if (!hookConfig.hasExited) { + // We need to know the auctionId at this time. So we will use the passed in one or generate and set it ourselves + hookConfig.reqBidsConfigObj.auctionId = hookConfig.reqBidsConfigObj.auctionId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + // now we do what we need to with adUnits and save the data object to be used for getFloor and enforcement calls + _floorDataForAuction[hookConfig.reqBidsConfigObj.auctionId] = createFloorsDataForAuction(hookConfig.reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().adUnits, hookConfig.reqBidsConfigObj.auctionId); + hookConfig.nextFn.apply(hookConfig.context, [hookConfig.reqBidsConfigObj]); + hookConfig.hasExited = true; + } +} +function validateSchemaFields(fields) { + if (Array.isArray(fields) && fields.length > 0) { + if (fields.every(field => allowedFields.includes(field))) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Fields received do not match allowed fields`); + } + } + return false; +} +function isValidRule(key, floor, numFields, delimiter) { + if (typeof key !== 'string' || key.split(delimiter).length !== numFields) { + return false; + } + return typeof floor === 'number' || floor === null; +} +function validateRules(floorsData, numFields, delimiter) { + if (typeof floorsData.values !== 'object') { + return false; + } + // if an invalid rule exists we remove it + floorsData.values = Object.keys(floorsData.values).reduce((filteredRules, key) => { + if (isValidRule(key, floorsData.values[key], numFields, delimiter)) { + filteredRules[key] = floorsData.values[key]; + } + return filteredRules; + }, {}); + // rules is only valid if at least one rule remains + return Object.keys(floorsData.values).length > 0; +} +function normalizeDefault(model) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(model.default)) { + let defaultRule = '*'; + const numFields = (model.schema?.fields || []).length; + if (!numFields) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(model, 'schema.fields', [SYN_FIELD]); + } else { + defaultRule = Array(numFields).fill('*').join(model.schema?.delimiter || '|'); + } + model.values = model.values || {}; + if (model.values[defaultRule] == null) { + model.values[defaultRule] = model.default; + model.meta = { + defaultRule + }; + } + } + return model; +} +function modelIsValid(model) { + model = normalizeDefault(model); + // schema.fields has only allowed attributes + if (!validateSchemaFields((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(model, 'schema.fields'))) { + return false; + } + return validateRules(model, model.schema.fields.length, model.schema.delimiter || '|'); +} + +/** + * @summary Mapping of floor schema version to it's corresponding validation + */ +const floorsSchemaValidation = { + 1: data => modelIsValid(data), + 2: data => { + // model groups should be an array with at least one element + if (!Array.isArray(data.modelGroups) || data.modelGroups.length === 0) { + return false; + } + // every model should have valid schema, as well as an accompanying modelWeight + data.modelWeightSum = 0; + return data.modelGroups.every(model => { + if (typeof model.modelWeight === 'number' && modelIsValid(model)) { + data.modelWeightSum += model.modelWeight; + return true; + } + return false; + }); + } +}; + +/** + * @summary Fields array should have at least one entry and all should match allowed fields + * Each rule in the values array should have a 'key' and 'floor' param + * And each 'key' should have the correct number of 'fields' after splitting + * on the delim. If rule does not match remove it. return if still at least 1 rule + */ +function isFloorsDataValid(floorsData) { + if (typeof floorsData !== 'object') { + return false; + } + floorsData.floorsSchemaVersion = floorsData.floorsSchemaVersion || 1; + if (typeof floorsSchemaValidation[floorsData.floorsSchemaVersion] !== 'function') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Unknown floorsSchemaVersion: `, floorsData.floorsSchemaVersion); + return false; + } + return floorsSchemaValidation[floorsData.floorsSchemaVersion](floorsData); +} + +/** + * @summary This function updates the global Floors Data field based on the new one passed in if it is valid + */ +function parseFloorData(floorsData, location) { + if (floorsData && typeof floorsData === 'object' && isFloorsDataValid(floorsData)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE_NAME}: A ${location} set the auction floor data set to `, floorsData); + return { + ...floorsData, + location + }; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: The floors data did not contain correct values`, floorsData); +} + +/** + * + * @param {Object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + * @param {function} fn required; The next function in the chain, used by hook.js + */ +const requestBidsHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__.timedAuctionHook)('priceFloors', function requestBidsHook(fn, reqBidsConfigObj) { + // preserves all module related variables for the current auction instance (used primiarily for concurrent auctions) + const hookConfig = { + reqBidsConfigObj, + context: this, + nextFn: fn, + hasExited: false, + timer: null + }; + + // If auction delay > 0 AND we are fetching -> Then wait until it finishes + if (_floorsConfig.auctionDelay > 0 && fetching) { + _delayedAuctions.submit(_floorsConfig.auctionDelay, () => continueAuction(hookConfig), () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Fetch attempt did not return in time for auction`); + _floorsConfig.fetchStatus = 'timeout'; + continueAuction(hookConfig); + }); + } else { + continueAuction(hookConfig); + } +}); + +/** + * This function handles the ajax response which comes from the user set URL to fetch floors data from + * @param {object} fetchResponse The floors data response which came back from the url configured in config.floors + */ +function handleFetchResponse(fetchResponse) { + fetching = false; + _floorsConfig.fetchStatus = 'success'; + let floorResponse; + try { + floorResponse = JSON.parse(fetchResponse); + } catch (ex) { + floorResponse = fetchResponse; + } + // Update the global floors object according to the fetched data + const fetchData = parseFloorData(floorResponse, 'fetch'); + if (fetchData) { + // set .data to it + _floorsConfig.data = fetchData; + // set skipRate override if necessary + _floorsConfig.skipRate = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(fetchData.skipRate) ? fetchData.skipRate : _floorsConfig.skipRate; + _floorsConfig.floorProvider = fetchData.floorProvider || _floorsConfig.floorProvider; + } + + // if any auctions are waiting for fetch to finish, we need to continue them! + _delayedAuctions.resume(); +} +function handleFetchError(status) { + fetching = false; + _floorsConfig.fetchStatus = 'error'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Fetch errored with: `, status); + + // if any auctions are waiting for fetch to finish, we need to continue them! + _delayedAuctions.resume(); +} + +/** + * This function handles sending and receiving the AJAX call for a floors fetch + * @param {object} floorEndpoint the floors config coming from setConfig + */ +function generateAndHandleFetch(floorEndpoint) { + // if a fetch url is defined and one is not already occuring, fire it! + if (floorEndpoint.url && !fetching) { + // default to GET and we only support GET for now + let requestMethod = floorEndpoint.method || 'GET'; + if (requestMethod !== 'GET') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: 'GET' is the only request method supported at this time!`); + } else { + ajax(floorEndpoint.url, { + success: handleFetchResponse, + error: handleFetchError + }, null, { + method: 'GET' + }); + fetching = true; + } + } else if (fetching) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: A fetch is already occuring. Skipping.`); + } +} + +/** + * @summary Updates our allowedFields and fieldMatchingFunctions with the publisher defined new ones + */ +function addFieldOverrides(overrides) { + Object.keys(overrides).forEach(override => { + // we only add it if it is not already in the allowed fields and if the passed in value is a function + if (allowedFields.indexOf(override) === -1 && typeof overrides[override] === 'function') { + allowedFields.push(override); + fieldMatchingFunctions[override] = overrides[override]; + } + }); +} + +/** + * @summary This is the function which controls what happens during a pbjs.setConfig({...floors: {}}) is called + */ +function handleSetFloorsConfig(config) { + _floorsConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(config, ['floorMin', 'enabled', enabled => enabled !== false, + // defaults to true + 'auctionDelay', auctionDelay => auctionDelay || 0, 'floorProvider', floorProvider => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(config, 'data.floorProvider', floorProvider), 'endpoint', endpoint => endpoint || {}, 'skipRate', () => !isNaN((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(config, 'data.skipRate')) ? config.data.skipRate : config.skipRate || 0, 'enforcement', enforcement => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.pick)(enforcement || {}, ['enforceJS', enforceJS => enforceJS !== false, + // defaults to true + 'enforcePBS', enforcePBS => enforcePBS === true, + // defaults to false + 'floorDeals', floorDeals => floorDeals === true, + // defaults to false + 'bidAdjustment', bidAdjustment => bidAdjustment !== false, + // defaults to true, + 'noFloorSignalBidders', noFloorSignalBidders => noFloorSignalBidders || []]), 'additionalSchemaFields', additionalSchemaFields => typeof additionalSchemaFields === 'object' && Object.keys(additionalSchemaFields).length > 0 ? addFieldOverrides(additionalSchemaFields) : undefined, 'data', data => data && parseFloorData(data, 'setConfig') || undefined]); + + // if enabled then do some stuff + if (_floorsConfig.enabled) { + // handle the floors fetch + generateAndHandleFetch(_floorsConfig.endpoint); + if (!addedFloorsHook) { + // register hooks / listening events + // when auction finishes remove it's associated floor data after 3 seconds so we stil have it for latent responses + _src_events_js__WEBPACK_IMPORTED_MODULE_13__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.EVENTS.AUCTION_END, args => { + setTimeout(() => delete _floorDataForAuction[args.auctionId], 3000); + }); + + // we want our hooks to run after the currency hooks + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().requestBids.before(requestBidsHook, 50); + // if user has debug on then we want to allow the debugging module to run before this, assuming they are testing priceFloors + // debugging is currently set at 5 priority + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_15__.getHook)('addBidResponse').before(addBidResponseHook, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.debugTurnedOn)() ? 4 : 50); + addedFloorsHook = true; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${MODULE_NAME}: Turning off module`); + _floorsConfig = {}; + _floorDataForAuction = {}; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_15__.getHook)('addBidResponse').getHooks({ + hook: addBidResponseHook + }).remove(); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().requestBids.getHooks({ + hook: requestBidsHook + }).remove(); + addedFloorsHook = false; + } +} + +/** + * @summary Analytics adapters especially need context of what the floors module is doing in order + * to best create informed models. This function attaches necessary information to the bidResponse object for processing + */ +function addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm) { + bid.floorData = { + floorValue: floorInfo.matchingFloor, + floorRule: floorInfo.matchingRule, + floorRuleValue: floorInfo.floorRuleValue, + floorCurrency: floorData.data.currency, + cpmAfterAdjustments: adjustedCpm, + enforcements: { + ...floorData.enforcement + }, + matchedFields: {} + }; + floorData.data.schema.fields.forEach((field, index) => { + let matchedValue = floorInfo.matchingData.split(floorData.data.schema.delimiter)[index]; + bid.floorData.matchedFields[field] = matchedValue; + }); +} + +/** + * @summary takes the enforcement flags and the bid itself and determines if it should be floored + */ +function shouldFloorBid(floorData, floorInfo, bid) { + let enforceJS = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'enforcement.enforceJS') !== false; + let shouldFloorDeal = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(floorData, 'enforcement.floorDeals') === true || !bid.dealId; + let bidBelowFloor = bid.floorData.cpmAfterAdjustments < floorInfo.matchingFloor; + return enforceJS && bidBelowFloor && shouldFloorDeal; +} + +/** + * @summary The main driving force of floors. On bidResponse we hook in and intercept bidResponses. + * And if the rule we find determines a bid should be floored we will do so. + */ +const addBidResponseHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_12__.timedBidResponseHook)('priceFloors', function addBidResponseHook(fn, adUnitCode, bid, reject) { + let floorData = _floorDataForAuction[bid.auctionId]; + // if no floor data then bail + if (!floorData || !bid || floorData.skipped) { + return fn.call(this, adUnitCode, bid, reject); + } + const matchingBidRequest = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.index.getBidRequest(bid); + + // get the matching rule + let floorInfo = getFirstMatchingFloor(floorData.data, matchingBidRequest, { + ...bid, + size: [bid.width, bid.height] + }); + if (!floorInfo.matchingFloor) { + if (floorInfo.matchingFloor !== 0) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: unable to determine a matching price floor for bidResponse`, bid); + return fn.call(this, adUnitCode, bid, reject); + } + + // determine the base cpm to use based on if the currency matches the floor currency + let adjustedCpm; + let floorCurrency = floorData.data.currency.toUpperCase(); + let bidResponseCurrency = bid.currency || 'USD'; // if an adapter does not set a bid currency and currency module not on it may come in as undefined + if (floorCurrency === bidResponseCurrency.toUpperCase()) { + adjustedCpm = bid.cpm; + } else if (bid.originalCurrency && floorCurrency === bid.originalCurrency.toUpperCase()) { + adjustedCpm = bid.originalCpm; + } else { + try { + adjustedCpm = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.getGlobal)().convertCurrency(bid.cpm, bidResponseCurrency.toUpperCase(), floorCurrency); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Unable do get currency conversion for bidResponse to Floor Currency. Do you have Currency module enabled? ${bid}`); + return fn.call(this, adUnitCode, bid, reject); + } + } + + // ok we got the bid response cpm in our desired currency. Now we need to run the bidders CPMAdjustment function if it exists + adjustedCpm = getBiddersCpmAdjustment(adjustedCpm, bid, matchingBidRequest); + + // add necessary data information for analytics adapters / floor providers would possibly need + addFloorDataToBid(floorData, floorInfo, bid, adjustedCpm); + + // now do the compare! + if (shouldFloorBid(floorData, floorInfo, bid)) { + // bid fails floor -> throw it out + reject(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.REJECTION_REASON.FLOOR_NOT_MET); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: ${bid.bidderCode}'s Bid Response for ${adUnitCode} was rejected due to floor not met (adjusted cpm: ${bid?.floorData?.cpmAfterAdjustments}, floor: ${floorInfo?.matchingFloor})`, bid); + return; + } + return fn.call(this, adUnitCode, bid, reject); +}); +_src_config_js__WEBPACK_IMPORTED_MODULE_16__.config.getConfig('floors', config => handleSetFloorsConfig(config.floors)); +function tryGetFloor(bidRequest, _ref2, fn) { + let { + currency = _src_config_js__WEBPACK_IMPORTED_MODULE_16__.config.getConfig('currency.adServerCurrency') || 'USD', + mediaType = '*', + size = '*' + } = _ref2; + if (typeof bidRequest.getFloor === 'function') { + let floor; + try { + floor = bidRequest.getFloor({ + currency, + mediaType, + size + }) || {}; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Cannot compute floor for bid', bidRequest); + return; + } + floor.floor = parseFloat(floor.floor); + if (floor.currency != null && floor.floor && !isNaN(floor.floor)) { + fn(floor.floor, floor.currency); + } + } +} + +/** + * Sets bidfloor and bidfloorcur for ORTB imp objects + */ +function setOrtbImpBidFloor(imp, bidRequest, context) { + tryGetFloor(bidRequest, { + currency: context.currency, + mediaType: context.mediaType || '*', + size: '*' + }, (bidfloor, bidfloorcur) => { + Object.assign(imp, { + bidfloor, + bidfloorcur + }); + }); +} + +/** + * Set per-mediatype and per-format bidfloor + */ +function setGranularBidfloors(imp, bidRequest, context) { + function setIfDifferent(bidfloor, bidfloorcur) { + if (bidfloor !== imp.bidfloor || bidfloorcur !== imp.bidfloorcur) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(this, 'ext.bidfloor', bidfloor); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(this, 'ext.bidfloorcur', bidfloorcur); + } + } + Object.values(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.ALL_MEDIATYPES).filter(mediaType => imp[mediaType] != null).forEach(mediaType => { + tryGetFloor(bidRequest, { + currency: imp.bidfloorcur || context?.currency, + mediaType + }, setIfDifferent.bind(imp[mediaType])); + }); + (imp[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.BANNER]?.format || []).filter(_ref3 => { + let { + w, + h + } = _ref3; + return w != null && h != null; + }).forEach(format => { + tryGetFloor(bidRequest, { + currency: imp.bidfloorcur || context?.currency, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_17__.BANNER, + size: [format.w, format.h] + }, setIfDifferent.bind(format)); + }); +} +function setImpExtPrebidFloors(imp, bidRequest, context) { + // logic below relates to https://github.com/prebid/Prebid.js/issues/8749 and does the following: + // 1. check client-side floors (ref bidfloor/bidfloorcur & ortb2Imp floorMin/floorMinCur (if present)) + // 2. set pbs req wide floorMinCur to the first floor currency found when iterating over imp's + // (if currency conversion logic present, convert all imp floor values to this currency) + // 3. compare/store ref to lowest floorMin value as each imp is iterated over + // 4. set req wide floorMin and floorMinCur values for pbs after iterations are done + + if (imp.bidfloor != null) { + let { + floorMinCur, + floorMin + } = context.reqContext.floorMin || {}; + if (floorMinCur == null) { + floorMinCur = imp.bidfloorcur; + } + const ortb2ImpFloorCur = imp.ext?.prebid?.floors?.floorMinCur || imp.ext?.prebid?.floorMinCur || floorMinCur; + const ortb2ImpFloorMin = imp.ext?.prebid?.floors?.floorMin || imp.ext?.prebid?.floorMin; + const convertedFloorMinValue = (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__.convertCurrency)(imp.bidfloor, imp.bidfloorcur, floorMinCur); + const convertedOrtb2ImpFloorMinValue = ortb2ImpFloorMin && ortb2ImpFloorCur ? (0,_libraries_currencyUtils_currency_js__WEBPACK_IMPORTED_MODULE_18__.convertCurrency)(ortb2ImpFloorMin, ortb2ImpFloorCur, floorMinCur) : false; + const lowestImpFloorMin = convertedOrtb2ImpFloorMinValue && convertedOrtb2ImpFloorMinValue < convertedFloorMinValue ? convertedOrtb2ImpFloorMinValue : convertedFloorMinValue; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(imp, 'ext.prebid.floors.floorMin', lowestImpFloorMin); + if (floorMin == null || floorMin > lowestImpFloorMin) { + floorMin = lowestImpFloorMin; + } + context.reqContext.floorMin = { + floorMin, + floorMinCur + }; + } +} + +/** + * PBS specific extension: set ext.prebid.floors.enabled = false if floors are processed client-side + */ +function setOrtbExtPrebidFloors(ortbRequest, bidderRequest, context) { + if (addedFloorsHook) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(ortbRequest, 'ext.prebid.floors.enabled', ortbRequest.ext?.prebid?.floors?.enabled || false); + } + if (context?.floorMin) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ortbRequest, { + ext: { + prebid: { + floors: context.floorMin + } + } + }); + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'bidfloor', + fn: setOrtbImpBidFloor +}); +// granular floors should be set after both "normal" bidfloors and mediaypes +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'extBidfloor', + fn: setGranularBidfloors, + priority: -10 +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.IMP, + name: 'extPrebidFloors', + fn: setImpExtPrebidFloors, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.PBS], + priority: -1 +}); +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.REQUEST, + name: 'extPrebidFloors', + fn: setOrtbExtPrebidFloors, + dialects: [_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_19__.PBS] +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('priceFloors'); + +/***/ }), + +/***/ "./modules/pubxaiRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/pubxaiRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports FloorsApiStatus, storage, FLOORS_EVENT_HANDLE, FLOORS_END_POINT, FLOOR_PROVIDER, getFloorsConfig, setFloorsConfig, setDefaultPriceFloors, setPriceFloors, setFloorsApiStatus, getUrl, fetchFloorRules, pubxaiSubmodule, beforeInit */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _priceFloors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./priceFloors.js */ "./modules/priceFloors.js"); + + + + + + + +/** + * This RTD module has a dependency on the priceFloors module. + * We utilize the createFloorsDataForAuction function from the priceFloors module to incorporate price floors data into the current auction. + */ + // eslint-disable-line prebid/validate-imports + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'pubxai'; +window.__pubxFloorRulesPromise__ = null; +const FloorsApiStatus = Object.freeze({ + IN_PROGRESS: 'IN_PROGRESS', + SUCCESS: 'SUCCESS', + ERROR: 'ERROR' +}); +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +const FLOORS_EVENT_HANDLE = 'floorsApi'; +const FLOORS_END_POINT = 'https://floor.pbxai.com/'; +const FLOOR_PROVIDER = 'PubxFloorProvider'; +const getFloorsConfig = (provider, floorsResponse) => { + const floorsConfig = { + floors: { + enforcement: { + floorDeals: true + }, + data: floorsResponse + } + }; + const { + floorMin, + enforcement + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(provider, 'params'); + if (floorMin) { + floorsConfig.floors.floorMin = floorMin; + } + if (enforcement) { + floorsConfig.floors.enforcement = enforcement; + } + return floorsConfig; +}; +const setFloorsConfig = (provider, data) => { + if (data) { + const floorsConfig = getFloorsConfig(provider, data); + _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.setConfig(floorsConfig); + window.__pubxLoaded__ = true; + window.__pubxFloorsConfig__ = floorsConfig; + } else { + _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.setConfig({ + floors: window.__pubxPrevFloorsConfig__ + }); + window.__pubxLoaded__ = false; + window.__pubxFloorsConfig__ = null; + } +}; +const setDefaultPriceFloors = provider => { + const { + data + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(provider, 'params'); + if (data !== undefined) { + data.floorProvider = FLOOR_PROVIDER; + setFloorsConfig(provider, data); + } +}; +const setPriceFloors = async provider => { + window.__pubxPrevFloorsConfig__ = _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('floors'); + setDefaultPriceFloors(provider); + return fetchFloorRules(provider).then(floorsResponse => { + setFloorsConfig(provider, floorsResponse); + setFloorsApiStatus(FloorsApiStatus.SUCCESS); + }).catch(_ => { + setFloorsApiStatus(FloorsApiStatus.ERROR); + }); +}; +const setFloorsApiStatus = status => { + window.__pubxFloorsApiStatus__ = status; + window.dispatchEvent(new CustomEvent(FLOORS_EVENT_HANDLE, { + detail: { + status + } + })); +}; +const getUrl = provider => { + const { + pubxId, + endpoint + } = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(provider, 'params'); + if (!endpoint) { + return null; // Indicate that no endpoint is provided + } + return `${endpoint || FLOORS_END_POINT}?pubxId=${pubxId}&page=${window.location.href}`; +}; +const fetchFloorRules = async provider => { + return new Promise((resolve, reject) => { + setFloorsApiStatus(FloorsApiStatus.IN_PROGRESS); + const url = getUrl(provider); + if (url) { + // Fetch from remote endpoint + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(url, { + success: (responseText, response) => { + try { + if (response && response.response) { + const floorsResponse = JSON.parse(response.response); + resolve(floorsResponse); + } else { + resolve(null); + } + } catch (error) { + reject(error); + } + }, + error: (responseText, response) => { + reject(response); + } + }); + } else { + // Fetch from local storage + try { + const localData = storage.getDataFromSessionStorage('pubx:dynamicFloors') || window.__pubxDynamicFloors__; + if (localData) { + resolve(JSON.parse(localData)); + } else { + resolve(null); + } + } catch (error) { + reject(error); + } + } + }); +}; +const init = provider => { + window.__pubxFloorRulesPromise__ = setPriceFloors(provider); + return true; +}; +const getBidRequestData = (() => { + let floorsAttached = false; + return (reqBidsConfigObj, onDone) => { + if (!floorsAttached) { + (0,_priceFloors_js__WEBPACK_IMPORTED_MODULE_0__.createFloorsDataForAuction)(reqBidsConfigObj.adUnits, reqBidsConfigObj.auctionId); + window.__pubxFloorRulesPromise__.then(() => { + (0,_priceFloors_js__WEBPACK_IMPORTED_MODULE_0__.createFloorsDataForAuction)(reqBidsConfigObj.adUnits, reqBidsConfigObj.auctionId); + onDone(); + }); + floorsAttached = true; + } + }; +})(); +const pubxaiSubmodule = { + name: SUBMODULE_NAME, + init, + getBidRequestData +}; +const beforeInit = () => { + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)(MODULE_NAME, pubxaiSubmodule); +}; +beforeInit(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('pubxaiRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","gptUtils","currencyUtils","timeoutQueue","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pubxaiRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pulsepointAnalyticsAdapter"],{ + +/***/ "./modules/pulsepointAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/pulsepointAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + +/** + * pulsepoint.js - Analytics Adapter for PulsePoint + */ + + + +var pulsepointAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + global: 'PulsePointPrebidAnalytics', + handler: 'on', + analyticsType: 'bundle' +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: pulsepointAdapter, + code: 'pulsepoint' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (pulsepointAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('pulsepointAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pulsepointAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pulsepointBidAdapter"],{ + +/***/ "./modules/pulsepointBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/pulsepointBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +const DEFAULT_CURRENCY = 'USD'; +const KNOWN_PARAMS = ['cp', 'ct', 'cf', 'battr', 'deals']; +const DEFAULT_TMAX = 500; + +/** + * PulsePoint Bid Adapter. + * Contact: ExchangeTeam@pulsepoint.com + * + * Aliases - pulseLite and pulsepointLite are supported for backwards compatibility. + * Formats - Display/Native/Video formats supported. + * + */ +const spec = { + code: 'pulsepoint', + gvlid: 81, + aliases: ['pulseLite', 'pulsepointLite'], + supportedMediaTypes: ['banner', 'native', 'video'], + isBidRequestValid: bid => !!(bid && bid.params && bid.params.cp && bid.params.ct), + buildRequests: (bidRequests, bidderRequest) => { + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: 'https://bid.contextweb.com/header/ortb?src=prebid', + data, + bidderRequest + }; + }, + interpretResponse: (response, request) => { + if (response.body) { + return converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + } + return []; + }, + getUserSyncs: syncOptions => { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: 'https://bh.contextweb.com/visitormatch' + }]; + } else if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: 'https://bh.contextweb.com/visitormatch/prebid' + }]; + } + } +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: 'USD' + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + // tagid + imp.tagid = bidRequest.params.ct.toString(); + // unknown params + const unknownParams = slotUnknownParams(bidRequest); + if (imp.ext || unknownParams) { + imp.ext = Object.assign({}, imp.ext, unknownParams); + } + // battr + if (bidRequest.params.battr) { + ['banner', 'video', 'audio', 'native'].forEach(k => { + if (imp[k]) { + imp[k].battr = bidRequest.params.battr; + } + }); + } + // deals + if (bidRequest.params.deals && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidRequest.params.deals)) { + imp.pmp = { + private_auction: 0, + deals: bidRequest.params.deals + }; + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + // publisher id + const siteOrApp = request.site || request.app; + const pubId = context.bidRequests && context.bidRequests.length > 0 ? context.bidRequests[0].params.cp : '0'; + if (siteOrApp) { + siteOrApp.publisher = Object.assign({}, siteOrApp.publisher, { + id: pubId.toString() + }); + } + // tmax + request.tmax = request.tmax || DEFAULT_TMAX; + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.cur = bidResponse.cur || DEFAULT_CURRENCY; + return bidResponse; + } +}); + +/** + * Unknown params are captured and sent on ext + */ +function slotUnknownParams(slot) { + const ext = {}; + const knownParamsMap = {}; + KNOWN_PARAMS.forEach(value => knownParamsMap[value] = 1); + Object.keys(slot.params).forEach(key => { + if (!knownParamsMap[key]) { + ext[key] = slot.params[key]; + } + }); + return Object.keys(ext).length > 0 ? { + prebid: ext + } : null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pulsepointBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pulsepointBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["pxyzBidAdapter"],{ + +/***/ "./modules/pxyzBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/pxyzBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'pxyz'; +const URL = 'https://ads.playground.xyz/host-config/prebid?v=2'; +const DEFAULT_CURRENCY = 'USD'; +const spec = { + code: BIDDER_CODE, + // This adapter was previously named playgroundxyz - this alias ensures + // backwards compatibility for publishers + aliases: ['playgroundxyz'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const referer = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation; + const parts = referer.split('/'); + let protocol, hostname; + if (parts.length >= 3) { + protocol = parts[0]; + hostname = parts[2]; + } + const payload = { + id: bidderRequest.bidderRequestId, + site: { + domain: protocol + '//' + hostname, + name: hostname, + page: referer + }, + device: { + ua: navigator.userAgent, + language: navigator.language, + devicetype: isMobile() ? 1 : isConnectedTV() ? 3 : 2 + }, + imp: bidRequests.map(mapImpression), + Regs: { + ext: {} + } + }; + + // GDPR + if (bidderRequest && bidderRequest.gdprConsent) { + const gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + const consentString = bidderRequest.gdprConsent.consentString; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`PXYZ: GDPR applies ${gdpr}`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`PXYZ: GDPR consent string ${consentString}`); + payload.Regs.ext.gdpr = gdpr; + payload.User = { + ext: { + consent: consentString + } + }; + } + + // CCPA + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`PXYZ: USP Consent ${bidderRequest.uspConsent}`); + payload.Regs.ext['us_privacy'] = bidderRequest.uspConsent; + } + return { + method: 'POST', + url: URL, + data: JSON.stringify(payload), + bidderRequest + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + const bids = []; + if (!serverResponse || serverResponse.error) { + let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`; + if (serverResponse && serverResponse.error) { + errorMessage += `: ${serverResponse.error}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage); + } + return bids; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse.seatbid)) { + let errorMessage = `in response for ${bidderRequest.bidderCode} adapter `; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage += 'Malformed seatbid response'); + return bids; + } + if (!serverResponse.seatbid) { + return bids; + } + const currency = serverResponse.cur || DEFAULT_CURRENCY; + serverResponse.seatbid.forEach(sBid => { + if (sBid.hasOwnProperty('bid')) { + sBid.bid.forEach(iBid => { + if (iBid.price !== 0) { + const bid = newBid(iBid, currency); + bids.push(bid); + } + }); + } + }); + return bids; + }, + getUserSyncs: function () { + return [{ + type: 'image', + url: '//ib.adnxs.com/getuidnb?https://ads.playground.xyz/usersync?partner=appnexus&uid=$UID' + }, { + type: 'iframe', + url: '//rtb.gumgum.com/getuid/15801?r=https%3A%2F%2Fads.playground.xyz%2Fusersync%3Fpartner%3Dgumgum%26uid%3D' + }]; + } +}; +function newBid(bid, currency) { + const { + adomain + } = bid; + return { + requestId: bid.impid, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + cpm: bid.price, + creativeId: bid.adid, + ad: bid.adm, + width: bid.w, + height: bid.h, + ttl: 300, + netRevenue: true, + currency: currency, + meta: { + ...(adomain && adomain.length > 0 ? { + advertiserDomains: adomain + } : {}) + } + }; +} +function mapImpression(bid) { + return { + id: bid.bidId, + banner: mapBanner(bid), + ext: { + appnexus: { + placement_id: parseInt(bid.params.placementId, 10) + }, + pxyz: { + adapter: { + vendor: 'prebid', + prebid: "9.45.0-pre" + } + } + } + }; +} +function mapBanner(bid) { + return { + w: parseInt(bid.sizes[0][0], 10), + h: parseInt(bid.sizes[0][1], 10), + format: mapSizes(bid.sizes) + }; +} +function mapSizes(bidSizes) { + const format = []; + bidSizes.forEach(size => { + format.push({ + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + }); + }); + return format; +} +function isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +function isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('pxyzBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/pxyzBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["qortexRtdProvider"],{ + +/***/ "./modules/qortexRtdProvider.js": +/*!**************************************!*\ + !*** ./modules/qortexRtdProvider.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports addContextToRequests, loadScriptTag, initializeBidEnrichment, requestContextData, initializeModuleData, setContextData, setGroupConfigData, windowPostMessageReceived, qortexSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + +const QX_VERSION = { + v: '1.0' +}; +const qortexSessionInfo = {}; +const QX_IN_MESSAGE = { + BID_ENRICH_INITIALIZED: 'CX-BID-ENRICH-INITIALIZED', + DISPATCH_CONTEXT: 'DISPATCH-CONTEXT' +}; +const QX_OUT_MESSAGE = { + AUCTION_END: 'AUCTION-END', + NO_CONTEXT: 'NO-CONTEXT', + RTD_INITIALIZED: 'RTD-INITIALIZED', + REQUEST_CONTEXT: 'REQUEST-CONTEXT' +}; + +/** + * Init if module configuration is valid + * @param {Object} config Module configuration + * @returns {Boolean} + */ +function init(config) { + if (!config?.params?.groupId?.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Qortex RTD module config does not contain valid groupId parameter. Config params: ' + JSON.stringify(config.params)); + return false; + } else { + initializeModuleData(config); + if (config?.params?.enableBidEnrichment) { + initializeBidEnrichment(); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Bid Enrichment Function has been disabled in module configuration'); + } + if (config?.params?.tagConfig) { + loadScriptTag(config); + } + return true; + } +} + +/** + * Processess prebid request and attempts to add context to ort2b fragments + * @param {Object} reqBidsConfig Bid request configuration object + * @param {Function} callback Called on completion + */ +function getBidRequestData(reqBidsConfig, callback) { + if (reqBidsConfig?.adUnits?.length > 0 && shouldAllowBidEnrichment()) { + addContextToRequests(reqBidsConfig); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Module function is paused due to configuration \n Module Config: ' + JSON.stringify(reqBidsConfig)); + } + callback(); +} + +/** + * Processess auction end events for Qortex reporting + * @param {Object} data Auction end object + */ +function onAuctionEndEvent(data, config, t) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Auction ended: ', JSON.stringify(data)); + if (shouldAllowBidEnrichment()) { + if (!qortexSessionInfo.auctionsEnded) { + qortexSessionInfo.auctionsEnded = []; + } + qortexSessionInfo.auctionsEnded.push(JSON.stringify(data)); + postBidEnrichmentMessage(QX_OUT_MESSAGE.AUCTION_END, JSON.stringify(data)); + } +} + +/** + * Updates bidder configs with the response from Qortex context services + * @param {Object} reqBidsConfig Bid request configuration object + */ +function addContextToRequests(reqBidsConfig) { + if (qortexSessionInfo.currentSiteContext === null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('No context data received at this time'); + requestContextData(); + } else { + if (checkPercentageOutcome(qortexSessionInfo.groupConfig?.prebidBidEnrichmentPercentage)) { + const fragment = qortexSessionInfo.currentSiteContext; + if (qortexSessionInfo.bidderArray?.length > 0) { + qortexSessionInfo.bidderArray.forEach(bidder => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfig.ortb2Fragments.bidder, { + [bidder]: fragment + })); + } else if (!qortexSessionInfo.bidderArray) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfig.ortb2Fragments.global, fragment); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Config contains an empty bidders array, unable to determine which bids to enrich'); + } + } + } +} + +/** + * Loads Qortex header tag using data passed from module config object + * @param {Object} config module config obtained during init + */ +function loadScriptTag(config) { + const code = 'qortex'; + const groupId = config.params.groupId; + const src = 'https://tags.qortex.ai/bootstrapper'; + const attr = { + 'data-group-id': groupId + }; + const tc = config.params.tagConfig; + Object.keys(tc).forEach(p => { + attr[`data-${p.replace(/([A-Z])/g, m => `-${m.toLowerCase()}`)}`] = tc[p]; + }); + addEventListener('qortex-rtd', e => { + const billableEvent = { + vendor: code, + billingId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(), + type: e?.detail?.type, + accountId: groupId + }; + switch (e?.detail?.type) { + case 'qx-impression': + const { + uid + } = e.detail; + if (!uid || qortexSessionInfo.impressionIds.has(uid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Received invalid billable event due to ${!uid ? 'missing' : 'duplicate'} uid: qx-impression`); + return; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Received billable event: qx-impression'); + qortexSessionInfo.impressionIds.add(uid); + billableEvent.transactionId = e.detail.uid; + _src_events_js__WEBPACK_IMPORTED_MODULE_1__.emit(_src_constants_js__WEBPACK_IMPORTED_MODULE_2__.EVENTS.BILLABLE_EVENT, billableEvent); + break; + } + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(`Received invalid billable event: ${e.detail?.type}`); + } + }); + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(src, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_4__.MODULE_TYPE_RTD, code, undefined, undefined, attr); +} + +/** + * Request contextual data about page (after checking for allow) and begin listening for postMessages from publisher + */ +function initializeBidEnrichment() { + if (shouldAllowBidEnrichment()) { + requestContextData(); + } + addEventListener('message', windowPostMessageReceived); +} + +/** + * Call Qortex code on page for available contextual information about current environment + */ +function requestContextData() { + if (qortexSessionInfo.currentSiteContext) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Context data already retrieved.'); + } else { + postBidEnrichmentMessage(QX_OUT_MESSAGE.REQUEST_CONTEXT); + } +} + +/** + * Helper function to set initial values when they are obtained by init + * @param {Object} config module config obtained during init + */ +function initializeModuleData(config) { + const { + groupId, + bidders, + enableBidEnrichment + } = config.params; + qortexSessionInfo.bidEnrichmentDisabled = enableBidEnrichment !== null ? !enableBidEnrichment : true; + qortexSessionInfo.bidderArray = bidders; + qortexSessionInfo.impressionIds = new Set(); + qortexSessionInfo.currentSiteContext = null; + qortexSessionInfo.sessionId = generateSessionId(); + qortexSessionInfo.groupId = groupId; + return qortexSessionInfo; +} + +/** + * Allows setting of contextual data + */ +function setContextData(value) { + qortexSessionInfo.currentSiteContext = value; +} + +/** + * Allows setting of group configuration data + */ +function setGroupConfigData(value) { + qortexSessionInfo.groupConfig = value; +} + +/** + * Unique id generator creating an identifier through datetime and random number + * @returns {string} + */ +function generateSessionId() { + const randomInt = window.crypto.getRandomValues(new Uint32Array(1)); + const currentDateTime = Math.floor(Date.now() / 1000); + return 'QX' + randomInt.toString() + 'X' + currentDateTime.toString(); +} + +/** + * Check for a random value to be above given percentage threshold + * @param {number} percentageValue 0-100 number for percentage check. + * @returns {Boolean} + */ +function checkPercentageOutcome(percentageValue) { + return (percentageValue ?? 0) > Math.random() * 100; +} + +/** + * Check for allowing functionality of bid enrichment capabilities. + * @returns {Boolean} + */ +function shouldAllowBidEnrichment() { + if (qortexSessionInfo.bidEnrichmentDisabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Bid enrichment disabled at prebid config'); + return false; + } + return true; +} + +/** + * Passes message out to external page through postMessage method + * @param {string} msg message string to be passed to CX-BID-ENRICH target on current page + * @param {Object} data optional parameter object with additional data to send with post + */ +function postBidEnrichmentMessage(msg, data) { + window.postMessage({ + target: 'CX-BID-ENRICH', + message: msg, + params: data + }, window.location.protocol + '//' + window.location.host); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Dispatching window postMessage: ' + msg); +} + +/** + * Receives messages passed through postMessage method to QORTEX-PREBIDJS-RTD-MODULE on current page + * @param {Object} evt data object holding Event information + */ +function windowPostMessageReceived(evt) { + const data = evt.data; + if (typeof data.target !== 'undefined' && data.target === 'QORTEX-PREBIDJS-RTD-MODULE') { + if (shouldAllowBidEnrichment()) { + if (data.message === QX_IN_MESSAGE.BID_ENRICH_INITIALIZED) { + if (Boolean(data.params) && Boolean(data.params?.groupConfig)) { + setGroupConfigData(data.params.groupConfig); + } + postBidEnrichmentMessage(QX_OUT_MESSAGE.RTD_INITIALIZED, QX_VERSION); + if (qortexSessionInfo?.auctionsEnded?.length > 0) { + qortexSessionInfo.auctionsEnded.forEach(data => postBidEnrichmentMessage(QX_OUT_MESSAGE.AUCTION_END, data)); + } + requestContextData(); + } else if (data.message === QX_IN_MESSAGE.DISPATCH_CONTEXT) { + if (data.params?.context) { + setContextData(data.params.context); + } + } + } + } +} +const qortexSubmodule = { + name: 'qortex', + init, + getBidRequestData, + onAuctionEndEvent +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('realTimeData', qortexSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('qortexRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/qortexRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["qtBidAdapter"],{ + +/***/ "./modules/qtBidAdapter.js": +/*!*********************************!*\ + !*** ./modules/qtBidAdapter.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'qt'; +const GVLID = 1331; +const AD_URL = 'https://endpoint1.qt.io/pbjs'; +const SYNC_URL = 'https://cs.qt.io'; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('qtBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/qtBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["quantcastBidAdapter"],{ + +/***/ "./modules/quantcastBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/quantcastBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports QUANTCAST_DOMAIN, QUANTCAST_TEST_DOMAIN, QUANTCAST_NET_REVENUE, QUANTCAST_TEST_PUBLISHER, QUANTCAST_TTL, QUANTCAST_PROTOCOL, QUANTCAST_PORT, QUANTCAST_FPA, storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'quantcast'; +const DEFAULT_BID_FLOOR = 0.0000000001; +const QUANTCAST_VENDOR_ID = '11'; +// Check other required purposes on server +const PURPOSE_DATA_COLLECT = '1'; +const QUANTCAST_DOMAIN = 'qcx.quantserve.com'; +const QUANTCAST_TEST_DOMAIN = 's2s-canary.quantserve.com'; +const QUANTCAST_NET_REVENUE = true; +const QUANTCAST_TEST_PUBLISHER = 'test-publisher'; +const QUANTCAST_TTL = 4; +const QUANTCAST_PROTOCOL = 'https'; +const QUANTCAST_PORT = '8443'; +const QUANTCAST_FPA = '__qca'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function makeVideoImp(bid) { + const videoInMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video') || {}; + const videoInParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.video') || {}; + const video = Object.assign({}, videoInParams, videoInMediaType); + if (video.playerSize) { + video.w = video.playerSize[0]; + video.h = video.playerSize[1]; + } + const videoCopy = { + mimes: video.mimes, + minduration: video.minduration, + maxduration: video.maxduration, + protocols: video.protocols, + startdelay: video.startdelay, + linearity: video.linearity, + battr: video.battr, + maxbitrate: video.maxbitrate, + playbackmethod: video.playbackmethod, + delivery: video.delivery, + api: video.api, + w: video.w, + h: video.h + }; + return { + video: videoCopy, + placementCode: bid.placementCode, + bidFloor: DEFAULT_BID_FLOOR + }; +} +function makeBannerImp(bid) { + const sizes = bid.sizes || bid.mediaTypes.banner.sizes; + return { + banner: { + battr: bid.params.battr, + sizes: sizes.map(size => { + return { + width: size[0], + height: size[1] + }; + }) + }, + placementCode: bid.placementCode, + bidFloor: DEFAULT_BID_FLOOR + }; +} +function checkTCF(tcData) { + let restrictions = tcData.publisher ? tcData.publisher.restrictions : {}; + let qcRestriction = restrictions && restrictions[PURPOSE_DATA_COLLECT] ? restrictions[PURPOSE_DATA_COLLECT][QUANTCAST_VENDOR_ID] : null; + if (qcRestriction === 0 || qcRestriction === 2) { + // Not allowed by publisher, or requires legitimate interest + return false; + } + let vendorConsent = tcData.vendor && tcData.vendor.consents && tcData.vendor.consents[QUANTCAST_VENDOR_ID]; + let purposeConsent = tcData.purpose && tcData.purpose.consents && tcData.purpose.consents[PURPOSE_DATA_COLLECT]; + return !!(vendorConsent && purposeConsent); +} +function getQuantcastFPA() { + let fpa = storage.getCookie(QUANTCAST_FPA); + return fpa || ''; +} +let hasUserSynced = false; + +/** + * The documentation for Prebid.js Adapter 1.0 can be found at link below, + * http://prebid.org/dev-docs/bidder-adapter-1.html + */ +const spec = { + code: BIDDER_CODE, + GVLID: QUANTCAST_VENDOR_ID, + supportedMediaTypes: ['banner', 'video'], + /** + * Verify the `AdUnits.bids` response with `true` for valid request and `false` + * for invalid request. + * + * @param {object} bid + * @return boolean `true` is this is a valid bid, and `false` otherwise + */ + isBidRequestValid(bid) { + return !!bid.params.publisherId; + }, + /** + * Make a server request when the page asks Prebid.js for bids from a list of + * `BidRequests`. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be send to Quantcast server + * @param bidderRequest + * @return ServerRequest information describing the request to the server. + */ + buildRequests(bidRequests, bidderRequest) { + const bids = bidRequests || []; + const gdprConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent') || {}; + const uspConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'uspConsent'); + const referrer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.ref'); + const page = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'refererInfo.page') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(window, 'location.href'); + const domain = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.parseDomain)(page, { + noLeadingWww: true + }); + + // Check for GDPR consent for purpose 1, and drop request if consent has not been given + // Remaining consent checks are performed server-side. + if (gdprConsent.gdprApplies) { + if (gdprConsent.vendorData) { + if (!checkTCF(gdprConsent.vendorData)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${BIDDER_CODE}: No purpose 1 consent for TCF v2`); + return; + } + } + } + let bidRequestsList = []; + bids.forEach(bid => { + let imp; + if (bid.mediaTypes) { + if (bid.mediaTypes.video && bid.mediaTypes.video.context === 'instream') { + imp = makeVideoImp(bid); + } else if (bid.mediaTypes.banner) { + imp = makeBannerImp(bid); + } else { + // Unsupported mediaType + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)(`${BIDDER_CODE}: No supported mediaTypes found in ${JSON.stringify(bid.mediaTypes)}`); + return; + } + } else { + // Parse as banner by default + imp = makeBannerImp(bid); + } + + // Request Data Format can be found at https://wiki.corp.qc/display/adinf/QCX + const requestData = { + publisherId: bid.params.publisherId, + requestId: bid.bidId, + imp: [imp], + site: { + page, + referrer, + domain + }, + bidId: bid.bidId, + gdprSignal: gdprConsent.gdprApplies ? 1 : 0, + gdprConsent: gdprConsent.consentString, + uspSignal: uspConsent ? 1 : 0, + uspConsent, + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true ? 1 : 0, + prebidJsVersion: "9.45.0-pre", + fpa: getQuantcastFPA() + }; + const data = JSON.stringify(requestData); + const qcDomain = bid.params.publisherId === QUANTCAST_TEST_PUBLISHER ? QUANTCAST_TEST_DOMAIN : QUANTCAST_DOMAIN; + const url = `${QUANTCAST_PROTOCOL}://${qcDomain}:${QUANTCAST_PORT}/qchb`; + bidRequestsList.push({ + data, + method: 'POST', + url + }); + }); + return bidRequestsList; + }, + /** + * Function get called when the browser has received the response from Quantcast server. + * The function parse the response and create a `bidResponse` object containing one/more bids. + * Returns an empty array if no valid bids + * + * Response Data Format can be found at https://wiki.corp.qc/display/adinf/QCX + * + * @param {*} serverResponse A successful response from Quantcast server. + * @return {Bid[]} An array of bids which were nested inside the server. + * + */ + interpretResponse(serverResponse) { + if (serverResponse === undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Server Response is undefined'); + return []; + } + const response = serverResponse['body']; + if (response === undefined || !response.hasOwnProperty('bids')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Sub-optimal JSON received from Quantcast server'); + return []; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(response.bids)) { + // Shortcut response handling if no bids are present + return []; + } + const bidResponsesList = response.bids.map(bid => { + const { + ad, + cpm, + width, + height, + creativeId, + currency, + videoUrl, + dealId, + meta + } = bid; + const result = { + requestId: response.requestId, + cpm, + width, + height, + ad, + ttl: QUANTCAST_TTL, + creativeId, + netRevenue: QUANTCAST_NET_REVENUE, + currency + }; + if (videoUrl !== undefined && videoUrl) { + result['vastUrl'] = videoUrl; + result['mediaType'] = 'video'; + } + if (dealId !== undefined && dealId) { + result['dealId'] = dealId; + } + if (meta !== undefined && meta.advertiserDomains && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(meta.advertiserDomains)) { + result.meta = {}; + result.meta.advertiserDomains = meta.advertiserDomains; + } + return result; + }); + return bidResponsesList; + }, + onTimeout(timeoutData) { + const url = `${QUANTCAST_PROTOCOL}://${QUANTCAST_DOMAIN}:${QUANTCAST_PORT}/qchb_notify?type=timeout`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(url, null, null); + }, + getUserSyncs(syncOptions, serverResponses) { + const syncs = []; + if (!hasUserSynced && syncOptions.pixelEnabled) { + const responseWithUrl = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.find)(serverResponses, serverResponse => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(serverResponse.body, 'userSync.url')); + if (responseWithUrl) { + const url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(responseWithUrl.body, 'userSync.url'); + syncs.push({ + type: 'image', + url: url + }); + } + hasUserSynced = true; + } + return syncs; + }, + resetUserSync() { + hasUserSynced = false; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('quantcastBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/quantcastBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["quantcastIdSystem"],{ + +/***/ "./modules/quantcastIdSystem.js": +/*!**************************************!*\ + !*** ./modules/quantcastIdSystem.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, firePixel, hasGDPRConsent, checkTCFv2, hasCCPAConsent, quantcastIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds QuantcastID to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/quantcastIdSystem + * @requires module:modules/userId + */ + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + */ + +const QUANTCAST_FPA = '__qca'; +const DEFAULT_COOKIE_EXP_DAYS = 392; // (13 months - 2 days) +const DAY_MS = 86400000; +const PREBID_PCODE = 'p-KceJUEvXN48CE'; +const QSERVE_URL = 'https://pixel.quantserve.com/pixel'; +const QUANTCAST_VENDOR_ID = '11'; +const PURPOSE_DATA_COLLECT = '1'; +const PURPOSE_PRODUCT_IMPROVEMENT = '10'; +const QC_TCF_REQUIRED_PURPOSES = [PURPOSE_DATA_COLLECT, PURPOSE_PRODUCT_IMPROVEMENT]; +const QC_TCF_CONSENT_FIRST_PURPOSES = [PURPOSE_DATA_COLLECT]; +const QC_TCF_CONSENT_ONLY_PUPROSES = [PURPOSE_DATA_COLLECT]; +const GDPR_PRIVACY_STRING = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.gdprDataHandler.getConsentData(); +const US_PRIVACY_STRING = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.uspDataHandler.getConsentData(); +const MODULE_NAME = 'quantcastId'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); +function firePixel(clientId) { + let cookieExpDays = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_COOKIE_EXP_DAYS; + // check for presence of Quantcast Measure tag _qevent obj and publisher provided clientID + if (!window._qevents && clientId && clientId != '') { + var fpa = storage.getCookie(QUANTCAST_FPA); + var fpan = '0'; + var domain = quantcastIdSubmodule.findRootDomain(); + var now = new Date(); + var usPrivacyParamString = ''; + var firstPartyParamStrings; + var gdprParamStrings; + if (!fpa) { + var et = now.getTime(); + var expires = new Date(et + cookieExpDays * DAY_MS).toGMTString(); + var rand = Math.round(Math.random() * 2147483647); + fpa = `B0-${rand}-${et}`; + fpan = '1'; + storage.setCookie(QUANTCAST_FPA, fpa, expires, '/', domain, null); + } + firstPartyParamStrings = `&fpan=${fpan}&fpa=${fpa}`; + gdprParamStrings = '&gdpr=0'; + if (GDPR_PRIVACY_STRING && typeof GDPR_PRIVACY_STRING.gdprApplies === 'boolean' && GDPR_PRIVACY_STRING.gdprApplies) { + gdprParamStrings = `gdpr=1&gdpr_consent=${GDPR_PRIVACY_STRING.consentString}`; + } + if (US_PRIVACY_STRING && typeof US_PRIVACY_STRING === 'string') { + usPrivacyParamString = `&us_privacy=${US_PRIVACY_STRING}`; + } + let url = QSERVE_URL + '?d=' + domain + '&client_id=' + clientId + '&a=' + PREBID_PCODE + usPrivacyParamString + gdprParamStrings + firstPartyParamStrings; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(url); + } +} +; +function hasGDPRConsent(gdprConsent) { + // Check for GDPR consent for purpose 1 and 10, and drop request if consent has not been given + // Remaining consent checks are performed server-side. + if (gdprConsent && typeof gdprConsent.gdprApplies === 'boolean' && gdprConsent.gdprApplies) { + if (!gdprConsent.vendorData) { + return false; + } + return checkTCFv2(gdprConsent.vendorData); + } + return true; +} +function checkTCFv2(vendorData) { + let requiredPurposes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : QC_TCF_REQUIRED_PURPOSES; + var gdprApplies = vendorData.gdprApplies; + var purposes = vendorData.purpose; + var vendors = vendorData.vendor; + var qcConsent = vendors && vendors.consents && vendors.consents[QUANTCAST_VENDOR_ID]; + var qcInterest = vendors && vendors.legitimateInterests && vendors.legitimateInterests[QUANTCAST_VENDOR_ID]; + var restrictions = vendorData.publisher ? vendorData.publisher.restrictions : {}; + if (!gdprApplies) { + return true; + } + return requiredPurposes.map(function (purpose) { + var purposeConsent = purposes.consents ? purposes.consents[purpose] : false; + var purposeInterest = purposes.legitimateInterests ? purposes.legitimateInterests[purpose] : false; + var qcRestriction = restrictions && restrictions[purpose] ? restrictions[purpose][QUANTCAST_VENDOR_ID] : null; + if (qcRestriction === 0) { + return false; + } + + // Seek consent or legitimate interest based on our default legal + // basis for the purpose, falling back to the other if possible. + if ( + // we have positive vendor consent + qcConsent && + // there is positive purpose consent + purposeConsent && + // publisher does not require legitimate interest + qcRestriction !== 2 && ( + // purpose is a consent-first purpose or publisher has explicitly restricted to consent + QC_TCF_CONSENT_FIRST_PURPOSES.indexOf(purpose) != -1 || qcRestriction === 1)) { + return true; + } else if ( + // publisher does not require consent + qcRestriction !== 1 && + // we have legitimate interest for vendor + qcInterest && + // there is legitimate interest for purpose + purposeInterest && + // purpose's legal basis does not require consent + QC_TCF_CONSENT_ONLY_PUPROSES.indexOf(purpose) == -1 && ( + // purpose is a legitimate-interest-first purpose or publisher has explicitly restricted to legitimate interest + QC_TCF_CONSENT_FIRST_PURPOSES.indexOf(purpose) == -1 || qcRestriction === 2)) { + return true; + } + return false; + }).reduce(function (a, b) { + return a && b; + }, true); +} + +/** + * tests if us_privacy consent string is present, us_privacy applies, and notice_given / do-not-sell is set to yes + * @returns {boolean} + */ +function hasCCPAConsent(usPrivacyConsent) { + if (usPrivacyConsent && typeof usPrivacyConsent === 'string' && usPrivacyConsent.length == 4 && usPrivacyConsent.charAt(1) == 'Y' && usPrivacyConsent.charAt(2) == 'Y') { + return false; + } + return true; +} + +/** @type {Submodule} */ +const quantcastIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Vendor id of Quantcast + * @type {Number} + */ + gvlid: QUANTCAST_VENDOR_ID, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{quantcastId: string} | undefined} + */ + decode(value) { + return value; + }, + /** + * read Quantcast first party cookie and pass it along in quantcastId + * @function + * @returns {{id: {quantcastId: string} | undefined}}} + */ + getId(config) { + // Consent signals are currently checked on the server side. + let fpa = storage.getCookie(QUANTCAST_FPA); + const coppa = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.coppaDataHandler.getCoppa(); + if (coppa || !hasCCPAConsent(US_PRIVACY_STRING) || !hasGDPRConsent(GDPR_PRIVACY_STRING)) { + var expired = new Date(0).toUTCString(); + var domain = quantcastIdSubmodule.findRootDomain(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('QuantcastId: Necessary consent not present for Id, exiting QuantcastId'); + storage.setCookie(QUANTCAST_FPA, '', expired, '/', domain, null); + return undefined; + } + const configParams = config && config.params || {}; + const storageParams = config && config.storage || {}; + var clientId = configParams.clientId || ''; + var cookieExpDays = storageParams.expires || DEFAULT_COOKIE_EXP_DAYS; + + // Callbacks on Event Listeners won't trigger if the event is already complete so this check is required + if (document.readyState === 'complete') { + firePixel(clientId, cookieExpDays); + } else { + window.addEventListener('load', function () { + firePixel(clientId, cookieExpDays); + }); + } + return { + id: fpa ? { + quantcastId: fpa + } : undefined + }; + }, + eids: { + 'quantcastId': { + source: 'quantcast.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('userId', quantcastIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('quantcastIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/quantcastIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["qwarryBidAdapter"],{ + +/***/ "./modules/qwarryBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/qwarryBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'qwarry'; +const ENDPOINT = 'https://bidder.qwarry.co/bid/adtag?prebid=true'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: ['banner', 'video'], + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.zoneToken); + }, + buildRequests: function (validBidRequests, bidderRequest) { + let bids = []; + validBidRequests.forEach(bidRequest => { + bids.push({ + bidId: bidRequest.bidId, + zoneToken: bidRequest.params.zoneToken, + pos: bidRequest.params.pos, + sizes: prepareSizes(bidRequest.sizes) + }); + }); + let payload = { + requestId: bidderRequest.bidderRequestId, + bids, + referer: bidderRequest.refererInfo.page, + schain: validBidRequests[0].schain + }; + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdprConsent = { + consentRequired: typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : false, + consentString: bidderRequest.gdprConsent.consentString + }; + } + const options = { + contentType: 'application/json', + customHeaders: { + 'Rtb-Direct': true + } + }; + return { + method: 'POST', + url: ENDPOINT, + data: payload, + options + }; + }, + interpretResponse: function (serverResponse, request) { + const serverBody = serverResponse.body; + if (!serverBody || typeof serverBody !== 'object') { + return []; + } + const { + prebidResponse + } = serverBody; + if (!prebidResponse || typeof prebidResponse !== 'object') { + return []; + } + let bids = []; + prebidResponse.forEach(bidResponse => { + let bid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(bidResponse); + bid.cpm = parseFloat(bidResponse.cpm); + + // banner or video + if (_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO === bid.format) { + bid.vastXml = bid.ad; + } + bid.meta = {}; + bid.meta.advertiserDomains = bid.adomain || []; + bids.push(bid); + }); + return bids; + }, + onBidWon: function (bid) { + if (bid.winUrl) { + const cpm = bid.cpm; + const winUrl = bid.winUrl.replace(/\$\{AUCTION_PRICE\}/, cpm); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(winUrl, null); + return true; + } + return false; + } +}; +function prepareSizes(sizes) { + return sizes && sizes.map(size => ({ + width: size[0], + height: size[1] + })); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('qwarryBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/qwarryBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["r2b2AnalyticsAdapter"],{ + +/***/ "./modules/r2b2AnalyticsAdapter.js": +/*!*****************************************!*\ + !*** ./modules/r2b2AnalyticsAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export resetAnalyticAdapter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + + + + +const ADAPTER_VERSION = '1.1.0'; +const ADAPTER_CODE = 'r2b2'; +const MODULE_NAME = 'R2B2 Analytics'; +const GVLID = 1235; +const analyticsType = 'endpoint'; +const DEFAULT_SERVER = 'log.r2b2.cz'; +const DEFAULT_EVENT_PATH = 'prebid/events'; +const DEFAULT_ERROR_PATH = 'error'; +const DEFAULT_PROTOCOL = 'https'; +const ERROR_MAX = 10; +const BATCH_SIZE = 50; +const BATCH_DELAY = 500; +const MAX_CALL_DEPTH = 20; +const REPORTED_URL = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().page || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().topmostLocation || ''; +const START_TIME = Date.now(); +const CACHE_TTL = 300 * 1000; +const EVENT_MAP = {}; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.NO_BID] = 'noBid'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT] = 'init'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED] = 'request'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT] = 'timeout'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE] = 'response'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REJECTED] = 'reject'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_ERROR] = 'bidError'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE] = 'bidderDone'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_END] = 'auction'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON] = 'bidWon'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.SET_TARGETING] = 'targeting'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.STALE_RENDER] = 'staleRender'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AD_RENDER_SUCCEEDED] = 'render'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AD_RENDER_FAILED] = 'renderFail'; +EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_VIEWABLE] = 'view'; + +/* CONFIGURATION */ +let WEBSITE = 0; +let CONFIG_ID = 0; +let CONFIG_VERSION = 0; +let LOG_SERVER = DEFAULT_SERVER; + +/* CACHED DATA */ +let latestAuction = ''; +let previousAuction = ''; +let auctionCount = 0; +let auctionsData = {}; +let bidsData = {}; +let adServerCurrency = ''; +let flushTimer; +let eventBuffer = []; +let errors = 0; +let callDepth = 0; +function flushEvents() { + let events = { + prebid: { + e: eventBuffer, + c: adServerCurrency + } + }; + eventBuffer = []; + callDepth++; + try { + // check for recursion in case reportEvents propagates error events + // and execution doesn't finish before BATCH_SIZE is reached again + if (callDepth >= MAX_CALL_DEPTH) { + if (callDepth === MAX_CALL_DEPTH) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: Maximum call depth reached, discarding events`); + } + return; + } + // clear out old data only in state without recursion + if (callDepth === 1) { + clearCache(bidsData); + clearCache(auctionsData); + } + reportEvents(events); + } finally { + callDepth--; + } +} +function clearCache(cache) { + const now = Date.now(); + for (const [key, { + t + }] of Object.entries(cache)) { + if (t + CACHE_TTL < now) { + delete cache[key]; + } + } +} +function resetAnalyticAdapter() { + latestAuction = ''; + previousAuction = ''; + auctionCount = 0; + auctionsData = {}; + bidsData = {}; + adServerCurrency = ''; + clearTimeout(flushTimer); + eventBuffer = []; + errors = 0; + callDepth = 0; + WEBSITE = 0; + CONFIG_ID = 0; + CONFIG_VERSION = 0; + LOG_SERVER = DEFAULT_SERVER; +} +function processEvent(event) { + // console.log('process event:', event); + // console.log(JSON.stringify(event)); + if (!event) { + return; + } + eventBuffer.push(event); + if (flushTimer) { + clearTimeout(flushTimer); + flushTimer = null; + } + if (eventBuffer.length >= BATCH_SIZE) { + flushEvents(); + } else { + flushTimer = setTimeout(flushEvents, BATCH_DELAY); + } +} +function processErrorParams(params) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(params)) { + try { + return JSON.stringify(params); + } catch (e) {/* do nothing */} + } + return null; +} +function reportError(message, params) { + errors++; + if (errors > ERROR_MAX) return; + params = processErrorParams(params); + message = `[ANALYTICS-${ADAPTER_VERSION}] ${message}`; + const url = r2b2Analytics.getErrorUrl() + `?d=${encodeURIComponent(WEBSITE)}` + `&m=${encodeURIComponent(message)}` + `&t=prebid` + `&p=1` + (params ? `&pr=${encodeURIComponent(params)}` : '') + (CONFIG_ID ? `&conf=${encodeURIComponent(CONFIG_ID)}` : '') + (CONFIG_VERSION ? `&conf_ver=${encodeURIComponent(CONFIG_VERSION)}` : '') + `&u=${encodeURIComponent(REPORTED_URL)}`; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, null, null, {}); +} +function reportEvents(events) { + try { + let data = 'events=' + JSON.stringify(events); + let url = r2b2Analytics.getUrl() + `?v=${encodeURIComponent(ADAPTER_VERSION)}` + `&hbDomain=${encodeURIComponent(WEBSITE)}` + (CONFIG_ID ? `&conf=${encodeURIComponent(CONFIG_ID)}` : '') + (CONFIG_VERSION ? `&conf_ver=${encodeURIComponent(CONFIG_VERSION)}` : '') + `&u=${encodeURIComponent(REPORTED_URL)}`; + let headers = { + contentType: 'application/x-www-form-urlencoded' + }; + data = data.replace(/&/g, '%26'); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, null, data, headers); + } catch (e) { + const msg = `Error sending events - ${e.message}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${MODULE_NAME}: ${msg}`); + reportError(msg); + } +} +function getStandardTargeting(obj) { + if (obj) { + return { + b: obj.hb_bidder || '', + sz: obj.hb_size || '', + pb: obj.hb_pb || '', + fmt: obj.hb_format || '' + }; + } +} +function getEventTimestamps(eventName, auctionId) { + const timestamps = { + t: Date.now() - START_TIME + }; + if (!auctionId || !auctionsData[auctionId]) { + return timestamps; + } + const auctionData = auctionsData[auctionId]; + timestamps.to = auctionData.timeout; + timestamps.ts = auctionData.start - START_TIME; + if (auctionData.end) { + timestamps.te = auctionData.end - START_TIME; + } + if (eventName === EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT] && auctionCount > 1) { + timestamps.tprev = auctionsData[previousAuction].start - START_TIME; + } + return timestamps; +} +function createEvent(name, data, auctionId) { + if (!auctionId || !auctionsData[auctionId]) { + reportError('No auction data when creating event', { + event: name, + auctionId: !!auctionId + }); + return null; + } + if (auctionsData[auctionId] && auctionsData[auctionId].empty) { + return null; + } + data = data || {}; + data.ai = auctionId; + return { + e: name, + d: data, + t: getEventTimestamps(name, auctionId) + }; +} +function createAuctionData(auction, empty) { + const auctionId = auction.auctionId; + previousAuction = latestAuction; + latestAuction = auctionId; + auctionCount++; + auctionsData[auctionId] = { + start: auction.timestamp, + end: auction.auctionEnd ? auction.auctionEnd : null, + timeout: auction.timeout, + empty: !!empty, + t: Date.now() + }; +} +function handleAuctionInit(args) { + // console.log('auction init:', arguments); + createAuctionData(args); + const auctionId = args.auctionId; + const bidderRequests = args.bidderRequests || []; + const data = { + o: auctionCount, + u: bidderRequests.reduce((result, bidderRequest) => { + bidderRequest.bids.forEach(bid => { + if (!result[bid.adUnitCode]) { + result[bid.adUnitCode] = []; + } + result[bid.adUnitCode].push(bid.bidder); + }); + return result; + }, {}) + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT], data, auctionId); + processEvent(event); +} +function handleBidRequested(args) { + // console.log('bid request:', arguments); + const data = { + b: args.bidderCode, + u: args.bids.reduce((result, bid) => { + if (!result[bid.adUnitCode]) { + result[bid.adUnitCode] = 1; + } else { + result[bid.adUnitCode]++; + } + return result; + }, {}) + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED], data, args.auctionId); + processEvent(event); +} +function handleBidTimeout(args) { + // console.log('bid timeout:', arguments); + const auctionId = args.length ? args[0].auctionId : null; + if (auctionId) { + let bidders = args.reduce((result, bid) => { + if (!result[bid.bidder]) { + result[bid.bidder] = {}; + } + const bidderData = result[bid.bidder]; + if (!bidderData[bid.adUnitCode]) { + bidderData[bid.adUnitCode] = 1; + } else { + bidderData[bid.adUnitCode]++; + } + return result; + }, {}); + const data = { + b: bidders + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT], data, auctionId); + processEvent(event); + } +} +function handleNoBid(args) { + // console.log('no bid:', arguments); + const data = { + b: args.bidder, + u: args.adUnitCode + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.NO_BID], data, args.auctionId); + processEvent(event); +} +function handleBidResponse(args) { + // console.log('bid response:', arguments); + bidsData[args.adId] = { + id: args.requestId, + auctionId: args.auctionId, + t: Date.now() + }; + const data = { + b: args.bidder, + u: args.adUnitCode, + p: args.cpm, + op: args.originalCpm, + c: args.currency, + oc: args.originalCurrency, + sz: args.size, + st: args.status, + rt: args.timeToRespond, + bi: args.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE], data, args.auctionId); + processEvent(event); +} +function handleBidRejected(args) { + // console.log('bid rejected:', arguments); + const data = { + b: args.bidder, + u: args.adUnitCode, + p: args.cpm, + c: args.currency, + r: args.rejectionReason, + bi: args.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REJECTED], data, args.auctionId); + processEvent(event); +} +function handleBidderDone(args) { + // console.log('bidder done:', arguments); + const data = { + b: args.bidderCode + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE], data, args.auctionId); + processEvent(event); +} +function getAuctionUnitsData(auctionObject) { + let unitsData = {}; + const { + bidsReceived, + bidsRejected + } = auctionObject; + let _unitsDataBidReducer = function (data, bid, key) { + const { + adUnitCode, + bidder + } = bid; + data[adUnitCode] = data[adUnitCode] || {}; + data[adUnitCode][key] = data[adUnitCode][key] || {}; + data[adUnitCode][key][bidder] = (data[adUnitCode][key][bidder] || 0) + 1; + return data; + }; + unitsData = bidsReceived.reduce((data, bid) => { + if (!bid.cpm) return data; + return _unitsDataBidReducer(data, bid, 'b'); + }, unitsData); + unitsData = bidsRejected.reduce((data, bid) => { + return _unitsDataBidReducer(data, bid, 'rj'); + }, unitsData); + return unitsData; +} +function handleEmptyAuction(auction) { + let auctionId = auction.auctionId; + if (!auctionsData[auctionId]) { + createAuctionData(auction, true); + } +} +function handleAuctionEnd(args) { + // console.log('auction end:', arguments); + if (!args.bidderRequests.length) { + handleEmptyAuction(args); + return; + } + auctionsData[args.auctionId].end = args.auctionEnd; + let winningBids = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().getHighestCpmBids() || []; + if (winningBids.length === 0) { + winningBids = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().getAllWinningBids() || []; + } + const wins = []; + winningBids.forEach(bid => { + if (bid.auctionId === args.auctionId) { + wins.push({ + b: bid.bidder, + u: bid.adUnitCode, + p: bid.cpm, + c: bid.currency, + sz: bid.size, + bi: bid.requestId + }); + } + }); + const data = { + wins, + u: getAuctionUnitsData(args), + o: auctionCount, + bc: args.bidsReceived.length, + nbc: args.noBids.length, + rjc: args.bidsRejected.length, + brc: args.bidderRequests.reduce((count, bidderRequest) => { + const c = bidderRequest.bids.length || 0; + return count + c; + }, 0) + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_END], data, args.auctionId); + processEvent(event); +} +function handleBidWon(args) { + // console.log('bid won:', arguments); + const data = { + b: args.bidder, + u: args.adUnitCode, + p: args.cpm, + op: args.originalCpm, + c: args.currency, + oc: args.originalCurrency, + sz: args.size, + mt: args.mediaType, + at: getStandardTargeting(args.adserverTargeting), + o: auctionCount, + bi: args.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON], data, args.auctionId); + processEvent(event); +} +function handleSetTargeting(args) { + // console.log('set targeting:', arguments); + let adId; + const filteredTargetings = {}; + Object.keys(args).forEach(unit => { + if (Object.keys(args[unit]).length) { + if (!adId) { + adId = args[unit].hb_adid; + } + filteredTargetings[unit] = getStandardTargeting(args[unit]); + } + }); + if (adId) { + const auctionId = bidsData[adId].auctionId; + const data = { + u: filteredTargetings + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.SET_TARGETING], data, auctionId); + processEvent(event); + } +} +function handleStaleRender(args) { + // console.log('stale render:', arguments); + const data = { + b: args.bidder, + u: args.adUnitCode, + p: args.cpm, + c: args.currency, + bi: args.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.STALE_RENDER], data, args.auctionId); + processEvent(event); +} +function handleRenderSuccess(args) { + // console.log('render success:', arguments); + const { + bid + } = args; + bidsData[bid.adId].renderTime = Date.now(); + const data = { + b: bid.bidder, + u: bid.adUnitCode, + p: bid.cpm, + c: bid.currency, + sz: bid.size, + mt: bid.mediaType, + bi: bid.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AD_RENDER_SUCCEEDED], data, bid.auctionId); + processEvent(event); +} +function handleRenderFailed(args) { + // console.log('render failed:', arguments); + const { + bid, + reason + } = args; + const data = { + b: bid.bidder, + u: bid.adUnitCode, + p: bid.cpm, + c: bid.currency, + r: reason, + bi: bid.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AD_RENDER_FAILED], data, bid.auctionId); + processEvent(event); +} +function handleBidViewable(args) { + // console.log('bid viewable:', arguments); + const renderTime = bidsData[args.adId].renderTime; + const data = { + b: args.bidder, + u: args.adUnitCode, + rt: Date.now() - renderTime, + bi: args.requestId + }; + const event = createEvent(EVENT_MAP[_src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_VIEWABLE], data, args.auctionId); + processEvent(event); +} +let baseAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + analyticsType +}); +let r2b2Analytics = Object.assign({}, baseAdapter, { + getUrl() { + return `${DEFAULT_PROTOCOL}://${LOG_SERVER}/${DEFAULT_EVENT_PATH}`; + }, + getErrorUrl() { + return `${DEFAULT_PROTOCOL}://${LOG_SERVER}/${DEFAULT_ERROR_PATH}`; + }, + enableAnalytics() { + let conf = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(conf.options)) { + const { + domain, + configId, + configVer, + server + } = conf.options; + if (!domain || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(domain)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${MODULE_NAME}: Mandatory parameter 'domain' not configured, analytics disabled`); + return; + } + WEBSITE = domain; + if (server) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(server)) { + LOG_SERVER = server; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`options.server must be a string`); + } + } + if (configId) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(configId)) { + CONFIG_ID = configId; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`options.configId must be a number`); + } + } + if (configVer) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(configVer)) { + CONFIG_VERSION = configVer; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`options.configVer must be a number`); + } + } + } + baseAdapter.enableAnalytics.call(this, conf); + }, + track(event) { + const { + eventType, + args + } = event; + try { + if (!adServerCurrency) { + const currencyObj = _src_config_js__WEBPACK_IMPORTED_MODULE_6__.config.getConfig('currency'); + adServerCurrency = currencyObj && currencyObj.adServerCurrency || 'USD'; + } + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.NO_BID: + handleNoBid(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_INIT: + handleAuctionInit(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REQUESTED: + handleBidRequested(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_TIMEOUT: + handleBidTimeout(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_RESPONSE: + handleBidResponse(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_REJECTED: + handleBidRejected(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BIDDER_DONE: + handleBidderDone(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AUCTION_END: + handleAuctionEnd(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_WON: + handleBidWon(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.SET_TARGETING: + handleSetTargeting(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.STALE_RENDER: + handleStaleRender(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AD_RENDER_SUCCEEDED: + handleRenderSuccess(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.AD_RENDER_FAILED: + handleRenderFailed(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_1__.EVENTS.BID_VIEWABLE: + handleBidViewable(args); + break; + } + } catch (e) { + reportError(`${eventType} - ${e.message}`); + } + } +}); + +// save the base class function +r2b2Analytics.originEnableAnalytics = r2b2Analytics.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +r2b2Analytics.enableAnalytics = function (config) { + r2b2Analytics.originEnableAnalytics(config); // call the base class function +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: r2b2Analytics, + code: ADAPTER_CODE, + gvlid: GVLID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (r2b2Analytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('r2b2AnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/r2b2AnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["r2b2BidAdapter"],{ + +/***/ "./modules/r2b2BidAdapter.js": +/*!***********************************!*\ + !*** ./modules/r2b2BidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports internal, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/pbsExtensions/pbsExtensions.js */ "./libraries/pbsExtensions/pbsExtensions.js"); +/* harmony import */ var _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/bidderSettings.js */ "./src/bidderSettings.js"); + + + + + + + + +const ADAPTER_VERSION = '1.0.0'; +const BIDDER_CODE = 'r2b2'; +const GVL_ID = 1235; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_TTL = 360; +const DEFAULT_NET_REVENUE = true; +const DEBUG_PARAM = 'pbjs_test_r2b2'; +const RENDERER_URL = 'https://delivery.r2b2.io/static/rendering.js'; +const ENDPOINT = _src_bidderSettings_js__WEBPACK_IMPORTED_MODULE_0__.bidderSettings.get(BIDDER_CODE, 'endpoint') || 'hb.r2b2.cz'; +const SERVER_URL = 'https://' + ENDPOINT; +const URL_BID = SERVER_URL + '/openrtb2/bid'; +const URL_SYNC = SERVER_URL + '/cookieSync'; +const URL_EVENT = SERVER_URL + '/event'; +const URL_EVENT_ON_BIDDER_ERROR = URL_EVENT + '/bidError'; +const URL_EVENT_ON_TIMEOUT = URL_EVENT + '/timeout'; +const R2B2_TEST_UNIT = 'selfpromo'; +const internal = { + placementsToSync: [], + mappedParams: {} +}; +let r2b2Error = function (message, params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(message, params, BIDDER_CODE); +}; +function getIdParamsFromPID(pid) { + // selfpromo test creative + if (pid === R2B2_TEST_UNIT) { + return { + d: 'test', + g: 'test', + p: 'selfpromo', + m: 0, + selfpromo: 1 + }; + } + if (!isNaN(pid)) { + return { + pid: Number(pid) + }; + } + if (typeof pid === 'string') { + const params = pid.split('/'); + if (params.length === 3 || params.length === 4) { + const paramNames = ['d', 'g', 'p', 'm']; + return paramNames.reduce((p, paramName, index) => { + let param = params[index]; + if (paramName === 'm') { + param = ['desktop', 'classic', '0'].includes(param) ? 0 : Number(!!param); + } + p[paramName] = param; + return p; + }, {}); + } + } +} +function pickIdFromParams(params) { + if (!params) return null; + const { + d, + g, + p, + m, + pid + } = params; + return d ? { + d, + g, + p, + m + } : { + pid + }; +} +function getIdsFromBids(bids) { + return bids.reduce((ids, bid) => { + const params = internal.mappedParams[bid.bidId]; + const id = pickIdFromParams(params); + if (id) { + ids.push(id); + } + return ids; + }, []); +} +function triggerEvent(eventUrl, ids) { + if (ids && !ids.length) return; + const timeStamp = new Date().getTime(); + const symbol = eventUrl.indexOf('?') === -1 ? '?' : '&'; + const url = eventUrl + symbol + `p=${btoa(JSON.stringify(ids))}&cb=${timeStamp}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(url); +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const idParams = getIdParamsFromPID(bidRequest.params.pid); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext.r2b2', idParams); + internal.placementsToSync.push(idParams); + internal.mappedParams[imp.id] = Object.assign({}, bidRequest.params, idParams); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'ext.version', ADAPTER_VERSION); + request.cur = [DEFAULT_CURRENCY]; + const test = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getParameterByName)(DEBUG_PARAM) === '1' ? 1 : 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(request, 'test', test); + return request; + }, + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_TTL + }, + processors: _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_4__.pbsExtensions +}); +function setUpRenderer(adUnitCode, bid) { + // let renderer load once in main window, but pass the renderDocument + let renderDoc; + const config = { + documentResolver: (bid, sourceDocument, renderDocument) => { + renderDoc = renderDocument; + return sourceDocument; + } + }; + let renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + url: RENDERER_URL, + config: config, + id: bid.requestId, + adUnitCode + }); + renderer.setRender(function (bid, doc) { + doc = renderDoc || doc; + window.R2B2 = window.R2B2 || {}; + let main = window.R2B2; + main.HB = main.HB || {}; + main.HB.Render = main.HB.Render || {}; + main.HB.Render.queue = main.HB.Render.queue || []; + main.HB.Render.queue.push(() => { + const id = pickIdFromParams(internal.mappedParams[bid.requestId]); + main.HB.Renderer.render(id, bid, null, doc); + }); + }); + return renderer; +} +function getExtMediaType(bidMediaType, responseBid) { + switch (bidMediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER: + return { + type: 'banner', + settings: { + chd: null, + width: responseBid.w, + height: responseBid.h, + ad: { + type: 'content', + data: responseBid.adm + } + } + }; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.NATIVE: + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.VIDEO: + break; + default: + break; + } +} +function createPrebidResponseBid(requestImp, bidResponse, serverResponse, bids) { + const bidId = requestImp.id; + const adUnitCode = bids[0].adUnitCode; + const mediaType = bidResponse.ext.prebid.type; + let bidOut = { + requestId: bidId, + cpm: bidResponse.price, + creativeId: bidResponse.crid, + width: bidResponse.w, + height: bidResponse.h, + ttl: bidResponse.ttl ?? DEFAULT_TTL, + netRevenue: serverResponse.netRevenue ?? DEFAULT_NET_REVENUE, + currency: serverResponse.cur ?? DEFAULT_CURRENCY, + ad: bidResponse.adm, + mediaType: mediaType, + winUrl: bidResponse.nurl, + ext: { + cid: bidResponse.ext?.r2b2?.cid, + cdid: bidResponse.ext?.r2b2?.cdid, + mediaType: getExtMediaType(mediaType, bidResponse), + adUnit: adUnitCode, + dgpm: internal.mappedParams[bidId], + events: bidResponse.ext?.r2b2?.events + } + }; + if (bidResponse.ext?.r2b2?.useRenderer) { + bidOut.renderer = setUpRenderer(adUnitCode, bidOut); + } + return bidOut; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_6__.BANNER], + isBidRequestValid: function (bid) { + if (!bid.params || !bid.params.pid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bad params, "pid" required.'); + return false; + } + const id = getIdParamsFromPID(bid.params.pid); + if (!id || !(id.pid || id.d && id.g && id.p)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bad params, "pid" has to be either a number or a correctly assembled string.'); + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + const data = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + return [{ + method: 'POST', + url: URL_BID, + data, + bids: bidderRequest.bids + }]; + }, + interpretResponse: function (serverResponse, request) { + // r2b2Error('error message', {params: 1}); + let prebidResponses = []; + const response = serverResponse.body; + if (!response || !response.seatbid || !response.seatbid[0] || !response.seatbid[0].bid) { + return prebidResponses; + } + let requestImps = request.data.imp || []; + try { + response.seatbid.forEach(seat => { + let bids = seat.bid; + for (let responseBid of bids) { + let responseImpId = responseBid.impid; + let requestCurrentImp = requestImps.find(requestImp => requestImp.id === responseImpId); + if (!requestCurrentImp) { + r2b2Error('Cant match bid response.', { + impid: Boolean(responseBid.impid) + }); + continue; // Skip this iteration if there's no match + } + prebidResponses.push(createPrebidResponseBid(requestCurrentImp, responseBid, response, request.bids)); + } + }); + } catch (e) { + r2b2Error('Error while interpreting response:', { + msg: e.message + }); + } + return prebidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (!syncOptions.iframeEnabled) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Please enable iframe based user sync.'); + return syncs; + } + let plString; + try { + plString = btoa(JSON.stringify(internal.placementsToSync || [])); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('User sync failed: ' + e.message); + return syncs; + } + let url = URL_SYNC + `?p=${plString}`; + if (gdprConsent) { + url += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } + if (uspConsent) { + url += `&us_privacy=${uspConsent}`; + } + syncs.push({ + type: 'iframe', + url: url + }); + return syncs; + }, + onBidWon: function (bid) { + const url = bid.ext?.events?.onBidWon; + if (url) { + triggerEvent(url); + } + }, + onSetTargeting: function (bid) { + const url = bid.ext?.events?.onSetTargeting; + if (url) { + triggerEvent(url); + } + }, + onTimeout: function (bids) { + triggerEvent(URL_EVENT_ON_TIMEOUT, getIdsFromBids(bids)); + }, + onBidderError: function (params) { + let { + bidderRequest + } = params; + triggerEvent(URL_EVENT_ON_BIDDER_ERROR, getIdsFromBids(bidderRequest.bids)); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('r2b2BidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","pbsExtensions","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/r2b2BidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["radsBidAdapter"],{ + +/***/ "./modules/radsBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/radsBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const BIDDER_CODE = 'rads'; +const ENDPOINT_URL = 'https://rads.recognified.net/md.request.php'; +const ENDPOINT_URL_DEV = 'https://dcradn1.online-solution.biz/md.request.php'; +const DEFAULT_VAST_FORMAT = 'vast2'; +const GVLID = 602; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return !!bid.params.placement; + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const params = bidRequest.params; + const placementId = params.placement; + const rnd = Math.floor(Math.random() * 99999999999); + const referrer = encodeURIComponent(bidderRequest.refererInfo.page); + const bidId = bidRequest.bidId; + const isDev = params.devMode || false; + let endpoint = isDev ? ENDPOINT_URL_DEV : ENDPOINT_URL; + let payload = { + _f: 'prebid_js', + _ps: placementId, + idt: 100, + rnd: rnd, + p: referrer, + bid_id: bidId + }; + let sizes; + if (isBannerRequest(bidRequest)) { + sizes = getBannerSizes(bidRequest); + payload.rt = 'bid-response'; + payload.srw = sizes[0].width; + payload.srh = sizes[0].height; + } else { + let vastFormat = params.vastFormat || DEFAULT_VAST_FORMAT; + sizes = getVideoSizes(bidRequest); + payload.rt = vastFormat; + payload.srw = sizes[0].width; + payload.srh = sizes[0].height; + } + if (sizes.length > 1) { + payload.alt_ad_sizes = []; + for (let i = 1; i < sizes.length; i++) { + payload.alt_ad_sizes.push(sizes[i].width + 'x' + sizes[i].height); + } + } + prepareExtraParams(params, payload, bidderRequest, bidRequest); + return { + method: 'GET', + url: endpoint, + data: objectToQueryString(payload) + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + const crid = response.crid || 0; + const cpm = response.cpm / 1000000 || 0; + if (cpm !== 0 && crid !== 0) { + const dealId = response.dealid || ''; + const currency = response.currency || 'EUR'; + const netRevenue = response.netRevenue === undefined ? true : response.netRevenue; + const bidResponse = { + requestId: response.bid_id, + cpm: cpm, + width: response.width, + height: response.height, + creativeId: crid, + dealId: dealId, + currency: currency, + netRevenue: netRevenue, + ttl: 60, + meta: { + advertiserDomains: response.adomain || [] + } + }; + if (response.vastXml) { + bidResponse.vastXml = response.vastXml; + bidResponse.mediaType = 'video'; + } else { + bidResponse.ad = response.adTag; + } + bidResponses.push(bidResponse); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + if (!serverResponses || serverResponses.length === 0) { + return []; + } + const syncs = []; + let gdprParams = ''; + if (gdprConsent) { + if ('gdprApplies' in gdprConsent && typeof gdprConsent.gdprApplies === 'boolean') { + gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdprParams = `gdpr_consent=${gdprConsent.consentString}`; + } + } + if (serverResponses.length > 0 && serverResponses[0].body.userSync) { + if (syncOptions.iframeEnabled) { + serverResponses[0].body.userSync.iframeUrl.forEach(url => syncs.push({ + type: 'iframe', + url: appendToUrl(url, gdprParams) + })); + } + if (syncOptions.pixelEnabled) { + serverResponses[0].body.userSync.imageUrl.forEach(url => syncs.push({ + type: 'image', + url: appendToUrl(url, gdprParams) + })); + } + } + return syncs; + } +}; +function appendToUrl(url, what) { + if (!what) { + return url; + } + return url + (url.indexOf('?') !== -1 ? '&' : '?') + what; +} +function objectToQueryString(obj, prefix) { + let str = []; + let p; + for (p in obj) { + if (obj.hasOwnProperty(p)) { + let k = prefix ? prefix + '[' + p + ']' : p; + let v = obj[p]; + str.push(v !== null && typeof v === 'object' ? objectToQueryString(v, k) : encodeURIComponent(k) + '=' + encodeURIComponent(v)); + } + } + return str.join('&'); +} +/** + * Add extra params to server request + * + * @param params + * @param payload + * @param bidderRequest + * @param {BidRequest} bidRequest - Bid request generated from ad slots + */ +function prepareExtraParams(params, payload, bidderRequest, bidRequest) { + if (params.pfilter !== undefined) { + payload.pfilter = params.pfilter; + } + if (bidderRequest && bidderRequest.gdprConsent) { + if (payload.pfilter !== undefined) { + payload.pfilter.gdpr_consent = bidderRequest.gdprConsent.consentString; + payload.pfilter.gdpr = bidderRequest.gdprConsent.gdprApplies; + } else { + payload.pfilter = { + 'gdpr_consent': bidderRequest.gdprConsent.consentString, + 'gdpr': bidderRequest.gdprConsent.gdprApplies + }; + } + } + if (params.bcat !== undefined) { + payload.bcat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest.ortb2Imp, 'bcat') || params.bcat; + } + if (params.dvt !== undefined) { + payload.dvt = params.dvt; + } + if (params.latitude !== undefined) { + payload.latitude = params.latitude; + } + if (params.longitude !== undefined) { + payload.longitude = params.longitude; + } + if (params.ip !== undefined) { + payload.i = params.ip; + } + if (bidRequest.userId && bidRequest.userId.netId) { + payload.did_netid = bidRequest.userId.netId; + } + if (bidRequest.userId && bidRequest.userId.uid2) { + payload.did_uid2 = bidRequest.userId.uid2; + } +} + +/** + * Check if it's a banner bid request + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {boolean} True if it's a banner bid + */ +function isBannerRequest(bid) { + return bid.mediaType === 'banner' || !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner') || !isVideoRequest(bid); +} + +/** + * Check if it's a video bid request + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {boolean} True if it's a video bid + */ +function isVideoRequest(bid) { + return bid.mediaType === 'video' || !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video'); +} + +/** + * Get video sizes + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {object} True if it's a video bid + */ +function getVideoSizes(bid) { + return parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playerSize') || bid.sizes); +} + +/** + * Get banner sizes + * + * @param {BidRequest} bid - Bid request generated from ad slots + * @returns {object} True if it's a video bid + */ +function getBannerSizes(bid) { + return parseSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner.sizes') || bid.sizes); +} + +/** + * Parse size + * @param {string} size + * @returns {{width: number, height: number}} + */ +function parseSize(size) { + let sizeObj = {}; + sizeObj.width = parseInt(size[0], 10); + sizeObj.height = parseInt(size[1], 10); + return sizeObj; +} + +/** + * Parse sizes + * @param sizes + * @returns {{width: number , height: number }[]} + */ +function parseSizes(sizes) { + if (Array.isArray(sizes[0])) { + // is there several sizes ? (ie. [[728,90],[200,300]]) + return sizes.map(size => parseSize(size)); + } + return [parseSize(sizes)]; // or a single one ? (ie. [728,90]) +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('radsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/radsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rakutenBidAdapter"],{ + +/***/ "./modules/rakutenBidAdapter/index.js": +/*!********************************************!*\ + !*** ./modules/rakutenBidAdapter/index.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); + + + + +const BIDDER_CODE = 'rakuten'; +const ENDPOINT = 'https://s-bid.rmp.rakuten.com/h'; +const spec = { + code: BIDDER_CODE, + isBidRequestValid: bid => !!bid.params.adSpotId, + buildRequests: (validBidRequests, bidderRequest) => { + const bidRequests = []; + validBidRequests.forEach(bid => { + var _a, _b; + const params = bid.params; + bidRequests.push({ + method: 'GET', + url: _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('rakuten.endpoint') || ENDPOINT, + data: { + bi: bid.bidId, + t: params.adSpotId, + s: document.location.protocol, + ua: navigator.userAgent, + l: navigator.browserLanguage || navigator.language, + d: document.domain, + // TODO: what are 'tp' and 'pp'? + tp: bidderRequest.refererInfo.stack[0] || window.location.href, + pp: bidderRequest.refererInfo.topmostLocation, + gdpr: ((_a = bidderRequest.gdprConsent) === null || _a === void 0 ? void 0 : _a.gdprApplies) ? 1 : 0, + ...(((_b = bidderRequest.gdprConsent) === null || _b === void 0 ? void 0 : _b.consentString) && { + cd: bidderRequest.gdprConsent.consentString + }), + ...(bidderRequest.uspConsent && { + ccpa: bidderRequest.uspConsent + }) + } + }); + }); + return bidRequests; + }, + interpretResponse: (response, request) => { + const sb = response.body; + const bidResponses = []; + if (sb.cpm && sb.ad) { + bidResponses.push({ + requestId: sb.bid_id, + cpm: sb.cpm, + width: sb.width || 0, + height: sb.height || 0, + creativeId: sb.creative_id || 0, + dealId: sb.deal_id || '', + currency: sb.currency || 'USD', + netRevenue: typeof sb.net_revenue === 'undefined' ? true : !!sb.net_revenue, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, + ttl: sb.ttl, + ad: sb.ad + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (syncOptions.pixelEnabled && serverResponses[0].body !== undefined) { + const bidResponseObj = serverResponses[0].body; + if (!bidResponseObj) { + return []; + } + if (bidResponseObj.sync_urls && bidResponseObj.sync_urls.length > 0) { + bidResponseObj.sync_urls.forEach(syncUrl => { + if (syncUrl && syncUrl !== 'null' && syncUrl.length > 0) { + syncs.push({ + type: 'image', + url: syncUrl + }); + } + }); + } + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('rakutenBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rakutenBidAdapter/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["raveltechRtdProvider"],{ + +/***/ "./modules/raveltechRtdProvider.js": +/*!*****************************************!*\ + !*** ./modules/raveltechRtdProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export raveltechSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +// Constants +const MODULE_NAME = 'raveltech'; +const RAVEL_ENDPOINT = 'https://pb1.rvlproxy.net/bid/bid'; +const getAdapterNameForAlias = aliasName => _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__["default"].aliasRegistry[aliasName] || aliasName; +const getAnonymizedEids = eids => { + const ZKAD = window.ZKAD || { + anonymizeID(v, p) { + return undefined; + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ZKAD.ready=', ZKAD.ready); + if (!eids) { + return eids; + } + eids.forEach(eid => { + if (!eid || !eid.uids || eid.uids.length === 0) { + return eid; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('eid.source=', eid.source); + eid.uids = eid.uids.flatMap(uid => { + if (!uid || !uid.id) { + return []; + } + const id = ZKAD.anonymizeID(uid.id, eid.source); + if (!id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error while anonymizing uid :', eid, uid); + return []; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Anonymized as byte array of length=', id.length); + return [{ + ...uid, + id + }]; + }); + }); + return eids; +}; +const addRavelDataToRequest = (request, adapterName) => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(request.data)) { + try { + const data = JSON.parse(request.data); + data.ravel = { + pbjsAdapter: adapterName + }; + request.data = JSON.stringify(data); + } catch (_e) {} + } else if (!request.data) { + request.data = { + ravel: { + pbjsAdapter: adapterName + } + }; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(request.data)) { + request.data.ravel = { + pbjsAdapter: adapterName + }; + } +}; +const wrapBuildRequests = (aliasName, preserveOriginalBid, buildRequests) => { + const adapterName = getAdapterNameForAlias(aliasName); + return function (validBidRequests) { + for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + rest[_key - 1] = arguments[_key]; + } + if (!window.ZKAD || !window.ZKAD.ready) { + return buildRequests(validBidRequests, ...rest); + } + let requests = preserveOriginalBid ? buildRequests(validBidRequests, ...rest) : []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(requests)) { + requests = [requests]; + } + try { + const ravelBidRequests = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(validBidRequests); + + // Anonymize eids for ravel proxified requests + const anonymizedEids = getAnonymizedEids(ravelBidRequests[0]?.userIdAsEids); + ravelBidRequests.forEach(bidRequest => { + // Replace original eids with anonymized eids + bidRequest.userIdAsEids = anonymizedEids; + }); + let ravelRequests = buildRequests(ravelBidRequests, ...rest); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(ravelRequests) && ravelRequests) { + ravelRequests = [ravelRequests]; + } + if (ravelRequests) { + ravelRequests.forEach(request => { + // Proxyfy request + request.url = RAVEL_ENDPOINT; + request.method = 'POST'; + addRavelDataToRequest(request, adapterName); + }); + } + return [...(requests ?? []), ...(ravelRequests ?? [])]; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error while generating ravel requests :', e); + return requests; + } + }; +}; +const getBidderRequestsHook = config => { + const allowedBidders = config.params.bidders || []; + const preserveOriginalBid = config.params.preserveOriginalBid ?? false; + const wrappedBidders = []; + return function (next, spec) { + if (allowedBidders.includes(spec.code) && !wrappedBidders.includes(spec.code)) { + spec.buildRequests = wrapBuildRequests(spec.code, preserveOriginalBid, spec.buildRequests); + wrappedBidders.push(spec.code); + } + for (var _len2 = arguments.length, rest = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { + rest[_key2 - 2] = arguments[_key2]; + } + next(spec, ...rest); + }; +}; + +/** + * Init + * @param {Object} config Module configuration + * @param {boolean} _userConsent + * @returns true + */ +const init = (config, _userConsent) => { + const allowedBidders = config.params.bidders || []; + const preserveOriginalBid = config.params.preserveOriginalBid ?? false; + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.getHook)('processBidderRequests').before(getBidderRequestsHook(config)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Raveltech RTD ready - ${preserveOriginalBid ? 'will' : `won't`} duplicate bid requests - Allowed bidders : `, allowedBidders); + return true; +}; +const raveltechSubmodule = { + name: MODULE_NAME, + init +}; + +// Register raveltechSubmodule as submodule of realTimeData +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_2__.submodule)('realTimeData', raveltechSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('raveltechRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/raveltechRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["raynRtdProvider"],{ + +/***/ "./modules/raynRtdProvider.js": +/*!************************************!*\ + !*** ./modules/raynRtdProvider.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports SEGMENTS_RESOLVER, RAYN_LOCAL_STORAGE_KEY, storage, generateOrtbDataObject, generatePersonaOrtbDataObject, generateChecksum, readSegments, setSegmentsAsBidderOrtb2, raynSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + +/** + * This module adds the Rayn provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time audience and context data from Rayn + * @module modules/raynRtdProvider + * @requires module:modules/realTimeData + */ + + + + + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'rayn'; +const RAYN_TCF_ID = 1220; +const RAYN_PERSONA_TAXONOMY_ID = 103015; +const LOG_PREFIX = 'RaynJS: '; +const SEGMENTS_RESOLVER = 'rayn.io'; +const RAYN_LOCAL_STORAGE_KEY = 'rayn-segtax'; +const defaultIntegration = { + iabAudienceCategories: { + v1_1: { + tier: 6, + enabled: true + } + }, + iabContentCategories: { + v3_0: { + tier: 4, + enabled: true + }, + v2_2: { + tier: 4, + enabled: true + } + } +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +function init(moduleConfig, userConsent) { + return true; +} + +/** + * Create and return ORTB2 object with segtax and segments + * @param {number} segtax + * @param {Array} segment + * @param {number} maxTier + * @return {Array} + */ +function generateOrtbDataObject(segtax, segment, maxTier) { + const segmentIds = []; + try { + Object.keys(segment).forEach(tier => { + if (tier <= maxTier) { + segmentIds.push(...segment[tier].map(id => { + return { + id + }; + })); + } + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + } + return { + name: SEGMENTS_RESOLVER, + ext: { + segtax + }, + segment: segmentIds + }; +} + +/** + * Create and return ORTB2 object with segtax and personaIds + * @param {number} segtax + * @param {Array} personaIds + * @return {Array} + */ +function generatePersonaOrtbDataObject(segtax, personaIds) { + const segmentIds = []; + try { + segmentIds.push(...personaIds.map(id => { + return { + id + }; + })); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + } + return { + name: SEGMENTS_RESOLVER, + ext: { + segtax + }, + segment: segmentIds + }; +} + +/** + * Generates checksum + * @param {string} stringValue + * @returns {string} + */ +function generateChecksum(stringValue) { + const l = stringValue.length; + let i = 0; + let h = 0; + if (l > 0) while (i < l) h = (h << 5) - h + stringValue.charCodeAt(i++) | 0; + return h.toString(); +} +; + +/** + * Gets an object of segtax and segment IDs from LocalStorage + * or return the default value provided. + * @param {string} key + * @return {Object} + */ +function readSegments(key) { + try { + return JSON.parse(storage.getDataFromLocalStorage(key)); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + return null; + } +} + +/** + * Pass segments to configured bidders, using ORTB2 + * @param {Object} bidConfig + * @param {Array} bidders + * @param {Object} integrationConfig + * @param {Array} segments + * @return {void} + */ +function setSegmentsAsBidderOrtb2(bidConfig, bidders, integrationConfig, segments, checksum) { + const raynOrtb2 = {}; + const raynContentData = []; + if (integrationConfig.iabContentCategories.v2_2.enabled && segments[checksum] && segments[checksum][6]) { + raynContentData.push(generateOrtbDataObject(6, segments[checksum][6], integrationConfig.iabContentCategories.v2_2.tier)); + } + if (integrationConfig.iabContentCategories.v3_0.enabled && segments[checksum] && segments[checksum][7]) { + raynContentData.push(generateOrtbDataObject(7, segments[checksum][7], integrationConfig.iabContentCategories.v3_0.tier)); + } + if (raynContentData.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(raynOrtb2, 'site.content.data', raynContentData); + } + const raynUserData = []; + if (integrationConfig.iabAudienceCategories.v1_1.enabled && segments[4]) { + raynUserData.push(generateOrtbDataObject(4, segments[4], integrationConfig.iabAudienceCategories.v1_1.tier)); + } + if (segments[RAYN_PERSONA_TAXONOMY_ID]) { + raynUserData.push(generatePersonaOrtbDataObject(RAYN_PERSONA_TAXONOMY_ID, segments[RAYN_PERSONA_TAXONOMY_ID])); + } + if (raynUserData.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(raynOrtb2, 'user.data', raynUserData); + } + if (!bidders || bidders.length === 0 || !segments || Object.keys(segments).length <= 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(bidConfig?.ortb2Fragments?.global, raynOrtb2); + } else { + const bidderConfig = Object.fromEntries(bidders.map(bidder => [bidder, raynOrtb2])); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(bidConfig?.ortb2Fragments?.bidder, bidderConfig); + } +} + +/** + * Real-time data retrieval from Rayn + * @param {Object} reqBidsConfigObj + * @param {function} callback + * @param {Object} config + * @param {Object} userConsent + * @return {void} + */ +function alterBidRequests(reqBidsConfigObj, callback, config, userConsent) { + try { + const checksum = generateChecksum(window.location.href); + const segments = readSegments(RAYN_LOCAL_STORAGE_KEY); + const bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(config, 'params.bidders'); + const integrationConfig = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(defaultIntegration, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(config, 'params.integration')); + if (segments && Object.keys(segments).length > 0 && (segments[checksum] || segments[4] && integrationConfig.iabAudienceCategories.v1_1.enabled && !integrationConfig.iabContentCategories.v2_2.enabled && !integrationConfig.iabContentCategories.v3_0.enabled || segments[RAYN_PERSONA_TAXONOMY_ID])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(LOG_PREFIX, `Segtax data from localStorage: ${JSON.stringify(segments)}`); + setSegmentsAsBidderOrtb2(reqBidsConfigObj, bidders, integrationConfig, segments, checksum); + callback(); + } else if (window.raynJS && typeof window.raynJS.getSegtax === 'function') { + window.raynJS.getSegtax().then(segtaxData => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(LOG_PREFIX, `Segtax data from RaynJS: ${JSON.stringify(segtaxData)}`); + setSegmentsAsBidderOrtb2(reqBidsConfigObj, bidders, integrationConfig, segtaxData, checksum); + callback(); + }).catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + callback(); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(LOG_PREFIX, 'No segtax data'); + callback(); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + callback(); + } +} +const raynSubmodule = { + name: SUBMODULE_NAME, + init: init, + getBidRequestData: alterBidRequests, + gvlid: RAYN_TCF_ID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)(MODULE_NAME, raynSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('raynRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/raynRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["readpeakBidAdapter"],{ + +/***/ "./modules/readpeakBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/readpeakBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports ENDPOINT, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + +const ENDPOINT = 'https://app.readpeak.com/header/prebid'; +const NATIVE_DEFAULTS = { + TITLE_LEN: 70, + DESCR_LEN: 120, + SPONSORED_BY_LEN: 50, + IMG_MIN: 150, + ICON_MIN: 50, + CTA_LEN: 50 +}; +const BIDDER_CODE = 'readpeak'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: bid => !!(bid && bid.params && bid.params.publisherId), + buildRequests: (bidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(bidRequests); + const currencyObj = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('currency'); + const currency = currencyObj && currencyObj.adServerCurrency || 'USD'; + const request = { + id: bidRequests[0].bidderRequestId, + imp: bidRequests.map(slot => impression(slot)), + site: site(bidRequests, bidderRequest), + app: app(bidRequests), + device: device(), + cur: [currency], + source: { + fd: 1, + tid: bidderRequest.ortb2?.source?.tid, + ext: { + prebid: "9.45.0-pre" + } + } + }; + if (bidderRequest.gdprConsent) { + request.user = { + ext: { + consent: bidderRequest.gdprConsent.consentString || '' + } + }; + request.regs = { + ext: { + gdpr: bidderRequest.gdprConsent.gdprApplies !== undefined ? bidderRequest.gdprConsent.gdprApplies : true + } + }; + } + return { + method: 'POST', + url: ENDPOINT, + data: JSON.stringify(request) + }; + }, + interpretResponse: (response, request) => { + return bidResponseAvailable(request, response); + }, + onBidWon: bid => { + if (bid.burl && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(bid.burl)) { + bid.burl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.replaceAuctionPrice)(bid.burl, bid.cpm); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(bid.burl); + } + } +}; +function bidResponseAvailable(bidRequest, bidResponse) { + const idToImpMap = {}; + const idToBidMap = {}; + if (!bidResponse['body']) { + return []; + } + bidResponse = bidResponse.body; + parse(bidRequest.data).imp.forEach(imp => { + idToImpMap[imp.id] = imp; + }); + if (bidResponse) { + bidResponse.seatbid.forEach(seatBid => seatBid.bid.forEach(bid => { + idToBidMap[bid.impid] = bid; + })); + } + const bids = []; + Object.keys(idToImpMap).forEach(id => { + if (idToBidMap[id]) { + const bid = { + requestId: id, + cpm: idToBidMap[id].price, + creativeId: idToBidMap[id].crid, + ttl: 300, + netRevenue: true, + mediaType: idToImpMap[id].native ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + currency: bidResponse.cur + }; + if (idToImpMap[id].native) { + bid.native = nativeResponse(idToImpMap[id], idToBidMap[id]); + } else if (idToImpMap[id].banner) { + bid.ad = idToBidMap[id].adm; + bid.width = idToBidMap[id].w; + bid.height = idToBidMap[id].h; + bid.burl = idToBidMap[id].burl; + } + if (idToBidMap[id].adomain) { + bid.meta = { + advertiserDomains: idToBidMap[id].adomain + }; + } + bids.push(bid); + } + }); + return bids; +} +function impression(slot) { + let bidFloorFromModule; + if (typeof slot.getFloor === 'function') { + const floorInfo = slot.getFloor({ + currency: 'USD', + mediaType: 'native', + size: '\*' + }); + bidFloorFromModule = floorInfo?.currency === 'USD' ? floorInfo?.floor : undefined; + } + const imp = { + id: slot.bidId, + bidfloor: bidFloorFromModule || slot.params.bidfloor || 0, + bidfloorcur: bidFloorFromModule && 'USD' || slot.params.bidfloorcur || 'USD', + tagId: slot.params.tagId || '0' + }; + if (slot.mediaTypes.native) { + imp.native = nativeImpression(slot); + } else if (slot.mediaTypes.banner) { + imp.banner = bannerImpression(slot); + } + return imp; +} +function nativeImpression(slot) { + if (slot.nativeParams) { + const assets = []; + addAsset(assets, titleAsset(1, slot.nativeParams.title, NATIVE_DEFAULTS.TITLE_LEN)); + addAsset(assets, imageAsset(2, slot.nativeParams.image, 3, slot.nativeParams.wmin || NATIVE_DEFAULTS.IMG_MIN, slot.nativeParams.hmin || NATIVE_DEFAULTS.IMG_MIN)); + addAsset(assets, dataAsset(3, slot.nativeParams.sponsoredBy, 1, NATIVE_DEFAULTS.SPONSORED_BY_LEN)); + addAsset(assets, dataAsset(4, slot.nativeParams.body, 2, NATIVE_DEFAULTS.DESCR_LEN)); + addAsset(assets, dataAsset(5, slot.nativeParams.cta, 12, NATIVE_DEFAULTS.CTA_LEN)); + return { + request: JSON.stringify({ + assets + }), + ver: '1.1' + }; + } + return null; +} +function addAsset(assets, asset) { + if (asset) { + assets.push(asset); + } +} +function titleAsset(id, params, defaultLen) { + if (params) { + return { + id, + required: params.required ? 1 : 0, + title: { + len: params.len || defaultLen + } + }; + } + return null; +} +function imageAsset(id, params, type, defaultMinWidth, defaultMinHeight) { + return params ? { + id, + required: params.required ? 1 : 0, + img: { + type, + wmin: params.wmin || defaultMinWidth, + hmin: params.hmin || defaultMinHeight + } + } : null; +} +function dataAsset(id, params, type, defaultLen) { + return params ? { + id, + required: params.required ? 1 : 0, + data: { + type, + len: params.len || defaultLen + } + } : null; +} +function bannerImpression(slot) { + var sizes = slot.mediaTypes.banner.sizes || slot.sizes; + return { + format: sizes.map(s => ({ + w: s[0], + h: s[1] + })), + w: sizes[0][0], + h: sizes[0][1] + }; +} +function site(bidRequests, bidderRequest) { + const pubId = bidRequests && bidRequests.length > 0 ? bidRequests[0].params.publisherId : '0'; + const siteId = bidRequests && bidRequests.length > 0 ? bidRequests[0].params.siteId : '0'; + const appParams = bidRequests[0].params.app; + if (!appParams) { + return { + publisher: { + id: pubId.toString(), + domain: bidderRequest?.refererInfo?.domain + }, + id: siteId ? siteId.toString() : pubId.toString(), + page: bidderRequest?.refererInfo?.page, + domain: bidderRequest?.refererInfo?.domain + }; + } + return undefined; +} +function app(bidderRequest) { + const pubId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.publisherId : '0'; + const appParams = bidderRequest[0].params.app; + if (appParams) { + return { + publisher: { + id: pubId.toString() + }, + bundle: appParams.bundle, + storeurl: appParams.storeUrl, + domain: appParams.domain + }; + } + return undefined; +} +function isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(__webpack_require__.g.navigator.userAgent); +} +function isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(__webpack_require__.g.navigator.userAgent); +} +function device() { + return { + ua: navigator.userAgent, + language: navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage, + devicetype: isMobile() ? 1 : isConnectedTV() ? 3 : 2 + }; +} +function parse(rawResponse) { + try { + if (rawResponse) { + if (typeof rawResponse === 'object') { + return rawResponse; + } else { + return JSON.parse(rawResponse); + } + } + } catch (ex) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('readpeakBidAdapter.safeParse', 'ERROR', ex); + } + return null; +} +function nativeResponse(imp, bid) { + if (imp && imp['native']) { + const nativeAd = parse(bid.adm); + const keys = {}; + if (nativeAd && nativeAd.assets) { + nativeAd.assets.forEach(asset => { + keys.title = asset.title ? asset.title.text : keys.title; + keys.body = asset.data && asset.id === 4 ? asset.data.value : keys.body; + keys.sponsoredBy = asset.data && asset.id === 3 ? asset.data.value : keys.sponsoredBy; + keys.image = asset.img && asset.id === 2 ? { + url: asset.img.url, + width: asset.img.w || 750, + height: asset.img.h || 500 + } : keys.image; + keys.cta = asset.data && asset.id === 5 ? asset.data.value : keys.cta; + }); + if (nativeAd.link) { + keys.clickUrl = nativeAd.link.url; + } + const trackers = nativeAd.imptrackers || []; + trackers.unshift((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.replaceAuctionPrice)(bid.burl, bid.price)); + keys.impressionTrackers = trackers; + return keys; + } + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('readpeakBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/readpeakBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["reconciliationRtdProvider"],{ + +/***/ "./modules/reconciliationRtdProvider.js": +/*!**********************************************!*\ + !*** ./modules/reconciliationRtdProvider.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getTopIFrameWin, getSlotByWin, track, reconciliationSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + +/** + * This module adds reconciliation provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will add custom targetings to ad units + * The module will listen to post messages from rendered creatives with Reconciliation Tag + * The module will call tracking pixels to log info needed for reconciliation matching + * @module modules/reconciliationRtdProvider + * @requires module:modules/realTimeData + */ + +/** + * @typedef {Object} ModuleParams + * @property {string} publisherMemberId + * @property {?string} initUrl + * @property {?string} impressionUrl + * @property {?boolean} allowAccess + */ + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +/** @type {Object} */ +const MessageType = { + IMPRESSION_REQUEST: 'rsdk:impression:req', + IMPRESSION_RESPONSE: 'rsdk:impression:res' +}; +/** @type {ModuleParams} */ +const DEFAULT_PARAMS = { + initUrl: 'https://confirm.fiduciadlt.com/init', + impressionUrl: 'https://confirm.fiduciadlt.com/pimp', + allowAccess: false +}; +/** @type {ModuleParams} */ +let _moduleParams = {}; + +/** + * Handle postMesssage from ad creative, track impression + * and send response to reconciliation ad tag + * @param {Event} e + */ +function handleAdMessage(e) { + let data = {}; + let adUnitId = ''; + let adDeliveryId = ''; + try { + data = JSON.parse(e.data); + } catch (e) { + return; + } + if (data.type === MessageType.IMPRESSION_REQUEST) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isGptPubadsDefined)()) { + // 1. Find the last iframed window before window.top where the tracker was injected + // (the tracker could be injected in nested iframes) + const adWin = getTopIFrameWin(e.source); + if (adWin && adWin !== window.top) { + // 2. Find the GPT slot for the iframed window + const adSlot = getSlotByWin(adWin); + // 3. Get AdUnit IDs for the selected slot + if (adSlot) { + adUnitId = adSlot.getAdUnitPath(); + adDeliveryId = adSlot.getTargeting('RSDK_ADID'); + adDeliveryId = adDeliveryId.length ? adDeliveryId[0] : `${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp)()}-${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)()}`; + } + } + } + + // Call local impression callback + const args = Object.assign({}, data.args, { + publisherDomain: window.location.hostname, + publisherMemberId: _moduleParams.publisherMemberId, + adUnitId, + adDeliveryId + }); + track.trackPost(_moduleParams.impressionUrl, args); + + // Send response back to the Advertiser tag + let response = { + type: MessageType.IMPRESSION_RESPONSE, + id: data.id, + args: Object.assign({ + publisherDomain: window.location.hostname + }, data.args) + }; + + // If access is allowed - add ad unit id to response + if (_moduleParams.allowAccess) { + Object.assign(response.args, { + adUnitId, + adDeliveryId + }); + } + e.source.postMessage(JSON.stringify(response), '*'); + } +} + +/** + * Get top iframe window for nested Window object + * - top + * -- iframe.window <-- top iframe window + * --- iframe.window + * ---- iframe.window <-- win + * + * @param {Window} win nested iframe window object + * @param {Window} topWin top window + */ +function getTopIFrameWin(win, topWin) { + topWin = topWin || window; + if (!win) { + return null; + } + try { + while (win.parent !== topWin) { + win = win.parent; + } + return win; + } catch (e) { + return null; + } +} + +/** + * get all slots on page + * @return {Object[]} slot GoogleTag slots + */ +function getAllSlots() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isGptPubadsDefined)() && window.googletag.pubads().getSlots(); +} + +/** + * get GPT slot by placement id + * @param {string} code placement id + * @return {?Object} + */ +function getSlotByCode(code) { + const slots = getAllSlots(); + if (!slots || !slots.length) { + return null; + } + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(slots, s => s.getSlotElementId() === code || s.getAdUnitPath() === code) || null; +} + +/** + * get GPT slot by iframe window + * @param {Window} win + * @return {?Object} + */ +function getSlotByWin(win) { + const slots = getAllSlots(); + if (!slots || !slots.length) { + return null; + } + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(slots, s => { + let slotElement = document.getElementById(s.getSlotElementId()); + if (slotElement) { + let slotIframe = slotElement.querySelector('iframe'); + if (slotIframe && slotIframe.contentWindow === win) { + return true; + } + } + return false; + }) || null; +} + +/** + * Init Reconciliation post messages listeners to handle + * impressions messages from ad creative + */ +function initListeners() { + window.addEventListener('message', handleAdMessage, false); +} + +/** + * Send init event to log + * @param {Array} adUnits + */ +function trackInit(adUnits) { + track.trackPost(_moduleParams.initUrl, { + adUnits, + publisherDomain: window.location.hostname, + publisherMemberId: _moduleParams.publisherMemberId + }); +} + +/** + * Track event via POST request + * wrap method to allow stubbing in tests + * @param {string} url + * @param {Object} data + */ +const track = { + trackPost(url, data) { + const ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajaxBuilder)(); + ajax(url, function () {}, JSON.stringify(data), { + method: 'POST' + }); + } +}; + +/** + * Set custom targetings for provided adUnits + * @param {string[]} adUnitsCodes + * @return {Object} key-value object with custom targetings + */ +function getReconciliationData(adUnitsCodes) { + const dataToReturn = {}; + const adUnitsToTrack = []; + adUnitsCodes.forEach(adUnitCode => { + if (!adUnitCode) { + return; + } + const adSlot = getSlotByCode(adUnitCode); + const adUnitId = adSlot ? adSlot.getAdUnitPath() : adUnitCode; + const adDeliveryId = `${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.timestamp)()}-${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)()}`; + dataToReturn[adUnitCode] = { + RSDK_AUID: adUnitId, + RSDK_ADID: adDeliveryId + }; + adUnitsToTrack.push({ + adUnitId, + adDeliveryId + }); + }, {}); + + // Track init event + trackInit(adUnitsToTrack); + return dataToReturn; +} + +/** @type {RtdSubmodule} */ +const reconciliationSubmodule = { + /** + * used to link submodule with realTimeData + * @type {string} + */ + name: 'reconciliation', + /** + * get data and send back to realTimeData module + * @function + * @param {string[]} adUnitsCodes + */ + getTargetingData: getReconciliationData, + init: init +}; +function init(moduleConfig) { + const params = moduleConfig.params; + if (params && params.publisherMemberId) { + _moduleParams = Object.assign({}, DEFAULT_PARAMS, params); + initListeners(); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('missing params for Reconciliation provider'); + } + return true; +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('realTimeData', reconciliationSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('reconciliationRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/reconciliationRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rediadsBidAdapter"],{ + +/***/ "./modules/rediadsBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/rediadsBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +const BIDDER_CODE = 'rediads'; +const ENDPOINT_URL = 'https://bidding.rediads.com/openrtb2/auction'; +const STAGING_ENDPOINT_URL = 'https://stagingbidding.rediads.com/openrtb2/auction'; +const DEFAULT_CURRENCY = 'USD'; +const LOG_PREFIX = 'Rediads: '; +const MEDIA_TYPES = { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]: 1, + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]: 2, + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]: 4 +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: DEFAULT_CURRENCY + }, + bidResponse(buildBidResponse, bid, context) { + let mediaType = 'banner'; // Default media type + + if (bid.vastXml || bid.vastUrl || bid.adm && bid.adm.startsWith(' 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + const commonParams = bidRequests[0]?.params || {}; + const siteContent = bidRequests[0]?.site?.content || null; + let data = {}; + let FINAL_ENDPOINT_URL = ENDPOINT_URL; + if (commonParams.endpoint) { + // Replace subdomain in FINAL_ENDPOINT_URL with commonParams.endpoint + const url = new URL(FINAL_ENDPOINT_URL); + const hostParts = url.hostname.split('.'); + hostParts[0] = commonParams.endpoint; + url.hostname = hostParts.join('.'); + FINAL_ENDPOINT_URL = url.toString(); + } + try { + data = converter.toORTB({ + bidRequests, + bidderRequest + }); + const testBidsRequested = location.hash.includes('rediads-test-bids'); + const stagingEnvRequested = location.hash.includes('rediads-staging'); + if (stagingEnvRequested) { + FINAL_ENDPOINT_URL = STAGING_ENDPOINT_URL; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'site.publisher.id', commonParams.account_id); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'site.content', siteContent); + if (testBidsRequested) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'test', 1); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(`${LOG_PREFIX} test bids are enabled as rediads-test-bids is present in page URL hash.`); + } + + // handle impression/bid level requirements + data.imp.forEach((impression, idx) => { + const bidRequest = bidRequests[idx]; + if (bidRequest?.params?.slot) { + impression.tagid = bidRequest?.params?.slot; + } + }); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${LOG_PREFIX} encountered an error while building bid requests :: ${err}`); + } + return [{ + method: 'POST', + url: FINAL_ENDPOINT_URL, + data + }]; + }, + interpretResponse(response, request) { + let bids = []; + try { + bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`${LOG_PREFIX} encountered an error while processing bid responses :: ${err}`); + } + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('rediadsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rediadsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["redtramBidAdapter"],{ + +/***/ "./modules/redtramBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/redtramBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/precisoUtils/bidUtilsCommon.js */ "./libraries/precisoUtils/bidUtilsCommon.js"); + + + + +const BIDDER_CODE = 'redtram'; +const AD_URL = 'https://prebid.redtram.com/pbjs'; +const SYNC_URL = 'https://prebid.redtram.com/sync'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.buildBidRequests)(AD_URL), + interpretResponse: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + return (0,_libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.buildUserSyncs)(syncOptions, serverResponses, gdprConsent, uspConsent, SYNC_URL); + }, + onBidWon: _libraries_precisoUtils_bidUtilsCommon_js__WEBPACK_IMPORTED_MODULE_1__.bidWinReport +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('redtramBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["precisoUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/redtramBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["relaidoBidAdapter"],{ + +/***/ "./modules/relaidoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/relaidoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var crypto_js_sha1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/sha1 */ "./node_modules/crypto-js/sha1.js"); +/* harmony import */ var crypto_js_sha1__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_sha1__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); + + + + + + + + +const BIDDER_CODE = 'relaido'; +const BIDDER_DOMAIN = 'api.relaido.jp'; +const ADAPTER_VERSION = '1.2.1'; +const DEFAULT_TTL = 300; +const UUID_KEY = 'relaido_uuid'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function isBidRequestValid(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.placementId')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('placementId param is reqeuired.'); + return false; + } + if (hasVideoMediaType(bid) && isVideoValid(bid)) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Invalid mediaType video.'); + } + if (hasBannerMediaType(bid) && isBannerValid(bid)) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('Invalid mediaType banner.'); + } + return false; +} +function buildRequests(validBidRequests, bidderRequest) { + const bids = []; + let imuid = null; + let bidDomain = null; + let bidder = null; + let count = null; + let isOgUrlOption = false; + for (let i = 0; i < validBidRequests.length; i++) { + const bidRequest = validBidRequests[i]; + let mediaType = ''; + let width = 0; + let height = 0; + if (hasVideoMediaType(bidRequest) && isVideoValid(bidRequest)) { + let playerSize = getValidSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.playerSize')); + if (playerSize.length === 0) { + playerSize = getValidSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.video.playerSize')); + } + width = playerSize[0][0]; + height = playerSize[0][1]; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO; + } else if (hasBannerMediaType(bidRequest) && isBannerValid(bidRequest)) { + const sizes = getValidSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner.sizes')); + width = sizes[0][0]; + height = sizes[0][1]; + mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER; + } + if (!imuid) { + const pickImuid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.imuid'); + if (pickImuid) { + imuid = pickImuid; + } + } + if (!bidDomain) { + bidDomain = bidRequest.params.domain; + } + if (!bidder) { + bidder = bidRequest.bidder; + } + if (!bidder) { + bidder = bidRequest.bidder; + } + if (!count) { + count = bidRequest.bidRequestsCount; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter)('ogUrl', bidRequest.params)) { + isOgUrlOption = true; + } + bids.push({ + bid_id: bidRequest.bidId, + placement_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getBidIdParameter)('placementId', bidRequest.params), + transaction_id: bidRequest.ortb2Imp?.ext?.tid, + bidder_request_id: bidRequest.bidderRequestId, + ad_unit_code: bidRequest.adUnitCode, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auction_id: bidRequest.auctionId, + player: bidRequest.params.player, + width: width, + height: height, + banner_sizes: getBannerSizes(bidRequest), + media_type: mediaType, + userIdAsEids: bidRequest.userIdAsEids || [], + pagekvt: getTargeting(bidRequest) + }); + } + const canonicalUrl = getCanonicalUrl(bidderRequest.refererInfo?.canonicalUrl, isOgUrlOption); + const data = JSON.stringify({ + version: ADAPTER_VERSION, + bids: bids, + timeout_ms: bidderRequest.timeout, + bidder: bidder, + bid_requests_count: count, + uuid: getUuid(), + pv: "9.45.0-pre", + imuid: imuid, + canonical_url: canonicalUrl, + canonical_url_hash: getCanonicalUrlHash(canonicalUrl), + ref: bidderRequest.refererInfo.page + }); + return { + method: 'POST', + url: `https://${bidDomain || BIDDER_DOMAIN}/bid/v1/sprebid`, + options: { + withCredentials: true + }, + data: data + }; +} +function interpretResponse(serverResponse, bidRequest) { + const bidResponses = []; + const body = serverResponse.body; + if (!body || body.status != 'ok') { + return []; + } + for (const res of body.ads) { + const playerUrl = res.playerUrl || bidRequest.player || body.playerUrl; + let bidResponse = { + requestId: res.bidId, + placementId: res.placementId, + width: res.width, + height: res.height, + cpm: res.price, + currency: res.currency, + creativeId: res.creativeId, + playerUrl: playerUrl, + dealId: body.dealId || '', + ttl: body.ttl || DEFAULT_TTL, + netRevenue: true, + meta: { + advertiserDomains: res.adomain || [], + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO + } + }; + if (res.vast && res.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO; + bidResponse.vastXml = res.vast; + bidResponse.renderer = newRenderer(res.bidId, playerUrl); + } else if (res.vast && res.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER; + const playerTag = createPlayerTag(playerUrl); + const renderTag = createRenderTag(res.width, res.height, res.vast); + bidResponse.ad = `
${playerTag}${renderTag}
`; + } else if (res.adTag) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER; + bidResponse.ad = decodeURIComponent(res.adTag); + } + bidResponses.push(bidResponse); + } + return bidResponses; +} +function getUserSyncs(syncOptions, serverResponses) { + if (!syncOptions.iframeEnabled) { + return []; + } + let syncUrl = `https://${BIDDER_DOMAIN}/tr/v1/prebid/sync.html`; + if (serverResponses.length > 0) { + syncUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(serverResponses, '0.body.syncUrl') || syncUrl; + } + return [{ + type: 'iframe', + url: `${syncUrl}?uu=${getUuid()}` + }]; +} +function onBidWon(bid) { + let query = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseQueryStringParameters)({ + placement_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.0.placementId'), + creative_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'creativeId'), + price: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'cpm'), + auction_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'auctionId'), + bid_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'requestId'), + ad_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'adId'), + ad_unit_code: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'adUnitCode'), + ref: window.location.href + }).replace(/\&$/, ''); + const bidDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.0.domain') || BIDDER_DOMAIN; + const burl = `https://${bidDomain}/tr/v1/prebid/win.gif?${query}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(burl); +} +function onTimeout(data) { + let query = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseQueryStringParameters)({ + placement_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data, '0.params.0.placementId'), + timeout: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data, '0.timeout'), + auction_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data, '0.auctionId'), + bid_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data, '0.bidId'), + ad_unit_code: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data, '0.adUnitCode'), + version: ADAPTER_VERSION, + ref: window.location.href + }).replace(/\&$/, ''); + const bidDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data, '0.params.0.domain') || BIDDER_DOMAIN; + const timeoutUrl = `https://${bidDomain}/tr/v1/prebid/timeout.gif?${query}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(timeoutUrl); +} +function createPlayerTag(playerUrl) { + return ``; +} +function createRenderTag(width, height, vast) { + return ``; +} +; +function newRenderer(bidId, playerUrl) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bidId, + url: playerUrl, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logWarn)('renderer.setRender Error', err); + } + return renderer; +} +function outstreamRender(bid) { + bid.renderer.push(() => { + window.RelaidoPlayer.renderAd({ + adUnitCode: bid.adUnitCode, + width: bid.width, + height: bid.height, + vastXml: bid.vastXml, + mediaType: bid.mediaType, + placementId: bid.placementId + }); + }); +} +function isBannerValid(bid) { + const sizes = getValidSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes')); + if (sizes.length > 0) { + return true; + } + return false; +} +function isVideoValid(bid) { + let playerSize = getValidSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.playerSize')); + if (playerSize.length === 0) { + playerSize = getValidSizes((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.video.playerSize')); + } + if (playerSize.length > 0) { + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context'); + if (context && context === 'outstream') { + return true; + } + } + return false; +} +function getUuid() { + const id = storage.getCookie(UUID_KEY); + if (id) return id; + const newId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.generateUUID)(); + storage.setCookie(UUID_KEY, newId); + return newId; +} +function getOgUrl() { + try { + const ogURLElement = window.top.document.querySelector('meta[property="og:url"]'); + return ogURLElement ? ogURLElement.content : null; + } catch (e) { + const ogURLElement = document.querySelector('meta[property="og:url"]'); + return ogURLElement ? ogURLElement.content : null; + } +} +function getCanonicalUrl(canonicalUrl, isOgUrlOption) { + if (!canonicalUrl) { + return isOgUrlOption ? getOgUrl() : null; + } + return canonicalUrl; +} +function getCanonicalUrlHash(canonicalUrl) { + return canonicalUrl ? crypto_js_sha1__WEBPACK_IMPORTED_MODULE_0___default()(canonicalUrl).toString() : null; +} +function hasBannerMediaType(bid) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner'); +} +function hasVideoMediaType(bid) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); +} +function getValidSizes(sizes) { + let result = []; + if (sizes && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(sizes) && sizes.length > 0) { + for (let i = 0; i < sizes.length; i++) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(sizes[i]) && sizes[i].length == 2) { + const width = sizes[i][0]; + const height = sizes[i][1]; + if (width == 1 && height == 1) { + return [[1, 1]]; + } + if (width >= 300 && height >= 250) { + result.push([width, height]); + } + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(sizes[i])) { + const width = sizes[0]; + const height = sizes[1]; + if (width == 1 && height == 1) { + return [[1, 1]]; + } + if (width >= 300 && height >= 250) { + return [[width, height]]; + } + } + } + } + return result; +} +function getBannerSizes(bidRequest) { + if (!hasBannerMediaType(bidRequest)) { + return null; + } + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner.sizes'); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(sizes)) { + return null; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseSizesInput)(sizes).join(','); +} +function getTargeting(bidRequest) { + const targetings = {}; + const pubads = getPubads(); + if (pubads) { + const keys = pubads.getTargetingKeys(); + for (const key of keys) { + const values = pubads.getTargeting(key); + targetings[key] = values; + } + } + const adUnitSlot = getAdUnit(bidRequest.adUnitCode); + if (adUnitSlot) { + const keys = adUnitSlot.getTargetingKeys(); + for (const key of keys) { + const values = adUnitSlot.getTargeting(key); + targetings[key] = values; + } + } + return targetings; +} +function getPubads() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isGptPubadsDefined)() ? window.googletag.pubads() : null; +} +function getAdUnit(adUnitCode) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isGptPubadsDefined)()) { + const adSlots = window.googletag.pubads().getSlots(); + const isMatchingAdSlot = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_6__.isSlotMatchingAdUnitCode)(adUnitCode); + for (let i = 0; i < adSlots.length; i++) { + if (isMatchingAdSlot(adSlots[i])) { + return adSlots[i]; + } + } + } + return null; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs: getUserSyncs, + onBidWon, + onTimeout +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('relaidoBidAdapter'); + +/***/ }), + +/***/ "./node_modules/crypto-js/core.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/core.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(); + } + else {} +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.crypto) { + crypto = __webpack_require__.g.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && "function" === 'function') { + try { + crypto = __webpack_require__(/*! crypto */ "?9157"); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); + +/***/ }), + +/***/ "./node_modules/crypto-js/sha1.js": +/*!****************************************!*\ + !*** ./node_modules/crypto-js/sha1.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +;(function (root, factory) { + if (true) { + // CommonJS + module.exports = exports = factory(__webpack_require__(/*! ./core */ "./node_modules/crypto-js/core.js")); + } + else {} +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + return CryptoJS.SHA1; + +})); + +/***/ }), + +/***/ "?9157": +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/***/ (() => { + +/* (ignored) */ + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/relaidoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["relayBidAdapter"],{ + +/***/ "./modules/relayBidAdapter.js": +/*!************************************!*\ + !*** ./modules/relayBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +const BIDDER_CODE = 'relay'; +const METHOD = 'POST'; +const ENDPOINT_URL = 'https://e.relay.bid/p/openrtb2'; + +// The default impl from the prebid docs. +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + } +}); +function buildRequests(bidRequests, bidderRequest) { + const prebidVersion = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('prebid_version') || 'v8.1.0'; + // Group bids by accountId param + const groupedByAccountId = bidRequests.reduce((accu, item) => { + const accountId = ((item || {}).params || {}).accountId; + if (!accu[accountId]) { + accu[accountId] = []; + } + ; + accu[accountId].push(item); + return accu; + }, {}); + // Send one overall request with all grouped bids per accountId + let reqs = []; + for (const [accountId, accountBidRequests] of Object.entries(groupedByAccountId)) { + const url = `${ENDPOINT_URL}?a=${accountId}&pb=1&pbv=${prebidVersion}`; + const data = CONVERTER.toORTB({ + bidRequests: accountBidRequests, + bidderRequest + }); + const req = { + method: METHOD, + url, + data + }; + reqs.push(req); + } + return reqs; +} +; +function interpretResponse(response, request) { + return CONVERTER.fromORTB({ + response: response.body, + request: request.data + }).bids; +} +; +function isBidRequestValid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)((bid.params || {}).accountId); +} +; +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + let syncs = []; + for (const response of serverResponses) { + const responseSyncs = (((response || {}).body || {}).ext || {}).user_syncs || []; + // Relay returns user_syncs in the format expected by prebid. If for any + // reason the request/response failed to properly capture the GDPR settings + // -- fallback to those identified by Prebid. + for (const sync of responseSyncs) { + const syncUrl = new URL(sync.url); + const missingGdpr = !syncUrl.searchParams.has('gdpr'); + const missingGdprConsent = !syncUrl.searchParams.has('gdpr_consent'); + if (missingGdpr) { + syncUrl.searchParams.set('gdpr', Number(gdprConsent.gdprApplies)); + sync.url = syncUrl.toString(); + } + if (missingGdprConsent) { + syncUrl.searchParams.set('gdpr_consent', gdprConsent.consentString); + sync.url = syncUrl.toString(); + } + if (syncOptions.iframeEnabled && sync.type === 'iframe') { + syncs.push(sync); + } else if (syncOptions.pixelEnabled && sync.type === 'image') { + syncs.push(sync); + } + } + } + return syncs; +} +const spec = { + code: BIDDER_CODE, + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + onTimeout: function (timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Timeout: ', timeoutData); + }, + onBidWon: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Bid won: ', bid); + }, + onBidderError: function (_ref) { + let { + error, + bidderRequest + } = _ref; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Error: ', error, bidderRequest); + }, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('relayBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/relayBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["relevadRtdProvider"],{ + +/***/ "./modules/relevadRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/relevadRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports serverData, getBidRequestData, setGlobalOrtb2, addRtdData, init, relevadSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + +/** + * This module adds Relevad provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch categories and segments from Relevad server and pass them to the bidders + * @module modules/relevadRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'RelevadRTDModule'; +const SEGTAX_IAB = 6; // IAB Content Taxonomy v2 +const CATTAX_IAB = 6; // IAB Contextual Taxonomy v2.2 +const RELEVAD_API_DOMAIN = 'https://prebid.relestar.com'; +const entries = Object.entries; +const AJAX_OPTIONS = { + withCredentials: true, + referrerPolicy: 'unsafe-url', + crossOrigin: true +}; +let serverData = {}; // Tracks data returned from Relevad RTD server + +/** + * Provides contextual IAB categories and segments to the bidders. + * + * @param {Object} reqBidsConfigObj Bids request configuration + * @param {Function} onDone Ajax callback + * @param {Object} moduleConfig Rtd module configuration + * @param {Object} userConsent user GDPR consent + */ +function getBidRequestData(reqBidsConfigObj, onDone, moduleConfig, userConsent) { + moduleConfig.params = moduleConfig.params || {}; + moduleConfig.params.partnerid = moduleConfig.params.partnerid ? moduleConfig.params.partnerid : 1; + let adunitInfo = reqBidsConfigObj.adUnits.map(adunit => { + return [adunit.code, adunit.bids.map(bid => { + return [bid.bidder, bid.params]; + })]; + }); + serverData.page = moduleConfig.params.actualUrl || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().page || ''; + const url = RELEVAD_API_DOMAIN + '/apis/rweb2/' + '?url=' + encodeURIComponent(serverData.page) + '&au=' + encodeURIComponent(JSON.stringify(adunitInfo)) + '&pid=' + encodeURIComponent(moduleConfig.params?.publisherid || '') + '&aid=' + encodeURIComponent(moduleConfig.params?.apikey || '') + '&cid=' + encodeURIComponent(moduleConfig.params?.partnerid || '') + '&gdpra=' + encodeURIComponent(userConsent?.gdpr?.gdprApplies || '') + '&gdprc=' + encodeURIComponent(userConsent?.gdpr?.consentString || ''); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, { + success: function (response, req) { + if (req.status === 200) { + try { + const data = JSON.parse(response); + serverData.rawdata = data; + if (data) { + addRtdData(reqBidsConfigObj, data, moduleConfig); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(SUBMODULE_NAME, 'unable to parse data: ' + e); + } + onDone(); + } + }, + error: function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(SUBMODULE_NAME, 'unable to receive data'); + onDone(); + } + }, null, { + method: 'GET', + ...AJAX_OPTIONS + }); +} + +/** + * Sets global ORTB user and site data + * + * @param {Object} ortb2 The global ORTB structure + * @param {Object} rtdData Rtd segments and categories + */ +function setGlobalOrtb2(ortb2, rtdData) { + try { + let addOrtb2 = composeOrtb2Data(rtdData, 'site'); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(addOrtb2) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(ortb2, addOrtb2); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } +} + +/** + * Compose ORTB2 data fragment from RTD data + * + * @param {Object} rtdData RTD segments and categories + * @param {string} prefix Site path prefix + * @return {Object} ORTB2 fragment ready to be merged into global or bidder ORTB + */ +function composeOrtb2Data(rtdData, prefix) { + const segments = rtdData.segments; + const categories = rtdData.categories; + const content = rtdData.content; + let addOrtb2 = {}; + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(segments) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, 'user.ext.data.relevad_rtd', segments); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(categories.cat) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, prefix + '.cat', categories.cat); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(categories.pagecat) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, prefix + '.pagecat', categories.pagecat); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(categories.sectioncat) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, prefix + '.sectioncat', categories.sectioncat); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(categories.sectioncat) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, prefix + '.ext.data.relevad_rtd', categories.sectioncat); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(categories.cattax) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, prefix + '.cattax', categories.cattax); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(content) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(content.segs) && content.segtax) { + const contentSegments = { + name: 'relevad', + ext: { + segtax: content.segtax + }, + segment: content.segs.map(x => { + return { + id: x + }; + }) + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, prefix + '.content.data', [contentSegments]); + } + return addOrtb2; +} + +/** + * Sets ORTB user and site data for a given bidder + * + * @param {Object} bidderOrtbFragment The bidder ORTB fragment + * @param {Object} bidder The bidder name + * @param {Object} rtdData RTD categories and segments + */ +function setBidderSiteAndContent(bidderOrtbFragment, bidder, rtdData) { + try { + let addOrtb2 = composeOrtb2Data(rtdData, 'site'); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(rtdData.segments) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, 'user.ext.data.relevad_rtd', rtdData.segments); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(rtdData.segments) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, 'user.ext.data.segments', rtdData.segments); + !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(rtdData.categories) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(addOrtb2, 'user.ext.data.contextual_categories', rtdData.categories.pagecat); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(addOrtb2)) { + return; + } + bidderOrtbFragment[bidder] = bidderOrtbFragment[bidder] || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(bidderOrtbFragment[bidder], addOrtb2); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } +} + +/** + * Filters dictionary entries + * + * @param {Object} dict A dictionary with numeric values + * @param {string} minscore The minimum value + * @return {Array} Array of category names with scores greater or equal to minscore + */ +function filterByScore(dict, minscore) { + if (dict && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(dict)) { + minscore = minscore && typeof minscore == 'number' ? minscore : 30; + try { + const filteredCategories = Object.keys(Object.fromEntries(Object.entries(dict).filter(_ref => { + let [k, v] = _ref; + return v > minscore; + }))); + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(filteredCategories) ? null : filteredCategories; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } + } + return null; +} + +/** + * Filters RTD by relevancy score + * + * @param {object} data The Input RTD + * @param {string} minscore The minimum relevancy score + * @return {object} Filtered RTD + */ +function getFiltered(data, minscore) { + let relevadData = { + 'segments': [] + }; + minscore = minscore && typeof minscore == 'number' ? minscore : 30; + const cats = filterByScore(data.cats, minscore); + const pcats = filterByScore(data.pcats, minscore) || cats; + const scats = filterByScore(data.scats, minscore) || pcats; + const cattax = data.cattax || data.cattax === undefined ? data.cattax : CATTAX_IAB; + relevadData.categories = { + cat: cats, + pagecat: pcats, + sectioncat: scats, + cattax: cattax + }; + const contsegs = filterByScore(data.contsegs, minscore); + const segtax = data.segtax ? data.segtax : SEGTAX_IAB; + relevadData.content = { + segs: contsegs, + segtax: segtax + }; + try { + if (data && data.segments) { + for (let segId in data.segments) { + if (data.segments.hasOwnProperty(segId)) { + relevadData.segments.push(data.segments[segId].toString()); + } + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } + return relevadData; +} + +/** + * Adds Rtd data to global ORTB structure and bidder requests + * + * @param {Object} reqBids The bid requests list + * @param {Object} data The Rtd data + * @param {Object} moduleConfig The Rtd module configuration + */ +function addRtdData(reqBids, data, moduleConfig) { + moduleConfig = moduleConfig || {}; + moduleConfig.params = moduleConfig.params || {}; + const globalMinScore = moduleConfig.params.hasOwnProperty('minscore') ? moduleConfig.params.minscore : 30; + const relevadData = getFiltered(data, globalMinScore); + const relevadList = relevadData.segments.concat(relevadData.categories.pagecat); + // Publisher side bidder whitelist + const biddersParamsExist = !!moduleConfig?.params?.bidders; + // RTD Server-side bidder whitelist + const wl = data.wl || null; + const noWhitelists = !biddersParamsExist && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(wl); + + // Add RTD data to the global ORTB fragments when no whitelists present + noWhitelists && setGlobalOrtb2(reqBids.ortb2Fragments?.global, relevadData); + + // Target GAM/GPT + let setgpt = moduleConfig.params.setgpt || !moduleConfig.params.hasOwnProperty('setgpt'); + if (moduleConfig.dryrun || typeof window.googletag !== 'undefined' && setgpt) { + try { + if (window.googletag && window.googletag.pubads && typeof window.googletag.pubads === 'function') { + window.googletag.pubads().getSlots().forEach(function (n) { + if (typeof n.setTargeting !== 'undefined' && relevadList && relevadList.length > 0) { + n.setTargeting('relevad_rtd', relevadList); + } + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } + } + + // Set per-bidder RTD + const adUnits = reqBids.adUnits; + adUnits.forEach(adUnit => { + noWhitelists && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(adUnit, 'ortb2Imp.ext.data.relevad_rtd', relevadList); + adUnit.hasOwnProperty('bids') && adUnit.bids.forEach(bid => { + let bidderIndex = moduleConfig.params.hasOwnProperty('bidders') ? (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.findIndex)(moduleConfig.params.bidders, function (i) { + return i.bidder === bid.bidder; + }) : false; + const indexFound = !!(typeof bidderIndex == 'number' && bidderIndex >= 0); + try { + if (!biddersParamsExist || indexFound && (!moduleConfig.params.bidders[bidderIndex].hasOwnProperty('adUnitCodes') || moduleConfig.params.bidders[bidderIndex].adUnitCodes.indexOf(adUnit.code) !== -1)) { + let wb = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(wl) || wl[bid.bidder] === true; + if (!wb && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(wl[bid.bidder])) { + wb = true; + for (const [key, value] of entries(wl[bid.bidder])) { + let params = bid?.params || {}; + wb = wb && key in params && params[key] == value; + } + } + if (wb && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(relevadList)) { + setBidderSiteAndContent(reqBids.ortb2Fragments?.bidder, bid.bidder, relevadData); + setBidderSiteAndContent(bid, 'ortb2', relevadData); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'params.keywords.relevad_rtd', relevadList); + !(bid.params?.target || '').includes('relevad_rtd=') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bid, 'params.target', [].concat(bid.params?.target ? [bid.params.target] : []).concat(relevadList.map(entry => { + return 'relevad_rtd=' + entry; + })).join(';')); + let firstPartyData = {}; + firstPartyData[bid.bidder] = { + firstPartyData: { + relevad_rtd: relevadList + } + }; + _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.setConfig(firstPartyData); + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(e); + } + }); + }); + serverData = { + ...serverData, + ...relevadData + }; + return adUnits; +} + +/** + * Sends bid info to the RTD server + * + * @param {JSON} data Bids information + * @param {object} config Configuraion + */ +function sendBids(data, config) { + let dataJson = JSON.stringify(data); + if (!config.dryrun) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(RELEVAD_API_DOMAIN + '/apis/bids/', () => {}, dataJson, AJAX_OPTIONS); + } + serverData = { + clientdata: data + }; +} +; + +/** + * Processes AUCTION_END event + * + * @param {object} auctionDetails Auction details + * @param {object} config Module configuration + * @param {object} userConsent User GDPR consent object + */ +function onAuctionEnd(auctionDetails, config, userConsent) { + let adunitObj = {}; + let adunits = []; + + // Add Bids Received + auctionDetails.bidsReceived.forEach(bidObj => { + if (!adunitObj[bidObj.adUnitCode]) { + adunitObj[bidObj.adUnitCode] = []; + } + adunitObj[bidObj.adUnitCode].push({ + bidder: bidObj.bidderCode || bidObj.bidder, + cpm: bidObj.cpm, + currency: bidObj.currency, + dealId: bidObj.dealId, + type: bidObj.mediaType, + ttr: bidObj.timeToRespond, + size: bidObj.size + }); + }); + entries(adunitObj).forEach(_ref2 => { + let [adunitCode, bidsReceived] = _ref2; + adunits.push({ + code: adunitCode, + bids: bidsReceived + }); + }); + let data = { + event: 'bids', + adunits: adunits, + reledata: serverData.rawdata, + pid: encodeURIComponent(config.params?.publisherid || ''), + aid: encodeURIComponent(config.params?.apikey || ''), + cid: encodeURIComponent(config.params?.partnerid || ''), + gdpra: encodeURIComponent(userConsent?.gdpr?.gdprApplies || ''), + gdprc: encodeURIComponent(userConsent?.gdpr?.consentString || '') + }; + if (!config.dryrun) { + data.page = serverData?.page || config?.params?.actualUrl || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().page || ''; + } + sendBids(data, config); +} +function init(config) { + return true; +} +const relevadSubmodule = { + name: SUBMODULE_NAME, + init: init, + onAuctionEndEvent: onAuctionEnd, + getBidRequestData: getBidRequestData +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_6__.submodule)(MODULE_NAME, relevadSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('relevadRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/relevadRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["relevantAnalyticsAdapter"],{ + +/***/ "./modules/relevantAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/relevantAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + +const relevantAnalytics = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + analyticsType: 'bundle', + handler: 'on' +}); +const { + enableAnalytics: orgEnableAnalytics +} = relevantAnalytics; +Object.assign(relevantAnalytics, { + /** + * Save event in the global array that will be consumed later by the Relevant Yield library + */ + track: _ref => { + let { + eventType: ev, + args + } = _ref; + window.relevantDigital.pbEventLog.push({ + ev, + args, + ts: new Date() + }); + }, + /** + * Before forwarding the call to the original enableAnalytics function - + * create (if needed) the global array that is used to pass events to the Relevant Yield library + * by the 'track' function above. + */ + enableAnalytics: function () { + window.relevantDigital = window.relevantDigital || {}; + window.relevantDigital.pbEventLog = window.relevantDigital.pbEventLog || []; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return orgEnableAnalytics.call(this, ...args); + } +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].registerAnalyticsAdapter({ + adapter: relevantAnalytics, + code: 'relevant' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (relevantAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('relevantAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/relevantAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["relevantdigitalBidAdapter"],{ + +/***/ "./modules/relevantdigitalBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/relevantdigitalBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports resetBidderConfigs, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/pbsExtensions/pbsExtensions.js */ "./libraries/pbsExtensions/pbsExtensions.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + + +const BIDDER_CODE = 'relevantdigital'; + +/** Global settings per bidder-code for this adapter (which might be > 1 if using aliasing) */ +let configByBidder = {}; + +/** Used by the tests */ +const resetBidderConfigs = () => { + configByBidder = {}; +}; + +/** Settings ber bidder-code. checkParams === true means that it can optionally be set in bid-params */ +const FIELDS = [{ + name: 'pbsHost', + checkParams: true, + required: true +}, { + name: 'accountId', + checkParams: true, + required: true +}, { + name: 'pbsBufferMs', + checkParams: false, + required: false, + default: 250 +}, { + name: 'useSourceBidderCode', + checkParams: false, + required: false, + default: false +}]; +const SYNC_HTML = 'https://cdn.relevant-digital.com/resources/load-cookie.html'; +const MAX_SYNC_COUNT = 10; // Max server-side bidder to sync at once via the iframe + +/** Get settings for a bidder-code via config and, if needed, bid parameters */ +const getBidderConfig = bids => { + const { + bidder + } = bids[0]; + const cfg = configByBidder[bidder] || { + ...Object.fromEntries(FIELDS.filter(f => 'default' in f).map(f => [f.name, f.default])), + syncedBidders: {} // To keep track of S2S-bidders we already (started to) synced + }; + if (cfg.complete) { + return cfg; // Most common case, we already have the settings we need (and we won't re-read them) + } + configByBidder[bidder] = cfg; + const bidderConfiguration = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig(bidder) || {}; + + // Read settings set by setConfig({ [bidder]: { ... }}) and if not available - from bid params + FIELDS.forEach(_ref => { + let { + name, + checkParams + } = _ref; + cfg[name] = bidderConfiguration[name] || cfg[name]; + if (!cfg[name] && checkParams) { + bids.forEach(bid => { + cfg[name] = cfg[name] || bid.params?.[name]; + }); + } + }); + cfg.complete = FIELDS.every(field => !field.required || cfg[field.name]); + if (cfg.complete) { + cfg.pbsHost = cfg.pbsHost.trim().replace('http://', 'https://'); + if (cfg.pbsHost.indexOf('https://') < 0) { + cfg.pbsHost = `https://${cfg.pbsHost}`; + } + } + return cfg; +}; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300 + }, + processors: _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_2__.pbsExtensions, + imp(buildImp, bidRequest, context) { + // Set stored request id from placementId + const imp = buildImp(bidRequest, context); + const { + placementId + } = bidRequest.params; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext.prebid.storedrequest.id', placementId); + delete imp.ext.prebid.bidder; + return imp; + }, + overrides: { + bidResponse: { + bidderCode(orig, bidResponse, bid, _ref2) { + let { + bidRequest + } = _ref2; + const { + bidder, + params = {} + } = bidRequest || {}; + let useSourceBidderCode = configByBidder[bidder]?.useSourceBidderCode; + if ('useSourceBidderCode' in params) { + useSourceBidderCode = params.useSourceBidderCode; + } + // Only use the orignal function when useSourceBidderCode is true, else our own bidder code will be used + if (useSourceBidderCode) { + orig.apply(this, [...arguments].slice(1)); + } + } + } + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: 1100, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE], + /** We need both params.placementId + a complete configuration (pbsHost + accountId) to continue */ + isBidRequestValid: bid => bid.params?.placementId && getBidderConfig([bid]).complete, + /** Trigger impression-pixel */ + onBidWon(bid) { + if (bid.pbsWurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(bid.pbsWurl); + } + if (bid.burl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(bid.burl); + } + }, + /** Build BidRequest for PBS */ + buildRequests(bidRequests, bidderRequest) { + const { + bidder + } = bidRequests[0]; + const cfg = getBidderConfig(bidRequests); + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + + /** Set tmax, in general this will be timeout - pbsBufferMs */ + const pbjsTimeout = bidderRequest.timeout || 1000; + data.tmax = Math.min(Math.max(pbjsTimeout - cfg.pbsBufferMs, cfg.pbsBufferMs), pbjsTimeout); + delete data.ext?.prebid?.aliases; // We don't need/want to send aliases to PBS + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'ext.relevant', { + ...data.ext?.relevant, + adapter: true // For internal analytics + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'ext.prebid.storedrequest.id', cfg.accountId); + data.ext.prebid.passthrough = { + ...data.ext.prebid.passthrough, + relevant: { + bidder + } // to find config for the right bidder-code in interpretResponse / getUserSyncs + }; + return [{ + method: 'POST', + url: `${cfg.pbsHost}/openrtb2/auction`, + data + }]; + }, + /** Read BidResponse from PBS and make necessary adjustments to not make it appear to come from unknown bidders */ + interpretResponse(response, request) { + const resp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.deepClone)(response.body); + const { + bidder + } = request.data.ext.prebid.passthrough.relevant; + + // Modify response times / errors for actual PBS bidders into a single value + const MODIFIERS = { + responsetimemillis: values => Math.max(...values), + errors: values => [].concat(...values) + }; + Object.entries(MODIFIERS).forEach(_ref3 => { + let [field, combineFn] = _ref3; + const obj = resp.ext?.[field]; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(obj)) { + resp.ext[field] = { + [bidder]: combineFn(Object.values(obj)) + }; + } + }); + const bids = converter.fromORTB({ + response: resp, + request: request.data + }).bids; + return bids; + }, + /** Do syncing, but avoid running the sync > 1 time for S2S bidders */ + getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return []; + } + const syncs = []; + serverResponses.forEach(_ref4 => { + let { + body + } = _ref4; + const { + pbsHost, + syncedBidders + } = configByBidder[body.ext.prebid.passthrough.relevant.bidder] || {}; + if (!pbsHost) { + return; + } + const { + gdprApplies, + consentString + } = gdprConsent || {}; + let bidders = Object.keys(body.ext?.responsetimemillis || {}); + bidders = bidders.reduce((acc, curr) => { + if (!syncedBidders[curr]) { + acc.push(curr); + syncedBidders[curr] = true; + } + return acc; + }, []); + bidders = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.shuffle)(bidders).slice(0, MAX_SYNC_COUNT); // Shuffle to not always leave out the same bidders + if (!bidders.length) { + return; // All bidders already synced + } + if (syncOptions.iframeEnabled) { + const params = { + endpoint: `${pbsHost}/cookie_sync`, + max_sync_count: bidders.length, + gdpr: gdprApplies ? 1 : 0, + gdpr_consent: consentString, + us_privacy: uspConsent, + bidders: bidders.join(',') + }; + const qs = Object.entries(params).filter(_ref5 => { + let [k, v] = _ref5; + return ![null, undefined, ''].includes(v); + }).map(_ref6 => { + let [k, v] = _ref6; + return `${k}=${encodeURIComponent(v.toString())}`; + }).join('&'); + syncs.push({ + type: 'iframe', + url: `${SYNC_HTML}?${qs}` + }); + } else { + // Else, try to pixel-sync (for future-compatibility) + const pixels = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(body, `ext.relevant.sync`, []).filter(_ref7 => { + let { + type + } = _ref7; + return type === 'redirect'; + }); + syncs.push(...pixels.map(_ref8 => { + let { + url + } = _ref8; + return { + type: 'image', + url + }; + })); + } + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('relevantdigitalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","pbsExtensions","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/relevantdigitalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["relevatehealthBidAdapter"],{ + +/***/ "./modules/relevatehealthBidAdapter.js": +/*!*********************************************!*\ + !*** ./modules/relevatehealthBidAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/deepintentUtils/index.js */ "./libraries/deepintentUtils/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const BIDDER_CODE = 'relevatehealth'; +const ENDPOINT_URL = 'https://rtb.relevate.health/prebid/relevate'; +function buildRequests(bidRequests, bidderRequest) { + const requests = []; + // Loop through each bid request + bidRequests.forEach(bid => { + // Construct the bid request object + const request = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(), + placementId: bid.params.placement_id, + imp: [{ + id: bid.bidId, + banner: getBanner(bid), + bidfloor: getFloor(bid) + }], + site: getSite(bidderRequest), + user: buildUser(bid) + }; + // Get uspConsent from bidderRequest + if (bidderRequest && bidderRequest.uspConsent) { + request.us_privacy = bidderRequest.uspConsent; + } + // Get GPP Consent from bidderRequest + if (bidderRequest?.gppConsent?.gppString) { + request.gpp = bidderRequest.gppConsent.gppString; + request.gpp_sid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest?.ortb2?.regs?.gpp) { + request.gpp = bidderRequest.ortb2.regs.gpp; + request.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + // Get coppa compliance from bidderRequest + if (bidderRequest?.ortb2?.regs?.coppa) { + request.coppa = 1; + } + // Push the constructed bid request to the requests array + requests.push(request); + }); + // Return the array of bid requests + return { + method: 'POST', + url: ENDPOINT_URL, + data: JSON.stringify(requests), + options: { + contentType: 'application/json' + } + }; +} +// Format the response as per the standards +function interpretResponse(bidResponse, bidRequest) { + let resp = []; + if (bidResponse && bidResponse.body) { + try { + let bids = bidResponse.body.seatbid && bidResponse.body.seatbid[0] ? bidResponse.body.seatbid[0].bid : []; + if (bids) { + bids.forEach(bidObj => { + let newBid = (0,_libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.formatResponse)(bidObj); + newBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + resp.push(newBid); + }); + } + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(err); + } + } + return resp; +} +// Function to check if Bid is valid +function isBidRequestValid(bid) { + return !!(bid.params.placement_id && bid.params.user_id); +} +// Function to get banner details +function getBanner(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner')) { + // Fetch width and height from MediaTypes object, if not provided in bid params + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.sizes') && !bid.params.height && !bid.params.width) { + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.sizes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(sizes) && sizes.length > 0) { + return { + h: sizes[0][1], + w: sizes[0][0] + }; + } + } else { + return { + h: bid.params.height, + w: bid.params.width + }; + } + } +} +// Function to get bid_floor +function getFloor(bid) { + if (bid.params && bid.params.bid_floor) { + return bid.params.bid_floor; + } else { + return 0; + } +} +// Function to get site details +function getSite(bidderRequest) { + let site = {}; + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + site.name = bidderRequest.refererInfo.domain; + } else { + site.name = ''; + } + return site; +} +// Function to build the user object +function buildUser(bid) { + if (bid && bid.params) { + return { + id: bid.params.user_id && typeof bid.params.user_id == 'string' ? bid.params.user_id : '', + // TODO: commented out because of rule violations + buyeruid: '', + // localStorage.getItem('adx_profile_guid') ? localStorage.getItem('adx_profile_guid') : '', + keywords: bid.params.keywords && typeof bid.params.keywords == 'string' ? bid.params.keywords : '', + customdata: bid.params.customdata && typeof bid.params.customdata == 'string' ? bid.params.customdata : '' + }; + } +} +// Export const spec +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + isBidRequestValid, + buildRequests, + interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('relevatehealthBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["deepintentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/relevatehealthBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["resetdigitalBidAdapter"],{ + +/***/ "./modules/resetdigitalBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/resetdigitalBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_getOrigin_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/getOrigin/index.js */ "./libraries/getOrigin/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +const BIDDER_CODE = 'resetdigital'; +const CURRENCY = 'USD'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: ['banner', 'video'], + isBidRequestValid: function (bid) { + return !!(bid.params.pubId || bid.params.zoneId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + let stack = bidderRequest.refererInfo && bidderRequest.refererInfo.stack ? bidderRequest.refererInfo.stack : []; + let spb = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('userSync') && _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('userSync').syncsPerBidder ? _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('userSync').syncsPerBidder : 5; + const payload = { + start_time: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.timestamp)(), + language: window.navigator.userLanguage || window.navigator.language, + site: { + domain: (0,_libraries_getOrigin_index_js__WEBPACK_IMPORTED_MODULE_2__.getOrigin)(), + iframe: !bidderRequest.refererInfo.reachedTop, + // TODO: the last element in refererInfo.stack is window.location.href, that's unlikely to have been the intent here + url: stack && stack.length > 0 ? [stack.length - 1] : null, + https: window.location.protocol === 'https:', + // TODO: is 'page' the right value here? + referrer: bidderRequest.refererInfo.page + }, + imps: [], + user_ids: validBidRequests[0].userId, + sync_limit: spb + }; + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdpr = { + applies: bidderRequest.gdprConsent.gdprApplies, + consent: bidderRequest.gdprConsent.consentString + }; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.ccpa = bidderRequest.uspConsent; + } + function getOrtb2Keywords(ortb2Obj) { + const fields = ['site.keywords', 'site.content.keywords', 'user.keywords', 'app.keywords', 'app.content.keywords']; + let result = []; + fields.forEach(path => { + let keyStr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortb2Obj, path); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(keyStr)) result.push(keyStr); + }); + return result; + } + + // get the ortb2 keywords data (if it exists) + let ortb2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(bidderRequest && bidderRequest.ortb2); + let ortb2KeywordsList = getOrtb2Keywords(ortb2); + // get meta keywords data (if it exists) + let metaKeywords = document.getElementsByTagName('meta')['keywords']; + if (metaKeywords && metaKeywords.content) { + metaKeywords = metaKeywords.content.split(','); + } + for (let x = 0; x < validBidRequests.length; x++) { + let req = validBidRequests[x]; + let bidFloor = req.params.bidFloor ? req.params.bidFloor : null; + let bidFloorCur = req.params.bidFloor ? req.params.bidFloorCur : null; + if (typeof req.getFloor === 'function') { + const floorInfo = req.getFloor({ + currency: CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === CURRENCY && !isNaN(parseFloat(floorInfo.floor))) { + bidFloor = parseFloat(floorInfo.floor); + bidFloorCur = CURRENCY; + } + } + + // get param keywords (if it exists) + let paramsKeywords = req.params.keywords; + if (typeof req.params.keywords === 'string') { + paramsKeywords = req.params.keywords.split(','); + } else if (Array.isArray(req.params.keywords)) { + paramsKeywords = req.params.keywords; + } else { + paramsKeywords = []; + } + // merge all keywords + let keywords = ortb2KeywordsList.concat(paramsKeywords).concat(metaKeywords); + payload.imps.push({ + pub_id: req.params.pubId, + site_id: req.params.siteID ? req.params.siteID : null, + placement_id: req.params.placement ? req.params.placement : null, + position: req.params.position ? req.params.position : null, + bid_floor: bidFloor, + bid_floor_cur: bidFloorCur, + lat_long: req.params.latLong ? req.params.latLong : null, + inventory: req.params.inventory ? req.params.inventory : null, + visitor: req.params.visitor ? req.params.visitor : null, + keywords: keywords.join(','), + zone_id: req.params.zoneId, + bid_id: req.bidId, + // TODO: fix transactionId leak: https://github.com/prebid/Prebid.js/issues/9781 + imp_id: req.transactionId, + sizes: req.sizes, + force_bid: req.params.forceBid, + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('coppa') === true ? 1 : 0, + media_types: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(req, 'mediaTypes') + }); + } + let params = validBidRequests[0].params; + let url = params.endpoint ? params.endpoint : '//ads.resetsrv.com'; + return { + method: 'POST', + url: url, + data: JSON.stringify(payload), + bids: validBidRequests + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + if (!serverResponse || !serverResponse.body) { + return bidResponses; + } + let res = serverResponse.body; + if (!res.bids || !res.bids.length) { + return []; + } + for (let x = 0; x < serverResponse.body.bids.length; x++) { + let bid = serverResponse.body.bids[x]; + bidResponses.push({ + requestId: bid.bid_id, + cpm: bid.cpm, + width: bid.w, + height: bid.h, + ad: bid.html, + vastUrl: bid.vast_url, + vastXml: bid.vast_xml, + mediaType: bid.html ? 'banner' : 'video', + ttl: 120, + creativeId: bid.crid, + dealId: bid.deal_id, + netRevenue: true, + currency: 'USD', + meta: { + advertiserDomains: bid.adomain + } + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { + let syncs = []; + if (!serverResponses.length || !serverResponses[0].body) { + return syncs; + } + let gdprParams = ''; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdprParams = `gdpr_consent=${gdprConsent.consentString}`; + } + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `https://async.resetdigital.co/async_usersync.html?${gdprParams}` + }); + } else if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `https://meta.resetdigital.co/pchain${gdprParams ? `?${gdprParams}` : ''}` + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('resetdigitalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["getOrigin","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/resetdigitalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["responsiveAdsBidAdapter"],{ + +/***/ "./modules/responsiveAdsBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/responsiveAdsBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +const BIDDER_VERSION = '1.0'; +const BIDDER_CODE = 'responsiveads'; +const ENDPOINT_URL = 'https://ve60c4xzl9.execute-api.us-east-1.amazonaws.com/prod/prebidjs'; +const DEFAULT_CURRENCY = 'USD'; +const GVLID = 1189; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, + netRevenue: true, + ttl: 300, + currency: DEFAULT_CURRENCY + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + // add additional information we might need on the backend + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(req, { + ext: { + prebid: { + adapterVersion: `${BIDDER_VERSION}` + } + } + }); + return req; + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + isBidRequestValid: function (bid) { + // validate the bid request + return !!bid.params; + }, + buildRequests: function (bidRequests, bidderRequest) { + // we only want to bid if we are not in a safeframe + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isSafeFrameWindow)()) { + return null; + } + + // if we can't access top we don't want to bid + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.canAccessWindowTop)()) { + return null; + } + const data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: 'POST', + url: ENDPOINT_URL, + data: data, + options: { + contentType: 'application/json', + withCredentials: false + }, + bidderRequest + }; + }, + interpretResponse: function (response, request) { + const res = converter.fromORTB({ + response: response.body, + request: request.data + }); + const bids = res.bids; + return bids; + }, + onBidWon: bid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('onBidWon', bid); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('responsiveAdsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/responsiveAdsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["retailspotBidAdapter"],{ + +/***/ "./modules/retailspotBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/retailspotBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'retailspot'; +const GVL_ID = 1319; +const DEFAULT_SUBDOMAIN = 'hbapi'; +const PREPROD_SUBDOMAIN = 'hbapi-preprod'; +const HOST = 'retailspotads.com'; +const ENDPOINT = '/'; +const DEV_URL = 'http://localhost:3030/'; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + aliases: ['rs'], + // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + const sizes = getSize(bid); + const sizeValid = sizes.width > 0 && sizes.height > 0; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'params.placement') && sizeValid; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest} bidRequests is an array of AdUnits and bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const payload = bidderRequest; + payload.rs_pbjs_version = "9.45.0-pre"; + const data = JSON.stringify(payload); + const options = { + withCredentials: true + }; + const envParam = bidRequests[0].params.env; + var subDomain = DEFAULT_SUBDOMAIN; + if (envParam === 'preprod') { + subDomain = PREPROD_SUBDOMAIN; + } + let url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + host: `${subDomain}.${HOST}`, + pathname: ENDPOINT + }); + if (envParam === 'dev') { + url = DEV_URL; + } + return { + method: 'POST', + url, + data, + options + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + var bidRequests = {}; + try { + bidRequests = JSON.parse(request.data).bids; + } catch (err) { + // json error initial request can't be read + } + + // For this adapter, serverResponse is a list + serverResponse.body.forEach(response => { + const bid = createBid(response, bidRequests); + if (bid) { + bidResponses.push(bid); + } + }); + return bidResponses; + } +}; + +/* Get parsed size from request size */ +function getSize(bid) { + let inputSize = bid.sizes || []; + if (bid.mediaTypes?.banner) { + inputSize = bid.mediaTypes.banner.sizes || []; + } + + // Size can be [w, h] or array of sizes : [[w,h]]. + if (Array.isArray(bid.params?.size)) { + inputSize = bid.params.size; + if (!Array.isArray(inputSize[0])) { + inputSize = [inputSize]; + } + } + const sizesArray = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(inputSize); + const parsed = {}; + + // Use the first size as the main requested one + const size = sizesArray[0]; + + // size is ready + if (typeof size !== 'string') { + return parsed; + } + + // size is given as string "wwwxhhh" or "www*hhh" + const parsedSize = size.includes('*') ? size.split('*') : size.toUpperCase().split('X'); + const width = parseInt(parsedSize[0], 10); + if (width) { + parsed.width = width; + } + const height = parseInt(parsedSize[1], 10); + if (height) { + parsed.height = height; + } + return parsed; +} + +/* Create bid from response */ +function createBid(response, bidRequests) { + if (!response || !response.mediaType || response.mediaType === 'video' && !response.vastXml || response.mediaType === 'banner' && !response.ad) { + return; + } + const request = bidRequests && bidRequests.length && bidRequests.find(itm => response.requestId === itm.bidId); + // In case we don't retreive the size from the adserver, use the given one. + if (request) { + if (!response.width || response.width === '0') { + response.width = request.width; + } + if (!response.height || response.height === '0') { + response.height = request.height; + } + } + const bid = { + bidderCode: BIDDER_CODE, + width: response.width, + height: response.height, + requestId: response.requestId, + ttl: response.ttl || 3600, + creativeId: response.creativeId, + cpm: response.cpm, + netRevenue: response.netRevenue, + currency: response.currency, + meta: response.meta || { + advertiserDomains: ['retail-spot.io'] + }, + mediaType: response.mediaType + }; + + // retreive video response if present + if (response.mediaType === 'video') { + bid.vastXml = window.atob(response.vastXml); + } else { + bid.ad = response.ad; + } + if (response.adId) { + bid.adId = response.adId; + } + if (response.dealId) { + bid.dealId = response.dealId; + } + return bid; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('retailspotBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/retailspotBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["revcontentBidAdapter"],{ + +/***/ "./modules/revcontentBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/revcontentBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + + +const BIDDER_CODE = 'revcontent'; +const NATIVE_PARAMS = { + title: { + id: 0, + name: 'title' + }, + image: { + id: 3, + type: 3, + name: 'img' + }, + sponsoredBy: { + id: 5, + name: 'data', + type: 1 + } +}; +const STYLE_EXTRA = ''; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: function (bid) { + return typeof bid.params.apiKey !== 'undefined' && typeof bid.params.userId !== 'undefined'; + }, + buildRequests: (validBidRequests, bidderRequest) => { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const userId = validBidRequests[0].params.userId; + const widgetId = validBidRequests[0].params.widgetId; + const apiKey = validBidRequests[0].params.apiKey; + var domain = validBidRequests[0].params.domain; + var host = validBidRequests[0].params.endpoint; + if (typeof host === 'undefined') { + host = 'trends.revcontent.com'; + } + let serverRequests = []; + var refererInfo; + if (bidderRequest && bidderRequest.refererInfo) { + refererInfo = bidderRequest.refererInfo.page; + } + if (typeof domain === 'undefined') { + domain = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.parseDomain)(refererInfo, { + noPort: true + }); + } + var endpoint = 'https://' + host + '/rtb?apiKey=' + apiKey + '&userId=' + userId; + if (!isNaN(widgetId) && widgetId > 0) { + endpoint = endpoint + '&widgetId=' + widgetId; + } + const imp = validBidRequests.map((bid, id) => buildImp(bid, id)); + let data = { + id: bidderRequest.bidderRequestId, + imp: imp, + site: { + id: widgetId, + domain: domain, + page: refererInfo, + publisher: { + id: userId, + domain: domain + } + }, + device: { + ua: navigator.userAgent, + language: 'en' + }, + user: { + id: 1 + }, + at: 2 + }; + serverRequests.push({ + method: 'POST', + options: { + contentType: 'application/json' + }, + url: endpoint, + data: JSON.stringify(data), + bid: validBidRequests + }); + return serverRequests; + }, + interpretResponse: function (serverResponse, serverRequest) { + let response = serverResponse.body; + if (!response || !response.seatbid) { + return []; + } + let rtbRequest = JSON.parse(serverRequest.data); + let rtbBids = response.seatbid.map(seatbid => seatbid.bid).reduce((a, b) => a.concat(b), []); + return rtbBids.map(rtbBid => { + const bidIndex = +rtbBid.impid - 1; + let imp = rtbRequest.imp.filter(imp => imp.id.toString() === rtbBid.impid)[0]; + let prBid = { + requestId: serverRequest.bid[bidIndex].bidId, + cpm: rtbBid.price, + creativeId: rtbBid.crid, + nurl: rtbBid.nurl, + currency: response.cur || 'USD', + ttl: 360, + netRevenue: true + }; + if ('banner' in imp) { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + prBid.width = rtbBid.w; + prBid.height = rtbBid.h; + prBid.ad = STYLE_EXTRA + rtbBid.adm; + } else if ('native' in imp) { + let adm = JSON.parse(rtbBid.adm); + let ad = { + clickUrl: adm.link.url + }; + adm.assets.forEach(asset => { + switch (asset.id) { + case 3: + ad['image'] = { + url: asset.img.url, + height: 1, + width: 1 + }; + break; + case 0: + ad['title'] = asset.title.text; + break; + case 5: + ad['sponsoredBy'] = asset.data.value || 'Revcontent'; + break; + } + }); + var size = serverRequest.bid[0].params.size; + prBid.width = size.width; + prBid.height = size.height; + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + prBid.native = ad; + prBid.ad = displayNative(ad, getTemplate(serverRequest.bid[0].params.size, serverRequest.bid[0].params.template)); + } + return prBid; + }); + }, + onBidWon: function (bid) { + if (bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(bid.nurl); + } + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +function displayNative(ad, template) { + template = template.replace(/{image}/g, ad['image']['url']); + template = template.replace(/{title}/g, ad['title']); + template = template.replace(/{clickUrl}/g, ad['clickUrl']); + template = template.replace(/{sponsoredBy}/g, ad['sponsoredBy']); + return template; +} +function getTemplate(size, customTemplate) { + if (typeof customTemplate !== 'undefined' && customTemplate !== '') { + return customTemplate; + } + if (size.width == 300 && size.height == 250) { + return '

{title}

SEE MORE
'; + } + if (size.width == 728 && size.height == 90) { + return '

{title}

>
'; + } + if (size.width == 300 && size.height == 600) { + return '

{title}

>
'; + } + return ''; +} +function buildImp(bid, id) { + let bidfloor; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isFn)(bid.getFloor)) { + bidfloor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + })?.floor; + } else { + bidfloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, `params.bidfloor`) || 0.1; + } + let imp = { + id: id + 1, + tagid: bid.adUnitCode, + bidderRequestId: bid.bidderRequestId, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bid.auctionId, + transactionId: bid.ortb2Imp?.ext?.tid, + instl: 0, + bidfloor: bidfloor, + secure: '1' + }; + let bannerReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, `mediaTypes.banner`); + let nativeReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, `mediaTypes.native`); + if (bannerReq) { + let sizes = (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_6__.getAdUnitSizes)(bid); + imp.banner = { + w: sizes[0][0], + h: sizes[0][1], + format: sizes.map(wh => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseGPTSingleSizeArrayToRtbSize)(wh)) + }; + } else if (nativeReq) { + const assets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__._map)(bid.nativeParams, (bidParams, key) => { + const props = NATIVE_PARAMS[key]; + const asset = { + required: bidParams.required & 1 + }; + if (props) { + asset.id = props.id; + let wmin, hmin, w, h; + let aRatios = bidParams.aspect_ratios; + if (aRatios && aRatios[0]) { + aRatios = aRatios[0]; + wmin = aRatios.min_width || 0; + hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0; + } + asset[props.name] = { + len: bidParams.len, + type: props.type, + wmin, + hmin, + w, + h + }; + return asset; + } + }).filter(Boolean); + imp.native = { + request: { + ver: '1.1', + context: 2, + contextsubtype: 21, + plcmttype: 1, + plcmtcnt: 1, + assets: assets + }, + ver: '1.1', + battr: [1, 3, 8, 11, 17] + }; + } + return imp; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('revcontentBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/revcontentBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rewardedInterestIdSystem"],{ + +/***/ "./modules/rewardedInterestIdSystem.js": +/*!*********************************************!*\ + !*** ./modules/rewardedInterestIdSystem.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MODULE_NAME, SOURCE, getRewardedInterestApi, watchRewardedInterestApi, getRewardedInterestId, apiNotAvailable, rewardedInterestIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/** + * This module adds rewarded interest ID to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/rewardedInterestIdSystem + * @requires module:modules/userId + */ + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +/** + * @typedef RewardedInterestApi + * @property {getApiVersion} getApiVersion + * @property {getIdentityToken} getIdentityToken + */ + +/** + * Retrieves the Rewarded Interest API version. + * @callback getApiVersion + * @return {string} + */ + +/** + * Retrieves the current identity token. + * @callback getIdentityToken + * @return {Promise} + */ + + + +const MODULE_NAME = 'rewardedInterestId'; +const SOURCE = 'rewardedinterest.com'; + +/** + * Get rewarded interest API + * @function + * @returns {RewardedInterestApi|undefined} + */ +function getRewardedInterestApi() { + if (window.__riApi && window.__riApi.getIdentityToken) { + return window.__riApi; + } +} + +/** + * Wait while rewarded interest API to be set and execute the callback function + * @param {function} callback + */ +function watchRewardedInterestApi(callback) { + Object.defineProperties(window, { + __rewardedInterestApi: { + value: undefined, + writable: true + }, + __riApi: { + get: () => { + return window.__rewardedInterestApi; + }, + set: value => { + window.__rewardedInterestApi = value; + callback(value); + }, + configurable: true + } + }); +} + +/** + * Get rewarded interest ID from API and pass it to the callback function + * @param {RewardedInterestApi} rewardedInterestApi + * @param {function} callback User ID callbackCompleted + */ +function getRewardedInterestId(rewardedInterestApi, callback) { + rewardedInterestApi.getIdentityToken().then(callback).catch(error => { + callback(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${MODULE_NAME} module: ID fetch encountered an error`, error); + }); +} + +/** + * @param {function} callback User ID callbackCompleted + */ +function apiNotAvailable(callback) { + callback(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${MODULE_NAME} module: Rewarded Interest API not found`); +} + +/** @type {Submodule} */ +const rewardedInterestIdSubmodule = { + /** + * Used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{rewardedInterestId: string}|undefined} + */ + decode(value) { + return value ? { + [MODULE_NAME]: value + } : undefined; + }, + /** + * Performs action to obtain id and return a value in the callback's response argument + * @function + * @returns {IdResponse|undefined} + */ + getId() { + return { + callback: cb => { + const api = getRewardedInterestApi(); + if (api) { + getRewardedInterestId(api, cb); + } else if (document.readyState === 'complete') { + apiNotAvailable(cb); + } else { + watchRewardedInterestApi(api => getRewardedInterestId(api, cb)); + // Ensure that cb is called when API is not available + window.addEventListener('load', () => { + if (!getRewardedInterestApi()) { + apiNotAvailable(cb); + } + }); + } + } + }; + }, + eids: { + [MODULE_NAME]: { + source: SOURCE, + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.submodule)('userId', rewardedInterestIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('rewardedInterestIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rewardedInterestIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rhythmoneBidAdapter"],{ + +/***/ "./modules/rhythmoneBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/rhythmoneBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +function RhythmOneBidAdapter() { + this.code = 'rhythmone'; + this.supportedMediaTypes = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; + this.gvlid = 36; + let SUPPORTED_VIDEO_PROTOCOLS = [2, 3, 5, 6]; + let SUPPORTED_VIDEO_MIMES = ['video/mp4']; + let SUPPORTED_VIDEO_PLAYBACK_METHODS = [1, 2, 3, 4]; + let SUPPORTED_VIDEO_DELIVERY = [1]; + let SUPPORTED_VIDEO_API = [1, 2, 5]; + let slotsToBids = {}; + let version = '2.1'; + this.isBidRequestValid = function (bid) { + return !!(bid.params && bid.params.placementId); + }; + this.getUserSyncs = function (syncOptions, responses, gdprConsent) { + return []; + }; + function frameImp(BRs, bidderRequest) { + var impList = []; + var isSecure = 0; + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.stack.length) { + // clever trick to get the protocol + var el = document.createElement('a'); + el.href = bidderRequest.refererInfo.stack[0]; + isSecure = el.protocol == 'https:' ? 1 : 0; + } + for (var i = 0; i < BRs.length; i++) { + slotsToBids[BRs[i].adUnitCode] = BRs[i]; + var impObj = {}; + impObj.id = BRs[i].adUnitCode; + impObj.bidfloor = 0; + impObj.secure = isSecure; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaTypes.banner') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaType') === 'banner') { + let banner = frameBanner(BRs[i]); + if (banner) { + impObj.banner = banner; + } + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaTypes.video') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(BRs[i], 'mediaType') === 'video') { + impObj.video = frameVideo(BRs[i]); + } + if (!(impObj.banner || impObj.video)) { + continue; + } + impObj.ext = frameExt(BRs[i]); + impList.push(impObj); + } + return impList; + } + function frameSite(bidderRequest) { + return { + domain: bidderRequest?.refererInfo?.domain || '', + page: bidderRequest?.refererInfo?.page || '', + ref: bidderRequest?.refererInfo?.ref || '' + }; + } + function frameDevice() { + return { + ua: navigator.userAgent, + ip: '', + // Empty Ip string is required, server gets the ip from HTTP header + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDNT)() ? 1 : 0 + }; + } + function getValidSizeSet(dimensionList) { + let w = parseInt(dimensionList[0]); + let h = parseInt(dimensionList[1]); + // clever check for NaN + if (!(w !== w || h !== h)) { + // eslint-disable-line + return [w, h]; + } + return false; + } + function frameBanner(adUnit) { + // adUnit.sizes is scheduled to be deprecated, continue its support but prefer adUnit.mediaTypes.banner + var sizeList = adUnit.sizes; + if (adUnit.mediaTypes && adUnit.mediaTypes.banner) { + sizeList = adUnit.mediaTypes.banner.sizes; + } + var sizeStringList = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(sizeList); + var format = []; + sizeStringList.forEach(function (size) { + if (size) { + var dimensionList = getValidSizeSet(size.split('x')); + if (dimensionList) { + format.push({ + 'w': dimensionList[0], + 'h': dimensionList[1] + }); + } + } + }); + if (format.length) { + return { + 'format': format + }; + } + return false; + } + function frameVideo(bid) { + var size = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playerSize')) { + var dimensionSet = bid.mediaTypes.video.playerSize; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.mediaTypes.video.playerSize[0])) { + dimensionSet = bid.mediaTypes.video.playerSize[0]; + } + var validSize = getValidSizeSet(dimensionSet); + if (validSize) { + size = validSize; + } + } + return { + mimes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.mimes') || SUPPORTED_VIDEO_MIMES, + protocols: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.protocols') || SUPPORTED_VIDEO_PROTOCOLS, + w: size[0], + h: size[1], + startdelay: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.startdelay') || 0, + skip: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.skip') || 0, + playbackmethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.playbackmethod') || SUPPORTED_VIDEO_PLAYBACK_METHODS, + delivery: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.delivery') || SUPPORTED_VIDEO_DELIVERY, + api: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video.api') || SUPPORTED_VIDEO_API + }; + } + function frameExt(bid) { + return { + bidder: { + placementId: bid.params['placementId'], + zone: bid.params && bid.params['zone'] ? bid.params['zone'] : '1r', + path: bid.params && bid.params['path'] ? bid.params['path'] : 'mvo' + } + }; + } + function frameBid(BRs, bidderRequest) { + let bid = { + id: BRs[0].bidderRequestId, + imp: frameImp(BRs, bidderRequest), + site: frameSite(bidderRequest), + device: frameDevice(), + user: { + ext: { + consent: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.gdprApplies') ? bidderRequest.gdprConsent.consentString : '' + } + }, + at: 1, + tmax: Math.min(1000, bidderRequest.timeout), + regs: { + ext: { + gdpr: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidderRequest, 'gdprConsent.gdprApplies') ? Boolean(bidderRequest.gdprConsent.gdprApplies & 1) : false + } + } + }; + if (BRs[0].schain) { + bid.source = { + 'ext': { + 'schain': BRs[0].schain + } + }; + } + return bid; + } + function getFirstParam(key, validBidRequests) { + for (let i = 0; i < validBidRequests.length; i++) { + if (validBidRequests[i].params && validBidRequests[i].params[key]) { + return validBidRequests[i].params[key]; + } + } + } + this.buildRequests = function (BRs, bidderRequest) { + let fallbackPlacementId = getFirstParam('placementId', BRs); + if (fallbackPlacementId === undefined || BRs.length < 1) { + return []; + } + var rmpUrl = getFirstParam('endpoint', BRs) || 'https://tag.1rx.io/rmp/{placementId}/0/{path}?z={zone}'; + var defaultZone = getFirstParam('zone', BRs) || '1r'; + var defaultPath = getFirstParam('path', BRs) || 'mvo'; + rmpUrl = rmpUrl.replace(/\{placementId\}/i, fallbackPlacementId); + rmpUrl = rmpUrl.replace(/\{zone\}/i, defaultZone); + rmpUrl = rmpUrl.replace(/\{path\}/i, defaultPath); + var fat = /(^v|(\.0)+$)/gi; + var prebidVersion = "9.45.0-pre"; + rmpUrl += '&hbv=' + prebidVersion.replace(fat, '') + ',' + version.replace(fat, ''); + var bidRequest = frameBid(BRs, bidderRequest); + if (!bidRequest.imp.length) { + return {}; + } + return { + method: 'POST', + url: rmpUrl, + data: JSON.stringify(bidRequest) + }; + }; + this.interpretResponse = function (serverResponse) { + let responses = serverResponse.body || []; + let bids = []; + let i = 0; + if (responses.seatbid) { + let temp = []; + for (i = 0; i < responses.seatbid.length; i++) { + for (let j = 0; j < responses.seatbid[i].bid.length; j++) { + temp.push(responses.seatbid[i].bid[j]); + } + } + responses = temp; + } + for (i = 0; i < responses.length; i++) { + let bid = responses[i]; + let bidRequest = slotsToBids[bid.impid]; + let bidResponse = { + requestId: bidRequest.bidId, + cpm: parseFloat(bid.price), + width: bid.w, + height: bid.h, + meta: { + advertiserDomains: bid.adomain + }, + creativeId: bid.crid, + currency: 'USD', + netRevenue: true, + ttl: 350 + }; + if (bidRequest.mediaTypes && bidRequest.mediaTypes.video) { + bidResponse.vastUrl = bid.nurl; + bidResponse.mediaType = 'video'; + bidResponse.ttl = 600; + } else { + bidResponse.ad = bid.adm; + } + bids.push(bidResponse); + } + return bids; + }; +} +const spec = new RhythmOneBidAdapter(); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('rhythmoneBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rhythmoneBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["richaudienceBidAdapter"],{ + +/***/ "./modules/richaudienceBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/richaudienceBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + +const BIDDER_CODE = 'richaudience'; +let REFERER = ''; +const spec = { + code: BIDDER_CODE, + gvlid: 108, + aliases: [{ + code: 'ra', + gvlid: 108 + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /*** + * Determines whether or not the given bid request is valid + * + * @param {bidRequest} bid The bid params to validate. + * @returns {boolean} True if this is a valid bid, and false otherwise + */ + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.pid && bid.params.supplyType); + }, + /*** + * Build a server request from the list of valid BidRequests + * @param {validBidRequests} is an array of the valid bids + * @param {bidderRequest} bidder request object + * @returns {ServerRequest} Info describing the request to the server + */ + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bid => { + var payload = { + bidfloor: raiGetFloor(bid, _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config), + ifa: bid.params.ifa, + pid: bid.params.pid, + supplyType: bid.params.supplyType, + currencyCode: (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(bidderRequest), + auctionId: bid.auctionId, + bidId: bid.bidId, + BidRequestsCount: bid.bidRequestsCount, + bidder: bid.bidder, + bidderRequestId: bid.bidderRequestId, + tagId: bid.adUnitCode, + sizes: raiGetSizes(bid), + referer: typeof bidderRequest.refererInfo.page != 'undefined' ? encodeURIComponent(bidderRequest.refererInfo.page) : null, + numIframes: typeof bidderRequest.refererInfo.numIframes != 'undefined' ? bidderRequest.refererInfo.numIframes : null, + transactionId: bid.ortb2Imp?.ext?.tid, + timeout: bidderRequest.timeout || 600, + eids: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'userIdAsEids') ? bid.userIdAsEids : [], + demand: raiGetDemandType(bid), + videoData: raiGetVideoInfo(bid), + scr_rsl: raiGetResolution(), + cpuc: typeof window.navigator != 'undefined' ? window.navigator.hardwareConcurrency : null, + kws: bid.params.keywords, + schain: bid.schain, + gpid: raiSetPbAdSlot(bid), + dsa: setDSA(bid), + userData: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2.user.data') + }; + REFERER = typeof bidderRequest.refererInfo.page != 'undefined' ? encodeURIComponent(bidderRequest.refererInfo.page) : null; + payload.gdpr_consent = ''; + payload.gdpr = false; + if (bidderRequest && bidderRequest.gdprConsent) { + if (typeof bidderRequest.gdprConsent.gdprApplies != 'undefined') { + payload.gdpr = bidderRequest.gdprConsent.gdprApplies; + } + if (typeof bidderRequest.gdprConsent.consentString != 'undefined') { + payload.gdpr_consent = bidderRequest.gdprConsent.consentString; + } + } + if (bidderRequest?.gppConsent) { + payload.privacy = { + gpp: bidderRequest.gppConsent.gppString, + gpp_sid: bidderRequest.gppConsent.applicableSections + }; + } else if (bidderRequest?.ortb2?.regs?.gpp) { + payload.privacy = { + gpp: bidderRequest.ortb2.regs.gpp, + gpp_sid: bidderRequest.ortb2.regs.gpp_sid + }; + } + var payloadString = JSON.stringify(payload); + var endpoint = 'https://shb.richaudience.com/hb/'; + return { + method: 'POST', + url: endpoint, + data: payloadString + }; + }); + }, + /*** + * Read the response from the server and build a list of bids + * @param {serverResponse} Response from the server. + * @param {bidRequest} Bid request object + * @returns {bidResponses} Array of bids which were nested inside the server + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + // try catch + var response = serverResponse.body; + if (response) { + var bidResponse = { + requestId: JSON.parse(bidRequest.data).bidId, + cpm: response.cpm, + width: response.width, + height: response.height, + creativeId: response.creative_id, + mediaType: response.media_type, + netRevenue: response.netRevenue, + currency: response.currency, + ttl: response.ttl, + meta: { + advertiserDomains: [response.adomain[0]] + }, + dealId: response.dealId + }; + if (response.media_type === 'video') { + bidResponse.vastXml = response.vastXML; + try { + if (bidResponse.vastXml != null) { + if (JSON.parse(bidRequest.data).videoData.format == 'outstream' || JSON.parse(bidRequest.data).videoData.format == 'banner') { + bidResponse.renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__.Renderer.install({ + id: bidRequest.bidId, + adunitcode: bidRequest.tagId, + loaded: false, + config: response.media_type, + url: 'https://cdn3.richaudience.com/prebidVideo/player.js' + }); + } + bidResponse.renderer.setRender(renderer); + } + } catch (e) { + bidResponse.ad = response.adm; + } + } else { + bidResponse.ad = response.adm; + } + bidResponses.push(bidResponse); + } + return bidResponses; + }, + /*** + * User Syncs + * + * @param {syncOptions} Publisher prebid configuration + * @param {serverResponses} Response from the server + * @param {gdprConsent} GDPR consent object + * @returns {Array} + */ + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + const syncs = []; + var rand = Math.floor(Math.random() * 9999999999); + var syncUrl = ''; + var consent = ''; + var consentGPP = ''; + var raiSync = {}; + raiSync = raiGetSyncInclude(_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config); + if (gdprConsent && typeof gdprConsent.consentString === 'string' && typeof gdprConsent.consentString != 'undefined') { + consent = `consentString=${gdprConsent.consentString}`; + } + + // GPP Consent + if (gppConsent?.gppString && gppConsent?.applicableSections?.length) { + consentGPP = 'gpp=' + encodeURIComponent(gppConsent.gppString); + consentGPP += '&gpp_sid=' + encodeURIComponent(gppConsent?.applicableSections?.join(',')); + } + if (syncOptions.iframeEnabled && raiSync.raiIframe != 'exclude') { + syncUrl = 'https://sync.richaudience.com/dcf3528a0b8aa83634892d50e91c306e/?ord=' + rand; + if (consent != '') { + syncUrl += `&${consent}`; + } + if (consentGPP != '') { + syncUrl += `&${consentGPP}`; + } + syncs.push({ + type: 'iframe', + url: syncUrl + }); + } + if (syncOptions.pixelEnabled && REFERER != null && syncs.length == 0 && raiSync.raiImage != 'exclude') { + syncUrl = `https://sync.richaudience.com/bf7c142f4339da0278e83698a02b0854/?referrer=${REFERER}`; + if (consent != '') { + syncUrl += `&${consent}`; + } + if (consentGPP != '') { + syncUrl += `&${consentGPP}`; + } + syncs.push({ + type: 'image', + url: syncUrl + }); + } + return syncs; + }, + onTimeout: function (data) { + let url = raiGetTimeoutURL(data); + if (url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(url); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +function raiGetSizes(bid) { + let raiNewSizes; + if (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) { + raiNewSizes = bid.mediaTypes.banner.sizes; + } + if (raiNewSizes != null) { + return raiNewSizes.map(size => ({ + w: size[0], + h: size[1] + })); + } +} +function raiGetDemandType(bid) { + let raiFormat = 'display'; + if (typeof bid.sizes != 'undefined') { + bid.sizes.forEach(function (sz) { + if (sz[0] == '1800' && sz[1] == '1000' || sz[0] == '1' && sz[1] == '1') { + raiFormat = 'skin'; + } + }); + } + if (bid.mediaTypes != undefined) { + if (bid.mediaTypes.video != undefined) { + raiFormat = 'video'; + } + } + return raiFormat; +} +function raiGetVideoInfo(bid) { + let videoData; + if (raiGetDemandType(bid) == 'video') { + videoData = { + format: bid.mediaTypes.video.context, + playerSize: bid.mediaTypes.video.playerSize, + mimes: bid.mediaTypes.video.mimes + }; + } else { + videoData = { + format: 'banner' + }; + } + return videoData; +} +function renderer(bid) { + bid.renderer.push(() => { + renderAd(bid); + }); +} +function renderAd(bid) { + let raOutstreamHBPassback = `${bid.vastXml}`; + let raPlayerHB = { + adUnit: bid.adUnitCode + }; + window.raParams(raPlayerHB, raOutstreamHBPassback, true); +} +function raiGetResolution() { + let resolution = ''; + if (typeof window.screen != 'undefined') { + resolution = window.screen.width + 'x' + window.screen.height; + } + return resolution; +} +function raiSetPbAdSlot(bid) { + let pbAdSlot = ''; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.data.pbadslot') != null) { + pbAdSlot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + } + return pbAdSlot; +} +function raiGetSyncInclude(config) { + try { + let raConfig = null; + let raiSync = {}; + if (config.getConfig('userSync').filterSettings != null && typeof config.getConfig('userSync').filterSettings != 'undefined') { + raConfig = config.getConfig('userSync').filterSettings; + if (raConfig.iframe != null && typeof raConfig.iframe != 'undefined') { + raiSync.raiIframe = raConfig.iframe.bidders == 'richaudience' || raConfig.iframe.bidders == '*' ? raConfig.iframe.filter : 'exclude'; + } + if (raConfig.image != null && typeof raConfig.image != 'undefined') { + raiSync.raiImage = raConfig.image.bidders == 'richaudience' || raConfig.image.bidders == '*' ? raConfig.image.filter : 'exclude'; + } + } + return raiSync; + } catch (e) { + return null; + } +} +function raiGetFloor(bid, config) { + try { + let raiFloor; + if (bid.params.bidfloor != null) { + raiFloor = bid.params.bidfloor; + } else if (typeof bid.getFloor == 'function') { + let floorSpec = bid.getFloor({ + currency: config.getConfig('floors.data.currency') != null ? config.getConfig('floors.data.currency') : 'USD', + mediaType: typeof bid.mediaTypes['banner'] == 'object' ? 'banner' : 'video', + size: '*' + }); + raiFloor = floorSpec.floor; + } + return raiFloor; + } catch (e) { + return 0; + } +} +function raiGetTimeoutURL(data) { + let { + params, + timeout + } = data[0]; + let url = 'https://s.richaudience.com/err/?ec=6&ev=[timeout_publisher]&pla=[placement_hash]&int=PREBID&pltfm=&node=&dm=[domain]'; + url = url.replace('[timeout_publisher]', timeout); + url = url.replace('[placement_hash]', params[0].pid); + if (document.location.host != null) { + url = url.replace('[domain]', document.location.host); + } + return url; +} +function setDSA(bid) { + let dsa = bid?.ortb2?.regs?.ext?.dsa ? bid?.ortb2?.regs?.ext?.dsa : null; + return dsa; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('richaudienceBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/richaudienceBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ringieraxelspringerBidAdapter"],{ + +/***/ "./modules/ringieraxelspringerBidAdapter.js": +/*!**************************************************!*\ + !*** ./modules/ringieraxelspringerBidAdapter.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/keywords/keywords.js */ "./libraries/keywords/keywords.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _libraries_paapiTools_buyerOrigins_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/paapiTools/buyerOrigins.js */ "./libraries/paapiTools/buyerOrigins.js"); + + + + + + + +const BIDDER_CODE = 'ringieraxelspringer'; +const VERSION = '1.0'; +const getEndpoint = network => { + return `https://csr.onet.pl/${encodeURIComponent(network)}/csr-006/csr.json?nid=${encodeURIComponent(network)}&`; +}; +function parseParams(params, bidderRequest) { + const newParams = {}; + if (params.customParams && typeof params.customParams === 'object') { + for (const param in params.customParams) { + if (params.customParams.hasOwnProperty(param)) { + newParams[param] = params.customParams[param]; + } + } + } + const du = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidderRequest, 'refererInfo.page'); + const dr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidderRequest, 'refererInfo.ref'); + if (du) { + newParams.du = du; + } + if (dr) { + newParams.dr = dr; + } + const pageContext = params.pageContext; + if (!pageContext) { + return newParams; + } + if (pageContext.du) { + newParams.du = pageContext.du; + } + if (pageContext.dr) { + newParams.dr = pageContext.dr; + } + if (pageContext.dv) { + newParams.DV = pageContext.dv; + } + const keywords = (0,_libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_1__.getAllOrtbKeywords)(bidderRequest?.ortb2, pageContext.keyWords); + if (keywords.length > 0) { + newParams.kwrd = keywords.join('+'); + } + if (pageContext.capping) { + newParams.local_capping = pageContext.capping; + } + if (pageContext.keyValues && typeof pageContext.keyValues === 'object') { + for (const param in pageContext.keyValues) { + if (pageContext.keyValues.hasOwnProperty(param)) { + const kvName = 'kv' + param; + newParams[kvName] = pageContext.keyValues[param]; + } + } + } + if (bidderRequest?.ortb2?.regs?.ext?.dsa?.required !== undefined) { + newParams.dsainfo = bidderRequest?.ortb2?.regs?.ext?.dsa?.required; + } + return newParams; +} + +/** + * @param url string + * @param type number // 1 - img, 2 - js + * @returns an object { event: 1, method: 1 or 2, url: 'string' } + */ +function prepareItemEventtrackers(url, type) { + return { + event: 1, + method: type, + url: url + }; +} +function prepareEventtrackers(emsLink, imp, impression, impression1, impressionJs1) { + const eventtrackers = [prepareItemEventtrackers(emsLink, 1)]; + if (imp) { + eventtrackers.push(prepareItemEventtrackers(imp, 1)); + } + if (impression) { + eventtrackers.push(prepareItemEventtrackers(impression, 1)); + } + if (impression1) { + eventtrackers.push(prepareItemEventtrackers(impression1, 1)); + } + if (impressionJs1) { + eventtrackers.push(prepareItemEventtrackers(impressionJs1, 2)); + } + return eventtrackers; +} +function parseOrtbResponse(ad) { + if (!(ad.data?.fields && ad.data?.meta)) { + return false; + } + const { + image, + Image, + title, + url, + Headline, + Thirdpartyclicktracker, + thirdPartyClickTracker2, + imp, + impression, + impression1, + impressionJs1, + partner_logo: partnerLogo, + adInfo, + body + } = ad.data.fields; + const { + dsaurl, + height, + width, + adclick + } = ad.data.meta; + const emsLink = ad.ems_link; + const link = adclick + (url || Thirdpartyclicktracker); + const eventtrackers = prepareEventtrackers(emsLink, imp, impression, impression1, impressionJs1); + const clicktrackers = thirdPartyClickTracker2 ? [thirdPartyClickTracker2] : []; + const ortb = { + ver: '1.2', + assets: [{ + id: 0, + data: { + value: body || '', + type: 2 + } + }, { + id: 1, + data: { + value: adInfo || '', + // Body2 type + type: 10 + } + }, { + id: 3, + img: { + type: 1, + url: partnerLogo || '', + w: width, + h: height + } + }, { + id: 4, + img: { + type: 3, + url: image || Image || '', + w: width, + h: height + } + }, { + id: 5, + data: { + value: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ad, 'data.meta.advertiser_name', null), + type: 1 + } + }, { + id: 6, + title: { + text: title || Headline || '' + } + }], + link: { + url: link, + clicktrackers + }, + eventtrackers + }; + if (dsaurl) { + ortb.privacy = dsaurl; + } + return ortb; +} +function parseNativeResponse(ad) { + if (!(ad.data?.fields && ad.data?.meta)) { + return false; + } + const { + image, + Image, + title, + leadtext, + url, + Calltoaction, + Body, + Headline, + Thirdpartyclicktracker, + adInfo, + partner_logo: partnerLogo + } = ad.data.fields; + const { + dsaurl, + height, + width, + adclick + } = ad.data.meta; + const link = adclick + (url || Thirdpartyclicktracker); + const nativeResponse = { + sendTargetingKeys: false, + title: title || Headline || '', + image: { + url: image || Image || '', + width, + height + }, + icon: { + url: partnerLogo || '', + width, + height + }, + clickUrl: link, + cta: Calltoaction || '', + body: leadtext || Body || '', + body2: adInfo || '', + sponsoredBy: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ad, 'data.meta.advertiser_name', null) || '', + ortb: parseOrtbResponse(ad) + }; + if (dsaurl) { + nativeResponse.privacyLink = dsaurl; + } + return nativeResponse; +} +const buildBid = (ad, mediaType) => { + if (ad.type === 'empty' || mediaType === undefined) { + return null; + } + const data = { + requestId: ad.id, + cpm: ad.bid_rate ? ad.bid_rate.toFixed(2) : 0, + ttl: 300, + creativeId: ad.adid ? parseInt(ad.adid.split(',')[2], 10) : 0, + netRevenue: true, + currency: ad.currency || 'USD', + dealId: ad.prebid_deal || null, + actgMatch: ad.actg_match || 0, + meta: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER + }, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, + ad: ad.html || null, + width: ad.width || 0, + height: ad.height || 0 + }; + if (mediaType === 'native') { + data.meta = { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE + }; + data.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE; + data.native = parseNativeResponse(ad) || {}; + delete data.ad; + } + return data; +}; +const getContextParams = (bidRequests, bidderRequest) => { + const bid = bidRequests[0]; + const { + params + } = bid; + const requestParams = { + site: params.site, + area: params.area, + cre_format: 'html', + systems: 'das', + kvprver: VERSION, + ems_url: 1, + bid_rate: 1, + ...parseParams(params, bidderRequest) + }; + return Object.keys(requestParams).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(requestParams[key])).join('&'); +}; +const getSlots = bidRequests => { + let queryString = ''; + const batchSize = bidRequests.length; + for (let i = 0; i < batchSize; i++) { + const adunit = bidRequests[i]; + const slotSequence = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(adunit, 'params.slotSequence'); + const creFormat = getAdUnitCreFormat(adunit); + const sizes = creFormat === 'native' ? 'fluid' : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.parseSizesInput)((0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAdUnitSizes)(adunit)).join(','); + queryString += `&slot${i}=${encodeURIComponent(adunit.params.slot)}&id${i}=${encodeURIComponent(adunit.bidId)}&composition${i}=CHILD`; + if (creFormat === 'native') { + queryString += `&cre_format${i}=native`; + } + queryString += `&kvhb_format${i}=${creFormat === 'native' ? 'native' : 'banner'}`; + if (sizes) { + queryString += `&iusizes${i}=${encodeURIComponent(sizes)}`; + } + if (slotSequence !== undefined && slotSequence !== null) { + queryString += `&pos${i}=${encodeURIComponent(slotSequence)}`; + } + } + return queryString; +}; +const getGdprParams = bidderRequest => { + const gdprApplies = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidderRequest, 'gdprConsent.gdprApplies'); + let consentString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidderRequest, 'gdprConsent.consentString'); + let queryString = ''; + if (gdprApplies !== undefined) { + queryString += `&gdpr_applies=${encodeURIComponent(gdprApplies)}`; + } + if (consentString !== undefined) { + queryString += `&euconsent=${encodeURIComponent(consentString)}`; + } + return queryString; +}; +const parseAuctionConfigs = (serverResponse, bidRequest) => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(bidRequest)) { + return null; + } + const auctionConfigs = []; + const gctx = serverResponse && serverResponse.body?.gctx; + bidRequest.bidIds.filter(bid => bid.fledgeEnabled).forEach(bid => { + auctionConfigs.push({ + 'bidId': bid.bidId, + 'config': { + 'seller': _libraries_paapiTools_buyerOrigins_js__WEBPACK_IMPORTED_MODULE_5__.BO_CSR_ONET, + 'decisionLogicUrl': `${_libraries_paapiTools_buyerOrigins_js__WEBPACK_IMPORTED_MODULE_5__.BO_CSR_ONET}/${encodeURIComponent(bid.params.network)}/v1/protected-audience-api/decision-logic.js`, + 'interestGroupBuyers': [_libraries_paapiTools_buyerOrigins_js__WEBPACK_IMPORTED_MODULE_5__.BO_CSR_ONET], + 'auctionSignals': { + 'params': bid.params, + 'sizes': bid.sizes, + 'gctx': gctx + } + } + }); + }); + if (auctionConfigs.length === 0) { + return null; + } else { + return auctionConfigs; + } +}; +const getAdUnitCreFormat = adUnit => { + if (!adUnit) { + return; + } + let creFormat = 'html'; + let mediaTypes = Object.keys(adUnit.mediaTypes); + if (mediaTypes && mediaTypes.length === 1 && mediaTypes.includes('native')) { + creFormat = 'native'; + } + return creFormat; +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + isBidRequestValid: function (bidRequest) { + if (!bidRequest || !bidRequest.params || typeof bidRequest.params !== 'object') { + return; + } + const { + params + } = bidRequest; + return Boolean(params.network && params.site && params.area && params.slot); + }, + buildRequests: function (bidRequests, bidderRequest) { + const slotsQuery = getSlots(bidRequests); + const contextQuery = getContextParams(bidRequests, bidderRequest); + const gdprQuery = getGdprParams(bidderRequest); + const fledgeEligible = Boolean(bidderRequest?.paapi?.enabled); + const network = bidRequests[0].params.network; + const bidIds = bidRequests.map(bid => ({ + slot: bid.params.slot, + bidId: bid.bidId, + sizes: (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_4__.getAdUnitSizes)(bid), + params: bid.params, + fledgeEnabled: fledgeEligible, + mediaType: bid.mediaTypes && bid.mediaTypes.banner ? 'display' : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE + })); + return [{ + method: 'GET', + url: getEndpoint(network) + contextQuery + slotsQuery + gdprQuery, + bidIds: bidIds + }]; + }, + interpretResponse: function (serverResponse, bidRequest) { + const response = serverResponse.body; + const fledgeAuctionConfigs = parseAuctionConfigs(serverResponse, bidRequest); + const bids = !response || !response.ads || response.ads.length === 0 ? [] : response.ads.map((ad, index) => buildBid(ad, bidRequest?.bidIds?.[index]?.mediaType || 'banner')).filter(bid => !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(bid)); + if (fledgeAuctionConfigs) { + // Return a tuple of bids and auctionConfigs. It is possible that bids could be null. + return { + bids, + paapi: fledgeAuctionConfigs + }; + } else { + return bids; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('ringieraxelspringerBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","keywords","paapiTools","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ringieraxelspringerBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["riseBidAdapter"],{ + +/***/ "./modules/riseBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/riseBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/riseUtils/index.js */ "./libraries/riseUtils/index.js"); +/* harmony import */ var _libraries_riseUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/riseUtils/constants.js */ "./libraries/riseUtils/constants.js"); + + + + + +const spec = { + ...(0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.makeBaseSpec)(_libraries_riseUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BASE_URL, _libraries_riseUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.MODES), + code: _libraries_riseUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.BIDDER_CODE, + aliases: _libraries_riseUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.ALIASES, + gvlid: _libraries_riseUtils_constants_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_GVLID, + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('no params have been set to Rise adapter'); + return false; + } + if (!bidRequest.params.org) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('org is a mandatory param for Rise adapter'); + return false; + } + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('riseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["riseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/riseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rivrAnalyticsAdapter"],{ + +/***/ "./modules/rivrAnalyticsAdapter.js": +/*!*****************************************!*\ + !*** ./modules/rivrAnalyticsAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + +const analyticsType = 'endpoint'; +let rivrAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (window.rivraddon && window.rivraddon.analytics && window.rivraddon.analytics.getContext() && window.rivraddon.analytics.trackPbjsEvent) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo(`ARGUMENTS FOR TYPE: ============= ${eventType}`, args); + window.rivraddon.analytics.trackPbjsEvent({ + eventType, + args + }); + } + } +}); + +// save the base class function +rivrAnalytics.originEnableAnalytics = rivrAnalytics.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +rivrAnalytics.enableAnalytics = config => { + if (window.rivraddon && window.rivraddon.analytics) { + window.rivraddon.analytics.enableAnalytics(config, { + utils: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__, + ajax: _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax, + pbjsGlobalVariable: (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)() + }); + rivrAnalytics.originEnableAnalytics(config); + } +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: rivrAnalytics, + code: 'rivr' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (rivrAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('rivrAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rivrAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rixengineBidAdapter"],{ + +/***/ "./modules/rixengineBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/rixengineBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +const BIDDER_CODE = 'rixengine'; +let ENDPOINT = null; +let SID = null; +let TOKEN = null; +const DEFAULT_BID_TTL = 30; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL, + currency: DEFAULT_CURRENCY, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + return imp; + } +}); +const spec = { + code: BIDDER_CODE, + // Register "algorix" as an alias, also with gvlid if needed + aliases: [{ + code: 'algorix', + gvlid: 1176 + }], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + isBidRequestValid: function (bid) { + if (Boolean(bid.params.endpoint) && Boolean(bid.params.sid) && Boolean(bid.params.token)) { + SID = bid.params.sid; + TOKEN = bid.params.token; + ENDPOINT = bid.params.endpoint + '?sid=' + SID + '&token=' + TOKEN; + return true; + } + return false; + }, + buildRequests(bidRequests, bidderRequest) { + let data = converter.toORTB({ + bidRequests, + bidderRequest + }); + return [{ + method: 'POST', + url: ENDPOINT, + data, + options: { + contentType: 'application/json;charset=utf-8' + } + }]; + }, + interpretResponse(response, request) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('rixengineBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rixengineBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["robustaBidAdapter"],{ + +/***/ "./modules/robustaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/robustaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.params', bidRequest.params); + return imp; + } +}); +const BIDDER_CODE = 'robusta'; +const VERSION = '1.0.0'; +const METHOD = 'POST'; +const DEFAULT_RTB_DOMAIN = 'pbjs.baristartb.com'; +const DEFAULT_SYNC_DOMAIN = 'sync.baristartb.com'; +function isBidRequestValid(bidRequest) { + return !!bidRequest.params.lineItemId; +} +function buildRequests(bidRequests, bidderRequest) { + const data = converter.toORTB({ + bidderRequest, + bidRequests + }); + const domain = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('rtbDomain') || DEFAULT_RTB_DOMAIN; + return [{ + method: METHOD, + url: `//${domain}/api/prebid`, + data: data, + options: { + withCredentials: false + } + }]; +} +function interpretResponse(response, request) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }); + return bids; +} +function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + let syncParams = ''; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + syncParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + syncParams = `gdpr_consent=${gdprConsent.consentString}`; + } + } + const domain = _src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('syncDomain') || DEFAULT_SYNC_DOMAIN; + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `//${domain}/api/sync?` + syncParams + }); + } + if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `//${domain}/api/sync?` + syncParams + }); + } + return syncs; +} +const spec = { + code: BIDDER_CODE, + version: VERSION, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('robustaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/robustaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["roxotAnalyticsAdapter"],{ + +/***/ "./modules/roxotAnalyticsAdapter.js": +/*!******************************************!*\ + !*** ./modules/roxotAnalyticsAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + + +const MODULE_CODE = 'roxot'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); +let ajax = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajaxBuilder)(0); +const DEFAULT_EVENT_URL = 'pa.rxthdr.com/v3'; +const DEFAULT_SERVER_CONFIG_URL = 'pa.rxthdr.com/v3'; +const analyticsType = 'endpoint'; +const { + AUCTION_INIT, + AUCTION_END, + BID_REQUESTED, + BID_ADJUSTMENT, + BIDDER_DONE, + BID_WON +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS; +const AUCTION_STATUS = { + 'RUNNING': 'running', + 'FINISHED': 'finished' +}; +const BIDDER_STATUS = { + 'REQUESTED': 'requested', + 'BID': 'bid', + 'NO_BID': 'noBid', + 'TIMEOUT': 'timeout' +}; +const ROXOT_EVENTS = { + 'AUCTION': 'a', + 'IMPRESSION': 'i', + 'BID_AFTER_TIMEOUT': 'bat' +}; +let initOptions = {}; +let localStoragePrefix = 'roxot_analytics_'; +let utmTags = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; +let utmTtlKey = 'utm_ttl'; +let utmTtl = 60 * 60 * 1000; +let isNewKey = 'is_new_flag'; +let isNewTtl = 60 * 60 * 1000; +let auctionCache = {}; +let auctionTtl = 60 * 60 * 1000; +let sendEventCache = []; +let sendEventTimeoutId = null; +let sendEventTimeoutTime = 1000; +function detectDevice() { + if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase())) { + return 'tablet'; + } + if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase())) { + return 'mobile'; + } + return 'desktop'; +} +function checkIsNewFlag() { + let key = buildLocalStorageKey(isNewKey); + let lastUpdate = Number(storage.getDataFromLocalStorage(key)); + storage.setDataInLocalStorage(key, Date.now()); + return Date.now() - lastUpdate > isNewTtl; +} +function updateUtmTimeout() { + storage.setDataInLocalStorage(buildLocalStorageKey(utmTtlKey), Date.now()); +} +function isUtmTimeoutExpired() { + let utmTimestamp = storage.getDataFromLocalStorage(buildLocalStorageKey(utmTtlKey)); + return Date.now() - utmTimestamp > utmTtl; +} +function buildLocalStorageKey(key) { + return localStoragePrefix.concat(key); +} +function isSupportedAdUnit(adUnit) { + if (!initOptions.adUnits.length) { + return true; + } + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.includes)(initOptions.adUnits, adUnit); +} +function deleteOldAuctions() { + for (let auctionId in auctionCache) { + let auction = auctionCache[auctionId]; + if (Date.now() - auction.start > auctionTtl) { + delete auctionCache[auctionId]; + } + } +} +function buildAuctionEntity(args) { + return { + 'id': args.auctionId, + 'start': args.timestamp, + 'timeout': args.timeout, + 'adUnits': {} + }; +} +function extractAdUnitCode(args) { + return args.adUnitCode.toLowerCase(); +} +function extractBidder(args) { + return args.bidder.toLowerCase(); +} +function buildAdUnitAuctionEntity(auction, bidRequest) { + return { + 'adUnit': extractAdUnitCode(bidRequest), + 'start': auction.start, + 'timeout': auction.timeout, + 'finish': 0, + 'status': AUCTION_STATUS.RUNNING, + 'bidders': {} + }; +} +function buildBidderRequest(auction, bidRequest) { + return { + 'bidder': extractBidder(bidRequest), + 'isAfterTimeout': auction.status === AUCTION_STATUS.FINISHED ? 1 : 0, + 'start': bidRequest.startTime || Date.now(), + 'finish': 0, + 'status': BIDDER_STATUS.REQUESTED, + 'cpm': -1, + 'size': { + 'width': 0, + 'height': 0 + }, + 'mediaType': '-', + 'source': bidRequest.source || 'client' + }; +} +function buildBidAfterTimeout(adUnitAuction, args) { + return { + 'auction': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.deepClone)(adUnitAuction), + 'adUnit': extractAdUnitCode(args), + 'bidder': extractBidder(args), + 'cpm': args.cpm, + 'size': { + 'width': args.width || 0, + 'height': args.height || 0 + }, + 'mediaType': args.mediaType || '-', + 'start': args.requestTimestamp, + 'finish': args.responseTimestamp + }; +} +function buildImpression(adUnitAuction, args) { + return { + 'isNew': checkIsNewFlag() ? 1 : 0, + 'auction': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.deepClone)(adUnitAuction), + 'adUnit': extractAdUnitCode(args), + 'bidder': extractBidder(args), + 'cpm': args.cpm, + 'size': { + 'width': args.width, + 'height': args.height + }, + 'mediaType': args.mediaType, + 'source': args.source || 'client' + }; +} +function handleAuctionInit(args) { + auctionCache[args.auctionId] = buildAuctionEntity(args); + deleteOldAuctions(); +} +function handleBidRequested(args) { + let auction = auctionCache[args.auctionId]; + args.bids.forEach(function (bidRequest) { + let adUnitCode = extractAdUnitCode(bidRequest); + let bidder = extractBidder(bidRequest); + if (!isSupportedAdUnit(adUnitCode)) { + return; + } + auction['adUnits'][adUnitCode] = auction['adUnits'][adUnitCode] || buildAdUnitAuctionEntity(auction, bidRequest); + let adUnitAuction = auction['adUnits'][adUnitCode]; + adUnitAuction['bidders'][bidder] = adUnitAuction['bidders'][bidder] || buildBidderRequest(auction, bidRequest); + }); +} +function handleBidAdjustment(args) { + let adUnitCode = extractAdUnitCode(args); + let bidder = extractBidder(args); + if (!isSupportedAdUnit(adUnitCode)) { + return; + } + let adUnitAuction = auctionCache[args.auctionId]['adUnits'][adUnitCode]; + if (adUnitAuction.status === AUCTION_STATUS.FINISHED) { + handleBidAfterTimeout(adUnitAuction, args); + return; + } + let bidderRequest = adUnitAuction['bidders'][bidder]; + if (bidderRequest.cpm < args.cpm) { + bidderRequest.cpm = args.cpm; + bidderRequest.finish = args.responseTimestamp; + bidderRequest.status = args.cpm === 0 ? BIDDER_STATUS.NO_BID : BIDDER_STATUS.BID; + bidderRequest.size.width = args.width || 0; + bidderRequest.size.height = args.height || 0; + bidderRequest.mediaType = args.mediaType || '-'; + bidderRequest.source = args.source || 'client'; + } +} +function handleBidAfterTimeout(adUnitAuction, args) { + let bidder = extractBidder(args); + let bidderRequest = adUnitAuction['bidders'][bidder]; + let bidAfterTimeout = buildBidAfterTimeout(adUnitAuction, args); + if (bidAfterTimeout.cpm > bidderRequest.cpm) { + bidderRequest.cpm = bidAfterTimeout.cpm; + bidderRequest.isAfterTimeout = 1; + bidderRequest.finish = bidAfterTimeout.finish; + bidderRequest.size = bidAfterTimeout.size; + bidderRequest.mediaType = bidAfterTimeout.mediaType; + bidderRequest.status = bidAfterTimeout.cpm === 0 ? BIDDER_STATUS.NO_BID : BIDDER_STATUS.BID; + } + registerEvent(ROXOT_EVENTS.BID_AFTER_TIMEOUT, 'Bid After Timeout', bidAfterTimeout); +} +function handleBidderDone(args) { + let auction = auctionCache[args.auctionId]; + args.bids.forEach(function (bidDone) { + let adUnitCode = extractAdUnitCode(bidDone); + let bidder = extractBidder(bidDone); + if (!isSupportedAdUnit(adUnitCode)) { + return; + } + let adUnitAuction = auction['adUnits'][adUnitCode]; + if (adUnitAuction.status === AUCTION_STATUS.FINISHED) { + return; + } + let bidderRequest = adUnitAuction['bidders'][bidder]; + if (bidderRequest.status !== BIDDER_STATUS.REQUESTED) { + return; + } + bidderRequest.finish = Date.now(); + bidderRequest.status = BIDDER_STATUS.NO_BID; + bidderRequest.cpm = 0; + }); +} +function handleAuctionEnd(args) { + let auction = auctionCache[args.auctionId]; + if (!Object.keys(auction.adUnits).length) { + delete auctionCache[args.auctionId]; + } + let finish = Date.now(); + auction.finish = finish; + for (let adUnit in auction.adUnits) { + let adUnitAuction = auction.adUnits[adUnit]; + adUnitAuction.finish = finish; + adUnitAuction.status = AUCTION_STATUS.FINISHED; + for (let bidder in adUnitAuction.bidders) { + let bidderRequest = adUnitAuction.bidders[bidder]; + if (bidderRequest.status !== BIDDER_STATUS.REQUESTED) { + continue; + } + bidderRequest.status = BIDDER_STATUS.TIMEOUT; + } + } + registerEvent(ROXOT_EVENTS.AUCTION, 'Auction', auction); +} +function handleBidWon(args) { + let adUnitCode = extractAdUnitCode(args); + if (!isSupportedAdUnit(adUnitCode)) { + return; + } + let adUnitAuction = auctionCache[args.auctionId]['adUnits'][adUnitCode]; + let impression = buildImpression(adUnitAuction, args); + registerEvent(ROXOT_EVENTS.IMPRESSION, 'Bid won', impression); +} +function handleOtherEvents(eventType, args) { + registerEvent(eventType, eventType, args); +} +let roxotAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_6__["default"])({ + url: DEFAULT_EVENT_URL, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_INIT: + handleAuctionInit(args); + break; + case BID_REQUESTED: + handleBidRequested(args); + break; + case BID_ADJUSTMENT: + handleBidAdjustment(args); + break; + case BIDDER_DONE: + handleBidderDone(args); + break; + case AUCTION_END: + handleAuctionEnd(args); + break; + case BID_WON: + handleBidWon(args); + break; + default: + handleOtherEvents(eventType, args); + break; + } + } +}); +roxotAdapter.originEnableAnalytics = roxotAdapter.enableAnalytics; +roxotAdapter.enableAnalytics = function (config) { + if (this.initConfig(config)) { + _logInfo('Analytics adapter enabled', initOptions); + roxotAdapter.originEnableAnalytics(config); + } +}; +roxotAdapter.buildUtmTagData = function () { + let utmTagData = {}; + let utmTagsDetected = false; + utmTags.forEach(function (utmTagKey) { + let utmTagValue = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.getParameterByName)(utmTagKey); + if (utmTagValue !== '') { + utmTagsDetected = true; + } + utmTagData[utmTagKey] = utmTagValue; + }); + utmTags.forEach(function (utmTagKey) { + if (utmTagsDetected) { + storage.setDataInLocalStorage(buildLocalStorageKey(utmTagKey), utmTagData[utmTagKey]); + updateUtmTimeout(); + } else { + if (!isUtmTimeoutExpired()) { + utmTagData[utmTagKey] = storage.getDataFromLocalStorage(buildLocalStorageKey(utmTagKey)) ? storage.getDataFromLocalStorage(buildLocalStorageKey(utmTagKey)) : ''; + updateUtmTimeout(); + } + } + }); + return utmTagData; +}; +roxotAdapter.initConfig = function (config) { + let isCorrectConfig = true; + initOptions = {}; + initOptions.options = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.deepClone)(config.options); + initOptions.publisherId = initOptions.options.publisherId || initOptions.options.publisherIds[0] || null; + if (!initOptions.publisherId) { + _logError('"options.publisherId" is empty'); + isCorrectConfig = false; + } + initOptions.adUnits = initOptions.options.adUnits || []; + initOptions.adUnits = initOptions.adUnits.map(value => value.toLowerCase()); + initOptions.server = initOptions.options.server || DEFAULT_EVENT_URL; + initOptions.configServer = initOptions.options.configServer || initOptions.options.server || DEFAULT_SERVER_CONFIG_URL; + initOptions.utmTagData = this.buildUtmTagData(); + initOptions.host = initOptions.options.host || window.location.hostname; + initOptions.device = detectDevice(); + loadServerConfig(); + return isCorrectConfig; +}; +roxotAdapter.getOptions = function () { + return initOptions; +}; +function registerEvent(eventType, eventName, data) { + let eventData = { + eventType: eventType, + eventName: eventName, + data: data + }; + sendEventCache.push(eventData); + _logInfo('Register event', eventData); + typeof initOptions.serverConfig === 'undefined' ? checkEventAfterTimeout() : checkSendEvent(); +} +function checkSendEvent() { + if (sendEventTimeoutId) { + clearTimeout(sendEventTimeoutId); + sendEventTimeoutId = null; + } + if (typeof initOptions.serverConfig === 'undefined') { + checkEventAfterTimeout(); + return; + } + while (sendEventCache.length) { + let event = sendEventCache.shift(); + let isNeedSend = initOptions.serverConfig[event.eventType] || 0; + if (Number(isNeedSend) === 0) { + _logInfo('Skip event ' + event.eventName, event); + continue; + } + sendEvent(event.eventType, event.eventName, event.data); + } +} +function checkEventAfterTimeout() { + if (sendEventTimeoutId) { + return; + } + sendEventTimeoutId = setTimeout(checkSendEvent, sendEventTimeoutTime); +} +function sendEvent(eventType, eventName, data) { + let url = 'https://' + initOptions.server + '/' + eventType + '?publisherId=' + initOptions.publisherId + '&host=' + initOptions.host; + let eventData = { + 'event': eventType, + 'eventName': eventName, + 'options': initOptions, + 'data': data + }; + ajax(url, function () { + _logInfo(eventName + ' sent', eventData); + }, JSON.stringify(eventData), { + contentType: 'text/plain', + method: 'POST', + withCredentials: true + }); +} +function loadServerConfig() { + let url = 'https://' + initOptions.configServer + '/c' + '?publisherId=' + initOptions.publisherId + '&host=' + initOptions.host; + ajax(url, { + 'success': function (data) { + initOptions.serverConfig = JSON.parse(data); + }, + 'error': function () { + initOptions.serverConfig = {}; + initOptions.serverConfig[ROXOT_EVENTS.AUCTION] = 1; + initOptions.serverConfig[ROXOT_EVENTS.IMPRESSION] = 1; + initOptions.serverConfig[ROXOT_EVENTS.BID_AFTER_TIMEOUT] = 1; + initOptions.serverConfig['isError'] = 1; + } + }, null, { + contentType: 'text/json', + method: 'GET', + withCredentials: true + }); +} +function _logInfo(message, meta) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logInfo)(buildLogMessage(message), meta); +} +function _logError(message) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(buildLogMessage(message)); +} +function buildLogMessage(message) { + return 'Roxot Prebid Analytics: ' + message; +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].registerAnalyticsAdapter({ + adapter: roxotAdapter, + code: MODULE_CODE +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (roxotAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('roxotAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/roxotAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rtbhouseBidAdapter"],{ + +/***/ "./modules/rtbhouseBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/rtbhouseBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_getOrigin_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/getOrigin/index.js */ "./libraries/getOrigin/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/precisoUtils/bidNativeUtils.js */ "./libraries/precisoUtils/bidNativeUtils.js"); + + + + + + + + + +const BIDDER_CODE = 'rtbhouse'; +const REGIONS = ['prebid-eu', 'prebid-us', 'prebid-asia']; +const ENDPOINT_URL = 'creativecdn.com/bidder/prebid/bids'; +const FLEDGE_ENDPOINT_URL = 'creativecdn.com/bidder/prebidfledge/bids'; +const FLEDGE_SELLER_URL = 'https://fledge-ssp.creativecdn.com'; +const FLEDGE_DECISION_LOGIC_URL = 'https://fledge-ssp.creativecdn.com/component-seller-prebid.js'; +const DEFAULT_CURRENCY_ARR = ['USD']; // NOTE - USD is the only supported currency right now; Hardcoded for bids +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const TTL = 55; +const GVLID = 16; +const DSA_ATTRIBUTES = [{ + name: 'dsarequired', + 'min': 0, + 'max': 3 +}, { + name: 'pubrender', + 'min': 0, + 'max': 2 +}, { + name: 'datatopub', + 'min': 0, + 'max': 2 +}]; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + gvlid: GVLID, + isBidRequestValid: function (bid) { + return !!((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(REGIONS, bid.params.region) && bid.params.publisherId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const request = { + id: bidderRequest.bidderRequestId, + imp: validBidRequests.map(slot => mapImpression(slot, bidderRequest)), + site: mapSite(validBidRequests, bidderRequest), + cur: DEFAULT_CURRENCY_ARR, + test: validBidRequests[0].params.test || 0, + source: mapSource(validBidRequests[0], bidderRequest) + }; + if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + const consentStr = bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') : ''; + const gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + request.regs = { + ext: { + gdpr: gdpr + } + }; + request.user = { + ext: { + consent: consentStr + } + }; + } + if (validBidRequests[0].schain) { + const schain = mapSchain(validBidRequests[0].schain); + if (schain) { + request.ext = { + schain: schain + }; + } + } + if (validBidRequests[0].userIdAsEids) { + const eids = { + eids: validBidRequests[0].userIdAsEids + }; + if (request.user && request.user.ext) { + request.user.ext = { + ...request.user.ext, + ...eids + }; + } else { + request.user = { + ext: eids + }; + } + } + const ortb2Params = bidderRequest?.ortb2 || {}; + ['site', 'user', 'device', 'bcat', 'badv'].forEach(entry => { + const ortb2Param = ortb2Params[entry]; + if (ortb2Param) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(request, { + [entry]: ortb2Param + }); + } + }); + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(ortb2Params, 'regs.ext.dsa'); + if (validateDSA(dsa)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(request, { + regs: { + ext: { + dsa + } + } + }); + } + let computedEndpointUrl = ENDPOINT_URL; + if (bidderRequest.paapi?.enabled) { + const fromConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('paapiConfig') || _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('fledgeConfig') || { + sellerTimeout: 500 + }; + const fledgeConfig = { + seller: FLEDGE_SELLER_URL, + decisionLogicUrl: FLEDGE_DECISION_LOGIC_URL, + ...fromConfig + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(request, { + ext: { + fledge_config: fledgeConfig + } + }); + computedEndpointUrl = FLEDGE_ENDPOINT_URL; + } + return { + method: 'POST', + url: 'https://' + validBidRequests[0].params.region + '.' + computedEndpointUrl, + data: JSON.stringify(request) + }; + }, + interpretOrtbResponse: function (serverResponse, originalRequest) { + const responseBody = serverResponse.body; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(responseBody)) { + return []; + } + const bids = []; + responseBody.forEach(serverBid => { + if (!serverBid.price) { + // price may exist and is === 0 or there's no price prop at all (fledge req case) + return; + } + let interpretedBid; + + // try...catch would be risky cause JSON.parse throws SyntaxError + if (serverBid.adm.indexOf('{') === 0) { + interpretedBid = (0,_libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.interpretNativeBid)(serverBid); + } else { + interpretedBid = interpretBannerBid(serverBid); + } + if (serverBid.ext) { + interpretedBid.ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.deepClone)(serverBid.ext); + if (serverBid.ext.dsa) { + interpretedBid.meta = Object.assign({}, interpretedBid.meta, { + dsa: serverBid.ext.dsa + }); + } + } + bids.push(interpretedBid); + }); + return bids; + }, + interpretResponse: function (serverResponse, originalRequest) { + let bids; + const responseBody = serverResponse.body; + let fledgeAuctionConfigs = null; + if (responseBody.bidid && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(responseBody?.ext?.igbid)) { + // we have fledge response + // mimic the original response ([{},...]) + bids = this.interpretOrtbResponse({ + body: responseBody.seatbid[0]?.bid + }, originalRequest); + const paapiAdapterConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('paapiConfig') || _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('fledgeConfig') || {}; + const fledgeInterestGroupBuyers = paapiAdapterConfig.interestGroupBuyers || []; + // values from the response.ext are the most important + const { + decisionLogicUrl = paapiAdapterConfig.decisionLogicUrl || paapiAdapterConfig.decisionLogicURL || FLEDGE_DECISION_LOGIC_URL, + seller = paapiAdapterConfig.seller || FLEDGE_SELLER_URL, + sellerTimeout = 500 + } = responseBody.ext; + const fledgeConfig = { + seller, + decisionLogicUrl, + decisionLogicURL: decisionLogicUrl, + sellerTimeout + }; + // fledgeConfig settings are more important; other paapiAdapterConfig settings are facultative + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)(fledgeConfig, paapiAdapterConfig, fledgeConfig); + responseBody.ext.igbid.forEach(igbid => { + const perBuyerSignals = { + ...fledgeConfig.perBuyerSignals + }; // may come from paapiAdapterConfig + igbid.igbuyer.forEach(buyerItem => { + perBuyerSignals[buyerItem.igdomain] = buyerItem.buyersignal; + }); + fledgeAuctionConfigs = fledgeAuctionConfigs || {}; + fledgeAuctionConfigs[igbid.impid] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.mergeDeep)({}, fledgeConfig, { + interestGroupBuyers: [...new Set([...fledgeInterestGroupBuyers, ...Object.keys(perBuyerSignals)])], + perBuyerSignals + }); + }); + } else { + bids = this.interpretOrtbResponse(serverResponse, originalRequest); + } + if (fledgeAuctionConfigs) { + fledgeAuctionConfigs = Object.entries(fledgeAuctionConfigs).map(_ref => { + let [bidId, cfg] = _ref; + return { + bidId, + config: Object.assign({ + auctionSignals: {} + }, cfg) + }; + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('Response with FLEDGE:', { + bids, + fledgeAuctionConfigs + }); + return { + bids, + paapi: fledgeAuctionConfigs + }; + } + return bids; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {number} floor by imp type + */ +function applyFloor(slot) { + const floors = []; + if (typeof slot.getFloor === 'function') { + Object.keys(slot.mediaTypes).forEach(type => { + if ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)(SUPPORTED_MEDIA_TYPES, type)) { + floors.push(slot.getFloor({ + currency: DEFAULT_CURRENCY_ARR[0], + mediaType: type, + size: slot.sizes || '*' + })?.floor); + } + }); + } + return floors.length > 0 ? Math.max(...floors) : parseFloat(slot.params.bidfloor); +} + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {object} Imp by OpenRTB 2.5 §3.2.4 + */ +function mapImpression(slot, bidderRequest) { + const imp = { + id: slot.bidId, + banner: mapBanner(slot), + native: mapNative(slot), + tagid: slot.adUnitCode.toString() + }; + const bidfloor = applyFloor(slot); + if (bidfloor) { + imp.bidfloor = bidfloor; + } + if (bidderRequest.paapi?.enabled) { + imp.ext = imp.ext || {}; + imp.ext.ae = slot?.ortb2Imp?.ext?.ae; + } else { + if (imp.ext?.ae) { + delete imp.ext.ae; + } + } + const tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(slot, 'ortb2Imp.ext.tid'); + if (tid) { + imp.ext = imp.ext || {}; + imp.ext.tid = tid; + } + return imp; +} + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {object} Banner by OpenRTB 2.5 §3.2.6 + */ +function mapBanner(slot) { + if (slot.mediaType === 'banner' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(slot, 'mediaTypes.banner') || !slot.mediaType && !slot.mediaTypes) { + var sizes = slot.sizes || slot.mediaTypes.banner.sizes; + return { + w: sizes[0][0], + h: sizes[0][1], + format: sizes.map(size => ({ + w: size[0], + h: size[1] + })) + }; + } +} + +/** + * @param {object} slot Ad Unit Params by Prebid + * @param {object} bidderRequest by Prebid + * @returns {object} Site by OpenRTB 2.5 §3.2.13 + */ +function mapSite(slot, bidderRequest) { + let pubId = 'unknown'; + let channel = null; + if (slot && slot.length > 0) { + pubId = slot[0].params.publisherId; + channel = slot[0].params.channel && slot[0].params.channel.toString().slice(0, 50); + } + let siteData = { + publisher: { + id: pubId.toString() + }, + page: bidderRequest.refererInfo.page, + name: (0,_libraries_getOrigin_index_js__WEBPACK_IMPORTED_MODULE_8__.getOrigin)() + }; + if (channel) { + siteData.channel = channel; + } + return siteData; +} + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {object} Source by OpenRTB 2.5 §3.2.2 + */ +function mapSource(slot, bidderRequest) { + const source = { + tid: bidderRequest?.auctionId || '' + }; + return source; +} + +/** + * @param {object} schain object set by Publisher + * @returns {object} OpenRTB SupplyChain object + */ +function mapSchain(schain) { + if (!schain) { + return null; + } + if (!validateSchain(schain)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('RTB House: required schain params missing'); + return null; + } + return schain; +} + +/** + * @param {object} schain object set by Publisher + * @returns {object} bool + */ +function validateSchain(schain) { + if (!schain.nodes) { + return false; + } + const requiredFields = ['asi', 'sid', 'hp']; + return schain.nodes.every(node => { + return requiredFields.every(field => node[field]); + }); +} + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {object} Request by OpenRTB Native Ads 1.1 §4 + */ +function mapNative(slot) { + if (slot.mediaType === 'native' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(slot, 'mediaTypes.native')) { + return { + request: { + assets: mapNativeAssets(slot) + }, + ver: '1.1' + }; + } +} + +/** + * @param {object} slot Slot config by Prebid + * @returns {Array} Request Assets by OpenRTB Native Ads 1.1 §4.2 + */ +function mapNativeAssets(slot) { + const params = slot.nativeParams || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(slot, 'mediaTypes.native'); + const assets = []; + if (params.title) { + assets.push({ + id: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.ASSET_ID.TITLE, + required: params.title.required ? 1 : 0, + title: { + len: params.title.len || 25 + } + }); + } + if (params.image) { + assets.push({ + id: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.ASSET_ID.IMAGE, + required: params.image.required ? 1 : 0, + img: mapNativeImage(params.image, _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.IMAGE_TYPE.MAIN) + }); + } + if (params.icon) { + assets.push({ + id: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.ASSET_ID.ICON, + required: params.icon.required ? 1 : 0, + img: mapNativeImage(params.icon, _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.IMAGE_TYPE.ICON) + }); + } + if (params.sponsoredBy) { + assets.push({ + id: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.ASSET_ID.SPONSORED, + required: params.sponsoredBy.required ? 1 : 0, + data: { + type: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.DATA_ASSET_TYPE.SPONSORED, + len: params.sponsoredBy.len + } + }); + } + if (params.body) { + assets.push({ + id: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.ASSET_ID.BODY, + required: params.body.request ? 1 : 0, + data: { + type: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.DATA_ASSET_TYPE.DESC, + len: params.body.len + } + }); + } + if (params.cta) { + assets.push({ + id: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.ASSET_ID.CTA, + required: params.cta.required ? 1 : 0, + data: { + type: _libraries_precisoUtils_bidNativeUtils_js__WEBPACK_IMPORTED_MODULE_6__.OPENRTB.NATIVE.DATA_ASSET_TYPE.CTA_TEXT, + len: params.cta.len + } + }); + } + return assets; +} + +/** + * @param {object} image Prebid native.image/icon + * @param {number} type Image or icon code + * @returns {object} Request Image by OpenRTB Native Ads 1.1 §4.4 + */ +function mapNativeImage(image, type) { + const img = { + type: type + }; + if (image.aspect_ratios) { + const ratio = image.aspect_ratios[0]; + const minWidth = ratio.min_width || 100; + img.wmin = minWidth; + img.hmin = minWidth / ratio.ratio_width * ratio.ratio_height; + } + if (image.sizes) { + const size = Array.isArray(image.sizes[0]) ? image.sizes[0] : image.sizes; + img.w = size[0]; + img.h = size[1]; + } + return img; +} + +/** + * @param {object} serverBid Bid by OpenRTB 2.5 §4.2.3 + * @returns {object} Prebid banner bidObject + */ +function interpretBannerBid(serverBid) { + return { + requestId: serverBid.impid, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + cpm: serverBid.price, + creativeId: serverBid.adid, + ad: serverBid.adm, + width: serverBid.w, + height: serverBid.h, + ttl: TTL, + meta: { + advertiserDomains: serverBid.adomain + }, + netRevenue: true, + currency: 'USD' + }; +} + +/** + * https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/dsa_transparency.md + * + * @param {object} dsa + * @returns {boolean} whether dsa object contains valid attributes values + */ +function validateDSA(dsa) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(dsa) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(dsa)) return false; + return DSA_ATTRIBUTES.reduce((prev, attr) => { + const dsaEntry = dsa[attr.name]; + return prev && (!dsa.hasOwnProperty(attr.name) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(dsaEntry) && dsaEntry >= attr.min && dsaEntry <= attr.max); + }, true) && (!dsa.hasOwnProperty('transparency') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(dsa.transparency) && dsa.transparency.every(v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isPlainObject)(v) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(v.domain) && v.domain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isArray)(v.dsaparams) && v.dsaparams.every(x => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(x)))); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('rtbhouseBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["precisoUtils","getOrigin","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rtbhouseBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rtbsapeBidAdapter"],{ + +/***/ "./modules/rtbsapeBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/rtbsapeBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'rtbsape'; +const ENDPOINT = 'https://ssp-rtb.sape.ru/prebid'; +const RENDERER_SRC = 'https://cdn-rtb.sape.ru/js/player.js'; +const MATCH_SRC = 'https://www.acint.net/mc/?dp=141'; +const spec = { + code: BIDDER_CODE, + aliases: ['sape'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid && bid.mediaTypes && (bid.mediaTypes.banner || bid.mediaTypes.video) && bid.params && bid.params.placeId); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests an array of bids + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + let tz = new Date().getTimezoneOffset(); + let padInt = v => v < 10 ? '0' + v : '' + v; + return { + url: ENDPOINT, + method: 'POST', + data: { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidderRequest.auctionId, + requestId: bidderRequest.bidderRequestId, + bids: validBidRequests, + timezone: (tz > 0 ? '-' : '+') + padInt(Math.floor(Math.abs(tz) / 60)) + ':' + padInt(Math.abs(tz) % 60), + // TODO: please do not send internal data structures over the network + refererInfo: bidderRequest.refererInfo.legacy + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {{data: {bids: [{mediaTypes: {banner: boolean}}]}}} bidRequest Info describing the request to the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + if (!(serverResponse.body && Array.isArray(serverResponse.body.bids))) { + return []; + } + let bids = {}; + bidRequest.data.bids.forEach(bid => bids[bid.bidId] = bid); + return serverResponse.body.bids.filter(bid => typeof (bid.meta || {}).advertiserDomains !== 'undefined').map(bid => { + let requestBid = bids[bid.requestId]; + let context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(requestBid, 'mediaTypes.video.context'); + if (context === _src_video_js__WEBPACK_IMPORTED_MODULE_2__.OUTSTREAM && (bid.vastUrl || bid.vastXml)) { + let renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: bid.requestId, + url: RENDERER_SRC, + loaded: false + }); + let muted = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(requestBid, 'params.video.playerMuted'); + if (typeof muted === 'undefined') { + muted = true; + } + bid.playerMuted = muted; + bid.renderer = renderer; + renderer.setRender(setOutstreamRenderer); + } + return bid; + }); + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions) { + const sync = []; + if (syncOptions.iframeEnabled) { + sync.push({ + type: 'iframe', + url: MATCH_SRC + }); + } + return sync; + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Bid} bid The bid that won the auction + */ + onBidWon: function (bid) { + if (bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.triggerPixel)(bid.nurl); + } + } +}; + +/** + * Initialize RtbSape outstream player + * + * @param bid + */ +function setOutstreamRenderer(bid) { + let props = {}; + if (bid.vastUrl) { + props.url = bid.vastUrl; + } + if (bid.vastXml) { + props.xml = bid.vastXml; + } + bid.renderer.push(() => { + let player = window.sapeRtbPlayerHandler(bid.adUnitCode, bid.width, bid.height, bid.playerMuted, { + singleton: true + }); + props.onComplete = () => player.destroy(); + props.onError = () => player.destroy(); + player.addSlot(props); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('rtbsapeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rtbsapeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rtdModule"],{ + +/***/ "./modules/rtdModule/index.js": +/*!************************************!*\ + !*** ./modules/rtdModule/index.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports subModules, attachRealTimeDataProvider, init, setBidRequestsData, getAdUnitTargeting, deepMerge, onDataDeletionRequest */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/consentHandler.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_objectGuard_ortbGuard_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../libraries/objectGuard/ortbGuard.js */ "./libraries/objectGuard/ortbGuard.js"); +/* harmony import */ var _src_activities_params_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/activities/params.js */ "./src/activities/params.js"); + +/** + * This module adds Real time data support to prebid.js + * @module modules/realTimeData + * @typedef {import('../../modules/rtdModule/index.js').SubmoduleConfig} SubmoduleConfig + */ + +/** + * @interface UserConsentData + */ +/** + * @property + * @summary gdpr consent + * @name UserConsentData#gdpr + * @type {Object} + */ +/** + * @property + * @summary usp consent + * @name UserConsentData#usp + * @type {Object} + */ +/** + * @property + * @summary coppa + * @name UserConsentData#coppa + * @type {boolean} + */ + +/** + * @interface RtdSubmodule + */ + +/** + * @function + * @summary return real time data + * @name RtdSubmodule#getTargetingData + * @param {string[]} adUnitsCodes + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + * @param {auction} auction + */ + +/** + * @function + * @summary modify bid request data + * @name RtdSubmodule#getBidRequestData + * @param {Object} reqBidsConfigObj + * @param {function} callback + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + +/** + * @property + * @summary used to link submodule with config + * @name RtdSubmodule#name + * @type {string} + */ + +/** + * @property + * @summary used to link submodule with config + * @name RtdSubmodule#config + * @type {Object} + */ + +/** + * @function + * @summary init sub module + * @name RtdSubmodule#init + * @param {SubmoduleConfig} config + * @param {UserConsentData} user consent + * @return {boolean} false to remove sub module + */ + +/** + * @function + * @summary on auction init event + * @name RtdSubmodule#onAuctionInitEvent + * @param {Object} data + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + +/** + * @function + * @summary on auction end event + * @name RtdSubmodule#onAuctionEndEvent + * @param {Object} data + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + +/** + * @function + * @summary on bid response event + * @name RtdSubmodule#onBidResponseEvent + * @param {Object} data + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + +/** + * @function + * @summary on bid requested event + * @name RtdSubmodule#onBidRequestEvent + * @param {Object} data + * @param {SubmoduleConfig} config + * @param {UserConsentData} userConsent + */ + +/** + * @function + * @summary on data deletion request + * @name RtdSubmodule#onDataDeletionRequest + * @param {SubmoduleConfig} config + */ + +/** + * @interface ModuleConfig + */ + +/** + * @property + * @summary auction delay + * @name ModuleConfig#auctionDelay + * @type {number} + */ + +/** + * @property + * @summary list of sub modules + * @name ModuleConfig#dataProviders + * @type {SubmoduleConfig[]} + */ + +/** + * @interface SubModuleConfig + */ + +/** + * @property + * @summary params for provide (sub module) + * @name SubModuleConfig#params + * @type {Object} + */ + +/** + * @property + * @summary name + * @name ModuleConfig#name + * @type {string} + */ + +/** + * @property + * @summary delay auction for this sub module + * @name ModuleConfig#waitForIt + * @type {boolean} + */ + + + + + + + + + + + + + +const activityParams = (0,_src_activities_params_js__WEBPACK_IMPORTED_MODULE_0__.activityParamsBuilder)(al => _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].resolveAlias(al)); + +/** @type {string} */ +const MODULE_NAME = 'realTimeData'; +/** @type {RtdSubmodule[]} */ +let registeredSubModules = []; +/** @type {RtdSubmodule[]} */ +let subModules = []; +/** @type {ModuleConfig} */ +let _moduleConfig; +/** @type {SubmoduleConfig[]} */ +let _dataProviders = []; +/** @type {UserConsentData} */ +let _userConsent; + +/** + * Register a Real-Time Data (RTD) submodule. + * + * @param {Object} submodule The RTD submodule to register. + * @param {string} submodule.name The name of the RTD submodule. + * @param {number} [submodule.gvlid] The Global Vendor List ID (GVLID) of the RTD submodule. + * @returns {function(): void} A de-registration function that will unregister the module when called. + */ +function attachRealTimeDataProvider(submodule) { + registeredSubModules.push(submodule); + _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__.GDPR_GVLIDS.register(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_RTD, submodule.name, submodule.gvlid); + return function detach() { + const idx = registeredSubModules.indexOf(submodule); + if (idx >= 0) { + registeredSubModules.splice(idx, 1); + initSubModules(); + } + }; +} + +/** + * call each sub module event function by config order + */ +const setEventsListeners = function () { + let registered = false; + return function setEventsListeners() { + if (!registered) { + Object.entries({ + [_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_INIT]: ['onAuctionInitEvent'], + [_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END]: ['onAuctionEndEvent', getAdUnitTargeting], + [_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_RESPONSE]: ['onBidResponseEvent'], + [_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_REQUESTED]: ['onBidRequestEvent'], + [_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_ACCEPTED]: ['onBidAcceptedEvent'] + }).forEach(_ref => { + let [ev, [handler, preprocess]] = _ref; + _src_events_js__WEBPACK_IMPORTED_MODULE_5__.on(ev, args => { + preprocess && preprocess(args); + subModules.forEach(sm => { + try { + sm[handler] && sm[handler](args, sm.config, _userConsent); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(`RTD provider '${sm.name}': error in '${handler}':`, e); + } + }); + }); + }); + registered = true; + } + }; +}(); +function init(config) { + const confListener = config.getConfig(MODULE_NAME, _ref2 => { + let { + realTimeData + } = _ref2; + if (!realTimeData.dataProviders) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)('missing parameters for real time module'); + return; + } + confListener(); // unsubscribe config listener + _moduleConfig = realTimeData; + _dataProviders = realTimeData.dataProviders; + setEventsListeners(); + (0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.getHook)('startAuction').before(setBidRequestsData, 20); // RTD should run before FPD + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].callDataDeletionRequest.before(onDataDeletionRequest); + initSubModules(); + }); +} +function getConsentData() { + return { + gdpr: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__.gdprDataHandler.getConsentData(), + usp: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__.uspDataHandler.getConsentData(), + gpp: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_2__.gppDataHandler.getConsentData(), + coppa: !!_src_config_js__WEBPACK_IMPORTED_MODULE_8__.config.getConfig('coppa') + }; +} + +/** + * call each sub module init function by config order + * if no init function / init return failure / module not configured - remove it from submodules list + */ +function initSubModules() { + _userConsent = getConsentData(); + let subModulesByOrder = []; + _dataProviders.forEach(provider => { + const sm = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_9__.find)(registeredSubModules, s => s.name === provider.name); + const initResponse = sm && sm.init && sm.init(provider, _userConsent); + if (initResponse) { + subModulesByOrder.push(Object.assign(sm, { + config: provider + })); + } + }); + subModules = subModulesByOrder; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)(`Real time data module enabled, using submodules: ${subModules.map(m => m.name).join(', ')}`); +} + +/** + * loop through configured data providers If the data provider has registered getBidRequestData, + * call it, providing reqBidsConfigObj, consent data and module params + * this allows submodules to modify bidders + * @param {Object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + * @param {function} fn required; The next function in the chain, used by hook.js + */ +const setBidRequestsData = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_10__.timedAuctionHook)('rtd', function setBidRequestsData(fn, reqBidsConfigObj) { + _userConsent = getConsentData(); + const relevantSubModules = []; + const prioritySubModules = []; + subModules.forEach(sm => { + if (typeof sm.getBidRequestData !== 'function') { + return; + } + relevantSubModules.push(sm); + const config = sm.config; + if (config && config.waitForIt) { + prioritySubModules.push(sm); + } + }); + const shouldDelayAuction = prioritySubModules.length && _moduleConfig.auctionDelay && _moduleConfig.auctionDelay > 0; + let callbacksExpected = prioritySubModules.length; + let isDone = false; + let waitTimeout; + const verifiers = []; + if (!relevantSubModules.length) { + return exitHook(); + } + const timeout = shouldDelayAuction ? _moduleConfig.auctionDelay : 0; + waitTimeout = setTimeout(exitHook, timeout); + relevantSubModules.forEach(sm => { + const fpdGuard = (0,_libraries_objectGuard_ortbGuard_js__WEBPACK_IMPORTED_MODULE_11__.guardOrtb2Fragments)(reqBidsConfigObj.ortb2Fragments || {}, activityParams(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_3__.MODULE_TYPE_RTD, sm.name)); + verifiers.push(fpdGuard.verify); + reqBidsConfigObj.ortb2Fragments = fpdGuard.obj; + sm.getBidRequestData(reqBidsConfigObj, onGetBidRequestDataCallback.bind(sm), sm.config, _userConsent, timeout); + }); + function onGetBidRequestDataCallback() { + if (isDone) { + return; + } + if (this.config && this.config.waitForIt) { + callbacksExpected--; + } + if (callbacksExpected === 0) { + setTimeout(exitHook, 0); + } + } + function exitHook() { + if (isDone) { + return; + } + isDone = true; + clearTimeout(waitTimeout); + verifiers.forEach(fn => fn()); + fn.call(this, reqBidsConfigObj); + } +}); + +/** + * loop through configured data providers If the data provider has registered getTargetingData, + * call it, providing ad unit codes, consent data and module params + * the sub mlodle will return data to set on the ad unit + * this function used to place key values on primary ad server per ad unit + * @param {Object} auction object received on auction end event + */ +function getAdUnitTargeting(auction) { + const relevantSubModules = subModules.filter(sm => typeof sm.getTargetingData === 'function'); + if (!relevantSubModules.length) { + return; + } + + // get data + const adUnitCodes = auction.adUnitCodes; + if (!adUnitCodes) { + return; + } + let targeting = []; + for (let i = relevantSubModules.length - 1; i >= 0; i--) { + const smTargeting = relevantSubModules[i].getTargetingData(adUnitCodes, relevantSubModules[i].config, _userConsent, auction); + if (smTargeting && typeof smTargeting === 'object') { + targeting.push(smTargeting); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logWarn)('invalid getTargetingData response for sub module', relevantSubModules[i].name); + } + } + // place data on auction adUnits + const mergedTargeting = deepMerge(targeting); + auction.adUnits.forEach(adUnit => { + const kv = adUnit.code && mergedTargeting[adUnit.code]; + if (!kv) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logInfo)('RTD set ad unit targeting of', kv, 'for', adUnit); + adUnit[_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.JSON_MAPPING.ADSERVER_TARGETING] = Object.assign(adUnit[_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.JSON_MAPPING.ADSERVER_TARGETING] || {}, kv); + }); + return auction.adUnits; +} + +/** + * deep merge array of objects + * @param {Array} arr - objects array + * @return {Object} merged object + */ +function deepMerge(arr) { + if (!Array.isArray(arr) || !arr.length) { + return {}; + } + return arr.reduce((merged, obj) => { + for (let key in obj) { + if (obj.hasOwnProperty(key)) { + if (!merged.hasOwnProperty(key)) merged[key] = obj[key];else { + // duplicate key - merge values + const dp = obj[key]; + for (let dk in dp) { + if (dp.hasOwnProperty(dk)) merged[key][dk] = dp[dk]; + } + } + } + } + return merged; + }, {}); +} +function onDataDeletionRequest(next) { + subModules.forEach(sm => { + if (typeof sm.onDataDeletionRequest === 'function') { + try { + sm.onDataDeletionRequest(sm.config); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.logError)(`Error executing ${sm.name}.onDataDeletionRequest`, e); + } + } + }); + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + next.apply(this, args); +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_7__.module)('realTimeData', attachRealTimeDataProvider); +init(_src_config_js__WEBPACK_IMPORTED_MODULE_8__.config); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('rtdModule'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["objectGuard","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rtdModule/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["rubiconBidAdapter"],{ + +/***/ "./modules/rubiconBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/rubiconBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec, classifiedAsVideo, resetRubiConf, resetImpIdMap, masSizeOrdering, determineRubiconVideoSizeId, getPriceGranularity, hasValidVideoParams, hasValidSupplyChainParams, encodeParam, resetUserSync */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/pbsExtensions/pbsExtensions.js */ "./libraries/pbsExtensions/pbsExtensions.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../libraries/keywords/keywords.js */ "./libraries/keywords/keywords.js"); +/* harmony import */ var _libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/userSyncUtils/userSyncUtils.js */ "./libraries/userSyncUtils/userSyncUtils.js"); + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const DEFAULT_INTEGRATION = 'pbjs_lite'; +const DEFAULT_PBS_INTEGRATION = 'pbjs'; +const DEFAULT_RENDERER_URL = 'https://video-outstream.rubiconproject.com/apex-2.2.1.js'; +// renderer code at https://github.com/rubicon-project/apex2 + +let rubiConf = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('rubicon') || {}; +// we are saving these as global to this module so that if a pub accidentally overwrites the entire +// rubicon object, then we do not lose other data +_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('rubicon', config => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(rubiConf, config.rubicon); +}); +const GVLID = 52; +let impIdMap = {}; +var sizeMap = { + 1: '468x60', + 2: '728x90', + 5: '120x90', + 7: '125x125', + 8: '120x600', + 9: '160x600', + 10: '300x600', + 13: '200x200', + 14: '250x250', + 15: '300x250', + 16: '336x280', + 17: '240x400', + 19: '300x100', + 31: '980x120', + 32: '250x360', + 33: '180x500', + 35: '980x150', + 37: '468x400', + 38: '930x180', + 39: '750x100', + 40: '750x200', + 41: '750x300', + 42: '2x4', + 43: '320x50', + 44: '300x50', + 48: '300x300', + 53: '1024x768', + 54: '300x1050', + 55: '970x90', + 57: '970x250', + 58: '1000x90', + 59: '320x80', + 60: '320x150', + 61: '1000x1000', + 64: '580x500', + 65: '640x480', + 66: '930x600', + 67: '320x480', + 68: '1800x1000', + 72: '320x320', + 73: '320x160', + 78: '980x240', + 79: '980x300', + 80: '980x400', + 83: '480x300', + 85: '300x120', + 90: '548x150', + 94: '970x310', + 95: '970x100', + 96: '970x210', + 101: '480x320', + 102: '768x1024', + 103: '480x280', + 105: '250x800', + 108: '320x240', + 113: '1000x300', + 117: '320x100', + 125: '800x250', + 126: '200x600', + 144: '980x600', + 145: '980x150', + 152: '1000x250', + 156: '640x320', + 159: '320x250', + 179: '250x600', + 195: '600x300', + 198: '640x360', + 199: '640x200', + 213: '1030x590', + 214: '980x360', + 221: '1x1', + 229: '320x180', + 230: '2000x1400', + 232: '580x400', + 234: '6x6', + 251: '2x2', + 256: '480x820', + 257: '400x600', + 258: '500x200', + 259: '998x200', + 261: '480x480', + 264: '970x1000', + 265: '1920x1080', + 274: '1800x200', + 278: '320x500', + 282: '320x400', + 288: '640x380', + 484: '720x1280', + 524: '1x2', + 548: '500x1000', + 550: '980x480', + 552: '300x200', + 558: '640x640', + 562: '300x431', + 564: '320x431', + 566: '320x300', + 568: '300x150', + 570: '300x125', + 572: '250x350', + 574: '620x891', + 576: '610x877', + 578: '980x552', + 580: '505x656', + 622: '192x160', + 632: '1200x450', + 634: '340x450', + 680: '970x570', + 682: '300x240', + 684: '970x550', + 686: '300x210', + 688: '300x220', + 690: '970x170', + 710: '600x250', + 712: '340x430' +}; +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(sizeMap, (item, key) => sizeMap[item] = key); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_2__.ortbConverter)({ + request(buildRequest, imps, bidderRequest, context) { + const { + bidRequests + } = context; + const data = buildRequest(imps, bidderRequest, context); + data.cur = ['USD']; + data.test = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('debug') ? 1 : 0; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'ext.prebid.cache', { + vastxml: { + returnCreative: rubiConf.returnVast === true + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'ext.prebid.bidders', { + rubicon: { + integration: rubiConf.int_type || DEFAULT_PBS_INTEGRATION + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'ext.prebid.targeting.pricegranularity', getPriceGranularity(_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config)); + let modules = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().installedModules; + if (modules && (!modules.length || modules.indexOf('rubiconAnalyticsAdapter') !== -1)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'ext.prebid.analytics', { + 'rubicon': { + 'client-analytics': true + } + }); + } + addOrtbFirstPartyData(data, bidRequests, bidderRequest.ortb2); + delete data?.ext?.prebid?.storedrequest; + + // floors + if (rubiConf.disableFloors === true) { + delete data.ext.prebid.floors; + } + + // If the price floors module is active, then we need to signal to PBS! If floorData obj is present is best way to check + const haveFloorDataBidRequests = bidRequests.filter(bidRequest => typeof bidRequest.floorData === 'object'); + if (haveFloorDataBidRequests.length > 0) { + data.ext.prebid.floors = { + enabled: false + }; + } + return data; + }, + imp(buildImp, bidRequest, context) { + // skip banner-only requests + const bidRequestType = bidType(bidRequest); + if (bidRequestType.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) && bidRequestType.length == 1) return; + const imp = buildImp(bidRequest, context); + imp.id = bidRequest.adUnitCode; + delete imp.banner; + bidRequest.params.position === 'atf' && imp.video && (imp.video.pos = 1); + bidRequest.params.position === 'btf' && imp.video && (imp.video.pos = 3); + delete imp.ext?.prebid?.storedrequest; + if (bidRequest.params.bidonmultiformat === true && bidRequestType.length > 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'ext.prebid.bidder.rubicon.formats', bidRequestType); + } + setBidFloors(bidRequest, imp); + + // ensure unique imp IDs for twin adunits + imp.id = impIdMap[imp.id] ? imp.id + impIdMap[imp.id]++ : (impIdMap[imp.id] = 2, imp.id); + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.meta.mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'ext.prebid.type'); + const { + bidRequest + } = context; + let [parseSizeWidth, parseSizeHeight] = bidRequest.mediaTypes.video?.context === 'outstream' ? parseSizes(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) : [undefined, undefined]; + // 0 by default to avoid undefined size + bidResponse.width = bid.w || parseSizeWidth || bidResponse.playerWidth || 0; + bidResponse.height = bid.h || parseSizeHeight || bidResponse.playerHeight || 0; + if (bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO && bidRequest.mediaTypes.video.context === 'outstream') { + bidResponse.renderer = outstreamRenderer(bidResponse); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'ext.bidder.rp.advid')) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidResponse, 'meta.advertiserId', bid.ext.bidder.rp.advid); + } + return bidResponse; + }, + context: { + netRevenue: rubiConf.netRevenue !== false, + // If anything other than false, netRev is true + ttl: 360 + }, + processors: _libraries_pbsExtensions_pbsExtensions_js__WEBPACK_IMPORTED_MODULE_7__.pbsExtensions +}); +const spec = { + code: 'rubicon', + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE], + /** + * @param {object} bid + * @return boolean + */ + isBidRequestValid: function (bid) { + let valid = true; + if (typeof bid.params !== 'object') { + return false; + } + // validate account, site, zone have numeric values + for (let i = 0, props = ['accountId', 'siteId', 'zoneId']; i < props.length; i++) { + bid.params[props[i]] = parseInt(bid.params[props[i]]); + if (isNaN(bid.params[props[i]])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: wrong format of accountId or siteId or zoneId.'); + return false; + } + } + let bidFormats = bidType(bid, true); + // bidType is undefined? Return false + if (!bidFormats.length) { + return false; + } else if (bidFormats.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO)) { + // bidType is video, make sure it has required params + valid = hasValidVideoParams(bid); + } + const hasBannerOrNativeMediaType = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE].filter(mediaType => bidFormats.includes(mediaType)).length > 0; + if (!hasBannerOrNativeMediaType) return valid; + return valid && hasBannerOrNativeMediaType; + }, + /** + * @param {BidRequest[]} bidRequests + * @param bidderRequest + * @return BidRequest[] + */ + buildRequests: function (bidRequests, bidderRequest) { + // separate video bids because the requests are structured differently + let requests = []; + let filteredHttpRequest = []; + let filteredRequests; + filteredRequests = bidRequests.filter(req => { + const mediaTypes = bidType(req) || []; + const { + length + } = mediaTypes; + const { + bidonmultiformat, + video + } = req.params || {}; + return ( + // if there's just one mediaType and it's video or native, just send it! + length === 1 && (mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) || mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE)) || + // if it's two mediaTypes, and they don't contain banner, send to PBS both native & video + length === 2 && !mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) || + // if it contains the video param and the Video mediaType, send Video to PBS (not native!) + video && mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) || + // if bidonmultiformat is on, send everything to PBS + bidonmultiformat && (mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) || mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE)) + ); + }); + if (filteredRequests && filteredRequests.length) { + const data = converter.toORTB({ + bidRequests: filteredRequests, + bidderRequest + }); + resetImpIdMap(); + filteredHttpRequest.push({ + method: 'POST', + url: `https://${rubiConf.videoHost || 'prebid-server'}.rubiconproject.com/openrtb2/auction`, + data, + bidRequest: filteredRequests + }); + } + const bannerBidRequests = bidRequests.filter(req => { + const mediaTypes = bidType(req) || []; + const { + bidonmultiformat, + video + } = req.params || {}; + return ( + // Send to fastlane if: it must include BANNER and... + mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) && ( + // if it's just banner + mediaTypes.length === 1 || + // if bidonmultiformat is true + bidonmultiformat || + // if bidonmultiformat is false and there's no video parameter + !bidonmultiformat && !video || + // if there's video parameter, but there's no video mediatype + !bidonmultiformat && video && !mediaTypes.includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO)) + ); + }); + if (rubiConf.singleRequest !== true) { + // bids are not grouped if single request mode is not enabled + requests = filteredHttpRequest.concat(bannerBidRequests.map(bidRequest => { + const bidParams = spec.createSlotParams(bidRequest, bidderRequest); + return { + method: 'GET', + url: `https://${rubiConf.bannerHost || 'fastlane'}.rubiconproject.com/a/api/fastlane.json`, + data: spec.getOrderedParams(bidParams).reduce((paramString, key) => { + const propValue = bidParams[key]; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(propValue) && propValue !== '' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(propValue) ? `${paramString}${encodeParam(key, propValue)}&` : paramString; + }, '') + `slots=1&rand=${Math.random()}`, + bidRequest + }; + })); + } else { + // single request requires bids to be grouped by site id into a single request + // note: groupBy wasn't used because deep property access was needed + const groupedBidRequests = bannerBidRequests.reduce((groupedBids, bid) => { + (groupedBids[bid.params['siteId']] = groupedBids[bid.params['siteId']] || []).push(bid); + return groupedBids; + }, {}); + + // fastlane SRA has a limit of 10 slots + const SRA_BID_LIMIT = 10; + + // multiple requests are used if bids groups have more than 10 bids + requests = filteredHttpRequest.concat(Object.keys(groupedBidRequests).reduce((aggregate, bidGroupKey) => { + // for each partioned bidGroup, append a bidRequest to requests list + partitionArray(groupedBidRequests[bidGroupKey], SRA_BID_LIMIT).forEach(bidsInGroup => { + const combinedSlotParams = spec.combineSlotUrlParams(bidsInGroup.map(bidRequest => { + return spec.createSlotParams(bidRequest, bidderRequest); + })); + + // SRA request returns grouped bidRequest arrays not a plain bidRequest + aggregate.push({ + method: 'GET', + url: `https://${rubiConf.bannerHost || 'fastlane'}.rubiconproject.com/a/api/fastlane.json`, + data: spec.getOrderedParams(combinedSlotParams).reduce((paramString, key) => { + const propValue = combinedSlotParams[key]; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(propValue) && propValue !== '' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(propValue) ? `${paramString}${encodeParam(key, propValue)}&` : paramString; + }, '') + `slots=${bidsInGroup.length}&rand=${Math.random()}`, + bidRequest: bidsInGroup + }); + }); + return aggregate; + }, [])); + } + return requests; + }, + getOrderedParams: function (params) { + const containsTgV = /^tg_v/; + const containsTgI = /^tg_i/; + const containsUId = /^eid_|^tpid_/; + const orderedParams = ['account_id', 'site_id', 'zone_id', 'size_id', 'alt_size_ids', 'p_pos', 'gdpr', 'gdpr_consent', 'us_privacy', 'gpp', 'gpp_sid', 'rp_schain'].concat(Object.keys(params).filter(item => containsUId.test(item))).concat(['x_liverampidl', 'ppuid', 'rf', 'p_geo.latitude', 'p_geo.longitude', 'kw']).concat(Object.keys(params).filter(item => containsTgV.test(item))).concat(Object.keys(params).filter(item => containsTgI.test(item))).concat(['tk_flint', 'x_source.tid', 'l_pb_bid_id', 'p_screen_res', 'o_ae', 'o_cdep', 'rp_floor', 'rp_secure', 'tk_user_key']); + return orderedParams.concat(Object.keys(params).filter(item => orderedParams.indexOf(item) === -1)); + }, + /** + * @summary combines param values from an array of slots into a single semicolon delineated value + * or just one value if they are all the same. + * @param {Object[]} aSlotUrlParams - example [{p1: 'foo', p2: 'test'}, {p2: 'test'}, {p1: 'bar', p2: 'test'}] + * @return {Object} - example {p1: 'foo;;bar', p2: 'test'} + */ + combineSlotUrlParams: function (aSlotUrlParams) { + // if only have params for one slot, return those params + if (aSlotUrlParams.length === 1) { + return aSlotUrlParams[0]; + } + + // reduce param values from all slot objects into an array of values in a single object + const oCombinedSlotUrlParams = aSlotUrlParams.reduce(function (oCombinedParams, oSlotUrlParams, iIndex) { + Object.keys(oSlotUrlParams).forEach(function (param) { + if (!oCombinedParams.hasOwnProperty(param)) { + oCombinedParams[param] = new Array(aSlotUrlParams.length); // initialize array; + } + // insert into the proper element of the array + oCombinedParams[param].splice(iIndex, 1, oSlotUrlParams[param]); + }); + return oCombinedParams; + }, {}); + + // convert arrays into semicolon delimited strings + const re = new RegExp('^([^;]*)(;\\1)+$'); // regex to test for duplication + + Object.keys(oCombinedSlotUrlParams).forEach(function (param) { + const sValues = oCombinedSlotUrlParams[param].join(';'); + // consolidate param values into one value if they are all the same + const match = sValues.match(re); + oCombinedSlotUrlParams[param] = match ? match[1] : sValues; + }); + return oCombinedSlotUrlParams; + }, + /** + * @param {BidRequest} bidRequest + * @param {Object} bidderRequest + * @returns {Object} - object key values named and formatted as slot params + */ + createSlotParams: function (bidRequest, bidderRequest) { + bidRequest.startTime = new Date().getTime(); + const params = bidRequest.params; + + // use rubicon sizes if provided, otherwise adUnit.sizes + const parsedSizes = parseSizes(bidRequest, 'banner'); + const [latitude, longitude] = params.latLong || []; + const data = { + 'account_id': params.accountId, + 'site_id': params.siteId, + 'zone_id': params.zoneId, + 'size_id': parsedSizes[0], + 'alt_size_ids': parsedSizes.slice(1).join(',') || undefined, + 'rp_floor': (params.floor = parseFloat(params.floor)) >= 0.01 ? params.floor : undefined, + 'rp_secure': '1', + 'tk_flint': `${rubiConf.int_type || DEFAULT_INTEGRATION}_v9.45.0-pre`, + 'x_source.tid': bidderRequest.ortb2?.source?.tid, + 'x_imp.ext.tid': bidRequest.ortb2Imp?.ext?.tid, + 'l_pb_bid_id': bidRequest.bidId, + 'o_cdep': bidRequest.ortb2?.device?.ext?.cdep, + 'ip': bidRequest.ortb2?.device?.ip, + 'ipv6': bidRequest.ortb2?.device?.ipv6, + 'p_screen_res': _getScreenResolution(), + 'tk_user_key': params.userId, + 'p_geo.latitude': isNaN(parseFloat(latitude)) ? undefined : parseFloat(latitude).toFixed(4), + 'p_geo.longitude': isNaN(parseFloat(longitude)) ? undefined : parseFloat(longitude).toFixed(4), + 'tg_fl.eid': bidRequest.code, + 'rf': _getPageUrl(bidRequest, bidderRequest) + }; + + // If floors module is enabled and we get USD floor back, send it in rp_hard_floor else undfined + if (typeof bidRequest.getFloor === 'function' && !rubiConf.disableFloors) { + let floorInfo; + try { + floorInfo = bidRequest.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '*' + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: getFloor threw an error: ', e); + } + data['rp_hard_floor'] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseInt(floorInfo.floor)) ? floorInfo.floor : undefined; + } + + // Send multiformat data if requested + if (params.bidonmultiformat === true && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes') && Object.keys(bidRequest.mediaTypes).length > 1) { + data['p_formats'] = Object.keys(bidRequest.mediaTypes).join(','); + } + + // add p_pos only if specified and valid + // For SRA we need to explicitly put empty semi colons so AE treats it as empty, instead of copying the latter value + let posMapping = { + 1: 'atf', + 3: 'btf' + }; + let pos = posMapping[(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'mediaTypes.banner.pos')] || ''; + data['p_pos'] = params.position === 'atf' || params.position === 'btf' ? params.position : pos; + + // pass publisher provided userId if configured + const configUserId = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('user.id'); + if (configUserId) { + data['ppuid'] = configUserId; + } + if (bidRequest?.ortb2Imp?.ext?.ae) { + data['o_ae'] = 1; + } + // If the bid request contains a 'mobile' property under 'ortb2.site', add it to 'data' as 'p_site.mobile'. + if (typeof bidRequest?.ortb2?.site?.mobile === 'number') { + data['p_site.mobile'] = bidRequest.ortb2.site.mobile; + } + addDesiredSegtaxes(bidderRequest, data); + // loop through userIds and add to request + if (bidRequest?.ortb2?.user?.ext?.eids) { + bidRequest.ortb2.user.ext.eids.forEach(_ref => { + let { + source, + uids = [], + inserter, + matcher, + mm, + ext = {} + } = _ref; + try { + // Ensure there is at least one valid UID in the 'uids' array + const uidData = uids[0]; + if (!uidData) return; // Skip processing if no valid UID exists + + // Function to build the EID value in the required format + const buildEidValue = uidData => [uidData.id, + // uid: The user ID + uidData.atype || '', '', + // third: Always empty, as specified in the requirement + inserter || '', matcher || '', mm || '', uidData?.ext?.rtiPartner || uidData?.ext?.rtipartner || ''].join('^'); // Return a single string formatted with '^' delimiter + + const eidValue = buildEidValue(uidData); // Build the EID value string + + // Store the constructed EID value for the given source + data[`eid_${source}`] = eidValue; + + // Handle the "ppuid" signal, ensuring it is set only once + if (!data['ppuid']) { + // Search for a UID with the 'stype' field equal to 'ppuid' in its extension + const ppId = uids.find(uid => uid.ext?.stype === 'ppuid'); + if (ppId?.id) { + data['ppuid'] = ppId.id; // Store the ppuid if found + } + } + } catch (e) { + // Log any errors encountered during processing + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Rubicon: error reading eid:', { + source, + uids + }, e); + } + }); + } + if (bidderRequest.gdprConsent) { + // add 'gdpr' only if 'gdprApplies' is defined + if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { + data['gdpr'] = Number(bidderRequest.gdprConsent.gdprApplies); + } + data['gdpr_consent'] = bidderRequest.gdprConsent.consentString; + } + if (bidderRequest.uspConsent) { + data['us_privacy'] = encodeURIComponent(bidderRequest.uspConsent); + } + if (bidderRequest.gppConsent?.gppString) { + data['gpp'] = bidderRequest.gppConsent.gppString; + data['gpp_sid'] = bidderRequest.gppConsent?.applicableSections?.toString(); + } + data['rp_maxbids'] = bidderRequest.bidLimit || 1; + applyFPD(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER, data); + if (_src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('coppa') === true) { + data['coppa'] = 1; + } + + // if SupplyChain is supplied and contains all required fields + if (bidRequest.schain && hasValidSupplyChainParams(bidRequest.schain)) { + data.rp_schain = spec.serializeSupplyChain(bidRequest.schain); + } + return data; + }, + /** + * Serializes schain params according to OpenRTB requirements + * @param {Object} supplyChain + * @returns {String} + */ + serializeSupplyChain: function (supplyChain) { + const supplyChainIsValid = hasValidSupplyChainParams(supplyChain); + if (!supplyChainIsValid) return ''; + const { + ver, + complete, + nodes + } = supplyChain; + return `${ver},${complete}!${spec.serializeSupplyChainNodes(nodes)}`; + }, + /** + * Properly sorts schain object params + * @param {Array} nodes + * @returns {String} + */ + serializeSupplyChainNodes: function (nodes) { + const nodePropOrder = ['asi', 'sid', 'hp', 'rid', 'name', 'domain']; + return nodes.map(node => { + return nodePropOrder.map(prop => encodeURIComponent(node[prop] || '')).join(','); + }).join('!'); + }, + /** + * @param {*} responseObj + * @param {BidRequest|Object.} request - if request was SRA the bidRequest argument will be a keyed BidRequest array object, + * non-SRA responses return a plain BidRequest object + * @return {{fledgeAuctionConfigs: *, bids: *}} An array of bids which + */ + interpretResponse: function (responseObj, request) { + responseObj = responseObj.body; + const { + data + } = request; + + // check overall response + if (!responseObj || typeof responseObj !== 'object') { + return []; + } + // Response from PBS Java openRTB + if (responseObj.seatbid) { + const responseErrors = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(responseObj, 'ext.errors.rubicon'); + if (Array.isArray(responseErrors) && responseErrors.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Rubicon: Error in video response'); + } + const bids = converter.fromORTB({ + request: data, + response: responseObj + }).bids; + return bids; + } + let ads = responseObj.ads; + let lastImpId; + let multibid = 0; + const { + bidRequest + } = request; + + // video ads array is wrapped in an object + if (typeof bidRequest === 'object' && !Array.isArray(bidRequest) && bidType(bidRequest).includes(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) && typeof ads === 'object') { + ads = ads[bidRequest.adUnitCode]; + } + + // check the ad response + if (!Array.isArray(ads) || ads.length < 1) { + return []; + } + let bids = ads.reduce((bids, ad, i) => { + ad.impression_id && lastImpId === ad.impression_id ? multibid++ : lastImpId = ad.impression_id; + if (ad.status !== 'ok') { + return bids; + } + + // associate bidRequests; assuming ads matches bidRequest + const associatedBidRequest = Array.isArray(bidRequest) ? bidRequest[i - multibid] : bidRequest; + if (associatedBidRequest && typeof associatedBidRequest === 'object') { + let bid = { + requestId: associatedBidRequest.bidId, + currency: 'USD', + creativeId: ad.creative_id || `${ad.network || ''}-${ad.advertiser || ''}`, + cpm: ad.cpm || 0, + dealId: ad.deal, + ttl: 360, + // 6 minutes + netRevenue: rubiConf.netRevenue !== false, + // If anything other than false, netRev is true + rubicon: { + advertiserId: ad.advertiser, + networkId: ad.network + }, + meta: { + advertiserId: ad.advertiser, + networkId: ad.network, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER + } + }; + if (ad.creative_type) { + bid.mediaType = ad.creative_type; + } + if (ad.dsa && Object.keys(ad.dsa).length) { + bid.meta.dsa = ad.dsa; + } + if (ad.adomain) { + bid.meta.advertiserDomains = Array.isArray(ad.adomain) ? ad.adomain : [ad.adomain]; + } + if (ad.emulated_format) { + bid.meta.mediaType = ad.emulated_format; + } + if (ad.creative_type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) { + bid.width = associatedBidRequest.params.video.playerWidth; + bid.height = associatedBidRequest.params.video.playerHeight; + bid.vastUrl = ad.creative_depot_url; + bid.impression_id = ad.impression_id; + bid.videoCacheKey = ad.impression_id; + } else { + bid.ad = _renderCreative(ad.script, ad.impression_id); + [bid.width, bid.height] = sizeMap[ad.size_id].split('x').map(num => Number(num)); + } + + // add server-side targeting + bid.rubiconTargeting = (Array.isArray(ad.targeting) ? ad.targeting : []).reduce((memo, item) => { + memo[item.key] = item.values[0]; + return memo; + }, { + 'rpfl_elemid': associatedBidRequest.adUnitCode + }); + bids.push(bid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Rubicon: bidRequest undefined at index position:${i}`, bidRequest, responseObj); + } + return bids; + }, []).sort((adA, adB) => { + return (adB.cpm || 0.0) - (adA.cpm || 0.0); + }); + let fledgeAuctionConfigs = responseObj.component_auction_config?.map(config => { + return { + config, + bidId: config.bidId + }; + }); + if (fledgeAuctionConfigs) { + return { + bids, + paapi: fledgeAuctionConfigs + }; + } else { + return bids; + } + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent, gppConsent) { + if (!hasSynced && syncOptions.iframeEnabled) { + // data is only assigned if params are available to pass to syncEndpoint + let params = (0,_libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_8__.getUserSyncParams)(gdprConsent, uspConsent, gppConsent); + params = Object.keys(params).length ? `?${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(params)}` : ''; + hasSynced = true; + return { + type: 'iframe', + url: `https://${rubiConf.syncHost || 'eus'}.rubiconproject.com/usync.html` + params + }; + } + } +}; +function _getScreenResolution() { + return [window.screen.width, window.screen.height].join('x'); +} + +/** + * @param {BidRequest} bidRequest + * @param bidderRequest + * @returns {string} + */ +function _getPageUrl(bidRequest, bidderRequest) { + let pageUrl; + if (bidRequest.params.referrer) { + pageUrl = bidRequest.params.referrer; + } else { + pageUrl = bidderRequest.refererInfo.page; + } + return bidRequest.params.secure ? pageUrl.replace(/^http:/i, 'https:') : pageUrl; +} +function _renderCreative(script, impId) { + return ` + + + +
+ +
+ +`; +} +function hideGoogleAdsDiv(adUnit) { + const el = adUnit.querySelector("div[id^='google_ads']"); + if (el) { + el.style.setProperty('display', 'none'); + } +} +function hideSmartAdServerIframe(adUnit) { + const el = adUnit.querySelector("script[id^='sas_script']"); + const nextSibling = el && el.nextSibling; + if (nextSibling && nextSibling.localName === 'iframe') { + nextSibling.style.setProperty('display', 'none'); + } +} +function renderBid(bid) { + // hide existing ad units + const adUnitElement = document.getElementById(bid.adUnitCode); + hideGoogleAdsDiv(adUnitElement); + hideSmartAdServerIframe(adUnitElement); + + // configure renderer + const defaultConfig = { + align: 'center', + position: 'append', + closeButton: false, + label: undefined, + collapse: true + }; + const config = { + ...defaultConfig, + ...bid.renderer.getConfig() + }; + bid.renderer.push(() => { + window.MagniteApex.renderAd({ + width: bid.width, + height: bid.height, + vastUrl: bid.vastUrl, + placement: { + attachTo: `#${bid.adUnitCode}`, + align: config.align, + position: config.position + }, + closeButton: config.closeButton, + label: config.label, + collapse: config.collapse + }); + }); +} +function outstreamRenderer(rtbBid) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_9__.Renderer.install({ + id: rtbBid.adId, + url: rubiConf.rendererUrl || DEFAULT_RENDERER_URL, + config: rubiConf.rendererConfig || {}, + loaded: false, + adUnitCode: rtbBid.adUnitCode + }); + try { + renderer.setRender(renderBid); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +} +function parseSizes(bid, mediaType) { + let params = bid.params; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO) { + let size = []; + if (params.video && params.video.playerWidth && params.video.playerHeight) { + size = [params.video.playerWidth, params.video.playerHeight]; + } else if (Array.isArray((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.video.playerSize')) && bid.mediaTypes.video.playerSize.length === 1) { + size = bid.mediaTypes.video.playerSize[0]; + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0 && Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1) { + size = bid.sizes[0]; + } + return size; + } + + // deprecated: temp legacy support + let sizes = []; + if (Array.isArray(params.sizes)) { + sizes = params.sizes; + } else if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.banner.sizes') !== 'undefined') { + sizes = mapSizes(bid.mediaTypes.banner.sizes); + } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) { + sizes = mapSizes(bid.sizes); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Rubicon: no sizes are setup or found'); + } + return masSizeOrdering(sizes); +} +function applyFPD(bidRequest, mediaType, data) { + const BID_FPD = { + user: { + ext: { + data: { + ...bidRequest.params.visitor + } + } + }, + site: { + ext: { + data: { + ...bidRequest.params.inventory + } + } + } + }; + if (bidRequest.params.keywords) BID_FPD.site.keywords = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidRequest.params.keywords) ? bidRequest.params.keywords.join(',') : bidRequest.params.keywords; + let fpd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)({}, bidRequest.ortb2 || {}, BID_FPD); + let impExt = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest.ortb2Imp, 'ext') || {}; + let impExtData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest.ortb2Imp, 'ext.data') || {}; + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'ortb2Imp.ext.gpid'); + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(fpd, 'regs.ext.dsa'); + const SEGTAX = { + user: [4], + site: [1, 2, 5, 6, 7] + }; + const MAP = { + user: 'tg_v.', + site: 'tg_i.', + adserver: 'tg_i.dfp_ad_unit_code', + pbadslot: 'tg_i.pbadslot', + keywords: 'kw' + }; + const validate = function (prop, key, parentName) { + if (key === 'data' && Array.isArray(prop)) { + return prop.filter(name => name.segment && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(name, 'ext.segtax') && SEGTAX[parentName] && SEGTAX[parentName].indexOf((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(name, 'ext.segtax')) !== -1).map(value => { + let segments = value.segment.filter(obj => obj.id).reduce((result, obj) => { + result.push(obj.id); + return result; + }, []); + if (segments.length > 0) return segments.toString(); + }).toString(); + } else if (typeof prop === 'object' && !Array.isArray(prop)) { + return undefined; + } else if (typeof prop !== 'undefined') { + return Array.isArray(prop) ? prop.filter(value => { + if (typeof value !== 'object' && typeof value !== 'undefined') return value.toString(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Rubicon: Filtered value: ', value, 'for key', key, ': Expected value to be string, integer, or an array of strings/ints'); + }).toString() : prop.toString(); + } + }; + const addBannerData = function (obj, name, key) { + let isParent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + let val = validate(obj, key, name); + let loc = MAP[key] && isParent ? `${MAP[key]}` : key === 'data' ? `${MAP[name]}iab` : `${MAP[name]}${key}`; + data[loc] = data[loc] ? data[loc].concat(',', val) : val; + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER) { + ['site', 'user'].forEach(name => { + Object.keys(fpd[name]).forEach(key => { + if (name === 'site' && key === 'content' && fpd[name][key].data) { + addBannerData(fpd[name][key].data, name, 'data'); + } else if (key !== 'ext') { + addBannerData(fpd[name][key], name, key); + } else if (fpd[name][key].data) { + Object.keys(fpd[name].ext.data).forEach(key => { + addBannerData(fpd[name].ext.data[key], name, key, false); + }); + } + }); + }); + Object.keys(impExtData).forEach(key => { + if (key !== 'adserver') { + addBannerData(impExtData[key], 'site', key); + } else if (impExtData[key].name === 'gam') { + addBannerData(impExtData[key].adslot, name, key); + } + }); + + // add in gpid + if (gpid) { + data['p_gpid'] = gpid; + } + + // add dsa signals + if (dsa && Object.keys(dsa).length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(dsa, ['dsainfo', dsainfo => data['dsainfo'] = dsainfo, 'dsarequired', required => data['dsarequired'] = required, 'pubrender', pubrender => data['dsapubrender'] = pubrender, 'datatopub', datatopub => data['dsadatatopubs'] = datatopub, 'transparency', transparency => { + if (Array.isArray(transparency) && transparency.length) { + data['dsatransparency'] = transparency.reduce((param, transp) => { + // make sure domain is there, otherwise skip entry + const domain = transp.domain || ''; + if (!domain) { + return param; + } + + // make sure dsaParam array is there (try both 'dsaparams' and 'params', but prefer dsaparams) + const dsaParamArray = transp.dsaparams || transp.params; + if (!Array.isArray(dsaParamArray) || dsaParamArray.length === 0) { + return param; + } + + // finally we will add this one, if param has been added already, add our seperator + if (param) { + param += '~~'; + } + return param += `${domain}~${dsaParamArray.join('_')}`; + }, ''); + } + }]); + } + + // only send one of pbadslot or dfp adunit code (prefer pbadslot) + if (data['tg_i.pbadslot']) { + delete data['tg_i.dfp_ad_unit_code']; + } + + // High Entropy stuff -> sua object is the ORTB standard (default to pass unless specifically disabled) + const clientHints = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(fpd, 'device.sua'); + if (clientHints && rubiConf.chEnabled !== false) { + // pick out client hints we want to send (any that are undefined or empty will NOT be sent) + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.pick)(clientHints, ['architecture', arch => data.m_ch_arch = arch, 'bitness', bitness => data.m_ch_bitness = bitness, 'browsers', browsers => { + if (!Array.isArray(browsers)) return; + // reduce down into ua and full version list attributes + const [ua, fullVer] = browsers.reduce((accum, browserData) => { + accum[0].push(`"${browserData?.brand}"|v="${browserData?.version?.[0]}"`); + // only set fullVer if long enough + if (browserData.version.length > 1) { + accum[1].push(`"${browserData?.brand}"|v="${browserData?.version?.join?.('.')}"`); + } + return accum; + }, [[], []]); + data.m_ch_ua = ua?.join?.(','); + data.m_ch_full_ver = fullVer?.join?.(','); + }, 'mobile', isMobile => data.m_ch_mobile = `?${isMobile}`, 'model', model => data.m_ch_model = model, 'platform', platform => { + data.m_ch_platform = platform?.brand; + data.m_ch_platform_ver = platform?.version?.join?.('.'); + }]); + } + } else { + if (Object.keys(impExt).length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(data.imp[0].ext, impExt); + } + // add in gpid + if (gpid) { + data.imp[0].ext.gpid = gpid; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(data, fpd); + } +} +function addDesiredSegtaxes(bidderRequest, target) { + if (rubiConf.readTopics === false) { + return; + } + let iSegments = [1, 2, 5, 6, 7, 507].concat(rubiConf.sendSiteSegtax?.map(seg => Number(seg)) || []); + let vSegments = [4, 508].concat(rubiConf.sendUserSegtax?.map(seg => Number(seg)) || []); + let userData = bidderRequest.ortb2?.user?.data || []; + let siteData = bidderRequest.ortb2?.site?.content?.data || []; + userData.forEach(iterateOverSegmentData(target, 'v', vSegments)); + siteData.forEach(iterateOverSegmentData(target, 'i', iSegments)); +} +function iterateOverSegmentData(target, char, segments) { + return topic => { + const taxonomy = Number(topic.ext?.segtax); + if (segments.includes(taxonomy)) { + target[`tg_${char}.tax${taxonomy}`] = topic.segment?.map(seg => seg.id).join(','); + } + }; +} + +/** + * @param sizes + * @returns {*} + */ +function mapSizes(sizes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(sizes) + // map sizes while excluding non-matches + .reduce((result, size) => { + let mappedSize = parseInt(sizeMap[size], 10); + if (mappedSize) { + result.push(mappedSize); + } + return result; + }, []); +} + +/** + * Test if bid has mediaType or mediaTypes set for video. + * Also checks if the video object is present in the rubicon bidder params + * @param {BidRequest} bidRequest + * @returns {boolean} + */ +function classifiedAsVideo(bidRequest) { + let isVideo = typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO}`) !== 'undefined'; + let isBanner = typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER}`) !== 'undefined'; + let isBidOnMultiformat = typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, `params.bidonmultiformat`) !== 'undefined'; + let isMissingVideoParams = typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.video') !== 'object'; + // If an ad has both video and banner types, a legacy implementation allows choosing video over banner + // based on whether or not there is a video object defined in the params + // Given this legacy implementation, other code depends on params.video being defined + + // if it's bidonmultiformat, we don't care of the video object + if (isVideo && isBidOnMultiformat) return true; + if (isBanner && isMissingVideoParams) { + isVideo = false; + } + if (isVideo && isMissingVideoParams) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(bidRequest, 'params.video', {}); + } + return isVideo; +} + +/** + * Determine bidRequest mediaTypes. All mediaTypes must be correct. If one fails, all the others will fail too. + * @param bid the bid to test + * @param log boolean. whether we should log errors/warnings for invalid bids + * @returns {string|undefined} Returns an array containing one of 'video' or 'banner' or 'native' if resolves to a type. + */ +function bidType(bid) { + let log = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + // Is it considered video ad unit by rubicon + let bidTypes = []; + if (classifiedAsVideo(bid)) { + // Removed legacy mediaType support. new way using mediaTypes.video object is now required + // We require either context as instream or outstream + if (['outstream', 'instream'].indexOf((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO}.context`)) === -1) { + if (log) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: mediaTypes.video.context must be outstream or instream'); + } + return bidTypes; + } + + // we require playerWidth and playerHeight to come from one of params.playerWidth/playerHeight or mediaTypes.video.playerSize or adUnit.sizes + if (parseSizes(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO).length < 2) { + if (log) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: could not determine the playerSize of the video'); + } + return bidTypes; + } + if (log) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Rubicon: making video request for adUnit', bid.adUnitCode); + } + bidTypes.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO); + } + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE}`) !== 'undefined') { + bidTypes.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.NATIVE); + } + if (typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER}`) !== 'undefined') { + // we require banner sizes to come from one of params.sizes or mediaTypes.banner.sizes or adUnit.sizes, in that order + // if we cannot determine them, we reject it! + if (parseSizes(bid, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER).length === 0) { + if (log) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: could not determine the sizes for banner request'); + } + return bidTypes; + } + + // everything looks good for banner so lets do it + if (log) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('Rubicon: making banner request for adUnit', bid.adUnitCode); + } + bidTypes.push(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.BANNER); + } + return bidTypes; +} +const resetRubiConf = () => rubiConf = {}; +const resetImpIdMap = () => impIdMap = {}; +function masSizeOrdering(sizes) { + const MAS_SIZE_PRIORITY = [15, 2, 9]; + return sizes.sort((first, second) => { + // sort by MAS_SIZE_PRIORITY priority order + const firstPriority = MAS_SIZE_PRIORITY.indexOf(first); + const secondPriority = MAS_SIZE_PRIORITY.indexOf(second); + if (firstPriority > -1 || secondPriority > -1) { + if (firstPriority === -1) { + return 1; + } + if (secondPriority === -1) { + return -1; + } + return firstPriority - secondPriority; + } + + // and finally ascending order + return first - second; + }); +} +function determineRubiconVideoSizeId(bid) { + // If we have size_id in the bid then use it + let rubiconSizeId = parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'params.video.size_id')); + if (!isNaN(rubiconSizeId)) { + return rubiconSizeId; + } + // otherwise 203 for outstream and 201 for instream + // When this function is used we know it has to be one of outstream or instream + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_5__.VIDEO}.context`) === 'outstream' ? 203 : 201; +} + +/** + * @param {Object} config + * @returns {{ranges: {ranges: Object[]}}} + */ +function getPriceGranularity(config) { + return { + ranges: { + low: [{ + max: 5.00, + increment: 0.50 + }], + medium: [{ + max: 20.00, + increment: 0.10 + }], + high: [{ + max: 20.00, + increment: 0.01 + }], + auto: [{ + max: 5.00, + increment: 0.05 + }, { + min: 5.00, + max: 10.00, + increment: 0.10 + }, { + min: 10.00, + max: 20.00, + increment: 0.50 + }], + dense: [{ + max: 3.00, + increment: 0.01 + }, { + min: 3.00, + max: 8.00, + increment: 0.05 + }, { + min: 8.00, + max: 20.00, + increment: 0.50 + }], + custom: config.getConfig('customPriceBucket') && config.getConfig('customPriceBucket').buckets + }[config.getConfig('priceGranularity')] + }; +} + +// Function to validate the required video params +function hasValidVideoParams(bid) { + let isValid = true; + // incase future javascript changes the string represenation of the array or number classes! + let arrayType = Object.prototype.toString.call([]); + let numberType = Object.prototype.toString.call(0); + // required params and their associated object type + var requiredParams = { + mimes: arrayType, + protocols: arrayType, + linearity: numberType + }; + // loop through each param and verify it has the correct + Object.keys(requiredParams).forEach(function (param) { + if (Object.prototype.toString.call((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'mediaTypes.video.' + param)) !== requiredParams[param]) { + isValid = false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: mediaTypes.video.' + param + ' is required and must be of type: ' + requiredParams[param]); + } + }); + return isValid; +} + +/** + * Make sure the required params are present + * @param {Object} schain + */ +function hasValidSupplyChainParams(schain) { + let isValid = false; + const requiredFields = ['asi', 'sid', 'hp']; + if (!schain.nodes) return isValid; + isValid = schain.nodes.reduce((status, node) => { + if (!status) return status; + return requiredFields.every(field => node.hasOwnProperty(field)); + }, true); + if (!isValid) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Rubicon: required schain params missing'); + return isValid; +} + +/** + * Creates a URL key value param, encoding the param unless the key is schain + * @param {String} key + * @param {String} param + * @returns {String} + */ +function encodeParam(key, param) { + if (key === 'rp_schain') return `rp_schain=${param}`; + return `${key}=${encodeURIComponent(param)}`; +} + +/** + * split array into multiple arrays of defined size + * @param {Array} array + * @param {number} size + * @returns {Array} + */ +function partitionArray(array, size) { + return array.map((e, i) => i % size === 0 ? array.slice(i, i + size) : null).filter(e => e); +} +var hasSynced = false; +function resetUserSync() { + hasSynced = false; +} + +/** + * Sets the floor on the bidRequest. imp.bidfloor and imp.bidfloorcur + * should be already set by the conversion library. if they're not, + * or invalid, try to read from params.floor. + * @param {*} bidRequest + * @param {*} imp + */ +function setBidFloors(bidRequest, imp) { + if (imp.bidfloorcur != 'USD') { + delete imp.bidfloor; + delete imp.bidfloorcur; + } + if (!imp.bidfloor) { + let bidFloor = parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequest, 'params.floor')); + if (!isNaN(bidFloor)) { + imp.bidfloor = bidFloor; + imp.bidfloorcur = 'USD'; + } + } +} +function addOrtbFirstPartyData(data, nonBannerRequests, ortb2) { + let fpd = {}; + const keywords = (0,_libraries_keywords_keywords_js__WEBPACK_IMPORTED_MODULE_10__.getAllOrtbKeywords)(ortb2, ...nonBannerRequests.map(req => req.params.keywords)); + nonBannerRequests.forEach(bidRequest => { + const bidFirstPartyData = { + user: { + ext: { + data: { + ...bidRequest.params.visitor + } + } + }, + site: { + ext: { + data: { + ...bidRequest.params.inventory + } + } + } + }; + + // add site.content.language + const impThatHasVideoLanguage = data.imp.find(imp => imp.ext?.prebid?.bidder?.rubicon?.video?.language); + if (impThatHasVideoLanguage) { + bidFirstPartyData.site.content = { + language: impThatHasVideoLanguage.ext?.prebid?.bidder?.rubicon?.video?.language + }; + } + fpd = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(fpd, bidRequest.ortb2 || {}, bidFirstPartyData); + + // add user.id from config. + // NOTE: This is DEPRECATED. user.id should come from setConfig({ortb2}). + const configUserId = _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig('user.id'); + fpd.user.id = fpd.user.id || configUserId; + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(data, fpd); + if (keywords && keywords.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(data, 'site.keywords', keywords.join(',')); + } + delete data?.ext?.prebid?.storedrequest; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_11__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('rubiconBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","keywords","pbsExtensions","userSyncUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/rubiconBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["s2sTesting"],{ + +/***/ "./modules/s2sTesting.js": +/*!*******************************!*\ + !*** ./modules/s2sTesting.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export s2sTesting */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + +const { + CLIENT, + SERVER +} = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.PARTITIONS; +const s2sTesting = { + ..._src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.PARTITIONS, + clientTestBidders: new Set() +}; +s2sTesting.bidSource = {}; // store bidder sources determined from s2sConfig bidderControl +s2sTesting.globalRand = Math.random(); // if 10% of bidderA and 10% of bidderB should be server-side, make it the same 10% + +s2sTesting.getSourceBidderMap = function () { + let adUnits = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let allS2SBidders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var sourceBidders = { + [SERVER]: {}, + [CLIENT]: {} + }; + adUnits.forEach(adUnit => { + // if any adUnit bidders specify a bidSource, include them + (adUnit.bids || []).forEach(bid => { + // When a s2sConfig does not have testing=true and did not calc bid sources + if (allS2SBidders.indexOf(bid.bidder) > -1 && !s2sTesting.bidSource[bid.bidder]) { + s2sTesting.bidSource[bid.bidder] = SERVER; + } + // calculate the source once and store on bid object + bid.calcSource = bid.calcSource || s2sTesting.getSource(bid.bidSource); + // if no bidSource at bid level, default to bidSource from bidder + bid.finalSource = bid.calcSource || s2sTesting.bidSource[bid.bidder] || CLIENT; // default to client + // add bidder to sourceBidders data structure + sourceBidders[bid.finalSource][bid.bidder] = true; + }); + }); + + // make sure all bidders in bidSource are in sourceBidders + Object.keys(s2sTesting.bidSource).forEach(bidder => { + sourceBidders[s2sTesting.bidSource[bidder]][bidder] = true; + }); + + // return map of source => array of bidders + return { + [SERVER]: Object.keys(sourceBidders[SERVER]), + [CLIENT]: Object.keys(sourceBidders[CLIENT]) + }; +}; + +/** + * @function calculateBidSources determines the source for each s2s bidder based on bidderControl weightings. these can be overridden at the adUnit level + * @param s2sConfig server-to-server configuration + */ +s2sTesting.calculateBidSources = function () { + let s2sConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + // calculate bid source (server/client) for each s2s bidder + + var bidderControl = s2sConfig.bidderControl || {}; + (s2sConfig.bidders || []).forEach(bidder => { + s2sTesting.bidSource[bidder] = s2sTesting.getSource(bidderControl[bidder] && bidderControl[bidder].bidSource) || SERVER; // default to server + }); +}; + +/** + * @function getSource() gets a random source based on the given sourceWeights (export just for testing) + * @param sourceWeights mapping of relative weights of potential sources. for example {server: 1, client: 3} should do a server request 25% of the time and a client request 75% of the time. + * @param bidSources list of possible bid sources: "server", "client". In theory could get the sources from the sourceWeights keys, but this is publisher config defined, so bidSources let's us constrain that. + * @return the chosen source ("server" or "client"), or undefined if none chosen + */ +s2sTesting.getSource = function () { + let sourceWeights = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let bidSources = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [SERVER, CLIENT]; + var srcIncWeight = {}; // store incremental weights of each source + var totWeight = 0; + bidSources.forEach(source => { + totWeight += sourceWeights[source] || 0; + srcIncWeight[source] = totWeight; + }); + if (!totWeight) return; // bail if no source weights + // choose a source randomly based on weights + var rndWeight = s2sTesting.globalRand * totWeight; + for (var i = 0; i < bidSources.length; i++) { + let source = bidSources[i]; + // choose the first source with an incremental weight > random weight + if (rndWeight < srcIncWeight[source]) return source; + } +}; +function doingS2STesting(s2sConfig) { + return s2sConfig && s2sConfig.enabled && s2sConfig.testing; +} +function isTestingServerOnly(s2sConfig) { + return Boolean(doingS2STesting(s2sConfig) && s2sConfig.testServerOnly); +} +const adUnitsContainServerRequests = (adUnits, s2sConfig) => Boolean((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(adUnits, adUnit => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(adUnit.bids, bid => (bid.bidSource || s2sConfig.bidderControl && s2sConfig.bidderControl[bid.bidder]) && bid.finalSource === SERVER))); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.partitionBidders.before(function (next, adUnits, s2sConfigs) { + const serverBidders = (0,_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.getS2SBidderSet)(s2sConfigs); + let serverOnly = false; + s2sConfigs.forEach(s2sConfig => { + if (doingS2STesting(s2sConfig)) { + s2sTesting.calculateBidSources(s2sConfig); + const bidderMap = s2sTesting.getSourceBidderMap(adUnits, [...serverBidders]); + // get all adapters doing client testing + bidderMap[CLIENT].forEach(bidder => s2sTesting.clientTestBidders.add(bidder)); + } + if (isTestingServerOnly(s2sConfig) && adUnitsContainServerRequests(adUnits, s2sConfig)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('testServerOnly: True. All client requests will be suppressed.'); + serverOnly = true; + } + }); + next.bail((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidderCodes)(adUnits).reduce((memo, bidder) => { + if (serverBidders.has(bidder)) { + memo[SERVER].push(bidder); + } + if (!serverOnly && (!serverBidders.has(bidder) || s2sTesting.clientTestBidders.has(bidder))) { + memo[CLIENT].push(bidder); + } + return memo; + }, { + [CLIENT]: [], + [SERVER]: [] + })); +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.filterBidsForAdUnit.before(function (next, bids, s2sConfig) { + if (s2sConfig == null) { + bids = bids.filter(bid => !s2sTesting.clientTestBidders.size || bid.finalSource !== SERVER); + } else { + bids = bids.filter(bid => !doingS2STesting(s2sConfig) || bid.finalSource !== CLIENT); + } + next.call(this, bids, s2sConfig); +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (s2sTesting); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('s2sTesting'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/s2sTesting.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["saambaaBidAdapter"],{ + +/***/ "./modules/advangelistsBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/advangelistsBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ spec: () => (/* binding */ spec) +/* harmony export */ }); +/* unused harmony exports VIDEO_TARGETING, VIDEO_ENDPOINT, BANNER_ENDPOINT, OUTSTREAM_SRC */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/advangUtils/index.js */ "./libraries/advangUtils/index.js"); + + + + + +const ADAPTER_VERSION = '1.0'; +const BIDDER_CODE = 'advangelists'; +const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip', 'playerSize', 'context']; +const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid='; +const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid='; +const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js'; +let pubid = ''; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + aliases: ['saambaa'], + isBidRequestValid(bidRequest) { + if (typeof bidRequest !== 'undefined') { + if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { + return false; + } + if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { + return false; + } + return true; + } else { + return false; + } + }, + buildRequests(bids, bidderRequest) { + let requests = []; + let videoBids = bids.filter(bid => (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBidValid)(bid)); + let bannerBids = bids.filter(bid => (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isBannerBidValid)(bid)); + videoBids.forEach(bid => { + pubid = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidParam)(bid, 'pubid'); + requests.push({ + method: 'POST', + url: VIDEO_ENDPOINT + pubid, + data: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.createRequestData)(bid, bidderRequest, true, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidParam, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoSizes, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getVideoBidFloor), + bidRequest: bid + }); + }); + bannerBids.forEach(bid => { + pubid = (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidParam)(bid, 'pubid'); + requests.push({ + method: 'POST', + url: BANNER_ENDPOINT + pubid, + data: (0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.createRequestData)(bid, bidderRequest, false, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidParam, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerSizes, _libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.getBannerBidFloor, BIDDER_CODE, ADAPTER_VERSION), + bidRequest: bid + }); + }); + return requests; + }, + interpretResponse(serverResponse, _ref) { + let { + bidRequest + } = _ref; + let response = serverResponse.body; + if (response !== null && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(response) === false) { + if ((0,_libraries_advangUtils_index_js__WEBPACK_IMPORTED_MODULE_1__.isVideoBid)(bidRequest)) { + let bidResponse = { + requestId: response.id, + cpm: response.seatbid[0].bid[0].price, + width: response.seatbid[0].bid[0].w, + height: response.seatbid[0].bid[0].h, + ttl: response.seatbid[0].bid[0].ttl || 60, + creativeId: response.seatbid[0].bid[0].crid, + currency: response.cur, + meta: { + 'advertiserDomains': response.seatbid[0].bid[0].adomain + }, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, + netRevenue: true + }; + if (response.seatbid[0].bid[0].adm) { + bidResponse.vastXml = response.seatbid[0].bid[0].adm; + bidResponse.adResponse = { + content: response.seatbid[0].bid[0].adm + }; + } else { + bidResponse.vastUrl = response.seatbid[0].bid[0].nurl; + } + return bidResponse; + } else { + return { + requestId: response.id, + bidderCode: BIDDER_CODE, + cpm: response.seatbid[0].bid[0].price, + width: response.seatbid[0].bid[0].w, + height: response.seatbid[0].bid[0].h, + ad: response.seatbid[0].bid[0].adm, + ttl: response.seatbid[0].bid[0].ttl || 60, + creativeId: response.seatbid[0].bid[0].crid, + currency: response.cur, + meta: { + 'advertiserDomains': response.seatbid[0].bid[0].adomain + }, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + netRevenue: true + }; + } + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('advangelistsBidAdapter'); + +/***/ }), + +/***/ "./modules/saambaaBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/saambaaBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _advangelistsBidAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./advangelistsBidAdapter.js */ "./modules/advangelistsBidAdapter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + // eslint-disable-line prebid/validate-imports + +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(_advangelistsBidAdapter_js__WEBPACK_IMPORTED_MODULE_0__.spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('saambaaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["advangUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/saambaaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["scaleableAnalyticsAdapter"],{ + +/***/ "./modules/scaleableAnalyticsAdapter.js": +/*!**********************************************!*\ + !*** ./modules/scaleableAnalyticsAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/* COPYRIGHT SCALEABLE LLC 2019 */ + + + + + + + +// Object.entries polyfill +const entries = Object.entries || function (obj) { + const ownProps = Object.keys(obj); + let i = ownProps.length; + let resArray = new Array(i); // preallocate the Array + while (i--) { + resArray[i] = [ownProps[i], obj[ownProps[i]]]; + } + return resArray; +}; +const BID_TIMEOUT = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_TIMEOUT; +const AUCTION_INIT = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_INIT; +const BID_WON = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON; +const AUCTION_END = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_END; +const URL = 'https://auction.scaleable.ai/'; +const ANALYTICS_TYPE = 'endpoint'; +let auctionData = {}; +let scaleableAnalytics = Object.assign({}, (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + URL, + ANALYTICS_TYPE +}), { + // Override AnalyticsAdapter functions by supplying custom methods + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case AUCTION_INIT: + onAuctionInit(args); + break; + case AUCTION_END: + onAuctionEnd(args); + break; + case BID_WON: + onBidWon(args); + break; + case BID_TIMEOUT: + onBidTimeout(args); + break; + default: + break; + } + } +}); +scaleableAnalytics.config = {}; +scaleableAnalytics.originEnableAnalytics = scaleableAnalytics.enableAnalytics; +scaleableAnalytics.enableAnalytics = config => { + scaleableAnalytics.config = config; + scaleableAnalytics.originEnableAnalytics(config); + scaleableAnalytics.enableAnalytics = function _enable() { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(`Analytics adapter for "${__webpack_require__.g}" already enabled, unnecessary call to \`enableAnalytics\`.`); + }; +}; +scaleableAnalytics.getAuctionData = () => { + return auctionData; +}; +const sendDataToServer = data => (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(URL, () => {}, JSON.stringify(data)); + +// Track auction initiated +const onAuctionInit = args => { + const config = scaleableAnalytics.config || { + options: {} + }; + let adunitObj = {}; + let adunits = []; + + // Loop through adunit codes first + args.adUnitCodes.forEach(code => { + adunitObj[code] = [{ + bidder: 'scaleable_adunit_request' + }]; + }); + + // Loop through bidder requests and bids + args.bidderRequests.forEach(bidderObj => { + bidderObj.bids.forEach(bidObj => { + adunitObj[bidObj.adUnitCode].push({ + bidder: bidObj.bidder, + params: bidObj.params + }); + }); + }); + entries(adunitObj).forEach(_ref2 => { + let [adunitCode, bidRequests] = _ref2; + adunits.push({ + code: adunitCode, + bidRequests: bidRequests + }); + }); + const data = { + event: 'request', + site: config.options.site, + adunits: adunits + }; + sendDataToServer(data); +}; + +// Handle all events besides requests and wins +const onAuctionEnd = args => { + const config = scaleableAnalytics.config || { + options: {} + }; + let adunitObj = {}; + let adunits = []; + + // Add Bids Received + args.bidsReceived.forEach(bidObj => { + if (!adunitObj[bidObj.adUnitCode]) { + adunitObj[bidObj.adUnitCode] = []; + } + adunitObj[bidObj.adUnitCode].push({ + bidder: bidObj.bidderCode || bidObj.bidder, + cpm: bidObj.cpm, + currency: bidObj.currency, + dealId: bidObj.dealId, + type: bidObj.mediaType, + ttr: bidObj.timeToRespond, + size: bidObj.size + }); + }); + + // Add in other data (timeouts) as we push to adunits + entries(adunitObj).forEach(_ref3 => { + let [adunitCode, bidsReceived] = _ref3; + const bidData = bidsReceived.concat(auctionData[adunitCode] || []); + adunits.push({ + code: adunitCode, + bidData: bidData + }); + delete auctionData[adunitCode]; + }); + + // Add in any missed auction data + entries(auctionData).forEach(_ref4 => { + let [adunitCode, bidData] = _ref4; + adunits.push({ + code: adunitCode, + bidData: bidData + }); + }); + const data = { + event: 'bids', + site: config.options.site, + adunits: adunits + }; + if (adunits.length) { + sendDataToServer(data); + } + + // Reset auctionData + auctionData = {}; +}; + +// Bid Win Events occur after auction end +const onBidWon = args => { + const config = scaleableAnalytics.config || { + options: {} + }; + const data = { + event: 'win', + site: config.options.site, + adunit: args.adUnitCode, + code: args.bidderCode, + cpm: args.cpm, + ttr: args.timeToRespond, + params: args.params + }; + sendDataToServer(data); +}; +const onBidTimeout = args => { + args.forEach(currObj => { + if (!auctionData[currObj.adUnitCode]) { + auctionData[currObj.adUnitCode] = []; + } + auctionData[currObj.adUnitCode].push({ + timeouts: 1, + bidder: currObj.bidder + }); + }); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: scaleableAnalytics, + code: 'scaleable' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (scaleableAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('scaleableAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/scaleableAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["scatteredBidAdapter"],{ + +/***/ "./modules/scatteredBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/scatteredBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + +const BIDDER_CODE = 'scattered'; +const GVLID = 1179; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, + ttl: 360, + netRevenue: true + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + // 1. + isBidRequestValid: function (bid) { + const bidderDomain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidderDomain'); + if (bidderDomain === undefined || bidderDomain === '') { + return false; + } + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner.sizes'); + if (sizes === undefined || sizes.length < 1) { + return false; + } + return true; + }, + // 2. + buildRequests: function (bidRequests, bidderRequest) { + return { + method: 'POST', + url: 'https://' + getKeyOnAny(bidRequests, 'params.bidderDomain'), + data: converter.toORTB({ + bidderRequest, + bidRequests + }), + options: { + contentType: 'application/json' + } + }; + }, + // 3. + interpretResponse: function (response, request) { + if (!response.body) return; + return converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + }, + // 4 + onBidWon: function (bid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('onBidWon', bid); + } +}; +function getKeyOnAny(collection, key) { + for (let i = 0; i < collection.length; i++) { + const result = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(collection[i], key); + if (result) { + return result; + } + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('scatteredBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/scatteredBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["schain"],{ + +/***/ "./modules/schain.js": +/*!***************************!*\ + !*** ./modules/schain.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports isSchainObjectValid, isValidSchainConfig, makeBidRequestsHook, init, setOrtbSourceExtSchain */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/pbjsORTB.js */ "./src/pbjsORTB.js"); + + + + + + +// https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md + +const schainErrorPrefix = 'Invalid schain object found: '; +const shouldBeAString = ' should be a string'; +const shouldBeAnInteger = ' should be an Integer'; +const shouldBeAnObject = ' should be an object'; +const shouldBeAnArray = ' should be an Array'; +const MODE = { + STRICT: 'strict', + RELAXED: 'relaxed', + OFF: 'off' +}; +const MODES = []; // an array of modes +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(MODE, mode => MODES.push(mode)); + +// validate the supply chain object +function isSchainObjectValid(schainObject, returnOnError) { + let failPrefix = 'Detected something wrong within an schain config:'; + let failMsg = ''; + function appendFailMsg(msg) { + failMsg += '\n' + msg; + } + function printFailMsg() { + if (returnOnError === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(failPrefix, schainObject, failMsg); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)(failPrefix, schainObject, failMsg); + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(schainObject)) { + appendFailMsg(`schain.config` + shouldBeAnObject); + printFailMsg(); + if (returnOnError) return false; + } + + // complete: Integer + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(schainObject.complete) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(schainObject.complete)) { + appendFailMsg(`schain.config.complete` + shouldBeAnInteger); + } + + // ver: String + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(schainObject.ver)) { + appendFailMsg(`schain.config.ver` + shouldBeAString); + } + + // ext: Object [optional] + if (schainObject.hasOwnProperty('ext')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(schainObject.ext)) { + appendFailMsg(`schain.config.ext` + shouldBeAnObject); + } + } + + // nodes: Array of objects + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(schainObject.nodes)) { + appendFailMsg(`schain.config.nodes` + shouldBeAnArray); + printFailMsg(); + if (returnOnError) return false; + } else { + schainObject.nodes.forEach((node, index) => { + // asi: String + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(node.asi)) { + appendFailMsg(`schain.config.nodes[${index}].asi` + shouldBeAString); + } + + // sid: String + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(node.sid)) { + appendFailMsg(`schain.config.nodes[${index}].sid` + shouldBeAString); + } + + // hp: Integer + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(node.hp) || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(node.hp)) { + appendFailMsg(`schain.config.nodes[${index}].hp` + shouldBeAnInteger); + } + + // rid: String [Optional] + if (node.hasOwnProperty('rid')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(node.rid)) { + appendFailMsg(`schain.config.nodes[${index}].rid` + shouldBeAString); + } + } + + // name: String [Optional] + if (node.hasOwnProperty('name')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(node.name)) { + appendFailMsg(`schain.config.nodes[${index}].name` + shouldBeAString); + } + } + + // domain: String [Optional] + if (node.hasOwnProperty('domain')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(node.domain)) { + appendFailMsg(`schain.config.nodes[${index}].domain` + shouldBeAString); + } + } + + // ext: Object [Optional] + if (node.hasOwnProperty('ext')) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(node.ext)) { + appendFailMsg(`schain.config.nodes[${index}].ext` + shouldBeAnObject); + } + } + }); + } + if (failMsg.length > 0) { + printFailMsg(); + if (returnOnError) { + return false; + } + } + return true; +} +function isValidSchainConfig(schainObject) { + if (schainObject === undefined) { + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(schainObject)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(schainErrorPrefix + 'the following schain config will not be used as schain is not an object.', schainObject); + return false; + } + return true; +} +function resolveSchainConfig(schainObject, bidder) { + let mode = MODE.STRICT; + if (isValidSchainConfig(schainObject)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(schainObject.validation) && MODES.indexOf(schainObject.validation) != -1) { + mode = schainObject.validation; + } + if (mode === MODE.OFF) { + // no need to validate + return schainObject.config; + } else { + // if strict mode and config is invalid, reject config + throw error; otherwise allow config to go through + if (isSchainObjectValid(schainObject.config, !!(mode === MODE.STRICT))) { + return schainObject.config; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(schainErrorPrefix + `due to the 'strict' validation setting, this schain config will not be passed to bidder '${bidder}'. See above error for details.`); + } + } + } + return null; +} +function makeBidRequestsHook(fn, bidderRequests) { + function getSchainForBidder(bidder) { + let bidderSchain = bidderConfigs[bidder] && bidderConfigs[bidder].schain; + return bidderSchain || globalSchainConfig; + } + const globalSchainConfig = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('schain'); + const bidderConfigs = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getBidderConfig(); + bidderRequests.forEach(bidderRequest => { + let bidder = bidderRequest.bidderCode; + let schainConfig = getSchainForBidder(bidder); + bidderRequest.bids.forEach(bid => { + let result = resolveSchainConfig(schainConfig, bidder); + if (result) { + bid.schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(result); + } + }); + }); + fn(bidderRequests); +} +function init() { + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].makeBidRequests.after(makeBidRequestsHook); +} +init(); +function setOrtbSourceExtSchain(ortbRequest, bidderRequest, context) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(ortbRequest, 'source.ext.schain')) { + const schain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, 'bidRequests.0.schain'); + if (schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(ortbRequest, 'source.ext.schain', schain); + } + } +} +(0,_src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_5__.registerOrtbProcessor)({ + type: _src_pbjsORTB_js__WEBPACK_IMPORTED_MODULE_5__.REQUEST, + name: 'sourceExtSchain', + fn: setOrtbSourceExtSchain +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('schain'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/schain.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["seedingAllianceBidAdapter"],{ + +/***/ "./modules/seedingAllianceBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/seedingAllianceBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +// jshint esversion: 6, es3: false, node: true + + + + + + + + + +const GVL_ID = 371; +const BIDDER_CODE = 'seedingAlliance'; +const DEFAULT_CUR = 'EUR'; +const ENDPOINT_URL = 'https://b.nativendo.de/cds/rtb/bid?format=openrtb2.5&ssp=pb'; +const NATIVENDO_KEY = 'nativendo_id'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_1__.ortbConverter)({ + context: { + ttl: 360, + netRevenue: true + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + // set basic page, this might be updated later by adunit param + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(request, 'site.page', bidderRequest.refererInfo.page); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(request, 'regs.ext.pb_ver', "9.45.0-pre"); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(request, 'cur', [_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('currency.adServerCurrency') || DEFAULT_CUR]); + + // As this is client side, we get needed info from headers + delete request.device; + return request; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + // add tagid from params + imp.tagid = bidRequest.params.adUnitId; + return imp; + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.adUnitId; + }, + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + const oRtbRequest = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + let eids = getEids(validBidRequests[0]); + + // check for url in params and set in site object + validBidRequests.forEach(bidRequest => { + if (bidRequest.params.url) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(oRtbRequest, 'site.page', bidRequest.params.url); + } + }); + if (bidderRequest.gdprConsent) { + oRtbRequest.user = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(oRtbRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(oRtbRequest, 'regs.ext.gdpr', typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' && bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(oRtbRequest, 'user.ext.eids', eids); + } + let endpoint = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('seedingAlliance.endpoint') || ENDPOINT_URL; + return { + method: 'POST', + url: endpoint, + data: JSON.stringify(oRtbRequest), + bidRequests: validBidRequests + }; + }, + interpretResponse: function (serverResponse, _ref) { + let { + bidRequests + } = _ref; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isEmpty)(serverResponse.body)) { + return []; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidResponses = typeof seatbid != 'undefined' ? flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => { + result[bid.impid] = bid; + return result; + }, []) : []; + return bidRequests.map(bidRequest => { + const bidId = bidRequest.bidId; + const bidResponse = bidResponses[bidId]; + const type = bidRequest.nativeParams ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER; + if (bidResponse) { + const bidObject = { + requestId: bidRequest.bidId, + // TODO get this value from response? + cpm: bidResponse.price, + creativeId: bidResponse.crid, + ttl: 600, + netRevenue: true, + currency: cur, + mediaType: type, + meta: { + advertiserDomains: bidResponse.adomain && bidResponse.adomain.length > 0 ? bidResponse.adomain : [] + } + }; + if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE) { + bidObject.native = parseNative(bidResponse, bidRequest.nativeParams); + bidObject.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE; + } + if (type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER) { + bidObject.ad = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.replaceAuctionPrice)(bidResponse.adm, bidResponse.price); + bidObject.width = bidResponse.w; + bidObject.height = bidResponse.h; + bidObject.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER; + } + return bidObject; + } + }).filter(Boolean); + } +}; +const getNativendoID = () => { + let nativendoID = storage.localStorageIsEnabled() && storage.getDataFromLocalStorage(NATIVENDO_KEY); + if (!nativendoID) { + if (storage.localStorageIsEnabled()) { + nativendoID = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.generateUUID)(); + storage.setDataInLocalStorage(NATIVENDO_KEY, nativendoID); + } + } + return nativendoID; +}; +const getEids = bidRequest => { + const eids = []; + const nativendoID = getNativendoID(); + if (nativendoID) { + const nativendoUserEid = { + source: 'nativendo.de', + uids: [{ + id: nativendoID, + atype: 1 + }] + }; + eids.push(nativendoUserEid); + } + if (bidRequest.userIdAsEids) { + eids.push(bidRequest.userIdAsEids); + } + return eids; +}; +function flatten(arr) { + return [].concat(...arr); +} +function parseNative(bid, nativeParams) { + let native; + if (typeof bid.adm === 'string') { + try { + native = JSON.parse(bid.adm).native; + } catch (e) { + return; + } + } else { + native = bid.adm.native; + } + const { + assets, + link, + imptrackers + } = native; + let clickUrl = link.url.replace(/\$\{AUCTION_PRICE\}/g, bid.price); + if (link.clicktrackers) { + link.clicktrackers.forEach(function (clicktracker, index) { + link.clicktrackers[index] = clicktracker.replace(/\$\{AUCTION_PRICE\}/g, bid.price); + }); + } + if (imptrackers) { + imptrackers.forEach(function (imptracker, index) { + imptrackers[index] = imptracker.replace(/\$\{AUCTION_PRICE\}/g, bid.price); + }); + } + const result = { + url: clickUrl, + clickUrl: clickUrl, + clickTrackers: link.clicktrackers || undefined, + impressionTrackers: imptrackers || undefined + }; + let nativeParamKeys = Object.keys(nativeParams); + let id = 0; + nativeParamKeys.forEach(nativeParam => { + assets.forEach(asset => { + if (asset.id == id) { + switch (nativeParam) { + case 'title': + result.title = asset.title.text; + break; + case 'body': + case 'cta': + case 'sponsoredBy': + result[nativeParam] = asset.data.value; + break; + case 'image': + case 'icon': + result[nativeParam] = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + break; + } + } + }); + id++; + }); + return result; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('seedingAllianceBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/seedingAllianceBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["seedtagBidAdapter"],{ + +/***/ "./modules/seedtagBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/seedtagBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDFLOOR_CURRENCY, getTimeoutUrl, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + * @typedef {import('../src/adapters/bidderFactory.js').bidderRequest} bidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').TimedOutBid} TimedOutBid + */ + +const BIDDER_CODE = 'seedtag'; +const SEEDTAG_ALIAS = 'st'; +const SEEDTAG_SSP_ENDPOINT = 'https://s.seedtag.com/c/hb/bid'; +const SEEDTAG_SSP_ONTIMEOUT_ENDPOINT = 'https://s.seedtag.com/se/hb/timeout'; + +// Global Vendor List Id +// https://iabeurope.eu/vendor-list-tcf-v2-0/ +const GVLID = 157; +const mediaTypesMap = { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]: 'display', + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]: 'video' +}; +const deviceConnection = { + FIXED: 'fixed', + MOBILE: 'mobile', + UNKNOWN: 'unknown' +}; +const BIDFLOOR_CURRENCY = 'USD'; +function getBidFloor(bidRequest) { + let floorInfo = {}; + if (typeof bidRequest.getFloor === 'function') { + floorInfo = bidRequest.getFloor({ + currency: BIDFLOOR_CURRENCY, + mediaType: '*', + size: '*' + }); + } + return floorInfo?.floor; +} +const getConnectionType = () => { + const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection || {}; + switch (connection.type || connection.effectiveType) { + case 'wifi': + case 'ethernet': + return deviceConnection.FIXED; + case 'cellular': + case 'wimax': + return deviceConnection.MOBILE; + default: + const isMobile = /iPad|iPhone|iPod/.test(navigator.userAgent) || /android/i.test(navigator.userAgent); + return isMobile ? deviceConnection.UNKNOWN : deviceConnection.FIXED; + } +}; +function mapMediaType(seedtagMediaType) { + if (seedtagMediaType === 'display') return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + if (seedtagMediaType === 'video') return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO;else return seedtagMediaType; +} +function hasVideoMediaType(bid) { + return !!bid.mediaTypes && !!bid.mediaTypes.video; +} +function hasBannerMediaType(bid) { + return !!bid.mediaTypes && !!bid.mediaTypes.banner; +} +function hasMandatoryDisplayParams(bid) { + const p = bid.params; + return !!p.publisherId && !!p.adUnitId; +} +function hasMandatoryVideoParams(bid) { + const videoParams = getVideoParams(bid); + let isValid = !!bid.params.publisherId && !!bid.params.adUnitId && hasVideoMediaType(bid) && !!videoParams.playerSize && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(videoParams.playerSize) && videoParams.playerSize.length > 0; + return isValid; +} +function buildBidRequest(validBidRequest) { + const params = validBidRequest.params; + const mediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(Object.keys(validBidRequest.mediaTypes), function (pbjsType) { + return mediaTypesMap[pbjsType]; + }); + const bidRequest = { + id: validBidRequest.bidId, + transactionId: validBidRequest.ortb2Imp?.ext?.tid, + gpid: validBidRequest.ortb2Imp?.ext?.gpid, + sizes: validBidRequest.sizes, + supplyTypes: mediaTypes, + adUnitId: params.adUnitId, + adUnitCode: validBidRequest.adUnitCode, + geom: geom(validBidRequest.adUnitCode), + placement: params.placement, + requestCount: validBidRequest.bidderRequestsCount || 1 // FIXME : in unit test the parameter bidderRequestsCount is undefinedt + }; + if (hasVideoMediaType(validBidRequest)) { + bidRequest.videoParams = getVideoParams(validBidRequest); + } + const bidFloor = getBidFloor(validBidRequest); + if (bidFloor) { + bidRequest.bidFloor = bidFloor; + } + return bidRequest; +} + +/** + * return video param (global or overrided per bidder) + */ +function getVideoParams(validBidRequest) { + const videoParams = validBidRequest.mediaTypes.video || {}; + if (videoParams.playerSize) { + videoParams.w = videoParams.playerSize[0][0]; + videoParams.h = videoParams.playerSize[0][1]; + } + return videoParams; +} +function isVideoOutstream(validBidRequest) { + return getVideoParams(validBidRequest).context === 'outstream'; +} +function buildBidResponse(seedtagBid) { + const mediaType = mapMediaType(seedtagBid.mediaType); + const bid = { + requestId: seedtagBid.bidId, + cpm: seedtagBid.price, + width: seedtagBid.width, + height: seedtagBid.height, + creativeId: seedtagBid.creativeId, + currency: seedtagBid.currency, + netRevenue: true, + mediaType: mediaType, + ttl: seedtagBid.ttl, + nurl: seedtagBid.nurl, + meta: { + advertiserDomains: seedtagBid && seedtagBid.adomain && seedtagBid.adomain.length > 0 ? seedtagBid.adomain : [], + mediaType: seedtagBid.realMediaType + } + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bid.vastXml = seedtagBid.content; + } else { + bid.ad = seedtagBid.content; + } + return bid; +} + +/** + * + * @returns Measure time to first byte implementation + * @see https://web.dev/ttfb/ + * https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API + */ +function ttfb() { + const ttfb = (() => { + // Timing API V2 + try { + const entry = performance.getEntriesByType('navigation')[0]; + return Math.round(entry.responseStart - entry.startTime); + } catch (e) { + // Timing API V1 + try { + const entry = performance.timing; + return Math.round(entry.responseStart - entry.fetchStart); + } catch (e) { + // Timing API not available + return 0; + } + } + })(); + + // prevent negative or excessive value + // @see https://github.com/googleChrome/web-vitals/issues/162 + // https://github.com/googleChrome/web-vitals/issues/137 + return ttfb >= 0 && ttfb <= performance.now() ? ttfb : 0; +} +function geom(adunitCode) { + const slot = document.getElementById(adunitCode); + if (slot) { + const scrollY = window.scrollY; + const { + top, + left, + width, + height + } = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_2__.getBoundingClientRect)(slot); + const viewport = { + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerWidth, + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerHeight + }; + return { + scrollY, + top, + left, + width, + height, + viewport + }; + } +} +function getTimeoutUrl(data) { + let queryParams = ''; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(data) && data[0] && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(data[0].params) && data[0].params[0]) { + const params = data[0].params[0]; + const timeout = data[0].timeout; + queryParams = '?publisherToken=' + params.publisherId + '&adUnitId=' + params.adUnitId + '&timeout=' + timeout; + } + return SEEDTAG_SSP_ONTIMEOUT_ENDPOINT + queryParams; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: [SEEDTAG_ALIAS], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid(bid) { + const hasVideo = hasVideoMediaType(bid); + const hasBanner = hasBannerMediaType(bid); + + // when accept both mediatype but it must be outstream + if (hasVideo && hasBanner) { + return hasMandatoryVideoParams(bid) && isVideoOutstream(bid) && hasMandatoryDisplayParams(bid); + } else if (hasVideo) { + return hasMandatoryVideoParams(bid); + } else if (hasBanner) { + return hasMandatoryDisplayParams(bid); + } else { + return false; + } + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests an array of bids + * @param {bidderRequest} bidderRequest an array of bids + * @return ServerRequest Info describing the request to the server. + */ + buildRequests(validBidRequests, bidderRequest) { + const payload = { + url: bidderRequest.refererInfo.page, + publisherToken: validBidRequests[0].params.publisherId, + cmp: !!bidderRequest.gdprConsent, + timeout: bidderRequest.timeout, + version: "9.45.0-pre", + connectionType: getConnectionType(), + auctionStart: bidderRequest.auctionStart || Date.now(), + ttfb: ttfb(), + bidRequests: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(validBidRequests, buildBidRequest), + user: { + topics: [], + eids: [] + }, + site: {} + }; + if (payload.cmp) { + const gdprApplies = bidderRequest.gdprConsent.gdprApplies; + if (gdprApplies !== undefined) payload['ga'] = gdprApplies; + payload['cd'] = bidderRequest.gdprConsent.consentString; + } + if (bidderRequest.uspConsent) { + payload['uspConsent'] = bidderRequest.uspConsent; + } + if (validBidRequests[0].schain) { + payload.schain = validBidRequests[0].schain; + } + let coppa = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa'); + if (coppa) { + payload.coppa = coppa; + } + if (bidderRequest.gppConsent) { + payload.gppConsent = { + gppString: bidderRequest.gppConsent.gppString, + applicableSections: bidderRequest.gppConsent.applicableSections + }; + } else if (bidderRequest.ortb2?.regs?.gpp) { + payload.gppConsent = { + gppString: bidderRequest.ortb2.regs.gpp, + applicableSections: bidderRequest.ortb2.regs.gpp_sid + }; + } + if (bidderRequest.ortb2?.user?.data) { + payload.user.topics = bidderRequest.ortb2.user.data; + } + if (validBidRequests[0] && validBidRequests[0].userIdAsEids) { + payload.user.eids = validBidRequests[0].userIdAsEids; + } + if (bidderRequest.ortb2?.bcat) { + payload.bcat = bidderRequest.ortb2?.bcat; + } + if (bidderRequest.ortb2?.badv) { + payload.badv = bidderRequest.ortb2?.badv; + } + if (bidderRequest.ortb2?.device?.sua) { + payload.sua = bidderRequest.ortb2.device.sua; + } + if (bidderRequest.ortb2?.site?.cat) { + payload.site.cat = bidderRequest.ortb2.site.cat; + } + if (bidderRequest.ortb2?.site?.cattax) { + payload.site.cattax = bidderRequest.ortb2.site.cattax; + } + if (bidderRequest.ortb2?.site?.pagecat) { + payload.site.pagecat = bidderRequest.ortb2.site.pagecat; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: SEEDTAG_SSP_ENDPOINT, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const serverBody = serverResponse.body; + if (serverBody && serverBody.bids && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverBody.bids)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(serverBody.bids, function (bid) { + return buildBidResponse(bid); + }); + } else { + return []; + } + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs(syncOptions, serverResponses) { + const serverResponse = serverResponses[0]; + if (syncOptions.iframeEnabled && serverResponse) { + const cookieSyncUrl = serverResponse.body.cookieSync; + return cookieSyncUrl ? [{ + type: 'iframe', + url: cookieSyncUrl + }] : []; + } else { + return []; + } + }, + /** + * Register bidder specific code, which will execute if bidder timed out after an auction + * @param {TimedOutBid} data Containing timeout specific data + */ + onTimeout(data) { + const url = getTimeoutUrl(data); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(url); + }, + /** + * Function to call when the adapter wins the auction + * @param {Bid} bid The bid information received from the server + */ + onBidWon: function (bid) { + if (bid && bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(bid.nurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('seedtagBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/seedtagBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["semantiqRtdProvider"],{ + +/***/ "./modules/semantiqRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/semantiqRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, convertSemantiqKeywordToOrtb, getOrtbKeywords, semantiqRtdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ + +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'semantiq'; +const LOG_PREFIX = '[SemantIQ RTD Module]: '; +const KEYWORDS_URL = 'https://api.adnz.co/api/ws-semantiq/page-keywords'; +const EVENT_COLLECTOR_URL = 'https://api.adnz.co/api/ws-clickstream-collector/submit'; +const STORAGE_KEY = `adnz_${SUBMODULE_NAME}`; +const AUDIENZZ_COMPANY_ID = 1; +const FALLBACK_TENANT_IDS = [AUDIENZZ_COMPANY_ID]; +const AUDIENZZ_GLOBAL_VENDOR_ID = 783; +const DEFAULT_TIMEOUT = 1000; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); + +/** + * Gets SemantIQ keywords from local storage. + * @param {string} pageUrl + * @returns {Object.} + */ +const getStorageKeywords = pageUrl => { + try { + const storageValue = JSON.parse(storage.getDataFromLocalStorage(STORAGE_KEY)); + if (storageValue?.url === pageUrl) { + return storageValue.keywords; + } + return null; + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Unable to get SemantiQ keywords from local storage', error); + return null; + } +}; + +/** + * Gets URL of the current page. + * @returns {string} + */ +const getPageUrl = () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowLocation)().href; + +/** + * Gets tenant IDs based on the module params + * @param {Object} params + * @returns {number[]} + */ +const getTenantIds = function () { + let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const { + companyId + } = params; + const companyIdArray = Array.isArray(companyId) ? companyId : [companyId]; + return companyIdArray.filter(Boolean).length ? companyIdArray : FALLBACK_TENANT_IDS; +}; + +/** + * Gets keywords from cache or SemantIQ service. + * @param {Object} params + * @returns {Promise>} + */ +const getKeywords = params => new Promise((resolve, reject) => { + const pageUrl = getPageUrl(); + const storageKeywords = getStorageKeywords(pageUrl); + if (storageKeywords) { + return resolve(storageKeywords); + } + const tenantIds = getTenantIds(params); + const searchParams = new URLSearchParams(); + searchParams.append('url', pageUrl); + searchParams.append('tenantIds', tenantIds.join(',')); + const requestUrl = `${KEYWORDS_URL}?${searchParams.toString()}`; + const callbacks = { + success(responseText, response) { + try { + if (response.status !== 200) { + throw new Error('Invalid response status'); + } + const data = JSON.parse(responseText); + if (!data) { + throw new Error('Failed to parse the response'); + } + storage.setDataInLocalStorage(STORAGE_KEY, JSON.stringify({ + url: pageUrl, + keywords: data + })); + resolve(data); + } catch (error) { + reject(error); + } + }, + error(error) { + reject(error); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(requestUrl, callbacks); +}); + +/** + * Converts a single key-value pair to an ORTB keyword string. + * @param {string} key + * @param {string | string[]} value + * @returns {string} + */ +const convertSemantiqKeywordToOrtb = (key, value) => { + if (!value || !value.length) { + return ''; + } + if (Array.isArray(value)) { + return value.map(valueItem => `${key}=${valueItem}`).join(','); + } + return `${key}=${value}`; +}; + +/** + * Converts SemantIQ keywords to ORTB format. + * @param {Object.} keywords + * @returns {string} + */ +const getOrtbKeywords = keywords => Object.entries(keywords).reduce((acc, entry) => { + const [key, values] = entry; + const ortbKeywordString = convertSemantiqKeywordToOrtb(key, values); + return ortbKeywordString ? [...acc, ortbKeywordString] : acc; +}, []).join(','); + +/** + * Dispatches a page impression event to the SemantIQ service. + * + * @param {number} companyId + * @returns {Promise} + */ +const dispatchPageImpressionEvent = companyId => { + window.audienzz = window.audienzz || {}; + window.audienzz.collectorPageImpressionId = window.audienzz.collectorPageImpressionId || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + const pageImpressionId = window.audienzz.collectorPageImpressionId; + const pageUrl = getPageUrl(); + const payload = { + company_id: companyId, + event_id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + event_timestamp: new Date().toISOString(), + event_type: 'pageImpression', + page_impression_id: pageImpressionId, + source: 'semantiqPrebidModule', + url: pageUrl + }; + return (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.fetch)(EVENT_COLLECTOR_URL, { + method: 'POST', + body: JSON.stringify(payload), + headers: { + 'Content-Type': 'application/json' + }, + keepalive: true + }); +}; + +/** + * Module init + * @param {Object} config + * @param {Object} userConsent + * @return {boolean} + */ +const init = (config, userConsent) => { + const { + params = {} + } = config; + const [mainCompanyId] = getTenantIds(params); + dispatchPageImpressionEvent(mainCompanyId); + return true; +}; + +/** + * Receives real-time data from SemantIQ service. + * @param {Object} reqBidsConfigObj + * @param {function} onDone + * @param {Object} moduleConfig + */ +const getBidRequestData = (reqBidsConfigObj, onDone, moduleConfig) => { + let isDone = false; + const { + params = {} + } = moduleConfig || {}; + const { + timeout = DEFAULT_TIMEOUT + } = params; + try { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(LOG_PREFIX, { + reqBidsConfigObj + }); + const { + adUnits = [] + } = reqBidsConfigObj; + if (!adUnits.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_PREFIX, 'No ad units found in the request'); + isDone = true; + onDone(); + } + getKeywords(params).then(keywords => { + const ortbKeywords = getOrtbKeywords(keywords); + const siteKeywords = reqBidsConfigObj.ortb2Fragments?.global?.site?.keywords; + const updatedGlobalOrtb = { + site: { + keywords: [siteKeywords, ortbKeywords].filter(Boolean).join(',') + } + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.global, updatedGlobalOrtb); + }).catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + }).finally(() => { + isDone = true; + onDone(); + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(LOG_PREFIX, error); + isDone = true; + onDone(); + } + setTimeout(() => { + if (!isDone) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)(LOG_PREFIX, 'Timeout exceeded'); + isDone = true; + onDone(); + } + }, timeout); +}; + +/** @type {RtdSubmodule} */ +const semantiqRtdSubmodule = { + name: SUBMODULE_NAME, + getBidRequestData, + init, + gvlid: AUDIENZZ_GLOBAL_VENDOR_ID +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)(MODULE_NAME, semantiqRtdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('semantiqRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/semantiqRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["setupadBidAdapter"],{ + +/***/ "./modules/setupadBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/setupadBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports biddersCreativeIds, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + +const BIDDER_CODE = 'setupad'; +const ENDPOINT = 'https://prebid.setupad.io/openrtb2/auction'; +const SYNC_ENDPOINT = 'https://cookie.stpd.cloud/sync?'; +const REPORT_ENDPOINT = 'https://adapter-analytics.setupad.io/api/adapter-analytics?'; +const GVLID = 1241; +const TIME_TO_LIVE = 360; +const biddersCreativeIds = {}; // export only for tests +const NET_REVENUE = true; +const TEST_REQUEST = 0; // used only for testing + +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: NET_REVENUE, + ttl: TIME_TO_LIVE + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.prebid.storedrequest.id', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('placement_id', bidRequest.params)); + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'test', TEST_REQUEST); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.prebid.storedrequest.id', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getBidIdParameter)('account_id', bidderRequest.bids.find(bid => bid.hasOwnProperty('params')).params)); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'setupad', 'adapter'); + return request; + } +}); +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + gvlid: GVLID, + isBidRequestValid: function (bid) { + return !!(bid.params.placement_id && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(bid.params.placement_id) && bid.params.account_id && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(bid.params.account_id)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const data = converter.toORTB({ + validBidRequests, + bidderRequest + }); + return { + method: 'POST', + url: ENDPOINT, + data, + options: { + contentType: 'text/plain', + withCredentials: true + } + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse || !serverResponse.body || typeof serverResponse.body != 'object' || Object.keys(serverResponse.body).length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('no response or body is malformed'); + return []; + } + + // set a seat for creativeId for triggerPixel url + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(serverResponse.body.seatbid, res => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(res.bid, bid => { + biddersCreativeIds[bid.crid] = res.seat; + }); + }); + + // used for a test case "should update biddersCreativeIds correctly" to return early and not throw ORTB error + if (serverResponse.testCase === 1) return; + const bids = converter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + return bids; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) { + if (!responses?.length) return []; + const syncs = []; + const bidders = getBidders(responses); + if (syncOptions.iframeEnabled && bidders) { + const queryParams = []; + queryParams.push(`bidders=${bidders}`); + queryParams.push('gdpr=' + +gdprConsent?.gdprApplies); + queryParams.push('gdpr_consent=' + gdprConsent?.consentString); + queryParams.push('usp_consent=' + (uspConsent || '')); + const strQueryParams = queryParams.join('&'); + syncs.push({ + type: 'iframe', + url: SYNC_ENDPOINT + strQueryParams + '&type=iframe' + }); + return syncs; + } + return []; + }, + onBidWon: function (bid) { + let bidder = bid.bidder || bid.bidderCode; + const auctionId = bid.auctionId; + if (bidder !== BIDDER_CODE) return; + let params; + if (bid.params) { + params = Array.isArray(bid.params) ? bid.params : [bid.params]; + } else { + if (Array.isArray(bid.bids)) { + params = bid.bids.map(singleBid => singleBid.params); + } + } + if (!params?.length) return; + const placementIdsArray = []; + params.forEach(param => { + if (!param.placement_id) return; + placementIdsArray.push(param.placement_id); + }); + const placementIds = placementIdsArray.length && placementIdsArray.join(';') || ''; + if (!placementIds) return; + + // find the winning bidder by using creativeId as identification + if (biddersCreativeIds.hasOwnProperty(bid.creativeId) && biddersCreativeIds[bid.creativeId]) { + bidder = biddersCreativeIds[bid.creativeId]; + } + const queryParams = []; + queryParams.push(`event=bidWon`); + queryParams.push('bidder=' + bidder); + queryParams.push('placementIds=' + placementIds); + queryParams.push('auctionId=' + auctionId); + queryParams.push('cpm=' + bid.originalCpm); + queryParams.push('currency=' + bid.originalCurrency); + queryParams.push('timestamp=' + Date.now()); + const strQueryParams = queryParams.join('&'); + const url = REPORT_ENDPOINT + strQueryParams; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(url); + } +}; +function getBidders(serverResponse) { + const bidders = serverResponse.map(res => Object.keys(res.body.ext.responsetimemillis || [])).flat(1); + if (bidders.length) { + return encodeURIComponent(JSON.stringify([...new Set(bidders)])); + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('setupadBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/setupadBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sharedIdSystem"],{ + +/***/ "./modules/sharedIdSystem.js": +/*!***********************************!*\ + !*** ./modules/sharedIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, sharedIdSystemSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/consentHandler.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _libraries_domainOverrideToRootDomain_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/domainOverrideToRootDomain/index.js */ "./libraries/domainOverrideToRootDomain/index.js"); + +/** + * This module adds SharedId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/sharedIdSystem + * @requires module:modules/userId + */ + + + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').SubmoduleParams} SubmoduleParams + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: 'sharedId' +}); +const COOKIE = 'cookie'; +const LOCAL_STORAGE = 'html5'; +const OPTOUT_NAME = '_pubcid_optout'; +const PUB_COMMON_ID = 'PublisherCommonId'; + +/** + * Read a value either from cookie or local storage + * @param {string} name Name of the item + * @param {string} type storage type override + * @returns {string|null} a string if item exists + */ +function readValue(name, type) { + if (type === COOKIE) { + return storage.getCookie(name); + } else if (type === LOCAL_STORAGE) { + if (storage.hasLocalStorage()) { + const expValue = storage.getDataFromLocalStorage(`${name}_exp`); + if (!expValue) { + return storage.getDataFromLocalStorage(name); + } else if (new Date(expValue).getTime() - Date.now() > 0) { + return storage.getDataFromLocalStorage(name); + } + } + } +} +function getIdCallback(pubcid, pixelUrl) { + return function (callback, getStoredId) { + if (pixelUrl) { + queuePixelCallback(pixelUrl, pubcid, () => { + callback(getStoredId() || pubcid); + })(); + } else { + callback(pubcid); + } + }; +} +function queuePixelCallback(pixelUrl) { + let id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + let callback = arguments.length > 2 ? arguments[2] : undefined; + if (!pixelUrl) { + return; + } + + // Use pubcid as a cache buster + const urlInfo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(pixelUrl); + urlInfo.search.id = encodeURIComponent('pubcid:' + id); + const targetUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)(urlInfo); + return function () { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(targetUrl, callback); + }; +} +function hasOptedOut() { + return !!(storage.cookiesAreEnabled() && readValue(OPTOUT_NAME, COOKIE) || storage.hasLocalStorage() && readValue(OPTOUT_NAME, LOCAL_STORAGE)); +} +const sharedIdSystemSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'sharedId', + aliasName: 'pubCommonId', + gvlid: _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_3__.VENDORLESS_GVLID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @param {SubmoduleConfig} config + * @returns {{pubcid:string}} + */ + decode(value, config) { + if (hasOptedOut()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('PubCommonId decode: Has opted-out'); + return undefined; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(' Decoded value PubCommonId ' + value); + const idObj = { + 'pubcid': value + }; + return idObj; + }, + /** + * performs action to obtain id + * @function + * @param {SubmoduleConfig} [config] Config object with params and storage properties + * @param {Object} consentData + * @param {string} storedId Existing pubcommon id + * @returns {IdResponse} + */ + getId: function () { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let consentData = arguments.length > 1 ? arguments[1] : undefined; + let storedId = arguments.length > 2 ? arguments[2] : undefined; + if (hasOptedOut()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('PubCommonId: Has opted-out'); + return; + } + if (consentData?.coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('PubCommonId: IDs not provided for coppa requests, exiting PubCommonId'); + return; + } + const { + params: { + create = true, + pixelUrl + } = {} + } = config; + let newId = storedId; + if (!newId) { + try { + if (typeof window[PUB_COMMON_ID] === 'object') { + // If the page includes its own pubcid module, then save a copy of id. + newId = window[PUB_COMMON_ID].getId(); + } + } catch (e) {} + if (!newId) newId = create && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.hasDeviceAccess)() ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)() : undefined; + } + return { + id: newId, + callback: getIdCallback(newId, pixelUrl) + }; + }, + /** + * performs action to extend an id. There are generally two ways to extend the expiration time + * of stored id: using pixelUrl or return the id and let main user id module write it again with + * the new expiration time. + * + * PixelUrl, if defined, should point back to a first party domain endpoint. On the server + * side, there is either a plugin, or customized logic to read and write back the pubcid cookie. + * The extendId function itself should return only the callback, and not the id itself to avoid + * having the script-side overwriting server-side. This applies to both pubcid and sharedid. + * + * On the other hand, if there is no pixelUrl, then the extendId should return storedId so that + * its expiration time is updated. + * + * @function + * @param {SubmoduleParams} [config] + * @param {ConsentData|undefined} consentData + * @param {Object} storedId existing id + * @returns {IdResponse|undefined} + */ + extendId: function () { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let consentData = arguments.length > 1 ? arguments[1] : undefined; + let storedId = arguments.length > 2 ? arguments[2] : undefined; + if (hasOptedOut()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('PubCommonId: Has opted-out'); + return { + id: undefined + }; + } + if (consentData?.coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('PubCommonId: IDs not provided for coppa requests, exiting PubCommonId'); + return; + } + const { + params: { + extend = false, + pixelUrl + } = {} + } = config; + if (extend) { + if (pixelUrl) { + const callback = queuePixelCallback(pixelUrl, storedId); + return { + callback: callback + }; + } else { + return { + id: storedId + }; + } + } + }, + domainOverride: (0,_libraries_domainOverrideToRootDomain_index_js__WEBPACK_IMPORTED_MODULE_4__.domainOverrideToRootDomain)(storage, 'sharedId'), + eids: { + 'pubcid'(values, config) { + const eid = { + source: 'pubcid.org', + uids: values.map(id => ({ + id, + atype: 1 + })) + }; + if (config?.params?.inserter != null) { + eid.inserter = config.params.inserter; + } + return eid; + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('userId', sharedIdSystemSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('sharedIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["domainOverrideToRootDomain","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sharedIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sharethroughAnalyticsAdapter"],{ + +/***/ "./modules/sharethroughAnalyticsAdapter.js": +/*!*************************************************!*\ + !*** ./modules/sharethroughAnalyticsAdapter.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + +const emptyUrl = ''; +const analyticsType = 'endpoint'; +const STR_BIDDER_CODE = 'sharethrough'; +const STR_VERSION = '0.1.0'; +var sharethroughAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + emptyUrl, + analyticsType +}), { + STR_BEACON_HOST: 'https://b.sharethrough.com/butler?', + placementCodeSet: {}, + track(_ref) { + let { + eventType, + args + } = _ref; + if (eventType === 'bidRequested' && args.bidderCode === 'sharethrough') { + var bids = args.bids; + var keys = Object.keys(bids); + for (var i = 0; i < keys.length; i++) { + this.placementCodeSet[bids[keys[i]].placementCode] = args.bids[keys[i]]; + } + } + if (eventType === 'bidWon') { + this.bidWon(args); + } + }, + bidWon(args) { + const curBidderCode = args.bidderCode; + if (curBidderCode !== STR_BIDDER_CODE && args.adUnitCode in this.placementCodeSet) { + let strBid = this.placementCodeSet[args.adUnitCode]; + this.fireLoseBeacon(curBidderCode, args.cpm, strBid.adserverRequestId, 'headerBidLose'); + } + }, + fireLoseBeacon(winningBidderCode, winningCPM, arid, type) { + let loseBeaconUrl = this.STR_BEACON_HOST; + loseBeaconUrl = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(loseBeaconUrl, 'winnerBidderCode', winningBidderCode); + loseBeaconUrl = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(loseBeaconUrl, 'winnerCpm', winningCPM); + loseBeaconUrl = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(loseBeaconUrl, 'arid', arid); + loseBeaconUrl = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(loseBeaconUrl, 'type', type); + loseBeaconUrl = this.appendEnvFields(loseBeaconUrl); + this.fireBeacon(loseBeaconUrl); + }, + appendEnvFields(url) { + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(url, 'hbVersion', "9.45.0-pre"); + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(url, 'strVersion', STR_VERSION); + url = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_1__.tryAppendQueryString)(url, 'hbSource', 'prebid'); + return url; + }, + fireBeacon(theUrl) { + const img = new Image(); + img.src = theUrl; + } +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].registerAnalyticsAdapter({ + adapter: sharethroughAdapter, + code: 'sharethrough' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (sharethroughAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('sharethroughAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sharethroughAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sharethroughBidAdapter"],{ + +/***/ "./modules/sharethroughBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/sharethroughBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports sharethroughInternal, sharethroughAdapterSpec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + +const VERSION = '4.3.0'; +const BIDDER_CODE = 'sharethrough'; +const SUPPLY_ID = 'WYu2BXv1'; +const STR_ENDPOINT = `https://btlr.sharethrough.com/universal/v1?supply_id=${SUPPLY_ID}`; +const IDENTIFIER_PREFIX = 'Sharethrough:'; + +// this allows stubbing of utility function that is used internally by the sharethrough adapter +const sharethroughInternal = { + getProtocol +}; +const sharethroughAdapterSpec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + gvlid: 80, + isBidRequestValid: bid => !!bid.params.pkey, + buildRequests: (bidRequests, bidderRequest) => { + const timeout = bidderRequest.timeout; + const firstPartyData = bidderRequest.ortb2 || {}; + const nonHttp = sharethroughInternal.getProtocol().indexOf('http') < 0; + const secure = nonHttp || sharethroughInternal.getProtocol().indexOf('https') > -1; + const req = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + at: 1, + cur: ['USD'], + tmax: timeout, + site: { + domain: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.domain', window.location.hostname), + page: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page', window.location.href), + ref: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.ref'), + ...firstPartyData.site + }, + device: { + ua: navigator.userAgent, + language: navigator.language, + js: 1, + dnt: navigator.doNotTrack === '1' ? 1 : 0, + h: window.screen.height, + w: window.screen.width, + ext: {} + }, + regs: { + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true ? 1 : 0, + ext: {} + }, + source: { + tid: bidderRequest.ortb2?.source?.tid, + ext: { + version: "9.45.0-pre", + str: VERSION, + schain: bidRequests[0].schain + } + }, + bcat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2, 'bcat') || bidRequests[0].params.bcat || [], + badv: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2, 'badv') || bidRequests[0].params.badv || [], + test: 0 + }; + if (bidderRequest.ortb2?.device?.ext?.cdep) { + req.device.ext['cdep'] = bidderRequest.ortb2.device.ext.cdep; + } + + // if present, merge device object from ortb2 into `req.device` + if (bidderRequest?.ortb2?.device) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(req.device, bidderRequest.ortb2.device); + } + req.user = nullish(firstPartyData.user, {}); + if (!req.user.ext) req.user.ext = {}; + req.user.ext.eids = bidRequests[0].userIdAsEids || []; + if (bidderRequest.gdprConsent) { + const gdprApplies = bidderRequest.gdprConsent.gdprApplies === true; + req.regs.ext.gdpr = gdprApplies ? 1 : 0; + if (gdprApplies) { + req.user.ext.consent = bidderRequest.gdprConsent.consentString; + } + } + if (bidderRequest.uspConsent) { + req.regs.ext.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest?.gppConsent?.gppString) { + req.regs.gpp = bidderRequest.gppConsent.gppString; + req.regs.gpp_sid = bidderRequest.gppConsent.applicableSections; + } else if (bidderRequest?.ortb2?.regs?.gpp) { + req.regs.ext.gpp = bidderRequest.ortb2.regs.gpp; + req.regs.ext.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + if (bidderRequest?.ortb2?.regs?.ext?.dsa) { + req.regs.ext.dsa = bidderRequest.ortb2.regs.ext.dsa; + } + const imps = bidRequests.map(bidReq => { + const impression = { + ext: {} + }; + + // mergeDeep(impression, bidReq.ortb2Imp); // leaving this out for now as we may want to leave stuff out on purpose + const tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'ortb2Imp.ext.tid'); + if (tid) impression.ext.tid = tid; + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) impression.ext.gpid = gpid; + const videoRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video'); + if (bidderRequest.paapi?.enabled && bidReq.mediaTypes.banner) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(impression, { + ext: { + ae: 1 + } + }); // ae = auction environment; if this is 1, ad server knows we have a fledge auction + } + if (videoRequest) { + // default playerSize, only change this if we know width and height are properly defined in the request + let [w, h] = [640, 360]; + if (videoRequest.playerSize && videoRequest.playerSize[0] && videoRequest.playerSize[0][0] && videoRequest.playerSize[0][1]) { + [w, h] = videoRequest.playerSize[0]; + } + + /** + * Applies a specified property to an impression object if it is present in the video request + * @param {string} prop A property to apply to the impression object + * @param {object} vidReq A video request object from which to extract the property + * @param {object} imp A video impression object to which to apply the property + */ + const applyVideoProperty = (prop, vidReq, imp) => { + const propIsTypeArray = ['api', 'battr', 'mimes', 'playbackmethod', 'protocols'].includes(prop); + if (propIsTypeArray) { + const notAssignable = (!Array.isArray(vidReq[prop]) || vidReq[prop].length === 0) && vidReq[prop]; + if (notAssignable) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${IDENTIFIER_PREFIX} Invalid video request property: "${prop}" must be an array with at least 1 entry. Value supplied: "${vidReq[prop]}". This will not be added to the bid request.`); + return; + } + } + if (vidReq[prop]) { + imp.video[prop] = vidReq[prop]; + } + }; + impression.video = { + pos: nullish(videoRequest.pos, 0), + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1, + w, + h + }; + const propertiesToConsider = ['api', 'battr', 'companionad', 'companiontype', 'delivery', 'linearity', 'maxduration', 'mimes', 'minduration', 'placement', 'playbackmethod', 'plcmt', 'protocols', 'skip', 'skipafter', 'skipmin', 'startdelay']; + propertiesToConsider.forEach(propertyToConsider => { + applyVideoProperty(propertyToConsider, videoRequest, impression); + }); + } else { + impression.banner = { + pos: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.banner.pos', 0), + topframe: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.inIframe)() ? 0 : 1, + format: bidReq.sizes.map(size => ({ + w: +size[0], + h: +size[1] + })) + }; + const battr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.banner.battr', null) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'ortb2Imp.banner.battr'); + if (battr) impression.banner.battr = battr; + } + return { + id: bidReq.bidId, + tagid: String(bidReq.params.pkey), + secure: secure ? 1 : 0, + bidfloor: getBidRequestFloor(bidReq), + ...impression + }; + }).filter(imp => !!imp); + return imps.map(impression => { + return { + method: 'POST', + url: STR_ENDPOINT, + data: { + ...req, + imp: [impression] + } + }; + }); + }, + interpretResponse: (_ref, req) => { + let { + body + } = _ref; + if (!body || !body.seatbid || body.seatbid.length === 0 || !body.seatbid[0].bid || body.seatbid[0].bid.length === 0) { + return []; + } + const fledgeAuctionEnabled = body.ext?.auctionConfigs; + const bidsFromExchange = body.seatbid[0].bid.map(bid => { + // Spec: https://docs.prebid.org/dev-docs/bidder-adaptor.html#interpreting-the-response + const response = { + requestId: bid.impid, + width: +bid.w, + height: +bid.h, + cpm: +bid.price, + creativeId: bid.crid, + dealId: bid.dealid || null, + mediaType: req.data.imp[0].video ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + currency: body.cur || 'USD', + netRevenue: true, + ttl: 360, + ad: bid.adm, + nurl: bid.nurl, + meta: { + advertiserDomains: bid.adomain || [], + networkId: bid.ext?.networkId || null, + networkName: bid.ext?.networkName || null, + agencyId: bid.ext?.agencyId || null, + agencyName: bid.ext?.agencyName || null, + advertiserId: bid.ext?.advertiserId || null, + advertiserName: bid.ext?.advertiserName || null, + brandId: bid.ext?.brandId || null, + brandName: bid.ext?.brandName || null, + demandSource: bid.ext?.demandSource || null, + dchain: bid.ext?.dchain || null, + primaryCatId: bid.ext?.primaryCatId || null, + secondaryCatIds: bid.ext?.secondaryCatIds || null, + mediaType: bid.ext?.mediaType || null + } + }; + if (response.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + response.ttl = 3600; + response.vastXml = bid.adm; + } + return response; + }); + if (fledgeAuctionEnabled) { + return { + bids: bidsFromExchange, + paapi: body.ext?.auctionConfigs || {} + }; + } else { + return bidsFromExchange; + } + }, + getUserSyncs: (syncOptions, serverResponses) => { + const shouldCookieSync = syncOptions.pixelEnabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(serverResponses, '0.body.cookieSyncUrls') !== undefined; + return shouldCookieSync ? serverResponses[0].body.cookieSyncUrls.map(url => ({ + type: 'image', + url: url + })) : []; + }, + // Empty implementation for prebid core to be able to find it + onTimeout: data => {}, + // Empty implementation for prebid core to be able to find it + onBidWon: bid => {}, + // Empty implementation for prebid core to be able to find it + onSetTargeting: bid => {} +}; +function getBidRequestFloor(bid) { + let floor = null; + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: bid.mediaTypes && bid.mediaTypes.video ? 'video' : 'banner', + size: bid.sizes.map(size => ({ + w: size[0], + h: size[1] + })) + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = parseFloat(floorInfo.floor); + } + } + return floor !== null ? floor : bid.params.floor; +} +function getProtocol() { + return window.location.protocol; +} + +// stub for ?? operator +function nullish(input, def) { + return input === null || input === undefined ? def : input; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(sharethroughAdapterSpec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('sharethroughBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sharethroughBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["shinezBidAdapter"],{ + +/***/ "./modules/shinezBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/shinezBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/riseUtils/index.js */ "./libraries/riseUtils/index.js"); + + + + +const BIDDER_CODE = 'shinez'; +const BASE_URL = 'https://hb.sweetgum.io/'; +const MODES = { + PRODUCTION: 'hb-sz-multi', + TEST: 'hb-multi-sz-test' +}; +const spec = { + ...(0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.makeBaseSpec)(BASE_URL, MODES), + code: BIDDER_CODE, + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('no params have been set to Shinez adapter'); + return false; + } + if (!bidRequest.params.org) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('org is a mandatory param for Shinez adapter'); + return false; + } + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('shinezBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["riseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/shinezBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["shinezRtbBidAdapter"],{ + +/***/ "./modules/shinezRtbBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/shinezRtbBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, createDomain, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/vidazooUtils/bidderUtils.js */ "./libraries/vidazooUtils/bidderUtils.js"); + + + + + +const DEFAULT_SUB_DOMAIN = 'exchange'; +const BIDDER_CODE = 'shinezRtb'; +const BIDDER_VERSION = '1.0.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function createDomain() { + let subDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SUB_DOMAIN; + return `https://${subDomain}.sweetgum.io`; +} +const buildRequests = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createBuildRequestsFn)(createDomain, null, storage, BIDDER_CODE, BIDDER_VERSION, false); +const interpretResponse = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createInterpretResponseFn)(BIDDER_CODE, false); +const getUserSyncs = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createUserSyncGetter)({ + iframeSyncUrl: 'https://sync.sweetgum.io/api/sync/iframe', + imageSyncUrl: 'https://sync.sweetgum.io/api/sync/image' +}); +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('shinezRtbBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","vidazooUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/shinezRtbBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["showheroes-bsBidAdapter"],{ + +/***/ "./modules/showheroes-bsBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/showheroes-bsBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + + +const ENDPOINT = 'https://ads.viralize.tv/openrtb2/auction/'; +const BIDDER_CODE = 'showheroes-bs'; +const TTL = 300; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: TTL, + currency: 'EUR', + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.context'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(imp, 'video.ext.context', videoContext); + imp.ext = imp.ext || {}; + imp.ext.params = bidRequest.params; + imp.ext.adUnitCode = bidRequest.adUnitCode; + if (!imp.displaymanager) { + imp.displaymanager = 'Prebid.js'; + imp.displaymanagerver = "9.45.0-pre"; // prebid version + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(bidRequest.getFloor)) { + return imp; + } + let floor = bidRequest.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + if (!isNaN(floor?.floor) && floor?.currency === 'EUR') { + imp.bidfloor = floor.floor; + imp.bidfloorcur = 'EUR'; + } + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + if (context.imp?.video?.ext?.context === 'outstream') { + const renderConfig = { + rendererUrl: bid.ext?.rendererConfig?.rendererUrl, + renderFunc: bid.ext?.rendererConfig?.renderFunc, + renderOptions: bid.ext?.rendererConfig?.renderOptions + }; + if (renderConfig.renderFunc && renderConfig.rendererUrl) { + bidResponse.renderer = createRenderer(bidResponse, renderConfig); + } + } + bidResponse.callbacks = bid.ext?.callbacks; + bidResponse.extra = bid.ext?.extra; + return bidResponse; + } +}); +const GVLID = 111; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: ['showheroesBs'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + isBidRequestValid: bid => { + return !!bid.params.unitId; + }, + buildRequests: (bidRequests, bidderRequest) => { + const QA = bidRequests[0].params.qa; + const ortbData = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + url: QA?.endpoint || ENDPOINT, + method: 'POST', + data: ortbData + }; + }, + interpretResponse: (response, request) => { + if (!response.body) { + return []; + } + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + }, + getUserSyncs: (syncOptions, serverResponses) => { + const syncs = []; + if (!serverResponses.length || !serverResponses[0].body?.ext?.userSync) { + return syncs; + } + const userSync = serverResponses[0].body.ext.userSync; + if (syncOptions.iframeEnabled && userSync?.iframes?.length) { + userSync.iframes.forEach(url => { + syncs.push({ + type: 'iframe', + url + }); + }); + } + if (syncOptions.pixelEnabled) { + (userSync.pixels || []).forEach(url => { + syncs.push({ + type: 'image', + url + }); + }); + } + return syncs; + }, + onBidWon(bid) { + if (bid.callbacks) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.triggerPixel)(bid.callbacks.won); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`Showheroes adapter won the auction. Bid id: ${bid.bidId || bid.requestId}`); + } +}; +function outstreamRender(response, renderConfig) { + response.renderer.push(() => { + const func = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(window, renderConfig.renderFunc); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(func)) { + return; + } + const renderPayload = { + ...renderConfig.renderOptions + }; + if (response.vastXml) { + renderPayload.adResponse = { + content: response.vastXml + }; + } + func(renderPayload); + }); +} +function createRenderer(bid, renderConfig) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bid.id, + url: renderConfig.rendererUrl, + loaded: false, + adUnitCode: bid.adUnitCode + }); + renderer.setRender(render => { + return outstreamRender(render, renderConfig); + }); + return renderer; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('showheroes-bsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/showheroes-bsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["silvermobBidAdapter"],{ + +/***/ "./modules/silvermobBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/silvermobBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + +// import { logMessage } from '../src/utils.js'; + + + + +const BIDDER_CODE = 'silvermob'; +const AD_URL = 'https://{HOST}.silvermob.com/marketplace/api/dsp/prebidjs/{ZONEID}'; +const GVLID = 1058; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + if (!imp.bidfloor) imp.bidfloor = bidRequest.params.bidfloor || 0; + imp.ext = { + [BIDDER_CODE]: { + zoneid: bidRequest.params.zoneid, + host: bidRequest.params.host || 'us' + } + }; + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + const bid = context.bidRequests[0]; + request.test = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('debug') ? 1 : 0; + if (!request.cur) request.cur = [bid.params.currency || 'USD']; + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.cur = bid.cur || 'USD'; + return bidResponse; + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.NATIVE], + isBidRequestValid: bid => { + return Boolean(bid.bidId && bid.params && !isNaN(bid.params.zoneid)); + }, + buildRequests: (validBidRequests, bidderRequest) => { + if (validBidRequests && validBidRequests.length === 0) return []; + const host = validBidRequests[0].params.host || 'us'; + const zoneid = validBidRequests[0].params.zoneid; + const data = converter.toORTB({ + bidRequests: validBidRequests, + bidderRequest + }); + return { + method: 'POST', + url: AD_URL.replace('{HOST}', host).replace('{ZONEID}', zoneid), + data: data + }; + }, + interpretResponse: (response, request) => { + if (response?.body) { + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + return bids; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('silvermobBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/silvermobBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["silverpushBidAdapter"],{ + +/***/ "./modules/silverpushBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/silverpushBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports REQUEST_URL, SP_OUTSTREAM_PLAYER_URL, VIDEO_ORTB_REQUIRED, spec, CONVERTER */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + + +const BIDDER_CODE = 'silverpush'; +const bidderConfig = 'sp_pb_ortb'; +const bidderVersion = '1.0.0'; +const DEFAULT_CURRENCY = 'USD'; +const REQUEST_URL = 'https://prebid.chocolateplatform.co/bidder/?identifier=prebidchoc'; +const SP_OUTSTREAM_PLAYER_URL = 'https://xaido.sgp1.cdn.digitaloceanspaces.com/prebid/spoutstream.min.js'; +const VIDEO_ORTB_PARAMS = ['mimes', 'minduration', 'maxduration', 'placement', 'protocols', 'startdelay', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']; +const VIDEO_ORTB_REQUIRED = ['api', 'mimes', 'placement', 'protocols', 'minduration', 'maxduration', 'startdelay']; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + onBidWon, + getRequest: function (endpoint) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(endpoint, null, undefined, { + method: 'GET' + }); + }, + getOS: function (ua) { + if (ua.indexOf('Windows') != -1) { + return 'Windows'; + } else if (ua.match(/(iPhone|iPod|iPad)/)) { + return 'iOS'; + } else if (ua.indexOf('Mac OS X') != -1) { + return 'macOS'; + } else if (ua.match(/Android/)) { + return 'Android'; + } else if (ua.indexOf('Linux') != -1) { + return 'Linux'; + } else { + return 'Unknown'; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +const CONVERTER = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300 + }, + imp(buildImp, bidRequest, context) { + let imp = buildImp(bidRequest, context); + if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]) { + imp = buildVideoImp(bidRequest, imp); + } else if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]) { + imp = buildBannerImp(bidRequest, imp); + } + const bidFloor = getBidFloor(bidRequest, bidRequest.bidderRequest); + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'bidfloor', bidFloor); + if (bidRequest.params.deals && bidRequest.params.deals.length > 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'pmp', { + deals: bidRequest.params.deals + }); + } + return imp; + }, + request(buildRequest, imps, bidderRequest, context) { + const req = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)(req, { + at: 1, + ext: { + bc: `${bidderConfig}_${bidderVersion}` + } + }); + let userAgent = navigator.userAgent; + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'device.os', spec.getOS(userAgent)); + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'device.devicetype', _isMobile() ? 1 : _isConnectedTV() ? 3 : 2); + const bid = context.bidRequests[0]; + if (bid.params.publisherId) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(req, 'site.publisher.id', bid.params.publisherId); + } + return req; + }, + bidResponse(buildBidResponse, bid, context) { + let bidResponse = buildBidResponse(bid, context); + if (bid.ext) { + bidResponse.meta.networkId = bid.ext.dsp_id; + bidResponse.meta.advertiserId = bid.ext.buyer_id; + bidResponse.meta.brandId = bid.ext.brand_id; + } + if (context.ortbResponse.ext && context.ortbResponse.ext.paf) { + bidResponse.meta.paf = Object.assign({}, context.ortbResponse.ext.paf); + bidResponse.meta.paf.content_id = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bid, 'ext.paf.content_id'); + } + bidResponse = buildVideoVastResponse(bidResponse); + bidResponse = buildVideoOutstreamResponse(bidResponse, context); + return bidResponse; + }, + response(buildResponse, bidResponses, ortbResponse, context) { + const response = buildResponse(bidResponses, ortbResponse, context); + let fledgeAuctionConfigs = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](ortbResponse, 'ext.fledge_auction_configs'); + if (fledgeAuctionConfigs) { + fledgeAuctionConfigs = Object.entries(fledgeAuctionConfigs).map(_ref => { + let [bidId, cfg] = _ref; + return Object.assign({ + bidId, + auctionSignals: {} + }, cfg); + }); + return { + bids: response.bids, + paapi: fledgeAuctionConfigs + }; + } else { + return response.bids; + } + } +}); +function isBidRequestValid(bidRequest) { + return isPublisherIdValid(bidRequest) && (isValidBannerRequest(bidRequest) || isValidVideoRequest(bidRequest)); +} +function isPublisherIdValid(bidRequest) { + let pubId = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, 'params.publisherId'); + return pubId != null && _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isStr(pubId) && pubId != ''; +} +function isValidBannerRequest(bidRequest) { + const bannerSizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER}.sizes`); + return _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArray(bannerSizes) && bannerSizes.length > 0 && bannerSizes.every(size => _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isNumber(size[0]) && _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isNumber(size[1])); +} +function isValidVideoRequest(bidRequest) { + const videoSizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}.playerSize`); + const PARAM_EXISTS = VIDEO_ORTB_REQUIRED.every(param => _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}.${param}`) != null); + return PARAM_EXISTS && _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArray(videoSizes) && videoSizes.length > 0 && videoSizes.every(size => _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isNumber(size[0]) && _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isNumber(size[1])); +} +function buildRequests(validBids, bidderRequest) { + let videoBids = validBids.filter(bid => isVideoBid(bid)); + let bannerBids = validBids.filter(bid => isBannerBid(bid)); + let requests = []; + bannerBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)); + }); + videoBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)); + }); + return requests; +} +function buildVideoImp(bidRequest, imp) { + if (bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]?.context === 'outstream') { + imp.video.placement = imp.video.placement || 4; + } + const videoMediaType = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}`); + const videoSizes = videoMediaType && videoMediaType.playerSize || []; + if (videoSizes && videoSizes.length > 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'video.w', videoSizes[0][0]); + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'video.h', videoSizes[0][1]); + } + const videoAdUnitParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}`, {}); + const videoBidderParams = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `params.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO}`, {}); + const videoParams = { + ...videoAdUnitParams, + ...videoBidderParams + }; + VIDEO_ORTB_PARAMS.forEach(param => { + if (videoParams.hasOwnProperty(param)) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, `video.${param}`, videoParams[param]); + } + }); + return { + ...imp + }; +} +function buildBannerImp(bidRequest, imp) { + const bannerSizes = _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bidRequest, `mediaTypes.${_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER}.sizes`, []); + if (bannerSizes && bannerSizes.length > 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'banner.w', bannerSizes[0][0]); + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset(imp, 'banner.h', bannerSizes[0][1]); + } + return { + ...imp + }; +} +function createRequest(bidRequests, bidderRequest, mediaType) { + return { + method: 'POST', + url: REQUEST_URL, + data: CONVERTER.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }), + bidderRequest + }; +} +function buildVideoVastResponse(bidResponse) { + if (bidResponse.mediaType == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO && bidResponse.vastXml) { + bidResponse.vastUrl = bidResponse.vastXml; + } + return { + ...bidResponse + }; +} +function buildVideoOutstreamResponse(bidResponse, context) { + if (context.bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]?.context === 'outstream') { + bidResponse.rendererUrl = SP_OUTSTREAM_PLAYER_URL; + bidResponse.adUnitCode = context.bidRequest.adUnitCode; + bidResponse.renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: bidResponse.requestId, + adUnitCode: context.bidRequest.adUnitCode, + url: bidResponse.rendererUrl + }); + bidResponse.renderer.setRender(_renderer(bidResponse)); + bidResponse.renderer.render(bidResponse); + } + return { + ...bidResponse + }; +} +function getBidFloor(bid, bidderRequest) { + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_8__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CURRENCY; + if (typeof bid.getFloor !== 'function') { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bid, 'params.bidFloor', 0.05); + } + const bidFloor = bid.getFloor({ + currency: currency, + mediaType: '*', + size: '*' + }); + return bidFloor?.floor; +} +function _renderer(bid) { + bid.renderer.push(() => { + if (typeof window.SPOutStreamPlayer === 'function') { + const spoplayer = new window.SPOutStreamPlayer(bid); + spoplayer.on('ready', () => { + spoplayer.startAd(); + }); + try { + let vastUrlbt = 'data:text/xml;charset=utf-8;base64,' + btoa(bid.vastUrl.replace(/\\"/g, '"')); + spoplayer.load(vastUrlbt).then(function () { + window.spoplayer = spoplayer; + }).catch(function (reason) { + setTimeout(function () { + throw reason; + }, 0); + }); + } catch (err) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logMessage(err); + } + } else { + _src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logMessage(`Silverpush outstream player is not defined`); + } + }); +} +function isVideoBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bid, 'mediaTypes.video'); +} +function isBannerBid(bid) { + return _src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"](bid, 'mediaTypes.banner') || !isVideoBid(bid); +} +function interpretResponse(resp, req) { + if (!resp.body) { + resp.body = { + nbr: 0 + }; + } + return CONVERTER.fromORTB({ + request: req.data, + response: resp.body + }); +} +function onBidWon(bid) { + if (bid == null) { + return; + } + if (bid['burl'] == null) { + return; + } + let burlMac = bid['burl']; + burlMac = burlMac.replace('$' + '{AUCTION_PRICE}', bid['cpm']); + burlMac = burlMac.replace('$' + '{AUCTION_ID}', bid['auctionId']); + burlMac = burlMac.replace('$' + '{AUCTION_IMP_ID}', bid['requestId']); + burlMac = burlMac.replace('$' + '{AUCTION_AD_ID}', bid['adId']); + burlMac = burlMac.replace('$' + '{AUCTION_SEAT_ID}', bid['seatBidId']); + spec.getRequest(burlMac); +} +function _isMobile() { + return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent); +} +function _isConnectedTV() { + return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('silverpushBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","ortb2Utils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/silverpushBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sirdataRtdProvider"],{ + +/***/ "./modules/sirdataRtdProvider.js": +/*!***************************************!*\ + !*** ./modules/sirdataRtdProvider.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports setCookieOnTopDomain, getUidFromStorage, setUidInStorage, mergeEuidsArrays, onDataDeletionRequest, postContentForSemanticAnalysis, onDocumentReady, removePII, sanitizeContent, getSegmentsAndCategories, pushToOrtb2, setOrtb2Sda, setOrtb2, loadCustomFunction, getSegAndCatsArray, applySdaGetSpecificData, addSegmentData, init, sirdataSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); + +/** + * This module adds Sirdata provider to the real time data module + * and now supports Seller Defined Audience + * The {@link module:modules/realTimeData} module is required + * The module will fetch segments (user-centric) and categories (page-centric) from Sirdata server + * The module will automatically handle user's privacy and choice in California (IAB TL CCPA Framework) and in Europe (IAB EU TCF FOR GDPR) + * @module modules/sirdataRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + + + + +/** @type {string} */ +const MODULE_NAME = 'realTimeData'; +const SUBMODULE_NAME = 'SirdataRTDModule'; +const ORTB2_NAME = 'sirdata.com'; +const LOG_PREFIX = 'Sirdata RTD: '; +const EUIDS_STORAGE_NAME = 'SDDAN'; +// Get the cookie domain from the referer info or fallback to window location hostname +const cookieDomain = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().domain || window.location.hostname; + +/** @type {number} */ +const GVLID = 53; + +/** @type {object} */ +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); +const bidderAliasRegistry = _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].aliasRegistry || {}; +const biddersId = { + // Partner IDs mapping for different SSPs and DSPs + 'criteo': 27443, + 'openx': 30342, + 'pubmatic': 30345, + 'smaato': 27520, + 'triplelift': 27518, + 'yahoossp': 30339, + 'rubicon': 27452, + 'appnexus': 27446, + 'gourmetads': 33394, + 'mediasquare': 27878, + 'smartadserver': 27440, + 'proxistore': 27484, + 'ix': 27248, + 'sdRtdForGpt': 27449, + 'smilewanted': 28690, + 'taboola': 33379, + 'ttd': 33382, + 'zeta_global': 33385, + 'teads': 33388, + 'conversant': 33391, + 'improvedigital': 33397, + 'invibes': 33400, + 'sublime': 33403, + 'rtbhouse': 33406, + 'zeta_global_ssp': 33385 +}; +const eidsProvidersMap = { + 'id5': 'id5-sync.com', + 'id5id': 'id5-sync.com', + 'id5_id': 'id5-sync.com', + 'pubprovided_id': 'pubProvidedId', + 'ppid': 'pubProvidedId', + 'first-id.fr': 'pubProvidedId', + 'sharedid': 'pubcid.org', + 'publishercommonid': 'pubcid.org', + 'pubcid.org': 'pubcid.org' +}; + +// params +let params = { + partnerId: 1, + key: 1, + actualUrl: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().stack.pop() || (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_0__.getRefererInfo)().page, + cookieAccessGranted: false, + setGptKeyValues: true, + contextualMinRelevancyScore: 30, + preprod: false, + authorizedEids: ['pubProvidedId', 'id5-sync.com', 'pubcid.org'], + avoidPostContent: false, + sirdataDomain: 'cookieless-data.com', + bidders: [] +}; + +/** + * Sets a cookie on the top-level domain + * @param {string} key - The cookie name + * @param {string} value - The cookie value + * @param {string} hostname - The hostname for setting the cookie + * @param {boolean} deleteCookie - The cookie must be deleted + * @returns {boolean} - True if the cookie was successfully set, otherwise false + */ +function setCookieOnTopDomain(key, value, hostname, deleteCookie) { + const subDomains = hostname.split('.'); + let expTime = new Date(); + expTime.setTime(expTime.getTime() + (deleteCookie ? -1 : 365 * 24 * 60 * 60 * 1000)); // Set expiration time + for (let i = 0; i < subDomains.length; ++i) { + // Try to write the cookie on this subdomain (we want it to be stored only on the TLD+1) + const domain = subDomains.slice(subDomains.length - i - 1).join('.'); + try { + STORAGE.setCookie(key, value, expTime.toUTCString(), 'Lax', '.' + domain); + // Try to read the cookie to check if we wrote it + if (STORAGE.getCookie(key, null) === value) return true; // Check if the cookie was set, and if so top domain was found. If deletion with expire date -1 will parse until complete host + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + } + return false; +} + +/** + * Retrieves the UID from storage (cookies or local storage) + * @returns {Array|null} - Array of UID objects or null if no UID found + */ +function getUidFromStorage() { + let cUid = STORAGE.getCookie(EUIDS_STORAGE_NAME, null); + let lsUid = STORAGE.getDataFromLocalStorage(EUIDS_STORAGE_NAME, null); + if (cUid && (!lsUid || cUid !== lsUid)) { + STORAGE.setDataInLocalStorage(EUIDS_STORAGE_NAME, cUid, null); + } else if (lsUid && !cUid) { + setCookieOnTopDomain(EUIDS_STORAGE_NAME, lsUid, cookieDomain, false); + cUid = lsUid; + } + return cUid ? [{ + source: 'sddan.com', + uids: [{ + id: cUid, + atype: 1 + }] + }] : null; +} + +/** + * Sets the UID in storage (cookies and local storage) + * @param {string} sddanId - The UID to be set + * @returns {boolean} - True if the UID was successfully set, otherwise false + */ +function setUidInStorage(sddanId) { + if (!sddanId) return false; + sddanId = encodeURI(sddanId.toString()); + setCookieOnTopDomain(EUIDS_STORAGE_NAME, sddanId, cookieDomain, false); + STORAGE.setDataInLocalStorage(EUIDS_STORAGE_NAME, sddanId, null); + return true; +} + +/** + * Merges and cleans objects from two eids arrays based on the 'source' and unique 'id' within the 'uids' array. + * Processes each array to add unique items or merge uids if the source already exists. + * @param {Array} euids1 - The first array to process and merge. + * @param {Array} euids2 - The second array to process and merge. + * @returns {Array} The merged array with unique sources and uid ids. + */ +function mergeEuidsArrays(euids1, euids2) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(euids1)) return euids2; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(euids2)) return euids1; + const mergedArray = []; + // Helper function to process each array + const processArray = array => { + array.forEach(item => { + if (item.uids) { + const foundIndex = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.findIndex)(mergedArray, function (x) { + return x.source === item.source; + }); + if (foundIndex !== -1) { + // Merge uids if the source is found + item.uids.forEach(uid => { + if (!mergedArray[foundIndex].uids.some(u => u.id === uid.id)) { + mergedArray[foundIndex].uids.push(uid); + } + }); + } else { + // Add the entire item if the source does not exist + mergedArray.push({ + ...item, + uids: [...item.uids] + }); + } + } + }); + }; + // Process both euids1 and euids2 + processArray(euids1); + processArray(euids2); + return mergedArray; +} + +/** + * Handles data deletion request by removing stored EU IDs + * @param {Object} moduleConfig - The module configuration + * @returns {boolean} - True if data was deleted successfully + */ +function onDataDeletionRequest(moduleConfig) { + if (moduleConfig && moduleConfig.params) { + setCookieOnTopDomain(EUIDS_STORAGE_NAME, '', window.location.hostname, true); + STORAGE.removeDataFromLocalStorage(EUIDS_STORAGE_NAME, null); + } + return !getUidFromStorage(); +} + +/** + * Sends the page content for semantic analysis to Sirdata's server. + * @param {string} postContentToken - The token required to post content. + * @param {string} actualUrl - The actual URL of the current page. + * @returns {boolean} - True if the content was sent successfully + */ +function postContentForSemanticAnalysis(postContentToken, actualUrl) { + if (!postContentToken || !actualUrl) return false; + try { + let content = document.implementation.createHTMLDocument(''); + // Clone the current document content to avoid altering the original page content + content.documentElement.innerHTML = document.documentElement.innerHTML; + // Sanitize the cloned content to remove unnecessary elements and PII + content = sanitizeContent(content); + // Serialize the sanitized content to a string + const payload = new XMLSerializer().serializeToString(content.documentElement); + if (payload && payload.length > 300 && payload.length < 300000) { + const url = `https://contextual.sirdata.io/api/v1/push/contextual?post_content_token=${postContentToken}&url=${encodeURIComponent(actualUrl)}`; + if (!(0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.sendBeacon)(url, payload)) { + // Fallback to using AJAX if Beacon API is not supported + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, {}, payload, { + contentType: 'text/plain', + method: 'POST', + withCredentials: false, + // No user-specific data is tied to the request + referrerPolicy: 'unsafe-url', + crossOrigin: true + }); + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + return false; + } + return true; +} + +/** + * Executes a callback function when the document is fully loaded. + * @param {function} callback - The function to execute when the document is ready. + */ +function onDocumentReady(callback) { + if (typeof callback !== 'function') return false; + try { + if (document.readyState && document.readyState !== 'loading') { + callback(); + } else if (typeof document.addEventListener === 'function') { + document.addEventListener('DOMContentLoaded', callback); + } + } catch (e) { + callback(); + } + return true; +} + +/** + * Removes Personally Identifiable Information (PII) from the content + * @param {string} content - The content to be sanitized + * @returns {string} - The sanitized content + */ +function removePII(content) { + const patterns = [/\b(?:\d{4}[ -]?){3}\d{4}\b/g, + // Credit card numbers + /\b\d{10,12}\b/g, + // US bank account numbers + /\b\d{5}\d{5}\d{11}\d{2}\b/g, + // EU bank account numbers + /\b(\d{3}-\d{2}-\d{4}|\d{9}|\d{13}|\d{2} \d{2} \d{2} \d{3} \d{3} \d{3})\b/g, + // SSN + /\b[A-Z]{1,2}\d{6,9}\b/g, + // Passport numbers + /\b(\d{8,10}|\d{3}-\d{3}-\d{3}-\d{3}|\d{2} \d{2} \d{2} \d{3} \d{3})\b/g, + // ID card numbers + /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, + // Email addresses + /(\+?\d{1,3}[-.\s]?)?(\(?\d{2,3}\)?[-.\s]?)(\d{2}[-.\s]?){3,4}\d{2}/g // Phone numbers + ]; + patterns.forEach(pattern => { + content = content.replace(pattern, ''); + }); + return content; +} + +/** + * Sanitizes the content by removing unnecessary elements and PII + * @param {Object} content - The content to be sanitized + * @returns {Object} - The sanitized content + */ +function sanitizeContent(content) { + if (content && content.documentElement.textContent && content.documentElement.textContent.length > 500) { + // Reduce size by removing useless content + // Allowed tags + const allowedTags = ['div', 'span', 'a', 'article', 'section', 'p', 'h1', 'h2', 'body', 'b', 'u', 'i', 'big', 'mark', 'ol', 'small', 'strong', 'blockquote', 'nav', 'menu', 'li', 'ul', 'ins', 'head', 'title', 'main', 'var', 'table', 'caption', 'colgroup', 'col', 'tr', 'td', 'th', 'summary', 'details', 'dl', 'dt', 'dd']; + const processElement = element => { + Array.from(element.childNodes).reverse().forEach(child => { + if (child.nodeType === Node.ELEMENT_NODE) { + processElement(child); + Array.from(child.attributes).forEach(attr => { + // keeps only id attributes and class attribute if useful for contextualisation + if (attr.name === 'class' && !/^(main|article|product)/.test(attr.value)) { + child.removeAttribute(attr.name); + } else if (attr.name !== 'id') { + child.removeAttribute(attr.name); + } + }); + if (!child.innerHTML.trim() || !allowedTags.includes(child.tagName.toLowerCase())) { + // Keeps only allowed Tags (allowedTags) + child.remove(); + } + } + }); + }; + const removeEmpty = element => { + // remove empty tags + Array.from(element.childNodes).reverse().forEach(child => { + if (child.nodeType === Node.ELEMENT_NODE) { + removeEmpty(child); + if (!child.innerHTML.trim()) { + child.remove(); + } + } else if (child.nodeType === Node.TEXT_NODE && !child.textContent.trim()) { + child.remove(); + } + }); + }; + processElement(content.documentElement); + removeEmpty(content.documentElement); + + // Clean any potential PII + content.documentElement.innerHTML = removePII(content.documentElement.innerHTML); + let htmlContent = content.documentElement.innerHTML; + // Remove HTML comments + // This regex removes HTML comments, including those that might not be properly closed + htmlContent = htmlContent.replace(/|$)/g, ''); + // Remove multiple spaces + htmlContent = htmlContent.replace(/\s+/g, ' '); + // Remove spaces between tags + htmlContent = htmlContent.replace(/>\s+<'); + // Assign the cleaned content + content.documentElement.innerHTML = htmlContent; + } + return content; +} + +/** + * Fetches segments and categories from Sirdata server and processes the response + * @param {Object} reqBidsConfigObj - The bids configuration object + * @param {function} onDone - The callback function to be called upon completion + * @param {Object} moduleConfig - The module Config + * @param {Object} userConsent - The user consent information + */ +function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig, userConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_PREFIX, 'get Segments And Categories'); + const adUnits = reqBidsConfigObj && reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.getGlobal)().adUnits; + if (!adUnits) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_PREFIX, 'no ad unit, RTD processing is useless'); + onDone(); + return; + } + const gdprApplies = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(userConsent, 'gdpr.gdprApplies') ? userConsent.gdpr.gdprApplies : false; + const sirdataSubDomain = params.preprod ? 'kvt-preprod' : 'kvt'; + let euids; // empty if no right to access device (publisher or user reject) + let privacySignals = ''; + + // Default global endpoint is cookie-based only if no rules falls into cookieless or consent has been given or GDPR doesn't apply + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.hasDeviceAccess)() && !userConsent.coppa && ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(userConsent.usp) || userConsent.usp === -1 || userConsent.usp[0] === '1' && userConsent.usp[1] !== 'N' && userConsent.usp[2] !== 'Y') && (!gdprApplies || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(userConsent, 'gdpr.vendorData.vendor.consents') && userConsent.gdpr.vendorData.vendor.consents[GVLID] && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(userConsent, 'gdpr.vendorData.purpose.consents') && userConsent.gdpr.vendorData.purpose.consents[1] && (userConsent.gdpr.vendorData.purpose.consents[2] || userConsent.gdpr.vendorData.purpose.consents[3]) && userConsent.gdpr.vendorData.purpose.consents[4]) && ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(userConsent.gpp) || userConsent.gpp.gppString) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.checkCookieSupport)()) { + params.sirdataDomain = 'sddan.com'; // cookie based domain + params.cookieAccessGranted = true; // cookies sent in request + + if (gdprApplies && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(userConsent, 'gdpr.consentString')) { + privacySignals = `&gdpr=${gdprApplies}&gdpr_consent=${userConsent.gdpr.consentString}`; + } else if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(userConsent.usp)) { + privacySignals = `&ccpa_consent=${userConsent.usp.toString()}`; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(userConsent, 'gpp.gppString')) { + const sid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__["default"])(userConsent, 'gpp.applicableSections') ? `&gpp_sid=${userConsent.gpp.applicableSections.join(',')}` : ''; + privacySignals = `&gpp=${userConsent.gpp.gppString}${sid}`; + } + + // Authorized EUIDS from storage and sync global for graph + euids = getUidFromStorage(); // Sirdata Id + + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(params.authorizedEids) && typeof (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.getGlobal)().getUserIds === 'function') { + let filteredEids = {}; + const authorizedEids = params.authorizedEids; + const globalUserIds = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.getGlobal)().getUserIds(); + const globalUserIdsAsEids = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.getGlobal)().getUserIdsAsEids(); + const hasPubProvidedId = authorizedEids.indexOf('pubProvidedId') !== -1; + if (hasPubProvidedId && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(globalUserIds.pubProvidedId)) { + // Publisher allows pubProvidedId + filteredEids = mergeEuidsArrays(filteredEids, globalUserIds.pubProvidedId); + } + if (!hasPubProvidedId || authorizedEids.length > 1) { + // Publisher allows other Id providers + const filteredGlobalEids = globalUserIdsAsEids.filter(entry => authorizedEids.includes(entry.source)); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(filteredGlobalEids)) { + filteredEids = mergeEuidsArrays(filteredEids, filteredGlobalEids); + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(filteredEids)) { + euids = mergeEuidsArrays(euids, filteredEids); // merge ids for graph id + } + } + } + const url = `https://${sirdataSubDomain}.${params.sirdataDomain}/api/v1/public/p/${params.partnerId.toString()}/d/${params.key.toString()}/s?callback=&allowed_post_content=${!params.avoidPostContent}${privacySignals}${params.actualUrl ? `&url=${encodeURIComponent(params.actualUrl)}` : ''}`; + const method = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(euids) ? 'GET' : 'POST'; + const payload = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(euids) ? null : JSON.stringify({ + external_ids: euids + }); + try { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(url, { + success: function (response, req) { + if (req.status === 200) { + try { + const data = JSON.parse(response); + if (data && data.segments) { + addSegmentData(reqBidsConfigObj, data, adUnits, onDone); + } else { + onDone(); + } + } catch (e) { + onDone(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, 'unable to parse Sirdata data' + e); + } + } else if (req.status === 204) { + onDone(); + } + }, + error: function () { + onDone(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, 'unable to get Sirdata data'); + } + }, payload, { + contentType: 'text/plain', + method: method, + withCredentials: params.cookieAccessGranted, + referrerPolicy: 'unsafe-url', + crossOrigin: true + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } +} + +/** + * Pushes data to OpenRTB 2.5 fragments for the specified bidder + * @param {Object} ortb2Fragments - The OpenRTB 2.5 fragments + * @param {string} bidder - The bidder name + * @param {Object} data - The data to be pushed + * @param {number} segtaxid - The segment taxonomy ID + * @param {number} cattaxid - The category taxonomy ID + * @returns {boolean} - True if data was pushed successfully + */ +function pushToOrtb2(ortb2Fragments, bidder, data, segtaxid, cattaxid) { + try { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.segments)) { + if (segtaxid) { + setOrtb2Sda(ortb2Fragments, bidder, 'user', data.segments, segtaxid); + } else { + setOrtb2(ortb2Fragments, bidder, 'user.ext.data', { + sd_rtd: { + segments: data.segments + } + }); + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.categories)) { + if (cattaxid) { + setOrtb2Sda(ortb2Fragments, bidder, 'site', data.categories, cattaxid); + } else { + setOrtb2(ortb2Fragments, bidder, 'site.ext.data', { + sd_rtd: { + categories: data.categories + } + }); + } + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.categories_score) && !cattaxid) { + setOrtb2(ortb2Fragments, bidder, 'site.ext.data', { + sd_rtd: { + categories_score: data.categories_score + } + }); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + return true; +} + +/** + * Sets OpenRTB 2.5 Seller Defined Audiences (SDA) data + * @param {Object} ortb2Fragments - The OpenRTB 2.5 fragments + * @param {string} bidder - The bidder name + * @param {string} type - The type of data ('user' or 'site') + * @param {Array} segments - The segments to be set + * @param {number} segtaxValue - The segment taxonomy value + * @returns {boolean} - True if data was set successfully + */ +function setOrtb2Sda(ortb2Fragments, bidder, type, segments, segtaxValue) { + try { + let ortb2Data = [{ + name: ORTB2_NAME, + segment: segments.map(segmentId => ({ + id: segmentId + })) + }]; + if (segtaxValue) ortb2Data[0].ext = { + segtax: segtaxValue + }; + let ortb2Conf = type === 'site' ? { + site: { + content: { + data: ortb2Data + } + } + } : { + user: { + data: ortb2Data + } + }; + if (bidder) ortb2Conf = { + [bidder]: ortb2Conf + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(ortb2Fragments, ortb2Conf); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + return true; +} + +/** + * Sets OpenRTB 2.5 data at the specified path + * @param {Object} ortb2Fragments - The OpenRTB 2.5 fragments + * @param {string} bidder - The bidder name + * @param {string} path - The path to set the data at + * @param {Object} segments - The segments to be set + * @returns {boolean} - True if data was set successfully + */ +function setOrtb2(ortb2Fragments, bidder, path, segments) { + try { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(segments)) return false; + let ortb2Conf = {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_9__.dset)(ortb2Conf, path, segments); + if (bidder) ortb2Conf = { + [bidder]: ortb2Conf + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(ortb2Fragments, ortb2Conf); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + return true; +} + +/** + * Loads a custom function for processing ad unit data + * @param {function} todo - The custom function to be executed + * @param {Object} adUnit - The ad unit object + * @param {Object} list - The list of data + * @param {Object} data - The data object + * @param {Object} bid - The bid object + * @returns {boolean} - True if the function was executed successfully + */ +function loadCustomFunction(todo, adUnit, list, data, bid) { + try { + if (typeof todo === 'function') todo(adUnit, list, data, bid); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + return true; +} + +/** + * Gets segments and categories array from the data object + * @param {Object} data - The data object + * @param {number} minScore - The minimum score threshold for contextual relevancy + * @param {string} pid - The partner ID (attributed by Sirdata to bidder) + * @returns {Object} - The segments and categories data + */ +function getSegAndCatsArray(data, minScore, pid) { + let sirdataData = { + segments: [], + categories: [], + categories_score: {} + }; + minScore = typeof minScore === 'number' ? minScore : 30; + const { + cattaxid, + segtaxid, + segments + } = data; + const contextualCategories = data.contextual_categories || {}; + // parses contextual categories + try { + if (contextualCategories) { + for (let catId in contextualCategories) { + if (contextualCategories.hasOwnProperty(catId) && contextualCategories[catId]) { + let value = contextualCategories[catId]; + if (value >= minScore && !sirdataData.categories.includes(catId)) { + if (pid === '27440' && cattaxid) { + // Equativ only + sirdataData.categories.push(`${pid}cc${catId}`); + } else { + sirdataData.categories.push(catId.toString()); + sirdataData.categories_score[catId] = value; + } + } + } + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + // parses user-centric segments (empty if no right to access device/process PII) + try { + if (segments) { + for (let segId in segments) { + if (segments.hasOwnProperty(segId) && segments[segId]) { + let id = segments[segId].toString(); + if (pid === '27440' && segtaxid) { + // Equativ only + sirdataData.segments.push(`${pid}us${id}`); + } else { + sirdataData.segments.push(id); + } + } + } + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + return sirdataData; +} + +/** + * Applies Seller Defined Audience (SDA) data and specific data for the bidder + * @param {Object} data - The data object + * @param {Object} sirdataData - The Sirdata data object + * @param {boolean} biddersParamsExist - Flag indicating if bidder parameters exist + * @param {Object} reqBids - The request bids object + * @param {Object} bid - The bid object + * @param {number} bidderIndex - The bidder index + * @param {Object} adUnit - The ad unit object + * @param {string} aliasActualBidder - The bidder Alias + * @returns {Object} - The modified Sirdata data + */ +function applySdaGetSpecificData(data, sirdataData, biddersParamsExist, reqBids, bid, bidderIndex, adUnit, aliasActualBidder) { + // Apply custom function or return Bidder Specific Data if publisher is ok + if (bidderIndex && params.bidders[bidderIndex]?.customFunction && typeof params.bidders[bidderIndex]?.customFunction === 'function') { + return loadCustomFunction(params.bidders[bidderIndex].customFunction, adUnit, sirdataData, data, bid); + } + + // Only share Publisher SDA data if whitelisted + if (!biddersParamsExist || bidderIndex) { + // SDA Publisher + let sirdataDataForSDA = getSegAndCatsArray(data, params.contextualMinRelevancyScore, params.partnerId.toString()); + pushToOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, sirdataDataForSDA, data.segtaxid, data.cattaxid); + } + + // Always share SDA for curation + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.shared_taxonomy)) { + let curationId = bidderIndex && params.bidders[bidderIndex]?.curationId || biddersId[aliasActualBidder]; + if (curationId && data.shared_taxonomy[curationId]) { + // Seller defined audience & bidder specific data + let curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], params.contextualMinRelevancyScore, curationId.toString()); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(curationData)) { + pushToOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, curationData, data.shared_taxonomy[curationId].segtaxid, data.shared_taxonomy[curationId].cattaxid); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.mergeDeep)(sirdataData, curationData); + } + } + } + return sirdataData; +} + +/** + * Adds segment data to the request bids object and processes the data + * @param {Object} reqBids - The request bids object + * @param {Object} data - The data object + * @param {Array} adUnits - The ad units array + * @param {function} onDone - The callback function to be called upon completion + * @returns {Array} - The ad units array + */ +function addSegmentData(reqBids, data, adUnits, onDone) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_PREFIX, 'Dispatch Segments And Categories'); + const minScore = params.contextualMinRelevancyScore || 30; + let sirdataData = getSegAndCatsArray(data, minScore, ''); + const biddersParamsExist = params.bidders.length > 0; + + // Global ortb2 SDA + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.global_taxonomy)) { + for (let i in data.global_taxonomy) { + let globalData; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.global_taxonomy[i])) { + globalData = getSegAndCatsArray(data.global_taxonomy[i], params.contextualMinRelevancyScore, ''); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(globalData)) { + pushToOrtb2(reqBids.ortb2Fragments?.global, '', globalData, data.global_taxonomy[i].segtaxid, data.global_taxonomy[i].cattaxid); + } + } + } + } + + // Google targeting + if (typeof window.googletag !== 'undefined' && params.setGptKeyValues) { + try { + const gptCurationId = params.gptCurationId || biddersId.sdRtdForGpt; + let sirdataMergedList = [...sirdataData.segments, ...sirdataData.categories]; + if (gptCurationId && data.shared_taxonomy?.[gptCurationId]) { + const gamCurationData = getSegAndCatsArray(data.shared_taxonomy[gptCurationId], params.contextualMinRelevancyScore, ''); + sirdataMergedList = [...sirdataMergedList, ...gamCurationData.segments, ...gamCurationData.categories]; + } + window.googletag.cmd.push(() => { + window.googletag.pubads().getSlots().forEach(slot => { + if (typeof slot.setTargeting !== 'undefined' && sirdataMergedList.length > 0) { + slot.setTargeting('sd_rtd', sirdataMergedList); + } + }); + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + } + adUnits.forEach(adUnit => { + return adUnit.bids?.forEach(bid => { + const bidderIndex = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.findIndex)(params.bidders, function (i) { + return i.bidder === bid.bidder; + }); + try { + const aliasActualBidder = bidderAliasRegistry[bid.bidder] || bid.bidder; + if (aliasActualBidder === 'appnexus') { + let xandrData = applySdaGetSpecificData(data, sirdataData, biddersParamsExist, reqBids, bid, bidderIndex, adUnit, aliasActualBidder); + // Surprisingly, to date Xandr doesn't support SDA, we need to set specific 'keywords' entries + if (xandrData.segments.length > 0) { + setOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, 'user.keywords', `sd_rtd=${xandrData.segments.join(',sd_rtd=')}`); + } + if (xandrData.categories.length > 0) { + setOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, 'site.content.keywords', `sd_rtd=${xandrData.categories.join(',sd_rtd=')}`); + } + } else { + applySdaGetSpecificData(data, sirdataData, biddersParamsExist, reqBids, bid, bidderIndex, adUnit, aliasActualBidder); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(LOG_PREFIX, e); + } + }); + }); + + // Trigger onDone + onDone(); + + // Postprocessing: should we send async content to categorize content and/or store Sirdata ID (stored in 3PC) within local scope ? + if (params.sirdataDomain === 'sddan.com') { + // Means consent has been given for device and content access + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.sddan_id) && params.cookieAccessGranted) { + // Device access allowed by publisher and cookies are supported + setUidInStorage(data.sddan_id); // Save Sirdata user ID + } + if (!params.avoidPostContent && params.actualUrl && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.inIframe)() && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(data.post_content_token)) { + onDocumentReady(() => postContentForSemanticAnalysis(data.post_content_token, params.actualUrl)); + } + } + return adUnits; +} + +/** + * Initializes the module with the given configuration + * @param {Object} moduleConfig - The module configuration + * @returns {boolean} - True if the initialization was successful + */ +function init(moduleConfig) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(LOG_PREFIX, moduleConfig); + if (typeof moduleConfig.params !== 'object' || !moduleConfig.params.key) return false; + if (typeof moduleConfig.params.authorizedEids !== 'object' || !Array.isArray(moduleConfig.params.authorizedEids)) { + delete moduleConfig.params.authorizedEids; // must be array of strings + } else { + // we need it if the publishers uses user Id module name instead of key or source + const resultSet = new Set(moduleConfig.params.authorizedEids.map(item => { + const formattedItem = item.toLowerCase().replace(/\s+/g, '_'); // Normalize + return eidsProvidersMap[formattedItem] || formattedItem; + })); + moduleConfig.params.authorizedEids = Array.from(resultSet); + } + if (typeof moduleConfig.params.bidders !== 'object' || !Array.isArray(moduleConfig.params.bidders)) delete moduleConfig.params.bidders; // must be array of objects + delete moduleConfig.params.sirdataDomain; // delete cookieless domain if specified => shouldn't be overridden by publisher + params = Object.assign({}, params, moduleConfig.params); + return true; +} + +/** + * The Sirdata submodule definition + * @type {Object} + */ +const sirdataSubmodule = { + name: SUBMODULE_NAME, + gvlid: GVLID, + init: init, + getBidRequestData: getSegmentsAndCategories +}; + +// Register the Sirdata submodule with the real time data module +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_10__.submodule)(MODULE_NAME, sirdataSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('sirdataRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sirdataRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sizeMapping"],{ + +/***/ "./modules/sizeMapping.js": +/*!********************************!*\ + !*** ./modules/sizeMapping.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports setSizeConfig, getLabels, sizeSupported, resolveStatus, processAdUnitsForLabels */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); + + + + + + +let sizeConfig = []; + +/** + * @typedef {object} SizeConfig + * + * @property {string} [mediaQuery] A CSS media query string that will to be interpreted by window.matchMedia. If the + * media query matches then the this config will be active and sizesSupported will filter bid and adUnit sizes. If + * this property is not present then this SizeConfig will only be active if triggered manually by a call to + * pbjs.setConfig({labels:['label']) specifying one of the labels present on this SizeConfig. + * @property {Array} sizesSupported The sizes to be accepted if this SizeConfig is enabled. + * @property {Array} labels The active labels to match this SizeConfig to an adUnits and/or bidders. + */ + +/** + * + * @param {Array} config + */ +function setSizeConfig(config) { + sizeConfig = config; +} +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_0__.setupAdUnitMediaTypes.before((next, adUnit, labels) => next(processAdUnitsForLabels(adUnit, labels), labels)); +_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('sizeConfig', config => setSizeConfig(config.sizeConfig)); + +/** + * Returns object describing the status of labels on the adUnit or bidder along with labels passed into requestBids + * @param bidOrAdUnit the bidder or adUnit to get label info on + * @param activeLabels the labels passed to requestBids + * @returns {object} + */ +function getLabels(bidOrAdUnit, activeLabels) { + if (bidOrAdUnit.labelAll) { + return { + labelAll: true, + labels: bidOrAdUnit.labelAll, + activeLabels + }; + } + return { + labelAll: false, + labels: bidOrAdUnit.labelAny, + activeLabels + }; +} + +/** + * Determines whether a single size is valid given configured sizes + * @param {Array} size [width, height] + * @param {Array} configs + * @returns {boolean} + */ +function sizeSupported(size) { + let configs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : sizeConfig; + let maps = evaluateSizeConfig(configs); + if (!maps.shouldFilter) { + return true; + } + return !!maps.sizesSupported[size]; +} +const SIZE_PROPS = { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER]: 'banner.sizes' +}; +if (true) { + SIZE_PROPS[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO] = 'video.playerSize'; +} + +/** + * Resolves the unique set of the union of all sizes and labels that are active from a SizeConfig.mediaQuery match. + * + * @param {Object} options - The options object. + * @param {Array} [options.labels=[]] - Labels specified on adUnit or bidder. + * @param {boolean} [options.labelAll=false] - If true, all labels must match to be enabled. + * @param {Array} [options.activeLabels=[]] - Labels passed in through requestBids. + * @param {Object} mediaTypes - A mediaTypes object describing the various media types (banner, video, native). + * @param {Array} configs - An array of SizeConfig objects. + * @returns {Object} - An object containing the active status, media types, and filter results. + * @returns {boolean} return.active - Whether the media types are active. + * @returns {Object} return.mediaTypes - The media types object. + * @returns {Object} [return.filterResults] - The filter results before and after applying size filtering. + */ +function resolveStatus() { + let { + labels = [], + labelAll = false, + activeLabels = [] + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let mediaTypes = arguments.length > 1 ? arguments[1] : undefined; + let configs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : sizeConfig; + let maps = evaluateSizeConfig(configs); + let filtered = false; + let hasSize = false; + const filterResults = { + before: {}, + after: {} + }; + if (maps.shouldFilter) { + Object.entries(SIZE_PROPS).forEach(_ref => { + let [mediaType, sizeProp] = _ref; + const oldSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mediaTypes, sizeProp); + if (oldSizes) { + if (!filtered) { + mediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.deepClone)(mediaTypes); + filtered = true; + } + const newSizes = oldSizes.filter(size => maps.sizesSupported[size]); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(mediaTypes, sizeProp, newSizes); + hasSize = hasSize || newSizes.length > 0; + if (oldSizes.length !== newSizes.length) { + filterResults.before[mediaType] = oldSizes; + filterResults.after[mediaType] = newSizes; + } + } + }); + } else { + hasSize = Object.values(SIZE_PROPS).find(prop => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mediaTypes, prop)?.length) != null; + } + let results = { + active: !Object.keys(SIZE_PROPS).find(mediaType => mediaTypes.hasOwnProperty(mediaType)) || hasSize && (labels.length === 0 || !labelAll && (labels.some(label => maps.labels[label]) || labels.some(label => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.includes)(activeLabels, label))) || labelAll && labels.reduce((result, label) => !result ? result : maps.labels[label] || (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.includes)(activeLabels, label), true)), + mediaTypes + }; + if (Object.keys(filterResults.before).length > 0) { + results.filterResults = filterResults; + } + return results; +} +function evaluateSizeConfig(configs) { + return configs.reduce((results, config) => { + if (typeof config === 'object' && typeof config.mediaQuery === 'string' && config.mediaQuery.length > 0) { + let ruleMatch = false; + try { + ruleMatch = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.getWindowTop)().matchMedia(config.mediaQuery).matches; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('Unfriendly iFrame blocks sizeConfig from being correctly evaluated'); + ruleMatch = matchMedia(config.mediaQuery).matches; + } + if (ruleMatch) { + if (Array.isArray(config.sizesSupported)) { + results.shouldFilter = true; + } + ['labels', 'sizesSupported'].forEach(type => (config[type] || []).forEach(thing => results[type][thing] = true)); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)('sizeConfig rule missing required property "mediaQuery"'); + } + return results; + }, { + labels: {}, + sizesSupported: {}, + shouldFilter: false + }); +} +function processAdUnitsForLabels(adUnits, activeLabels) { + return adUnits.reduce((adUnits, adUnit) => { + let { + active, + mediaTypes, + filterResults + } = resolveStatus(getLabels(adUnit, activeLabels), adUnit.mediaTypes); + if (!active) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`Size mapping disabled adUnit "${adUnit.code}"`); + } else { + if (filterResults) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`Size mapping filtered adUnit "${adUnit.code}" sizes from `, filterResults.before, 'to ', filterResults.after); + } + adUnit.mediaTypes = mediaTypes; + adUnit.bids = adUnit.bids.reduce((bids, bid) => { + let { + active, + mediaTypes, + filterResults + } = resolveStatus(getLabels(bid, activeLabels), adUnit.mediaTypes); + if (!active) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`Size mapping deactivated adUnit "${adUnit.code}" bidder "${bid.bidder}"`); + } else { + if (filterResults) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`Size mapping filtered adUnit "${adUnit.code}" bidder "${bid.bidder}" sizes from `, filterResults.before, 'to ', filterResults.after); + bid.mediaTypes = mediaTypes; + } + bids.push(bid); + } + return bids; + }, []); + adUnits.push(adUnit); + } + return adUnits; + }, []); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('sizeMapping'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sizeMapping.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sizeMappingV2"],{ + +/***/ "./modules/sizeMappingV2.js": +/*!**********************************!*\ + !*** ./modules/sizeMappingV2.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports internal, isUsingNewSizeMapping, checkAdUnitSetupHook, checkBidderSizeConfigFormat, isLabelActivated, getFilteredMediaTypes, isSizeConfigActivated, getActiveSizeBucket, getRelevantMediaTypesForBidder, getAdUnitDetail, setupAdUnitMediaTypes */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/prebid.js */ "./src/prebid.js"); + +/** + * This module adds support for the new size mapping spec, Advanced Size Mapping. It's documented here. https://github.com/prebid/Prebid.js/issues/4129 + * The implementation is an alternative to global sizeConfig. It introduces 'Ad Unit' & 'Bidder' level sizeConfigs and also supports 'labels' for conditional + * rendering. Read full API documentation on Prebid.org, http://prebid.org/dev-docs/modules/sizeMappingV2.html + */ + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').AdUnit} AdUnit + */ + +// Allows for stubbing of these functions while writing unit tests. +const internal = { + checkBidderSizeConfigFormat, + getActiveSizeBucket, + getFilteredMediaTypes, + getAdUnitDetail, + getRelevantMediaTypesForBidder, + isLabelActivated +}; +const V2_ADUNITS = new WeakMap(); + +/* + Returns "true" if at least one of the adUnits in the adUnits array is using an Ad Unit and/or Bidder level sizeConfig, + otherwise, returns "false." +*/ +function isUsingNewSizeMapping(adUnits) { + return !!adUnits.find(adUnit => { + if (V2_ADUNITS.has(adUnit)) return V2_ADUNITS.get(adUnit); + if (adUnit.mediaTypes) { + // checks for the presence of sizeConfig property at the adUnit.mediaTypes object + for (let mediaType of Object.keys(adUnit.mediaTypes)) { + if (adUnit.mediaTypes[mediaType].sizeConfig) { + V2_ADUNITS.set(adUnit, true); + return true; + } + } + for (let bid of adUnit.bids && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(adUnit.bids) ? adUnit.bids : []) { + if (bid.sizeConfig) { + V2_ADUNITS.set(adUnit, true); + return true; + } + } + V2_ADUNITS.set(adUnit, false); + return false; + } + }); +} + +/** + This hooked function executes before the function 'checkAdUnitSetup', that is defined in /src/prebid.js. It's necessary to run this funtion before + because it applies a series of checks in order to determine the correctness of the 'sizeConfig' array, which, the original 'checkAdUnitSetup' function + does not recognize. + @param {AdUnit[]} adUnits + @returns {AdUnit[]} validateAdUnits - Unrecognized properties are deleted. + */ +function checkAdUnitSetupHook(adUnits) { + const validateSizeConfig = function (mediaType, sizeConfig, adUnitCode) { + let isValid = true; + const associatedProperty = { + banner: 'sizes', + video: 'playerSize', + native: 'active' + }; + const propertyName = associatedProperty[mediaType]; + const conditionalLogMessages = { + banner: 'Removing mediaTypes.banner from ad unit.', + video: 'Removing mediaTypes.video.sizeConfig from ad unit.', + native: 'Removing mediaTypes.native.sizeConfig from ad unit.' + }; + if (Array.isArray(sizeConfig)) { + sizeConfig.forEach((config, index) => { + const keys = Object.keys(config); + /* + Check #1 (Applies to 'banner', 'video' and 'native' media types.) + Verify that all config objects include 'minViewPort' and 'sizes' property. + If they do not, return 'false'. + */ + if (!((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(keys, 'minViewPort') && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(keys, propertyName))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Ad unit ${adUnitCode}: Missing required property 'minViewPort' or 'sizes' from 'mediaTypes.${mediaType}.sizeConfig[${index}]'. ${conditionalLogMessages[mediaType]}`); + isValid = false; + return; + } + /* + Check #2 (Applies to 'banner', 'video' and 'native' media types.) + Verify that 'config.minViewPort' property is in [width, height] format. + If not, return false. + */ + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(config.minViewPort, 2)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Ad unit ${adUnitCode}: Invalid declaration of 'minViewPort' in 'mediaTypes.${mediaType}.sizeConfig[${index}]'. ${conditionalLogMessages[mediaType]}`); + isValid = false; + return; + } + /* + Check #3 (Applies only to 'banner' and 'video' media types.) + Verify that 'config.sizes' (in case of banner) or 'config.playerSize' (in case of video) + property is in [width, height] format. If not, return 'false'. + */ + if (mediaType === 'banner' || mediaType === 'video') { + let showError = false; + if (Array.isArray(config[propertyName])) { + const validatedSizes = _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateSizes(config[propertyName]); + if (config[propertyName].length > 0 && validatedSizes.length === 0) { + isValid = false; + showError = true; + } + } else { + // Either 'sizes' or 'playerSize' is not declared as an array, which makes it invalid by default. + isValid = false; + showError = true; + } + if (showError) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Ad unit ${adUnitCode}: Invalid declaration of '${propertyName}' in 'mediaTypes.${mediaType}.sizeConfig[${index}]'. ${conditionalLogMessages[mediaType]}`); + return; + } + } + /* + Check #4 (Applies only to 'native' media type) + Verify that 'config.active' is a 'boolean'. + If not, return 'false'. + */ + if ( true && mediaType === 'native') { + if (typeof config[propertyName] !== 'boolean') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Ad unit ${adUnitCode}: Invalid declaration of 'active' in 'mediaTypes.${mediaType}.sizeConfig[${index}]'. ${conditionalLogMessages[mediaType]}`); + isValid = false; + } + } + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Ad unit ${adUnitCode}: Invalid declaration of 'sizeConfig' in 'mediaTypes.${mediaType}.sizeConfig'. ${conditionalLogMessages[mediaType]}`); + isValid = false; + return isValid; + } + + // If all checks have passed, isValid should equal 'true' + return isValid; + }; + const validatedAdUnits = []; + adUnits.forEach(adUnit => { + adUnit = _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateAdUnit(adUnit); + if (adUnit == null) return; + const mediaTypes = adUnit.mediaTypes; + let validatedBanner, validatedVideo, validatedNative; + if (mediaTypes.banner) { + if (mediaTypes.banner.sizes) { + // Ad unit is using 'mediaTypes.banner.sizes' instead of the new property 'sizeConfig'. Apply the old checks! + validatedBanner = _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateBannerMediaType(adUnit); + } else if (mediaTypes.banner.sizeConfig) { + // Ad unit is using the 'sizeConfig' property, 'mediaTypes.banner.sizeConfig'. Apply the new checks! + validatedBanner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(adUnit); + const isBannerValid = validateSizeConfig('banner', mediaTypes.banner.sizeConfig, adUnit.code); + if (!isBannerValid) { + delete validatedBanner.mediaTypes.banner; + } else { + /* + Make sure 'sizes' field is always an array of arrays. If not, make it so. + For example, [] becomes [[]], and [360, 400] becomes [[360, 400]] + */ + validatedBanner.mediaTypes.banner.sizeConfig.forEach(config => { + if (!Array.isArray(config.sizes[0])) { + config.sizes = [config.sizes]; + } + }); + } + } else { + // Ad unit is invalid since it's mediaType property does not have either 'sizes' or 'sizeConfig' declared. + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Ad unit ${adUnit.code}: 'mediaTypes.banner' does not contain either 'sizes' or 'sizeConfig' property. Removing 'mediaTypes.banner' from ad unit.`); + validatedBanner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(adUnit); + delete validatedBanner.mediaTypes.banner; + } + } + if ( true && mediaTypes.video) { + if (mediaTypes.video.playerSize) { + // Ad unit is using 'mediaTypes.video.playerSize' instead of the new property 'sizeConfig'. Apply the old checks! + validatedVideo = validatedBanner ? _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateVideoMediaType(validatedBanner) : _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateVideoMediaType(adUnit); + } else if (mediaTypes.video.sizeConfig) { + // Ad unit is using the 'sizeConfig' property, 'mediaTypes.video.sizeConfig'. Apply the new checks! + validatedVideo = validatedBanner || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(adUnit); + const isVideoValid = validateSizeConfig('video', mediaTypes.video.sizeConfig, adUnit.code); + if (!isVideoValid) { + delete validatedVideo.mediaTypes.video.sizeConfig; + } else { + /* + Make sure 'playerSize' field is always an array of arrays. If not, make it so. + For example, [] becomes [[]], and [640, 400] becomes [[640, 400]] + */ + validatedVideo.mediaTypes.video.sizeConfig.forEach(config => { + if (!Array.isArray(config.playerSize[0])) { + config.playerSize = [config.playerSize]; + } + }); + } + } + } + if ( true && mediaTypes.native) { + // Apply the old native checks + validatedNative = validatedVideo ? _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateNativeMediaType(validatedVideo) : validatedBanner ? _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateNativeMediaType(validatedBanner) : _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.adUnitSetupChecks.validateNativeMediaType(adUnit); + + // Apply the new checks if 'mediaTypes.native.sizeConfig' detected + if (mediaTypes.native.sizeConfig) { + const isNativeValid = validateSizeConfig('native', mediaTypes.native.sizeConfig, adUnit.code); + if (!isNativeValid) { + delete validatedNative.mediaTypes.native.sizeConfig; + } + } + } + const validatedAdUnit = Object.assign({}, validatedBanner, validatedVideo, validatedNative); + validatedAdUnits.push(validatedAdUnit); + }); + return validatedAdUnits; +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.getHook)('checkAdUnitSetup').before(function (fn, adUnits) { + const usingNewSizeMapping = isUsingNewSizeMapping(adUnits); + if (usingNewSizeMapping) { + // if adUnits are found using the sizeMappingV2 spec, we run additional checks on them for checking the validity of sizeConfig object + // in addition to running the base checks on the mediaType object and return the adUnit without calling the base function. + adUnits = checkAdUnitSetupHook(adUnits); + return fn.bail(adUnits); + } else { + // if presence of sizeMappingV2 spec is not detected on adUnits, we default back to the original checks defined in the base function. + return fn.call(this, adUnits); + } +}); + +// checks if the sizeConfig object declared at the Bidder level is in the right format or not. +function checkBidderSizeConfigFormat(sizeConfig) { + let didCheckPass = true; + if (Array.isArray(sizeConfig) && sizeConfig.length > 0) { + sizeConfig.forEach(config => { + const keys = Object.keys(config); + if ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(keys, 'minViewPort') && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(keys, 'relevantMediaTypes') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(config.minViewPort, 2) && Array.isArray(config.relevantMediaTypes) && config.relevantMediaTypes.length > 0 && (config.relevantMediaTypes.length > 1 ? config.relevantMediaTypes.every(mt => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(['banner', 'video', 'native'], mt)) : ['none', 'banner', 'video', 'native'].indexOf(config.relevantMediaTypes[0]) > -1)) { + didCheckPass = didCheckPass && true; + } else { + didCheckPass = false; + } + }); + } else { + didCheckPass = false; + } + return didCheckPass; +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.getHook)('setupAdUnitMediaTypes').before(function (fn, adUnits, labels) { + if (isUsingNewSizeMapping(adUnits)) { + return fn.bail(setupAdUnitMediaTypes(adUnits, labels)); + } else { + return fn.call(this, adUnits, labels); + } +}); + +/** + * Given an Ad Unit or a Bid as an input, returns a boolean telling if the Ad Unit/ Bid is active based on label checks + * @param {Object} bidOrAdUnit - Either the Ad Unit object or the Bid object + * @param {Array} activeLabels - List of active labels passed as an argument to pbjs.requestBids function + * @param {string} adUnitCode - Unique string identifier for an Ad Unit. + * @param {number} adUnitInstance - Instance count of an 'Identical' ad unit. + * @returns {boolean} Represents if the Ad Unit or the Bid is active or not + */ +function isLabelActivated(bidOrAdUnit, activeLabels, adUnitCode, adUnitInstance) { + let labelOperator; + const labelsFound = Object.keys(bidOrAdUnit).filter(prop => prop === 'labelAny' || prop === 'labelAll'); + if (labelsFound && labelsFound.length > 1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Size Mapping V2:: ${bidOrAdUnit.code ? `Ad Unit: ${bidOrAdUnit.code}(${adUnitInstance}) => Ad unit has multiple label operators. Using the first declared operator: ${labelsFound[0]}` : `Ad Unit: ${adUnitCode}(${adUnitInstance}), Bidder: ${bidOrAdUnit.bidder} => Bidder has multiple label operators. Using the first declared operator: ${labelsFound[0]}`}`); + } + labelOperator = labelsFound[0]; + if (labelOperator && !activeLabels) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Size Mapping V2:: ${bidOrAdUnit.code ? `Ad Unit: ${bidOrAdUnit.code}(${adUnitInstance}) => Found '${labelOperator}' on ad unit, but 'labels' is not set. Did you pass 'labels' to pbjs.requestBids() ?` : `Ad Unit: ${adUnitCode}(${adUnitInstance}), Bidder: ${bidOrAdUnit.bidder} => Found '${labelOperator}' on bidder, but 'labels' is not set. Did you pass 'labels' to pbjs.requestBids() ?`}`); + return true; + } + if (labelOperator === 'labelAll' && Array.isArray(bidOrAdUnit[labelOperator])) { + if (bidOrAdUnit.labelAll.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Size Mapping V2:: Ad Unit: ${bidOrAdUnit.code}(${adUnitInstance}) => Ad unit has declared property 'labelAll' with an empty array.`); + return true; + } + return bidOrAdUnit.labelAll.every(label => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(activeLabels, label)); + } else if (labelOperator === 'labelAny' && Array.isArray(bidOrAdUnit[labelOperator])) { + if (bidOrAdUnit.labelAny.length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Size Mapping V2:: Ad Unit: ${bidOrAdUnit.code}(${adUnitInstance}) => Ad unit has declared property 'labelAny' with an empty array.`); + return true; + } + return bidOrAdUnit.labelAny.some(label => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(activeLabels, label)); + } + return true; +} + +/** + * Processes the MediaTypes object and calculates the active size buckets for each Media Type. Uses `window.innerWidth` and `window.innerHeight` + * to calculate the width and height of the active Viewport. + * @param {Object} mediaTypes Contains information about supported media types for an Ad Unit and size information for each of those types + * @returns {Object} Filtered mediaTypes object with relevant media types filtered by size buckets based on activeViewPort size + */ +function getFilteredMediaTypes(mediaTypes) { + let activeViewportWidth, activeViewportHeight, transformedMediaTypes; + transformedMediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(mediaTypes); + let activeSizeBucket = { + banner: undefined, + video: undefined, + native: undefined + }; + activeViewportWidth = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerWidth; + activeViewportHeight = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerHeight; + const activeViewport = [activeViewportWidth, activeViewportHeight]; + Object.keys(mediaTypes).map(mediaType => { + const sizeConfig = mediaTypes[mediaType].sizeConfig; + if (sizeConfig) { + activeSizeBucket[mediaType] = getActiveSizeBucket(sizeConfig, activeViewport); + const filteredSizeConfig = sizeConfig.filter(config => config.minViewPort === activeSizeBucket[mediaType] && isSizeConfigActivated(mediaType, config)); + transformedMediaTypes[mediaType] = Object.assign({ + filteredSizeConfig + }, mediaTypes[mediaType]); + + // transform mediaTypes object + const config = { + banner: 'sizes', + video: 'playerSize' + }; + if (transformedMediaTypes[mediaType].filteredSizeConfig.length > 0) { + // map sizes or playerSize property in filteredSizeConfig object to transformedMediaTypes.banner.sizes if mediaType is banner + // or transformedMediaTypes.video.playerSize if the mediaType in video. + // doesn't apply to native mediaType since native doesn't have any property defining 'sizes' or 'playerSize'. + if (mediaType !== 'native') { + transformedMediaTypes[mediaType][config[mediaType]] = transformedMediaTypes[mediaType].filteredSizeConfig[0][config[mediaType]]; + } + } else { + delete transformedMediaTypes[mediaType]; + } + } + }); + + // filter out 'undefined' values from activeSizeBucket object and attach sizes/playerSize information against the active size bucket. + const sizeBucketToSizeMap = Object.keys(activeSizeBucket).filter(mediaType => activeSizeBucket[mediaType] !== undefined).reduce((sizeBucketToSizeMap, mediaType) => { + sizeBucketToSizeMap[mediaType] = { + activeSizeBucket: activeSizeBucket[mediaType], + activeSizeDimensions: mediaType === 'banner' ? + // banner mediaType gets deleted incase no sizes are specified for a given size bucket, that's why this check is necessary + transformedMediaTypes.banner ? transformedMediaTypes.banner.sizes : [] : mediaType === 'video' ? + // video mediaType gets deleted incase no playerSize is specified for a given size bucket, that's why this check is necessary + transformedMediaTypes.video ? transformedMediaTypes.video.playerSize : [] : 'NA' + }; + return sizeBucketToSizeMap; + }, {}); + return { + sizeBucketToSizeMap, + activeViewport, + transformedMediaTypes + }; +} + +/** + * Evaluates the given sizeConfig object and checks for various properties to determine if the sizeConfig is active or not. For example, + * let's suppose the sizeConfig is for a Banner media type. Then, if the sizes property is found empty, it returns false, else returns true. + * In case of a Video media type, it checks the playerSize property. If found empty, returns false, else returns true. + * In case of a Native media type, it checks the active property. If found false, returns false, if found true, returns true. + * @param {string} mediaType It can be 'banner', 'native' or 'video' + * @param {Object} sizeConfig Represents the sizeConfig object which is active based on the current viewport size + * @returns {boolean} Represents if the size config is active or not + */ +function isSizeConfigActivated(mediaType, sizeConfig) { + switch (mediaType) { + case 'banner': + // we need this check, sizeConfig.sizes[0].length > 0, in place because a sizeBucket can have sizes: [], + // gets converted to sizes: [[]] in the checkAdUnitSetupHook function + return sizeConfig.sizes && sizeConfig.sizes.length > 0 && sizeConfig.sizes[0].length > 0; + case 'video': + // for why we need the last check, read the above comment + return sizeConfig.playerSize && sizeConfig.playerSize.length > 0 && sizeConfig.playerSize[0].length > 0; + case 'native': + return sizeConfig.active; + default: + return false; + } +} + +/** + * Returns the active size bucket for a given media type + * @param {Array} sizeConfig SizeConfig defines the characteristics of an Ad Unit categorised into multiple size buckets per media type + * @param {Array} activeViewport Viewport size of the browser in the form [w, h] (w -> width, h -> height) + * Calculated at the time of making call to pbjs.requestBids function + * @returns {Array} The active size bucket matching the activeViewPort, for example: [750, 0] + */ +function getActiveSizeBucket(sizeConfig, activeViewport) { + let activeSizeBucket = []; + sizeConfig.sort((a, b) => a.minViewPort[0] - b.minViewPort[0]).forEach(config => { + if (activeViewport[0] >= config.minViewPort[0]) { + if (activeViewport[1] >= config.minViewPort[1]) { + activeSizeBucket = config.minViewPort; + } else { + activeSizeBucket = []; + } + } + }); + return activeSizeBucket; +} +function getRelevantMediaTypesForBidder(sizeConfig, activeViewport) { + const mediaTypes = new Set(); + if (internal.checkBidderSizeConfigFormat(sizeConfig)) { + const activeSizeBucket = internal.getActiveSizeBucket(sizeConfig, activeViewport); + sizeConfig.filter(config => config.minViewPort === activeSizeBucket)[0]['relevantMediaTypes'].forEach(mt => mediaTypes.add(mt)); + } + return mediaTypes; +} +function getAdUnitDetail(adUnit, labels, adUnitInstance) { + const isLabelActivated = internal.isLabelActivated(adUnit, labels, adUnit.code, adUnitInstance); + const { + sizeBucketToSizeMap, + activeViewport, + transformedMediaTypes + } = isLabelActivated && internal.getFilteredMediaTypes(adUnit.mediaTypes); + isLabelActivated && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${adUnitInstance}) => Active size buckets after filtration: `, sizeBucketToSizeMap); + return { + activeViewport, + transformedMediaTypes, + isLabelActivated + }; +} +function setupAdUnitMediaTypes(adUnits, labels) { + const duplCounter = {}; + return adUnits.reduce((result, adUnit) => { + const instance = (() => { + if (!duplCounter.hasOwnProperty(adUnit.code)) { + duplCounter[adUnit.code] = 1; + } + return duplCounter[adUnit.code]++; + })(); + if (adUnit.mediaTypes && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isValidMediaTypes)(adUnit.mediaTypes)) { + const { + activeViewport, + transformedMediaTypes, + isLabelActivated + } = internal.getAdUnitDetail(adUnit, labels, instance); + if (isLabelActivated) { + if (Object.keys(transformedMediaTypes).length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${instance}) => Ad unit disabled since there are no active media types after sizeConfig filtration.`); + } else { + adUnit.mediaTypes = transformedMediaTypes; + adUnit.bids = adUnit.bids.reduce((bids, bid) => { + if (internal.isLabelActivated(bid, labels, adUnit.code, instance)) { + if (bid.sizeConfig) { + const relevantMediaTypes = internal.getRelevantMediaTypesForBidder(bid.sizeConfig, activeViewport); + if (relevantMediaTypes.size === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${instance}), Bidder: ${bid.bidder} => 'sizeConfig' is not configured properly. This bidder won't be eligible for sizeConfig checks and will remain active.`); + bids.push(bid); + } else if (!relevantMediaTypes.has('none')) { + let modified = false; + const bidderMediaTypes = Object.fromEntries(Object.entries(transformedMediaTypes).filter(_ref => { + let [key, val] = _ref; + if (!relevantMediaTypes.has(key)) { + modified = true; + return false; + } + return true; + })); + if (Object.keys(bidderMediaTypes).length > 0) { + if (modified) { + bid.mediaTypes = bidderMediaTypes; + } + bids.push(bid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${instance}), Bidder: ${bid.bidder} => 'relevantMediaTypes' does not match with any of the active mediaTypes at the Ad Unit level. This bidder is disabled.`); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${instance}), Bidder: ${bid.bidder} => 'relevantMediaTypes' is set to 'none' in sizeConfig for current viewport size. This bidder is disabled.`); + } + } else { + bids.push(bid); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${instance}), Bidder: ${bid.bidder} => Label check for this bidder has failed. This bidder is disabled.`); + } + return bids; + }, []); + result.push(adUnit); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)(`Size Mapping V2:: Ad Unit: ${adUnit.code}(${instance}) => Ad unit is disabled due to failing label check.`); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Size Mapping V2:: Ad Unit: ${adUnit.code} => Ad unit has declared invalid 'mediaTypes' or has not declared a 'mediaTypes' property`); + } + return result; + }, []); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('sizeMappingV2'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sizeMappingV2.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["slimcutBidAdapter"],{ + +/***/ "./modules/slimcutBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/slimcutBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'slimcut'; +const ENDPOINT_URL = 'https://sb.freeskreen.com/pbr'; +const spec = { + code: BIDDER_CODE, + gvlid: 102, + aliases: [{ + code: 'scm', + gvlid: 102 + }], + supportedMediaTypes: ['video', 'banner'], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let isValid = false; + if (typeof bid.params !== 'undefined' && !isNaN(parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValue)(bid.params, 'placementId'))) && parseInt((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValue)(bid.params, 'placementId')) > 0) { + isValid = true; + } + return isValid; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const bids = validBidRequests.map(buildRequestObject); + const payload = { + referrer: getReferrerInfo(bidderRequest), + data: bids, + deviceWidth: screen.width + }; + let gdpr = bidderRequest.gdprConsent; + if (bidderRequest && gdpr) { + let isCmp = typeof gdpr.gdprApplies === 'boolean'; + let isConsentString = typeof gdpr.consentString === 'string'; + payload.gdpr_iab = { + consent: isConsentString ? gdpr.consentString : '', + status: isCmp ? gdpr.gdprApplies : -1 + }; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, request) { + const bidResponses = []; + serverResponse = serverResponse.body; + if (serverResponse.responses) { + serverResponse.responses.forEach(function (bid) { + const bidResponse = { + cpm: bid.cpm, + width: bid.width, + height: bid.height, + currency: bid.currency, + netRevenue: bid.netRevenue, + ttl: bid.ttl, + ad: bid.ad, + requestId: bid.requestId, + creativeId: bid.creativeId, + winUrl: bid.winUrl, + meta: { + advertiserDomains: bid.adomain || [] + } + }; + bidResponses.push(bidResponse); + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: 'https://sb.freeskreen.com/async_usersync.html' + }]; + } + return []; + }, + onBidWon: function (bid) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(bid.winUrl + bid.cpm, null); + } +}; +function buildRequestObject(bid) { + const reqObj = {}; + let placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValue)(bid.params, 'placementId'); + reqObj.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(bid.sizes); + reqObj.bidId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('bidId', bid); + reqObj.bidderRequestId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('bidderRequestId', bid); + reqObj.placementId = parseInt(placementId); + reqObj.adUnitCode = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('adUnitCode', bid); + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + reqObj.auctionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('auctionId', bid); + reqObj.transactionId = bid.ortb2Imp?.ext?.tid || ''; + return reqObj; +} +function getReferrerInfo(bidderRequest) { + let ref = window.location.href; + if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + ref = bidderRequest.refererInfo.page; + } + return ref; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('slimcutBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/slimcutBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["smaatoBidAdapter"],{ + +/***/ "./modules/smaatoBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/smaatoBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/sizeUtils/sizeUtils.js */ "./libraries/sizeUtils/sizeUtils.js"); +/* harmony import */ var _libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../libraries/appnexusUtils/anUtils.js */ "./libraries/appnexusUtils/anUtils.js"); +/* harmony import */ var _libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../libraries/chunk/chunk.js */ "./libraries/chunk/chunk.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'smaato'; +const SMAATO_ENDPOINT = 'https://prebid.ad.smaato.net/oapi/prebid'; +const SMAATO_CLIENT = "prebid_js_9.45.0-pre_3.3"; +const TTL = 300; +const CURRENCY = 'USD'; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE]; +const IMAGE_SYNC_URL = 'https://s.ad.smaato.net/c/?adExInit=p'; +const IFRAME_SYNC_URL = 'https://s.ad.smaato.net/i/?adExInit=p'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + gvlid: 82, + /** + * Determines whether the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: bid => { + if (typeof bid.params !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[SMAATO] Missing params object'); + return false; + } + if (typeof bid.params.publisherId !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[SMAATO] Missing mandatory publisherId param'); + return false; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video.context') === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.ADPOD) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Verifying adpod bid request'); + if (typeof bid.params.adbreakId !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[SMAATO] Missing for adpod request mandatory adbreakId param'); + return false; + } + if (bid.params.adspaceId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[SMAATO] The adspaceId param is not allowed in an adpod bid request'); + return false; + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Verifying a non adpod bid request'); + if (typeof bid.params.adspaceId !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[SMAATO] Missing mandatory adspaceId param'); + return false; + } + if (bid.params.adbreakId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('[SMAATO] The adbreakId param is only allowed in an adpod bid request'); + return false; + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Verification done, all good'); + return true; + }, + buildRequests: (bidRequests, bidderRequest) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Client version:', SMAATO_CLIENT); + let requests = []; + bidRequests.forEach(bid => { + // separate requests per mediaType + SUPPORTED_MEDIA_TYPES.forEach(mediaType => { + if (bid.mediaTypes && bid.mediaTypes[mediaType] || mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE && bid.nativeOrtbRequest) { + const data = converter.toORTB({ + bidderRequest, + bidRequests: [bid], + context: { + mediaType + } + }); + requests.push({ + method: 'POST', + url: bid.params.endpoint || SMAATO_ENDPOINT, + data: JSON.stringify(data), + options: { + withCredentials: true, + crossOrigin: true + }, + bidderRequest + }); + } + }); + }); + return requests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (serverResponse, bidRequest) => { + // response is empty (HTTP 204) + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponse.body)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Empty response body HTTP 204, no bids'); + return []; // no bids + } + const serverResponseHeaders = serverResponse.headers; + const smtExpires = serverResponseHeaders.get('X-SMT-Expires'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Expires:', smtExpires); + const ttlInSec = smtExpires ? Math.floor((smtExpires - Date.now()) / 1000) : 300; + const response = serverResponse.body; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] OpenRTB Response:', response); + const smtAdType = serverResponseHeaders.get('X-SMT-ADTYPE'); + const bids = []; + response.seatbid.forEach(seatbid => { + seatbid.bid.forEach(bid => { + let resultingBid = { + requestId: bid.impid, + cpm: bid.price || 0, + width: bid.w, + height: bid.h, + ttl: ttlInSec, + creativeId: bid.crid, + dealId: bid.dealid || null, + netRevenue: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.net', true), + currency: CURRENCY, + meta: { + advertiserDomains: bid.adomain, + networkName: bid.bidderName, + agencyId: seatbid.seat, + ...(bid.ext?.dsa && { + dsa: bid.ext.dsa + }) + } + }; + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(JSON.parse(bidRequest.data).imp[0], 'video.ext.context'); + if (videoContext === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.ADPOD) { + resultingBid.vastXml = bid.adm; + resultingBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('adpod.brandCategoryExclusion')) { + resultingBid.meta.primaryCatId = bid.cat[0]; + } + resultingBid.video = { + context: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.ADPOD, + durationSeconds: bid.ext.duration + }; + bids.push(resultingBid); + } else { + switch (smtAdType) { + case 'Img': + case 'Richmedia': + resultingBid.ad = createBannerAd(bid); + resultingBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + bids.push(resultingBid); + break; + case 'Video': + resultingBid.vastXml = bid.adm; + resultingBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bids.push(resultingBid); + break; + case 'Native': + resultingBid.native = createNativeAd(bid.adm); + resultingBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + bids.push(resultingBid); + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Invalid ad type:', smtAdType); + } + } + resultingBid.meta.mediaType = resultingBid.mediaType; + }); + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[SMAATO] Prebid bids:', bids); + return bids; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + if (syncOptions) { + let gdprParams = ''; + if (gdprConsent && gdprConsent.consentString) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + gdprParams = `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`; + } else { + gdprParams = `&gdpr_consent=${gdprConsent.consentString}`; + } + } + if (syncOptions.iframeEnabled) { + let maxUrlsParam = ''; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('userSync') && _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('userSync').syncsPerBidder) { + maxUrlsParam = `&maxUrls=${_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('userSync').syncsPerBidder}`; + } + return [{ + type: 'iframe', + url: IFRAME_SYNC_URL + gdprParams + maxUrlsParam + }]; + } else if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: IMAGE_SYNC_URL + gdprParams + }]; + } + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_5__.ortbConverter)({ + context: { + netRevenue: true, + ttl: TTL, + currency: CURRENCY + }, + request(buildRequest, imps, bidderRequest, context) { + function isGdprApplicable() { + return bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies; + } + function setPublisherId(node) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(node, 'publisher.id', bidRequest.params.publisherId); + } + const request = buildRequest(imps, bidderRequest, context); + const bidRequest = context.bidRequests[0]; + let content; + const mediaType = context.mediaType; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const videoParams = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; + if (videoParams.context === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.ADPOD) { + request.imp = createAdPodImp(request.imp[0], videoParams); + content = addOptionalAdpodParameters(videoParams); + } + } + request.at = 1; + if (request.user) { + if (isGdprApplicable()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.user, 'ext.consent', bidderRequest.gdprConsent.consentString); + } + } else { + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userIdAsEids'); + request.user = { + ext: { + consent: isGdprApplicable() ? bidderRequest.gdprConsent.consentString : null, + eids: eids && eids.length ? eids : null + } + }; + } + if (request.site) { + request.site.id = window.location.hostname; + if (content) { + request.site.content = content; + } + setPublisherId(request.site); + } else if (request.dooh) { + request.dooh.id = window.location.hostname; + if (content) { + request.dooh.content = content; + } + setPublisherId(request.dooh); + } else { + request.site = { + id: window.location.hostname, + domain: bidderRequest.refererInfo.domain || window.location.hostname, + page: bidderRequest.refererInfo.page || window.location.href, + ref: bidderRequest.refererInfo.ref, + content: content || null + }; + setPublisherId(request.site); + } + if (request.regs) { + if (isGdprApplicable()) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.regs, 'ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + if (bidderRequest.uspConsent !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.regs, 'ext.us_privacy', bidderRequest.uspConsent); + } + if (request.regs?.gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.regs, 'ext.gpp', request.regs.gpp); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.regs, 'ext.gpp_sid', request.regs.gpp_sid); + } + } else { + request.regs = { + coppa: _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true ? 1 : 0, + ext: { + gdpr: isGdprApplicable() ? bidderRequest.gdprConsent.gdprApplies ? 1 : 0 : null, + us_privacy: bidderRequest.uspConsent + } + }; + } + if (!request.device) { + request.device = { + language: navigator && navigator.language ? navigator.language.split('-')[0] : '', + ua: navigator.userAgent, + dnt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getDNT)() ? 1 : 0, + h: screen.height, + w: screen.width + }; + } + if (bidRequest.params.app) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request.device, 'geo')) { + const geo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.app.geo'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.device, 'geo', geo); + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request.device, 'ifa')) { + const ifa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.app.ifa'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(request.device, 'ifa', ifa); + } + } + request.source = { + ext: { + schain: bidRequest.schain + } + }; + request.ext = { + client: SMAATO_CLIENT + }; + return request; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(imp, 'tagid', bidRequest.params.adbreakId || bidRequest.params.adspaceId); + if (imp.bidfloorcur && imp.bidfloorcur !== CURRENCY) { + delete imp.bidfloor; + delete imp.bidfloorcur; + } + return imp; + }, + overrides: { + imp: { + banner(orig, imp, bidRequest, context) { + const mediaType = context.mediaType; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + imp.bidfloor = getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, (0,_libraries_sizeUtils_sizeUtils_js__WEBPACK_IMPORTED_MODULE_7__.getAdUnitSizes)(bidRequest)); + } + orig(imp, bidRequest, context); + }, + video(orig, imp, bidRequest, context) { + const mediaType = context.mediaType; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + const videoParams = bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; + imp.bidfloor = getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, videoParams.playerSize); + if (videoParams.context !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.ADPOD) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__.dset)(imp, 'video.ext', { + rewarded: videoParams.ext && videoParams.ext.rewarded ? videoParams.ext.rewarded : 0 + }); + } + } + orig(imp, bidRequest, context); + }, + native(orig, imp, bidRequest, context) { + const mediaType = context.mediaType; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + imp.bidfloor = getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, getNativeMainImageSize(bidRequest.nativeOrtbRequest)); + } + orig(imp, bidRequest, context); + } + } + } +}); +const createBannerAd = bid => { + let clickEvent = ''; + if (bid.ext && bid.ext.curls) { + let clicks = ''; + bid.ext.curls.forEach(src => { + clicks += `fetch(decodeURIComponent('${encodeURIComponent(src)}'), {cache: 'no-cache'});`; + }); + clickEvent = `onclick="${clicks}"`; + } + return `
${bid.adm}
`; +}; +const createNativeAd = adm => { + const nativeResponse = JSON.parse(adm).native; + return { + ortb: nativeResponse + }; +}; +function getNativeMainImageSize(nativeRequest) { + const mainImage = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_8__.find)(nativeRequest.assets, asset => asset.hasOwnProperty('img') && asset.img.type === _src_constants_js__WEBPACK_IMPORTED_MODULE_9__.NATIVE_IMAGE_TYPES.MAIN); + if (mainImage) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(mainImage.img.w) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(mainImage.img.h)) { + return [[mainImage.img.w, mainImage.img.h]]; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(mainImage.img.wmin) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(mainImage.img.hmin)) { + return [[mainImage.img.wmin, mainImage.img.hmin]]; + } + } + return []; +} +function createAdPodImp(imp, videoMediaType) { + const bce = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('adpod.brandCategoryExclusion'); + imp.video.ext = { + context: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.ADPOD, + brandcategoryexclusion: bce !== undefined && bce + }; + const numberOfPlacements = getAdPodNumberOfPlacements(videoMediaType); + let imps = (0,_libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_10__.fill)(imp, numberOfPlacements); + const durationRangeSec = videoMediaType.durationRangeSec; + if (videoMediaType.requireExactDuration) { + // equal distribution of numberOfPlacement over all available durations + const divider = Math.ceil(numberOfPlacements / durationRangeSec.length); + const chunked = (0,_libraries_chunk_chunk_js__WEBPACK_IMPORTED_MODULE_11__.chunk)(imps, divider); + + // each configured duration is set as min/maxduration for a subset of requests + durationRangeSec.forEach((duration, index) => { + chunked[index].map(imp => { + const sequence = index + 1; + imp.video.minduration = duration; + imp.video.maxduration = duration; + imp.video.sequence = sequence; + }); + }); + } else { + // all maxdurations should be the same + const maxDuration = Math.max(...durationRangeSec); + imps.map((imp, index) => { + const sequence = index + 1; + imp.video.maxduration = maxDuration; + imp.video.sequence = sequence; + }); + } + return imps; +} +function getAdPodNumberOfPlacements(videoMediaType) { + const { + adPodDurationSec, + durationRangeSec, + requireExactDuration + } = videoMediaType; + const minAllowedDuration = Math.min(...durationRangeSec); + const numberOfPlacements = Math.floor(adPodDurationSec / minAllowedDuration); + return requireExactDuration ? Math.max(numberOfPlacements, durationRangeSec.length) : numberOfPlacements; +} +const addOptionalAdpodParameters = videoMediaType => { + const content = {}; + if (videoMediaType.tvSeriesName) { + content.series = videoMediaType.tvSeriesName; + } + if (videoMediaType.tvEpisodeName) { + content.title = videoMediaType.tvEpisodeName; + } + if (typeof videoMediaType.tvSeasonNumber === 'number') { + content.season = videoMediaType.tvSeasonNumber.toString(); // conversion to string as in OpenRTB season is a string + } + if (typeof videoMediaType.tvEpisodeNumber === 'number') { + content.episode = videoMediaType.tvEpisodeNumber; + } + if (typeof videoMediaType.contentLengthSec === 'number') { + content.len = videoMediaType.contentLengthSec; + } + if (videoMediaType.contentMode && ['live', 'on-demand'].indexOf(videoMediaType.contentMode) >= 0) { + content.livestream = videoMediaType.contentMode === 'live' ? 1 : 0; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(content)) { + return content; + } +}; +function getBidFloor(bidRequest, mediaType, sizes) { + if (typeof bidRequest.getFloor === 'function') { + const size = sizes.length === 1 ? sizes[0] : '*'; + const floor = bidRequest.getFloor({ + currency: CURRENCY, + mediaType: mediaType, + size: size + }); + if (floor && !isNaN(floor.floor) && floor.currency === CURRENCY) { + return floor.floor; + } + } +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_12__.registerModule)('smaatoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","sizeUtils","chunk","appnexusUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/smaatoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["smartadserverBidAdapter"],{ + +/***/ "./modules/smartadserverBidAdapter.js": +/*!********************************************!*\ + !*** ./modules/smartadserverBidAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_equativUtils_equativUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/equativUtils/equativUtils.js */ "./libraries/equativUtils/equativUtils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'smartadserver'; +const GVL_ID = 45; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + aliases: ['smart'], + // short code + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.siteId && bid.params.pageId && bid.params.formatId); + }, + /** + * Serialize a supply chain object to a string uri encoded + * + * @param {*} schain object + */ + serializeSupplyChain: function (schain) { + if (!schain || !schain.nodes) return null; + const nodesProperties = ['asi', 'sid', 'hp', 'rid', 'name', 'domain']; + return `${schain.ver},${schain.complete}!` + schain.nodes.map(node => nodesProperties.map(prop => node[prop] ? encodeURIComponent(node[prop]) : '').join(',')).join('!'); + }, + /** + * Transforms the banner ad unit sizes into an object array. + * + * @param {*} bannerSizes Array of size array (ex. [[300, 250]]). + * @returns + */ + adaptBannerSizes: function (bannerSizes) { + return bannerSizes.map(size => ({ + w: size[0], + h: size[1] + })); + }, + /** + * Fills the payload with specific video attributes. + * + * @param {*} payload Payload that will be sent in the ServerRequest + * @param {*} videoMediaType Video media type + */ + fillPayloadForVideoBidRequest: function (payload, videoMediaType, videoParams) { + const playerSize = videoMediaType.playerSize[0]; + const map = { + maxbitrate: 'vbrmax', + maxduration: 'vdmax', + minbitrate: 'vbrmin', + minduration: 'vdmin', + placement: 'vpt', + plcmt: 'vplcmt', + skip: 'skip' + }; + payload.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + payload.isVideo = videoMediaType.context === 'instream'; + payload.videoData = {}; + for (const [key, value] of Object.entries(map)) { + payload.videoData = { + ...payload.videoData, + ...this.getValuableProperty(value, videoMediaType[key]) + }; + } + payload.videoData = { + ...payload.videoData, + ...this.getValuableProperty('playerWidth', playerSize[0]), + ...this.getValuableProperty('playerHeight', playerSize[1]), + ...this.getValuableProperty('adBreak', this.getStartDelayForVideoBidRequest(videoMediaType, videoParams)), + ...this.getValuableProperty('videoProtocol', this.getProtocolForVideoBidRequest(videoMediaType, videoParams)), + ...((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(videoMediaType.api) && videoMediaType.api.length ? { + iabframeworks: videoMediaType.api.toString() + } : {}), + ...((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArrayOfNums)(videoMediaType.playbackmethod) && videoMediaType.playbackmethod.length ? { + vpmt: videoMediaType.playbackmethod + } : {}) + }; + }, + /** + * Gets a property object if the value not falsy + * @param {string} property + * @param {number} value + * @returns object with the property or empty + */ + getValuableProperty: function (property, value) { + return typeof property === 'string' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value) && value ? { + [property]: value + } : {}; + }, + /** + * Gets the protocols from either videoParams or VideoMediaType + * @param {*} videoMediaType + * @param {*} videoParams + * @returns protocol from either videoMediaType or videoParams + */ + getProtocolForVideoBidRequest: function (videoMediaType, videoParams) { + if (videoParams !== undefined && videoParams.protocol) { + return videoParams.protocol; + } else if (videoMediaType !== undefined) { + if (Array.isArray(videoMediaType.protocols)) { + return Math.max.apply(Math, videoMediaType.protocols); + } + } + return null; + }, + /** + * Gets the startDelay from either videoParams or VideoMediaType + * @param {*} videoMediaType + * @param {*} videoParams + * @returns positive integer value of startdelay + */ + getStartDelayForVideoBidRequest: function (videoMediaType, videoParams) { + if (videoParams?.startDelay) { + return videoParams.startDelay; + } else if (videoMediaType?.startdelay) { + if (videoMediaType.startdelay > 0 || videoMediaType.startdelay == -1) { + return 2; + } else if (videoMediaType.startdelay == -2) { + return 3; + } + } + return 1; // SADR-5619 + }, + /** + * Creates the server request. + * + * @param {*} payload Body of the request. + * @param {string} domain Endpoint domain . + * @returns {ServerRequest} Info describing the request to the server. + */ + createServerRequest: function (payload, domain) { + return { + method: 'POST', + url: (domain !== undefined ? domain : 'https://prg.smartadserver.com') + '/prebid/v1', + data: JSON.stringify(payload), + options: { + browsingTopics: false + } + }; + }, + /** + * Makes server requests from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests an array of bids + * @param {BidRequest} bidderRequest bidder request object + * @return {ServerRequest[]} Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // use bidderRequest.bids[] to get bidder-dependent request info + const adServerCurrency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(bidderRequest); + const sellerDefinedAudience = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.user.data', _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getAnyConfig('ortb2.user.data')); + const sellerDefinedContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.site.content.data', _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getAnyConfig('ortb2.site.content.data')); + + // pull requested transaction ID from bidderRequest.bids[].transactionId + return validBidRequests.reduce((bidRequests, bid) => { + // Common bid request attributes for banner, outstream and instream. + let payload = { + siteid: bid.params.siteId, + pageid: bid.params.pageId, + formatid: bid.params.formatId, + currencyCode: adServerCurrency, + targeting: bid.params.target && bid.params.target !== '' ? bid.params.target : undefined, + buid: bid.params.buId && bid.params.buId !== '' ? bid.params.buId : undefined, + appname: bid.params.appName && bid.params.appName !== '' ? bid.params.appName : undefined, + ckid: bid.params.ckId || 0, + tagId: bid.adUnitCode, + // TODO: is 'page' the right value here? + pageDomain: bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page ? bidderRequest.refererInfo.page : undefined, + transactionId: bid.ortb2Imp?.ext?.tid, + timeout: _src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('bidderTimeout'), + bidId: bid.bidId, + prebidVersion: "9.45.0-pre", + schain: spec.serializeSupplyChain(bid.schain), + sda: sellerDefinedAudience, + sdc: sellerDefinedContext + }; + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + payload.gpid = gpid; + } + const dsa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2.regs.ext.dsa'); + if (dsa) { + payload.dsa = dsa; + } + if (bidderRequest) { + if (bidderRequest.gdprConsent) { + payload.addtl_consent = bidderRequest.gdprConsent.addtlConsent; + payload.gdpr_consent = bidderRequest.gdprConsent.consentString; + payload.gdpr = bidderRequest.gdprConsent.gdprApplies; // we're handling the undefined case server side + } + if (bidderRequest.gppConsent) { + payload.gpp = bidderRequest.gppConsent.gppString; + payload.gpp_sid = bidderRequest.gppConsent.applicableSections; + } + if (bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + } + if (bid && bid.userIdAsEids) { + payload.eids = bid.userIdAsEids; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + const bannerMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner'); + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video'); + const isSupportedVideoContext = videoMediaType && (videoMediaType.context === 'instream' || videoMediaType.context === 'outstream'); + if (bannerMediaType || isSupportedVideoContext) { + let type; + if (bannerMediaType) { + type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + payload.sizes = spec.adaptBannerSizes(bannerMediaType.sizes); + if (isSupportedVideoContext) { + let videoPayload = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(payload); + spec.fillPayloadForVideoBidRequest(videoPayload, videoMediaType, bid.params.video); + videoPayload.bidfloor = bid.params.bidfloor || (0,_libraries_equativUtils_equativUtils_js__WEBPACK_IMPORTED_MODULE_5__.getBidFloor)(bid, adServerCurrency, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO); + bidRequests.push(spec.createServerRequest(videoPayload, bid.params.domain)); + } + } else { + type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + spec.fillPayloadForVideoBidRequest(payload, videoMediaType, bid.params.video); + } + payload.bidfloor = bid.params.bidfloor || (0,_libraries_equativUtils_equativUtils_js__WEBPACK_IMPORTED_MODULE_5__.getBidFloor)(bid, adServerCurrency, type); + bidRequests.push(spec.createServerRequest(payload, bid.params.domain)); + } else { + bidRequests.push({}); + } + return bidRequests; + }, []); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {*} bidRequestString + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequestString) { + const bidResponses = []; + let response = serverResponse.body; + try { + if (response && !response.isNoAd && (response.ad || response.adUrl)) { + const bidRequest = JSON.parse(bidRequestString.data); + let bidResponse = { + requestId: bidRequest.bidId, + cpm: response.cpm, + width: response.width, + height: response.height, + creativeId: response.creativeId, + dealId: response.dealId, + currency: response.currency, + netRevenue: response.isNetCpm, + ttl: response.ttl, + dspPixels: response.dspPixels, + meta: { + ...((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(response.adomain) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(response.adomain) ? { + advertiserDomains: response.adomain + } : {}), + ...(!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(response.dsa) ? { + dsa: response.dsa + } : {}) + } + }; + if (bidRequest.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bidResponse.vastUrl = response.adUrl; + bidResponse.vastXml = response.ad; + bidResponse.content = response.ad; + } else { + bidResponse.adUrl = response.adUrl; + bidResponse.ad = response.ad; + } + bidResponses.push(bidResponse); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Error while parsing smart server response', error); + } + return bidResponses; + }, + /** + * User syncs. + * + * @param {*} syncOptions Publisher prebid configuration. + * @param {*} serverResponses A successful response from the server. + * @return {UserSync[]} An array of syncs that should be executed. + */ + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + if (syncOptions.iframeEnabled && serverResponses.length > 0 && serverResponses[0].body.cSyncUrl != null) { + syncs.push({ + type: 'iframe', + url: serverResponses[0].body.cSyncUrl + }); + } else if (syncOptions.pixelEnabled && serverResponses.length > 0 && serverResponses[0].body.dspPixels !== undefined) { + serverResponses[0].body.dspPixels.forEach(function (pixel) { + syncs.push({ + type: 'image', + url: pixel + }); + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('smartadserverBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","equativUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/smartadserverBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["smarthubBidAdapter"],{ + +/***/ "./modules/smarthubBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/smarthubBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'smarthub'; +const SYNC_URL = 'https://us.shb-sync.com'; +const ALIASES = [{ + code: 'attekmi' +}, { + code: 'markapp' +}, { + code: 'jdpmedia' +}, { + code: 'tredio' +}, { + code: 'felixads' +}, { + code: 'vimayx' +}, { + code: 'artechnology' +}, { + code: 'adinify' +}, { + code: 'addigi' +}, { + code: 'jambojar' +}]; +const BASE_URLS = { + attekmi: 'https://prebid.attekmi.com/pbjs', + smarthub: 'https://prebid.attekmi.com/pbjs', + markapp: 'https://markapp-prebid.attekmi.com/pbjs', + jdpmedia: 'https://jdpmedia-prebid.attekmi.com/pbjs', + tredio: 'https://tredio-prebid.attekmi.com/pbjs', + felixads: 'https://felixads-prebid.attekmi.com/pbjs', + vimayx: 'https://vimayx-prebid.attekmi.com/pbjs', + artechnology: 'https://artechnology-prebid.attekmi.com/pbjs', + adinify: 'https://adinify-prebid.attekmi.com/pbjs', + addigi: 'https://addigi-prebid.attekmi.com/pbjs', + jambojar: 'https://jambojar-prebid.attekmi.com/pbjs' +}; +const _getUrl = partnerName => { + const aliases = ALIASES.map(el => el.code); + if (aliases.includes(partnerName)) { + return BASE_URLS[partnerName]; + } + return `${BASE_URLS[BIDDER_CODE]}?partnerName=${partnerName}`; +}; +const getPartnerName = bid => String(bid.params?.partnerName || bid.bidder).toLowerCase(); +const getPlacementReqData = (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.buildPlacementProcessingFunction)({ + addPlacementType() {}, + addCustomFieldsToPlacement(bid, bidderRequest, placement) { + const { + seat, + token, + iabCat, + minBidfloor, + pos + } = bid.params; + Object.assign(placement, { + partnerName: getPartnerName(bid), + seat, + token, + iabCat, + minBidfloor, + pos + }); + } +}); +const buildRequests = function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const bidsByPartner = validBidRequests.reduce((bidsByPartner, bid) => { + const partner = getPartnerName(bid); + (bidsByPartner[partner] = bidsByPartner[partner] || []).push(bid); + return bidsByPartner; + }, {}); + return Object.entries(bidsByPartner).map(_ref => { + let [partner, validBidRequests] = _ref; + return (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.buildRequestsBase)({ + adUrl: _getUrl(partner), + bidderRequest, + validBidRequests, + placementProcessingFunction: getPlacementReqData + }); + }); +}; +const spec = { + code: BIDDER_CODE, + aliases: ALIASES, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.isBidRequestValid)(['seat', 'token'], 'every'), + buildRequests, + interpretResponse: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.interpretResponseBuilder)({ + addtlBidValidation(bid) { + return bid.hasOwnProperty('netRevenue'); + } + }), + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_0__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('smarthubBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/smarthubBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["smarticoBidAdapter"],{ + +/***/ "./modules/smarticoBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/smarticoBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + +const SMARTICO_CONFIG = { + bidRequestUrl: 'https://trmads.eu/preBidRequest', + widgetUrl: 'https://trmads.eu/get', + method: 'POST' +}; +const BIDDER_CODE = 'smartico'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!(bid && bid.params && bid.params.token && bid.params.placementId); + }, + buildRequests: function (validBidRequests, bidderRequest) { + var i; + var j; + var bid; + var bidParam; + var bidParams = []; + var sizes; + var frameWidth = Math.round(window.screen.width); + var frameHeight = Math.round(window.screen.height); + for (i = 0; i < validBidRequests.length; i++) { + bid = validBidRequests[i]; + if (bid.sizes) { + sizes = bid.sizes; + } else if (typeof _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER != 'undefined' && bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER] && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes) { + sizes = bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER].sizes; + } else if (frameWidth && frameHeight) { + sizes = [[frameWidth, frameHeight]]; + } else { + sizes = []; + } + for (j = 0; j < sizes.length; j++) { + bidParam = { + token: bid.params.token || '', + bidId: bid.bidId, + 'banner-format-width': sizes[j][0], + 'banner-format-height': sizes[j][1] + }; + if (bid.params.bannerFormat) { + bidParam['banner-format'] = bid.params.bannerFormat; + } + if (bid.params.language) { + bidParam.language = bid.params.language; + } + if (bid.params.region) { + bidParam.region = bid.params.region; + } + if (bid.params.regions && (bid.params.regions instanceof String || bid.params.regions instanceof Array && bid.params.regions.length)) { + bidParam.regions = bid.params.regions; + if (bidParam.regions instanceof Array) { + bidParam.regions = bidParam.regions.join(','); + } + } + bidParams.push(bidParam); + } + } + var ServerRequestObjects = { + method: SMARTICO_CONFIG.method, + url: SMARTICO_CONFIG.bidRequestUrl, + bids: validBidRequests, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + data: { + bidParams: bidParams, + auctionId: bidderRequest.auctionId + } + }; + return ServerRequestObjects; + }, + interpretResponse: function (serverResponse, bidRequest) { + var i; + var bid; + var bidObject; + var url; + var html; + var ad; + var ads; + var token; + var language; + var scriptId; + var bidResponses = []; + ads = serverResponse.body; + for (i = 0; i < ads.length; i++) { + ad = ads[i]; + bid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(bidRequest.bids, bid => bid.bidId === ad.bidId); + if (bid) { + token = bid.params.token || ''; + language = bid.params.language || SMARTICO_CONFIG.language || ''; + scriptId = encodeURIComponent('smartico-widget-' + bid.params.placementId + '-' + i); + url = SMARTICO_CONFIG.widgetUrl + '?token=' + encodeURIComponent(token) + '&auction-id=' + encodeURIComponent(bid.auctionId) + '&from-auction-buffer=1&own_session=1&ad=' + encodeURIComponent(ad.id) + '&scriptid=' + scriptId + (ad.bannerFormatAlias ? '&banner-format=' + encodeURIComponent(ad.bannerFormatAlias) : '') + (language ? '&language=' + encodeURIComponent(language) : ''); + html = ''; +}; +function _videoCreative(sbiDc, sbiAid, referer) { + return `https://${sbiDc}apex.go.sonobi.com/vast.xml?vid=${sbiAid}&ref=${encodeURIComponent(referer)}`; +} +function _getBidIdFromTrinityKey(key) { + return key.split('|').slice(-1)[0]; +} + +/** + * @param context - the window to determine the innerWidth from. This is purely for test purposes as it should always be the current window + */ +const _isInbounds = function () { + let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)(); + return function () { + let lowerBound = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let upperBound = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_SAFE_INTEGER; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(context, 'innerWidth') >= lowerBound && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(context, 'innerWidth') < upperBound; + }; +}; + +/** + * @param context - the window to determine the innerWidth from. This is purely for test purposes as it should always be the current window + */ +function _getPlatform() { + let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; + const isInBounds = _isInbounds(context); + const MOBILE_VIEWPORT = { + lt: 768 + }; + const TABLET_VIEWPORT = { + lt: 992, + ge: 768 + }; + if (isInBounds(0, MOBILE_VIEWPORT.lt)) { + return 'mobile'; + } + if (isInBounds(TABLET_VIEWPORT.ge, TABLET_VIEWPORT.lt)) { + return 'tablet'; + } + return 'desktop'; +} +/** + * Check for local storage + * Generate a UUID for the user if one does not exist in local storage + * Store the UUID in local storage for future use + * @return {object} firstPartyData - Data object containing first party information + */ +function loadOrCreateFirstPartyData() { + var FIRST_PARTY_KEY = '_iiq_fdata'; + var tryParse = function (data) { + try { + return JSON.parse(data); + } catch (err) { + return null; + } + }; + var readData = function (key) { + if (hasLocalStorage()) { + // TODO FIX RULES VIOLATION + // eslint-disable-next-line no-restricted-properties + return window.localStorage.getItem(key); + } + return null; + }; + // TODO FIX RULES VIOLATION - USE STORAGE MANAGER + var hasLocalStorage = function () { + return false; + }; + var generateGUID = function () { + var d = new Date().getTime(); + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c === 'x' ? r : r & 0x3 | 0x8).toString(16); + }); + }; + var storeData = function (key, value) { + try { + if (hasLocalStorage()) { + // TODO FIX RULES VIOLATION + // eslint-disable-next-line no-restricted-properties + window.localStorage.setItem(key, value); + } + } catch (error) { + return null; + } + }; + var firstPartyData = tryParse(readData(FIRST_PARTY_KEY)); + if (!firstPartyData || !firstPartyData.pcid) { + var firstPartyId = generateGUID(); + firstPartyData = { + pcid: firstPartyId, + pcidDate: Date.now() + }; + } else if (firstPartyData && !firstPartyData.pcidDate) { + firstPartyData.pcidDate = Date.now(); + } + storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData)); + return firstPartyData; +} +; +function newRenderer(adUnitCode, bid) { + let rendererOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_7__.Renderer.install({ + id: bid.aid, + url: OUTSTREAM_REDNERER_URL, + config: rendererOptions, + loaded: false, + adUnitCode + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Prebid Error calling setRender on renderer', err); + } + renderer.setEventHandlers({ + impression: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Sonobi outstream video impression event'), + loaded: () => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Sonobi outstream video loaded event'), + ended: () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logMessage)('Sonobi outstream renderer video event'); + // document.querySelector(`#${adUnitCode}`).style.display = 'none'; + } + }); + return renderer; +} +function outstreamRender(bid) { + // push to render queue because SbiOutstreamRenderer may not be loaded yet + bid.renderer.push(() => { + const [width, height] = bid.getSize().split('x'); + const renderer = new window.SbiOutstreamRenderer(); + renderer.init({ + vastUrl: bid.vastUrl, + height, + width + }); + renderer.setRootElement(bid.adUnitCode); + }); +} +function _iframeAllowed() { + return _src_userSync_js__WEBPACK_IMPORTED_MODULE_8__.userSync.canBidderRegisterSync('iframe', BIDDER_CODE); +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return bid.params.floor ? bid.params.floor : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return ''; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('sonobiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","keywords","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sonobiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sovrnBidAdapter"],{ + +/***/ "./modules/sovrnBidAdapter.js": +/*!************************************!*\ + !*** ./modules/sovrnBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/deepintentUtils/index.js */ "./libraries/deepintentUtils/index.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const ORTB_VIDEO_PARAMS = { + ..._libraries_deepintentUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.COMMON_ORTB_VIDEO_PARAMS, + 'placement': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value) && value >= 1 && value <= 5, + 'plcmt': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value) && value >= 1 && value <= 4, + 'delivery': value => Array.isArray(value) && value.every(v => v >= 1 && v <= 3), + 'pos': value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(value) && value >= 1 && value <= 7 +}; +const REQUIRED_VIDEO_PARAMS = { + mimes: ORTB_VIDEO_PARAMS.mimes, + maxduration: ORTB_VIDEO_PARAMS.maxduration, + protocols: ORTB_VIDEO_PARAMS.protocols +}; +const spec = { + code: 'sovrn', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + gvlid: 13, + /** + * Check if the bid is a valid zone ID in either number or string form + * @param {object} bid the Sovrn bid to validate + * @return boolean for whether or not a bid is valid + */ + isBidRequestValid: function (bid) { + const video = bid?.mediaTypes?.video; + return !!(bid.params.tagid && !isNaN(parseFloat(bid.params.tagid)) && isFinite(bid.params.tagid) && (!video || Object.keys(REQUIRED_VIDEO_PARAMS).every(key => REQUIRED_VIDEO_PARAMS[key](video[key])))); + }, + /** + * Format the bid request object for our endpoint + * @return object of parameters for Prebid AJAX request + * @param bidReqs + * @param bidderRequest + */ + buildRequests: function (bidReqs, bidderRequest) { + try { + let sovrnImps = []; + let iv; + let schain; + let eids; + let criteoId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(bidReqs, function (bid) { + if (!eids && bid.userIdAsEids) { + eids = bid.userIdAsEids; + eids.forEach(function (id) { + if (id.uids && id.uids[0]) { + if (id.source === 'criteo.com') { + criteoId = id.uids[0].id; + } + } + }); + } + if (bid.schain) { + schain = schain || bid.schain; + } + iv = iv || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('iv', bid.params); + const imp = { + adunitcode: bid.adUnitCode, + id: bid.bidId, + tagid: String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('tagid', bid.params)), + bidfloor: _getBidFloors(bid) + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner')) { + let bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.sizes') || bid.sizes; + bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidSizes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bidSizes[0]) ? bidSizes : [bidSizes]; + bidSizes = bidSizes.filter(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(size)); + const processedSizes = bidSizes.map(size => ({ + w: parseInt(size[0], 10), + h: parseInt(size[1], 10) + })); + imp.banner = { + format: processedSizes, + w: 1, + h: 1 + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video')) { + imp.video = _buildVideoRequestObj(bid); + } + imp.ext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('ext', bid.ortb2Imp) || undefined; + const segmentsString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('segments', bid.params); + if (segmentsString) { + imp.ext = imp.ext || {}; + imp.ext.deals = segmentsString.split(',').map(deal => deal.trim()); + } + const auctionEnvironment = bid?.ortb2Imp?.ext?.ae; + if (bidderRequest.paapi?.enabled && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isInteger)(auctionEnvironment)) { + imp.ext = imp.ext || {}; + imp.ext.ae = auctionEnvironment; + } else { + if (imp.ext?.ae) { + delete imp.ext.ae; + } + } + sovrnImps.push(imp); + }); + const fpd = bidderRequest.ortb2 || {}; + const site = fpd.site || {}; + site.page = bidderRequest.refererInfo.page; + site.domain = bidderRequest.refererInfo.domain; + const tmax = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'timeout'); + const sovrnBidReq = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getUniqueIdentifierStr)(), + imp: sovrnImps, + site: site, + user: fpd.user || {}, + tmax: tmax + }; + if (schain) { + sovrnBidReq.source = { + ext: { + schain + } + }; + } + const tid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.source.tid'); + if (tid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'source.tid', tid); + } + const coppa = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.regs.coppa'); + if (coppa) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'regs.coppa', 1); + } + const bcat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'ortb2.bcat'); + if (bcat) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'bcat', bcat); + } + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'regs.ext.gdpr', +bidderRequest.gdprConsent.gdprApplies); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + } + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + if (bidderRequest.gppConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'regs.gpp', bidderRequest.gppConsent.gppString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections); + } + + // if present, merge device object from ortb2 into `sovrnBidReq.device` + if (bidderRequest?.ortb2?.device) { + sovrnBidReq.device = sovrnBidReq.device || {}; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.mergeDeep)(sovrnBidReq.device, bidderRequest.ortb2.device); + } + if (eids) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'user.ext.eids', eids); + if (criteoId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.dset)(sovrnBidReq, 'user.ext.prebid_criteoid', criteoId); + } + } + let url = `https://ap.lijit.com/rtb/bid?src=prebid_prebid_9.45.0-pre`; + if (iv) url += `&iv=${iv}`; + return { + method: 'POST', + url: url, + data: JSON.stringify(sovrnBidReq), + options: { + contentType: 'text/plain' + } + }; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Could not build bidrequest, error deatils:', e); + } + }, + /** + * Format Sovrn responses as Prebid bid responses + * @param {*} param0 A successful response from Sovrn. + * @return {Array} An array of formatted bids (+ fledgeAuctionConfigs if available) + */ + interpretResponse: function (_ref) { + let { + body: { + id, + seatbid, + ext + } + } = _ref; + if (!id || !seatbid || !Array.isArray(seatbid)) return []; + try { + let bids = seatbid.filter(seat => seat).map(seat => seat.bid.map(sovrnBid => { + const bid = { + requestId: sovrnBid.impid, + cpm: parseFloat(sovrnBid.price), + width: parseInt(sovrnBid.w), + height: parseInt(sovrnBid.h), + creativeId: sovrnBid.crid || sovrnBid.id, + dealId: sovrnBid.dealid || null, + currency: 'USD', + netRevenue: true, + mediaType: sovrnBid.nurl ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO, + ttl: sovrnBid.ext?.ttl || 90, + meta: { + advertiserDomains: sovrnBid && sovrnBid.adomain ? sovrnBid.adomain : [] + } + }; + if (sovrnBid.nurl) { + bid.ad = decodeURIComponent(`${sovrnBid.adm}`); + } else { + bid.vastXml = decodeURIComponent(sovrnBid.adm); + } + return bid; + })).flat(); + let fledgeAuctionConfigs = null; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(ext?.igbid)) { + const seller = ext.seller; + const decisionLogicUrl = ext.decisionLogicUrl; + const sellerTimeout = ext.sellerTimeout; + ext.igbid.filter(item => isValidIgBid(item)).forEach(igbid => { + const perBuyerSignals = {}; + igbid.igbuyer.filter(item => isValidIgBuyer(item)).forEach(buyerItem => { + perBuyerSignals[buyerItem.igdomain] = buyerItem.buyerdata; + }); + const interestGroupBuyers = [...Object.keys(perBuyerSignals)]; + if (interestGroupBuyers.length) { + fledgeAuctionConfigs = fledgeAuctionConfigs || {}; + fledgeAuctionConfigs[igbid.impid] = { + seller, + decisionLogicUrl, + sellerTimeout, + interestGroupBuyers: interestGroupBuyers, + perBuyerSignals + }; + } + }); + } + if (fledgeAuctionConfigs) { + fledgeAuctionConfigs = Object.entries(fledgeAuctionConfigs).map(_ref2 => { + let [bidId, cfg] = _ref2; + return { + bidId, + config: Object.assign({ + auctionSignals: {} + }, cfg) + }; + }); + return { + bids, + paapi: fledgeAuctionConfigs + }; + } + return bids; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('Could not interpret bidresponse, error details:', e); + return e; + } + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + try { + const tracks = []; + if (serverResponses && serverResponses.length !== 0) { + if (syncOptions.iframeEnabled) { + const iidArr = serverResponses.filter(resp => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(resp, 'body.ext.iid')).map(resp => resp.body.ext.iid); + const params = []; + if (gdprConsent && gdprConsent.gdprApplies && typeof gdprConsent.consentString === 'string') { + params.push(['gdpr_consent', gdprConsent.consentString]); + } + if (uspConsent) { + params.push(['us_privacy', uspConsent]); + } + if (gppConsent) { + params.push(['gpp', gppConsent.gppString]); + params.push(['gpp_sid', gppConsent.applicableSections]); + } + if (iidArr[0]) { + params.push(['informer', iidArr[0]]); + tracks.push({ + type: 'iframe', + url: 'https://ce.lijit.com/beacon?' + params.map(p => p.join('=')).join('&') + }); + } + } + if (syncOptions.pixelEnabled) { + serverResponses.filter(resp => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(resp, 'body.ext.sync.pixels')).reduce((acc, resp) => acc.concat(resp.body.ext.sync.pixels), []).map(pixel => pixel.url).forEach(url => tracks.push({ + type: 'image', + url + })); + } + } + return tracks; + } catch (e) { + return []; + } + } +}; +function _buildVideoRequestObj(bid) { + const videoObj = {}; + const bidSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'sizes'); + const videoAdUnitParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.video', {}); + const computedParams = {}; + if (bidSizes) { + const sizes = Array.isArray(bidSizes[0]) ? bidSizes[0] : bidSizes; + computedParams.w = sizes[0]; + computedParams.h = sizes[1]; + } else if (Array.isArray(videoAdUnitParams.playerSize)) { + const sizes = Array.isArray(videoAdUnitParams.playerSize[0]) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize; + computedParams.w = sizes[0]; + computedParams.h = sizes[1]; + } + const videoParams = { + ...computedParams, + ...videoAdUnitParams, + ...videoBidderParams + }; + Object.keys(ORTB_VIDEO_PARAMS).forEach(paramName => { + if (videoParams.hasOwnProperty(paramName)) { + if (ORTB_VIDEO_PARAMS[paramName](videoParams[paramName])) { + videoObj[paramName] = videoParams[paramName]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`The OpenRTB video param ${paramName} has been skipped due to misformating. Please refer to OpenRTB 2.5 spec.`); + } + } + }); + return videoObj; +} +function _getBidFloors(bid) { + const floorInfo = bid.getFloor && typeof bid.getFloor === 'function' ? bid.getFloor({ + currency: 'USD', + mediaType: bid.mediaTypes && bid.mediaTypes.banner ? 'banner' : 'video', + size: '*' + }) : {}; + const floorModuleValue = parseFloat(floorInfo?.floor); + if (!isNaN(floorModuleValue)) { + return floorModuleValue; + } + const paramValue = parseFloat((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidfloor', bid.params)); + return !isNaN(paramValue) ? paramValue : undefined; +} +function isValidIgBid(igBid) { + return !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr)(igBid.impid) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(igBid.igbuyer) && igBid.igbuyer.length; +} +function isValidIgBuyer(igBuyer) { + return !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmptyStr)(igBuyer.igdomain); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('sovrnBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["deepintentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sovrnBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sparteoBidAdapter"],{ + +/***/ "./modules/sparteoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/sparteoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const BIDDER_CODE = 'sparteo'; +const GVLID = 1028; +const TTL = 60; +const HTTP_METHOD = 'POST'; +const REQUEST_URL = 'https://bid.sparteo.com/auction'; +const USER_SYNC_URL_IFRAME = 'https://sync.sparteo.com/sync/iframe.html?from=prebidjs'; +let isSynced = window.sparteoCrossfire?.started || false; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + // `netRevenue` and `ttl` are required properties of bid responses - provide a default for them + netRevenue: true, + // or false if your adapter should set bidResponse.netRevenue = false + ttl: TTL // default bidResponse.ttl (when not specified in ORTB response.seatbid[].bid[].exp) + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'site.publisher.ext.params.pbjsVersion', "9.45.0-pre"); + if (bidderRequest.bids[0].params.networkId) { + request.site.publisher.ext.params.networkId = bidderRequest.bids[0].params.networkId; + } + if (bidderRequest.bids[0].params.publisherId) { + request.site.publisher.ext.params.publisherId = bidderRequest.bids[0].params.publisherId; + } + return request; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'ext.sparteo.params', bidRequest.params); + imp.ext.sparteo.params.adUnitCode = bidRequest.adUnitCode; + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + context.mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.type'); + const response = buildBidResponse(bid, context); + if (context.mediaType == 'video') { + response.nurl = bid.nurl; + response.vastUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ext.prebid.cache.vastXml.url') ?? null; + } + return response; + } +}); +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner'); + let videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); + if (!bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('The bid params are missing'); + return false; + } + if (!bid.params.networkId && !bid.params.publisherId) { + // publisherId is deprecated but is still accepted for now for retrocompatibility purpose. + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('The networkId is required'); + return false; + } + if (!bannerParams && !videoParams) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('The placement must be of banner or video type'); + return false; + } + + /** + * BANNER checks + */ + + if (bannerParams) { + let sizes = bannerParams.sizes; + if (!sizes || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseSizesInput)(sizes).length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('mediaTypes.banner.sizes must be set for banner placement at the right format.'); + return false; + } + } + + /** + * VIDEO checks + */ + + if (videoParams) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.parseSizesInput)(videoParams.playerSize).length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('mediaTypes.video.playerSize must be set for video placement at the right format.'); + return false; + } + } + return true; + }, + buildRequests: function (bidRequests, bidderRequest) { + const payload = converter.toORTB({ + bidRequests, + bidderRequest + }); + return { + method: HTTP_METHOD, + url: bidRequests[0].params.endpoint ? bidRequests[0].params.endpoint : REQUEST_URL, + data: payload + }; + }, + interpretResponse: function (serverResponse, requests) { + const bids = converter.fromORTB({ + response: serverResponse.body, + request: requests.data + }).bids; + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + let syncurl = ''; + if (!isSynced && !window.sparteoCrossfire?.started) { + // Attaching GDPR Consent Params in UserSync url + if (gdprConsent) { + syncurl += '&gdpr=' + (gdprConsent.gdprApplies ? 1 : 0); + syncurl += '&gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || ''); + } + if (uspConsent && uspConsent.consentString) { + syncurl += `&usp_consent=${uspConsent.consentString}`; + } + if (syncOptions.iframeEnabled) { + isSynced = true; + window.sparteoCrossfire = { + started: true + }; + return [{ + type: 'iframe', + url: USER_SYNC_URL_IFRAME + syncurl + }]; + } + } + }, + onTimeout: function (timeoutData) {}, + onBidWon: function (bid) { + if (bid && bid.nurl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.triggerPixel)(bid.nurl, null); + } + }, + onSetTargeting: function (bid) {} +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('sparteoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sparteoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ssmasBidAdapter"],{ + +/***/ "./modules/ssmasBidAdapter.js": +/*!************************************!*\ + !*** ./modules/ssmasBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports SSMAS_CODE, SSMAS_ENDPOINT, SSMAS_REQUEST_METHOD, ssmasOrtbConverter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + +const SSMAS_CODE = 'ssmas'; +const SSMAS_SERVER = 'ads.ssmas.com'; +const SSMAS_ENDPOINT = `https://${SSMAS_SERVER}/ortb`; +const SYNC_URL = `https://sync.ssmas.com/user_sync`; +const SSMAS_REQUEST_METHOD = 'POST'; +const GDPR_VENDOR_ID = 1183; +const ssmasOrtbConverter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.dset)(imp, 'ext.placementId', bidRequest.params.placementId); + return imp; + } +}); +const spec = { + code: SSMAS_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + gvlid: GDPR_VENDOR_ID, + isBidRequestValid: bid => { + return !!bid.params.placementId && !!bid.bidId && bid.bidder === SSMAS_CODE; + }, + buildRequests: (bidRequests, bidderRequest) => { + const data = ssmasOrtbConverter.toORTB({ + bidRequests, + bidderRequest + }); + const options = { + contentType: 'application/json', + withCredentials: false + }; + data.imp && data.imp.forEach(imp => { + if (imp.ext && imp.ext.placementId) { + imp.tagId = imp.ext.placementId; + } + }); + data.regs = data.regs || {}; + data.regs.ext = data.regs.ext || {}; + if (bidderRequest.gdprConsent) { + data.regs.ext.consent = bidderRequest.gdprConsent.consentString; + data.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + if (bidderRequest.uspConsent) { + data.regs.ext.consent = bidderRequest.uspConsent.consentString; + data.regs.ext.ccpa = 1; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + data.regs.coppa = 1; + } + return [{ + method: SSMAS_REQUEST_METHOD, + url: SSMAS_ENDPOINT, + data, + options + }]; + }, + interpretResponse: (serverResponse, bidRequest) => { + const bids = ssmasOrtbConverter.fromORTB({ + response: serverResponse.body, + request: bidRequest.data + }).bids; + return bids.filter(bid => { + return bid.cpm > 0; + }); + }, + onBidWon: bid => { + if (bid.burl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.triggerPixel)(bid.burl); + } + }, + getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => { + const syncs = []; + let params = ['pbjs=1']; + if (gdprConsent) { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params.push(`gdpr=${Boolean(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`); + } else { + params.push(`gdpr_consent=${gdprConsent.consentString}`); + } + } + if (uspConsent && uspConsent.consentString) { + params.push(`ccpa_consent=${uspConsent.consentString}`); + } + if (syncOptions.iframeEnabled && serverResponses.length > 0) { + syncs.push({ + type: 'iframe', + url: `${SYNC_URL}/iframe?${params.join('&')}` + }); + } + + // if (syncOptions.pixelEnabled && serverResponses.length > 0) { + // syncs.push({ + // type: 'image', + // url: `${SYNC_URL}/image?${params.join('&')}` + // }); + // } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('ssmasBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ssmasBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sspBCBidAdapter"],{ + +/***/ "./modules/sspBCBidAdapter.js": +/*!************************************!*\ + !*** ./modules/sspBCBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + +const BIDDER_CODE = 'sspBC'; +const BIDDER_URL = 'https://ssp.wp.pl/bidder/'; +const SYNC_URL_IFRAME = 'https://ssp.wp.pl/bidder/usersync'; +const SYNC_URL_IMAGE = 'https://ssp.wp.pl/v1/sync/pixel'; +const NOTIFY_URL = 'https://ssp.wp.pl/bidder/notify'; +const GVLID = 676; +const TMAX = 450; +const BIDDER_VERSION = '6.11'; +const DEFAULT_CURRENCY = 'PLN'; +const W = window; +const { + navigator +} = W; +const oneCodeDetection = {}; +const adUnitsCalled = {}; +const adSizesCalled = {}; +const bidderRequestsMap = {}; +const pageView = {}; + +/** + * Native asset mapping - we use constant id per type + * id > 10 indicates additional images + */ +var nativeAssetMap = { + title: 0, + cta: 1, + icon: 2, + image: 3, + body: 4, + sponsoredBy: 5 +}; + +/** + * currency used in bidRequest - updated on request + */ +var requestCurrency = DEFAULT_CURRENCY; + +/** + * return native asset type, based on asset id + * @param {number} id - native asset id + * @returns {string} asset type + */ +const getNativeAssetType = id => { + // id>10 will always be an image... + if (id > 10) { + return 'image'; + } + + // ...others should be decoded from nativeAssetMap + for (let assetName in nativeAssetMap) { + const assetId = nativeAssetMap[assetName]; + if (assetId === id) { + return assetName; + } + } +}; + +/** + * Get preferred language of browser (i.e. user) + * @returns {string} languageCode - ISO language code + */ +const getBrowserLanguage = () => navigator.language || navigator.languages && navigator.languages[0]; + +/** + * Get language of top level html object + * @returns {string} languageCode - ISO language code + */ +const getContentLanguage = () => { + try { + const topWindow = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)(); + return topWindow.document.body.parentNode.lang; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Could not read language from top-level html', err); + } +}; + +/** + * Get host name of the top level html object + * @returns {string} host name + */ +const getTopHost = () => { + try { + const topWindow = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)(); + return topWindow.location.host; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Could not read host from top-level window', err); + } +}; + +/** + * Get Bid parameters - returns bid params from Object, or 1el array + * @param {*} bidParams - bid (bidWon), or array of bids (timeout) + * @returns {object} params object + */ +const unpackParams = bidParams => { + const result = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bidParams) ? bidParams[0] : bidParams; + return result || {}; +}; + +/** + * Get bid parameters for notification + * @param {*} bidData - bid (bidWon), or array of bids (timeout) + */ +const getNotificationPayload = bidData => { + if (bidData) { + const bids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bidData) ? bidData : [bidData]; + if (bids.length > 0) { + let result = { + siteId: [], + slotId: [], + tagid: [] + }; + bids.forEach(bid => { + const { + adUnitCode, + cpm, + creativeId, + meta = {}, + mediaType, + params: bidParams, + bidderRequestId, + requestId, + timeout + } = bid; + const { + platform = 'wpartner' + } = meta; + const params = unpackParams(bidParams); + + // basic notification data + const bidBasicData = { + requestId: bidderRequestId || bidderRequestsMap[requestId], + timeout: timeout || result.timeout, + pvid: pageView.id, + platform + }; + result = { + ...result, + ...bidBasicData + }; + result.tagid.push(adUnitCode); + + // check for stored detection + if (oneCodeDetection[requestId]) { + params.siteId = oneCodeDetection[requestId][0]; + params.id = oneCodeDetection[requestId][1]; + } + if (params.siteId) { + result.siteId.push(params.siteId); + } + if (params.id) { + result.slotId.push(params.id); + } + if (cpm) { + // non-empty bid data + const { + advertiserDomains = [], + networkName, + pricepl + } = meta; + const bidNonEmptyData = { + cpm, + cpmpl: pricepl, + creativeId, + adomain: advertiserDomains[0], + adtype: mediaType, + networkName + }; + result = { + ...result, + ...bidNonEmptyData + }; + } + }); + return result; + } + } +}; +const applyClientHints = ortbRequest => { + const { + location + } = document; + const { + connection = {}, + deviceMemory, + userAgentData = {} + } = navigator; + const viewport = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().visualViewport || false; + const segments = []; + const hints = { + 'CH-Ect': connection.effectiveType, + 'CH-Rtt': connection.rtt, + 'CH-SaveData': connection.saveData, + 'CH-Downlink': connection.downlink, + 'CH-DeviceMemory': deviceMemory, + 'CH-Dpr': W.devicePixelRatio, + 'CH-ViewportWidth': viewport.width, + 'CH-BrowserBrands': JSON.stringify(userAgentData.brands), + 'CH-isMobile': userAgentData.mobile + }; + + /** + Check / generate page view id + Should be generated dureing first call to applyClientHints(), + and re-generated if pathname has changed + */ + if (!pageView.id || location.pathname !== pageView.path) { + pageView.path = location.pathname; + pageView.id = Math.floor(1E20 * Math.random()).toString(); + } + Object.keys(hints).forEach(key => { + const hint = hints[key]; + if (hint) { + segments.push({ + name: key, + value: hint.toString() + }); + } + }); + const data = [{ + id: '12', + name: 'NetInfo', + segment: segments + }, { + id: '7', + name: 'pvid', + segment: [{ + value: pageView.id + }] + }]; + const ch = { + data + }; + ortbRequest.user = { + ...ortbRequest.user, + ...ch + }; +}; +const applyTopics = (validBidRequest, ortbRequest) => { + const userData = validBidRequest.ortb2?.user?.data || []; + const topicsData = userData.filter(dataObj => { + const segtax = dataObj.ext?.segtax; + return segtax >= 600 && segtax <= 609; + })[0]; + + // format topics obj for exchange + if (topicsData) { + topicsData.id = `${topicsData.ext.segtax}`; + topicsData.name = 'topics'; + delete topicsData.ext; + ortbRequest.user.data.push(topicsData); + } +}; +const applyUserIds = (validBidRequest, ortbRequest) => { + const { + userIdAsEids: eidsVbr = [], + ortb2 = {} + } = validBidRequest; + const eidsOrtb = ortb2.user?.ext?.data?.eids || []; + const eids = [...eidsVbr, ...eidsOrtb]; + if (eids.length) { + const ids = { + eids + }; + ortbRequest.user = { + ...ortbRequest.user, + ...ids + }; + } +}; + +/** + * Add GDPR data to oRTB request + * Store conset API version (will be required by user sync) + */ +const applyGdpr = (bidderRequest, ortbRequest) => { + const { + gdprConsent + } = bidderRequest; + if (gdprConsent) { + const { + gdprApplies, + consentString + } = gdprConsent; + ortbRequest.regs = Object.assign(ortbRequest.regs || {}, { + 'gdpr': gdprApplies ? 1 : 0 + }); + ortbRequest.user = Object.assign(ortbRequest.user || {}, { + 'consent': consentString + }); + } +}; + +/** + * Get highest floorprice for a given adslot + * (sspBC adapter accepts one floor per imp) + * returns floor = 0 if getFloor() is not defined + * + * @param {object} slot bid request adslot + * @returns {number} floorprice + */ +const getHighestFloor = slot => { + const currency = requestCurrency; + let result = { + floor: 0, + currency + }; + if (typeof slot.getFloor === 'function') { + let bannerFloor = 0; + if (slot.sizes.length) { + bannerFloor = slot.sizes.reduce(function (prev, next) { + const { + floor: currentFloor = 0 + } = slot.getFloor({ + mediaType: 'banner', + size: next, + currency + }) || {}; + return prev > currentFloor ? prev : currentFloor; + }, 0); + } + const { + floor: nativeFloor = 0 + } = slot.getFloor({ + mediaType: 'native', + currency + }) || {}; + const { + floor: videoFloor = 0 + } = slot.getFloor({ + mediaType: 'video', + currency + }) || {}; + result.floor = Math.max(bannerFloor, nativeFloor, videoFloor); + } + return result; +}; + +/** + * Get currency (either default or adserver) + * @returns {string} currency name + */ +const getCurrency = bidderRequest => (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_1__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CURRENCY; + +/** + * Get value for first occurence of key within the collection + */ +const setOnAny = (collection, key) => collection.reduce((prev, next) => prev || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(next, key), false); + +/** + * Send payload to notification endpoint + */ +const sendNotification = payload => { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(NOTIFY_URL, null, JSON.stringify(payload), { + contentType: 'application/json', + withCredentials: false, + method: 'POST', + crossOrigin: true + }); +}; + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {object} Banner by OpenRTB 2.5 §3.2.6 + */ +const mapBanner = slot => { + if (slot.mediaType === 'banner' || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(slot, 'mediaTypes.banner') || !slot.mediaType && !slot.mediaTypes) { + const format = slot.sizes.map(size => ({ + w: size[0], + h: size[1] + })); + return { + format, + id: slot.bidId + }; + } +}; + +/** + * @param {string} paramName Native parameter name + * @param {object} paramValue Native parameter value + * @returns {object} native asset object that conforms to ortb native ads spec + */ +var mapAsset = function mapAsset(paramName, paramValue) { + const { + required, + sizes, + wmin, + hmin, + len + } = paramValue; + var id = nativeAssetMap[paramName]; + var assets = []; + if (id !== undefined) { + switch (paramName) { + case 'title': + assets.push({ + id: id, + required: required, + title: { + len: len || 140 + } + }); + break; + case 'cta': + assets.push({ + id: id, + required: required, + data: { + type: 12 + } + }); + break; + case 'icon': + assets.push({ + id: id, + required: required, + img: { + type: 1, + w: sizes && sizes[0], + h: sizes && sizes[1] + } + }); + break; + case 'image': + var hasMultipleImages = sizes && Array.isArray(sizes[0]); + var imageSizes = hasMultipleImages ? sizes : [sizes]; + for (var i = 0; i < imageSizes.length; i++) { + assets.push({ + id: i > 0 ? 10 + i : id, + required: required, + img: { + type: 3, + w: imageSizes[i][0], + h: imageSizes[i][1], + wmin: wmin, + hmin: hmin + } + }); + } + break; + case 'body': + assets.push({ + id: id, + required: required, + data: { + type: 2 + } + }); + break; + case 'sponsoredBy': + assets.push({ + id: id, + required: required, + data: { + type: 1 + } + }); + break; + } + } + return assets; +}; + +/** + * @param {object} slot Ad Unit Params by Prebid + * @returns {object} native object that conforms to ortb native ads spec + */ +const mapNative = slot => { + const native = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(slot, 'mediaTypes.native'); + if (native) { + var nativeParams = Object.keys(native); + var assets = []; + nativeParams.forEach(function (par) { + var newAssets = mapAsset(par, native[par]); + assets = assets.concat(newAssets); + }); + return { + request: JSON.stringify({ + native: { + assets: assets + } + }) + }; + } +}; +var mapVideo = (slot, videoFromBid) => { + var videoFromSlot = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(slot, 'mediaTypes.video'); + var videoParamsUsed = ['api', 'context', 'linearity', 'maxduration', 'mimes', 'protocols', 'playbackmethod']; + var videoAssets; + if (videoFromSlot) { + const video = videoFromBid ? Object.assign(videoFromSlot, videoFromBid) : videoFromSlot; + var videoParams = Object.keys(video); + var playerSize = video.playerSize; + videoAssets = {}; // player width / height + + if (playerSize) { + var maxSize = playerSize.reduce(function (prev, next) { + return next[0] >= prev[0] && next[1] >= prev[1] ? next : prev; + }, [1, 1]); + videoAssets.w = maxSize[0]; + videoAssets.h = maxSize[1]; + } // remaining supported params + + videoParams.forEach(function (par) { + if (videoParamsUsed.indexOf(par) >= 0) { + videoAssets[par] = video[par]; + } + ; + }); + } + return videoAssets; +}; +const mapImpression = slot => { + const { + adUnitCode, + bidderRequestId, + bidId, + params = {}, + ortb2Imp = {} + } = slot; + const { + id, + siteId, + video + } = params; + const { + instl, + ext = {} + } = ortb2Imp; + + /* + store bidId <-> bidderRequestId mapping for bidWon notification + */ + bidderRequestsMap[bidId] = bidderRequestId; + + /* + check max size for this imp, and check/store number this size was called (for current view) + send this info as ext.pbsize + */ + const slotSize = slot.sizes.length ? slot.sizes.reduce((prev, next) => prev[0] * prev[1] <= next[0] * next[1] ? next : prev).join('x') : '1x1'; + if (!adUnitsCalled[adUnitCode]) { + // this is a new adunit - assign & save pbsize + adSizesCalled[slotSize] = adSizesCalled[slotSize] ? adSizesCalled[slotSize] += 1 : 1; + adUnitsCalled[adUnitCode] = `${slotSize}_${adSizesCalled[slotSize]}`; + } + ext.data = Object.assign({ + pbsize: adUnitsCalled[adUnitCode] + }, ext.data); + const imp = { + id: id && siteId ? id.padStart(3, '0') : 'bidid-' + bidId, + banner: mapBanner(slot), + native: mapNative(slot, bidId), + video: mapVideo(slot, video), + tagid: adUnitCode, + ext, + instl + }; + + // Check floorprices for this imp + const { + floor, + currency + } = getHighestFloor(slot); + imp.bidfloor = floor; + imp.bidfloorcur = currency; + return imp; +}; +const isVideoAd = bid => { + const xmlTester = new RegExp(/^<\?xml| { + const xmlTester = new RegExp(/^{['"]native['"]/); + return bid.admNative || bid.adm && bid.adm.match(xmlTester); +}; +const isHTML = bid => { + const xmlTester = new RegExp(/^ { + const { + link = {}, + imptrackers: impressionTrackers, + jstracker + } = nativeData; + const { + url: clickUrl, + clicktrackers: clickTrackers = [] + } = link; + const macroReplacer = tracker => tracker.replace(new RegExp('%native_dom_id%', 'g'), adUnitCode); + let javascriptTrackers = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(jstracker) ? jstracker : jstracker && [jstracker]; + + // replace known macros in js trackers + javascriptTrackers = javascriptTrackers && javascriptTrackers.map(macroReplacer); + const result = { + clickUrl, + clickTrackers, + impressionTrackers, + javascriptTrackers + }; + nativeData.assets.forEach(asset => { + const { + id, + img = {}, + title = {}, + data = {} + } = asset; + const { + w: imgWidth, + h: imgHeight, + url: imgUrl, + type: imgType + } = img; + const { + type: dataType, + value: dataValue + } = data; + const { + text: titleText + } = title; + const detectedType = getNativeAssetType(id); + if (titleText) { + result.title = titleText; + } + if (imgUrl) { + // image or icon + const thisImage = { + url: imgUrl, + width: imgWidth, + height: imgHeight + }; + if (imgType === 3 || detectedType === 'image') { + result.image = thisImage; + } else if (imgType === 1 || detectedType === 'icon') { + result.icon = thisImage; + } + } + if (dataValue) { + // call-to-action, sponsored-by or body + if (dataType === 1 || detectedType === 'sponsoredBy') { + result.sponsoredBy = dataValue; + } else if (dataType === 2 || detectedType === 'body') { + result.body = dataValue; + } else if (dataType === 12 || detectedType === 'cta') { + result.cta = dataValue; + } + } + }); + return result; +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO], + isBidRequestValid(bid) { + // as per OneCode integration, bids without params are valid + return true; + }, + buildRequests(validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_5__.convertOrtbRequestToProprietaryNative)(validBidRequests); + + // update auction currency + requestCurrency = getCurrency(bidderRequest); + if (!validBidRequests || validBidRequests.length < 1) { + return false; + } + const ortb2 = setOnAny(validBidRequests, 'ortb2'); + const siteId = setOnAny(validBidRequests, 'params.siteId'); + const publisherId = setOnAny(validBidRequests, 'params.publisherId'); + const page = setOnAny(validBidRequests, 'params.page') || bidderRequest.refererInfo.page; + const domain = setOnAny(validBidRequests, 'params.domain') || bidderRequest.refererInfo.domain; + const tmax = setOnAny(validBidRequests, 'params.tmax') ? parseInt(setOnAny(validBidRequests, 'params.tmax'), 10) : TMAX; + const pbver = "9.45.0-pre"; + const testMode = setOnAny(validBidRequests, 'params.test') ? 1 : undefined; + const ref = bidderRequest.refererInfo.ref; + const { + source = {}, + regs = {} + } = ortb2 || {}; + source.schain = setOnAny(validBidRequests, 'schain'); + const payload = { + id: bidderRequest.bidderRequestId, + site: { + id: siteId ? `${siteId}` : undefined, + publisher: publisherId ? { + id: publisherId + } : undefined, + page, + domain, + ref, + content: { + language: getContentLanguage() + } + }, + imp: validBidRequests.map(slot => mapImpression(slot)), + cur: [requestCurrency], + tmax, + user: {}, + regs, + source, + device: { + language: getBrowserLanguage(), + w: screen.width, + h: screen.height + }, + test: testMode + }; + applyGdpr(bidderRequest, payload); + applyClientHints(payload); + applyUserIds(validBidRequests[0], payload); + applyTopics(bidderRequest, payload); + return { + method: 'POST', + url: `${BIDDER_URL}?bdver=${BIDDER_VERSION}&pbver=${pbver}&inver=0`, + data: JSON.stringify(payload), + bidderRequest + }; + }, + interpretResponse(serverResponse, request) { + const { + bidderRequest + } = request; + const { + body: response = {} + } = serverResponse; + const { + seatbid: responseSeat, + ext: responseExt = {} + } = response; + const { + paapi: fledgeAuctionConfigs = [] + } = responseExt; + const bids = []; + let site = JSON.parse(request.data).site; // get page and referer data from request + site.sn = response.sn || 'mc_adapter'; // WPM site name (wp_sn) + pageView.sn = site.sn; // store site_name (for syncing and notifications) + + if (responseSeat !== undefined) { + /* + Match response to request, by comparing bid id's + 'bidid-' prefix indicates oneCode (parameterless) request and response + */ + responseSeat.forEach(seatbid => { + const { + seat, + bid + } = seatbid; + bid.forEach(serverBid => { + // get data from bid response + const { + adomain, + crid = `mcad_${bidderRequest.auctionId}_${site.slot}`, + impid, + exp = 300, + ext = {}, + price, + w, + h + } = serverBid; + const bidRequest = bidderRequest.bids.filter(b => { + const { + bidId, + params: requestParams = {} + } = b; + const params = unpackParams(requestParams); + const { + id, + siteId + } = params; + const currentBidId = id && siteId ? id : 'bidid-' + bidId; + return currentBidId === impid; + })[0]; + + // get bidid from linked bidRequest + const { + bidId + } = bidRequest || {}; + + // get ext data from bid + const { + siteid = site.id, + slotid = site.slot, + pubid, + adlabel, + cache: creativeCache, + vurls = [], + dsa, + platform = 'wpartner', + pricepl + } = ext; + + // update site data + site = { + ...site, + ...{ + id: siteid, + slot: slotid, + publisherId: pubid, + adLabel: adlabel + } + }; + if (bidRequest && site.id && !(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_6__.includes)(site.id, 'bidid')) { + // found a matching request; add this bid + const { + adUnitCode + } = bidRequest; + + // store site data for future notification + oneCodeDetection[bidId] = [site.id, site.slot]; + const bid = { + requestId: bidId, + creativeId: crid, + cpm: price, + currency: response.cur, + ttl: exp, + width: w, + height: h, + meta: { + advertiserDomains: adomain, + networkName: seat, + pricepl, + dsa, + platform + }, + netRevenue: true, + vurls + }; + + // mediaType and ad data for instream / native / banner + if (isVideoAd(serverBid)) { + // video + bid.adType = 'instream'; + bid.mediaType = 'video'; + bid.vastXml = serverBid.adm; + bid.vastContent = serverBid.adm; + bid.vastUrl = creativeCache; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Bid ${bid.creativeId} is a video ad`); + } else if (isNativeAd(serverBid)) { + // native + bid.mediaType = 'native'; + // check native object + try { + const nativeData = serverBid.admNative || JSON.parse(serverBid.adm).native; + bid.native = parseNative(nativeData, adUnitCode); + bid.width = 1; + bid.height = 1; + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Could not parse native data', serverBid.adm); + bid.cpm = 0; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Bid ${bid.creativeId} as a native ad`); + } else if (isHTML(serverBid)) { + // banner ad (preformatted) + bid.mediaType = 'banner'; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)(`Bid ${bid.creativeId} as a preformatted banner`); + bid.ad = serverBid.adm; + } else { + // unsupported bid format - send notification and set CPM to zero + const payload = getNotificationPayload(bid); + payload.event = 'parseError'; + sendNotification(payload); + bid.cpm = 0; + } + if (bid.cpm > 0) { + // push this bid + bids.push(bid); + } + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Discarding response - no matching request / site id', serverBid.impid); + } + }); + }); + } + return fledgeAuctionConfigs.length ? { + bids, + fledgeAuctionConfigs + } : bids; + }, + getUserSyncs(syncOptions, _) { + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const { + iframeEnabled, + pixelEnabled + } = syncOptions; + const { + gdprApplies, + consentString = '' + } = gdprConsent; + let mySyncs = []; + if (iframeEnabled) { + mySyncs.push({ + type: 'iframe', + url: `${SYNC_URL_IFRAME}?tcf=2&pvid=${pageView.id}&sn=${pageView.sn}` + }); + } else if (pixelEnabled) { + mySyncs.push({ + type: 'image', + url: `${SYNC_URL_IMAGE}?inver=0&platform=wpartner&host=${getTopHost() || ''}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${consentString}` + }); + } + return mySyncs; + }, + onTimeout(timeoutData) { + const payload = getNotificationPayload(timeoutData); + if (payload) { + payload.event = 'timeout'; + sendNotification(payload); + return payload; + } + }, + onBidderError(errorData) { + const payload = getNotificationPayload(errorData); + if (payload) { + payload.event = 'parseError'; + sendNotification(payload); + return payload; + } + }, + onBidViewable(bid) { + const payload = getNotificationPayload(bid); + if (payload) { + payload.event = 'bidViewable'; + sendNotification(payload); + return payload; + } + }, + onBidBillable(bid) { + const payload = getNotificationPayload(bid); + if (payload) { + payload.event = 'bidBillable'; + sendNotification(payload); + return payload; + } + }, + onBidWon(bid) { + const payload = getNotificationPayload(bid); + if (payload) { + payload.event = 'bidWon'; + sendNotification(payload); + return payload; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); + +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('sspBCBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sspBCBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ssp_genieeBidAdapter"],{ + +/***/ "./modules/ssp_genieeBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/ssp_genieeBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BANNER_ENDPOINT, storage, buildExtuidQuery, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_fpd_sua_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/fpd/sua.js */ "./src/fpd/sua.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'ssp_geniee'; +const BANNER_ENDPOINT = 'https://aladdin.genieesspv.jp/yie/ld/api/ad_call/v2'; +// export const ENDPOINT_USERSYNC = ''; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +const DEFAULT_CURRENCY = 'JPY'; +const ALLOWED_CURRENCIES = ['USD', 'JPY']; +const NET_REVENUE = true; +const MODULE_NAME = `ssp_geniee`; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_NAME +}); + +/** + * List of keys for geparams (parameters we use) + * key: full name of the parameter + * value: shortened name used in geparams + */ +const GEPARAMS_KEY = { + /** + * location.href whose protocol is not http + */ + LOCATION: 'loc', + /** + * document.referrer whose protocol is not http + */ + REFERRER: 'ref', + /** + * URL parameter to be linked to clicks + */ + GENIEE_CT0: 'ct0', + /** + * zipcode + */ + ZIP: 'zip', + /** + * country + */ + COUNTRY: 'country', + /** + * city + */ + CITY: 'city', + /** + * longitude + */ + LONGITUDE: 'long', + /** + * lattitude + */ + LATITUDE: 'lati', + /** + * for customised parameters + */ + CUSTOM: 'custom', + /** + * advertising identifier for iOS + */ + IDENTIFIER_FOR_ADVERTISERS: 'idfa', + /** + * tracked Ad restrictions for iOS + */ + LIMIT_AD_TRACKING: 'lat', + /** + * bundle ID of iOS applications? + */ + BUNDLE: 'bundle' +}; + +/** + * List of keys for gecuparams (parameters we use) + * key: full name of the parameter + * value: shortened name used in geparams + */ +const GECUPARAMS_KEY = { + /** + * version no of gecuparams + */ + VERSION: 'ver', + /** + * minor version no of gecuparams + */ + MINOR_VERSION: 'minor', + /** + * encrypted value of LTSV format + */ + VALUE: 'value' +}; + +/** + * executing encodeURIComponent including single quotation + * @param {string} str + * @returns + */ +function encodeURIComponentIncludeSingleQuotation(str) { + return encodeURIComponent(str).replace(/'/g, '%27'); +} + +/** + * Checking "params" has a value for the key "key" and it is not undefined, null, or an empty string + * To support IE in the same way, we cannot use the ?? operator + * @param {Object} params + * @param {string} key + * @returns {boolean} + */ +function hasParamsNotBlankString(params, key) { + return key in params && typeof params[key] !== 'undefined' && params[key] != null && params[key] != ''; +} +const buildExtuidQuery = _ref => { + let { + id5, + imuId + } = _ref; + const params = [...(id5 ? [`id5:${id5}`] : []), ...(imuId ? [`im:${imuId}`] : [])]; + const queryString = params.join('\t'); + if (!queryString) return null; + return queryString; +}; + +/** + * making request data be used commonly banner and native + * @see https://docs.prebid.org/dev-docs/bidder-adaptor.html#location-and-referrers + */ +function makeCommonRequestData(bid, geparameter, refererInfo) { + const gpid = _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid, 'ortb2Imp.ext.gpid') || _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid, 'ortb2Imp.ext.data.pbadslot'); + const data = { + zoneid: bid.params.zoneId, + cb: Math.floor(Math.random() * 99999999999), + charset: document.charset || document.characterSet || '', + loc: refererInfo?.page || refererInfo?.location || refererInfo?.topmostLocation || refererInfo?.legacy.referer || encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.LOCATION]) || '', + ct0: geparameter[GEPARAMS_KEY.GENIEE_CT0] !== 'undefined' ? encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.GENIEE_CT0]) : '', + referer: refererInfo?.ref || encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.REFERRER]) || '', + topframe: window.parent == window.self ? 1 : 0, + cur: bid.params.hasOwnProperty('currency') ? bid.params.currency : DEFAULT_CURRENCY, + requestid: bid.bidId, + ua: navigator.userAgent, + tpaf: 1, + cks: 1, + ib: 0, + ...(gpid ? { + gpid + } : {}) + }; + try { + if (window.self.toString() !== '[object Window]' || window.parent.toString() !== '[object Window]') { + data.err = '1'; + } + } catch (e) {} + if (GEPARAMS_KEY.IDENTIFIER_FOR_ADVERTISERS in geparameter) { + data.idfa = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.IDENTIFIER_FOR_ADVERTISERS]); + } + if (GEPARAMS_KEY.LIMIT_AD_TRACKING in geparameter) { + data.adtk = geparameter[GEPARAMS_KEY.LIMIT_AD_TRACKING] ? '0' : '1'; + } + // makeScreenSizeForQueryParameter + if (typeof screen !== 'undefined') { + const screenWidth = screen.width; + const screenHeight = screen.height; + if (screenWidth > screenHeight) { + data.sw = screenHeight; + data.sh = screenWidth; + } else { + data.sw = screenWidth; + data.sh = screenHeight; + } + } + // makeBannerJskQuery + if (hasParamsNotBlankString(geparameter, GEPARAMS_KEY.ZIP)) { + data.zip = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.ZIP]); + } + if (hasParamsNotBlankString(geparameter, GEPARAMS_KEY.COUNTRY)) { + data.country = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.COUNTRY]); + } + if (hasParamsNotBlankString(geparameter, GEPARAMS_KEY.CITY)) { + data.city = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.CITY]); + } + if (hasParamsNotBlankString(geparameter, GEPARAMS_KEY.LONGITUDE)) { + data.long = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.LONGITUDE]); + } + if (hasParamsNotBlankString(geparameter, GEPARAMS_KEY.LATITUDE)) { + data.lati = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.LATITUDE]); + } + if (GEPARAMS_KEY.CUSTOM in geparameter && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(geparameter[GEPARAMS_KEY.CUSTOM])) { + for (const c in geparameter[GEPARAMS_KEY.CUSTOM]) { + if (hasParamsNotBlankString(geparameter[GEPARAMS_KEY.CUSTOM], c)) { + data[encodeURIComponentIncludeSingleQuotation('custom_' + c)] = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.CUSTOM][c]); + } + } + } + const gecuparameter = window.gecuparams || {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(gecuparameter)) { + if (hasParamsNotBlankString(gecuparameter, GECUPARAMS_KEY.VERSION)) { + data.gc_ver = encodeURIComponentIncludeSingleQuotation(gecuparameter[GECUPARAMS_KEY.VERSION]); + } + if (hasParamsNotBlankString(gecuparameter, GECUPARAMS_KEY.MINOR_VERSION)) { + data.gc_minor = encodeURIComponentIncludeSingleQuotation(gecuparameter[GECUPARAMS_KEY.MINOR_VERSION]); + } + if (hasParamsNotBlankString(gecuparameter, GECUPARAMS_KEY.VALUE)) { + data.gc_value = encodeURIComponentIncludeSingleQuotation(gecuparameter[GECUPARAMS_KEY.VALUE]); + } + } + + // imuid, id5 + const id5 = _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid, 'userId.id5id.uid'); + const imuId = _src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"](bid, 'userId.imuid'); + const extuidQuery = buildExtuidQuery({ + id5, + imuId + }); + if (extuidQuery) data.extuid = extuidQuery; + + // makeUAQuery + // To avoid double encoding, not using encodeURIComponent here + const ua = JSON.parse(getUserAgent()); + if (ua && ua.fullVersionList) { + const fullVersionList = ua.fullVersionList.reduce((acc, cur) => { + let str = acc; + if (str) str += ','; + str += '"' + cur.brand + '";v="' + cur.version + '"'; + return str; + }, ''); + data.ucfvl = fullVersionList; + } + if (ua && ua.platform) data.ucp = '"' + ua.platform + '"'; + if (ua && ua.architecture) data.ucarch = '"' + ua.architecture + '"'; + if (ua && ua.platformVersion) data.ucpv = '"' + ua.platformVersion + '"'; + if (ua && ua.bitness) data.ucbit = '"' + ua.bitness + '"'; + data.ucmbl = '?' + (ua && ua.mobile ? '1' : '0'); + if (ua && ua.model) data.ucmdl = '"' + ua.model + '"'; + return data; +} + +/** + * making request data for banner + */ +function makeBannerRequestData(bid, geparameter, refererInfo) { + const data = makeCommonRequestData(bid, geparameter, refererInfo); + + // this query is not used in nad endpoint but used in ad_call endpoint + if (hasParamsNotBlankString(geparameter, GEPARAMS_KEY.BUNDLE)) { + data.apid = encodeURIComponentIncludeSingleQuotation(geparameter[GEPARAMS_KEY.BUNDLE]); + } + return data; +} + +/** + * making bid response be used commonly banner and native + */ +function makeCommonBidResponse(bid, width, height) { + return { + requestId: bid.requestid, + cpm: bid.price, + creativeId: bid.creativeId, + currency: bid.cur, + netRevenue: NET_REVENUE, + ttl: 700, + width: width, + // width of the ad iframe + height: height // height of the ad iframe + }; +} + +/** + * making bid response for banner + */ +function makeBannerBidResponse(bid, request) { + const bidResponse = makeCommonBidResponse(bid, bid.width, bid.height); + const loc = encodeURIComponentIncludeSingleQuotation(window.top === window.self ? location.href : window.top.document.referrer); + const beacon = !bid.ib ? '' : ` +
+ +
`; + bidResponse.ad = makeBidResponseAd(beacon + '
' + makeChangeHeightEventMarkup(request) + decodeURIComponent(bid.adm) + '
'); + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + return bidResponse; +} + +/** + * making change height event markup for af iframe. About passback ad, it is possible that ad image is cut off. To handle this, we add this event to change height after ad is loaded. + */ +function makeChangeHeightEventMarkup(request) { + return ''; +} + +/** + * making bid response ad. This is also the value to be used by document.write in renderAd function. + * @param {string} innerHTML + * @returns + */ +function makeBidResponseAd(innerHTML) { + return '' + innerHTML + ''; +} +function getUserAgent() { + return storage.getDataFromLocalStorage('key') || null; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + /** + * Determines whether or not the given bid request is valid. + * @param {BidRequest} bidRequest The bid request params to validate. + * @return boolean True if this is a valid bid request, and false otherwise. + */ + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params.zoneId) return false; + const currencyType = _src_config_js__WEBPACK_IMPORTED_MODULE_5__.config.getConfig('currency.adServerCurrency'); + if (typeof currencyType === 'string' && ALLOWED_CURRENCIES.indexOf(currencyType) === -1) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError('Invalid currency type, we support only JPY and USD!'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Array} validBidRequests an array of bid requests + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const serverRequests = []; + const HIGH_ENTROPY_HINTS = ['architecture', 'model', 'mobile', 'platform', 'bitness', 'platformVersion', 'fullVersionList']; + const uaData = window.navigator?.userAgentData; + if (uaData && uaData.getHighEntropyValues) { + const getHighEntropySUA = (0,_src_fpd_sua_js__WEBPACK_IMPORTED_MODULE_6__.highEntropySUAAccessor)(uaData); + getHighEntropySUA(HIGH_ENTROPY_HINTS).then(ua => { + if (ua) { + storage.setDataInLocalStorage('ua', JSON.stringify(ua)); + } + }); + } + validBidRequests.forEach(bid => { + // const isNative = bid.mediaTypes?.native; + const geparameter = window.geparams || {}; + serverRequests.push({ + method: 'GET', + url: BANNER_ENDPOINT, + data: makeBannerRequestData(bid, geparameter, bidderRequest?.refererInfo), + bid: bid + }); + }); + return serverRequests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidderRequest A matched bid request for this response. + * @return Array An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidderRequest) { + const bidResponses = []; + if (!serverResponse || !serverResponse.body) { + return bidResponses; + } + const zoneId = bidderRequest.bid.params.zoneId; + let successBid; + successBid = serverResponse.body || {}; + if (successBid.hasOwnProperty(zoneId)) { + const bid = successBid[zoneId]; + bidResponses.push(makeBannerBidResponse(bid, bidderRequest)); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + const syncs = []; + + // if we need user sync, we add this part after preparing the endpoint + /* if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: ENDPOINT_USERSYNC + }); + } */ + + return syncs; + }, + onTimeout: function (timeoutData) {}, + onBidWon: function (bid) {}, + onSetTargeting: function (bid) {} +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_7__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('ssp_genieeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ssp_genieeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["stackadaptBidAdapter"],{ + +/***/ "./modules/stackadaptBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/stackadaptBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports converter, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_userSyncUtils_userSyncUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/userSyncUtils/userSyncUtils.js */ "./libraries/userSyncUtils/userSyncUtils.js"); + + + + + + +const BIDDER_CODE = 'stackadapt'; +const ENDPOINT_URL = 'https://pjs.srv.stackadapt.com/br'; +const USER_SYNC_ENDPOINT = 'https://sync.srv.stackadapt.com/sync?nid=pjs'; +const CURRENCY = 'USD'; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 300, + currency: CURRENCY + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + const bid = context.bidRequests[0]; + request.id = bidderRequest.bidderRequestId; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'site.publisher.id', bid.params.publisherId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'test', bid.params.testMode); + return request; + }, + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + if (bidRequest.params.placementId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'tagid', bidRequest.params.placementId); + } + if (bidRequest.params.banner?.expdir) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(imp, 'banner.expdir', bidRequest.params.banner.expdir); + } + const bidfloor = getBidFloor(bidRequest); + if (bidfloor) { + imp.bidfloor = parseFloat(bidfloor); + imp.bidfloorcur = CURRENCY; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isNumber)(imp.secure)) { + imp.secure = 1; + } + return imp; + }, + bidResponse(buildBidResponse, bid, context) { + const { + bidRequest + } = context; + const requestMediaTypes = Object.keys(bidRequest.mediaTypes); + if (requestMediaTypes.length === 1) { + context.mediaType = requestMediaTypes[0]; + } else { + if (bid.adm?.search(/^(<\?xml| { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","userSyncUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/stackadaptBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["stnBidAdapter"],{ + +/***/ "./modules/stnBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/stnBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/riseUtils/index.js */ "./libraries/riseUtils/index.js"); + + + + +const BIDDER_CODE = 'stn'; +const BASE_URL = 'https://hb.stngo.com/'; +const MODES = { + PRODUCTION: 'hb-multi', + TEST: 'hb-multi-test' +}; +const spec = { + ...(0,_libraries_riseUtils_index_js__WEBPACK_IMPORTED_MODULE_0__.makeBaseSpec)(BASE_URL, MODES), + code: BIDDER_CODE, + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('no params have been set to STN adapter'); + return false; + } + if (!bidRequest.params.org) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('org is a mandatory param for STN adapter'); + return false; + } + return true; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('stnBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["riseUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/stnBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["stroeerCoreBidAdapter"],{ + +/***/ "./modules/stroeerCoreBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/stroeerCoreBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + + + + + + +const GVL_ID = 136; +const BIDDER_CODE = 'stroeerCore'; +const DEFAULT_HOST = 'hb.adscale.de'; +const DEFAULT_PATH = '/dsh'; +const DEFAULT_PORT = ''; +const FIVE_MINUTES_IN_SECONDS = 300; +const USER_SYNC_IFRAME_URL = 'https://js.adscale.de/pbsync.html'; +const spec = { + code: BIDDER_CODE, + gvlid: GVL_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function () { + const validators = []; + const createValidator = (checkFn, msg) => { + return bidRequest => { + if (checkFn(bidRequest)) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`${BIDDER_CODE}: Bid setup for ${bidRequest.adUnitCode} is invalid: ${msg}`); + return false; + } + }; + }; + const hasValidMediaType = bidReq => hasBanner(bidReq) || hasVideo(bidReq); + validators.push(createValidator(bidReq => hasValidMediaType(bidReq), 'the media type is invalid')); + validators.push(createValidator(bidReq => typeof bidReq.params === 'object', 'the custom params does not exist')); + validators.push(createValidator(bidReq => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bidReq.params.sid), 'the sid field must be a string')); + return function (bidRequest) { + return validators.every(f => f(bidRequest)); + }; + }(), + buildRequests: function () { + let validBidRequests = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + let bidderRequest = arguments.length > 1 ? arguments[1] : undefined; + const anyBid = bidderRequest.bids[0]; + const refererInfo = bidderRequest.refererInfo; + const basePayload = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + ref: refererInfo.ref, + mpa: isMainPageAccessible(), + timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart), + url: refererInfo.page, + schain: anyBid.schain + }; + const userIds = anyBid.userId; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(userIds)) { + basePayload.user = { + euids: userIds + }; + } + const gdprConsent = bidderRequest.gdprConsent; + if (gdprConsent) { + basePayload.gdpr = { + consent: gdprConsent.consentString, + applies: gdprConsent.gdprApplies + }; + } + const ORTB2_KEYS = ['regs.ext.dsa', 'device.ext.cdep', 'site.ext']; + ORTB2_KEYS.forEach(key => { + const value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2, key); + if (value !== undefined) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(basePayload, `ortb2.${key}`, value); + } + }); + const bannerBids = validBidRequests.filter(hasBanner).map(mapToPayloadBannerBid); + const videoBids = validBidRequests.filter(hasVideo).map(mapToPayloadVideoBid); + return { + method: 'POST', + url: buildEndpointUrl(anyBid.params), + data: { + ...basePayload, + bids: [...bannerBids, ...videoBids] + } + }; + }, + interpretResponse: function (serverResponse) { + const bids = []; + if (serverResponse.body && typeof serverResponse.body === 'object') { + serverResponse.body.bids.forEach(bidResponse => { + const mediaType = bidResponse.vastXml != null ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + const bid = { + requestId: bidResponse.bidId, + cpm: bidResponse.cpm || 0, + width: bidResponse.width || 0, + height: bidResponse.height || 0, + ttl: FIVE_MINUTES_IN_SECONDS, + currency: 'EUR', + netRevenue: true, + creativeId: '', + meta: { + advertiserDomains: bidResponse.adomain, + dsa: bidResponse.dsa, + campaignType: bidResponse.campaignType + }, + mediaType + }; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bid.vastXml = bidResponse.vastXml; + } else { + bid.ad = bidResponse.ad; + } + bids.push(bid); + }); + } + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { + if (serverResponses.length > 0 && syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: USER_SYNC_IFRAME_URL + getGdprParams(gdprConsent) + }]; + } + return []; + } +}; +const isMainPageAccessible = () => { + try { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowTop)().location.href; + } catch (ignore) { + return false; + } +}; +const elementInView = elementId => { + const resolveElement = elId => { + const win = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowSelf)(); + return win.document.getElementById(elId); + }; + const visibleInWindow = (el, win) => { + const rect = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__.getBoundingClientRect)(el); + const inView = rect.top + rect.height >= 0 && rect.top <= (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)().innerHeight; + if (win !== win.parent) { + return inView && visibleInWindow(win.frameElement, win.parent); + } + return inView; + }; + try { + return visibleInWindow(resolveElement(elementId), (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWindowSelf)()); + } catch (e) { + // old browser, element not found, cross-origin etc. + } + return undefined; +}; +const buildEndpointUrl = _ref => { + let { + host: hostname = DEFAULT_HOST, + port = DEFAULT_PORT, + securePort, + path: pathname = DEFAULT_PATH + } = _ref; + if (securePort) { + port = securePort; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.buildUrl)({ + protocol: 'https', + hostname, + port, + pathname + }); +}; +const getGdprParams = gdprConsent => { + if (gdprConsent) { + const consentString = encodeURIComponent(gdprConsent.consentString || ''); + const isGdpr = gdprConsent.gdprApplies ? 1 : 0; + return `?gdpr=${isGdpr}&gdpr_consent=${consentString}`; + } else { + return ''; + } +}; +const hasBanner = bidReq => { + return !bidReq.mediaTypes && !bidReq.mediaType || bidReq.mediaTypes && bidReq.mediaTypes.banner || bidReq.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; +}; +const hasVideo = bidReq => { + const mediaTypes = bidReq.mediaTypes; + return mediaTypes && mediaTypes.video && ['instream', 'outstream'].indexOf(mediaTypes.video.context) > -1; +}; +const mapToPayloadBaseBid = bidRequest => ({ + bid: bidRequest.bidId, + sid: bidRequest.params.sid, + viz: elementInView(bidRequest.adUnitCode), + sfp: bidRequest.params.sfp +}); +const mapToPayloadBannerBid = bidRequest => { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner.sizes') || []; + return { + ban: { + siz: sizes, + fp: createFloorPriceObject(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, sizes, bidRequest) + }, + ...mapToPayloadBaseBid(bidRequest) + }; +}; +const mapToPayloadVideoBid = bidRequest => { + const video = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video') || {}; + return { + vid: { + ctx: video.context, + siz: video.playerSize, + mim: video.mimes, + fp: createFloorPriceObject(_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, [video.playerSize], bidRequest) + }, + ...mapToPayloadBaseBid(bidRequest) + }; +}; +const createFloorPriceObject = (mediaType, sizes, bidRequest) => { + if (!bidRequest.getFloor) { + return undefined; + } + const defaultFloor = bidRequest.getFloor({ + currency: 'EUR', + mediaType: mediaType, + size: '*' + }) || {}; + const sizeFloors = sizes.map(size => { + const floor = bidRequest.getFloor({ + currency: 'EUR', + mediaType: mediaType, + size: [size[0], size[1]] + }) || {}; + return { + ...floor, + size + }; + }); + const floorWithCurrency = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)([defaultFloor].concat(sizeFloors), floor => floor.currency); + if (!floorWithCurrency) { + return undefined; + } + const currency = floorWithCurrency.currency; + const defaultFloorPrice = defaultFloor.currency === currency ? defaultFloor.floor : undefined; + return { + def: defaultFloorPrice, + cur: currency, + siz: sizeFloors.filter(sizeFloor => sizeFloor.currency === currency).filter(sizeFloor => sizeFloor.floor !== defaultFloorPrice).map(sizeFloor => ({ + w: sizeFloor.size[0], + h: sizeFloor.size[1], + p: sizeFloor.floor + })) + }; +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('stroeerCoreBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/stroeerCoreBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["stvBidAdapter"],{ + +/***/ "./modules/stvBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/stvBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/dspxUtils/bidderUtils.js */ "./libraries/dspxUtils/bidderUtils.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const BIDDER_CODE = 'stv'; +const ENDPOINT_URL = 'https://ads.smartstream.tv/r/'; +const ENDPOINT_URL_DEV = 'https://ads.smartstream.tv/r/'; +const GVLID = 134; +const VIDEO_ORTB_PARAMS = { + 'minduration': 'min_duration', + 'maxduration': 'max_duration', + 'maxbitrate': 'max_bitrate', + 'api': 'api' +}; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + return !!bid.params.placement; + }, + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const params = bidRequest.params; + const placementId = params.placement; + const rnd = Math.floor(Math.random() * 99999999999); + const referrer = bidderRequest.refererInfo.page; + const bidId = bidRequest.bidId; + const isDev = params.devMode || false; + const pbcode = bidRequest.adUnitCode || false; // div id + + let endpoint = isDev ? ENDPOINT_URL_DEV : ENDPOINT_URL; + let mediaTypesInfo = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getMediaTypesInfo)(bidRequest); + let type = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBannerRequest)(bidRequest) ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + let sizes = mediaTypesInfo[type]; + let payload = { + _f: 'vast2', + alternative: 'prebid_js', + _ps: placementId, + srw: sizes ? sizes[0].width : 0, + srh: sizes ? sizes[0].height : 0, + idt: 100, + rnd: rnd, + ref: referrer, + bid_id: bidId, + pbver: "9.45.0-pre", + schain: '', + uids: '' + }; + if (!(0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isVideoRequest)(bidRequest)) { + payload._f = 'html'; + } + if (bidRequest.schain) { + payload.schain = serializeSChain(bidRequest.schain); + } else { + delete payload.schain; + } + payload.uids = serializeUids(bidRequest); + if (payload.uids == '') { + delete payload.uids; + } + payload.pfilter = { + ...params + }; + delete payload.pfilter.placement; + if (params.bcat !== undefined) { + delete payload.pfilter.bcat; + } + if (params.dvt !== undefined) { + delete payload.pfilter.dvt; + } + if (params.devMode !== undefined) { + delete payload.pfilter.devMode; + } + if (payload.pfilter === undefined || !payload.pfilter.floorprice) { + let bidFloor = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getBidFloor)(bidRequest); + if (bidFloor > 0) { + if (payload.pfilter !== undefined) { + payload.pfilter.floorprice = bidFloor; + } else { + payload.pfilter = { + 'floorprice': bidFloor + }; + } + // payload.bidFloor = bidFloor; + } + } + if (mediaTypesInfo[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO] !== undefined) { + let videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video'); + Object.keys(videoParams).filter(key => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.includes)(Object.keys(VIDEO_ORTB_PARAMS), key) && params[VIDEO_ORTB_PARAMS[key]] === undefined).forEach(key => payload.pfilter[VIDEO_ORTB_PARAMS[key]] = videoParams[key]); + } + if (Object.keys(payload.pfilter).length == 0) { + delete payload.pfilter; + } + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdpr_consent = bidderRequest.gdprConsent.consentString; + payload.gdpr = bidderRequest.gdprConsent.gdprApplies; + } + if (params.bcat !== undefined) { + payload.bcat = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2Imp, 'bcat') || params.bcat; + } + if (params.dvt !== undefined) { + payload.dvt = params.dvt; + } + if (isDev) { + payload.prebidDevMode = 1; + } + if (pbcode) { + payload.pbcode = pbcode; + } + payload.media_types = (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.convertMediaInfoForRequest)(mediaTypesInfo); + return { + method: 'GET', + url: endpoint, + data: stvObjectToQueryString(payload) + }; + }); + }, + interpretResponse: function (serverResponse, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('STV: serverResponse', serverResponse); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logMessage)('STV: bidRequest', bidRequest); + return (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse)(serverResponse, bidRequest, (bidRequest, response) => null); // we don't use any renderer + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + return (0,_libraries_dspxUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.handleSyncUrls)(syncOptions, serverResponses, gdprConsent); + } +}; +function stvObjectToQueryString(obj, prefix) { + let str = []; + let p; + for (p in obj) { + if (obj.hasOwnProperty(p)) { + let k = prefix ? prefix + '[' + p + ']' : p; + let v = obj[p]; + str.push(v !== null && typeof v === 'object' ? stvObjectToQueryString(v, k) : k == 'schain' || k == 'uids' ? k + '=' + v : encodeURIComponent(k) + '=' + encodeURIComponent(v)); + } + } + return str.join('&'); +} +function serializeSChain(schain) { + let ret = ''; + ret += encodeURIComponent(schain.ver); + ret += ','; + ret += encodeURIComponent(schain.complete); + for (let node of schain.nodes) { + ret += '!'; + ret += encodeURIComponent(node.asi); + ret += ','; + ret += encodeURIComponent(node.sid); + ret += ','; + ret += encodeURIComponent(node.hp); + ret += ','; + ret += encodeURIComponent(node.rid ?? ''); + ret += ','; + ret += encodeURIComponent(node.name ?? ''); + ret += ','; + ret += encodeURIComponent(node.domain ?? ''); + if (node.ext) { + ret += ','; + ret += encodeURIComponent(node.ext ?? ''); + } + } + return ret; +} +function serializeUids(bidRequest) { + let uids = []; + let id5 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.id5id.uid'); + if (id5) { + uids.push(encodeURIComponent('id5:' + id5)); + let id5Linktype = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.id5id.ext.linkType'); + if (id5Linktype) { + uids.push(encodeURIComponent('id5_linktype:' + id5Linktype)); + } + } + let netId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.netId'); + if (netId) { + uids.push(encodeURIComponent('netid:' + netId)); + } + let uId2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.uid2.id'); + if (uId2) { + uids.push(encodeURIComponent('uid2:' + uId2)); + } + let sharedId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.sharedid.id'); + if (sharedId) { + uids.push(encodeURIComponent('sharedid:' + sharedId)); + } + let liverampId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.idl_env'); + if (liverampId) { + uids.push(encodeURIComponent('liverampid:' + liverampId)); + } + let criteoId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.criteoId'); + if (criteoId) { + uids.push(encodeURIComponent('criteoid:' + criteoId)); + } + // documentation missing... + let utiqId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.utiq.id'); + if (utiqId) { + uids.push(encodeURIComponent('utiq:' + utiqId)); + } else { + utiqId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.utiq'); + if (utiqId) { + uids.push(encodeURIComponent('utiq:' + utiqId)); + } + } + return uids.join(','); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('stvBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["dspxUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/stvBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["sublimeBidAdapter"],{ + +/***/ "./modules/sublimeBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/sublimeBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports log, state, setState, sendEvent, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +const BIDDER_CODE = 'sublime'; +const BIDDER_GVLID = 114; +const DEFAULT_BID_HOST = 'pbjs.sskzlabs.com'; +const DEFAULT_CURRENCY = 'EUR'; +const DEFAULT_PROTOCOL = 'https'; +const DEFAULT_TTL = 600; +const SUBLIME_ANTENNA = 'antenna.ayads.co'; +const SUBLIME_VERSION = '0.8.0'; + +/** + * Identify the current device type + * @returns {string} + */ +function detectDevice() { + const isMobile = /(?:phone|windows\s+phone|ipod|blackberry|Galaxy Nexus|SM-G892A|(?:android|bbd+|meego|silk|googlebot) .+?mobile|palm|windows\s+ce|opera mini|avantgo|docomo)/i; + const isTablet = /(?:ipad|playbook|Tablet|(?:android|bb\d+|meego|silk)(?! .+? mobile))/i; + return isMobile.test(navigator.userAgent) && 'm' || + // mobile + isTablet.test(navigator.userAgent) && 't' || + // tablet + 'd' // desktop + ; +} +const UUID_V4_RE = /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i; +/** + * Checks whether a notifyId is well-formed + * @param {*} value + * @returns {boolean} + */ +function isValidNotifyId(value) { + return UUID_V4_RE.test(value); +} + +/** + * Debug log message + * @param {String} msg + * @param {Object=} obj + */ +function log(msg, obj) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('SublimeBidAdapter - ' + msg, obj); +} + +// Default state +const state = { + zoneId: '', + transactionId: '', + notifyId: '', + timeout: _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('bidderTimeout') +}; + +/** + * Set a new state + * @param {Object} value + */ +function setState(value) { + Object.assign(state, value); + log('State has been updated :', state); +} + +/** + * Get a notifyId from bid params or from sublime global + * @param {Object} params - The bid params + * @return {string} + */ +function getNotifyId(params) { + const sublime = window.sublime = window.sublime || {}; + let notifyId = params.notifyId || sublime.notifyId; + if (!notifyId) { + notifyId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.generateUUID)(); + log('generating a notifyId', notifyId); + } + if (!sublime.notifyId) { + sublime.notifyId = notifyId; + } + return notifyId; +} + +/** + * Send pixel to our debug endpoint + * @param {string} eventName - Event name that will be send in the e= query string + * @param {string} [sspName] - The optionnal name of the AD provider + */ +function sendEvent(eventName, sspName) { + const ts = Date.now(); + const eventObject = { + t: ts, + tse: ts, + z: state.zoneId, + e: eventName, + src: 'pa', + puid: state.transactionId || state.notifyId, + notid: state.notifyId || '', + pbav: SUBLIME_VERSION, + pubtimeout: state.timeout, + pubpbv: "9.45.0-pre", + device: detectDevice() + }; + if (eventName === 'bidwon') { + eventObject.sspname = sspName || ''; + } + log('Sending pixel for event: ' + eventName, eventObject); + const queryString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)(eventObject); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.triggerPixel)('https://' + SUBLIME_ANTENNA + '/?' + queryString); +} + +/** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return {Boolean} True if this is a valid bid, and false otherwise. + */ +function isBidRequestValid(bid) { + const notifyId = getNotifyId(bid.params); + if (!isValidNotifyId(notifyId)) { + log(`invalid notifyId format, got "${notifyId}"`); + return false; + } + if (notifyId !== window.sublime.notifyId) { + log(`notifyId mismatch: params [${bid.params.notifyId}] / sublime [${window.sublime.notifyId}]`); + return false; + } + return !!Number(bid.params.zoneId); +} + +/** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - An array of bids + * @param {Object} bidderRequest - Info describing the request to the server. + * @return {ServerRequest|ServerRequest[]} - Info describing the request to the server. + */ +function buildRequests(validBidRequests, bidderRequest) { + const commonPayload = { + pbav: SUBLIME_VERSION, + // Current Prebid params + prebidVersion: "9.45.0-pre", + currencyCode: (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_2__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CURRENCY, + timeout: typeof bidderRequest === 'object' && !!bidderRequest ? bidderRequest.timeout : _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('bidderTimeout') + }; + setState({ + timeout: commonPayload.timeout + }); + + // RefererInfo + if (bidderRequest && bidderRequest.refererInfo) { + // TODO: is 'topmostLocation' the right value here? + commonPayload.referer = bidderRequest.refererInfo.topmostLocation; + commonPayload.numIframes = bidderRequest.refererInfo.numIframes; + } + // GDPR handling + if (bidderRequest && bidderRequest.gdprConsent) { + commonPayload.gdprConsent = bidderRequest.gdprConsent.consentString; + commonPayload.gdpr = bidderRequest.gdprConsent.gdprApplies; // we're handling the undefined case server side + } + return validBidRequests.map(bid => { + const bidHost = bid.params.bidHost || DEFAULT_BID_HOST; + const protocol = bid.params.protocol || DEFAULT_PROTOCOL; + const notifyId = getNotifyId(bid.params); + setState({ + transactionId: bid.transactionId, + notifyId, + zoneId: bid.params.zoneId, + debug: bid.params.debug || false + }); + const bidPayload = { + adUnitCode: bid.adUnitCode, + // TODO: fix auctionId/transactionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bid.auctionId, + bidder: bid.bidder, + bidderRequestId: bid.bidderRequestId, + bidRequestsCount: bid.bidRequestsCount, + requestId: bid.bidId, + sizes: bid.sizes.map(size => ({ + w: size[0], + h: size[1] + })), + transactionId: bid.transactionId, + notifyId, + zoneId: bid.params.zoneId + }; + const payload = Object.assign({}, commonPayload, bidPayload); + return { + method: 'POST', + url: protocol + '://' + bidHost + '/bid', + data: JSON.stringify(payload), + options: { + contentType: 'text/plain', + withCredentials: false + } + }; + }); +} + +/** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @param {*} bidRequest An object with bid request informations + * @return {Bid[]} An array of bids which were nested inside the server. + */ +function interpretResponse(serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + if (response) { + if (response.timeout || !response.ad || //gmi.test(response.ad)) { + return bidResponses; + } + + // Setting our returned sizes object to default values + let returnedSizes = { + width: 1800, + height: 1000 + }; + + // Verifying Banner sizes + if (bidRequest && bidRequest.data && bidRequest.data.w === 1 && bidRequest.data.h === 1) { + // If banner sizes are 1x1 we set our default size object to 1x1 + returnedSizes = { + width: 1, + height: 1 + }; + } + const bidResponse = { + requestId: response.requestId || '', + cpm: response.cpm || 0, + width: response.width || returnedSizes.width, + height: response.height || returnedSizes.height, + creativeId: response.creativeId || 1, + dealId: response.dealId || 1, + currency: response.currency || DEFAULT_CURRENCY, + netRevenue: response.netRevenue || true, + ttl: response.ttl || DEFAULT_TTL, + ad: response.ad, + pbav: SUBLIME_VERSION, + sspname: response.sspname || null + }; + + // We don't support advertiserDomains atm + if (response.advertiserDomains) { + // Creating a stub for Prebid.js 5.0 compliance + bidResponse.meta = Object.assign({}, bidResponse.meta, { + advertiserDomains: [] + }); + } + bidResponses.push(bidResponse); + } + return bidResponses; +} + +/** + * Send pixel when bidWon event is triggered + * @param {Object} bid + */ +function onBidWon(bid) { + log('Bid won', bid); + sendEvent('bidwon', bid.sspname); +} + +/** + * Send debug when we timeout + * @param {Array} timeoutData + */ +function onTimeout(timeoutData) { + log('Timeout from adapter', timeoutData); + const timeout = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(timeoutData, '0.timeout'); + if (timeout) { + // Set timeout to the one we got from the bid + setState({ + timeout + }); + } + sendEvent('bidtimeout'); +} +const spec = { + code: BIDDER_CODE, + gvlid: BIDDER_GVLID, + aliases: [], + isBidRequestValid, + buildRequests, + interpretResponse, + onBidWon, + onTimeout, + // Exposed for test purpose + sendEvent, + setState, + state, + detectDevice, + getNotifyId, + isValidNotifyId +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('sublimeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/sublimeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["suimBidAdapter"],{ + +/***/ "./modules/suimBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/suimBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'suim'; +const ENDPOINT = 'https://bid.suimad.com/api/v1/prebids'; +const SYNC_URL = 'https://bid.suimad.com/api/v1/logs/usersync'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.ad_space_id; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const refererInfo = bidderRequest.refererInfo; + const url = refererInfo.topmostLocation; + return validBidRequests.map(request => { + const adSpaceId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('ad_space_id', request.params); + const data = { + bids: [{ + bidId: request.bidId, + ad_space_id: adSpaceId, + sizes: request.sizes, + src_url: url + }] + }; + return { + method: 'POST', + url: ENDPOINT, + data: data, + options: { + contentType: 'text/plain', + withCredentials: false + } + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * @param {ServerResponse} serverResponse + * @param {BidRequest} bidRequest + * @returns {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const res = serverResponse.body; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(res)) { + return []; + } + return [{ + requestId: res.requestId, + cpm: res.cpm, + currency: res.currency, + width: res.width, + height: res.height, + ad: res.ad, + ttl: res.ttl, + creativeId: res.creativeId, + netRevenue: res.netRevenue, + meta: res.meta + }]; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses) { + return [{ + url: SYNC_URL, + type: 'image' + }]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('suimBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/suimBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["symitriAnalyticsAdapter"],{ + +/***/ "./modules/symitriAnalyticsAdapter.js": +/*!********************************************!*\ + !*** ./modules/symitriAnalyticsAdapter.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + +const analyticsType = 'endpoint'; +const url = 'https://ProdSymPrebidEventhub1.servicebus.windows.net/prebid-said-1/messages'; +const { + BID_WON +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +let initOptions; +let symitriAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + url, + analyticsType +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case BID_WON: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('##### symitriAnalytics :: Event Triggered : ' + eventType); + sendEvent(args); + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('##### symitriAnalytics :: Event Triggered : ' + eventType); + break; + } + } +}); +function sendEvent(payload) { + try { + if (initOptions.apiAuthToken) { + const body = JSON.stringify(payload); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('##### symitriAnalytics :: sendEvent ', payload); + let cb = { + success: () => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('##### symitriAnalytics :: Bid Reported Successfully'); + }, + error: (request, error) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('##### symitriAnalytics :: Bid Report Failed' + error); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.ajax)(url, cb, body, { + method: 'POST', + customHeaders: { + 'Content-Type': 'application/atom+xml;type=entry;charset=utf-8', + 'Authorization': initOptions.apiAuthToken + } + }); + } + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('##### symitriAnalytics :: error' + err); + } +} +symitriAnalytics.originEnableAnalytics = symitriAnalytics.enableAnalytics; +symitriAnalytics.enableAnalytics = function (config) { + initOptions = config.options; + symitriAnalytics.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].registerAnalyticsAdapter({ + adapter: symitriAnalytics, + code: 'symitri' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (symitriAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('symitriAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/symitriAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["symitriDapRtdProvider"],{ + +/***/ "./modules/symitriDapRtdProvider.js": +/*!******************************************!*\ + !*** ./modules/symitriDapRtdProvider.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createRtdProvider: () => (/* binding */ createRtdProvider) +/* harmony export */ }); +/* unused harmony exports addRealTimeData, getRealTimeData, generateRealTimeData, symitriDapRtdSubmodule, storage, dapUtils, DAP_TOKEN, DAP_MEMBERSHIP, DAP_ENCRYPTED_MEMBERSHIP, DAP_SS_ID, DAP_DEFAULT_TOKEN_TTL, DAP_MAX_RETRY_TOKENIZE, DAP_CLIENT_ENTROPY */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds the Symitri DAP RTD provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch real-time data from DAP + * @module modules/symitriDapRtdProvider + * @requires module:modules/realTimeData + */ + + + + + + + +/** + * @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule + */ +function createRtdProvider(moduleName, moduleCode, headerPrefix) { + const MODULE_NAME = 'realTimeData'; + const SUBMODULE_NAME = moduleName; + const MODULE_CODE = moduleCode; + const DAP_TOKEN = 'async_dap_token'; + const DAP_MEMBERSHIP = 'async_dap_membership'; + const DAP_ENCRYPTED_MEMBERSHIP = 'encrypted_dap_membership'; + const DAP_SS_ID = 'dap_ss_id'; + const DAP_DEFAULT_TOKEN_TTL = 3600; // in seconds + const DAP_MAX_RETRY_TOKENIZE = 1; + const DAP_CLIENT_ENTROPY = 'dap_client_entropy'; + const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME + }); + let dapRetryTokenize = 0; + + /** + * Lazy merge objects. + * @param {String} target + * @param {String} source + */ + function mergeLazy(target, source) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(target)) { + target = {}; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(source)) { + source = {}; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.mergeDeep)(target, source); + } + + /** + * Add real-time data & merge segments. + * @param {Object} ortb2 destination object to merge RTD into + * @param {Object} rtd + */ + function addRealTimeData(ortb2, rtd) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(addRealTimeData) - ENTER'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtd.ortb2)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('DEBUG(addRealTimeData): merging original: ', ortb2); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('DEBUG(addRealTimeData): merging in: ', rtd.ortb2); + mergeLazy(ortb2, rtd.ortb2); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(addRealTimeData) - EXIT'); + } + + /** + * Real-time data retrieval from Audigent + * @param {Object} bidConfig + * @param {function} onDone + * @param {Object} rtdConfig + * @param {Object} userConsent + */ + function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { + let entropyDict = JSON.parse(storage.getDataFromLocalStorage(DAP_CLIENT_ENTROPY)); + + // Attempt to load entroy script if no entropy object exist and entropy config settings are present. + // Else + if (!entropyDict && rtdConfig && rtdConfig.params && dapUtils.isValidHttpsUrl(rtdConfig.params.dapEntropyUrl)) { + let loadScriptPromise = new Promise((resolve, reject) => { + if (rtdConfig && rtdConfig.params && rtdConfig.params.dapEntropyTimeout && Number.isInteger(rtdConfig.params.dapEntropyTimeout)) { + setTimeout(reject, rtdConfig.params.dapEntropyTimeout, Error('DapEntropy script could not be loaded')); + } + if (entropyDict && entropyDict.expires_at > Math.round(Date.now() / 1000.0)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('Using cached entropy'); + resolve(); + } else { + if (typeof window.dapCalculateEntropy === 'function') { + window.dapCalculateEntropy(resolve, reject); + } else { + if (rtdConfig && rtdConfig.params && dapUtils.isValidHttpsUrl(rtdConfig.params.dapEntropyUrl)) { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_3__.loadExternalScript)(rtdConfig.params.dapEntropyUrl, _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_RTD, MODULE_CODE, () => { + dapUtils.dapGetEntropy(resolve, reject); + }); + } else { + reject(Error('Please check if dapEntropyUrl is specified and is valid under config.params')); + } + } + } + }); + loadScriptPromise.catch(error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Entropy could not be calculated due to: ', error.message); + }).finally(() => { + generateRealTimeData(bidConfig, onDone, rtdConfig, userConsent); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)('No dapEntropyUrl is specified.'); + generateRealTimeData(bidConfig, onDone, rtdConfig, userConsent); + } + } + function generateRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(generateRealTimeData) - ENTER'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(' - apiHostname: ' + rtdConfig.params.apiHostname); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logMessage)(' - apiVersion: ' + rtdConfig.params.apiVersion); + dapRetryTokenize = 0; + var jsonData = null; + if (rtdConfig && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(rtdConfig.params)) { + if (rtdConfig.params.segtax == 710) { + let encMembership = dapUtils.dapGetEncryptedMembershipFromLocalStorage(); + if (encMembership) { + jsonData = dapUtils.dapGetEncryptedRtdObj(encMembership, rtdConfig.params.segtax); + } + } else { + let membership = dapUtils.dapGetMembershipFromLocalStorage(); + if (membership) { + jsonData = dapUtils.dapGetRtdObj(membership, rtdConfig.params.segtax); + } + } + } + if (jsonData) { + if (jsonData.rtd) { + addRealTimeData(bidConfig.ortb2Fragments?.global, jsonData.rtd); + onDone(); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('DEBUG(generateRealTimeData) - 1'); + // Don't return - ensure the data is always fresh. + } + } + // Calling setTimeout to release the main thread so that the bid request could be sent. + setTimeout(dapUtils.callDapAPIs, 0, bidConfig, onDone, rtdConfig, userConsent); + } + + /** + * Module init + * @param {Object} config + * @param {Object} userConsent + * @return {boolean} + */ + function init(config, userConsent) { + if (dapUtils.checkConsent(userConsent) === false) { + return false; + } + return true; + } + function onBidResponse(bidResponse, config, userConsent) { + if (bidResponse.dealId && typeof bidResponse.dealId != typeof undefined) { + let membership = dapUtils.dapGetMembershipFromLocalStorage(); // Get Membership details from Local Storage + let deals = membership.deals; // Get list of Deals the user is mapped to + deals.forEach(deal => { + deal = JSON.parse(deal); + if (bidResponse.dealId == deal.id) { + // Check if the bid response deal Id matches to the deals mapped to the user + let token = dapUtils.dapGetTokenFromLocalStorage(); + let url = config.params.pixelUrl + '?token=' + token + '&ad_id=' + bidResponse.adId + '&bidder=' + bidResponse.bidder + '&bidder_code=' + bidResponse.bidderCode + '&cpm=' + bidResponse.cpm + '&creative_id=' + bidResponse.creativeId + '&deal_id=' + bidResponse.dealId + '&media_type=' + bidResponse.mediaType + '&response_timestamp=' + bidResponse.responseTimestamp; + bidResponse.ad = `${bidResponse.ad}'; +} +function getUrlVars() { + var vars = {}; + var hash; + var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); + for (var i = 0; i < hashes.length; i++) { + hash = hashes[i].split('='); + if (hash[0].match(/^utm_/)) { + vars[hash[0]] = hash[1].substr(0, 150); + } + } + return vars; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('underdogmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["gptUtils","boundingClientRect","percentInView","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/underdogmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["undertoneBidAdapter"],{ + +/***/ "./modules/undertoneBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/undertoneBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + +/** + * Adapter to send bids to Undertone + */ + + + + +const BIDDER_CODE = 'undertone'; +const URL = 'https://hb.undertone.com/hb'; +const FRAME_USER_SYNC = 'https://cdn.undertone.com/js/usersync.html'; +const PIXEL_USER_SYNC_1 = 'https://usr.undertone.com/userPixel/syncOne?id=1&of=2'; +const PIXEL_USER_SYNC_2 = 'https://usr.undertone.com/userPixel/syncOne?id=2&of=2'; +function getBidFloor(bidRequest, mediaType) { + if (typeof bidRequest.getFloor !== 'function') { + return 0; + } + const floor = bidRequest.getFloor({ + currency: 'USD', + mediaType: mediaType, + size: '*' + }); + return floor && floor.currency === 'USD' && floor.floor || 0; +} +function getGdprQueryParams(gdprConsent) { + if (!gdprConsent) { + return null; + } + let gdpr = gdprConsent.gdprApplies ? '1' : '0'; + let gdprstr = gdprConsent.consentString ? gdprConsent.consentString : ''; + return `gdpr=${gdpr}&gdprstr=${gdprstr}`; +} +function getBannerCoords(id) { + let element = document.getElementById(id); + let left = -1; + let top = -1; + if (element) { + left = element.offsetLeft; + top = element.offsetTop; + let parent = element.offsetParent; + if (parent) { + left += parent.offsetLeft; + top += parent.offsetTop; + } + return [left, top]; + } else { + return null; + } +} +const spec = { + code: BIDDER_CODE, + gvlid: 677, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: function (bid) { + if (bid && bid.params && bid.params.publisherId) { + bid.params.publisherId = parseInt(bid.params.publisherId); + return true; + } + }, + buildRequests: function (validBidRequests, bidderRequest) { + const windowDimensions = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions)(); + const vw = Math.max(windowDimensions.document.documentElement.clientWidth, windowDimensions.innerWidth || 0); + const vh = Math.max(windowDimensions.document.documentElement.clientHeight, windowDimensions.innerHeight || 0); + const pageSizeArray = vw == 0 || vh == 0 ? null : [vw, vh]; + const commons = { + 'adapterVersion': "9.45.0-pre", + 'uids': validBidRequests[0].userId, + 'pageSize': pageSizeArray + }; + if (validBidRequests[0].schain) { + commons.schain = validBidRequests[0].schain; + } + const payload = { + 'x-ut-hb-params': [], + 'commons': commons + }; + const referer = bidderRequest.refererInfo.topmostLocation; + const canonicalUrl = bidderRequest.refererInfo.canonicalUrl; + if (referer) { + commons.referrer = referer; + } + if (canonicalUrl) { + commons.canonicalUrl = canonicalUrl; + } + const hostname = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseUrl)(referer).hostname; + let domain = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.extractDomainFromHost)(hostname); + const pageUrl = canonicalUrl || referer; + const pubid = validBidRequests[0].params.publisherId; + let reqUrl = `${URL}?pid=${pubid}&domain=${domain}`; + let gdprParams = getGdprQueryParams(bidderRequest.gdprConsent); + if (gdprParams) { + reqUrl += `&${gdprParams}`; + } + if (bidderRequest.uspConsent) { + reqUrl += `&ccpa=${bidderRequest.uspConsent}`; + } + if (bidderRequest.gppConsent) { + const gppString = bidderRequest.gppConsent.gppString ?? ''; + const ggpSid = bidderRequest.gppConsent.applicableSections ?? ''; + reqUrl += `&gpp=${gppString}&gpp_sid=${ggpSid}`; + } + validBidRequests.map(bidReq => { + const bid = { + bidRequestId: bidReq.bidId, + coordinates: getBannerCoords(bidReq.adUnitCode), + hbadaptor: 'prebid', + url: pageUrl, + domain: domain, + placementId: bidReq.params.placementId != undefined ? bidReq.params.placementId : null, + publisherId: bidReq.params.publisherId, + gpid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'ortb2Imp.ext.gpid', (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'ortb2Imp.ext.data.pbadslot', '')), + sizes: bidReq.sizes, + params: bidReq.params + }; + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video'); + const mediaType = videoMediaType ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + bid.mediaType = mediaType; + bid.bidfloor = getBidFloor(bidReq, mediaType); + if (videoMediaType) { + bid.video = { + playerSize: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.playerSize') || null, + streamType: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.context') || null, + playbackMethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'params.video.playbackMethod') || null, + maxDuration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'params.video.maxDuration') || null, + skippable: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'params.video.skippable') || null, + placement: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.placement') || null, + plcmt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidReq, 'mediaTypes.video.plcmt') || null + }; + } + payload['x-ut-hb-params'].push(bid); + }); + return { + method: 'POST', + url: reqUrl, + withCredentials: true, + data: JSON.stringify(payload) + }; + }, + interpretResponse: function (serverResponse, request) { + const bids = []; + const body = serverResponse.body; + if (body && Array.isArray(body) && body.length > 0) { + body.forEach(bidRes => { + if (bidRes.ad && bidRes.cpm > 0) { + const bid = { + requestId: bidRes.bidRequestId, + cpm: bidRes.cpm, + width: bidRes.width, + height: bidRes.height, + creativeId: bidRes.adId, + currency: bidRes.currency, + netRevenue: bidRes.netRevenue, + ttl: bidRes.ttl || 360, + meta: { + advertiserDomains: bidRes.adomain ? bidRes.adomain : [] + } + }; + if (bidRes.mediaType && bidRes.mediaType === 'video') { + bid.vastXml = bidRes.ad; + bid.mediaType = bidRes.mediaType; + } else { + bid.ad = bidRes.ad; + } + bids.push(bid); + } + }); + } + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, usPrivacy) { + const syncs = []; + let gdprParams = getGdprQueryParams(gdprConsent); + let iframePrivacyParams = ''; + let pixelPrivacyParams = ''; + if (gdprParams) { + iframePrivacyParams += `?${gdprParams}`; + pixelPrivacyParams += `&${gdprParams}`; + } + if (usPrivacy) { + if (iframePrivacyParams != '') { + iframePrivacyParams += '&'; + } else { + iframePrivacyParams += '?'; + } + iframePrivacyParams += `ccpa=${usPrivacy}`; + pixelPrivacyParams += `&ccpa=${usPrivacy}`; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: FRAME_USER_SYNC + iframePrivacyParams + }); + } else if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: PIXEL_USER_SYNC_1 + pixelPrivacyParams + }, { + type: 'image', + url: PIXEL_USER_SYNC_2 + pixelPrivacyParams + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('undertoneBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/undertoneBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["unicornBidAdapter"],{ + +/***/ "./modules/unicornBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/unicornBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports buildRequests, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +const BIDDER_CODE = 'unicorn'; +const UNICORN_ENDPOINT = 'https://ds.uncn.jp/pb/0/bid.json'; +const UNICORN_DEFAULT_CURRENCY = 'JPY'; +const UNICORN_PB_COOKIE_KEY = '__pb_unicorn_aud'; +const UNICORN_PB_VERSION = '1.1'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); + +/** + * Placement ID and Account ID are required. + * @param {BidRequest} bidRequest + * @returns {boolean} + */ +const isBidRequestValid = bidRequest => { + return !!bidRequest.adUnitCode && !!bidRequest.params.accountId; +}; + +/** + * @param {Array} validBidRequests + * @param {any} bidderRequest + * @returns {ServerRequest} + */ +const buildRequests = (validBidRequests, bidderRequest) => { + return { + method: 'POST', + url: UNICORN_ENDPOINT, + data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) + }; +}; + +/** + * Transform BidRequest to OpenRTB-formatted BidRequest Object + * @param {Array} validBidRequests + * @param {any} bidderRequest + * @returns {string} + */ +function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[UNICORN] buildOpenRtbBidRequestPayload.validBidRequests:', validBidRequests); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[UNICORN] buildOpenRtbBidRequestPayload.bidderRequest:', bidderRequest); + const imp = validBidRequests.map(br => { + return { + id: br.bidId, + banner: { + format: makeFormat(br.sizes), + w: br.sizes[0][0], + h: br.sizes[0][1] + }, + tagid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(br, 'params.placementId') || br.adUnitCode, + secure: 1, + bidfloor: parseFloat(0) + }; + }); + const request = { + id: bidderRequest.bidderRequestId, + at: 1, + imp, + cur: [UNICORN_DEFAULT_CURRENCY], + site: { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'params.mediaId') || '', + publisher: { + id: String((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'params.publisherId') || 0) + }, + domain: bidderRequest.refererInfo.domain, + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref + }, + device: { + language: navigator.language, + ua: navigator.userAgent + }, + user: { + id: getUid() + }, + bcat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'params.bcat') || [], + source: { + ext: { + stype: 'prebid_uncn', + bidder: BIDDER_CODE, + prebid_version: UNICORN_PB_VERSION + } + }, + ext: { + accountId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'params.accountId') + } + }; + const eids = initializeEids(validBidRequests[0]); + if (eids.length > 0) { + request.user.eids = eids; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[UNICORN] OpenRTB Formatted Request:', request); + return JSON.stringify(request); +} +const initializeEids = bidRequest => { + let eids = []; + let id5 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userId.id5id.uid'); + if (id5) { + eids.push({ + source: 'id5-sync.com', + uids: [{ + id: id5 + }] + }); + } + return eids; +}; +const interpretResponse = (serverResponse, request) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[UNICORN] interpretResponse.serverResponse:', serverResponse); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[UNICORN] interpretResponse.request:', request); + const res = serverResponse.body; + var bids = []; + if (res) { + res.seatbid.forEach(sb => { + sb.bid.forEach(b => { + var bid = { + requestId: b.impid, + cpm: b.price || 0, + width: b.w, + height: b.h, + ad: b.adm, + ttl: 1000, + creativeId: b.crid, + netRevenue: true, + currency: res.cur + }; + if (b.adomain != undefined || b.adomain != null) { + bid.meta = { + advertiserDomains: b.adomain + }; + } + bids.push(bid); + }); + }); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('[UNICORN] interpretResponse bids:', bids); + return bids; +}; + +/** + * Get or Create Uid for First Party Cookie + */ +const getUid = () => { + const ck = storage.getCookie(UNICORN_PB_COOKIE_KEY); + if (ck) { + return JSON.parse(ck)['uid']; + } else { + const newCk = { + uid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)() + }; + const expireIn = new Date(Date.now() + 24 * 60 * 60 * 10000).toUTCString(); + storage.setCookie(UNICORN_PB_COOKIE_KEY, JSON.stringify(newCk), expireIn); + return newCk.uid; + } +}; + +/** + * Make imp.banner.format + * @param {Array} arr + */ +const makeFormat = arr => arr.map(s => { + return { + w: s[0], + h: s[1] + }; +}); +const spec = { + code: BIDDER_CODE, + aliases: ['uncn'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + isBidRequestValid, + buildRequests, + interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('unicornBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/unicornBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["unifiedIdSystem"],{ + +/***/ "./modules/unifiedIdSystem.js": +/*!************************************!*\ + !*** ./modules/unifiedIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export unifiedIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _libraries_uid1Eids_uid1Eids_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/uid1Eids/uid1Eids.js */ "./libraries/uid1Eids/uid1Eids.js"); + +/** + * This module adds UnifiedId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/unifiedIdSystem + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'unifiedId'; + +/** @type {Submodule} */ +const unifiedIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * required for the gdpr enforcement module + */ + gvlid: 21, + /** + * decode the stored id value for passing to bid requests + * @function + * @param {{TDID:string}} value + * @returns {{tdid:Object}} + */ + decode(value) { + return value && typeof value['TDID'] === 'string' ? { + 'tdid': value['TDID'] + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleConfig} [config] + * @returns {IdResponse|undefined} + */ + getId(config) { + const configParams = config && config.params || {}; + if (!configParams || typeof configParams.partner !== 'string' && typeof configParams.url !== 'string') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('User ID - unifiedId submodule requires either partner or url to be defined'); + return; + } + // use protocol relative urls for http or https + const url = configParams.url || `https://match.adsrvr.org/track/rid?ttd_pid=${configParams.partner}&fmt=json`; + const resp = function (callback) { + const callbacks = { + success: response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(error); + } + } + callback(responseObj); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + callback(); + } + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_1__.ajax)(url, callbacks, undefined, { + method: 'GET', + withCredentials: true + }); + }; + return { + callback: resp + }; + }, + eids: { + ..._libraries_uid1Eids_uid1Eids_js__WEBPACK_IMPORTED_MODULE_2__.UID1_EIDS + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', unifiedIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('unifiedIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["uid1Eids","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/unifiedIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["uniquestAnalyticsAdapter"],{ + +/***/ "./modules/uniquestAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/uniquestAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); + + + + + + + +const ADAPTER_CODE = 'uniquest'; +const BASE_URL = 'https://rcvp.ust-ad.com/'; +const AUCTION_END_URI = 'pbaae'; +const AD_RENDERED_URI = 'pbaars'; +let sid; +function sendEvent(event, uri) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax)(BASE_URL + uri, null, JSON.stringify(event)); +} +function adRenderSucceededHandler(eventType, args, pageUrl) { + const event = { + event_type: eventType, + url: pageUrl, + slot_id: sid, + bid: { + auction_id: args.bid?.auctionId, + creative_id: args.bid?.creativeId, + bidder: args.bid?.bidderCode, + media_type: args.bid?.mediaType, + size: args.bid?.size, + cpm: String(args.bid?.cpm), + currency: args.bid?.currency, + original_cpm: String(args.bid?.originalCpm), + original_currency: args.bid?.originalCurrency, + hb_pb: String(args.bid?.adserverTargeting.hb_pb), + bidding_time: args.bid?.timeToRespond, + ad_unit_code: args.bid?.adUnitCode + } + }; + sendEvent(event, AD_RENDERED_URI); +} +function auctionEndHandler(eventType, args, pageUrl) { + if (args.bidsReceived.length > 0) { + const event = { + event_type: eventType, + url: pageUrl, + slot_id: sid, + bids: args.bidsReceived?.map(br => ({ + auction_id: br?.auctionId, + creative_id: br?.creativeId, + bidder: br?.bidder, + media_type: br?.mediaType, + size: br?.size, + cpm: String(br?.cpm), + currency: br?.currency, + original_cpm: String(br?.originalCpm), + original_currency: br?.originalCurrency, + hb_pb: String(br?.adserverTargeting.hb_pb), + bidding_time: br?.timeToRespond, + ad_unit_code: br?.adUnitCode + })) + }; + sendEvent(event, AUCTION_END_URI); + } +} +let baseAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + analyticsType: 'endpoint' +}); +let uniquestAdapter = Object.assign({}, baseAdapter, { + enableAnalytics() { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (config.options && config.options.sid) { + sid = config.options.sid; + baseAdapter.enableAnalytics.call(this, config); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Config not found. Analytics is disabled due.'); + } + }, + disableAnalytics() { + sid = undefined; + baseAdapter.disableAnalytics.apply(this, arguments); + }, + track(_ref) { + let { + eventType, + args + } = _ref; + const refererInfo = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)(); + let pageUrl = refererInfo.page; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AD_RENDER_SUCCEEDED: + adRenderSucceededHandler(eventType, args, pageUrl); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END: + auctionEndHandler(eventType, args, pageUrl); + break; + } + } +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: uniquestAdapter, + code: ADAPTER_CODE +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (uniquestAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('uniquestAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/uniquestAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["uniquestBidAdapter"],{ + +/***/ "./modules/uniquestBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/uniquestBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory').BidRequest} BidRequest + * @typedef {import('../src/auction').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'uniquest'; +const ENDPOINT = 'https://adpb.ust-ad.com/hb/prebid'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!(bid.params && bid.params.sid); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests} validBidRequests an array of bids + * @param {BidderRequest} bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const bidRequests = []; + for (let i = 0; i < validBidRequests.length; i++) { + let queryString = ''; + const request = validBidRequests[i]; + const bid = request.bidId; + const sid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('sid', request.params); + const widths = request.sizes.map(size => size[0]).join(','); + const heights = request.sizes.map(size => size[1]).join(','); + const timeout = bidderRequest.timeout; + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'bid', bid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'sid', sid); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'widths', widths); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'heights', heights); + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_2__.tryAppendQueryString)(queryString, 'timeout', timeout); + bidRequests.push({ + method: 'GET', + url: ENDPOINT, + data: queryString + }); + } + return bidRequests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, requests) { + const response = serverResponse.body; + if (!response || Object.keys(response).length === 0) { + return []; + } + const bid = { + requestId: response.request_id, + cpm: response.cpm, + currency: response.currency, + width: response.width, + height: response.height, + ad: response.ad, + creativeId: response.bid_id, + netRevenue: response.net_revenue, + mediaType: response.media_type, + ttl: response.ttl, + meta: { + advertiserDomains: response.meta && response.meta.advertiser_domains ? response.meta.advertiser_domains : [] + } + }; + return [bid]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('uniquestBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/uniquestBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["unrulyBidAdapter"],{ + +/***/ "./modules/unrulyBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/unrulyBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export adapter */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +function configureUniversalTag(exchangeRenderer, requestId) { + if (!exchangeRenderer.config) throw new Error('UnrulyBidAdapter: Missing renderer config.'); + if (!exchangeRenderer.config.siteId) throw new Error('UnrulyBidAdapter: Missing renderer siteId.'); + parent.window.unruly = parent.window.unruly || {}; + parent.window.unruly['native'] = parent.window.unruly['native'] || {}; + parent.window.unruly['native'].siteId = parent.window.unruly['native'].siteId || exchangeRenderer.config.siteId; + parent.window.unruly['native'].adSlotId = requestId; + parent.window.unruly['native'].supplyMode = 'prebid'; +} +function configureRendererQueue() { + parent.window.unruly['native'].prebid = parent.window.unruly['native'].prebid || {}; + parent.window.unruly['native'].prebid.uq = parent.window.unruly['native'].prebid.uq || []; +} +function notifyRenderer(bidResponseBid) { + parent.window.unruly['native'].prebid.uq.push(['render', bidResponseBid]); +} +const addBidFloorInfo = validBid => { + Object.keys(validBid.mediaTypes).forEach(key => { + let floor; + if (typeof validBid.getFloor === 'function') { + floor = validBid.getFloor({ + currency: 'USD', + mediaType: key, + size: '*' + })?.floor || 0; + } else { + floor = validBid.params.floor || 0; + } + validBid.mediaTypes[key].floor = floor; + }); +}; +const RemoveDuplicateSizes = validBid => { + let bannerMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(validBid, 'mediaTypes.banner'); + if (bannerMediaType) { + let seenSizes = {}; + let newSizesArray = []; + bannerMediaType.sizes.forEach(size => { + if (!seenSizes[size.toString()]) { + seenSizes[size.toString()] = true; + newSizesArray.push(size); + } + }); + bannerMediaType.sizes = newSizesArray; + } +}; +const ConfigureProtectedAudience = (validBid, protectedAudienceEnabled) => { + if (!protectedAudienceEnabled && validBid.ortb2Imp && validBid.ortb2Imp.ext) { + delete validBid.ortb2Imp.ext.ae; + } +}; +const getRequests = (conf, validBidRequests, bidderRequest) => { + const { + bids, + bidderRequestId, + bidderCode, + ...bidderRequestData + } = bidderRequest; + const invalidBidsCount = bidderRequest.bids.length - validBidRequests.length; + let requestBySiteId = {}; + validBidRequests.forEach(validBid => { + const currSiteId = validBid.params.siteId; + addBidFloorInfo(validBid); + RemoveDuplicateSizes(validBid); + ConfigureProtectedAudience(validBid, conf.protectedAudienceEnabled); + requestBySiteId[currSiteId] = requestBySiteId[currSiteId] || []; + requestBySiteId[currSiteId].push(validBid); + }); + let request = []; + Object.keys(requestBySiteId).forEach(key => { + let data = { + bidderRequest: Object.assign({}, { + bids: requestBySiteId[key], + invalidBidsCount, + prebidVersion: "9.45.0-pre", + ...bidderRequestData + }) + }; + request.push(Object.assign({}, { + data, + ...conf + })); + }); + return request; +}; +const handleBidResponseByMediaType = bids => { + let bidResponses = []; + bids.forEach(bid => { + let parsedBidResponse; + let bidMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'meta.mediaType'); + if (bidMediaType && bidMediaType.toLowerCase() === 'banner') { + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; + parsedBidResponse = handleBannerBid(bid); + } else if (bidMediaType && bidMediaType.toLowerCase() === 'video') { + let context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'meta.videoContext'); + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO; + if (context === 'instream') { + parsedBidResponse = handleInStreamBid(bid); + } else if (context === 'outstream') { + parsedBidResponse = handleOutStreamBid(bid); + } + } + if (parsedBidResponse) { + bidResponses.push(parsedBidResponse); + } + }); + return bidResponses; +}; +const handleBannerBid = bid => { + if (!bid.ad) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(new Error('UnrulyBidAdapter: Missing ad config.')); + return; + } + return bid; +}; +const handleInStreamBid = bid => { + if (!(bid.vastUrl || bid.vastXml)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(new Error('UnrulyBidAdapter: Missing vastUrl or vastXml config.')); + return; + } + return bid; +}; +const handleOutStreamBid = bid => { + const hasConfig = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'ext.renderer.config'); + const hasSiteId = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'ext.renderer.config.siteId'); + if (!hasConfig) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(new Error('UnrulyBidAdapter: Missing renderer config.')); + return; + } + if (!hasSiteId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(new Error('UnrulyBidAdapter: Missing renderer siteId.')); + return; + } + const exchangeRenderer = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'ext.renderer'); + configureUniversalTag(exchangeRenderer, bid.requestId); + configureRendererQueue(); + const rendererInstance = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install(Object.assign({}, exchangeRenderer)); + const rendererConfig = Object.assign({}, bid, { + renderer: rendererInstance, + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'ext.adUnitCode') + }); + rendererInstance.setRender(() => { + notifyRenderer(rendererConfig); + }); + bid.renderer = bid.renderer || rendererInstance; + return bid; +}; +const isMediaTypesValid = bid => { + const mediaTypeVideoData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video'); + const mediaTypeBannerData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.banner'); + let isValid = !!(mediaTypeVideoData || mediaTypeBannerData); + if (isValid && mediaTypeVideoData) { + isValid = isVideoMediaTypeValid(mediaTypeVideoData); + } + if (isValid && mediaTypeBannerData) { + isValid = isBannerMediaTypeValid(mediaTypeBannerData); + } + return isValid; +}; +const isVideoMediaTypeValid = mediaTypeVideoData => { + if (!mediaTypeVideoData.context) { + return false; + } + const supportedContexts = ['outstream', 'instream']; + return supportedContexts.indexOf(mediaTypeVideoData.context) !== -1; +}; +const isBannerMediaTypeValid = mediaTypeBannerData => { + return mediaTypeBannerData.sizes; +}; +const adapter = { + code: 'unruly', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + gvlid: 36, + isBidRequestValid: function (bid) { + let siteId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'params.siteId'); + let isBidValid = siteId && isMediaTypesValid(bid); + return !!isBidValid; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let endPoint = 'https://targeting.unrulymedia.com/unruly_prebid'; + if (validBidRequests[0]) { + endPoint = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(validBidRequests[0], 'params.endpoint') || endPoint; + } + return getRequests({ + 'url': endPoint, + 'method': 'POST', + 'options': { + 'contentType': 'application/json' + }, + 'protectedAudienceEnabled': bidderRequest.paapi?.enabled + }, validBidRequests, bidderRequest); + }, + interpretResponse: function (serverResponse) { + if (!(serverResponse && serverResponse.body && (serverResponse.body.auctionConfigs || serverResponse.body.bids))) { + return []; + } + const serverResponseBody = serverResponse.body; + let bids = []; + let fledgeAuctionConfigs = null; + if (serverResponseBody.bids.length) { + bids = handleBidResponseByMediaType(serverResponseBody.bids); + } + if (serverResponseBody.auctionConfigs) { + let auctionConfigs = serverResponseBody.auctionConfigs; + let bidIdList = Object.keys(auctionConfigs); + if (bidIdList.length) { + bidIdList.forEach(bidId => { + fledgeAuctionConfigs = [{ + 'bidId': bidId, + 'config': auctionConfigs[bidId] + }]; + }); + } + } + if (!fledgeAuctionConfigs) { + return bids; + } + return { + bids, + paapi: fledgeAuctionConfigs + }; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(adapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('unrulyBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/unrulyBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["userId"],{ + +/***/ "./modules/userId/eids.js": +/*!********************************!*\ + !*** ./modules/userId/eids.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ EID_CONFIG: () => (/* binding */ EID_CONFIG), +/* harmony export */ getEids: () => (/* binding */ getEids) +/* harmony export */ }); +/* unused harmony export createEidsArray */ +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + +/** + * @typedef {import('./index.js').SubmodulePriorityMap} SubmodulePriorityMap + */ + +const EID_CONFIG = new Map(); + +// this function will create an eid object for the given UserId sub-module +function createEidObject(userIdData, subModuleKey, eidConf) { + if (eidConf && userIdData) { + let eid = {}; + eid.source = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(eidConf['getSource']) ? eidConf['getSource'](userIdData) : eidConf['source']; + const value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(eidConf['getValue']) ? eidConf['getValue'](userIdData) : userIdData; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(value)) { + const uid = { + id: value, + atype: eidConf['atype'] + }; + // getUidExt + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(eidConf['getUidExt'])) { + const uidExt = eidConf['getUidExt'](userIdData); + if (uidExt) { + uid.ext = uidExt; + } + } + eid.uids = [uid]; + // getEidExt + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(eidConf['getEidExt'])) { + const eidExt = eidConf['getEidExt'](userIdData); + if (eidExt) { + eid.ext = eidExt; + } + } + return eid; + } + } + return null; +} +function createEidsArray(bidRequestUserId) { + let eidConfigs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EID_CONFIG; + const allEids = {}; + function collect(eid) { + const key = JSON.stringify([eid.source?.toLowerCase(), ...Object.keys(eid).filter(k => !['uids', 'source'].includes(k)).sort().map(k => eid[k])]); + if (allEids.hasOwnProperty(key)) { + allEids[key].uids.push(...eid.uids); + } else { + allEids[key] = eid; + } + } + Object.entries(bidRequestUserId).forEach(_ref => { + let [name, values] = _ref; + values = Array.isArray(values) ? values : [values]; + const eidConf = eidConfigs.get(name); + let eids; + if (name === 'pubProvidedId') { + eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(values); + } else if (typeof eidConf === 'function') { + try { + eids = eidConf(values); + if (!Array.isArray(eids)) { + eids = [eids]; + } + eids.forEach(eid => eid.uids = eid.uids.filter(_ref2 => { + let { + id + } = _ref2; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(id); + })); + eids = eids.filter(_ref3 => { + let { + uids + } = _ref3; + return uids?.length > 0; + }); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`Could not generate EID for "${name}"`, e); + } + } else { + eids = values.map(value => createEidObject(value, name, eidConf)); + } + if (Array.isArray(eids)) { + eids.filter(eid => eid != null).forEach(collect); + } + }); + return Object.values(allEids); +} + +/** + * @param {SubmodulePriorityMap} priorityMap + */ +function getEids(priorityMap) { + const eidConfigs = new Map(); + const idValues = {}; + Object.entries(priorityMap).forEach(_ref4 => { + let [key, getActiveModule] = _ref4; + const submodule = getActiveModule(); + if (submodule) { + idValues[key] = submodule.idObj[key]; + let eidConf = submodule.submodule.eids?.[key]; + if (typeof eidConf === 'function') { + // if eid config is given as a function, append the active module configuration to its args + eidConf = (orig => function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return orig(...args, submodule.config); + })(eidConf); + } + eidConfigs.set(key, eidConf); + } + }); + return createEidsArray(idValues, eidConfigs); +} + +/***/ }), + +/***/ "./modules/userId/index.js": +/*!*********************************!*\ + !*** ./modules/userId/index.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PBJS_USER_ID_OPTOUT_NAME, coreStorage, dep, syncDelay, auctionDelay, setSubmoduleRegistry, setStoredValue, deleteStoredValue, enrichEids, addIdData, startAuctionHook, addUserIdsHook, getConsentHash, getValidSubmoduleConfigs, requestDataDeletion, attachIdSystem, init, resetUserIds */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _eids_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./eids.js */ "./modules/userId/eids.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adserver_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../src/adserver.js */ "./src/adserver.js"); +/* harmony import */ var _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../src/utils/promise.js */ "./src/utils/promise.js"); +/* harmony import */ var _src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../src/utils/perfMetrics.js */ "./src/utils/perfMetrics.js"); +/* harmony import */ var _src_fpd_rootDomain_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../src/fpd/rootDomain.js */ "./src/fpd/rootDomain.js"); +/* harmony import */ var _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../src/consentHandler.js */ "./src/consentHandler.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/activities/rules.js */ "./src/activities/rules.js"); +/* harmony import */ var _src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/activities/activities.js */ "./src/activities/activities.js"); +/* harmony import */ var _src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../src/activities/activityParams.js */ "./src/activities/activityParams.js"); +/* harmony import */ var _src_userSync_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../src/userSync.js */ "./src/userSync.js"); +/* harmony import */ var _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/prebid.js */ "./src/prebid.js"); + +/** + * This module adds User ID support to prebid.js + * @module modules/userId + */ + +/** + * @typedef Submodule + * @property {string} name - used to link submodule with config + * @property {decode} decode + * @property {getId} getId + * @property {Object} eids + * @property {number} [gvlid] - vendor ID + * @property {extendId} [extendId] + * @property {function} [domainOverride] - use a predefined domain override for cookies or provide your own + * @property {function(): string} [findRootDomain] - returns the root domain + */ + +/** + * Performs action to obtain id and return a value in the callback's response argument. + * If IdResponse#id is defined, then it will be written to the current active storage. + * If IdResponse#callback is defined, then it'll called at the end of auction. + * It's permissible to return neither, one, or both fields. + * @callback getId + * @param {SubmoduleConfig} config + * @param {ConsentData|undefined} [consentData] + * @param {Object|undefined} [cacheIdObj] + * @returns {IdResponse|undefined} A response object that contains id and/or callback. + */ + +/** + * Similar to `getId`, this optional method returns response to for id that exists already. + * If IdResponse#id is defined, then it will be written to the current active storage even if it exists already. + * If IdResponse#callback is defined, then it'll called at the end of auction. + * It's permissible to return neither, one, or both fields. + * @callback extendId + * @param {SubmoduleConfig} config + * @param {ConsentData|undefined} consentData + * @param {Object} storedId - existing id, if any + * @returns {IdResponse|function} A response object that contains id and/or callback. + */ + +/** + * Decode a stored value for passing to bid requests + * @callback decode + * @param {Object|string} value + * @param {SubmoduleConfig|undefined} [config] + * @returns {Object|undefined} + */ + +/** + * @typedef {Object} SubmoduleConfig + * @property {string} name - the User ID submodule name (used to link submodule with config) + * @property {(SubmoduleStorage|undefined)} storage - browser storage config + * @property {(SubmoduleParams|undefined)} params - params config for use by the submodule.getId function + * @property {(Object|undefined)} value - if not empty, this value is added to bid requests for access in adapters + * @property {string[]} [enabledStorageTypes] + */ + +/** + * @typedef {Object} SubmoduleStorage + * @property {string} type - browser storage type (html5 or cookie) + * @property {string} name - key name to use when saving/reading to local storage or cookies + * @property {number} expires - time to live for browser storage in days + * @property {(number|undefined)} refreshInSeconds - if not empty, this value defines the maximum time span in seconds before refreshing user ID stored in browser + */ + +/** + * @typedef {Object} LiveIntentCollectConfig + * @property {(string|undefined)} fpiStorageStrategy - defines whether the first party identifiers that LiveConnect creates and updates are stored in a cookie jar, local storage, or not created at all + * @property {(number|undefined)} fpiExpirationDays - the expiration time of an identifier created and updated by LiveConnect + * @property {(string|undefined)} collectorUrl - defines where the LiveIntentId signal pixels are pointing to + * @property {(string|undefined)} appId - the unique identifier of the application in question + */ + +/** + * @typedef {Object} SubmoduleParams + * @property {(string|undefined)} partner - partner url param value + * @property {(string|undefined)} url - webservice request url used to load Id data + * @property {(string|undefined)} pixelUrl - publisher pixel to extend/modify cookies + * @property {(boolean|undefined)} create - create id if missing. default is true. + * @property {(boolean|undefined)} extend - extend expiration time on each access. default is false. + * @property {(string|undefined)} pid - placement id url param value + * @property {(string|undefined)} publisherId - the unique identifier of the publisher in question + * @property {(string|undefined)} ajaxTimeout - the number of milliseconds a resolution request can take before automatically being terminated + * @property {(Array|undefined)} identifiersToResolve - the identifiers from either ls|cookie to be attached to the getId query + * @property {(LiveIntentCollectConfig|undefined)} liCollectConfig - the config for LiveIntent's collect requests + * @property {(string|undefined)} pd - publisher provided data for reconciling ID5 IDs + * @property {(string|undefined)} emailHash - if provided, the hashed email address of a user + * @property {(string|undefined)} notUse3P - use to retrieve envelope from 3p endpoint + */ + +/** + * @typedef {Object} SubmoduleContainer + * @property {Submodule} submodule + * @property {SubmoduleConfig} config + * @property {(Object|undefined)} idObj - cache decoded id value (this is copied to every adUnit bid) + * @property {(function|undefined)} callback - holds reference to submodule.getId() result if it returned a function. Will be set to undefined after callback executes + * @property {StorageManager} storageMgr + * @property {string[]} [enabledStorageTypes] + */ + +/** + * @typedef {Object} ConsentData + * @property {Object} gdpr + * @property {Object} gpp + * @property {Object} usp + * @property {Object} coppa + */ + +/** + * @typedef {Object} IdResponse + * @property {Object} [id] - id data + * @property {function} [callback] - function that will return an id + */ + +/** + * @typedef {{[idKey: string]: () => SubmoduleContainer[]}} SubmodulePriorityMap + */ + + + + + + + + + + + + + + + + + + + + + + +const MODULE_NAME = 'User ID'; +const COOKIE = _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.STORAGE_TYPE_COOKIES; +const LOCAL_STORAGE = _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.STORAGE_TYPE_LOCALSTORAGE; +const PBJS_USER_ID_OPTOUT_NAME = '_pbjs_id_optout'; +const coreStorage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getCoreStorageManager)('userId'); +const dep = { + isAllowed: _src_activities_rules_js__WEBPACK_IMPORTED_MODULE_2__.isActivityAllowed +}; + +/** @type {SubmoduleContainer[]} */ +let submodules = []; + +/** @type {PriorityMaps} */ +let initializedSubmodules; + +/** @type {SubmoduleConfig[]} */ +let configRegistry = []; + +/** @type {Object} */ +let idPriority = {}; + +/** @type {Submodule[]} */ +let submoduleRegistry = []; + +/** @type {(number|undefined)} */ +let timeoutID; + +/** @type {(number|undefined)} */ +let syncDelay; + +/** @type {(number|undefined)} */ +let auctionDelay; + +/** @type {(string|undefined)} */ +let ppidSource; +let configListener; +const uidMetrics = (() => { + let metrics; + return () => { + if (metrics == null) { + metrics = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__.newMetrics)(); + } + return metrics; + }; +})(); +function submoduleMetrics(moduleName) { + return uidMetrics().fork().renameWith(n => [`userId.mod.${n}`, `userId.mods.${moduleName}.${n}`]); +} + +/** @param {Submodule[]} submodules */ +function setSubmoduleRegistry(submodules) { + submoduleRegistry = submodules; + updateEIDConfig(submodules); +} +function cookieSetter(submodule, storageMgr) { + storageMgr = storageMgr || submodule.storageMgr; + const domainOverride = typeof submodule.submodule.domainOverride === 'function' ? submodule.submodule.domainOverride() : null; + const name = submodule.config.storage.name; + return function setCookie(suffix, value, expiration) { + storageMgr.setCookie(name + (suffix || ''), value, expiration, 'Lax', domainOverride); + }; +} +function setValueInCookie(submodule, valueStr, expiresStr) { + const storage = submodule.config.storage; + const setCookie = cookieSetter(submodule); + setCookie(null, valueStr, expiresStr); + setCookie('_cst', getConsentHash(), expiresStr); + if (typeof storage.refreshInSeconds === 'number') { + setCookie('_last', new Date().toUTCString(), expiresStr); + } +} +function setValueInLocalStorage(submodule, valueStr, expiresStr) { + const storage = submodule.config.storage; + const mgr = submodule.storageMgr; + mgr.setDataInLocalStorage(`${storage.name}_exp`, expiresStr); + mgr.setDataInLocalStorage(`${storage.name}_cst`, getConsentHash()); + mgr.setDataInLocalStorage(storage.name, encodeURIComponent(valueStr)); + if (typeof storage.refreshInSeconds === 'number') { + mgr.setDataInLocalStorage(`${storage.name}_last`, new Date().toUTCString()); + } +} + +/** + * @param {SubmoduleContainer} submodule + * @param {(Object|string)} value + */ +function setStoredValue(submodule, value) { + /** + * @type {SubmoduleStorage} + */ + const storage = submodule.config.storage; + try { + const expiresStr = new Date(Date.now() + storage.expires * (60 * 60 * 24 * 1000)).toUTCString(); + const valueStr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(value) ? JSON.stringify(value) : value; + submodule.enabledStorageTypes.forEach(storageType => { + switch (storageType) { + case COOKIE: + setValueInCookie(submodule, valueStr, expiresStr); + break; + case LOCAL_STORAGE: + setValueInLocalStorage(submodule, valueStr, expiresStr); + break; + } + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(error); + } +} +function deleteValueFromCookie(submodule) { + const setCookie = cookieSetter(submodule, coreStorage); + const expiry = new Date(Date.now() - 1000 * 60 * 60 * 24).toUTCString(); + ['', '_last', '_cst'].forEach(suffix => { + try { + setCookie(suffix, '', expiry); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(e); + } + }); +} +function deleteValueFromLocalStorage(submodule) { + ['', '_last', '_exp', '_cst'].forEach(suffix => { + try { + coreStorage.removeDataFromLocalStorage(submodule.config.storage.name + suffix); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(e); + } + }); +} +function deleteStoredValue(submodule) { + populateEnabledStorageTypes(submodule); + submodule.enabledStorageTypes.forEach(storageType => { + switch (storageType) { + case COOKIE: + deleteValueFromCookie(submodule); + break; + case LOCAL_STORAGE: + deleteValueFromLocalStorage(submodule); + break; + } + }); +} +function getValueFromCookie(submodule, storedKey) { + return submodule.storageMgr.getCookie(storedKey); +} +function getValueFromLocalStorage(submodule, storedKey) { + const mgr = submodule.storageMgr; + const storage = submodule.config.storage; + const storedValueExp = mgr.getDataFromLocalStorage(`${storage.name}_exp`); + + // empty string means no expiration set + if (storedValueExp === '') { + return mgr.getDataFromLocalStorage(storedKey); + } else if (storedValueExp && new Date(storedValueExp).getTime() - Date.now() > 0) { + return decodeURIComponent(mgr.getDataFromLocalStorage(storedKey)); + } +} + +/** + * @param {SubmoduleContainer} submodule + * @param {String|undefined} key optional key of the value + * @returns {string} + */ +function getStoredValue(submodule) { + let key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + const storage = submodule.config.storage; + const storedKey = key ? `${storage.name}_${key}` : storage.name; + let storedValue; + try { + submodule.enabledStorageTypes.find(storageType => { + switch (storageType) { + case COOKIE: + storedValue = getValueFromCookie(submodule, storedKey); + break; + case LOCAL_STORAGE: + storedValue = getValueFromLocalStorage(submodule, storedKey); + break; + } + return !!storedValue; + }); + + // support storing a string or a stringified object + if (typeof storedValue === 'string' && storedValue.trim().charAt(0) === '{') { + storedValue = JSON.parse(storedValue); + } + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(e); + } + return storedValue; +} + +/** + * @param {SubmoduleContainer[]} submodules + * @param {function} cb - callback for after processing is done. + * @param {PriorityMaps} priorityMaps + */ +function processSubmoduleCallbacks(submodules, cb, priorityMaps) { + cb = uidMetrics().fork().startTiming('userId.callbacks.total').stopBefore(cb); + const done = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.delayExecution)(() => { + clearTimeout(timeoutID); + cb(); + }, submodules.length); + submodules.forEach(function (submodule) { + const moduleDone = submoduleMetrics(submodule.submodule.name).startTiming('callback').stopBefore(done); + function callbackCompleted(idObj) { + // if valid, id data should be saved to cookie/html storage + if (idObj) { + if (submodule.config.storage) { + setStoredValue(submodule, idObj); + } + // cache decoded value (this is copied to every adUnit bid) + submodule.idObj = submodule.submodule.decode(idObj, submodule.config); + priorityMaps.refresh(); + updatePPID(priorityMaps); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME}: ${submodule.submodule.name} - request id responded with an empty value`); + } + moduleDone(); + } + try { + submodule.callback(callbackCompleted, getStoredValue.bind(null, submodule)); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Error in userID module '${submodule.submodule.name}':`, e); + moduleDone(); + } + // clear callback, this prop is used to test if all submodule callbacks are complete below + submodule.callback = undefined; + }); +} + +/** + * @param {SubmodulePriorityMap} priorityMap + * @returns {{}} + */ +function getIds(priorityMap) { + return Object.fromEntries(Object.entries(priorityMap).map(_ref => { + let [key, getActiveModule] = _ref; + return [key, getActiveModule()?.idObj?.[key]]; + }).filter(_ref2 => { + let [_, value] = _ref2; + return value != null; + })); +} +function getPrimaryIds(submodule) { + if (submodule.primaryIds) return submodule.primaryIds; + const ids = Object.keys(submodule.eids ?? {}); + if (ids.length > 1) { + throw new Error(`ID submodule ${submodule.name} can provide multiple IDs, but does not specify 'primaryIds'`); + } + return ids; +} + +/** + * Given a collection of items, where each item maps to any number of IDs (getKeys) and an ID module (getIdMod), + * return a map from ID key to all items that map to that ID key, in order of priority (highest priority first). + * + * @template T + * @param {T[]} items + * @param {(item: T) => string[]} getKeys + * @param {(item: T) => Submodule} getIdMod + * @returns {{[key: string]: T[]}} + */ +function orderByPriority(items, getKeys, getIdMod) { + const tally = {}; + items.forEach(item => { + const module = getIdMod(item); + const primaryIds = getPrimaryIds(module); + getKeys(item).forEach(key => { + const keyItems = tally[key] = tally[key] ?? []; + const keyPriority = idPriority[key]?.indexOf(module.name) ?? (primaryIds.includes(key) ? 0 : -1); + const pos = keyItems.findIndex(_ref3 => { + let [priority] = _ref3; + return priority < keyPriority; + }); + keyItems.splice(pos === -1 ? keyItems.length : pos, 0, [keyPriority, item]); + }); + }); + return Object.fromEntries(Object.entries(tally).map(_ref4 => { + let [key, items] = _ref4; + return [key, items.map(_ref5 => { + let [_, item] = _ref5; + return item; + })]; + })); +} + +/** + * @typedef {Object} PriorityMaps + * @property {SubmoduleContainer[]} submodules all active submodules + * @property {SubmodulePriorityMap} global priority map for global (not bidder-specific) submodules + * @property {SubmodulePriorityMap} combined priority map for ALL submodules, disregarding bidder filters + * @property {{[bidder: string]: SubmodulePriorityMap}} bidder priority maps for each bidder's specific submodules + * @property {(submodules: SubmoduleContainer[]) => void} refresh refresh priority maps, optionally adding or updating some submodules. + * Should be called every time a submodule's ID is updated. + */ + +/** + * @returns PriorityMaps + */ +function mkPriorityMaps() { + const map = { + submodules: [], + global: {}, + bidder: {}, + combined: {}, + /** + * @param {SubmoduleContainer[]} addtlModules + */ + refresh() { + let addtlModules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + const refreshing = new Set(addtlModules.map(mod => mod.submodule)); + map.submodules = map.submodules.filter(mod => !refreshing.has(mod.submodule)).concat(addtlModules); + update(); + } + }; + function update() { + const modulesById = orderByPriority(map.submodules, submod => Object.keys(submod.idObj ?? {}), submod => submod.submodule); + const global = {}; + const bidder = {}; + function activeModuleGetter(key, useGlobals, modules) { + return function () { + for (const { + allowed, + bidders, + module + } of modules) { + if (!dep.isAllowed(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__.ACTIVITY_ENRICH_EIDS, (0,_src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__.activityParams)(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__.MODULE_TYPE_UID, module?.config?.name, { + init: false + }))) { + continue; + } + const value = module.idObj?.[key]; + if (value != null) { + if (allowed) { + return module; + } else if (useGlobals) { + // value != null, allowed = false, useGlobals = true: + // this module has the preferred ID but it cannot be used (because it's restricted to only some bidders + // and we are calculating global IDs). + // since we don't (yet) have a way to express "global except for these bidders" in FPD, + // do not keep looking for alternative IDs in other (lower priority) modules; the ID will be provided only + // to the bidders this module is configured for. + const listModules = modules => modules.map(mod => mod.module.submodule.name).join(', '); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`userID modules ${listModules(modules)} provide the same ID ('${key}'); ${module.submodule.name} is the preferred source, but it's configured only for some bidders, unlike ${listModules(modules.filter(mod => mod.bidders == null))}. Other bidders will not see the "${key}" ID.`); + return null; + } else if (bidders == null) { + // value != null, allowed = false, useGlobals = false, bidders == null: + // this module has the preferred ID but it should not be used because it's not bidder-restricted and + // we are calculating bidder-specific ids. Do not keep looking in other lower priority modules, as the ID + // will be set globally. + return null; + } + } + } + return null; + }; + } + Object.entries(modulesById).forEach(_ref6 => { + let [key, modules] = _ref6; + let allNonGlobal = true; + const bidderFilters = new Set(); + modules = modules.map(module => { + let bidders = null; + if (Array.isArray(module.config.bidders) && module.config.bidders.length > 0) { + bidders = module.config.bidders; + bidders.forEach(bidder => bidderFilters.add(bidder)); + } else { + allNonGlobal = false; + } + return { + module, + bidders + }; + }); + if (!allNonGlobal) { + global[key] = activeModuleGetter(key, true, modules.map(_ref7 => { + let { + bidders, + module + } = _ref7; + return { + allowed: bidders == null, + bidders, + module + }; + })); + } + bidderFilters.forEach(bidderCode => { + bidder[bidderCode] = bidder[bidderCode] ?? {}; + bidder[bidderCode][key] = activeModuleGetter(key, false, modules.map(_ref8 => { + let { + bidders, + module + } = _ref8; + return { + allowed: bidders?.includes(bidderCode), + bidders, + module + }; + })); + }); + }); + const combined = Object.values(bidder).concat([global]).reduce((combo, map) => Object.assign(combo, map), {}); + Object.assign(map, { + global, + bidder, + combined + }); + } + return map; +} +function enrichEids(ortb2Fragments) { + const { + global: globalFpd, + bidder: bidderFpd + } = ortb2Fragments; + const { + global: globalMods, + bidder: bidderMods + } = initializedSubmodules; + const globalEids = (0,_eids_js__WEBPACK_IMPORTED_MODULE_8__.getEids)(globalMods); + if (globalEids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_9__.dset)(globalFpd, 'user.ext.eids', (globalFpd.user?.ext?.eids ?? []).concat(globalEids)); + } + Object.entries(bidderMods).forEach(_ref9 => { + let [bidder, moduleMap] = _ref9; + const bidderEids = (0,_eids_js__WEBPACK_IMPORTED_MODULE_8__.getEids)(moduleMap); + if (bidderEids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_9__.dset)(bidderFpd, `${bidder}.user.ext.eids`, (bidderFpd[bidder]?.user?.ext?.eids ?? []).concat(bidderEids)); + } + }); + return ortb2Fragments; +} +function addIdData(_ref10) { + let { + adUnits, + ortb2Fragments + } = _ref10; + ortb2Fragments = ortb2Fragments ?? { + global: {}, + bidder: {} + }; + enrichEids(ortb2Fragments); + if ([adUnits].some(i => !Array.isArray(i) || !i.length)) { + return; + } + const globalIds = getIds(initializedSubmodules.global); + const globalEids = ortb2Fragments.global.user?.ext?.eids || []; + adUnits.forEach(adUnit => { + if (adUnit.bids && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(adUnit.bids)) { + adUnit.bids.forEach(bid => { + const bidderIds = Object.assign({}, globalIds, getIds(initializedSubmodules.bidder[bid.bidder] ?? {})); + const bidderEids = globalEids.concat(ortb2Fragments.bidder?.[bid.bidder]?.user?.ext?.eids || []); + if (Object.keys(bidderIds).length > 0) { + bid.userId = bidderIds; + } + if (bidderEids.length > 0) { + bid.userIdAsEids = bidderEids; + } + }); + } + }); +} +const INIT_CANCELED = {}; +function idSystemInitializer() { + let { + mkDelay = _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.delay + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const startInit = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.defer)(); + const startCallbacks = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.defer)(); + let cancel; + let initialized = false; + let initMetrics; + function cancelAndTry(promise) { + initMetrics = uidMetrics().fork(); + if (cancel != null) { + cancel.reject(INIT_CANCELED); + } + cancel = (0,_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.defer)(); + return _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.PbPromise.race([promise, cancel.promise]).finally(initMetrics.startTiming('userId.total')); + } + + // grab a reference to global vars so that the promise chains remain isolated; + // multiple calls to `init` (from tests) might otherwise cause them to interfere with each other + let initModules = initializedSubmodules; + let allModules = submodules; + function checkRefs(fn) { + // unfortunately tests have their own global state that needs to be guarded, so even if we keep ours tidy, + // we cannot let things like submodule callbacks run (they pollute things like the global `server` XHR mock) + return function () { + if (initModules === initializedSubmodules && allModules === submodules) { + return fn(...arguments); + } + }; + } + function timeConsent() { + return _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_11__.allConsent.promise.finally(initMetrics.startTiming('userId.init.consent')); + } + let done = cancelAndTry(_src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.PbPromise.all([_src_hook_js__WEBPACK_IMPORTED_MODULE_12__.ready, startInit.promise]).then(timeConsent).then(checkRefs(() => { + initSubmodules(initModules, allModules); + })).then(() => startCallbacks.promise.finally(initMetrics.startTiming('userId.callbacks.pending'))).then(checkRefs(() => { + const modWithCb = initModules.submodules.filter(item => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(item.callback)); + if (modWithCb.length) { + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.PbPromise(resolve => processSubmoduleCallbacks(modWithCb, resolve, initModules)); + } + }))); + + /** + * with `ready` = true, starts initialization; with `refresh` = true, reinitialize submodules (optionally + * filtered by `submoduleNames`). + */ + return function () { + let { + refresh = false, + submoduleNames = null, + ready = false + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (ready && !initialized) { + initialized = true; + startInit.resolve(); + // submodule callbacks should run immediately if `auctionDelay` > 0, or `syncDelay` ms after the + // auction ends otherwise + if (auctionDelay > 0) { + startCallbacks.resolve(); + } else { + _src_events_js__WEBPACK_IMPORTED_MODULE_13__.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.EVENTS.AUCTION_END, function auctionEndHandler() { + _src_events_js__WEBPACK_IMPORTED_MODULE_13__.off(_src_constants_js__WEBPACK_IMPORTED_MODULE_14__.EVENTS.AUCTION_END, auctionEndHandler); + mkDelay(syncDelay).then(startCallbacks.resolve); + }); + } + } + if (refresh && initialized) { + done = cancelAndTry(done.catch(() => null).then(timeConsent) // fetch again in case a refresh was forced before this was resolved + .then(checkRefs(() => { + const cbModules = initSubmodules(initModules, allModules.filter(sm => submoduleNames == null || submoduleNames.includes(sm.submodule.name)), true).filter(sm => { + return sm.callback != null; + }); + if (cbModules.length) { + return new _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.PbPromise(resolve => processSubmoduleCallbacks(cbModules, resolve, initModules)); + } + }))); + } + return done; + }; +} +let initIdSystem; +function getPPID() { + let eids = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getUserIdsAsEids() || []; + // userSync.ppid should be one of the 'source' values in getUserIdsAsEids() eg pubcid.org or id5-sync.com + const matchingUserId = ppidSource && eids.find(userID => userID.source === ppidSource); + if (matchingUserId && typeof matchingUserId?.uids?.[0]?.id === 'string') { + const ppidValue = matchingUserId.uids[0].id.replace(/[\W_]/g, ''); + if (ppidValue.length >= 32 && ppidValue.length <= 150) { + return ppidValue; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`User ID - Googletag Publisher Provided ID for ${ppidSource} is not between 32 and 150 characters - ${ppidValue}`); + } + } +} + +/** + * Hook is executed before adapters, but after consentManagement. Consent data is requied because + * this module requires GDPR consent with Purpose #1 to save data locally. + * The two main actions handled by the hook are: + * 1. check gdpr consentData and handle submodule initialization. + * 2. append user id data (loaded from cookied/html or from the getId method) to bids to be accessed in adapters. + * @param {Object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + * @param {function} fn required; The next function in the chain, used by hook.js + */ +const startAuctionHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__.timedAuctionHook)('userId', function requestBidsHook(fn, reqBidsConfigObj) { + let { + mkDelay = _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.delay, + getIds = getUserIdsAsync + } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.PbPromise.race([getIds().catch(() => null), mkDelay(auctionDelay)]).then(() => { + addIdData(reqBidsConfigObj); + uidMetrics().join((0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__.useMetrics)(reqBidsConfigObj.metrics), { + propagate: false, + includeGroups: true + }); + // calling fn allows prebid to continue processing + fn.call(this, reqBidsConfigObj); + }); +}); + +/** + * Append user id data from config to bids to be accessed in adapters when there are no submodules. + * @param {function} fn required; The next function in the chain, used by hook.js + * @param {Object} reqBidsConfigObj required; This is the same param that's used in pbjs.requestBids. + */ +const addUserIdsHook = (0,_src_utils_perfMetrics_js__WEBPACK_IMPORTED_MODULE_3__.timedAuctionHook)('userId', function requestBidsHook(fn, reqBidsConfigObj) { + addIdData(reqBidsConfigObj); + // calling fn allows prebid to continue processing + fn.call(this, reqBidsConfigObj); +}); + +/** + * Is startAuctionHook added + * @returns {boolean} + */ +function addedStartAuctionHook() { + return !!_src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.getHooks({ + hook: startAuctionHook + }).length; +} + +/** + * This function will be exposed in global-name-space so that userIds stored by Prebid UserId module can be used by external codes as well. + * Simple use case will be passing these UserIds to A9 wrapper solution + */ +function getUserIds() { + return getIds(initializedSubmodules.combined); +} + +/** + * This function will be exposed in global-name-space so that userIds stored by Prebid UserId module can be used by external codes as well. + * Simple use case will be passing these UserIds to A9 wrapper solution + */ +function getUserIdsAsEids() { + return (0,_eids_js__WEBPACK_IMPORTED_MODULE_8__.getEids)(initializedSubmodules.combined); +} + +/** + * This function will be exposed in global-name-space so that userIds stored by Prebid UserId module can be used by external codes as well. + * Simple use case will be passing these UserIds to A9 wrapper solution + */ + +function getUserIdsAsEidBySource(sourceName) { + return getUserIdsAsEids().filter(eid => eid.source === sourceName)[0]; +} + +/** + * This function will be exposed in global-name-space so that userIds for a source can be exposed + * Sample use case is exposing this function to ESP + */ +function getEncryptedEidsForSource(source, encrypt, customFunction) { + return retryOnCancel().then(() => { + let eidsSignals = {}; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(customFunction)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME} - Getting encrypted signal from custom function : ${customFunction.name} & source : ${source} `); + // Publishers are expected to define a common function which will be proxy for signal function. + const customSignals = customFunction(source); + eidsSignals[source] = customSignals ? encryptSignals(customSignals) : null; // by default encrypt using base64 to avoid JSON errors + } else { + // initialize signal with eids by default + const eid = getUserIdsAsEidBySource(source); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME} - Getting encrypted signal for eids :${JSON.stringify(eid)}`); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(eid)) { + eidsSignals[eid.source] = encrypt === true ? encryptSignals(eid) : eid.uids[0].id; // If encryption is enabled append version (1||) and encrypt entire object + } + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME} - Fetching encrypted eids: ${eidsSignals[source]}`); + return eidsSignals[source]; + }); +} +function encryptSignals(signals) { + let version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + let encryptedSig = ''; + switch (version) { + case 1: + // Base64 Encryption + encryptedSig = typeof signals === 'object' ? window.btoa(JSON.stringify(signals)) : window.btoa(signals); // Test encryption. To be replaced with better algo + break; + default: + break; + } + return `${version}||${encryptedSig}`; +} + +/** + * This function will be exposed in the global-name-space so that publisher can register the signals-ESP. + */ +function registerSignalSources() { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isGptPubadsDefined)()) { + return; + } + window.googletag.secureSignalProviders = window.googletag.secureSignalProviders || []; + const encryptedSignalSources = _src_config_js__WEBPACK_IMPORTED_MODULE_15__.config.getConfig('userSync.encryptedSignalSources'); + if (encryptedSignalSources) { + const registerDelay = encryptedSignalSources.registerDelay || 0; + setTimeout(() => { + encryptedSignalSources['sources'] && encryptedSignalSources['sources'].forEach(_ref11 => { + let { + source, + encrypt, + customFunc + } = _ref11; + source.forEach(src => { + window.googletag.secureSignalProviders.push({ + id: src, + collectorFunction: () => getEncryptedEidsForSource(src, encrypt, customFunc) + }); + }); + }); + }, registerDelay); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${MODULE_NAME} - ESP : encryptedSignalSources config not defined under userSync Object`); + } +} +function retryOnCancel(initParams) { + return initIdSystem(initParams).then(() => getUserIds(), e => { + if (e === INIT_CANCELED) { + // there's a pending refresh - because GreedyPromise runs this synchronously, we are now in the middle + // of canceling the previous init, before the refresh logic has had a chance to run. + // Use a "normal" Promise to clear the stack and let it complete (or this will just recurse infinitely) + return Promise.resolve().then(getUserIdsAsync); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)('Error initializing userId', e); + return _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.PbPromise.reject(e); + } + }); +} + +/** + * Force (re)initialization of ID submodules. + * + * This will force a refresh of the specified ID submodules regardless of `auctionDelay` / `syncDelay` settings, and + * return a promise that resolves to the same value as `getUserIds()` when the refresh is complete. + * If a refresh is already in progress, it will be canceled (rejecting promises returned by previous calls to `refreshUserIds`). + * + * @param {string[]} [submoduleNames] submodules to refresh. If omitted, refresh all submodules. + * @param {Function} [callback] called when the refresh is complete + */ +function refreshUserIds() { + let { + submoduleNames + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + return retryOnCancel({ + refresh: true, + submoduleNames + }).then(userIds => { + if (callback && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isFn)(callback)) { + callback(); + } + return userIds; + }); +} + +/** + * @returns a promise that resolves to the same value as `getUserIds()`, but only once all ID submodules have completed + * initialization. This can also be used to synchronize calls to other ID accessors, e.g. + * + * ``` + * pbjs.getUserIdsAsync().then(() => { + * const eids = pbjs.getUserIdsAsEids(); // guaranteed to be completely initialized at this point + * }); + * ``` + */ + +function getUserIdsAsync() { + return retryOnCancel(); +} +function getConsentHash() { + // transform decimal string into base64 to save some space on cookies + let hash = Number(_src_consentHandler_js__WEBPACK_IMPORTED_MODULE_11__.allConsent.hash); + const bytes = []; + while (hash > 0) { + bytes.push(String.fromCharCode(hash & 255)); + hash = hash >>> 8; + } + return btoa(bytes.join()); +} +function consentChanged(submodule) { + const storedConsent = getStoredValue(submodule, 'cst'); + return !storedConsent || storedConsent !== getConsentHash(); +} +function populateSubmoduleId(submodule, forceRefresh) { + const consentData = _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_11__.allConsent.getConsentData(); + + // There are two submodule configuration types to handle: storage or value + // 1. storage: retrieve user id data from cookie/html storage or with the submodule's getId method + // 2. value: pass directly to bids + if (submodule.config.storage) { + let storedId = getStoredValue(submodule); + let response; + let refreshNeeded = false; + if (typeof submodule.config.storage.refreshInSeconds === 'number') { + const storedDate = new Date(getStoredValue(submodule, 'last')); + refreshNeeded = storedDate && Date.now() - storedDate.getTime() > submodule.config.storage.refreshInSeconds * 1000; + } + if (!storedId || refreshNeeded || forceRefresh || consentChanged(submodule)) { + const extendedConfig = Object.assign({ + enabledStorageTypes: submodule.enabledStorageTypes + }, submodule.config); + + // No id previously saved, or a refresh is needed, or consent has changed. Request a new id from the submodule. + response = submodule.submodule.getId(extendedConfig, consentData, storedId); + } else if (typeof submodule.submodule.extendId === 'function') { + // If the id exists already, give submodule a chance to decide additional actions that need to be taken + response = submodule.submodule.extendId(submodule.config, consentData, storedId); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(response)) { + if (response.id) { + // A getId/extendId result assumed to be valid user id data, which should be saved to users local storage or cookies + setStoredValue(submodule, response.id); + storedId = response.id; + } + if (typeof response.callback === 'function') { + // Save async callback to be invoked after auction + submodule.callback = response.callback; + } + } + if (storedId) { + // cache decoded value (this is copied to every adUnit bid) + submodule.idObj = submodule.submodule.decode(storedId, submodule.config); + } + } else if (submodule.config.value) { + // cache decoded value (this is copied to every adUnit bid) + submodule.idObj = submodule.config.value; + } else { + const response = submodule.submodule.getId(submodule.config, consentData); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isPlainObject)(response)) { + if (typeof response.callback === 'function') { + submodule.callback = response.callback; + } + if (response.id) { + submodule.idObj = submodule.submodule.decode(response.id, submodule.config); + } + } + } +} +function updatePPID(priorityMaps) { + const eids = (0,_eids_js__WEBPACK_IMPORTED_MODULE_8__.getEids)(priorityMaps.combined); + if (eids.length && ppidSource) { + const ppid = getPPID(eids); + if (ppid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isGptPubadsDefined)()) { + window.googletag.pubads().setPublisherProvidedId(ppid); + } else { + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(function () { + window.googletag.pubads().setPublisherProvidedId(ppid); + }); + } + } + } +} +function initSubmodules(priorityMaps, submodules) { + let forceRefresh = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + return uidMetrics().fork().measureTime('userId.init.modules', function () { + if (!submodules.length) return []; // to simplify log messages from here on + + submodules.forEach(submod => populateEnabledStorageTypes(submod)); + + /** + * filter out submodules that: + * + * - cannot use the storage they've been set up with (storage not available / not allowed / disabled) + * - are not allowed to perform the `enrichEids` activity + */ + submodules = submodules.filter(submod => { + return (!submod.config.storage || canUseStorage(submod)) && dep.isAllowed(_src_activities_activities_js__WEBPACK_IMPORTED_MODULE_5__.ACTIVITY_ENRICH_EIDS, (0,_src_activities_activityParams_js__WEBPACK_IMPORTED_MODULE_6__.activityParams)(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__.MODULE_TYPE_UID, submod.config.name)); + }); + if (!submodules.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`${MODULE_NAME} - no ID module configured`); + return []; + } + const initialized = submodules.reduce((carry, submodule) => { + return submoduleMetrics(submodule.submodule.name).measureTime('init', () => { + try { + populateSubmoduleId(submodule, forceRefresh); + carry.push(submodule); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Error in userID module '${submodule.submodule.name}':`, e); + } + return carry; + }); + }, []); + priorityMaps.refresh(initialized); + updatePPID(priorityMaps); + return initialized; + }); +} +function getConfiguredStorageTypes(config) { + return config?.storage?.type?.trim().split(/\s*&\s*/) || []; +} +function hasValidStorageTypes(config) { + const storageTypes = getConfiguredStorageTypes(config); + return storageTypes.every(storageType => ALL_STORAGE_TYPES.has(storageType)); +} + +/** + * list of submodule configurations with valid 'storage' or 'value' obj definitions + * storage config: contains values for storing/retrieving User ID data in browser storage + * value config: object properties that are copied to bids (without saving to storage) + * @param {SubmoduleConfig[]} configRegistry + * @returns {SubmoduleConfig[]} + */ +function getValidSubmoduleConfigs(configRegistry) { + function err(msg) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logWarn)(`Invalid userSync.userId config: ${msg}`, ...args); + } + if (!Array.isArray(configRegistry)) { + if (configRegistry != null) { + err('must be an array', configRegistry); + } + return []; + } + return configRegistry.filter(config => { + if (!config?.name) { + return err('must specify "name"', config); + } else if (config.storage) { + if (!config.storage.name || !config.storage.type) { + return err('must specify "storage.name" and "storage.type"', config); + } else if (!hasValidStorageTypes(config)) { + return err('invalid "storage.type"', config); + } + ['expires', 'refreshInSeconds'].forEach(param => { + let value = config.storage[param]; + if (value != null && typeof value !== 'number') { + value = Number(value); + if (isNaN(value)) { + err(`storage.${param} must be a number and will be ignored`, config); + delete config.storage[param]; + } else { + config.storage[param] = value; + } + } + }); + } + return true; + }); +} +const ALL_STORAGE_TYPES = new Set([LOCAL_STORAGE, COOKIE]); +function canUseLocalStorage(submodule) { + if (!submodule.storageMgr.localStorageIsEnabled()) { + return false; + } + if (coreStorage.getDataFromLocalStorage(PBJS_USER_ID_OPTOUT_NAME)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME} - opt-out localStorage found, storage disabled`); + return false; + } + return true; +} +function canUseCookies(submodule) { + if (!submodule.storageMgr.cookiesAreEnabled()) { + return false; + } + if (coreStorage.getCookie(PBJS_USER_ID_OPTOUT_NAME)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME} - opt-out cookie found, storage disabled`); + return false; + } + return true; +} +function populateEnabledStorageTypes(submodule) { + if (submodule.enabledStorageTypes) { + return; + } + const storageTypes = getConfiguredStorageTypes(submodule.config); + submodule.enabledStorageTypes = storageTypes.filter(type => { + switch (type) { + case LOCAL_STORAGE: + return canUseLocalStorage(submodule); + case COOKIE: + return canUseCookies(submodule); + } + return false; + }); +} +function canUseStorage(submodule) { + return !!submodule.enabledStorageTypes.length; +} +function updateEIDConfig(submodules) { + _eids_js__WEBPACK_IMPORTED_MODULE_8__.EID_CONFIG.clear(); + Object.entries(orderByPriority(submodules, mod => Object.keys(mod.eids || {}), mod => mod)).forEach(_ref12 => { + let [key, submodules] = _ref12; + return _eids_js__WEBPACK_IMPORTED_MODULE_8__.EID_CONFIG.set(key, submodules[0].eids[key]); + }); +} + +/** + * update submodules by validating against existing configs and storage types + */ +function updateSubmodules() { + updateEIDConfig(submoduleRegistry); + const configs = getValidSubmoduleConfigs(configRegistry); + if (!configs.length) { + return; + } + // do this to avoid reprocessing submodules + // TODO: the logic does not match the comment - addedSubmodules is always a copy of submoduleRegistry + // (if it did it would not be correct - it's not enough to find new modules, as others may have been removed or changed) + const addedSubmodules = submoduleRegistry.filter(i => !(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_16__.find)(submodules, j => j.name === i.name)); + submodules.splice(0, submodules.length); + // find submodule and the matching configuration, if found create and append a SubmoduleContainer + addedSubmodules.map(i => { + const submoduleConfig = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_16__.find)(configs, j => j.name && (j.name.toLowerCase() === i.name.toLowerCase() || i.aliasName && j.name.toLowerCase() === i.aliasName.toLowerCase())); + if (submoduleConfig && i.name !== submoduleConfig.name) submoduleConfig.name = i.name; + return submoduleConfig ? { + submodule: i, + config: submoduleConfig, + callback: undefined, + idObj: undefined, + storageMgr: (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__.MODULE_TYPE_UID, + moduleName: submoduleConfig.name + }) + } : null; + }).filter(submodule => submodule !== null).forEach(sm => submodules.push(sm)); + if (submodules.length) { + if (!addedStartAuctionHook()) { + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.getHooks({ + hook: addUserIdsHook + }).remove(); + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.before(startAuctionHook, 100); // use higher priority than dataController / rtd + _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_17__["default"].callDataDeletionRequest.before(requestDataDeletion); + _src_adserver_js__WEBPACK_IMPORTED_MODULE_18__.getPPID.after(next => next(getPPID())); + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)(`${MODULE_NAME} - usersync config updated for ${submodules.length} submodules: `, submodules.map(a => a.submodule.name)); + } +} + +/** + * This function will update the idPriority according to the provided configuration + * @param {Object} idPriorityConfig + * @param {Submodule[]} submodules + */ +function updateIdPriority(idPriorityConfig, submodules) { + if (idPriorityConfig) { + const result = {}; + const aliasToName = new Map(submodules.map(s => s.aliasName ? [s.aliasName, s.name] : [])); + Object.keys(idPriorityConfig).forEach(key => { + const priority = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isArray)(idPriorityConfig[key]) ? [...idPriorityConfig[key]].reverse() : []; + result[key] = priority.map(s => aliasToName.has(s) ? aliasToName.get(s) : s); + }); + idPriority = result; + } else { + idPriority = {}; + } + initializedSubmodules.refresh(); + updateEIDConfig(submodules); +} +function requestDataDeletion(next) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logInfo)('UserID: received data deletion request; deleting all stored IDs...'); + submodules.forEach(submodule => { + if (typeof submodule.submodule.onDataDeletionRequest === 'function') { + try { + submodule.submodule.onDataDeletionRequest(submodule.config, submodule.idObj, ...args); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.logError)(`Error calling onDataDeletionRequest for ID submodule ${submodule.submodule.name}`, e); + } + } + deleteStoredValue(submodule); + }); + next.apply(this, args); +} + +/** + * enable submodule in User ID + * @param {Submodule} submodule + */ +function attachIdSystem(submodule) { + submodule.findRootDomain = _src_fpd_rootDomain_js__WEBPACK_IMPORTED_MODULE_19__.findRootDomain; + if (!(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_16__.find)(submoduleRegistry, i => i.name === submodule.name)) { + submoduleRegistry.push(submodule); + _src_consentHandler_js__WEBPACK_IMPORTED_MODULE_11__.GDPR_GVLIDS.register(_src_activities_modules_js__WEBPACK_IMPORTED_MODULE_7__.MODULE_TYPE_UID, submodule.name, submodule.gvlid); + updateSubmodules(); + // TODO: a test case wants this to work even if called after init (the setConfig({userId})) + // so we trigger a refresh. But is that even possible outside of tests? + initIdSystem({ + refresh: true, + submoduleNames: [submodule.name] + }); + } +} +function normalizePromise(fn) { + // for public methods that return promises, make sure we return a "normal" one - to avoid + // exposing confusing stack traces + return function () { + return Promise.resolve(fn.apply(this, arguments)); + }; +} + +/** + * test browser support for storage config types (local storage or cookie), initializes submodules but consentManagement is required, + * so a callback is added to fire after the consentManagement module. + * @param {{getConfig:function}} config + */ +function init(config) { + let { + mkDelay = _src_utils_promise_js__WEBPACK_IMPORTED_MODULE_10__.delay + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + ppidSource = undefined; + submodules = []; + configRegistry = []; + initializedSubmodules = mkPriorityMaps(); + initIdSystem = idSystemInitializer({ + mkDelay + }); + if (configListener != null) { + configListener(); + } + submoduleRegistry = []; + + // listen for config userSyncs to be set + configListener = config.getConfig('userSync', conf => { + // Note: support for 'usersync' was dropped as part of Prebid.js 4.0 + const userSync = conf.userSync; + if (userSync) { + ppidSource = userSync.ppid; + if (userSync.userIds) { + configRegistry = userSync.userIds; + syncDelay = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(userSync.syncDelay) ? userSync.syncDelay : _src_userSync_js__WEBPACK_IMPORTED_MODULE_20__.USERSYNC_DEFAULT_CONFIG.syncDelay; + auctionDelay = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__.isNumber)(userSync.auctionDelay) ? userSync.auctionDelay : _src_userSync_js__WEBPACK_IMPORTED_MODULE_20__.USERSYNC_DEFAULT_CONFIG.auctionDelay; + updateSubmodules(); + updateIdPriority(userSync.idPriority, submoduleRegistry); + initIdSystem({ + ready: true + }); + } + } + }); + + // exposing getUserIds function in global-name-space so that userIds stored in Prebid can be used by external codes. + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().getUserIds = getUserIds; + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().getUserIdsAsEids = getUserIdsAsEids; + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().getEncryptedEidsForSource = normalizePromise(getEncryptedEidsForSource); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().registerSignalSources = registerSignalSources; + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().refreshUserIds = normalizePromise(refreshUserIds); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().getUserIdsAsync = normalizePromise(getUserIdsAsync); + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.getGlobal)().getUserIdsAsEidBySource = getUserIdsAsEidBySource; + if (!addedStartAuctionHook()) { + // Add ortb2.user.ext.eids even if 0 submodules are added + _src_prebid_js__WEBPACK_IMPORTED_MODULE_0__.startAuction.before(addUserIdsHook, 100); // use higher priority than dataController / rtd + } +} +function resetUserIds() { + _src_config_js__WEBPACK_IMPORTED_MODULE_15__.config.setConfig({ + userSync: {} + }); + init(_src_config_js__WEBPACK_IMPORTED_MODULE_15__.config); +} + +// init config update listener to start the application +init(_src_config_js__WEBPACK_IMPORTED_MODULE_15__.config); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_12__.module)('userId', attachIdSystem, { + postInstallAllowed: true +}); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_21__.registerModule)('userId'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/userId/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["utiqIdSystem"],{ + +/***/ "./modules/utiqIdSystem.js": +/*!*********************************!*\ + !*** ./modules/utiqIdSystem.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, utiqIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds Utiq provided by Utiq SA/NV to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/utiqIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + */ + +const MODULE_NAME = 'utiqId'; +const LOG_PREFIX = 'Utiq module'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** + * Get the "atid" from html5 local storage to make it available to the UserId module. + * @returns {{utiq: (*|string)}} + */ +function getUtiqFromStorage() { + let utiqPass; + let utiqPassStorage = JSON.parse(storage.getDataFromLocalStorage('utiqPass')); + const netIdAdtechpass = storage.getDataFromLocalStorage('netid_utiq_adtechpass'); + if (netIdAdtechpass) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Local storage netid_utiq_adtechpass: ${netIdAdtechpass}`); + return { + utiq: netIdAdtechpass + }; + } + if (utiqPassStorage && utiqPassStorage.connectId && Array.isArray(utiqPassStorage.connectId.idGraph) && utiqPassStorage.connectId.idGraph.length > 0) { + utiqPass = utiqPassStorage.connectId.idGraph[0]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Local storage utiqPass: ${JSON.stringify(utiqPassStorage)}`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Graph of utiqPass: ${JSON.stringify(utiqPass)}`); + } + return { + utiq: utiqPass && utiqPass.atid ? utiqPass.atid : null + }; +} + +/** @type {Submodule} */ +const utiqIdSubmodule = { + /** + * Used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Decodes the stored id value for passing to bid requests. + * @function + * @returns {{utiq: string} | null} + */ + decode(bidId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Decoded ID value ${JSON.stringify(bidId)}`); + return bidId.utiq ? bidId : null; + }, + /** + * Get the id from helper function and initiate a new user sync. + * @param config + * @returns {{callback: Function}|{id: {utiq: string}}} + */ + getId: function (config) { + const data = getUtiqFromStorage(); + if (data.utiq) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Local storage ID value ${JSON.stringify(data)}`); + return { + id: { + utiq: data.utiq + } + }; + } else { + if (!config) { + config = {}; + } + if (!config.params) { + config.params = {}; + } + if (typeof config.params.maxDelayTime === 'undefined' || config.params.maxDelayTime === null) { + config.params.maxDelayTime = 1000; + } + // Current delay and delay step in milliseconds + let currentDelay = 0; + const delayStep = 50; + const result = callback => { + const data = getUtiqFromStorage(); + if (!data.utiq) { + if (currentDelay > config.params.maxDelayTime) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: No utiq value set after ${config.params.maxDelayTime} max allowed delay time`); + callback(null); + } else { + currentDelay += delayStep; + setTimeout(() => { + result(callback); + }, delayStep); + } + } else { + const dataToReturn = { + utiq: data.utiq + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Returning ID value data of ${JSON.stringify(dataToReturn)}`); + callback(dataToReturn); + } + }; + return { + callback: result + }; + } + }, + eids: { + 'utiq': { + source: 'utiq.com', + atype: 1, + getValue: function (data) { + return data; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', utiqIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('utiqIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/utiqIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["utiqMtpIdSystem"],{ + +/***/ "./modules/utiqMtpIdSystem.js": +/*!************************************!*\ + !*** ./modules/utiqMtpIdSystem.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, utiqMtpIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds Utiq MTP provided by Utiq SA/NV to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/utiqMtpIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + */ + +const MODULE_NAME = 'utiqMtpId'; +const LOG_PREFIX = 'Utiq MTP module'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: MODULE_NAME +}); + +/** + * Get the "mtid" from html5 local storage to make it available to the UserId module. + * @returns {{utiqMtp: (*|string)}} + */ +function getUtiqFromStorage() { + let utiqPass; + let utiqPassStorage = JSON.parse(storage.getDataFromLocalStorage('utiqPass')); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Local storage utiqPass: ${JSON.stringify(utiqPassStorage)}`); + if (utiqPassStorage && utiqPassStorage.connectId && Array.isArray(utiqPassStorage.connectId.idGraph) && utiqPassStorage.connectId.idGraph.length > 0) { + utiqPass = utiqPassStorage.connectId.idGraph[0]; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Graph of utiqPass: ${JSON.stringify(utiqPass)}`); + return { + utiqMtp: utiqPass && utiqPass.mtid ? utiqPass.mtid : null + }; +} + +/** @type {Submodule} */ +const utiqMtpIdSubmodule = { + /** + * Used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Decodes the stored id value for passing to bid requests. + * @function + * @returns {{utiqMtp: string} | null} + */ + decode(bidId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Decoded ID value ${JSON.stringify(bidId)}`); + return bidId.utiqMtp ? bidId : null; + }, + /** + * Get the id from helper function and initiate a new user sync. + * @param config + * @returns {{callback: Function}|{id: {utiqMtp: string}}} + */ + getId: function (config) { + const data = getUtiqFromStorage(); + if (data.utiqMtp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Local storage ID value ${JSON.stringify(data)}`); + return { + id: { + utiqMtp: data.utiqMtp + } + }; + } else { + if (!config) { + config = {}; + } + if (!config.params) { + config.params = {}; + } + if (typeof config.params.maxDelayTime === 'undefined' || config.params.maxDelayTime === null) { + config.params.maxDelayTime = 1000; + } + // Current delay and delay step in milliseconds + let currentDelay = 0; + const delayStep = 50; + const result = callback => { + const data = getUtiqFromStorage(); + if (!data.utiqMtp) { + if (currentDelay > config.params.maxDelayTime) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: No utiq value set after ${config.params.maxDelayTime} max allowed delay time`); + callback(null); + } else { + currentDelay += delayStep; + setTimeout(() => { + result(callback); + }, delayStep); + } + } else { + const dataToReturn = { + utiqMtp: data.utiqMtp + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`${LOG_PREFIX}: Returning ID value data of ${JSON.stringify(dataToReturn)}`); + callback(dataToReturn); + } + }; + return { + callback: result + }; + } + }, + eids: { + 'utiqMtp': { + source: 'utiq-mtp.com', + atype: 1, + getValue: function (data) { + return data; + } + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', utiqMtpIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('utiqMtpIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/utiqMtpIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["validationFpdModule"],{ + +/***/ "./modules/validationFpdModule/config.js": +/*!***********************************************!*\ + !*** ./modules/validationFpdModule/config.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ORTB_MAP: () => (/* binding */ ORTB_MAP) +/* harmony export */ }); +/** + * Data type map + */ +const TYPES = { + string: 'string', + object: 'object', + number: 'number' +}; + +/** + * Template to define what ortb2 attributes should be validated + * Accepted fields: + * -- invalid - {Boolean} if true, field is not valid + * -- type - {String} valid data type of field + * -- isArray - {Boolean} if true, field must be an array + * -- childType - {String} used in conjuction with isArray: true, defines valid type of array indices + * -- children - {Object} defines child properties needed to be validated (used only if type: object) + * -- required - {Array} array of strings defining any required properties for object (used only if type: object) + * -- optoutApplies - {Boolean} if true, optout logic will filter if applicable (currently only applies to user object) + */ +const ORTB_MAP = { + imp: { + invalid: true + }, + cur: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + }, + device: { + type: TYPES.object, + children: { + w: { + type: TYPES.number + }, + h: { + type: TYPES.number + } + } + }, + site: { + type: TYPES.object, + children: { + name: { + type: TYPES.string + }, + domain: { + type: TYPES.string + }, + page: { + type: TYPES.string + }, + ref: { + type: TYPES.string + }, + keywords: { + type: TYPES.string + }, + search: { + type: TYPES.string + }, + cat: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + }, + sectioncat: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + }, + pagecat: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + }, + content: { + type: TYPES.object, + isArray: false, + children: { + data: { + type: TYPES.object, + isArray: true, + childType: TYPES.object, + required: ['name', 'segment'], + children: { + segment: { + type: TYPES.object, + isArray: true, + childType: TYPES.object, + required: ['id'], + children: { + id: { + type: TYPES.string + } + } + }, + name: { + type: TYPES.string + }, + ext: { + type: TYPES.object + } + } + } + } + }, + publisher: { + type: TYPES.object, + isArray: false, + children: { + id: { + type: TYPES.string + }, + name: { + type: TYPES.string + }, + cat: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + }, + domain: { + type: TYPES.string + }, + ext: { + type: TYPES.object, + isArray: false + } + } + } + } + }, + user: { + type: TYPES.object, + children: { + yob: { + type: TYPES.number, + optoutApplies: true + }, + gender: { + type: TYPES.string, + optoutApplies: true + }, + keywords: { + type: TYPES.string + }, + data: { + type: TYPES.object, + isArray: true, + childType: TYPES.object, + required: ['name', 'segment'], + children: { + segment: { + type: TYPES.object, + isArray: true, + childType: TYPES.object, + required: ['id'], + children: { + id: { + type: TYPES.string + } + } + }, + name: { + type: TYPES.string + }, + ext: { + type: TYPES.object + } + } + } + } + }, + bcat: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + }, + badv: { + type: TYPES.object, + isArray: true, + childType: TYPES.string + } +}; + +/***/ }), + +/***/ "./modules/validationFpdModule/index.js": +/*!**********************************************!*\ + !*** ./modules/validationFpdModule/index.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports filterArrayData, validateFpd, processFpd, validationSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config.js */ "./modules/validationFpdModule/config.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/storageManager.js */ "./src/storageManager.js"); + +/** + * This module sets default values and validates ortb2 first part data + * @module modules/firstPartyData + */ + + + + + +// TODO: do FPD modules need their own namespace? +const STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getCoreStorageManager)('FPDValidation'); +let optout; + +/** + * Check if data passed is empty + * @param {*} data to test against + * @returns {Boolean} is data empty + */ +function isEmptyData(data) { + let check = true; + if (typeof data === 'object' && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(data)) { + check = false; + } else if (typeof data !== 'object' && ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(data) || data)) { + check = false; + } + return check; +} + +/** + * Check if required keys exist in data object + * @param {Object} obj data object + * @param {Array} required array of required keys + * @param {String} parent object path (for printing warning) + * @param {Number} i index of object value in the data array (for printing warning) + * @returns {Boolean} is requirements fulfilled + */ +function getRequiredData(obj, required, parent, i) { + let check = true; + required.forEach(key => { + if (!obj[key] || isEmptyData(obj[key])) { + check = false; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}[] value at index ${i} in ortb2 data: missing required property ${key}`); + } + }); + return check; +} + +/** + * Check if data type is valid + * @param {*} data value to test against + * @param {Object} mapping object containing type definition and if should be array bool + * @returns {Boolean} is type fulfilled + */ +function typeValidation(data, mapping) { + let check = false; + switch (mapping.type) { + case 'string': + if (typeof data === 'string') check = true; + break; + case 'number': + if (typeof data === 'number' && isFinite(data)) check = true; + break; + case 'object': + if (typeof data === 'object') { + if (Array.isArray(data) && mapping.isArray || !Array.isArray(data) && !mapping.isArray) check = true; + } + break; + } + return check; +} + +/** + * Validates ortb2 data arrays and filters out invalid data + * @param {Array} arr ortb2 data array + * @param {Object} child object defining child type and if array + * @param {String} path config path of data array + * @param {String} parent parent path for logging warnings + * @returns {Array} validated/filtered data + */ +function filterArrayData(arr, child, path, parent) { + arr = arr.filter((index, i) => { + let check = typeValidation(index, { + type: child.type, + isArray: child.isArray + }); + if (check && Array.isArray(index) === Boolean(child.isArray)) { + return true; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}[] value at index ${i} in ortb2 data: expected type ${child.type}`); + }).filter((index, i) => { + let requiredCheck = true; + let mapping = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_config_js__WEBPACK_IMPORTED_MODULE_3__.ORTB_MAP, path); + if (mapping && mapping.required) requiredCheck = getRequiredData(index, mapping.required, parent, i); + if (requiredCheck) return true; + }).reduce((result, value, i) => { + let typeBool = false; + let mapping = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_config_js__WEBPACK_IMPORTED_MODULE_3__.ORTB_MAP, path); + switch (child.type) { + case 'string': + result.push(value); + typeBool = true; + break; + case 'object': + if (mapping && mapping.children) { + let validObject = validateFpd(value, path + '.children.', parent + '.'); + if (Object.keys(validObject).length) { + let requiredCheck = getRequiredData(validObject, mapping.required, parent, i); + if (requiredCheck) { + result.push(validObject); + typeBool = true; + } + } + } else { + result.push(value); + typeBool = true; + } + break; + } + if (!typeBool) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}[] value at index ${i} in ortb2 data: expected type ${child.type}`); + return result; + }, []); + return arr; +} + +/** + * Validates ortb2 object and filters out invalid data + * @param {Object} fpd ortb2 object + * @param {String} path config path of data array + * @param {String} parent parent path for logging warnings + * @returns {Object} validated/filtered data + */ +function validateFpd(fpd) { + let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + let parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + if (!fpd) return {}; + + // Filter out imp property if exists + let validObject = Object.assign({}, Object.keys(fpd).filter(key => { + let mapping = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_config_js__WEBPACK_IMPORTED_MODULE_3__.ORTB_MAP, path + key); + if (!mapping || !mapping.invalid) return key; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}${key} property in ortb2 data: invalid property`); + }).filter(key => { + let mapping = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_config_js__WEBPACK_IMPORTED_MODULE_3__.ORTB_MAP, path + key); + // let typeBool = false; + let typeBool = mapping ? typeValidation(fpd[key], { + type: mapping.type, + isArray: mapping.isArray + }) : true; + if (typeBool || !mapping) return key; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}${key} property in ortb2 data: expected type ${mapping.isArray ? 'array' : mapping.type}`); + }).reduce((result, key) => { + let mapping = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_config_js__WEBPACK_IMPORTED_MODULE_3__.ORTB_MAP, path + key); + let modified = {}; + if (mapping) { + if (mapping.optoutApplies && optout) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}${key} data: pubcid optout found`); + return result; + } + modified = mapping.type === 'object' && !mapping.isArray ? validateFpd(fpd[key], path + key + '.children.', parent + key + '.') : mapping.isArray && mapping.childType ? filterArrayData(fpd[key], { + type: mapping.childType, + isArray: mapping.childisArray + }, path + key, parent + key) : fpd[key]; + + // Check if modified data has data and return + !isEmptyData(modified) ? result[key] = modified : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Filtered ${parent}${key} property in ortb2 data: empty data found`); + } else { + result[key] = fpd[key]; + } + return result; + }, {})); + + // Return validated data + return validObject; +} + +/** + * Run validation on global and bidder config data for ortb2 + * @param {Object} data global and bidder config data + * @returns {Object} validated data + */ +function runValidations(data) { + return { + global: validateFpd(data.global), + bidder: Object.fromEntries(Object.entries(data.bidder).map(_ref => { + let [bidder, conf] = _ref; + return [bidder, validateFpd(conf)]; + })) + }; +} + +/** + * Sets default values to ortb2 if exists and adds currency and ortb2 setConfig callbacks on init + * @param {Object} fpdConf configuration object + * @param {Object} data ortb2 data + * @returns {Object} processed data + */ +function processFpd(fpdConf, data) { + // Checks for existsnece of pubcid optout cookie/storage + // if exists, filters user data out + optout = STORAGE.cookiesAreEnabled() && STORAGE.getCookie('_pubcid_optout') || STORAGE.hasLocalStorage() && STORAGE.getDataFromLocalStorage('_pubcid_optout'); + return !fpdConf.skipValidations ? runValidations(data) : data; +} + +/** @type {{name: string, queue: number, processFpd: function}} */ +const validationSubmodule = { + name: 'validation', + queue: 1, + processFpd +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)('firstPartyData', validationSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('validationFpdModule'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/validationFpdModule/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vdoaiBidAdapter"],{ + +/***/ "./modules/vdoaiBidAdapter.js": +/*!************************************!*\ + !*** ./modules/vdoaiBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'vdoai'; + +/** + * Determines whether or not the given bid response is valid. + * + * @param {object} vdoresponse The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ +function vdoIsBidResponseValid(vdoresponse) { + if (!vdoresponse.requestId || !vdoresponse.cpm || !vdoresponse.creativeId || !vdoresponse.ttl || !vdoresponse.currency || !vdoresponse.meta.advertiserDomains) { + return false; + } + switch (vdoresponse.meta.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + return Boolean(vdoresponse.width && vdoresponse.height && vdoresponse.ad); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + return Boolean(vdoresponse.vastXml || vdoresponse.vastUrl); + } + return false; +} +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} vdobid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: vdobid => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('vdobid', vdobid); + return Boolean(vdobid.bidId && vdobid.params && vdobid.params.host && vdobid.params.adUnitType && (vdobid.params.adUnitId || vdobid.params.adUnitId === 0)); + }, + /** + * Make a server request from the list of BidRequests. + * + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: (vdoValidBidRequests, bidderRequest) => { + let winTop; + try { + winTop = window.top; + winTop.location.toString(); + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)(e); + winTop = window; + } + const placements = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.groupBy)(vdoValidBidRequests.map(bidRequest => vdoBuildPlacement(bidRequest)), 'host'); + return Object.keys(placements).map(host => vdoBuildRequest(winTop, host, placements[host].map(placement => placement.adUnit), bidderRequest)); + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Bid} vdobid The bid that won the auction + */ + onBidWon: vdobid => { + const cpm = vdobid.pbMg; + if (vdobid.nurl !== '') { + vdobid.nurl = vdobid.nurl.replace(/\$\{AUCTION_PRICE\}/, cpm); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax)(vdobid.nurl, null); + } + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} vdoServerResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: (vdoServerResponse, vdoBidRequest) => { + const bidResponses = []; + const serverBody = vdoServerResponse.body; + const len = serverBody.length; + for (let i = 0; i < len; i++) { + const bidResponse = serverBody[i]; + if (vdoIsBidResponseValid(bidResponse)) { + bidResponses.push(bidResponse); + } + } + return bidResponses; + }, + getUserSyncs: (userSyncOptions, vdoServerResponses, userGdprConsent, UserUspConsent) => { + const allIframeSyncs = []; + const allImageSyncs = []; + for (let i = 0; i < vdoServerResponses.length; i++) { + const serverResponseHeaders = vdoServerResponses[i].headers; + const vdoImgSync = serverResponseHeaders != null && userSyncOptions.pixelEnabled ? serverResponseHeaders.get('X-PLL-UserSync-Image') : null; + const vdoIframeSync = serverResponseHeaders != null && userSyncOptions.iframeEnabled ? serverResponseHeaders.get('X-PLL-UserSync-Iframe') : null; + if (vdoIframeSync != null) { + allIframeSyncs.push(vdoIframeSync); + } else if (vdoImgSync != null) { + allImageSyncs.push(vdoImgSync); + } + } + return [allIframeSyncs.filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques).map(it => { + return { + type: 'iframe', + url: it + }; + }), allImageSyncs.filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques).map(it => { + return { + type: 'image', + url: it + }; + })].reduce(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.flatten, []).filter(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.uniques); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +function vdoBuildRequest(windowTop, hostname, vdoAdUnits, bidderRequest) { + return { + url: `https://${hostname}/hb`, + method: 'POST', + data: { + secure: location.protocol === 'https:', + deviceWidth: windowTop.screen.width, + deviceHeight: windowTop.screen.height, + adUnits: vdoAdUnits, + ortb2: bidderRequest?.ortb2, + refererInfo: bidderRequest?.refererInfo, + sua: bidderRequest?.ortb2?.device?.sua, + page: bidderRequest?.ortb2?.site?.page || bidderRequest?.refererInfo?.page + } + }; +} +function vdoBuildPlacement(vdoBidRequest) { + let sizes; + if (vdoBidRequest.mediaTypes) { + switch (vdoBidRequest.params.adUnitType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + if (vdoBidRequest.mediaTypes.banner && vdoBidRequest.mediaTypes.banner.sizes) { + sizes = vdoBidRequest.mediaTypes.banner.sizes; + } + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + if (vdoBidRequest.mediaTypes.video && vdoBidRequest.mediaTypes.video.playerSize) { + sizes = [vdoBidRequest.mediaTypes.video.playerSize]; + } + break; + } + } + sizes = (sizes || []).concat(vdoBidRequest.sizes || []); + return { + host: vdoBidRequest.params.host, + adUnit: { + id: vdoBidRequest.params.adUnitId, + bidId: vdoBidRequest.bidId, + transactionId: vdoBidRequest.ortb2Imp?.ext?.tid, + sizes: sizes.map(size => { + return { + width: size[0], + height: size[1] + }; + }), + type: vdoBidRequest.params.adUnitType.toUpperCase(), + ortb2Imp: vdoBidRequest.ortb2Imp, + publisherId: vdoBidRequest.params.publisherId, + userIdAsEids: vdoBidRequest.userIdAsEids, + supplyChain: vdoBidRequest.schain, + custom1: vdoBidRequest.params.custom1, + custom2: vdoBidRequest.params.custom2, + custom3: vdoBidRequest.params.custom3, + custom4: vdoBidRequest.params.custom4, + custom5: vdoBidRequest.params.custom5 + } + }; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('vdoaiBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vdoaiBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["ventesBidAdapter"],{ + +/***/ "./modules/ventesBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/ventesBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/appnexusUtils/anUtils.js */ "./libraries/appnexusUtils/anUtils.js"); + + + + + + + +const BID_METHOD = 'POST'; +const BIDDER_URL = 'https://ad.ventesavenues.in/va/ad'; +function groupBy(values, key) { + const groups = values.reduce((acc, value) => { + const groupId = value[key]; + if (!acc[groupId]) acc[groupId] = []; + acc[groupId].push(value); + return acc; + }, {}); + return Object.keys(groups).map(id => ({ + id, + key, + values: groups[id] + })); +} +function validateMediaTypes(mediaTypes, allowedMediaTypes) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(mediaTypes)) return false; + if (!allowedMediaTypes.some(mediaType => mediaType in mediaTypes)) return false; + if (isBanner(mediaTypes)) { + if (!validateBanner(mediaTypes.banner)) return false; + } + return true; +} +function isBanner(mediaTypes) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(mediaTypes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(mediaTypes.banner); +} +function validateBanner(banner) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(banner) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(banner.sizes) && banner.sizes.length > 0 && banner.sizes.every(validateMediaSizes); +} +function validateMediaSizes(mediaSize) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(mediaSize) && mediaSize.length === 2 && mediaSize.every(size => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(size) && size >= 0); +} +function hasUserInfo(bid) { + return !!bid.params.user; +} +function validateParameters(parameters) { + if (!parameters.placementId) { + return false; + } + if (!parameters.publisherId) { + return false; + } + return true; +} +function generateSiteFromAdUnitContext(bidRequests, adUnitContext) { + if (!adUnitContext || !adUnitContext.refererInfo) return null; + const domain = adUnitContext.refererInfo.domain; + const publisherId = bidRequests[0].params.publisherId; + if (!domain) return null; + return { + page: adUnitContext.refererInfo.page, + domain: domain, + name: domain, + publisher: { + id: publisherId + } + }; +} +function validateServerRequest(serverRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(serverRequest) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(serverRequest.data) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(serverRequest.data.imp); +} +function createServerRequestFromAdUnits(adUnits, bidRequestId, adUnitContext) { + return { + method: BID_METHOD, + url: BIDDER_URL, + data: generateBidRequestsFromAdUnits(adUnits, bidRequestId, adUnitContext), + options: { + contentType: 'application/json', + withCredentials: false + } + }; +} +function generateBidRequestsFromAdUnits(bidRequests, bidRequestId, adUnitContext) { + const userObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(bidRequests, hasUserInfo); + let userObj = {}; + if (userObjBid) { + Object.keys(userObjBid.params.user).forEach(param => { + let uparam = (0,_libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_2__.convertCamelToUnderscore)(param); + if (param === 'segments' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(userObjBid.params.user[param])) { + let segs = []; + userObjBid.params.user[param].forEach(val => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(val)) { + segs.push({ + 'id': val + }); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(val)) { + segs.push(val); + } + }); + userObj[uparam] = segs; + } else if (param !== 'segments') { + userObj[uparam] = userObjBid.params.user[param]; + } + }); + } + const deviceObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(bidRequests, hasDeviceInfo); + let deviceObj; + if (deviceObjBid && deviceObjBid.params && deviceObjBid.params.device) { + deviceObj = {}; + Object.keys(deviceObjBid.params.device).forEach(param => deviceObj[param] = deviceObjBid.params.device[param]); + if (!deviceObjBid.hasOwnProperty('ua')) { + deviceObj.ua = navigator.userAgent; + } + if (!deviceObjBid.hasOwnProperty('language')) { + deviceObj.language = navigator.language; + } + } else { + deviceObj = {}; + deviceObj.ua = navigator.userAgent; + deviceObj.language = navigator.language; + } + const payload = {}; + payload.id = bidRequestId; + payload.at = 1; + payload.cur = ['USD']; + payload.imp = bidRequests.reduce(generateImpressionsFromAdUnit, []); + const appDeviceObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(bidRequests, hasAppInfo); + if (!appDeviceObjBid) { + payload.site = generateSiteFromAdUnitContext(bidRequests, adUnitContext); + } else { + let appIdObj; + if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) { + appIdObj = {}; + Object.keys(appDeviceObjBid.params.app).forEach(param => appIdObj[param] = appDeviceObjBid.params.app[param]); + } + payload.app = appIdObj; + } + payload.device = deviceObj; + payload.user = userObj; + return payload; +} +function generateImpressionsFromAdUnit(acc, adUnit) { + const { + bidId, + mediaTypes, + params + } = adUnit; + const { + placementId + } = params; + const pmp = {}; + if (placementId) pmp.deals = [{ + id: placementId + }]; + const imps = Object.keys(mediaTypes).reduce((acc, mediaType) => { + const data = mediaTypes[mediaType]; + const impId = `${bidId}`; + if (mediaType === 'banner') return acc.concat(generateBannerFromAdUnit(impId, data, params)); + }, []); + return acc.concat(imps); +} +function generateBannerFromAdUnit(impId, data, params) { + const { + position, + placementId + } = params; + const pos = position || 0; + const pmp = {}; + const ext = { + placementId + }; + if (placementId) pmp.deals = [{ + id: placementId + }]; + return data.sizes.map(_ref => { + let [w, h] = _ref; + return { + id: `${impId}`, + banner: { + format: [{ + w, + h + }], + w, + h, + pos + }, + pmp, + ext, + tagid: placementId + }; + }); +} +function validateServerResponse(serverResponse) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(serverResponse) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(serverResponse.body) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(serverResponse.body.cur) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(serverResponse.body.seatbid); +} +function seatBidsToAds(seatBid, bidResponse, serverRequest) { + return seatBid.bid.filter(bid => validateBids(bid)).map(bid => generateAdFromBid(bid, bidResponse)); +} +function validateBids(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(bid)) return false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(bid.impid)) return false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(bid.crid)) return false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.price)) return false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.w)) return false; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.h)) return false; + if (!bid.adm) return false; + if (bid.adm) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(bid.adm)) return false; + } + return true; +} +function getMediaType(adm) { + const videoRegex = new RegExp(/VAST\s+version/); + if (videoRegex.test(adm)) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + } + const markup = safeJSONparse(adm.replace(/\\/g, '')); + if (markup && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(markup.native)) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.NATIVE; + } + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; +} +function safeJSONparse() { + try { + return JSON.parse(...arguments); + } catch (_) { + return undefined; + } +} +function generateAdFromBid(bid, bidResponse) { + const mediaType = getMediaType(bid.adm); + const base = { + requestId: bid.impid, + cpm: bid.price, + currency: bidResponse.cur, + ttl: 10, + creativeId: bid.crid, + mediaType: mediaType, + netRevenue: true + }; + if (bid.adomain) { + base.meta = { + advertiserDomains: bid.adomain + }; + } + const size = getSizeFromBid(bid); + const creative = getCreativeFromBid(bid); + return { + ...base, + height: size.height, + width: size.width, + ad: creative.markup, + adUrl: creative.markupUrl, + renderer: creative.renderer + }; +} +function getSizeFromBid(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.w) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(bid.h)) { + return { + width: bid.w, + height: bid.h + }; + } + return { + width: null, + height: null + }; +} +function getCreativeFromBid(bid) { + const shouldUseAdMarkup = !!bid.adm; + const price = bid.price; + return { + markup: shouldUseAdMarkup ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.replaceAuctionPrice)(bid.adm, price) : null, + markupUrl: !shouldUseAdMarkup ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.replaceAuctionPrice)(bid.nurl, price) : null + }; +} +function hasDeviceInfo(bid) { + if (bid.params) { + return !!bid.params.device; + } +} +function hasAppInfo(bid) { + if (bid.params) { + return !!bid.params.app; + } +} +const venavenBidderSpec = { + code: 'ventes', + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER], + isBidRequestValid(adUnit) { + const allowedBidderCodes = [this.code]; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(adUnit) && allowedBidderCodes.indexOf(adUnit.bidder) !== -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(adUnit.adUnitCode) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(adUnit.bidderRequestId) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(adUnit.bidId) && validateMediaTypes(adUnit.mediaTypes, this.supportedMediaTypes) && validateParameters(adUnit.params); + }, + buildRequests(bidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + bidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_4__.convertOrtbRequestToProprietaryNative)(bidRequests); + if (!bidRequests) return null; + return groupBy(bidRequests, 'bidderRequestId').map(group => { + const bidRequestId = group.id; + const adUnits = groupBy(group.values, 'bidId').map(group => { + const length = group.values.length; + return length > 0 && group.values[length - 1]; + }); + return createServerRequestFromAdUnits(adUnits, bidRequestId, bidderRequest); + }); + }, + interpretResponse(serverResponse, serverRequest) { + if (!validateServerRequest(serverRequest)) return []; + if (!validateServerResponse(serverResponse)) return []; + const bidResponse = serverResponse.body; + return bidResponse.seatbid.filter(seatBid => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(seatBid) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(seatBid.bid)).reduce((acc, seatBid) => acc.concat(seatBidsToAds(seatBid, bidResponse, serverRequest)), []); + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(venavenBidderSpec); + +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('ventesBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["appnexusUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/ventesBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["verizonMediaIdSystem"],{ + +/***/ "./modules/verizonMediaIdSystem.js": +/*!*****************************************!*\ + !*** ./modules/verizonMediaIdSystem.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export verizonMediaIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + +/** + * This module adds verizonMediaId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/verizonMediaIdSystem + * @requires module:modules/userId + */ + + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + * @typedef {import('../modules/userId/index.js').ConsentData} ConsentData + * @typedef {import('../modules/userId/index.js').IdResponse} IdResponse + */ + +const MODULE_NAME = 'verizonMediaId'; +const VENDOR_ID = 25; +const PLACEHOLDER = '__PIXEL_ID__'; +const VMCID_ENDPOINT = `https://ups.analytics.yahoo.com/ups/${PLACEHOLDER}/fed`; +function isEUConsentRequired(consentData) { + return !!(consentData && consentData.gdpr && consentData.gdpr.gdprApplies); +} + +/** @type {Submodule} */ +const verizonMediaIdSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: MODULE_NAME, + /** + * Vendor id of Verizon Media EMEA Limited + * @type {Number} + */ + gvlid: VENDOR_ID, + /** + * decode the stored id value for passing to bid requests + * @function + * @returns {{connectid: string} | undefined} + */ + decode(value) { + return typeof value === 'object' && (value.connectid || value.vmuid) ? { + connectid: value.connectid || value.vmuid + } : undefined; + }, + /** + * Gets the Verizon Media Connect ID + * @function + * @param {SubmoduleConfig} [config] + * @param {ConsentData} [consentData] + * @returns {IdResponse|undefined} + */ + getId(config, consentData) { + const params = config.params || {}; + if (!params || typeof params.he !== 'string' || typeof params.pixelId === 'undefined' && typeof params.endpoint === 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('The verizonMediaId submodule requires the \'he\' and \'pixelId\' parameters to be defined.'); + return; + } + const data = { + '1p': (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.includes)([1, '1', true], params['1p']) ? '1' : '0', + he: params.he, + gdpr: isEUConsentRequired(consentData) ? '1' : '0', + gdpr_consent: isEUConsentRequired(consentData) ? consentData.gdpr.consentString : '', + us_privacy: consentData && consentData.usp ? consentData.usp : '' + }; + if (params.pixelId) { + data.pixelId = params.pixelId; + } + const resp = function (callback) { + const callbacks = { + success: response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(error); + } + } + callback(responseObj); + }, + error: error => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(`${MODULE_NAME}: ID fetch encountered an error`, error); + callback(); + } + }; + const endpoint = VMCID_ENDPOINT.replace(PLACEHOLDER, params.pixelId); + let url = `${params.endpoint || endpoint}?${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatQS)(data)}`; + verizonMediaIdSubmodule.getAjaxFn()(url, callbacks, null, { + method: 'GET', + withCredentials: true + }); + }; + return { + callback: resp + }; + }, + /** + * Return the function used to perform XHR calls. + * Utilised for each of testing. + * @returns {Function} + */ + getAjaxFn() { + return _src_ajax_js__WEBPACK_IMPORTED_MODULE_2__.ajax; + }, + eids: { + 'connectid': { + source: 'verizonmedia.com', + atype: 3 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', verizonMediaIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('verizonMediaIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/verizonMediaIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["viantOrtbBidAdapter"],{ + +/***/ "./modules/viantOrtbBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/viantOrtbBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'viant'; +const ENDPOINT = 'https://bidders-us.adelphic.net/d/rtb/v25/prebid/bidder'; +const ADAPTER_VERSION = '2.0.0'; +const DEFAULT_BID_TTL = 300; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: function (bid) { + if (bid && typeof bid.params !== 'object') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE + ': params is not defined or is incorrect in the bidder settings.'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('publisherId', bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(BIDDER_CODE + ': publisherId is not present in bidder params.'); + return false; + } + const mediaTypesBanner = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner'); + const mediaTypesVideo = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); + const mediaTypesNative = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.native'); + if (!mediaTypesBanner && !mediaTypesVideo && !mediaTypesNative) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn(BIDDER_CODE + ': one of mediaTypes.banner or mediaTypes.video or mediaTypes.native must be passed'); + return false; + } + return true; + }, + buildRequests, + interpretResponse(response, request) { + if (!response.body) { + response.body = { + nbr: 0 + }; + } + const bids = converter.fromORTB({ + request: request.data, + response: response.body + }).bids; + return bids; + }, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction + * @param {Bid} bid The bid that won the auction + */ + onBidWon: function (bid) { + if (bid.burl) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(bid.burl); + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice(bid.burl, bid.originalCpm || bid.cpm)); + } else if (bid.nurl) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(bid.nurl); + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel(_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.replaceAuctionPrice(bid.nurl, bid.originalCpm || bid.cpm)); + } + } +}; +function buildRequests(bids, bidderRequest) { + let videoBids = bids.filter(bid => isVideoBid(bid)); + let bannerBids = bids.filter(bid => isBannerBid(bid)); + let nativeBids = bids.filter(bid => isNativeBid(bid)); + let requests = bannerBids.length ? [createRequest(bannerBids, bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER)] : []; + videoBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO)); + }); + nativeBids.forEach(bid => { + requests.push(createRequest([bid], bidderRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE)); + }); + return requests; +} +function createRequest(bidRequests, bidderRequest, mediaType) { + const data = converter.toORTB({ + bidRequests, + bidderRequest, + context: { + mediaType + } + }); + if (bidderRequest.gdprConsent && typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { + if (!data.regs) data.regs = {}; + if (!data.regs.ext) data.regs.ext = {}; + data.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0; + } + if (bidderRequest.uspConsent) { + if (!data.regs) data.regs = {}; + if (!data.regs.ext) data.regs.ext = {}; + data.regs.ext.us_privacy = bidderRequest.uspConsent; + } + let imp = data.imp || []; + let dealsMap = new Map(); + if (bidderRequest.bids) { + bidderRequest.bids.forEach(bid => { + if (bid.ortb2Imp && bid.ortb2Imp.pmp) { + dealsMap.set(bid.bidId, bid.ortb2Imp.pmp); + } + }); + } + imp.forEach(element => { + let deals = dealsMap.get(element.id); + if (deals) { + element.pmp = deals; + } + }); + data.ext = data.ext || {}; + data.ext.viant = { + adapterVersion: ADAPTER_VERSION + }; + return { + method: 'POST', + url: ENDPOINT, + data: data + }; +} +function isVideoBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.video'); +} +function isBannerBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.banner'); +} +function isNativeBid(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'mediaTypes.native'); +} +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_3__.ortbConverter)({ + context: { + netRevenue: DEFAULT_NET_REVENUE, + ttl: DEFAULT_BID_TTL, + currency: DEFAULT_CURRENCY + } +}); +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('viantOrtbBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/viantOrtbBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vibrantmediaBidAdapter"],{ + +/***/ "./modules/vibrantmediaBidAdapter.js": +/*!*******************************************!*\ + !*** ./modules/vibrantmediaBidAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); + + +/* + * Vibrant Media Ltd. + * + * Prebid Adapter for sending bid requests to the prebid server and bid responses back to the client + * + * Note: Only BANNER and VIDEO are currently supported by the prebid server. + */ + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'vibrantmedia'; +const VIBRANT_MEDIA_PREBID_URL = 'https://prebid.intellitxt.com/prebid'; +const VALID_PIXEL_URL_REGEX = /^https?:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+([/?].*)?$/; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; + +/** + * Returns whether the given bid request contains at least one supported media request, which has valid data. (We can + * ignore invalid/unsupported ones, as they will be filtered out by the prebid server.) + * + * @param {*} bidRequest the bid requests sent by the Prebid API. + * + * @return {boolean} true if the given bid request contains at least one supported media request with valid details, + * otherwise false. + */ +const areValidSupportedMediaTypesPresent = function (bidRequest) { + const mediaTypes = Object.keys(bidRequest.mediaTypes); + return mediaTypes.some(function (mediaType) { + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER) { + return true; + } else if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + return bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO].context === _src_video_js__WEBPACK_IMPORTED_MODULE_1__.OUTSTREAM; + } else if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE) { + return !!bidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE].image; + } + return false; + }); +}; + +/** + * Returns whether the given URL contains just a domain, and not (for example) a subdirectory or query parameters. + * @param {string} url the URL to check. + * @returns {boolean} whether the URL contains just a domain. + */ +const isBaseUrl = function (url) { + const urlMinusScheme = url.substring(url.indexOf('://') + 3); + const endOfDomain = urlMinusScheme.indexOf('/'); + return endOfDomain === -1 || endOfDomain === urlMinusScheme.length - 1; +}; +const isValidPixelUrl = function (candidateUrl) { + return VALID_PIXEL_URL_REGEX.test(candidateUrl); +}; + +/** + * Returns transformed bid requests that are in a format native to the prebid server. + * + * @param {*[]} bidRequests the bid requests sent by the Prebid API. + * + * @returns {*[]} the transformed bid requests. + */ +const transformBidRequests = function (bidRequests) { + const transformedBidRequests = []; + bidRequests.forEach(function (bidRequest) { + const params = bidRequest.params || {}; + const transformedBidRequest = { + code: bidRequest.adUnitCode || bidRequest.code, + id: bidRequest.placementId || params.placementId || params.invCode, + requestId: bidRequest.bidId, + bidder: bidRequest.bidder, + mediaTypes: bidRequest.mediaTypes, + bids: bidRequest.bids, + sizes: bidRequest.sizes + }; + transformedBidRequests.push(transformedBidRequest); + }); + return transformedBidRequests; +}; + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + /** + * Determines whether or not the given bid request is valid. For all bid requests passed to the buildRequests + * function, each will have been passed to this function and this function will have returned true. + * + * @param {object} bid the bid params to validate. + * + * @return {boolean} true if this is a valid bid, otherwise false. + * @see SUPPORTED_MEDIA_TYPES + */ + isBidRequestValid: function (bid) { + const areBidRequestParamsValid = !!(bid.params.placementId || bid.params.member && bid.params.invCode); + return areBidRequestParamsValid && areValidSupportedMediaTypesPresent(bid); + }, + /** + * Return a prebid server request from the list of bid requests. + * + * @param {BidRequest[]} validBidRequests an array of bids validated via the isBidRequestValid function. + * @param {BidderRequest} bidderRequest an object with data common to all bid requests. + * + * @return ServerRequest Info describing the request to the prebid server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const transformedBidRequests = transformBidRequests(validBidRequests); + var url = window.parent.location.href; + if (window.self === window.top && (!url || url.substr(0, 4) !== 'http' || isBaseUrl(url))) { + url = document.URL; + } + url = encodeURIComponent(url); + const prebidData = { + url, + gdpr: bidderRequest.gdprConsent, + usp: bidderRequest.uspConsent, + window: { + width: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)().innerWidth, + height: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)().innerHeight + }, + biddata: transformedBidRequests + }; + return { + method: 'POST', + url: VIBRANT_MEDIA_PREBID_URL, + data: JSON.stringify(prebidData) + }; + }, + /** + * Translate the Kormorant prebid server response into a list of bids. + * + * @param {ServerResponse} serverResponse a successful response from the prebid server. + * @param {BidRequest} bidRequest the original bid request associated with this response. + * + * @return {Bid[]} an array of bids returned by the prebid server, translated into the expected Prebid.js format. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bids = serverResponse.body; + bids.forEach(function (bid) { + bid.adResponse = serverResponse; + }); + return bids; + }, + /** + * Called if the Prebid API gives up waiting for a prebid server response. + * + * Example timeout data: + * + * [{ + * "bidder": "example", + * "bidId": "51ef8751f9aead", + * "params": { + * ... + * }, + * "adUnitCode": "div-gpt-ad-1460505748561-0", + * "timeout": 3000, + * "auctionId": "18fd8b8b0bd757" + * }] + * + * @param {{}} timeoutData data relating to the timeout. + */ + onTimeout: function (timeoutData) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logError)('Timed out waiting for bids: ' + JSON.stringify(timeoutData)); + }, + /** + * Called when a bid returned by the prebid server is successful. + * + * Example bid won data: + * + * { + * "bidder": "example", + * "width": 300, + * "height": 250, + * "adId": "330a22bdea4cac", + * "mediaType": "banner", + * "cpm": 0.28 + * "ad": "...", + * "requestId": "418b37f85e772c", + * "adUnitCode": "div-gpt-ad-1460505748561-0", + * "size": "350x250", + * "adserverTargeting": { + * "hb_bidder": "example", + * "hb_adid": "330a22bdea4cac", + * "hb_pb": "0.20", + * "hb_size": "350x250" + * } + * } + * + * @param {*} bidData the data associated with the won bid. See example above for data format. + */ + onBidWon: function (bidData) { + if (bidData && bidData.meta && isValidPixelUrl(bidData.meta.wp)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(`${bidData.meta.wp}${bidData.status}`); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('vibrantmediaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vibrantmediaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vidazooBidAdapter"],{ + +/***/ "./modules/vidazooBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/vidazooBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, webSessionId, createDomain, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/vidazooUtils/bidderUtils.js */ "./libraries/vidazooUtils/bidderUtils.js"); +/* harmony import */ var _libraries_vidazooUtils_constants_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/vidazooUtils/constants.js */ "./libraries/vidazooUtils/constants.js"); + + + + + + +const GVLID = 744; +const DEFAULT_SUB_DOMAIN = 'prebid'; +const BIDDER_CODE = 'vidazoo'; +const BIDDER_VERSION = '1.0.0'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const webSessionId = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createSessionId)(); +function createDomain() { + let subDomain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SUB_DOMAIN; + return `https://${subDomain}.cootlogix.com`; +} +function createUniqueRequestData(hashUrl) { + const dealId = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getNextDealId)(storage, hashUrl); + const sessionId = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getVidazooSessionId)(storage); + const ptrace = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getCacheOpt)(storage, _libraries_vidazooUtils_constants_js__WEBPACK_IMPORTED_MODULE_2__.OPT_CACHE_KEY); + const vdzhum = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getCacheOpt)(storage, _libraries_vidazooUtils_constants_js__WEBPACK_IMPORTED_MODULE_2__.OPT_TIME_KEY); + return { + dealId: dealId, + sessionId: sessionId, + ptrace: ptrace, + vdzhum: vdzhum, + webSessionId: webSessionId + }; +} +const buildRequests = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createBuildRequestsFn)(createDomain, createUniqueRequestData, storage, BIDDER_CODE, BIDDER_VERSION, true); +const interpretResponse = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createInterpretResponseFn)(BIDDER_CODE, true); +const getUserSyncs = (0,_libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.createUserSyncGetter)({ + iframeSyncUrl: 'https://sync.cootlogix.com/api/sync/iframe', + imageSyncUrl: 'https://sync.cootlogix.com/api/sync/image' +}); +const spec = { + code: BIDDER_CODE, + version: BIDDER_VERSION, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + isBidRequestValid: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests, + interpretResponse, + getUserSyncs, + onBidWon: _libraries_vidazooUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.onBidWon +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('vidazooBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk","vidazooUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vidazooBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["videoModule"],{ + +/***/ "./modules/videoModule/adQueue.js": +/*!****************************************!*\ + !*** ./modules/videoModule/adQueue.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ AdQueueCoordinator: () => (/* binding */ AdQueueCoordinator) +/* harmony export */ }); +/* harmony import */ var _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/video/constants/events.js */ "./libraries/video/constants/events.js"); +/* harmony import */ var _libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../libraries/video/shared/helpers.js */ "./libraries/video/shared/helpers.js"); + + +function AdQueueCoordinator(videoCore, pbEvents) { + const storage = {}; + function registerProvider(divId) { + storage[divId] = []; + videoCore.onEvents([_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_COMPLETE], onSetupComplete, divId); + } + function queueAd(adTagUrl, divId) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const queue = storage[divId]; + if (queue) { + queue.push({ + adTagUrl, + options + }); + triggerEvent(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_QUEUED, adTagUrl, options); + } else { + loadAd(divId, adTagUrl, options); + } + } + return { + registerProvider, + queueAd + }; + function onSetupComplete(eventName, eventPayload) { + const divId = eventPayload.divId; + videoCore.offEvents([_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_COMPLETE], onSetupComplete, divId); + loadQueuedAd(divId); + } + function onAdBreakEnd(eventName, eventPayload) { + loadQueuedAd(eventPayload.divId); + } + function loadQueuedAd(divId) { + videoCore.offEvents([_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_BREAK_END], onAdBreakEnd, divId); + const adQueue = storage[divId]; + if (!adQueue) { + return; + } + if (!adQueue.length) { + delete storage[divId]; + return; + } + const queuedAd = adQueue.shift(); + videoCore.onEvents([_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_BREAK_END], onAdBreakEnd, divId); + loadAd(divId, queuedAd.adTagUrl, queuedAd.options); + } + function loadAd(divId, adTagUrl, options) { + triggerEvent(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_ATTEMPT, adTagUrl, options); + if (options.prefetchedVastXml) { + videoCore.setAdXml(options.prefetchedVastXml, divId, options); + } else { + videoCore.setAdTagUrl(adTagUrl, divId, options); + } + } + function triggerEvent(eventName, adTagUrl, options) { + const payload = Object.assign({ + adTagUrl + }, options); + pbEvents.emit((0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_1__.getExternalVideoEventName)(eventName), (0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_1__.getExternalVideoEventPayload)(eventName, payload)); + } +} + +/***/ }), + +/***/ "./modules/videoModule/coreVideo.js": +/*!******************************************!*\ + !*** ./modules/videoModule/coreVideo.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ videoCoreFactory: () => (/* binding */ videoCoreFactory) +/* harmony export */ }); +/* unused harmony export VideoCore */ +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _libraries_video_shared_parentModule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/video/shared/parentModule.js */ "./libraries/video/shared/parentModule.js"); + + + +// define, ortb object, events + +/** + * Video Provider Submodule interface. All submodules of the Core Video module must adhere to this. + * @description attached to a video player instance. + * @typedef {Object} VideoProvider + * @function init - Instantiates the Video Provider and the video player, if not already instantiated. + * @function getId - retrieves the div id (unique identifier) of the attached player instance. + * @function getOrtbVideo - retrieves the oRTB Video params for a player's current video session. + * @function getOrtbContent - retrieves the oRTB Content params for a player's current video session. + * @function setAdTagUrl - Requests that a player render the ad in the provided ad tag url. + * @function onEvent - attaches an event listener to the player instance. + * @function offEvent - removes event listener to the player instance. + * @function destroy - deallocates the player instance + */ + +/** + * @function VideoProvider#init + */ + +/** + * @function VideoProvider#getId + * @returns {string} + */ + +/** + * @function VideoProvider#getOrtbVideo + * @returns {Object} + */ + +/** + * @function VideoProvider#getOrtbContent + * @returns {Object} + */ + +/** + * @function VideoProvider#setAdTagUrl + * @param {string} adTagUrl - URL to a VAST ad tag + * @param {Object} options - Optional params + */ + +/** + * @function VideoProvider#onEvent + * @param {string} event - name of event for which the listener should be added + * @param {function} callback - function that will get called when the event is triggered + * @param {Object} basePayload - Base payload for every event; includes common parameters such as divId and type. Event payload should be built on top of this. + */ + +/** + * @function VideoProvider#offEvent + * @param {string} event - name of event for which the attached listener should be removed + * @param {function} callback - function that was assigned as a callback when the listener was added + */ + +/** + * @function VideoProvider#destroy + */ + +/** + * @typedef {Object} videoProviderConfig + * @name videoProviderConfig + * @summary contains data indicating which submodule to create and which player instance to attach it to + * @property {string} divId - unique identifier of the player instance + * @property {number} vendorCode - numeric identifier of the Video Provider type i.e. video.js or jwplayer + * @property {playerConfig} playerConfig + */ + +/** + * @typedef {Object} playerConfig + * @name playerConfig + * @summary contains data indicating the behavior the player instance should have + * @property {boolean} autoStart - determines if the player should start automatically when instantiated + * @property {boolean} mute - determines if the player should be muted when instantiated + * @property {string} licenseKey - authentication key required for commercial players. Optional for free players. + * @property {playerVendorParams} params + */ + +/** + * @typedef playerVendorParams + * @name playerVendorParams + * @summary configuration options specific to a Video Vendor's Provider + * @property {Object} vendorConfig - the settings object which can be used as an argument when instantiating a player. Specific to the video player's API. + */ + +/** + * @typedef videoEvent + * + */ + +/** + * Routes commands to the appropriate video submodule. + * @typedef {Object} VideoCore + * @class + * @function registerProvider + * @function getOrtbVideo + * @function getOrtbContent + * @function setAdTagUrl + * @function onEvents + * @function offEvents + */ + +/** + * @summary Maps a Video Provider factory to the video player's vendor code. + */ +const videoVendorDirectory = {}; + +/** + * @class + * @param {ParentModule} parentModule_ + * @returns {VideoCore} + */ +function VideoCore(parentModule_) { + const parentModule = parentModule_; + + /** + * requests that a submodule be instantiated for the specific player instance described by the @providerConfig + * @name VideoCore#registerProvider + * @param {videoProviderConfig} providerConfig + */ + function registerProvider(providerConfig) { + try { + parentModule.registerSubmodule(providerConfig.divId, providerConfig.vendorCode, providerConfig); + } catch (e) {} + } + function initProvider(divId) { + const submodule = parentModule.getSubmodule(divId); + submodule && submodule.init && submodule.init(); + } + + /** + * @name VideoCore#getOrtbVideo + * @summary Obtains the oRTB Video params for a player's current video session. + * @param {string} divId - unique identifier of the player instance + * @returns {Object} oRTB Video params + */ + function getOrtbVideo(divId) { + const submodule = parentModule.getSubmodule(divId); + return submodule && submodule.getOrtbVideo(); + } + + /** + * @name VideoCore#getOrtbContent + * @summary Obtains the oRTB Content params for a player's current video session. + * @param {string} divId - unique identifier of the player instance + * @returns {Object} oRTB Content params + */ + function getOrtbContent(divId) { + const submodule = parentModule.getSubmodule(divId); + return submodule && submodule.getOrtbContent(); + } + + /** + * @name VideoCore#setAdTagUrl + * @summary Requests that a player render the ad in the provided ad tag + * @param {string} adTagUrl - URL to a VAST ad tag + * @param {string} divId - unique identifier of the player instance + * @param {Object} options - additional params + */ + function setAdTagUrl(adTagUrl, divId, options) { + const submodule = parentModule.getSubmodule(divId); + submodule && submodule.setAdTagUrl(adTagUrl, options); + } + + /** + * @name VideoCore#setAdXml + * @summary Requests that a player render the ad in the provided ad tag + * @param {string} vastXml - VAST content in xml format + * @param {string} divId - unique identifier of the player instance + * @param {Object} options - additional params + */ + function setAdXml(vastXml, divId, options) { + const submodule = parentModule.getSubmodule(divId); + submodule && submodule.setAdXml(vastXml, options); + } + + /** + * @name VideoCore#onEvents + * @summary attaches event listeners + * @param {[string]} events - List of event names for which the listener should be added + * @param {function} callback - function that will get called when one of the events is triggered + * @param {string} divId - unique identifier of the player instance + */ + function onEvents(events, callback, divId) { + if (!callback) { + return; + } + const submodule = parentModule.getSubmodule(divId); + if (!submodule) { + return; + } + for (let i = 0; i < events.length; i++) { + const type = events[i]; + const basePayload = { + divId, + type + }; + submodule.onEvent(type, callback, basePayload); + } + } + + /** + * @name VideoCore#offEvents + * @summary removes event listeners + * @param {[string]} events - List of event names for which the listener should be removed + * @param {function} callback - function that was assigned as a callback when the listener was added + * @param {string} divId - unique identifier of the player instance + */ + function offEvents(events, callback, divId) { + const submodule = parentModule.getSubmodule(divId); + if (!submodule) { + return; + } + events.forEach(event => { + submodule.offEvent(event, callback); + }); + } + return { + registerProvider, + initProvider, + getOrtbVideo, + getOrtbContent, + setAdTagUrl, + setAdXml, + onEvents, + offEvents, + hasProviderFor(divId) { + return !!parentModule.getSubmodule(divId); + } + }; +} + +/** + * @function videoCoreFactory + * @summary Factory to create a Video Core instance + * @returns {VideoCore} + */ +function videoCoreFactory() { + const videoSubmoduleBuilder = (0,_libraries_video_shared_parentModule_js__WEBPACK_IMPORTED_MODULE_0__.SubmoduleBuilder)(videoVendorDirectory); + const parentModule = (0,_libraries_video_shared_parentModule_js__WEBPACK_IMPORTED_MODULE_0__.ParentModule)(videoSubmoduleBuilder); + return VideoCore(parentModule); +} +function attachVideoProvider(submoduleFactory) { + videoVendorDirectory[submoduleFactory.vendorCode] = submoduleFactory; +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_1__.module)('video', attachVideoProvider); + +/***/ }), + +/***/ "./modules/videoModule/gamAdServerSubmodule.js": +/*!*****************************************************!*\ + !*** ./modules/videoModule/gamAdServerSubmodule.js ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ gamSubmoduleFactory: () => (/* binding */ gamSubmoduleFactory) +/* harmony export */ }); +/* harmony import */ var _libraries_video_constants_vendorCodes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../libraries/video/constants/vendorCodes.js */ "./libraries/video/constants/vendorCodes.js"); +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); + + + +/** + * @class + * @param {Object} dfpModule_ - the DFP ad server module + */ +function GamAdServerProvider(dfpModule_) { + const dfp = dfpModule_; + function getAdTagUrl(adUnit, baseAdTag, params, bid) { + return dfp.buildVideoUrl({ + adUnit: adUnit, + url: baseAdTag, + params, + bid + }); + } + async function getVastXml(adUnit, baseAdTag, params, bid) { + return dfp.getVastXml({ + adUnit: adUnit, + url: baseAdTag, + params, + bid + }); + } + return { + getAdTagUrl, + getVastXml + }; +} +function gamSubmoduleFactory() { + const dfp = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_0__.getGlobal)().adServers.dfp; + const gamProvider = GamAdServerProvider(dfp); + return gamProvider; +} +gamSubmoduleFactory.vendorCode = _libraries_video_constants_vendorCodes_js__WEBPACK_IMPORTED_MODULE_1__.GAM_VENDOR; + +/***/ }), + +/***/ "./modules/videoModule/index.js": +/*!**************************************!*\ + !*** ./modules/videoModule/index.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PbVideo, pbVideoFactory */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/events.js */ "./src/events.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/video/constants/events.js */ "./libraries/video/constants/events.js"); +/* harmony import */ var _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../libraries/video/constants/ortb.js */ "./libraries/video/constants/ortb.js"); +/* harmony import */ var _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../libraries/video/constants/constants.js */ "./libraries/video/constants/constants.js"); +/* harmony import */ var _coreVideo_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./coreVideo.js */ "./modules/videoModule/coreVideo.js"); +/* harmony import */ var _gamAdServerSubmodule_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./gamAdServerSubmodule.js */ "./modules/videoModule/gamAdServerSubmodule.js"); +/* harmony import */ var _videoImpressionVerifier_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./videoImpressionVerifier.js */ "./modules/videoModule/videoImpressionVerifier.js"); +/* harmony import */ var _adQueue_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./adQueue.js */ "./modules/videoModule/adQueue.js"); +/* harmony import */ var _libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../libraries/video/shared/helpers.js */ "./libraries/video/shared/helpers.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../src/auctionManager.js */ "./src/auctionManager.js"); +/* harmony import */ var _src_adRendering_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../src/adRendering.js */ "./src/adRendering.js"); + + + + + + + + + + + + + + + + + + +const allVideoEvents = Object.keys(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.videoEvents).map(eventKey => _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.videoEvents[eventKey]); +_src_events_js__WEBPACK_IMPORTED_MODULE_1__.addEvents(allVideoEvents.concat([_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_ATTEMPT, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_QUEUED, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_ABORT, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.BID_IMPRESSION, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.BID_ERROR]).map(_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventName)); + +/** + * This module adds User Video support to prebid.js + * @module modules/videoModule + */ +function PbVideo(videoCore_, getConfig_, pbGlobal_, pbEvents_, videoEvents_, gamAdServerFactory_, videoImpressionVerifierFactory_, adQueueCoordinator_) { + const videoCore = videoCore_; + const getConfig = getConfig_; + const pbGlobal = pbGlobal_; + const requestBids = pbGlobal.requestBids; + const pbEvents = pbEvents_; + const videoEvents = videoEvents_; + const gamAdServerFactory = gamAdServerFactory_; + const adQueueCoordinator = adQueueCoordinator_; + let gamSubmodule; + let mainContentDivId; + let contentEnrichmentEnabled = true; + const videoImpressionVerifierFactory = videoImpressionVerifierFactory_; + let videoImpressionVerifier; + function init() { + const cache = getConfig('cache'); + videoImpressionVerifier = videoImpressionVerifierFactory(!!cache); + getConfig(_libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_3__.videoKey, _ref => { + let { + video + } = _ref; + video.providers.forEach(provider => { + const divId = provider.divId; + videoCore.registerProvider(provider); + adQueueCoordinator.registerProvider(divId); + videoCore.initProvider(divId); + videoCore.onEvents(videoEvents, (type, payload) => { + pbEvents.emit((0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventName)(type), (0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventPayload)(type, payload)); + }, divId); + const adServerConfig = provider.adServer; + if (!gamSubmodule && adServerConfig) { + gamSubmodule = gamAdServerFactory(); + } + }); + contentEnrichmentEnabled = video.contentEnrichmentEnabled !== false; + mainContentDivId = contentEnrichmentEnabled ? video.mainContentDivId : null; + }); + requestBids.before(beforeBidsRequested, 40); + pbEvents.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.BID_ADJUSTMENT, function (bid) { + videoImpressionVerifier.trackBid(bid); + }); + pbEvents.on((0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventName)(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_IMPRESSION), function (payload) { + triggerVideoBidEvent(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.BID_IMPRESSION, payload); + }); + pbEvents.on((0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventName)(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_ERROR), function (payload) { + triggerVideoBidEvent(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.BID_ERROR, payload); + }); + } + function renderBid(divId, bid) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const adUrl = bid.vastUrl; + options.adXml = bid.vastXml; + options.winner = bid.bidder; + loadAd(adUrl, divId, options); + } + function getOrtbVideo(divId) { + return videoCore.getOrtbVideo(divId); + } + function getOrtbContent(divId) { + return videoCore.getOrtbContent(divId); + } + return { + init, + renderBid, + getOrtbVideo, + getOrtbContent + }; + function beforeBidsRequested(nextFn, bidderRequest) { + logErrorForInvalidDivIds(bidderRequest); + enrichAuction(bidderRequest); + const bidsBackHandler = bidderRequest.bidsBackHandler; + if (!bidsBackHandler || typeof bidsBackHandler !== 'function') { + pbEvents.on(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END, auctionEnd); + } + return nextFn.call(this, bidderRequest); + } + function logErrorForInvalidDivIds(bidderRequest) { + const adUnits = bidderRequest.adUnits || pbGlobal.adUnits || []; + adUnits.forEach(adUnit => { + const video = adUnit.video; + if (!video) { + return; + } + if (!video.divId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`Missing Video player div ID for ad unit '${adUnit.code}'`); + } + if (!videoCore.hasProviderFor(video.divId)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(`Video player div ID '${video.divId}' for ad unit '${adUnit.code}' does not match any registered player`); + } + }); + } + function enrichAuction(bidderRequest) { + if (mainContentDivId) { + enrichOrtb2(mainContentDivId, bidderRequest); + } + const adUnits = bidderRequest.adUnits || pbGlobal.adUnits || []; + adUnits.forEach(adUnit => { + const divId = getDivId(adUnit); + enrichAdUnit(adUnit, divId); + if (contentEnrichmentEnabled && !mainContentDivId) { + enrichOrtb2(divId, bidderRequest); + } + }); + } + function getDivId(adUnit) { + const videoConfig = adUnit.video; + if (!adUnit.mediaTypes.video || !videoConfig) { + return; + } + return videoConfig.divId; + } + function enrichAdUnit(adUnit, videoDivId) { + const ortbVideo = getOrtbVideo(videoDivId); + if (!ortbVideo) { + return; + } + const video = Object.assign({}, ortbVideo, adUnit.mediaTypes.video); + if (!video.context) { + video.context = ortbVideo.placement === _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_6__.PLACEMENT.INSTREAM ? 'instream' : 'outstream'; + } + if (!video.plcmt) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logWarn)('Video.plcmt has not been set. Failure to set a value may result in loss of bids'); + } + const width = ortbVideo.w; + const height = ortbVideo.h; + if (!video.playerSize && width && height) { + video.playerSize = [width, height]; + } + adUnit.mediaTypes.video = video; + } + function enrichOrtb2(divId, bidderRequest) { + const ortbContent = getOrtbContent(divId); + if (!ortbContent) { + return; + } + bidderRequest.ortb2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)({}, bidderRequest.ortb2, { + site: { + content: ortbContent + } + }); + } + function auctionEnd(auctionResult) { + auctionResult.adUnits.forEach(adUnit => { + if (adUnit.video) { + renderWinningBid(adUnit); + } + }); + pbEvents.off(_src_constants_js__WEBPACK_IMPORTED_MODULE_4__.EVENTS.AUCTION_END, auctionEnd); + } + function getAdServerConfig(adUnitVideoConfig) { + const globalVideoConfig = getConfig(_libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_3__.videoKey); + const globalProviderConfig = globalVideoConfig.providers.find(provider => provider.divId === adUnitVideoConfig.divId) || {}; + if (!globalVideoConfig.adServer && !globalProviderConfig.adServer && !adUnitVideoConfig.adServer) { + return; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)({}, globalVideoConfig.adServer, globalProviderConfig.adServer, adUnitVideoConfig.adServer); + } + async function renderWinningBid(adUnit) { + const adUnitCode = adUnit.code; + const videoConfig = adUnit.video; + const divId = videoConfig.divId; + const adServerConfig = getAdServerConfig(videoConfig); + const winningBid = getWinningBid(adUnitCode); + const options = { + adUnitCode + }; + async function prefetchVast() { + const gamVastWrapper = await gamSubmodule.getVastXml(adUnit, adServerConfig.baseAdTagUrl, adServerConfig.params, winningBid); + options.prefetchedVastXml = gamVastWrapper; + } + if (adServerConfig) { + if (_src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig('cache.useLocal')) { + await prefetchVast(); + } else { + const adTagUrl = gamSubmodule.getAdTagUrl(adUnit, adServerConfig.baseAdTagUrl, adServerConfig.params); + loadAd(adTagUrl, divId, options); + return; + } + } + renderBid(divId, winningBid, options); + } + function getWinningBid(adUnitCode) { + const highestCpmBids = pbGlobal.getHighestCpmBids(adUnitCode); + if (!highestCpmBids.length) { + pbEvents.emit((0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventName)(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_ABORT), (0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventPayload)(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AUCTION_AD_LOAD_ABORT, { + adUnitCode + })); + return; + } + return highestCpmBids.shift(); + } + function loadAd(adTagUrl, divId, options) { + adQueueCoordinator.queueAd(adTagUrl, divId, options); + } + function triggerVideoBidEvent(eventName, adEventPayload) { + const bid = getBid(adEventPayload); + if (!bid) { + return; + } + pbGlobal.markWinningBidAsUsed(bid); + pbEvents.emit((0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventName)(eventName), (0,_libraries_video_shared_helpers_js__WEBPACK_IMPORTED_MODULE_2__.getExternalVideoEventPayload)(eventName, { + bid, + adEvent: adEventPayload + })); + } + function getBid(adPayload) { + const { + adId, + adTagUrl, + wrapperAdIds + } = adPayload; + const bidIdentifiers = videoImpressionVerifier.getBidIdentifiers(adId, adTagUrl, wrapperAdIds); + if (!bidIdentifiers) { + return; + } + const { + adUnitCode, + requestId, + auctionId + } = bidIdentifiers; + const bidAdId = bidIdentifiers.adId; + const { + bids + } = pbGlobal.getBidResponsesForAdUnitCode(adUnitCode); + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_8__.find)(bids, bid => bid.adId === bidAdId && bid.requestId === requestId && bid.auctionId === auctionId); + } +} +function videoRenderHook(next, args) { + if (args.bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_9__.VIDEO) { + const adUnit = _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_10__.auctionManager.index.getAdUnit(args.bidResponse); + if (adUnit?.video) { + (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.getGlobal)().videoModule.renderBid(adUnit.video.divId, args.bidResponse); + next.bail(); + return; + } + } + next(args); +} +function pbVideoFactory() { + const videoCore = (0,_coreVideo_js__WEBPACK_IMPORTED_MODULE_12__.videoCoreFactory)(); + const adQueueCoordinator = (0,_adQueue_js__WEBPACK_IMPORTED_MODULE_13__.AdQueueCoordinator)(videoCore, _src_events_js__WEBPACK_IMPORTED_MODULE_1__); + const pbGlobal = (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.getGlobal)(); + const pbVideo = PbVideo(videoCore, _src_config_js__WEBPACK_IMPORTED_MODULE_7__.config.getConfig, pbGlobal, _src_events_js__WEBPACK_IMPORTED_MODULE_1__, allVideoEvents, _gamAdServerSubmodule_js__WEBPACK_IMPORTED_MODULE_14__.gamSubmoduleFactory, _videoImpressionVerifier_js__WEBPACK_IMPORTED_MODULE_15__.videoImpressionVerifierFactory, adQueueCoordinator); + pbVideo.init(); + pbGlobal.videoModule = pbVideo; + _src_adRendering_js__WEBPACK_IMPORTED_MODULE_16__.doRender.before(videoRenderHook); + return pbVideo; +} +pbVideoFactory(); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('videoModule'); + +/***/ }), + +/***/ "./modules/videoModule/videoImpressionVerifier.js": +/*!********************************************************!*\ + !*** ./modules/videoModule/videoImpressionVerifier.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ videoImpressionVerifierFactory: () => (/* binding */ videoImpressionVerifierFactory) +/* harmony export */ }); +/* unused harmony exports PB_PREFIX, UUID_MARKER, videoImpressionVerifier, cachedVideoImpressionVerifier, baseImpressionVerifier, tracker */ +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_video_shared_vastXmlEditor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../libraries/video/shared/vastXmlEditor.js */ "./libraries/video/shared/vastXmlEditor.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../src/utils.js */ "./src/utils.js"); + + + +const PB_PREFIX = 'pb_'; +const UUID_MARKER = PB_PREFIX + 'uuid'; + +/** + * Video Impression Verifier interface. All implementations of a Video Impression Verifier must comply with this interface. + * @description adds tracking markers to an ad and extracts the bid identifiers from ad event information. + * @typedef {Object} VideoImpressionVerifier + * @function trackBid - requests that a bid's ad be tracked for impression verification. + * @function getBidIdentifiers - requests information from the ad event data that can be used to match the ad to a tracked bid. + */ + +/** + * @function VideoImpressionVerifier#trackBid + * @param {Object} bid - Bid that should be tracked. + * @return {String} - Identifier for the bid being tracked. + */ + +/** + * @function VideoImpressionVerifier#getBidIdentifiers + * @param {String} adId - In the VAST tag, this value is present in the Ad element's id property. + * @param {String} adTagUrl - The ad tag url that was loaded into the player. + * @param {[String]} adWrapperIds - List of ad id's that were obtained from the different wrappers. Each redirect points to an ad wrapper. + * @return {bidIdentifier} - Object allowing the bid matching the ad event to be identified. + */ + +/** + * @typedef {Object} bidIdentifier + * @property {String} adId - Bid identifier. + * @property {String} adUnitCode - Identifier for the Ad Unit for which the bid was made. + * @property {String} auctionId - Id of the auction in which the bid was made. + * @property {String} requestId - Id of the bid request which resulted in the bid. + */ + +/** + * Factory function for obtaining a Video Impression Verifier. + * @param {Boolean} isCacheUsed - wether Prebid is configured to use a cache. + * @return {VideoImpressionVerifier} + */ +function videoImpressionVerifierFactory(isCacheUsed) { + const vastXmlEditor = (0,_libraries_video_shared_vastXmlEditor_js__WEBPACK_IMPORTED_MODULE_0__.vastXmlEditorFactory)(); + const bidTracker = tracker(); + if (isCacheUsed) { + return cachedVideoImpressionVerifier(vastXmlEditor, bidTracker); + } + return videoImpressionVerifier(vastXmlEditor, bidTracker); +} +function videoImpressionVerifier(vastXmlEditor_, bidTracker_) { + const verifier = baseImpressionVerifier(bidTracker_); + const superTrackBid = verifier.trackBid; + const vastXmlEditor = vastXmlEditor_; + verifier.trackBid = function (bid) { + let { + vastXml, + vastUrl + } = bid; + if (!vastXml && !vastUrl) { + return; + } + const uuid = superTrackBid(bid); + if (vastUrl) { + const url = new URL(vastUrl); + url.searchParams.append(UUID_MARKER, uuid); + bid.vastUrl = url.toString(); + } else if (vastXml) { + bid.vastXml = vastXmlEditor.getVastXmlWithTracking(vastXml, uuid); + } + return uuid; + }; + return verifier; +} +function cachedVideoImpressionVerifier(vastXmlEditor_, bidTracker_) { + const verifier = baseImpressionVerifier(bidTracker_); + const superTrackBid = verifier.trackBid; + const superGetBidIdentifiers = verifier.getBidIdentifiers; + const vastXmlEditor = vastXmlEditor_; + verifier.trackBid = function (bid, globalAdUnits) { + const adIdOverride = superTrackBid(bid); + let { + vastXml, + vastUrl, + adId, + adUnitCode + } = bid; + const adUnit = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.find)(globalAdUnits, adUnit => adUnitCode === adUnit.code); + const videoConfig = adUnit && adUnit.video; + const adServerConfig = videoConfig && videoConfig.adServer; + const trackingConfig = adServerConfig && adServerConfig.tracking; + let impressionUrl; + let impressionId; + let errorUrl; + const impressionTracking = trackingConfig.impression; + const errorTracking = trackingConfig.error; + if (impressionTracking) { + impressionUrl = getTrackingUrl(impressionTracking.getUrl, bid); + impressionId = impressionTracking.id || adId + '-impression'; + } + if (errorTracking) { + errorUrl = getTrackingUrl(errorTracking.getUrl, bid); + } + if (vastXml) { + vastXml = vastXmlEditor.getVastXmlWithTracking(vastXml, adIdOverride, impressionUrl, impressionId, errorUrl); + } else if (vastUrl) { + vastXml = vastXmlEditor.buildVastWrapper(adIdOverride, vastUrl, impressionUrl, impressionId, errorUrl); + } + bid.vastXml = vastXml; + return adIdOverride; + }; + verifier.getBidIdentifiers = function (adId, adTagUrl, adWrapperIds) { + // When the video is cached, the ad tag loaded into the player is a parent wrapper of the cache url. + // As a result, the ad tag Url cannot include identifiers. + return superGetBidIdentifiers(adId, null, adWrapperIds); + }; + return verifier; + function getTrackingUrl(getUrl, bid) { + if (!getUrl || typeof getUrl !== 'function') { + return; + } + return getUrl(bid); + } +} +function baseImpressionVerifier(bidTracker_) { + const bidTracker = bidTracker_; + function trackBid(bid) { + let { + adId, + adUnitCode, + requestId, + auctionId + } = bid; + const trackingId = PB_PREFIX + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(10 ** 13); + bidTracker.store(trackingId, { + adId, + adUnitCode, + requestId, + auctionId + }); + return trackingId; + } + function getBidIdentifiers(adId, adTagUrl, adWrapperIds) { + return bidTracker.remove(adId) || getBidForAdTagUrl(adTagUrl) || getBidForAdWrappers(adWrapperIds); + } + return { + trackBid, + getBidIdentifiers + }; + function getBidForAdTagUrl(adTagUrl) { + if (!adTagUrl) { + return; + } + let url; + try { + url = new URL(adTagUrl); + } catch (e) { + return; + } + const queryParams = url.searchParams; + let uuid = queryParams.get(UUID_MARKER); + return uuid && bidTracker.remove(uuid); + } + function getBidForAdWrappers(adWrapperIds) { + if (!adWrapperIds || !adWrapperIds.length) { + return; + } + for (const wrapperId in adWrapperIds) { + const bidInfo = bidTracker.remove(wrapperId); + if (bidInfo) { + return bidInfo; + } + } + } +} +function tracker() { + const model = {}; + function store(key, value) { + model[key] = value; + } + function remove(key) { + const value = model[key]; + if (!value) { + return; + } + delete model[key]; + return value; + } + return { + store, + remove + }; +} + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["video","xmlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/videoModule/index.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["videobyteBidAdapter"],{ + +/***/ "./modules/videobyteBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/videobyteBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'videobyte'; +const DEFAULT_BID_TTL = 300; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const VIDEO_ORTB_PARAMS = ['mimes', 'minduration', 'maxduration', 'placement', 'plcmt', 'protocols', 'startdelay', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + VERSION: '1.0.0', + ENDPOINT: 'https://x.videobyte.com/ortbhb', + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bidRequest The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bidRequest) { + return validateVideo(bidRequest); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param bidRequests - an array of bid requests + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + if (!bidRequests) { + return; + } + return bidRequests.map(bidRequest => { + const { + params + } = bidRequest; + let pubId = params.pubId; + const placementId = params.placementId; + const nId = params.nid; + if (bidRequest.params.video && bidRequest.params.video.e2etest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('E2E test mode enabled'); + pubId = 'e2etest'; + } + let baseEndpoint = spec.ENDPOINT + '?pid=' + pubId; + if (placementId) { + baseEndpoint += '&placementId=' + placementId; + } + if (nId) { + baseEndpoint += '&nid=' + nId; + } + return { + method: 'POST', + url: baseEndpoint, + data: JSON.stringify(buildRequestData(bidRequest, bidderRequest)) + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse) { + const bidResponses = []; + const response = (serverResponse || {}).body; + // one seat with (optional) bids for each impression + if (response && response.seatbid && response.seatbid.length === 1 && response.seatbid[0].bid && response.seatbid[0].bid.length === 1) { + const bid = response.seatbid[0].bid[0]; + if (bid.adm && bid.price) { + let bidResponse = { + requestId: response.id, + cpm: bid.price, + width: bid.w, + height: bid.h, + ttl: DEFAULT_BID_TTL, + creativeId: bid.crid, + netRevenue: DEFAULT_NET_REVENUE, + currency: DEFAULT_CURRENCY, + mediaType: 'video', + vastXml: bid.adm, + meta: { + advertiserDomains: bid.adomain + } + }; + bidResponses.push(bidResponse); + } + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses) { + let syncs = []; + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return syncs; + } + serverResponses.forEach(resp => { + const userSync = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(resp, 'body.ext.usersync'); + if (userSync) { + let syncDetails = []; + Object.keys(userSync).forEach(key => { + const value = userSync[key]; + if (value.syncs && value.syncs.length) { + syncDetails = syncDetails.concat(value.syncs); + } + }); + syncDetails.forEach(syncDetails => { + syncs.push({ + type: syncDetails.type === 'iframe' ? 'iframe' : 'image', + url: syncDetails.url + }); + }); + + // if iframe is enabled return only iframe (videobyte) + // if iframe is disabled, we can proceed to pixels if any + if (syncOptions.iframeEnabled) { + syncs = syncs.filter(s => s.type === 'iframe'); + } else if (syncOptions.pixelEnabled) { + syncs = syncs.filter(s => s.type === 'image'); + } + } + }); + return syncs; + } +}; + +// BUILD REQUESTS: VIDEO +function buildRequestData(bidRequest, bidderRequest) { + const { + params + } = bidRequest; + const videoAdUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.video', {}); + const videoParams = { + ...videoAdUnit, + ...videoBidderParams // Bidder Specific overrides + }; + if (bidRequest.params.video && bidRequest.params.video.e2etest) { + videoParams.playerSize = [[640, 480]]; + videoParams.conext = 'instream'; + } + const video = { + w: parseInt(videoParams.playerSize[0][0], 10), + h: parseInt(videoParams.playerSize[0][1], 10) + }; + + // Obtain all ORTB params related video from Ad Unit + VIDEO_ORTB_PARAMS.forEach(param => { + if (videoParams.hasOwnProperty(param)) { + video[param] = videoParams[param]; + } + }); + + // bid floor + const bidFloorRequest = { + currency: bidRequest.params.cur || 'USD', + mediaType: 'video', + size: '*' + }; + let floorData = bidRequest.params; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bidRequest.getFloor)) { + floorData = bidRequest.getFloor(bidFloorRequest); + } else { + if (params.bidfloor) { + floorData = { + floor: params.bidfloor, + currency: params.currency || 'USD' + }; + } + } + const openrtbRequest = { + id: bidRequest.bidId, + imp: [{ + id: '1', + video: video, + secure: isSecure() ? 1 : 0, + bidfloor: floorData?.floor, + bidfloorcur: floorData?.currency + }], + site: { + domain: bidderRequest.refererInfo.domain, + page: bidderRequest.refererInfo.page, + ref: bidderRequest.refererInfo.ref + }, + ext: { + hb: 1, + prebidver: "9.45.0-pre", + adapterver: spec.VERSION + } + }; + + // content + if (videoParams.content && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(videoParams.content)) { + openrtbRequest.site.content = {}; + const contentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language', 'url']; + const contentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len']; + const contentArrayKeys = ['cat']; + const contentObjectKeys = ['ext']; + for (const contentKey in videoBidderParams.content) { + if (contentStringKeys.indexOf(contentKey) > -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(videoParams.content[contentKey]) || contentNumberkeys.indexOf(contentKey) > -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(videoParams.content[contentKey]) || contentObjectKeys.indexOf(contentKey) > -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(videoParams.content[contentKey]) || contentArrayKeys.indexOf(contentKey) > -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(videoParams.content[contentKey]) && videoParams.content[contentKey].every(catStr => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(catStr))) { + openrtbRequest.site.content[contentKey] = videoParams.content[contentKey]; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logMessage)('videobyte bid adapter validation error: ', contentKey, ' is either not supported is OpenRTB V2.5 or value is undefined'); + } + } + } + + // adding schain object + if (bidRequest.schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'source.ext.schain', bidRequest.schain); + openrtbRequest.source.ext.schain.nodes[0].rid = openrtbRequest.id; + } + + // Attaching GDPR Consent Params + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openrtbRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + return openrtbRequest; +} +function validateVideo(bidRequest) { + if (!bidRequest.params) { + return false; + } + if (!bidRequest.params.pubId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('failed validation: pubId not declared'); + return false; + } + const videoAdUnit = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video', {}); + const videoBidderParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.video', {}); + if (videoBidderParams && videoBidderParams.e2etest) { + return true; + } + const videoParams = { + ...videoAdUnit, + ...videoBidderParams // Bidder Specific overrides + }; + if (!videoParams.context) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('failed validation: context id not declared'); + return false; + } + if (videoParams.context !== 'instream') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('failed validation: only context instream is supported '); + return false; + } + if (typeof videoParams.playerSize === 'undefined' || !Array.isArray(videoParams.playerSize) || !Array.isArray(videoParams.playerSize[0])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('failed validation: player size not declared or is not in format [[w,h]]'); + return false; + } + return true; +} +function isSecure() { + return document.location.protocol === 'https:'; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('videobyteBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/videobyteBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["videoheroesBidAdapter"],{ + +/***/ "./modules/videoheroesBidAdapter.js": +/*!******************************************!*\ + !*** ./modules/videoheroesBidAdapter.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_braveUtils_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/braveUtils/index.js */ "./libraries/braveUtils/index.js"); +/* harmony import */ var _libraries_braveUtils_buildAndInterpret_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/braveUtils/buildAndInterpret.js */ "./libraries/braveUtils/buildAndInterpret.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'videoheroes'; +const DEFAULT_CUR = 'USD'; +const ENDPOINT_URL = `https://point.contextualadv.com/?t=2&partner=hash`; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: bid => !!(bid.params.placementId && bid.params.placementId.toString().length === 32), + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_braveUtils_buildAndInterpret_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT_URL, DEFAULT_CUR), + interpretResponse: serverResponse => (0,_libraries_braveUtils_buildAndInterpret_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse)(serverResponse, DEFAULT_CUR, _libraries_braveUtils_index_js__WEBPACK_IMPORTED_MODULE_2__.parseNative), + onBidWon: bid => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.isStr)(bid.nurl) && bid.nurl !== '') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.triggerPixel)(bid.nurl); + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('videoheroesBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["braveUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/videoheroesBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["videojsVideoProvider"],{ + +/***/ "./modules/videojsVideoProvider.js": +/*!*****************************************!*\ + !*** ./modules/videojsVideoProvider.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports VideojsProvider, utils, adStateFactory, timeStateFactory */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/video/constants/events.js */ "./libraries/video/constants/events.js"); +/* harmony import */ var _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/video/constants/ortb.js */ "./libraries/video/constants/ortb.js"); +/* harmony import */ var _libraries_video_constants_vendorCodes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/video/constants/vendorCodes.js */ "./libraries/video/constants/vendorCodes.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _libraries_video_shared_state_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/video/shared/state.js */ "./libraries/video/shared/state.js"); +/* harmony import */ var _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../libraries/video/constants/constants.js */ "./libraries/video/constants/constants.js"); +/* harmony import */ var _libraries_video_shared_eventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/video/shared/eventHandler.js */ "./libraries/video/shared/eventHandler.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + +// missing events: , AD_BREAK_START, , AD_BREAK_END, VIEWABLE, BUFFER, CAST, PLAYLIST_COMPLETE, RENDITION_UPDATE, PLAY_ATTEMPT_FAILED, AUTOSTART_BLOCKED + + + + + + + +/** + * @typedef {import('../libraries/video/shared/state.js').State} State + */ + +/* +Plugins of interest: +https://www.npmjs.com/package/videojs-chromecast +https://www.npmjs.com/package/@silvermine/videojs-airplay +https://www.npmjs.com/package/videojs-airplay +https://www.npmjs.com/package/@silvermine/videojs-chromecast +https://www.npmjs.com/package/videojs-ima +https://github.com/googleads/videojs-ima +https://github.com/videojs/videojs-playlist +https://github.com/videojs/videojs-contrib-ads +https://github.com/videojs/videojs-errors +https://github.com/videojs/videojs-overlay +https://github.com/videojs/videojs-playlist-ui + +inspiration: +https://github.com/Conviva/conviva-js-videojs/blob/master/conviva-videojs-module.js + */ + +const setupFailMessage = 'Failed to instantiate the player'; +const AD_MANAGER_EVENTS = [_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_LOADED, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_STARTED, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_IMPRESSION, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_PLAY, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_PAUSE, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_TIME, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_COMPLETE, _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_SKIPPED]; +function VideojsProvider(providerConfig, vjs_, adState_, timeState_, callbackStorage_, utils) { + let vjs = vjs_; + // Supplied callbacks are typically wrapped by handlers + // we use this dict to keep track of these pairings + const callbackToHandler = {}; + const adState = adState_; + const timeState = timeState_; + let player = null; + let playerVersion = null; + let playerIsSetup = false; + const { + playerConfig, + divId + } = providerConfig; + let isMuted; + let previousLastTimePosition = 0; + let lastTimePosition = 0; + let setupCompleteCallbacks = []; + let setupFailedCallbacks = []; + let setupFailedEventHandlers = []; + + // TODO: test with older videojs versions + let minimumSupportedPlayerVersion = '7.17.0'; + function init() { + if (!vjs) { + triggerSetupFailure(-1, setupFailMessage + ': Videojs not present'); + return; + } + playerVersion = vjs.VERSION; + if (playerVersion < minimumSupportedPlayerVersion) { + triggerSetupFailure(-2, setupFailMessage + ': Videojs version not supported'); + return; + } + if (!document.getElementById(divId)) { + triggerSetupFailure(-3, setupFailMessage + ': No div found with id ' + divId); + return; + } + const instantiatedPlayers = vjs.players; + if (instantiatedPlayers && instantiatedPlayers[divId]) { + // already instantiated + player = instantiatedPlayers[divId]; + onReady(); + return; + } + setupPlayer(playerConfig); + if (!player) { + triggerSetupFailure(-4, setupFailMessage); + } + } + function getId() { + return divId; + } + function getOrtbVideo() { + if (!player) { + return; + } + let playBackMethod = _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.PLAYBACK_METHODS.CLICK_TO_PLAY; + // returns a boolean or a string with the autoplay strategy + const autoplay = player.autoplay(); + const muted = player.muted() || autoplay === 'muted'; + // check if autoplay is truthy since it may be a bool or string + if (autoplay) { + playBackMethod = muted ? _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.PLAYBACK_METHODS.AUTOPLAY_MUTED : _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.PLAYBACK_METHODS.AUTOPLAY; + } + const supportedMediaTypes = Object.values(_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO_MIME_TYPE).filter( + // Follows w3 spec https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype + type => player.canPlayType(type) !== ''); + + // IMA supports vpaid unless its expliclty turned off + // TODO: needs a reference to the imaOptions used at setup to determine if vpaid can be used + // if (imaOptions && imaOptions.vpaidMode !== 0) { + supportedMediaTypes.push(_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.VPAID_MIME_TYPE); + // } + + const video = { + mimes: supportedMediaTypes, + // Based on the protocol support provided by the videojs-ima plugin + // https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/compatibility + // Need to check for the plugins + protocols: [_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.PROTOCOLS.VAST_2_0], + api: [_libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.API_FRAMEWORKS.VPAID_2_0 // TODO: needs a reference to the imaOptions used at setup to determine if vpaid can be used + ], + // TODO: Make sure this returns dimensions in DIPS + h: player.currentHeight(), + w: player.currentWidth(), + // TODO: implement startdelay since its reccomend param + // both linearity forms are supported so the param is excluded + // sequence - TODO not yet supported + maxextended: -1, + boxingallowed: 1, + playbackmethod: [playBackMethod], + playbackend: _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.PLAYBACK_END.VIDEO_COMPLETION + // Per ortb 7.4 skip is omitted since neither the player nor ima plugin imposes a skip button, or a skipmin/max + }; + + // TODO: Determine placement may not be in stream if videojs is only used to serve ad content + // ~ Sort of resolved check if the player has a source to tell if the placement is instream + // Still cannot reliably check what type of placement the player is if its outstream + // i.e. we can't tell if its interstitial, in article, etc. + // update: cannot infer instream ever, always need declarations + if (player.src()) { + video.plcmt = _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.PLCMT.ACCOMPANYING_CONTENT; + } + + // Placement according to IQG Guidelines 4.2.8 + // https://cdn2.hubspot.net/hubfs/2848641/TrustworthyAccountabilityGroup_May2017/Docs/TAG-Inventory-Quality-Guidelines-v2_2-10-18-2016.pdf?t=1509469105938 + const findPosition = vjs.dom.findPosition; + if (player.isFullscreen()) { + video.pos = _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.AD_POSITION.FULL_SCREEN; + } else if (findPosition) { + video.pos = utils.getPositionCode(findPosition(player.el())); + } + return video; + } + function getOrtbContent() { + if (!player) { + return; + } + const content = { + // id:, TODO: find a suitable id for videojs sources + url: player.currentSrc() + }; + // Only include length if player is ready + // player.readyState() returns a level of readiness from 0 to 4 + // https://docs.videojs.com/player#readyState + if (player.readyState()) { + content.len = Math.round(player.duration()); + } + const mediaItem = utils.getMedia(player); + if (mediaItem) { + for (let param of ['id', 'title', 'description', 'album', 'artist']) { + if (mediaItem[param]) { + content[param] = mediaItem[param]; + } + } + } + const contentUrl = utils.getValidMediaUrl(mediaItem && mediaItem.src, player.src); + if (contentUrl) { + content.url = contentUrl; + } + return content; + } + + // Plugins to integrate: https://github.com/googleads/videojs-ima + function setAdTagUrl(adTagUrl, options) { + if (!player.ima || !adTagUrl) { + return; + } + + // The VideoJS IMA plugin version 1.11.0 will throw when the ad is empty. + try { + player.ima.changeAdTag(adTagUrl); + player.ima.requestAds(); + } catch (e) { + /* + Handling is not required; ad errors are emitted automatically by video.js + */ + } + } + function setAdXml(vastXml) { + if (!player.ima || !vastXml) { + return; + } + + // The VideoJS IMA plugin version 1.11.0 will throw when the ad is empty. + try { + player.ima.controller.settings.adsResponse = vastXml; + player.ima.requestAds(); + } catch (e) { + /* + Handling is not required; ad errors are emitted automatically by video.js + */ + } + } + function onEvent(type, callback, payload) { + registerSetupListeners(type, callback, payload); + if (!player) { + return; + } + player.ready(() => { + registerListeners(type, callback, payload); + }); + } + function registerSetupListeners(externalEventName, callback, basePayload) { + // no point in registering for setup failures if already setup. + if (playerIsSetup) { + return; + } + if (externalEventName === _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_COMPLETE) { + setupCompleteCallbacks.push(callback); + } else if (externalEventName === _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_FAILED) { + setupFailedCallbacks.push(callback); + registerSetupErrorListener(); + } + } + function registerSetupErrorListener() { + if (!player) { + return; + } + const eventHandler = () => { + /* + Videojs has no specific setup error handler + so we imitate it by hooking to the general error + handler and checking to see if the player has been setup + */ + if (playerIsSetup) { + return; + } + const error = player.error(); + triggerSetupFailure(error.code, error.message, error); + }; + player.on(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.ERROR, eventHandler); + setupFailedEventHandlers.push(eventHandler); + } + function registerListeners(externalEventName, callback, basePayload) { + if (externalEventName === _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.MUTE) { + const eventHandler = () => { + if (isMuted !== player.muted()) { + basePayload.mute = isMuted = !isMuted; + callback(externalEventName, basePayload); + } + }; + player.on(utils.getVideojsEventName(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.VOLUME), eventHandler); + return; + } + let getEventPayload; + switch (externalEventName) { + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAY: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PAUSE: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.DESTROYED: + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAYBACK_REQUEST: + getEventPayload = e => ({ + playReason: 'unknown' + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_REQUEST: + getEventPayload = e => { + const adTagUrl = e.AdsRequest.adTagUrl; + adState.updateState({ + adTagUrl + }); + return { + adTagUrl + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_LOADED: + getEventPayload = e => { + const imaAd = e.getAdData && e.getAdData(); + adState.updateForEvent(imaAd); + timeState.clearState(); + return adState.getState(); + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_STARTED: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_PLAY: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_PAUSE: + getEventPayload = () => adState.getState(); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_IMPRESSION: + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_CLICK: + getEventPayload = () => Object.assign({}, adState.getState(), timeState.getState()); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_TIME: + getEventPayload = e => { + const adTimeEvent = e && e.getAdData && e.getAdData(); + timeState.updateForTimeEvent(adTimeEvent); + return Object.assign({}, adState.getState(), timeState.getState()); + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_COMPLETE: + getEventPayload = () => { + const currentState = adState.getState(); + adState.clearState(); + return currentState; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_SKIPPED: + getEventPayload = () => { + const currentState = Object.assign({}, adState.getState(), timeState.getState()); + adState.clearState(); + return currentState; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_ERROR: + getEventPayload = e => { + const imaAdError = e.data && e.data.AdError; + const extraPayload = Object.assign({ + playerErrorCode: imaAdError.getErrorCode(), + vastErrorCode: imaAdError.getVastErrorCode(), + errorMessage: imaAdError.getMessage(), + sourceError: imaAdError.getInnerError() + // timeout + }, adState.getState(), timeState.getState()); + adState.clearState(); + return extraPayload; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAYLIST: + getEventPayload = e => ({ + playlistItemCount: utils.getPlaylistCount(player), + autostart: player.autoplay() + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.CONTENT_LOADED: + getEventPayload = e => { + const media = utils.getMedia(player); + const contentUrl = utils.getValidMediaUrl(media && media.src, player.src, e && e.target && e.target.currentSrc); + return { + contentId: media && media.id, + contentUrl, + title: media && media.title, + description: media && media.description, + playlistIndex: utils.getCurrentPlaylistIndex(player), + contentTags: media && media.contentTags + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.TIME: + // TODO: might want to check seeking() and/or scrubbing() + getEventPayload = e => { + previousLastTimePosition = lastTimePosition; + const currentTime = player.currentTime(); + const duration = player.duration(); + timeState.updateForTimeEvent({ + currentTime, + duration + }); + lastTimePosition = currentTime; + return { + position: lastTimePosition, + duration + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SEEK_START: + getEventPayload = e => { + return { + position: previousLastTimePosition, + destination: player.currentTime(), + duration: player.duration() + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SEEK_END: + getEventPayload = () => ({ + position: player.currentTime(), + duration: player.duration() + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.VOLUME: + getEventPayload = e => ({ + volumePercentage: player.volume() * 100 + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.ERROR: + getEventPayload = e => { + const error = player.error(); + return { + sourceError: error, + errorCode: error.code, + errorMessage: error.message + }; + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.COMPLETE: + getEventPayload = e => { + previousLastTimePosition = lastTimePosition = 0; + timeState.clearState(); + }; + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.FULLSCREEN: + getEventPayload = e => ({ + fullscreen: player.isFullscreen() + }); + break; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAYER_RESIZE: + getEventPayload = e => ({ + height: player.currentHeight(), + width: player.currentWidth() + }); + break; + default: + return; + } + const eventHandler = (0,_libraries_video_shared_eventHandler_js__WEBPACK_IMPORTED_MODULE_2__.getEventHandler)(externalEventName, callback, basePayload, getEventPayload); + if (externalEventName === _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAYLIST) { + registerPlaylistEventListener(eventHandler); + return; + } + const videojsEventName = utils.getVideojsEventName(externalEventName); + if (AD_MANAGER_EVENTS.includes(externalEventName)) { + player.on('ads-manager', () => player.ima.addEventListener(videojsEventName, eventHandler)); + } else { + player.on(videojsEventName, eventHandler); + } + } + function registerPlaylistEventListener(eventHandler) { + if (player.playlist) { + // force a playlist event on first item load + player.one('loadstart', eventHandler); + player.on('playlistchange', eventHandler); + } else { + // When playlist plugin is not used, treat each media item as a single item playlist + player.on('loadstart', eventHandler); + } + } + function offEvent(event, callback) { + const videojsEvent = utils.getVideojsEventName(event); + if (!callback) { + player.off(videojsEvent); + return; + } + const eventHandler = callbackToHandler[event]; // callbackStorage.getCallback(event, callback); + if (eventHandler) { + player.off(videojsEvent, eventHandler); + } + } + function destroy() { + if (!player) { + return; + } + player.remove(); + player = null; + } + return { + init, + getId, + getOrtbVideo, + getOrtbContent, + setAdTagUrl, + setAdXml, + onEvent, + offEvent, + destroy + }; + function setupPlayer(config) { + const setupConfig = utils.getSetupConfig(config); + player = vjs(divId, setupConfig, onReady); + } + function onReady() { + try { + setupAds(); + } catch (e) { + triggerSetupFailure(-5, e.message); + return; + } + triggerSetupComplete(); + } + + // TODO: consider supporting https://www.npmjs.com/package/videojs-vast-vpaid as well + function setupAds() { + if (!player.ima) { + throw new Error(setupFailMessage + ': ima plugin is missing'); + } + if (typeof player.ima !== 'function') { + // when player.ima is already instantiated, it is an object. Early abort if already instantiated. + return; + } + const adConfig = utils.getAdConfig(playerConfig); + player.ima(adConfig); + } + function triggerSetupFailure(errorCode, msg, sourceError) { + const payload = { + divId, + playerVersion, + type: _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_FAILED, + errorCode, + errorMessage: msg, + sourceError: sourceError + }; + setupFailedCallbacks.forEach(setupFailedCallback => setupFailedCallback(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_FAILED, payload)); + setupFailedCallbacks = []; + } + function triggerSetupComplete() { + playerIsSetup = true; + const payload = { + divId, + playerVersion, + type: _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_COMPLETE + }; + setupCompleteCallbacks.forEach(callback => callback(_libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_COMPLETE, payload)); + setupCompleteCallbacks = []; + isMuted = player.muted(); + setupFailedEventHandlers.forEach(eventHandler => player.off('error', eventHandler)); + setupFailedEventHandlers = []; + } +} +const utils = { + getSetupConfig: function (config) { + if (!config) { + return; + } + const params = config.params || {}; + const videojsConfig = params.vendorConfig || {}; + if (videojsConfig.autostart === undefined && config.autostart !== undefined) { + videojsConfig.autostart = config.autostart; + } + if (videojsConfig.muted === undefined && config.mute !== undefined) { + videojsConfig.muted = config.mute; + } + return videojsConfig; + }, + getAdConfig: function (config) { + const params = config && config.params; + if (!params) { + return {}; + } + return params.adPluginConfig || {}; // TODO: add adPluginConfig to spec + }, + getPositionCode: function (_ref) { + let { + left, + top, + width, + height + } = _ref; + const bottom = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)().innerHeight - top - height; + const right = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.getWinDimensions)().innerWidth - left - width; + if (left < 0 || right < 0 || top < 0) { + return _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.AD_POSITION.UNKNOWN; + } + return bottom >= 0 ? _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.AD_POSITION.ABOVE_THE_FOLD : _libraries_video_constants_ortb_js__WEBPACK_IMPORTED_MODULE_1__.AD_POSITION.BELOW_THE_FOLD; + }, + getVideojsEventName: function (eventName) { + switch (eventName) { + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_COMPLETE: + return 'ready'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SETUP_FAILED: + return 'error'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.DESTROYED: + return 'dispose'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_REQUEST: + return 'ads-request'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_LOADED: + return 'loaded'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_STARTED: + return 'start'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_IMPRESSION: + return 'impression'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_PLAY: + return 'resume'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_PAUSE: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PAUSE; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_TIME: + return 'adProgress'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_CLICK: + return 'click'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_COMPLETE: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.COMPLETE; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_SKIPPED: + return 'skip'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.AD_ERROR: + return 'adserror'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.CONTENT_LOADED: + return 'loadstart'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.ERROR: + return ['error', 'aderror', 'contenterror']; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAY: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAY + 'ing'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAYBACK_REQUEST: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAY; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SEEK_START: + return 'seeking'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.SEEK_END: + return 'seeked'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.TIME: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.TIME + 'update'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.VOLUME: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.VOLUME + 'change'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.MUTE: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.MUTE + 'change'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.PLAYER_RESIZE: + return 'playerresize'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.FULLSCREEN: + return _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.FULLSCREEN + 'change'; + case _libraries_video_constants_events_js__WEBPACK_IMPORTED_MODULE_0__.COMPLETE: + return 'ended'; + default: + return eventName; + } + /* + The following video.js events might map to an event in our spec + 'loadstart', + 'progress', buffer load ? + 'suspend', + 'abort', + 'error', + 'emptied', + 'stalled', + 'loadedmetadata', meta + 'loadeddata', meta + 'canplay', + 'canplaythrough', + 'waiting', buffer? + 'durationchange', meta-duration + 'ratechange', + */ + }, + getMedia: function (player) { + const playlistItem = this.getCurrentPlaylistItem(player); + if (playlistItem) { + return playlistItem.sources[0]; + } + return player.getMedia(); + }, + getValidMediaUrl: function (mediaSrc, playerSrc, eventTargetSrc) { + return this.getMediaUrl(mediaSrc) || this.getMediaUrl(playerSrc) || this.getMediaUrl(eventTargetSrc); + }, + getMediaUrl: function (source) { + if (!source) { + return; + } + if (Array.isArray(source) && source.length) { + return this.parseSource(source[0]); + } + return this.parseSource(source); + }, + parseSource: function (source) { + const type = typeof source; + if (type === 'string') { + return source; + } else if (type === 'object') { + return source.src; + } + }, + getPlaylistCount: function (player) { + const playlist = player.playlist; // has playlist plugin + if (!playlist) { + return 1; + } + return playlist.lastIndex && playlist.lastIndex() + 1; + }, + getCurrentPlaylistIndex: function (player) { + const playlist = player.playlist; // has playlist plugin + if (!playlist) { + return 0; + } + return playlist.currentIndex && playlist.currentIndex(); + }, + getCurrentPlaylistItem: function (player) { + const playlist = player.playlist; // has playlist plugin + if (!playlist) { + return; + } + const currentIndex = this.getCurrentPlaylistIndex(player); + if (!currentIndex) { + return; + } + const item = playlist()[currentIndex]; + return item; + } +}; +const videojsSubmoduleFactory = function (config) { + const adState = adStateFactory(); + const timeState = timeStateFactory(); + const callbackStorage = null; + // videojs factory is stored to window by default + const vjs = window.videojs; + return VideojsProvider(config, vjs, adState, timeState, callbackStorage, utils); +}; +videojsSubmoduleFactory.vendorCode = _libraries_video_constants_vendorCodes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO_JS_VENDOR; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_5__.submodule)('video', videojsSubmoduleFactory); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (videojsSubmoduleFactory); + +// STATE + +/** + * @returns {State} + */ +function adStateFactory() { + const adState = Object.assign({}, (0,_libraries_video_shared_state_js__WEBPACK_IMPORTED_MODULE_6__["default"])()); + function updateForEvent(event) { + if (!event) { + return; + } + const skippable = event.skippable; + // TODO: possibly can check traffickingParameters to determine if winning bid is passed + const updates = { + adId: event.adId, + adServer: event.adSystem, + advertiserName: event.advertiserName, + redirectUrl: event.clickThroughUrl, + creativeId: event.creativeId || event.creativeAdId, + dealId: event.dealId, + adDescription: event.description, + linear: event.linear, + creativeUrl: event.mediaUrl, + adTitle: event.title, + universalAdId: event.universalAdIdValue, + creativeType: event.contentType, + wrapperAdIds: event.adWrapperIds, + skip: skippable ? 1 : 0 + // missing fields: + // loadTime + // advertiserId - TODO: does this even exist ? If not, remove from spec + // vastVersion + // adCategories + // campaignId + // waterfallIndex + // waterfallCount + // skipmin + // adTagUrl - for now, only has request ad tag + // adPlacementType + }; + const adPodInfo = event.adPodInfo; + if (adPodInfo && adPodInfo.podIndex > -1) { + updates.adPodCount = adPodInfo.totalAds; + updates.adPodIndex = adPodInfo.adPosition - 1; // Per IMA docs, adPosition is 1 based. + } + if (adPodInfo && adPodInfo.timeOffset) { + switch (adPodInfo.timeOffset) { + case -1: + updates.offset = 'post'; + break; + case 0: + // TODO: Defaults to 0 if this ad is not part of a pod, or the pod is not part of an ad playlist. - need to check if loaded dynamically and pass last content time update + updates.offset = 'pre'; + break; + default: + updates.offset = '' + adPodInfo.timeOffset; + } + } + if (skippable) { + updates.skipafter = event.skipTimeOffset; + } + this.updateState(updates); + } + adState.updateForEvent = updateForEvent; + return adState; +} +function timeStateFactory() { + const timeState = Object.assign({}, (0,_libraries_video_shared_state_js__WEBPACK_IMPORTED_MODULE_6__["default"])()); + function updateForTimeEvent(event) { + const { + currentTime, + duration + } = event; + this.updateState({ + time: currentTime, + duration, + playbackMode: getPlaybackMode(duration) + }); + } + timeState.updateForTimeEvent = updateForTimeEvent; + function getPlaybackMode(duration) { + if (duration > 0) { + return _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_7__.PLAYBACK_MODE.VOD; + } else if (duration < 0) { + return _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_7__.PLAYBACK_MODE.DVR; + } + return _libraries_video_constants_constants_js__WEBPACK_IMPORTED_MODULE_7__.PLAYBACK_MODE.LIVE; + } + return timeState; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_8__.registerModule)('videojsVideoProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["video","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/videojsVideoProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["videonowBidAdapter"],{ + +/***/ "./modules/videonowBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/videonowBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'videonow'; +const RTB_URL = 'https://adx.videonow.ru/yhb'; +const DEFAULT_CURRENCY = 'RUB'; +const DEFAULT_CODE_TYPE = 'combo'; +const TTL_SECONDS = 60 * 5; +const spec = { + code: BIDDER_CODE, + url: RTB_URL, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bidRequest The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bidRequest) { + if (!bidRequest.params) { + return false; + } + if (!bidRequest.params.pId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)('failed validation: pId not declared'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {validBidRequests[]} validBidRequests - an array of bids + * @param bidderRequest + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('validBidRequests', validBidRequests); + const bidRequests = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(validBidRequests, bid => { + const bidId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getBidIdParameter)('bidId', bid); + const placementId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'pId'); + const currency = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'currency') || DEFAULT_CURRENCY; + const url = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'url') || RTB_URL; + const codeType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid.params, 'codeType') || DEFAULT_CODE_TYPE; + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getValue)(bid, 'sizes'); + bidRequests.push({ + method: 'POST', + url, + data: { + places: [{ + id: bidId, + placementId, + codeType, + sizes + }], + settings: { + currency + } + } + }); + }); + return bidRequests; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest The bid params + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('serverResponse', serverResponse.body); + const responsesBody = serverResponse ? serverResponse.body : {}; + const bidResponses = []; + try { + if (!responsesBody?.bids?.length) { + return []; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(responsesBody.bids, bid => { + if (bid?.displayCode) { + const bidResponse = { + requestId: bid.id, + cpm: bid.cpm, + currency: bid.currency, + width: bid.size.width, + height: bid.size.height, + ad: bid.displayCode, + ttl: TTL_SECONDS, + creativeId: bid.id, + netRevenue: true, + meta: { + advertiserDomains: bid.adDomain ? [bid.adDomain] : [] + } + }; + bidResponses.push(bidResponse); + } + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(error); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('videonowBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/videonowBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["videoreachBidAdapter"],{ + +/***/ "./modules/videoreachBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/videoreachBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + +const BIDDER_CODE = 'videoreach'; +const ENDPOINT_URL = 'https://a.videoreach.com/hb/'; +const GVLID = 547; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: ['banner'], + isBidRequestValid: function (bid) { + return !!bid.params.TagId; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let data = { + data: validBidRequests.map(function (bid) { + return { + TagId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValue)(bid.params, 'TagId'), + adUnitCode: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('adUnitCode', bid), + bidId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('bidId', bid), + bidderRequestId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('bidderRequestId', bid), + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('auctionId', bid), + transactionId: bid.ortb2Imp?.ext?.tid + }; + }) + }; + if (bidderRequest && bidderRequest.refererInfo) { + // TODO: is 'page' the right value here? + data.referrer = bidderRequest.refererInfo.page; + } + if (bidderRequest && bidderRequest.gdprConsent) { + data.gdpr = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + } + return { + method: 'POST', + url: ENDPOINT_URL, + data: JSON.stringify(data) + }; + }, + interpretResponse: function (serverResponse) { + const bidResponses = []; + serverResponse = serverResponse.body; + if (serverResponse.responses) { + serverResponse.responses.forEach(function (bid) { + const bidResponse = { + cpm: bid.cpm, + width: bid.width, + height: bid.height, + currency: bid.currency, + netRevenue: true, + ttl: bid.ttl, + ad: bid.ad, + requestId: bid.bidId, + creativeId: bid.creativeId, + meta: { + advertiserDomains: bid && bid.adomain ? bid.adomain : [] + } + }; + bidResponses.push(bidResponse); + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, responses, gdprConsent) { + const syncs = []; + if (responses.length && responses[0].body.responses.length) { + let params = ''; + var gdpr; + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + if (typeof gdprConsent.gdprApplies === 'boolean') { + params += 'gdpr=' + gdprConsent.gdprApplies + '&gdpr_consent=' + gdprConsent.consentString; + } else { + params += 'gdpr_consent=' + gdprConsent.consentString; + } + } + if (syncOptions.pixelEnabled) { + const SyncPixels = responses[0].body.responses[0].sync; + if (SyncPixels) { + SyncPixels.forEach(sync => { + gdpr = params ? (sync.split('?')[1] ? '&' : '?') + params : ''; + syncs.push({ + type: 'image', + url: sync + gdpr + }); + }); + } + } + if (syncOptions.iframeEnabled) { + const SyncFrame = responses[0].body.responses[0].syncframe; + if (SyncFrame) { + SyncFrame.forEach(sync => { + gdpr = params ? (sync.split('?')[1] ? '&' : '?') + params : ''; + syncs.push({ + type: 'iframe', + url: sync + gdpr + }); + }); + } + } + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('videoreachBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/videoreachBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vidoomyBidAdapter"],{ + +/***/ "./modules/vidoomyBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/vidoomyBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); + + + + + + + +const ENDPOINT = `https://d.vidoomy.com/api/rtbserver/prebid/`; +const BIDDER_CODE = 'vidoomy'; +const GVLID = 380; +const COOKIE_SYNC_FALLBACK_URLS = ['https://x.bidswitch.net/sync?ssp=vidoomy&gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&us_privacy=', 'https://pixel-sync.sitescout.com/dmp/pixelSync?nid=120&gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&redir=https%3A%2F%2Fa.vidoomy.com%2Fapi%2Frtbserver%2Fcookie%3Fi%3DCEN%26uid%3D%7BuserId%7D', 'https://cm.adform.net/cookie?redirect_url=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dadf%26gdpr%3D{{GDPR}}%26gdpr_consent%3D{{GDPR_CONSENT}}%26uid%3D%24UID', 'https://pixel.rubiconproject.com/exchange/sync.php?p=pbs-vidoomy&gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&us_privacy=', 'https://rtb.openx.net/sync/prebid?gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&r=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dopenx%26uid%3D$%7BUID%7D', 'https://ads.pubmatic.com/AdServer/js/user_sync.html?gdpr={{GDPR}}&gdpr_consent={{GDPR_CONSENT}}&us_privacy=&predirect=https%3A%2F%2Fa-prebid.vidoomy.com%2Fsetuid%3Fbidder%3Dpubmatic%26gdpr%3D{{GDPR}}%26gdpr_consent%3D{{GDPR_CONSENT}}%26uid%3D']; +const isBidRequestValid = bid => { + if (!bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params should be non-empty'); + return false; + } + if (!+bid.params.pid) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params.pid should be non-empty Number'); + return false; + } + if (!+bid.params.id) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params.id should be non-empty Number'); + return false; + } + if (bid.params && bid.params.mediaTypes && bid.params.mediaTypes.video && bid.params.mediaTypes.video.context === _src_video_js__WEBPACK_IMPORTED_MODULE_1__.INSTREAM && !bid.params.mediaTypes.video.playerSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params.mediaType.video should have a playerSize property to tell player size when is INSTREAM'); + return false; + } + if (bid.params.bidfloor && (isNaN(bid.params.bidfloor) || bid.params.bidfloor < 0)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params.bidfloor should be a number equal or greater than zero'); + return false; + } + return true; +}; + +/** + * Schain Object needed encodes URI Component with exlamation mark + * @param {String} str + * @returns {String} + */ +function encodeURIComponentWithExlamation(str) { + return encodeURIComponent(str).replace(/!/g, '%21'); +} + +/** + * Serializes the supply chain object based on IAB standards + * @see https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md + * @param {Object} schainObj supply chain object + * @returns {string} serialized supply chain value + */ +function serializeSupplyChainObj(schainObj) { + if (!schainObj || !schainObj.nodes) { + return ''; + } + const nodeProps = ['asi', 'sid', 'hp', 'rid', 'name', 'domain']; + const serializedNodes = schainObj.nodes.map(node => nodeProps.map(prop => encodeURIComponentWithExlamation(node[prop] || '')).join(',')).join('!'); + const serializedSchain = `${schainObj.ver},${schainObj.complete}!${serializedNodes}`; + return serializedSchain; +} + +/** + * Gets highest floor between getFloor.floor and params.bidfloor + * @param {Object} bid + * @param {Object} mediaType + * @param {Array} sizes + * @param {Number} bidfloor + * @returns {Number} floor + */ +function getBidFloor(bid, mediaType, sizes, bidfloor) { + let floor = bidfloor; + var size = sizes && sizes.length > 0 ? sizes[0] : '*'; + if (typeof bid.getFloor === 'function') { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType, + size + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = Math.max(bidfloor, parseFloat(floorInfo.floor)); + } + } + return floor; +} +const isBidResponseValid = bid => { + if (!bid || !bid.requestId || !bid.cpm || !bid.ttl || !bid.currency) { + return false; + } + switch (bid.mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER: + return Boolean(bid.width && bid.height && bid.ad); + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO: + return Boolean(bid.vastUrl || bid.vastXml); + default: + return false; + } +}; +const buildRequests = (validBidRequests, bidderRequest) => { + const serverRequests = validBidRequests.map(bid => { + let adType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + let sizes; + if (bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER] && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER].sizes) { + sizes = bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER].sizes; + adType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER; + } else if (bid.mediaTypes && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO] && bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO].playerSize) { + sizes = bid.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO].playerSize; + adType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO; + } + const parsedSizes = (sizes ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseSizesInput)(sizes) : []).map(size => size.split('x')); + const widths = parsedSizes.length ? parsedSizes.map(size => size[0]).join(',') : '0'; + const heights = parsedSizes.length ? parsedSizes.map(size => size[1]).join(',') : '0'; + + // TODO: is 'domain' the right value here? + const hostname = bidderRequest.refererInfo.domain || window.location.hostname; + const videoContext = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.context'); + const bidfloor = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, `params.bidfloor`, 0); + const floor = getBidFloor(bid, adType, sizes, bidfloor); + const ortb2 = bidderRequest.ortb2 || { + bcat: [], + badv: [], + bapp: [], + btype: [], + battr: [] + }; + let eids; + const userEids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'userIdAsEids'); + if (Array.isArray(userEids) && userEids.length > 0) { + eids = JSON.stringify(userEids) || ''; + } + const queryParams = { + id: bid.params.id, + adtype: adType, + auc: bid.adUnitCode, + w: widths, + h: heights, + pos: parseInt(bid.params.position) || 1, + ua: navigator.userAgent, + l: navigator.language && navigator.language.indexOf('-') !== -1 ? navigator.language.split('-')[0] : '', + dt: /Mobi/.test(navigator.userAgent) ? 2 : 1, + pid: bid.params.pid, + requestId: bid.bidId, + schain: serializeSupplyChainObj(bid.schain) || '', + eids: eids || '', + bidfloor: floor, + d: getDomainWithoutSubdomain(hostname), + // 'vidoomy.com', + // TODO: does the fallback make sense here? + sp: encodeURIComponent(bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation), + usp: bidderRequest.uspConsent || '', + coppa: !!_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa'), + videoContext: videoContext || '', + bcat: ortb2.bcat || bid.params.bcat || [], + badv: ortb2.badv || bid.params.badv || [], + bapp: ortb2.bapp || bid.params.bapp || [], + btype: ortb2.btype || bid.params.btype || [], + battr: ortb2.battr || bid.params.battr || [] + }; + if (bidderRequest.gdprConsent) { + queryParams.gdpr = bidderRequest.gdprConsent.gdprApplies; + queryParams.gdprcs = bidderRequest.gdprConsent.consentString; + } + return { + method: 'GET', + url: ENDPOINT, + data: queryParams + }; + }); + return serverRequests; +}; +const render = bid => { + bid.ad = bid.vastUrl; + var obj = { + vastTimeout: 5000, + maxAllowedVastTagRedirects: 3, + allowVpaid: true, + autoPlay: true, + preload: true, + mute: true + }; + window.outstreamPlayer(bid, bid.adUnitCode, obj); +}; +const interpretResponse = (serverResponse, bidRequest) => { + try { + let responseBody = serverResponse.body; + if (!responseBody) return; + if (responseBody.mediaType === 'video') { + responseBody.ad = responseBody.vastUrl || responseBody.vastXml; + const videoContext = bidRequest.data.videoContext; + if (videoContext === _src_video_js__WEBPACK_IMPORTED_MODULE_1__.OUTSTREAM) { + try { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: bidRequest.bidId, + adunitcode: bidRequest.tagId, + loaded: false, + config: responseBody.mediaType, + url: responseBody.meta.rendererUrl + }); + renderer.setRender(render); + responseBody.renderer = renderer; + } catch (e) { + responseBody.ad = responseBody.vastUrl || responseBody.vastXml; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': error while installing renderer to show outstream ad'); + } + } + } + const bid = { + ad: responseBody.ad, + renderer: responseBody.renderer, + mediaType: responseBody.mediaType, + requestId: responseBody.requestId, + cpm: responseBody.cpm, + currency: responseBody.currency, + width: responseBody.width, + height: responseBody.height, + creativeId: responseBody.creativeId, + netRevenue: responseBody.netRevenue, + ttl: responseBody.ttl, + meta: { + mediaType: responseBody.meta.mediaType, + rendererUrl: responseBody.meta.rendererUrl, + advertiserDomains: responseBody.meta.advertiserDomains, + advertiserId: responseBody.meta.advertiserId, + advertiserName: responseBody.meta.advertiserName, + agencyId: responseBody.meta.agencyId, + agencyName: responseBody.meta.agencyName, + brandId: responseBody.meta.brandId, + brandName: responseBody.meta.brandName, + dchain: responseBody.meta.dchain, + networkId: responseBody.meta.networkId, + networkName: responseBody.meta.networkName, + primaryCatId: responseBody.meta.primaryCatId, + secondaryCatIds: responseBody.meta.secondaryCatIds + } + }; + if (responseBody.vastUrl) { + bid.vastUrl = responseBody.vastUrl; + } else if (responseBody.vastXml) { + bid.vastXml = responseBody.vastXml; + } + const bids = []; + if (isBidResponseValid(bid)) { + bids.push(bid); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': server returns invalid response'); + } + return bids; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': error parsing server response to Prebid format'); + return []; + } +}; +function getUserSyncs(syncOptions, responses, gdprConsent, uspConsent) { + if (syncOptions.iframeEnabled || syncOptions.pixelEnabled) { + const pixelType = syncOptions.pixelEnabled ? 'image' : 'iframe'; + const urls = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(responses, '0.body.pixels') || COOKIE_SYNC_FALLBACK_URLS; + return [].concat(urls).map(url => ({ + type: pixelType, + url: url.replace('{{GDPR}}', gdprConsent ? gdprConsent.gdprApplies ? '1' : '0' : '0').replace('{{GDPR_CONSENT}}', gdprConsent ? encodeURIComponent(gdprConsent.consentString) : '').replace('{{USP_CONSENT}}', uspConsent ? encodeURIComponent(uspConsent) : '') + })); + } +} +; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse, + gvlid: GVLID, + getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +function getDomainWithoutSubdomain(hostname) { + const parts = hostname.split('.'); + const newParts = []; + for (let i = parts.length - 1; i >= 0; i--) { + newParts.push(parts[i]); + if (newParts.length !== 1 && parts[i].length > 3) { + break; + } + } + return newParts.reverse().join('.'); +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('vidoomyBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vidoomyBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["viewdeosDXBidAdapter"],{ + +/***/ "./modules/viewdeosDXBidAdapter.js": +/*!*****************************************!*\ + !*** ./modules/viewdeosDXBidAdapter.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/adtelligentUtils/adtelligentUtils.js */ "./libraries/adtelligentUtils/adtelligentUtils.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const URL = 'https://ghb.sync.viewdeos.com/auction/'; +const OUTSTREAM_SRC = 'https://player.sync.viewdeos.com/outstream-unit/2.01/outstream.min.js'; +const BIDDER_CODE = 'viewdeosDX'; +const OUTSTREAM = 'outstream'; +const DISPLAY = 'display'; +const syncsCache = {}; +const spec = { + code: BIDDER_CODE, + aliases: ['viewdeos'], + gvlid: 924, + supportedMediaTypes: _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.supportedMediaTypes, + isBidRequestValid: _libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.isBidRequestValid, + getUserSyncs: function (syncOptions, serverResponses) { + return (0,_libraries_adtelligentUtils_adtelligentUtils_js__WEBPACK_IMPORTED_MODULE_0__.getUserSyncsFn)(syncOptions, serverResponses, syncsCache); + }, + /** + * Make a server request from the list of BidRequests + * @param bidRequests + * @param bidderRequest + */ + buildRequests: function (bidRequests, bidderRequest) { + return { + data: bidToTag(bidRequests, bidderRequest), + bidderRequest, + method: 'GET', + url: URL + }; + }, + /** + * Unpack the response from the server into a list of bids + * @param {Object} serverResponse + * @param {BidderRequest} bidderRequest + * @return {Bid[]} An array of bids which were nested inside the server + */ + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + let bids = []; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse)) { + return parseRTBResponse(serverResponse, bidderRequest); + } + serverResponse.forEach(serverBidResponse => { + bids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.flatten)(bids, parseRTBResponse(serverBidResponse, bidderRequest)); + }); + return bids; + } +}; +function parseRTBResponse(serverResponse, bidderRequest) { + const isInvalidValidResp = !serverResponse || !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(serverResponse.bids); + const bids = []; + if (isInvalidValidResp) { + const extMessage = serverResponse && serverResponse.ext && serverResponse.ext.message ? `: ${serverResponse.ext.message}` : ''; + const errorMessage = `in response for ${bidderRequest.bidderCode} adapter ${extMessage}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logError)(errorMessage); + return bids; + } + serverResponse.bids.forEach(serverBid => { + const requestId = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.findIndex)(bidderRequest.bids, bidRequest => { + return bidRequest.bidId === serverBid.requestId; + }); + if (serverBid.cpm !== 0 && requestId !== -1) { + const bidReq = bidderRequest.bids[requestId]; + const bid = createBid(serverBid, getMediaType(bidReq), bidReq.params); + bids.push(bid); + } + }); + return bids; +} +function bidToTag(bidRequests, bidderRequest) { + const tag = { + // TODO: is 'page' the right value here? + domain: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'refererInfo.page') + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent.gdprApplies')) { + tag.gdpr = 1; + tag.gdpr_consent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'gdprConsent.consentString'); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'bidderRequest.uspConsent')) { + tag.us_privacy = bidderRequest.uspConsent; + } + for (let i = 0, length = bidRequests.length; i < length; i++) { + Object.assign(tag, prepareRTBRequestParams(i, bidRequests[i])); + } + return tag; +} + +/** + * Parse mediaType + * @param _index {number} + * @param bid {object} + * @returns {object} + */ +function prepareRTBRequestParams(_index, bid) { + const mediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO : DISPLAY; + const index = !_index ? '' : `${_index + 1}`; + const sizes = bid.sizes ? bid.sizes : mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video.playerSize') : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.banner.sizes'); + return { + ['callbackId' + index]: bid.bidId, + ['aid' + index]: bid.params.aid, + ['ad_type' + index]: mediaType, + ['sizes' + index]: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(sizes).join() + }; +} + +/** + * Prepare all parameters for request + * @param bidderRequest {object} + * @returns {object} + */ +function getMediaType(bidderRequest) { + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'mediaTypes.video'); + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bidderRequest, 'mediaTypes.video.context'); + return !videoMediaType ? DISPLAY : context === OUTSTREAM ? OUTSTREAM : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO; +} + +/** + * Configure new bid by response + * @param bidResponse {object} + * @param mediaType {Object} + * @returns {object} + */ +function createBid(bidResponse, mediaType, bidderParams) { + const bid = { + requestId: bidResponse.requestId, + creativeId: bidResponse.cmpId, + height: bidResponse.height, + currency: bidResponse.cur, + width: bidResponse.width, + cpm: bidResponse.cpm, + netRevenue: true, + mediaType, + ttl: 3600, + meta: { + advertiserDomains: bidResponse.adomain || [] + } + }; + if (mediaType === DISPLAY) { + return Object.assign(bid, { + ad: bidResponse.ad + }); + } + Object.assign(bid, { + vastUrl: bidResponse.vastUrl + }); + if (mediaType === OUTSTREAM) { + Object.assign(bid, { + mediaType: 'video', + adResponse: bidResponse, + renderer: newRenderer(bidResponse.requestId, bidderParams) + }); + } + return bid; +} + +/** + * Create renderer + * @param requestId + * @param bidderParams + * @returns {*} + */ +function newRenderer(requestId, bidderParams) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_5__.Renderer.install({ + id: requestId, + url: OUTSTREAM_SRC, + config: bidderParams.outstream || {}, + loaded: false + }); + renderer.setRender(outstreamRender); + return renderer; +} + +/** + * Initialise outstream + * @param bid + */ +function outstreamRender(bid) { + bid.renderer.push(() => { + const opts = Object.assign({}, bid.renderer.getConfig(), { + width: bid.width, + height: bid.height, + vastUrl: bid.vastUrl, + elId: bid.adUnitCode + }); + window.VOutstreamAPI.initOutstreams([opts]); + }); +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('viewdeosDXBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["adtelligentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/viewdeosDXBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["viouslyBidAdapter"],{ + +/***/ "./modules/viouslyBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/viouslyBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + */ + +const BIDDER_CODE = 'viously'; +const GVLID = 1028; +const CURRENCY = 'EUR'; +const TTL = 60; +const HTTP_METHOD = 'POST'; +const REQUEST_URL = 'https://bidder.viously.com/bid'; +const REQUIRED_VIDEO_PARAMS = ['context', 'playbackmethod', 'playerSize']; +const REQUIRED_VIOUSLY_PARAMS = ['pid']; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + let videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.video'); + let bannerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bid, 'mediaTypes.banner'); + if (!bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('The bid params are missing'); + return false; + } + if (!bannerParams && !videoParams) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('The placement must be of banner or video type'); + return false; + } + + /** + * BANNER checks + */ + + if (bannerParams) { + let sizes = bannerParams.sizes; + if (!sizes || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(sizes).length == 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('mediaTypes.banner.sizes must be set for banner placement at the right format.'); + return false; + } + } + + /** + * VIDEO checks + */ + let areParamsValid = true; + if (videoParams) { + REQUIRED_VIDEO_PARAMS.forEach(function (videoParam) { + if (typeof videoParams[videoParam] === 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('mediaTypes.video.' + videoParam + ' must be set for video placement.'); + areParamsValid = false; + } + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(videoParams.playerSize).length === 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('mediaTypes.video.playerSize must be set for video placement at the right format.'); + areParamsValid = false; + } + } + + /** + * Viously checks + */ + + REQUIRED_VIOUSLY_PARAMS.forEach(function (viouslyParam) { + if (typeof bid.params[viouslyParam] === 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('The ' + viouslyParam + ' is missing.'); + areParamsValid = false; + } + }); + if (!areParamsValid) { + return false; + } + return true; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let payload = {}; + + /** Viously Publisher ID */ + if (validBidRequests[0].params.pid) { + payload.pid = validBidRequests[0].params.pid; + } + + // Referer Info + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('pageUrl')) { + let parsedUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('pageUrl')); + payload.domain = parsedUrl.hostname; + payload.page_domain = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('pageUrl'); + } else if (bidderRequest && bidderRequest.refererInfo) { + let parsedUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(bidderRequest.refererInfo.page); + payload.domain = parsedUrl.hostname; + payload.page_domain = bidderRequest.refererInfo.page; + } + if (payload.domain) { + /** Make sur that the scheme is not part of the domain */ + payload.domain = payload.domain.replace(/(^\w+:|^)\/\//, ''); + payload.domain = payload.domain.replace(/\/$/, ''); + } + + // Handle GDPR + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdpr = bidderRequest.gdprConsent.gdprApplies; + payload.gdpr_consent = bidderRequest.gdprConsent.consentString; + if (bidderRequest.gdprConsent.addtlConsent && bidderRequest.gdprConsent.addtlConsent.indexOf('~') !== -1) { + payload.addtl_consent = bidderRequest.gdprConsent.addtlConsent; + } + } + + // US Privacy + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + + // Schain + if (validBidRequests[0].schain) { + payload.schain = validBidRequests[0].schain; + } + // Currency + payload.currency_code = CURRENCY; + + // User IDs + if (validBidRequests[0].userIdAsEids) { + payload.users_uid = validBidRequests[0].userIdAsEids; + } + + // Placements + payload.placements = validBidRequests.map(bidRequest => { + let request = { + id: bidRequest.adUnitCode, + bid_id: bidRequest.bidId + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner')) { + let position = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.pos'); + request.type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + request.sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.sizes')); + request.position = position || 0; + } else { + request.type = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + request.video_params = { + context: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.context'), + playbackmethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.playbackmethod'), + size: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.playerSize')) + }; + } + return request; + }); + return { + method: HTTP_METHOD, + url: validBidRequests[0].params.endpoint ? validBidRequests[0].params.endpoint : REQUEST_URL, + data: payload + }; + }, + interpretResponse: function (serverResponse, requests) { + const bidResponses = []; + const responseBody = serverResponse.body; + if (responseBody.ads && responseBody.ads.length > 0) { + responseBody.ads.forEach(function (bidResponse) { + if (bidResponse.bid) { + let bidRequest = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(requests.data.placements, bid => bid.bid_id === bidResponse.bid_id); + if (bidRequest) { + let sizes = bidResponse.size.split('x'); + const bid = { + requestId: bidRequest.bid_id, + id: bidResponse.id, + cpm: bidResponse.cpm, + width: sizes[0], + height: sizes[1], + creativeId: bidResponse.creative_id || '', + currency: CURRENCY, + netRevenue: true, + ttl: TTL, + mediaType: bidResponse.type, + meta: {}, + // Tracking data + nurl: bidResponse.nurl ? bidResponse.nurl : [] + }; + if (bidResponse.type == _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + if (bidResponse.ad_url) { + bid.vastUrl = bidResponse.ad_url; + } else { + bid.vastXml = bidResponse.ad; + } + } else { + bid.ad = bidResponse.ad; + } + bidResponses.push(bid); + } + } + }); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) {}, + onTimeout: function (timeoutData) {}, + onBidWon: function (bid) { + if (bid && bid.nurl && bid.nurl.length > 0) { + bid.nurl.forEach(function (winUrl) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.triggerPixel)(winUrl, null); + }); + } + }, + onSetTargeting: function (bid) {} +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('viouslyBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/viouslyBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["viqeoBidAdapter"],{ + +/***/ "./modules/viqeoBidAdapter.js": +/*!************************************!*\ + !*** ./modules/viqeoBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + */ + +const BIDDER_CODE = 'viqeo'; +const DEFAULT_MIMES = ['video/3gpp', 'video/mp4', 'video/mpeg', 'video/webm', 'application/javascript']; +const VIQEO_ENDPOINT = 'https://ad.vqserve.com/ads/prebid'; +const RENDERER_URL = 'https://cdn.viqeo.tv/js/vq_starter.js'; +const DEFAULT_CURRENCY = 'USD'; +function getBidFloor(bid) { + const { + floor, + currency + } = bid.params; + const curr = currency || DEFAULT_CURRENCY; + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(bid.getFloor)) { + return { + floor: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(floor) ? floor : 0, + currency: curr + }; + } + const floorInfo = bid.getFloor({ + currency: curr, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(floorInfo) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(floorInfo.floor) && floorInfo.currency === curr) { + return floorInfo; + } + return { + floor: floor || 0, + currency: currency || DEFAULT_CURRENCY + }; +} +function getVideoTargetingParams(_ref) { + let { + mediaTypes: { + video + } + } = _ref; + const result = {}; + Object.keys(Object(video)).forEach(key => { + if (key === 'playerSize') { + result.w = video.playerSize[0][0]; + result.h = video.playerSize[0][1]; + } else if (key !== 'context') { + result[key] = video[key]; + } + }); + return result; +} + +/** + * @type {BidderSpec} + */ +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + /** + * @param {BidRequest} bidRequest The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: _ref2 => { + let { + params + } = _ref2; + if (!params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('failed validation: params not declared'); + return false; + } + if (!params.tagId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('failed validation: tagId not declared'); + return false; + } + if (!params.playerOptions) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('failed validation: playerOptions not declared'); + return false; + } + const { + profileId, + videoId, + playerId + } = params.playerOptions; + if (!profileId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('failed validation: profileId not declared'); + return false; + } + if (!videoId && !playerId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('failed validation: videoId or playerId not declared'); + return false; + } + return true; + }, + /** + * @param validBidRequests {BidRequest[]} + * @returns {ServerRequest[]} + */ + buildRequests: validBidRequests => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('validBidRequests', validBidRequests); + const bidRequests = []; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(validBidRequests, (bid, i) => { + const { + params: { + test, + tagId, + endpointUrl, + bcat, + badv + }, + mediaTypes: { + video + } + } = bid; + const ortb2 = bid.ortb2 || {}; + const user = bid.params.user || {}; + const device = bid.params.device || {}; + const site = bid.params.site || {}; + const floorInfo = getBidFloor(bid); + const data = { + id: bid.bidId, + test, + imp: [{ + id: `${i}`, + video: { + ...getVideoTargetingParams(bid), + mimes: video.mimes || DEFAULT_MIMES + }, + tagid: `${tagId}`, + bidfloor: floorInfo.floor, + bidfloorcur: floorInfo.currency, + secure: 1 + }], + site: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(site, ortb2.site), + device: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(device, ortb2.device), + user: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(user, ortb2.user), + bcat: ortb2.bcat || bcat, + badv: ortb2.badv || badv + }; + bidRequests.push({ + url: endpointUrl || `${VIQEO_ENDPOINT}`, + method: 'POST', + data, + bids: validBidRequests + }); + }); + return bidRequests; + }, + /** + * @param {ServerResponse} serverResponse + * @param {BidRequest} bidRequests + * @return {Bid[]} + */ + interpretResponse: (serverResponse, bidRequests) => { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logInfo)('serverResponse', serverResponse); + const bidResponses = []; + if (!serverResponse || !serverResponse.body) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('empty response'); + return []; + } + try { + const { + id, + seatbid, + cur + } = serverResponse.body; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(seatbid, sb => { + const { + bid + } = sb; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._each)(bid, b => { + const bidRequest = bidRequests.bids.find(_ref3 => { + let { + bidId + } = _ref3; + return bidId === id; + }); + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_2__.Renderer.install({ + url: bidRequest?.params?.renderUrl || RENDERER_URL + }); + renderer.setRender((bid, doc) => { + if (window.VIQEO) { + window.VIQEO.renderPrebid(bid, doc); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)('failed get window.VIQEO'); + } + }); + bidResponses.push({ + requestId: id, + currency: cur || DEFAULT_CURRENCY, + cpm: b.price, + ttl: b.exp, + netRevenue: true, + creativeId: b.cid, + width: b.w || bidRequest?.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].playerSize[0][0], + height: b.h || bidRequest?.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO].playerSize[0][1], + vastXml: b.adm, + vastUrl: b.nurl, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, + renderer, + meta: { + secondaryCatIds: b.cat, + attr: b.attr, + advertiserDomains: b.adomain + } + }); + }); + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(error); + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('viqeoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/viqeoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["visiblemeasuresBidAdapter"],{ + +/***/ "./modules/visiblemeasuresBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/visiblemeasuresBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/teqblazeUtils/bidderUtils.js */ "./libraries/teqblazeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'visiblemeasures'; +const AD_URL = 'https://us-e.visiblemeasures.com/pbjs'; +const SYNC_URL = 'https://cs.visiblemeasures.com'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + isBidRequestValid: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid)(), + buildRequests: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(AD_URL), + interpretResponse: _libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: (0,_libraries_teqblazeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs)(SYNC_URL) +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('visiblemeasuresBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["teqblazeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/visiblemeasuresBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vistarsBidAdapter"],{ + +/***/ "./modules/vistarsBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/vistarsBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../libraries/ortbConverter/converter.js */ "./libraries/ortbConverter/converter.js"); + + + + + + +const BIDDER_CODE = 'vistars'; +const DEFAULT_ENDPOINT = 'ex-asr.vistarsagency.com'; +const SYNC_ENDPOINT = 'sync.vistarsagency.com'; +const ADOMAIN = 'vistarsagency.com'; +const TIME_TO_LIVE = 360; +const converter = (0,_libraries_ortbConverter_converter_js__WEBPACK_IMPORTED_MODULE_0__.ortbConverter)({ + context: { + netRevenue: true, + ttl: 30 + }, + request(buildRequest, imps, bidderRequest, context) { + const request = buildRequest(imps, bidderRequest, context); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(request, 'ext.prebid', true); + return request; + }, + bidResponse(buildBidResponse, bid, context) { + const bidResponse = buildBidResponse(bid, context); + bidResponse.adm = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bidResponse.adm, bidResponse.price); + bidResponse.burl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bidResponse.burl, bidResponse.price); + bidResponse.nurl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.replaceAuctionPrice)(bidResponse.nurl, bidResponse.price); + return bidResponse; + } +}); +const spec = { + code: BIDDER_CODE, + isBidRequestValid: function (bid) { + let valid = bid.params.source; + return !!valid; + }, + buildRequests: function (bids, bidderRequest) { + return bids.map(bid => { + let endpoint = bid.params.endpoint || DEFAULT_ENDPOINT; + return { + method: 'POST', + url: `https://${endpoint}/bid?source=${bid.params.source}`, + data: converter.toORTB({ + bidRequests: [bid], + bidderRequest: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.deepClone)(bidderRequest), + context: { + mediaType: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'mediaTypes.video') ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER + } + }) + }; + }); + }, + interpretResponse: function (response, request) { + if (!response?.body) { + return []; + } + const bids = converter.fromORTB({ + response: response.body, + request: request.data + }).bids; + bids.forEach(bid => { + bid.meta = bid.meta || {}; + bid.meta.advertiserDomains = bid.meta.advertiserDomains || []; + if (bid.meta.advertiserDomains.length == 0) { + bid.meta.advertiserDomains.push(ADOMAIN); + } + bid.ttl = bid.ttl || TIME_TO_LIVE; + }); + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__.hasPurpose1Consent)(gdprConsent)) { + return syncs; + } + let params = `us_privacy=${uspConsent || ''}&gdpr_consent=${gdprConsent?.consentString ? gdprConsent.consentString : ''}`; + if (typeof gdprConsent?.gdprApplies === 'boolean') { + params += `&gdpr=${Number(gdprConsent.gdprApplies)}`; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: `//${SYNC_ENDPOINT}/match/sp.ifr?${params}` + }); + } + if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: `//${SYNC_ENDPOINT}/match/sp?${params}` + }); + } + return syncs; + }, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_4__.VIDEO] +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('vistarsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","ortbConverter","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vistarsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["visxBidAdapter"],{ + +/***/ "./modules/visxBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/visxBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_video_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/video.js */ "./src/video.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/gptUtils/gptUtils.js */ "./libraries/gptUtils/gptUtils.js"); +/* harmony import */ var _libraries_processResponse_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../libraries/processResponse/index.js */ "./libraries/processResponse/index.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + + + +const BIDDER_CODE = 'visx'; +const GVLID = 154; +const BASE_URL = 'https://t.visx.net'; +const DEBUG_URL = 'https://t-stage.visx.net'; +const ENDPOINT_PATH = '/hb_post'; +const TIME_TO_LIVE = 360; +const DEFAULT_CUR = 'EUR'; +const ADAPTER_SYNC_PATH = '/push_sync'; +const TRACK_TIMEOUT_PATH = '/track/bid_timeout'; +const RUNTIME_STATUS_RESPONSE_TIME = 999000; +const LOG_ERROR_MESS = { + noAuid: 'Bid from response has no auid parameter - ', + noAdm: 'Bid from response has no adm parameter - ', + noBid: 'Array of bid objects is empty', + noImpId: 'Bid from response has no impid parameter - ', + noPlacementCode: 'Can\'t find in requested bids the bid with auid - ', + emptyUids: 'Uids should not be empty', + emptySeatbid: 'Seatbid array from response has an empty item', + emptyResponse: 'Response is empty', + hasEmptySeatbidArray: 'Response has empty seatbid array', + hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - ', + notAllowedCurrency: 'Currency is not supported - ', + currencyMismatch: 'Currency from the request is not match currency from the response - ', + onlyVideoInstream: `Only video ${_src_video_js__WEBPACK_IMPORTED_MODULE_0__.INSTREAM} supported`, + videoMissing: 'Bid request videoType property is missing - ' +}; +const currencyWhiteList = ['EUR', 'USD', 'GBP', 'PLN', 'CHF', 'SEK']; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +const _bidResponseTimeLogged = []; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO], + isBidRequestValid: function (bid) { + if (_isVideoBid(bid)) { + if (!_isValidVideoBid(bid, true)) { + // in case if video bid configuration invalid will try to send bid request for banner + if (!_isBannerBid(bid)) { + return false; + } + } + } + return !!bid.params.uid && !isNaN(parseInt(bid.params.uid)); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const auids = []; + const bidsMap = {}; + const bids = validBidRequests || []; + const currency = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig(`currency.bidderCurrencyDefault.${BIDDER_CODE}`) || (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_4__.getCurrencyFromBidderRequest)(bidderRequest) || DEFAULT_CUR; + let request; + let reqId; + let payloadSchain; + let payloadUserId; + let payloadUserEids; + let timeout; + let payloadDevice; + let payloadSite; + let payloadRegs; + let payloadContent; + let payloadUser; + if (currencyWhiteList.indexOf(currency) === -1) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(LOG_ERROR_MESS.notAllowedCurrency + currency); + return; + } + const imp = []; + bids.forEach(bid => { + reqId = bid.bidderRequestId; + const impObj = buildImpObject(bid); + if (impObj) { + imp.push(impObj); + bidsMap[bid.bidId] = bid; + } + const { + params: { + uid + }, + schain, + userId, + userIdAsEids + } = bid; + if (!payloadSchain && schain) { + payloadSchain = schain; + } + if (!payloadUserEids && userIdAsEids) { + payloadUserEids = userIdAsEids; + } + if (!payloadUserId && userId) { + payloadUserId = userId; + } + auids.push(uid); + }); + const payload = {}; + if (bidderRequest) { + timeout = bidderRequest.timeout; + if (bidderRequest.gdprConsent) { + if (bidderRequest.gdprConsent.consentString) { + payload.gdpr_consent = bidderRequest.gdprConsent.consentString; + } + payload.gdpr_applies = typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? Number(bidderRequest.gdprConsent.gdprApplies) : 1; + } + const { + ortb2 + } = bidderRequest; + const { + device, + site, + regs, + content + } = ortb2; + const userOrtb2 = ortb2.user; + let user; + let userReq; + const vads = _getUserId(); + if (payloadUserEids || payload.gdpr_consent || vads) { + user = { + ext: { + ...(payloadUserEids && { + eids: payloadUserEids + }), + ...(payload.gdpr_consent && { + consent: payload.gdpr_consent + }), + ...(vads && { + vads + }) + } + }; + } + if (user) { + userReq = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.mergeDeep)(user, userOrtb2); + } else { + userReq = userOrtb2; + } + if (device) { + payloadDevice = device; + } + if (site) { + payloadSite = site; + } + if (regs) { + payloadRegs = regs; + } + if (content) { + payloadContent = content; + } + if (userReq) { + payloadUser = userReq; + } + } + const tmax = timeout; + const source = { + ext: { + wrapperType: 'Prebid_js', + wrapperVersion: "9.45.0-pre", + ...(payloadSchain && { + schain: payloadSchain + }) + } + }; + if (payloadRegs === undefined) { + payloadRegs = 'gdpr_applies' in payload && { + ext: { + gdpr: payload.gdpr_applies + } + }; + } + request = { + id: reqId, + imp, + tmax, + cur: [currency], + source, + ...(payloadUser && { + user: payloadUser + }), + ...(payloadRegs && { + regs: payloadRegs + }), + ...(payloadDevice && { + device: payloadDevice + }), + ...(payloadSite && { + site: payloadSite + }), + ...(payloadContent && { + content: payloadContent + }) + }; + return { + method: 'POST', + url: buildUrl(ENDPOINT_PATH) + '?auids=' + encodeURIComponent(auids.join(',')), + data: request, + bidsMap + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + serverResponse = serverResponse && serverResponse.body; + const bidResponses = []; + const bidsMap = bidRequest.bidsMap; + const currency = bidRequest.data.cur[0]; + let errorMessage; + if (!serverResponse) errorMessage = LOG_ERROR_MESS.emptyResponse;else if (serverResponse.seatbid && !serverResponse.seatbid.length) { + errorMessage = LOG_ERROR_MESS.hasEmptySeatbidArray; + } + if (!errorMessage && serverResponse.seatbid) { + serverResponse.seatbid.forEach(respItem => { + _addBidResponse((0,_libraries_processResponse_index_js__WEBPACK_IMPORTED_MODULE_6__.getBidFromResponse)(respItem, LOG_ERROR_MESS), bidsMap, currency, bidResponses); + }); + } + if (errorMessage) (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(errorMessage); + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { + var query = []; + if (gdprConsent) { + if (gdprConsent.consentString) { + query.push('gdpr_consent=' + encodeURIComponent(gdprConsent.consentString)); + } + query.push('gdpr_applies=' + encodeURIComponent(typeof gdprConsent.gdprApplies === 'boolean' ? Number(gdprConsent.gdprApplies) : 1)); + } + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: buildUrl(ADAPTER_SYNC_PATH) + '?iframe=1' + (query.length ? '&' + query.join('&') : '') + }]; + } else if (syncOptions.pixelEnabled) { + return [{ + type: 'image', + url: buildUrl(ADAPTER_SYNC_PATH) + (query.length ? '?' + query.join('&') : '') + }]; + } + }, + onSetTargeting: function (bid) { + // Call '/track/pending' with the corresponding bid.requestId + if (bid.ext && bid.ext.events && bid.ext.events.pending) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(bid.ext.events.pending); + } + }, + onBidWon: function (bid) { + // Call '/track/win' with the corresponding bid.requestId + if (bid.ext && bid.ext.events && bid.ext.events.win) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(bid.ext.events.win); + } + // Call 'track/runtime' with the corresponding bid.requestId - only once per auction + if (bid.ext && bid.ext.events && bid.ext.events.runtime && !_bidResponseTimeLogged.includes(bid.auctionId)) { + _bidResponseTimeLogged.push(bid.auctionId); + const _roundedTime = _roundResponseTime(bid.timeToRespond, 50); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(bid.ext.events.runtime.replace('{STATUS_CODE}', RUNTIME_STATUS_RESPONSE_TIME + _roundedTime)); + } + }, + onTimeout: function (timeoutData) { + // Call '/track/bid_timeout' with timeout data + const dataToSend = timeoutData.map(_ref => { + let { + params, + timeout + } = _ref; + const data = { + timeout + }; + if (params) { + data.params = params.map(item => { + return item && item.uid ? { + uid: parseInt(item.uid) + } : {}; + }); + } + return data; + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.triggerPixel)(buildUrl(TRACK_TIMEOUT_PATH) + '//' + JSON.stringify(dataToSend)); + } +}; +function buildUrl(path) { + return (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('devMode') ? DEBUG_URL : BASE_URL) + path; +} +function makeBanner(bannerParams) { + const bannerSizes = bannerParams && bannerParams.sizes; + if (bannerSizes) { + const sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.parseSizesInput)(bannerSizes); + if (sizes.length) { + const format = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.sizesToSizeTuples)(bannerSizes).map(_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.sizeTupleToRtbSize); + return { + format + }; + } + } +} +function makeVideo() { + let videoParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const video = Object.keys(videoParams).filter(param => param !== 'context' && param !== 'playerSize').reduce((result, param) => { + result[param] = videoParams[param]; + return result; + }, { + w: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(videoParams, 'playerSize.0.0'), + h: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(videoParams, 'playerSize.0.1') + }); + if (video.w && video.h) { + return video; + } +} +function buildImpObject(bid) { + const { + params: { + uid + }, + bidId, + mediaTypes, + sizes, + adUnitCode + } = bid; + const video = mediaTypes && _isVideoBid(bid) && _isValidVideoBid(bid) && makeVideo(mediaTypes.video); + const banner = makeBanner(mediaTypes && mediaTypes.banner || !video && { + sizes + }); + const impObject = { + id: bidId, + ...(banner && { + banner + }), + ...(video && { + video + }), + ext: { + bidder: { + uid: parseInt(uid) + } + } + }; + if (impObject.banner) { + impObject.ext.bidder.adslotExists = _isAdSlotExists(adUnitCode); + } + if (impObject.ext.bidder.uid && (impObject.banner || impObject.video)) { + return impObject; + } +} +function _addBidResponse(serverBid, bidsMap, currency, bidResponses) { + if (!serverBid) return; + let errorMessage; + if (!serverBid.auid) errorMessage = LOG_ERROR_MESS.noAuid + JSON.stringify(serverBid); + if (!serverBid.impid) errorMessage = LOG_ERROR_MESS.noImpId + JSON.stringify(serverBid); + if (!serverBid.adm) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);else { + const reqCurrency = currency || DEFAULT_CUR; + const bid = bidsMap[serverBid.impid]; + if (bid) { + if (serverBid.cur && serverBid.cur !== reqCurrency) { + errorMessage = LOG_ERROR_MESS.currencyMismatch + reqCurrency + ' - ' + serverBid.cur; + } else { + const bidResponse = { + requestId: bid.bidId, + cpm: serverBid.price, + width: serverBid.w, + height: serverBid.h, + creativeId: serverBid.auid, + currency: reqCurrency, + netRevenue: true, + ttl: TIME_TO_LIVE, + dealId: serverBid.dealid, + meta: { + advertiserDomains: serverBid.advertiserDomains ? serverBid.advertiserDomains : [], + mediaType: serverBid.mediaType + } + }; + if (serverBid.ext && serverBid.ext.prebid) { + bidResponse.ext = serverBid.ext.prebid; + if (serverBid.ext.visx && serverBid.ext.visx.events) { + const prebidExtEvents = bidResponse.ext.events || {}; + bidResponse.ext.events = Object.assign(prebidExtEvents, serverBid.ext.visx.events); + } + } + const visxTargeting = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(serverBid, 'ext.prebid.targeting'); + if (visxTargeting) { + bidResponse.adserverTargeting = visxTargeting; + } + if (!_isVideoInstreamBid(bid)) { + bidResponse.ad = serverBid.adm; + } else { + bidResponse.vastXml = serverBid.adm; + bidResponse.mediaType = 'video'; + } + bidResponses.push(bidResponse); + } + } else { + errorMessage = LOG_ERROR_MESS.noPlacementCode + serverBid.auid; + } + } + if (errorMessage) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(errorMessage); + } +} +function _isVideoBid(bid) { + return bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.VIDEO || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'mediaTypes.video'); +} +function _isVideoInstreamBid(bid) { + return _isVideoBid(bid) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'mediaTypes.video', {}).context === _src_video_js__WEBPACK_IMPORTED_MODULE_0__.INSTREAM; +} +function _isBannerBid(bid) { + return bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_2__.BANNER || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'mediaTypes.banner'); +} +function _isValidVideoBid(bid) { + let logErrors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + let result = true; + const videoMediaType = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(bid, 'mediaTypes.video'); + if (!_isVideoInstreamBid(bid)) { + if (logErrors) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(LOG_ERROR_MESS.onlyVideoInstream); + } + result = false; + } + if (!(videoMediaType.playerSize && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.parseSizesInput)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_7__["default"])(videoMediaType, 'playerSize', [])))) { + if (logErrors) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(LOG_ERROR_MESS.videoMissing + 'playerSize'); + } + result = false; + } + return result; +} +function _isAdSlotExists(adUnitCode) { + if (document.getElementById(adUnitCode)) { + return true; + } + const gptAdSlot = (0,_libraries_gptUtils_gptUtils_js__WEBPACK_IMPORTED_MODULE_8__.getGptSlotInfoForAdUnitCode)(adUnitCode); + if (gptAdSlot.divId && document.getElementById(gptAdSlot.divId)) { + return true; + } + return false; +} + +// Generate user id (25 chars) with NanoID +// https://github.com/ai/nanoid/ +function _generateUserId() { + for (var t = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict', e = new Date().getTime() % 1073741824, i = '', o = 0; o < 5; o++) { + i += t[e % 64]; + e = Math.floor(e / 64); + } + for (o = 20; o--;) i += t[64 * Math.random() | 0]; + return i; +} +function _getUserId() { + const USER_ID_KEY = '__vads'; + let vads; + if (storage.cookiesAreEnabled()) { + vads = storage.getCookie(USER_ID_KEY); + } else if (storage.localStorageIsEnabled()) { + vads = storage.getDataFromLocalStorage(USER_ID_KEY); + } + if (vads && vads.length) { + return vads; + } + vads = _generateUserId(); + if (storage.cookiesAreEnabled()) { + const expires = new Date(Date.now() + 2592e6).toUTCString(); + storage.setCookie(USER_ID_KEY, vads, expires); + return vads; + } else if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(USER_ID_KEY, vads); + return vads; + } + return null; +} +function _roundResponseTime(time, timeRange) { + if (time <= 0) { + return 0; // Special code for scriptLoadTime of 0 ms or less + } else if (time > 5000) { + return 100; // Constant code for scriptLoadTime greater than 5000 ms + } else { + const roundedValue = Math.floor((time - 1) / timeRange) + 1; + return roundedValue; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_9__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_10__.registerModule)('visxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","gptUtils","processResponse","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/visxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vlybyBidAdapter"],{ + +/***/ "./modules/vlybyBidAdapter.js": +/*!************************************!*\ + !*** ./modules/vlybyBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + +const ENDPOINT = '//prebid.vlyby.com/'; +const BIDDER_CODE = 'vlyby'; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + if (bid && bid.params && bid.params.publisherId) { + return true; + } + return false; + }, + buildRequests: function (validBidRequests) { + let bidderRequest = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const gdprConsent = bidderRequest.gdprConsent || {}; + return { + method: 'POST', + url: `${ENDPOINT}`, + data: { + request: { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidderRequest.auctionId + }, + gdprConsent: { + consentString: gdprConsent.consentString, + gdprApplies: gdprConsent.gdprApplies + }, + bidRequests: validBidRequests.map(_ref => { + let { + params, + sizes, + bidId, + adUnitCode + } = _ref; + return { + bidId, + adUnitCode, + params, + sizes + }; + }) + }, + options: { + withCredentials: false, + contentType: 'application/json' + }, + validBidRequests: validBidRequests + }; + }, + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + if (serverResponse.body) { + const vHB = serverResponse.body.bids; + try { + let bidResponse = { + requestId: vHB.bid, + cpm: vHB.cpm, + width: vHB.size.width, + height: vHB.size.height, + creativeId: vHB.creative.id, + currency: 'EUR', + netRevenue: true, + ttl: 360, + ad: vHB.creative.ad, + meta: { + adomain: vHB.adomain && Array.isArray(vHB.adomain) ? vHB.adomain : [] + } + }; + bidResponses.push(bidResponse); + } catch (e) {} + } + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('vlybyBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vlybyBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["voxBidAdapter"],{ + +/***/ "./modules/voxBidAdapter.js": +/*!**********************************!*\ + !*** ./modules/voxBidAdapter.js ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'vox'; +const SSP_ENDPOINT = 'https://ssp.hybrid.ai/auction/prebid'; +const VIDEO_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; +const TTL = 60; +const GVLID = 206; +function buildBidRequests(validBidRequests, bidderRequest) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._map)(validBidRequests, function (bid) { + const currency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_1__.getCurrencyFromBidderRequest)(bidderRequest); + const floorInfo = bid.getFloor ? bid.getFloor({ + currency: currency || 'USD' + }) : {}; + const params = bid.params; + const bidRequest = { + floorInfo, + schain: bid.schain, + userId: bid.userId, + bidId: bid.bidId, + // TODO: fix transactionId leak: https://github.com/prebid/Prebid.js/issues/9781 + transactionId: bid.transactionId, + sizes: bid.sizes, + placement: params.placement, + placeId: params.placementId, + imageUrl: params.imageUrl + }; + return bidRequest; + }); +} +const outstreamRender = bid => { + bid.renderer.push(() => { + window.ANOutstreamVideo.renderAd({ + sizes: [bid.width, bid.height], + targetId: bid.adUnitCode, + rendererOptions: { + showBigPlayButton: false, + showProgressBar: 'bar', + showVolume: false, + allowFullscreen: true, + skippable: false, + content: bid.vastXml + } + }); + }); +}; +const createRenderer = bid => { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_2__.Renderer.install({ + targetId: bid.adUnitCode, + url: VIDEO_RENDERER_URL, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logWarn)('Prebid Error calling setRender on renderer', err); + } + return renderer; +}; +function buildBid(bidData) { + const bid = { + requestId: bidData.bidId, + cpm: bidData.price, + width: bidData.content.width, + height: bidData.content.height, + creativeId: bidData.content.seanceId || bidData.bidId, + currency: bidData.currency, + netRevenue: true, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, + ttl: TTL, + content: bidData.content, + meta: { + advertiserDomains: bidData.advertiserDomains || [] + } + }; + if (bidData.placement === 'video') { + bid.vastXml = bidData.content; + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + const video = bidData.mediaTypes?.video; + if (video) { + bid.width = video.playerSize[0][0]; + bid.height = video.playerSize[0][1]; + if (video.context === 'outstream') { + bid.renderer = createRenderer(bid); + } + } + } else if (bidData.placement === 'inImage') { + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + bid.ad = wrapInImageBanner(bid, bidData); + } else { + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + bid.ad = wrapBanner(bid, bidData); + } + return bid; +} +function getMediaTypeFromBid(bid) { + return bid.mediaTypes && Object.keys(bid.mediaTypes)[0]; +} +function hasVideoMandatoryParams(mediaTypes) { + const isHasVideoContext = !!mediaTypes.video && (mediaTypes.video.context === 'instream' || mediaTypes.video.context === 'outstream'); + const isPlayerSize = !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(mediaTypes, 'video.playerSize') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(mediaTypes, 'video.playerSize')); + return isHasVideoContext && isPlayerSize; +} +function wrapInImageBanner(bid, bidData) { + return ` + + + + + + + + +
+ + + `; +} +function wrapBanner(bid, bidData) { + return ` + + + + + + + + +
+ + + `; +} +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid(bid) { + return !!bid.params.placementId && !!bid.params.placement && (getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER && bid.params.placement === 'banner' || getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER && bid.params.placement === 'inImage' && !!bid.params.imageUrl || getMediaTypeFromBid(bid) === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO && bid.params.placement === 'video' && hasVideoMandatoryParams(bid.mediaTypes)); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @param {Object} bidderRequest + * @return {Object} Info describing the request to the server. + */ + buildRequests(validBidRequests, bidderRequest) { + const payload = { + // TODO: is 'page' the right value here? + url: bidderRequest.refererInfo.page, + cmp: !!bidderRequest.gdprConsent, + bidRequests: buildBidRequests(validBidRequests, bidderRequest) + }; + if (payload.cmp) { + const gdprApplies = bidderRequest.gdprConsent.gdprApplies; + if (gdprApplies !== undefined) payload['ga'] = gdprApplies; + payload['cs'] = bidderRequest.gdprConsent.consentString; + } + const payloadString = JSON.stringify(payload); + return { + method: 'POST', + url: SSP_ENDPOINT, + data: payloadString, + options: { + contentType: 'application/json' + } + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bidRequests = JSON.parse(bidRequest.data).bidRequests; + const serverBody = serverResponse.body; + if (serverBody && serverBody.bids && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(serverBody.bids)) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__._map)(serverBody.bids, function (bid) { + let rawBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)(bidRequests, function (item) { + return item.bidId === bid.bidId; + }); + bid.placement = rawBid.placement; + bid.transactionId = rawBid.transactionId; + bid.placeId = rawBid.placeId; + return buildBid(bid); + }); + } else { + return []; + } + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('voxBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/voxBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vrtcalBidAdapter"],{ + +/***/ "./modules/vrtcalBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/vrtcalBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); + + + + + + +const GVLID = 706; +const VRTCAL_USER_SYNC_URL_IFRAME = `https://usync.vrtcal.com/i?ssp=1804&synctype=iframe`; +const VRTCAL_USER_SYNC_URL_REDIRECT = `https://usync.vrtcal.com/i?ssp=1804&synctype=redirect`; +const spec = { + code: 'vrtcal', + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return true; + }, + buildRequests: function (bidRequests) { + const requests = bidRequests.map(function (bid) { + let floor = 0; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor)) { + const floorInfo = bid.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: bid.sizes.map(_ref => { + let [w, h] = _ref; + return { + w, + h + }; + }) + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(floorInfo) && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) { + floor = Math.max(floor, parseFloat(floorInfo.floor)); + } + } + let gdprApplies = 0; + let gdprConsent = ''; + let ccpa = ''; + let coppa = 0; + let tmax = 0; + let eids = []; + if (bidRequests[0].userIdAsEids && bidRequests[0].userIdAsEids.length > 0) { + eids = bidRequests[0].userIdAsEids; + } + if (bid && bid.gdprConsent) { + gdprApplies = bid.gdprConsent.gdprApplies ? 1 : 0; + gdprConsent = bid.gdprConsent.consentString; + } + if (bid && bid.uspConsent) { + ccpa = bid.uspConsent; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + coppa = 1; + } + tmax = bid.timeout; + const params = { + prebidJS: 1, + prebidAdUnitCode: bid.adUnitCode, + id: bid.bidId, + tmax: tmax, + imp: [{ + id: '1', + banner: {}, + bidfloor: floor + }], + site: { + id: 'VRTCAL_FILLED', + name: 'VRTCAL_FILLED', + cat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'ortb2.site.cat', []), + domain: decodeURIComponent(window.location.href).replace('https://', '').replace('http://', '').split('/')[0], + page: window.location.href + }, + device: { + language: navigator.language, + ua: navigator.userAgent, + ip: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.bidOverride.device.ip') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(bid, 'params.ext.ip') || undefined + }, + regs: { + coppa: coppa, + ext: { + gdpr: gdprApplies, + us_privacy: ccpa + } + }, + user: { + ext: { + consent: gdprConsent, + eids: eids + } + } + }; + if (typeof bid.mediaTypes !== 'undefined' && typeof bid.mediaTypes.banner !== 'undefined' && typeof bid.mediaTypes.banner.sizes !== 'undefined') { + params.imp[0].banner.w = bid.mediaTypes.banner.sizes[0][0]; + params.imp[0].banner.h = bid.mediaTypes.banner.sizes[0][1]; + } else { + params.imp[0].banner.w = bid.sizes[0][0]; + params.imp[0].banner.h = bid.sizes[0][1]; + } + if (bid.ortb2?.regs?.gpp) { + params.regs.ext.gpp = bid.ortb2.regs.gpp; + params.regs.ext.gpp_sid = bid.ortb2.regs.gpp_sid; + } + return { + method: 'POST', + url: 'https://rtb.vrtcal.com/bidder_prebid.vap?ssp=1804', + data: JSON.stringify(params), + options: { + withCredentials: false, + crossOrigin: true + } + }; + }); + return requests; + }, + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse || !serverResponse.body) { + return []; + } + const bidResponses = []; + var response = serverResponse.body; + if (response) { + const bidResponse = { + requestId: response.id, + cpm: response.seatbid[0].bid[0].price, + width: response.seatbid[0].bid[0].w, + height: response.seatbid[0].bid[0].h, + creativeId: response.seatbid[0].bid[0].crid, + currency: 'USD', + netRevenue: true, + ttl: 900, + ad: response.seatbid[0].bid[0].adm, + nurl: response.seatbid[0].bid[0].nurl + }; + if (response.seatbid[0].bid[0].adomain && response.seatbid[0].bid[0].adomain.length) { + bidResponse.meta = { + advertiserDomains: response.seatbid[0].bid[0].adomain + }; + } + bidResponses.push(bidResponse); + } + return bidResponses; + }, + onBidWon: function (bid) { + if (!bid.nurl) { + return false; + } + const winUrl = bid.nurl.replace(/\$\{AUCTION_PRICE\}/, bid.cpm); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(winUrl, null); + return true; + }, + getUserSyncs: function (syncOptions, serverResponses) { + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let uspConsent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + let gppConsent = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + const syncs = []; + const gdprFlag = `&gdpr=${gdprConsent.gdprApplies ? 1 : 0}`; + const gdprString = `&gdpr_consent=${encodeURIComponent(gdprConsent.consentString || '')}`; + const usPrivacy = `&us_privacy=${encodeURIComponent(uspConsent)}`; + const gpp = gppConsent.gppString ? gppConsent.gppString : ''; + const gppSid = Array.isArray(gppConsent.applicableSections) ? gppConsent.applicableSections.join(',') : ''; + let vrtcalSyncURL = ''; + if (syncOptions.iframeEnabled) { + vrtcalSyncURL = `${VRTCAL_USER_SYNC_URL_IFRAME}${usPrivacy}${gdprFlag}${gdprString}&gpp=${gpp}&gpp_sid=${gppSid}&surl=`; + syncs.push({ + type: 'iframe', + url: vrtcalSyncURL + }); + } else { + vrtcalSyncURL = `${VRTCAL_USER_SYNC_URL_REDIRECT}${usPrivacy}${gdprFlag}${gdprString}&gpp=${gpp}&gpp_sid=${gppSid}&surl=`; + syncs.push({ + type: 'image', + url: vrtcalSyncURL + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('vrtcalBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vrtcalBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["vuukleBidAdapter"],{ + +/***/ "./modules/vuukleBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/vuukleBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); + + + + + +const BIDDER_CODE = 'vuukle'; +const URL = 'https://pb.vuukle.com/adapter'; +const TIME_TO_LIVE = 360; +const VENDOR_ID = 1004; +const spec = { + code: BIDDER_CODE, + gvlid: VENDOR_ID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return true; + }, + buildRequests: function (bidRequests, bidderRequest) { + bidderRequest = bidderRequest || {}; + const requests = bidRequests.map(function (bid) { + const parseSized = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bid.sizes); + const arrSize = parseSized[0].split('x'); + const params = { + url: encodeURIComponent(window.location.href), + sizes: JSON.stringify(parseSized), + width: arrSize[0], + height: arrSize[1], + params: JSON.stringify(bid.params), + rnd: Math.random(), + bidId: bid.bidId, + source: 'pbjs', + schain: JSON.stringify(bid.schain), + requestId: bid.bidderRequestId, + tmax: bidderRequest.timeout, + gdpr: bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? 1 : 0, + consentGiven: vuukleGetConsentGiven(bidderRequest.gdprConsent), + version: "9.45.0-pre", + v: 2 + }; + if (bidderRequest.uspConsent) { + params.uspConsent = bidderRequest.uspConsent; + } + if (_src_config_js__WEBPACK_IMPORTED_MODULE_2__.config.getConfig('coppa') === true) { + params.coppa = 1; + } + if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString) { + params.consent = bidderRequest.gdprConsent.consentString; + } + return { + method: 'GET', + url: URL, + data: params, + options: { + withCredentials: false + } + }; + }); + return requests; + }, + interpretResponse: function (serverResponse, bidRequest) { + if (!serverResponse || !serverResponse.body || !serverResponse.body.ad) { + return []; + } + const res = serverResponse.body; + const bidResponse = { + requestId: bidRequest.data.bidId, + cpm: res.cpm, + width: res.width, + height: res.height, + creativeId: res.creative_id, + currency: res.currency || 'USD', + netRevenue: true, + ttl: TIME_TO_LIVE, + ad: res.ad, + meta: { + advertiserDomains: Array.isArray(res.adomain) ? res.adomain : [] + } + }; + return [bidResponse]; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +function vuukleGetConsentGiven(gdprConsent) { + let consentGiven = 0; + if (typeof gdprConsent !== 'undefined') { + consentGiven = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(gdprConsent, `vendorData.vendor.consents.${VENDOR_ID}`) ? 1 : 0; + } + return consentGiven; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('vuukleBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/vuukleBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["waardexBidAdapter"],{ + +/***/ "./modules/waardexBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/waardexBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + +const ENDPOINT = `https://hb.justbidit.xyz:8843/prebid`; +const BIDDER_CODE = 'waardex'; +const isBidRequestValid = bid => { + if (!bid.bidId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.bidId should be non-empty'); + return false; + } + if (!bid.params) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params should be non-empty'); + return false; + } + if (!+bid.params.zoneId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.params.zoneId should be non-empty Number'); + return false; + } + if (bid.mediaTypes && bid.mediaTypes.video) { + if (!bid.mediaTypes.video.playerSize) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.mediaTypes.video.playerSize should be non-empty'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.mediaTypes.video.playerSize)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.mediaTypes.video.playerSize should be an Array'); + return false; + } + if (!bid.mediaTypes.video.playerSize[0]) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.mediaTypes.video.playerSize should be non-empty'); + return false; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(bid.mediaTypes.video.playerSize[0])) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(BIDDER_CODE + ': bid.mediaTypes.video.playerSize should be non-empty Array'); + return false; + } + } + return true; +}; +const buildRequests = (validBidRequests, bidderRequest) => { + const dataToSend = { + ...getCommonBidsData(bidderRequest), + bidRequests: getBidRequestsToSend(validBidRequests) + }; + let zoneId = ''; + if (validBidRequests[0] && validBidRequests[0].params && +validBidRequests[0].params.zoneId) { + zoneId = +validBidRequests[0].params.zoneId; + } + return { + method: 'POST', + url: `${ENDPOINT}?pubId=${zoneId}`, + data: dataToSend + }; +}; +const getCommonBidsData = bidderRequest => { + const payload = { + ua: navigator.userAgent || '', + language: navigator.language && navigator.language.indexOf('-') !== -1 ? navigator.language.split('-')[0] : '' + }; + if (bidderRequest && bidderRequest.refererInfo) { + // TODO: is 'page' the right value here? + payload.referer = encodeURIComponent(bidderRequest.refererInfo.page || ''); + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.gdprConsent) { + payload.gdpr_consent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + } + payload.coppa = !!_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('coppa'); + return payload; +}; +const getBidRequestsToSend = validBidRequests => { + return validBidRequests.map(getBidRequestToSend); +}; +const getBidRequestToSend = validBidRequest => { + const result = { + bidId: validBidRequest.bidId, + bidfloor: 0, + position: parseInt(validBidRequest.params.position) || 1, + instl: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequest.ortb2Imp, 'instl') === 1 || parseInt(validBidRequest.params.instl) === 1 ? 1 : 0 + }; + if (validBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER]) { + result[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER] = createBannerObject(validBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER]); + } + if (validBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO]) { + result[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO] = createVideoObject(validBidRequest.mediaTypes[_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], validBidRequest.params); + } + return result; +}; +const createBannerObject = banner => { + return { + sizes: transformSizes(banner.sizes) + }; +}; +const transformSizes = requestSizes => { + let result = []; + if (Array.isArray(requestSizes) && !Array.isArray(requestSizes[0])) { + result[0] = { + width: parseInt(requestSizes[0], 10) || 0, + height: parseInt(requestSizes[1], 10) || 0 + }; + } else if (Array.isArray(requestSizes) && Array.isArray(requestSizes[0])) { + result = requestSizes.map(item => { + return { + width: parseInt(item[0], 10) || 0, + height: parseInt(item[1], 10) || 0 + }; + }); + } + return result; +}; +const createVideoObject = (videoMediaTypes, videoParams) => { + return { + w: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(videoMediaTypes, 'playerSize')[0][0], + h: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(videoMediaTypes, 'playerSize')[0][1], + mimes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('mimes', videoParams) || ['application/javascript', 'video/mp4', 'video/webm'], + minduration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('minduration', videoParams) || 0, + maxduration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('maxduration', videoParams) || 500, + protocols: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('protocols', videoParams) || [2, 3, 5, 6], + startdelay: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('startdelay', videoParams) || 0, + skip: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('skip', videoParams) || 1, + skipafter: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('skipafter', videoParams) || 0, + minbitrate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('minbitrate', videoParams) || 0, + maxbitrate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('maxbitrate', videoParams) || 3500, + delivery: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('delivery', videoParams) || [2], + playbackmethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('playbackmethod', videoParams) || [1, 2, 3, 4], + api: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('api', videoParams) || [2], + linearity: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBidIdParameter)('linearity', videoParams) || 1 + }; +}; +const interpretResponse = (serverResponse, bidRequest) => { + try { + const responseBody = serverResponse.body; + if (!responseBody.seatbid || !responseBody.seatbid[0]) { + return []; + } + return responseBody.seatbid[0].bid.map(openRtbBid => { + const hbRequestBid = getHbRequestBid(openRtbBid, bidRequest.data); + if (!hbRequestBid) return; + const hbRequestMediaType = getHbRequestMediaType(hbRequestBid); + if (!hbRequestMediaType) return; + return mapOpenRtbToHbBid(openRtbBid, hbRequestMediaType, hbRequestBid); + }).filter(x => x); + } catch (e) { + return []; + } +}; +const getHbRequestBid = (openRtbBid, bidRequest) => { + return (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_4__.find)(bidRequest.bidRequests, x => x.bidId === openRtbBid.impid); +}; +const getHbRequestMediaType = hbRequestBid => { + if (hbRequestBid.banner) return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + if (hbRequestBid.video) return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + return null; +}; +const mapOpenRtbToHbBid = (openRtbBid, mediaType, hbRequestBid) => { + let bid = null; + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + bid = mapOpenRtbBannerToHbBid(openRtbBid, hbRequestBid); + } + if (mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + bid = mapOpenRtbVideoToHbBid(openRtbBid, hbRequestBid); + } + return isBidValid(bid) ? bid : null; +}; +const mapOpenRtbBannerToHbBid = (openRtbBid, hbRequestBid) => { + return { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, + requestId: hbRequestBid.bidId, + cpm: openRtbBid.price, + currency: 'USD', + width: openRtbBid.w, + height: openRtbBid.h, + creativeId: openRtbBid.crid, + netRevenue: true, + ttl: 3000, + ad: openRtbBid.adm, + dealId: openRtbBid.dealid, + meta: { + cid: openRtbBid.cid, + adomain: openRtbBid.adomain, + mediaType: openRtbBid.ext && openRtbBid.ext.mediaType + } + }; +}; +const mapOpenRtbVideoToHbBid = (openRtbBid, hbRequestBid) => { + return { + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO, + requestId: hbRequestBid.bidId, + cpm: openRtbBid.price, + currency: 'USD', + width: hbRequestBid.video.w, + height: hbRequestBid.video.h, + ad: openRtbBid.adm, + ttl: 3000, + creativeId: openRtbBid.crid, + netRevenue: true, + vastUrl: getVastUrl(openRtbBid), + // An impression tracking URL to serve with video Ad + // Optional; only usable with vastUrl and requires prebid cache to be enabled + // Example: "https://vid.exmpale.com/imp/134" + // For now we don't need this field + // vastImpUrl: null, + vastXml: openRtbBid.adm, + dealId: openRtbBid.dealid, + meta: { + cid: openRtbBid.cid, + adomain: openRtbBid.adomain, + networkId: null, + networkName: null, + agencyId: null, + agencyName: null, + advertiserId: null, + advertiserName: null, + advertiserDomains: null, + brandId: null, + brandName: null, + primaryCatId: null, + secondaryCatIds: null, + mediaType: 'video' + } + }; +}; +const getVastUrl = openRtbBid => { + const adm = (openRtbBid.adm || '').trim(); + if (adm.startsWith('http')) { + return adm; + } else { + return null; + } +}; +const isBidValid = bid => { + if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) { + return false; + } + return Boolean(bid.width && bid.height && bid.ad); +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + isBidRequestValid, + buildRequests, + interpretResponse +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('waardexBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/waardexBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["weboramaRtdProvider"],{ + +/***/ "./modules/weboramaRtdProvider.js": +/*!****************************************!*\ + !*** ./modules/weboramaRtdProvider.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY, DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY, storage, isValidProfile, weboramaSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/urlUtils/urlUtils.js */ "./libraries/urlUtils/urlUtils.js"); + +/** + * This module adds Weborama provider to the real time data module + * The {@link module:modules/realTimeData} module is required + * The module will fetch contextual data (page-centric) from Weborama server + * and may access user-centric data from local storage + * @module modules/weboramaRtdProvider + * @requires module:modules/realTimeData + */ + +/** + * profile metadata + * @typedef dataCallbackMetadata + * @property {boolean} user if true it is user-centric data + * @property {string} source describe the source of data, if 'contextual' or 'wam' + * @property {boolean} isDefault if true it the default profile defined in the configuration + */ + +/** + * profile from contextual, wam or sfbx + * @typedef {Object.} Profile + */ + +/** + * onData callback type + * @callback dataCallback + * @param {Profile} data profile data + * @param {dataCallbackMetadata} meta metadata + * @returns {void} + */ + +/** + * setPrebidTargeting callback type + * @callback setPrebidTargetingCallback + * @param {string} adUnitCode + * @param {Profile} data + * @param {dataCallbackMetadata} metadata + * @returns {boolean} + */ + +/** + * sendToBidders callback type + * @callback sendToBiddersCallback + * @param {Object} bid + * @param {string} adUnitCode + * @param {Profile} data + * @param {dataCallbackMetadata} metadata + * @returns {boolean} + */ + +/** + * @typedef {Object} ModuleParams + * @property {?setPrebidTargetingCallback|?boolean|?Object} setPrebidTargeting if true, will set the GAM targeting (default undefined) + * @property {?sendToBiddersCallback|?boolean|?Object} sendToBidders if true, will send the contextual profile to all bidders, else expects a list of allowed bidders (default undefined) + * @property {?dataCallback} onData callback + * @property {?WeboCtxConf} weboCtxConf site-centric contextual configuration + * @property {?WeboUserDataConf} weboUserDataConf user-centric wam configuration + * @property {?SfbxLiteDataConf} sfbxLiteDataConf site-centric lite configuration + */ + +/** + * @callback assetIDcallback + * @returns {string} should return asset identifier using the form datasource:docId + */ +/** + * @typedef {Object} WeboCtxConf + * @property {string} token required token to be used on bigsea contextual API requests + * @property {?string} targetURL specify the target url instead use the referer + * @property {?assetIDcallback|?string} assetID specifies the assert identifier using the form datasource:docId or via callback + * @property {?setPrebidTargetingCallback|?boolean|?Object} setPrebidTargeting if true, will set the GAM targeting (default undefined) + * @property {?sendToBiddersCallback|?boolean|?Object} sendToBidders if true, will send the contextual profile to all bidders, else expects a list of allowed bidders (default undefined) + * @property {?dataCallback} onData callback + * @property {?Profile} defaultProfile to be used if the profile is not found + * @property {?boolean} enabled if false, will ignore this configuration + * @property {?string} baseURLProfileAPI to be used to point to a different domain than ctx.weborama.com + */ + +/** + * @typedef {Object} WeboUserDataConf + * @property {?number} accountId wam account id + * @property {?setPrebidTargetingCallback|?boolean|?Object} setPrebidTargeting if true, will set the GAM targeting (default undefined) + * @property {?sendToBiddersCallback|?boolean|?Object} sendToBidders if true, will send the contextual profile to all bidders, else expects a list of allowed bidders (default undefined) + * @property {?Profile} defaultProfile to be used if the profile is not found + * @property {?dataCallback} onData callback + * @property {?string} localStorageProfileKey can be used to customize the local storage key (default is 'webo_wam2gam_entry') + * @property {?boolean} enabled if false, will ignore this configuration + */ + +/** + * @typedef {Object} SfbxLiteDataConf + * @property {?setPrebidTargetingCallback|?boolean|?Object} setPrebidTargeting if true, will set the GAM targeting (default undefined) + * @property {?sendToBiddersCallback|?boolean|?Object} sendToBidders if true, will send the contextual profile to all bidders, else expects a list of allowed bidders (default undefined) + * @property {?Profile} defaultProfile to be used if the profile is not found + * @property {?dataCallback} onData callback + * @property {?string} localStorageProfileKey can be used to customize the local storage key (default is '_lite') + * @property {?boolean} enabled if false, will ignore this configuration + */ + +/** + * common configuration between contextual, wam and sfbx + * @typedef {WeboCtxConf|WeboUserDataConf|SfbxLiteDataConf} CommonConf + */ + + + + + + + + + + +/** @type {string} */ +const MODULE_NAME = 'realTimeData'; +/** @type {string} */ +const SUBMODULE_NAME = 'weborama'; +/** @type {string} */ +const BASE_URL_CONTEXTUAL_PROFILE_API = 'ctx.weborama.com'; +/** @type {string} */ +const DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY = 'webo_wam2gam_entry'; +/** @type {string} */ +const LOCAL_STORAGE_USER_TARGETING_SECTION = 'targeting'; +/** @type {string} */ +const DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY = '_lite'; +/** @type {string} */ +const LOCAL_STORAGE_LITE_TARGETING_SECTION = 'webo'; +/** @type {string} */ +const WEBO_CTX_CONF_SECTION = 'weboCtxConf'; +/** @type {string} */ +const WEBO_USER_DATA_CONF_SECTION = 'weboUserDataConf'; +/** @type {string} */ +const SFBX_LITE_DATA_CONF_SECTION = 'sfbxLiteDataConf'; +/** @type {string} */ +const WEBO_CTX_SOURCE_LABEL = 'contextual'; +/** @type {string} */ +const WEBO_USER_DATA_SOURCE_LABEL = 'wam'; +/** @type {string} */ +const SFBX_LITE_DATA_SOURCE_LABEL = 'lite'; +/** @type {number} */ +const GVLID = 284; +const logger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)('[WeboramaRTD]'); +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_1__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, + moduleName: SUBMODULE_NAME +}); + +/** + * @typedef {Object} Component + * @property {boolean} initialized + * @property {?Profile} data + * @property {boolean} user if true it is user-centric data + * @property {string} source describe the source of data, if 'contextual' or 'wam' + * @property {buildProfileHandlerCallbackBuilder} callbackBuilder + */ + +/** + * @typedef {Object} Components + * @property {Component} WeboCtx + * @property {Component} WeboUserData + * @property {Component} SfbxLiteData + */ + +/** + * @classdesc Weborama Real Time Data Provider + * @class + */ +class WeboramaRtdProvider { + #components; + name = SUBMODULE_NAME; + gvlid = GVLID; + /** + * @param {Components} components + */ + constructor(components) { + this.#components = components; + } + /** + * Initialize module + * @function + * @param {Object} moduleConfig + * @param {?ModuleParams} moduleConfig.params + * @param {Object} userConsent + * @param {?Object} userConsent.gdpr + * @return {boolean} true if module was initialized with success + */ + init(moduleConfig, userConsent) { + /** @type {Object} */ + const globalDefaults = { + setPrebidTargeting: true, + sendToBidders: true, + onData: () => { + /* do nothing */ + } + }; + /** @type {ModuleParams} */ + const moduleParams = Object.assign({}, globalDefaults, moduleConfig?.params || {}); + + // reset profiles + + this.#components.WeboCtx.data = null; + this.#components.WeboUserData.data = null; + this.#components.SfbxLiteData.data = null; + const weboCtxRequiredFields = ['token']; + this.#components.WeboCtx.initialized = this.#initSubSection(moduleParams, WEBO_CTX_CONF_SECTION, { + requiredFields: weboCtxRequiredFields + }); + this.#components.WeboUserData.initialized = this.#initSubSection(moduleParams, WEBO_USER_DATA_CONF_SECTION, { + userConsent: userConsent || {} + }); + this.#components.SfbxLiteData.initialized = this.#initSubSection(moduleParams, SFBX_LITE_DATA_CONF_SECTION); + return Object.values(this.#components).some(c => c.initialized); + } + + /** + * function that will allow RTD sub-modules to modify the AdUnit object for each auction + * @function + * @param {Object} reqBidsConfigObj + * @param {doneCallback} onDone + * @param {Object} moduleConfig + * @param {?ModuleParams} moduleConfig.params + * @returns {void} + */ + getBidRequestData(reqBidsConfigObj, onDone, moduleConfig) { + /** @type {ModuleParams} */ + const moduleParams = moduleConfig?.params || {}; + if (!this.#components.WeboCtx.initialized) { + this.#handleBidRequestData(reqBidsConfigObj, moduleParams); + onDone(); + return; + } + + /** @type {WeboCtxConf} */ + const weboCtxConf = moduleParams.weboCtxConf || {}; + this.#fetchContextualProfile(weboCtxConf, data => { + logger.logMessage('fetchContextualProfile on getBidRequestData is done'); + this.#setWeboContextualProfile(data); + }, () => { + this.#handleBidRequestData(reqBidsConfigObj, moduleParams); + onDone(); + }); + } + + /** + * function that provides ad server targeting data to RTD-core + * @function + * @param {string[]} adUnitsCodes + * @param {Object} moduleConfig + * @param {?ModuleParams} moduleConfig.params + * @returns {Object} target data + */ + getTargetingData(adUnitsCodes, moduleConfig) { + /** @type {ModuleParams} */ + const moduleParams = moduleConfig?.params || {}; + const profileHandlers = this.#buildProfileHandlers(moduleParams); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(profileHandlers)) { + logger.logMessage('no data to set targeting'); + return {}; + } + try { + return adUnitsCodes.reduce((data, adUnitCode) => { + data[adUnitCode] = profileHandlers.reduce((targeting, ph) => { + // logger.logMessage(`check if should set targeting for adunit '${adUnitCode}'`); + const [data, metadata] = this.#copyDataAndMetadata(ph); + if (ph.setTargeting(adUnitCode, data, metadata)) { + // logger.logMessage(`set targeting for adunit '${adUnitCode}', source '${metadata.source}'`); + + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(targeting, data); + } + return targeting; + }, {}); + return data; + }, {}); + } catch (e) { + logger.logError(`unable to format weborama rtd targeting data:`, e); + return {}; + } + } + + /** + * Initialize subsection module + * @function + * @private + * @param {ModuleParams} moduleParams + * @param {string} subSection subsection name to initialize + * @param {?Object} extra + * @param {string[]} extra.requiredFields + * @param {?Object} extra.userConsent + * @return {boolean} true if module subsection was initialized with success + */ + #initSubSection(moduleParams, subSection, extra) { + /** @type {CommonConf} */ + const weboSectionConf = moduleParams[subSection] || { + enabled: false + }; + if (weboSectionConf.enabled === false) { + delete moduleParams[subSection]; + return false; + } + try { + this.#normalizeConf(moduleParams, weboSectionConf); + extra = extra || {}; + const requiredFields = extra?.requiredFields || []; + requiredFields.forEach(field => { + if (!(field in weboSectionConf)) { + throw `missing required field '${field}'`; + } + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(extra?.userConsent?.gdpr) && !this.#checkTCFv2(extra.userConsent.gdpr)) { + throw 'gdpr consent not ok'; + } + } catch (e) { + logger.logError(`unable to initialize: error on '${subSection}' configuration:`, e); + return false; + } + logger.logMessage(`weborama '${subSection}' initialized with success`); + return true; + } + + /** + * check gdpr consent data + * @function + * @private + * @param {Object} gdpr + * @param {?boolean} gdpr.gdprApplies + * @param {?Object} gdpr.vendorData + * @param {?Object} gdpr.vendorData.purpose + * @param {?Object.} gdpr.vendorData.purpose.consents + * @param {?Object} gdpr.vendorData.vendor + * @param {?Object.} gdpr.vendorData.vendor.consents + * @return {boolean} + */ + + #checkTCFv2(gdpr) { + if (gdpr?.gdprApplies !== true) { + return true; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gdpr, 'vendorData.vendor.consents') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gdpr, 'vendorData.purpose.consents')) { + return gdpr.vendorData.vendor.consents[GVLID] === true && + // check weborama vendor id + gdpr.vendorData.purpose.consents[1] === true && + // info storage access + gdpr.vendorData.purpose.consents[3] === true && + // create personalized ads + gdpr.vendorData.purpose.consents[4] === true && + // select personalized ads + gdpr.vendorData.purpose.consents[5] === true && + // create personalized content + gdpr.vendorData.purpose.consents[6] === true; // select personalized content + } + return true; + } + /** + * normalize submodule configuration + * @function + * @private + * @param {ModuleParams} moduleParams + * @param {CommonConf} submoduleParams + * @return {void} + * @throws will throw an error in case of invalid configuration + */ + + #normalizeConf(moduleParams, submoduleParams) { + submoduleParams.defaultProfile = submoduleParams.defaultProfile || {}; + const { + setPrebidTargeting, + sendToBidders, + onData + } = moduleParams; + submoduleParams.setPrebidTargeting ??= setPrebidTargeting; + submoduleParams.sendToBidders ??= sendToBidders; + submoduleParams.onData ??= onData; + + // handle setPrebidTargeting + this.#coerceSetPrebidTargeting(submoduleParams); + + // handle sendToBidders + this.#coerceSendToBidders(submoduleParams); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(submoduleParams.onData)) { + throw 'onData parameter should be a callback'; + } + if (!isValidProfile(submoduleParams.defaultProfile)) { + throw 'defaultProfile is not valid'; + } + } + + /** + * coerce setPrebidTargeting to a callback + * @function + * @private + * @param {CommonConf} submoduleParams + * @return {void} + * @throws will throw an error in case of invalid configuration + */ + + #coerceSetPrebidTargeting(submoduleParams) { + try { + submoduleParams.setPrebidTargeting = this.#wrapValidatorCallback(submoduleParams.setPrebidTargeting); + } catch (e) { + throw `invalid setPrebidTargeting: ${e}`; + } + } + + /** + * coerce sendToBidders to a callback + * @function + * @private + * @param {CommonConf} submoduleParams + * @return {void} + * @throws will throw an error in case of invalid configuration + */ + + #coerceSendToBidders(submoduleParams) { + let sendToBidders = submoduleParams.sendToBidders; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(sendToBidders)) { + const sendToBiddersMap = Object.entries(sendToBidders).reduce((map, _ref) => { + let [key, value] = _ref; + map[key] = this.#wrapValidatorCallback(value); + return map; + }, {}); + submoduleParams.sendToBidders = (bid, adUnitCode) => { + const bidder = bid.bidder; + if (!(bidder in sendToBiddersMap)) { + return false; + } + const validatorCallback = sendToBiddersMap[bidder]; + try { + return validatorCallback(adUnitCode); + } catch (e) { + throw `invalid sendToBidders[${bidder}]: ${e}`; + } + }; + return; + } + try { + submoduleParams.sendToBidders = this.#wrapValidatorCallback(submoduleParams.sendToBidders, bid => bid.bidder); + } catch (e) { + throw `invalid sendToBidders: ${e}`; + } + } + + /** + * @typedef {Object} AdUnit + * @property {Object[]} bids + */ + /** + * function that handles bid request data + * @function + * @private + * @param {Object} reqBidsConfigObj + * @param {AdUnit[]} reqBidsConfigObj.adUnits + * @param {Object} reqBidsConfigObj.ortb2Fragments + * @param {Object} reqBidsConfigObj.ortb2Fragments.bidder + * @param {ModuleParams} moduleParams + * @returns {void} + */ + + #handleBidRequestData(reqBidsConfigObj, moduleParams) { + const profileHandlers = this.#buildProfileHandlers(moduleParams); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(profileHandlers)) { + logger.logMessage('no data to send to bidders'); + return; + } + const adUnits = reqBidsConfigObj.adUnits || (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.getGlobal)().adUnits; + try { + adUnits.forEach(adUnit => adUnit.bids?.forEach(bid => profileHandlers.forEach(ph => { + // logger.logMessage(`check if bidder '${bid.bidder}' and adunit '${adUnit.code} are share ${ph.metadata.source} data`); + + const [data, metadata] = this.#copyDataAndMetadata(ph); + if (ph.sendToBidders(bid, adUnit.code, data, metadata)) { + // logger.logMessage(`handling bidder '${bid.bidder}' with ${ph.metadata.source} data`); + + this.#handleBid(reqBidsConfigObj, bid, data, ph.metadata); + } + }))); + } catch (e) { + logger.logError('unable to send data to bidders:', e); + } + profileHandlers.forEach(ph => { + try { + const [data, metadata] = this.#copyDataAndMetadata(ph); + ph.onData(data, metadata); + } catch (e) { + logger.logError(`error while execute onData callback with ${ph.metadata.source}-based data:`, e); + } + }); + } + + /** + * onSuccess callback type + * @callback successCallback + * @param {?Object} data + * @returns {void} + */ + + /** + * onDone callback type + * @callback doneCallback + * @returns {void} + */ + + /** + * Fetch Bigsea Contextual Profile + * @function + * @private + * @param {WeboCtxConf} weboCtxConf + * @param {successCallback} onSuccess callback + * @param {doneCallback} onDone callback + * @returns {void} + */ + + #fetchContextualProfile(weboCtxConf, onSuccess, onDone) { + const token = weboCtxConf.token; + const baseURLProfileAPI = weboCtxConf.baseURLProfileAPI || BASE_URL_CONTEXTUAL_PROFILE_API; + let path = '/profile'; + let queryString = ''; + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(queryString, 'token', token); + if (weboCtxConf.assetID) { + path = '/document-profile'; + let assetID = weboCtxConf.assetID; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(assetID)) { + try { + assetID = weboCtxConf.assetID(); + } catch (e) { + logger.logError('unexpected error while fetching asset id from callback', e); + onDone(); + return; + } + } + if (!assetID) { + logger.logError('missing asset id'); + onDone(); + return; + } + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(queryString, 'assetId', assetID); + } + const targetURL = weboCtxConf.targetURL || document.URL; + queryString = (0,_libraries_urlUtils_urlUtils_js__WEBPACK_IMPORTED_MODULE_5__.tryAppendQueryString)(queryString, 'url', targetURL); + const urlProfileAPI = `https://${baseURLProfileAPI}/api${path}?${queryString}`; + const success = (response, req) => { + if (req.status === 200) { + const data = JSON.parse(response); + onSuccess(data); + } else { + throw `unexpected http status response ${req.status} with response ${response}`; + } + onDone(); + }; + const error = (e, req) => { + logger.logError(`unable to get weborama data`, e, req); + onDone(); + }; + const callback = { + success, + error + }; + const options = { + method: 'GET', + withCredentials: false + }; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_6__.ajax)(urlProfileAPI, callback, null, options); + } + + /** + * set bigsea contextual profile on module state + * @function + * @private + * @param {?Object} data + * @returns {void} + */ + + #setWeboContextualProfile(data) { + if (data && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(data) && isValidProfile(data) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(data)) { + this.#components.WeboCtx.data = data; + } + } + + /** + * function that provides data handlers based on the configuration + * @function + * @private + * @param {ModuleParams} moduleParams + * @returns {ProfileHandler[]} + */ + + #buildProfileHandlers(moduleParams) { + const steps = [{ + component: this.#components.WeboCtx, + conf: moduleParams?.weboCtxConf + }, { + component: this.#components.WeboUserData, + conf: moduleParams?.weboUserDataConf + }, { + component: this.#components.SfbxLiteData, + conf: moduleParams?.sfbxLiteDataConf + }]; + return steps.filter(step => step.component.initialized).reduce((ph, _ref2) => { + let { + component, + conf + } = _ref2; + const user = component.user; + const source = component.source; + const callback = component.callbackBuilder(component /* equivalent to this */); + const profileHandler = this.#buildProfileHandler(conf, callback, user, source); + if (profileHandler) { + ph.push(profileHandler); + } else { + logger.logMessage(`skip ${source} profile: no data`); + } + return ph; + }, []); + } + + /** + * @typedef {Object} ProfileHandler + * @property {Profile} data + * @property {dataCallbackMetadata} metadata + * @property {setPrebidTargetingCallback} setTargeting + * @property {sendToBiddersCallback} sendToBidders + * @property {dataCallback} onData + */ + + /** + * @callback buildProfileHandlerCallbackBuilder + * @param {Component} component + * @returns {buildProfileHandlerCallback} + */ + + /** + * @callback buildProfileHandlerCallback + * @param {CommonConf} dataConf + * @returns {[Profile,boolean]} profile + is default flag + */ + + /** + * return specific profile handler + * @function + * @private + * @param {CommonConf} dataConf + * @param {buildProfileHandlerCallback} callback + * @param {boolean} user + * @param {string} source + * @returns {ProfileHandler} + */ + + #buildProfileHandler(dataConf, callback, user, source) { + if (!dataConf) { + return; + } + const [data, isDefault] = callback(dataConf); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(data)) { + return; + } + return { + data: data, + metadata: { + user: user, + source: source, + isDefault: !!isDefault + }, + setTargeting: dataConf.setPrebidTargeting, + sendToBidders: dataConf.sendToBidders, + onData: dataConf.onData + }; + } + /** + * handle individual bid + * @function + * @private + * @param {Object} reqBidsConfigObj + * @param {Object} reqBidsConfigObj.ortb2Fragments + * @param {Object} reqBidsConfigObj.ortb2Fragments.bidder + * @param {Object} bid + * @param {string} bid.bidder + * @param {Profile} profile + * @param {dataCallbackMetadata} metadata + * @returns {void} + */ + + #handleBid(reqBidsConfigObj, bid, profile, metadata) { + this.#handleBidViaORTB2(reqBidsConfigObj, bid.bidder, profile, metadata); + + /** @type {string} */ + const bidder = this.#getAdapterNameForAlias(bid.bidder); + if (bidder == 'appnexus') { + this.#handleAppnexusBid(reqBidsConfigObj, bid, profile); + } + } + + /** + * return adapter name based on alias, if any + * @function + * @private + * @param {string} aliasName + * @returns {string} + */ + + #getAdapterNameForAlias(aliasName) { + return _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_7__["default"].aliasRegistry[aliasName] || aliasName; + } + + /** + * function that handles bid request data + * @function + * @private + * @param {ProfileHandler} ph profile handler + * @returns {[Profile,dataCallbackMetadata]} deeply copy data + metadata + */ + + #copyDataAndMetadata(ph) { + return [(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(ph.data), (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.deepClone)(ph.metadata)]; + } + + /** + * handle appnexus/xandr bid + * @function + * @private + * @param {Object} reqBidsConfigObj + * @param {Object} reqBidsConfigObj.ortb2Fragments + * @param {Object} reqBidsConfigObj.ortb2Fragments.bidder + * @param {Object} bid + * @param {Object} bid.parameters + * @param {Profile} profile + * @returns {void} + */ + + #handleAppnexusBid(reqBidsConfigObj, bid, profile) { + const base = 'params.keywords'; + this.#assignProfileToObject(bid, base, profile); + // this.#setBidderOrtb2(reqBidsConfigObj.ortb2Fragments?.bidder, bid.bidder, base, profile); + } + + /** + * handle generic bid via ortb2 arbitrary data + * @function + * @private + * @param {Object} reqBidsConfigObj + * @param {Object} reqBidsConfigObj.ortb2Fragments + * @param {Object} reqBidsConfigObj.ortb2Fragments.bidder + * @param {string} bidder + * @param {Profile} profile + * @param {dataCallbackMetadata} metadata + * @returns {void} + */ + + #handleBidViaORTB2(reqBidsConfigObj, bidder, profile, metadata) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBoolean)(metadata.user)) { + logger.logMessage(`bidder '${bidder}' is not directly supported, trying set data via bidder ortb2 fpd`); + const section = metadata.user ? 'user' : 'site'; + const path = `${section}.ext.data`; + this.#setBidderOrtb2(reqBidsConfigObj.ortb2Fragments?.bidder, bidder, path, profile); + } else { + logger.logMessage(`SKIP unsupported bidder '${bidder}', data from '${metadata.source}' is not defined as user or site-centric`); + } + } + /** + * set bidder ortb2 data + * @function + * @private + * @param {Object} bidderOrtb2Fragments + * @param {string} bidder + * @param {string} path + * @param {Profile} profile + * @returns {void} + */ + + #setBidderOrtb2(bidderOrtb2Fragments, bidder, path, profile) { + const base = `${bidder}.${path}`; + this.#assignProfileToObject(bidderOrtb2Fragments, base, profile); + } + /** + * assign profile to object + * @function + * @private + * @param {Object} destination + * @param {string} base + * @param {Profile} profile + * @returns {void} + */ + + #assignProfileToObject(destination, base, profile) { + Object.entries(profile).forEach(_ref3 => { + let [key, values] = _ref3; + const path = `${base}.${key}`; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_8__.dset)(destination, path, values); + }); + } + + /** + * @callback validatorCallback + * @param {string} target + * @returns {boolean} + */ + + /** + * @callback coerceCallback + * @param {*} input + * @returns {*} + */ + + /** + * wrap value into validator + * @function + * @private + * @param {*} value + * @param {coerceCallback} coerce + * @returns {validatorCallback} + * @throws will throw an error in case of unsupported type + */ + + #wrapValidatorCallback(value) { + let coerce = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x => x; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isFn)(value)) { + return value; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBoolean)(value)) { + return _ => value; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(value)) { + return target => { + return value == coerce(target); + }; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(value)) { + return target => { + return value.includes(coerce(target)); + }; + } + throw `unexpected format: ${typeof value} (expects function, boolean, string or array)`; + } +} + +/** + * check if profile is valid + * a valid profile must be a plain object and every value should be an array of strings or numbers + * @param {*} profile + * @returns {boolean} + */ +function isValidProfile(profile) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(profile)) { + return false; + } + return Object.values(profile).every(field => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(field) && field.every(isStrOrNumber)); +} + +/** + * Return if the object is a string or number + * @param {*} object object to test + * @return {Boolean} if object is a string or number + */ +function isStrOrNumber(object) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(object) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(object); +} + +/** + * bind callback with component + * @param {Component} component + * @returns {buildProfileHandlerCallback} + */ +function getContextualProfile(component /* equivalent to this */) { + /** + * return contextual profile + * @param {WeboCtxConf} weboCtxConf + * @returns {[Profile,boolean]} contextual profile + isDefault boolean flag + */ + return function (weboCtxConf) { + if (component.data) { + return [component.data, false]; + } + const defaultContextualProfile = weboCtxConf.defaultProfile || {}; + return [defaultContextualProfile, true]; + }; +} + +/** + * bind callback with component + * @param {Component} component + * @returns {buildProfileHandlerCallback} + */ +function getWeboUserDataProfile(component /* equivalent to this */) { + /** + * return weboUserData profile + * @param {WeboUserDataConf} weboUserDataConf + * @returns {[Profile,boolean]} weboUserData profile + isDefault boolean flag + */ + return function (weboUserDataConf) { + return getDataFromLocalStorage(weboUserDataConf, () => component.data, data => component.data = data, DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY, LOCAL_STORAGE_USER_TARGETING_SECTION, WEBO_USER_DATA_SOURCE_LABEL); + }; +} + +/** + * bind callback with component + * @param {Component} component + * @returns {buildProfileHandlerCallback} + */ +function getSfbxLiteDataProfile(component /* equivalent to this */) { + /** + * return weboUserData profile + * @param {SfbxLiteDataConf} sfbxLiteDataConf + * @returns {[Profile,boolean]} sfbxLiteData profile + isDefault boolean flag + */ + return function getSfbxLiteDataProfile(sfbxLiteDataConf) { + return getDataFromLocalStorage(sfbxLiteDataConf, () => component.data, data => component.data = data, DEFAULT_LOCAL_STORAGE_LITE_PROFILE_KEY, LOCAL_STORAGE_LITE_TARGETING_SECTION, SFBX_LITE_DATA_SOURCE_LABEL); + }; +} + +/** + * @callback cacheGetCallback + * @returns {Profile} + */ +/** + * @callback cacheSetCallback + * @param {Profile} profile + * @returns {void} + */ + +/** + * return generic webo data profile + * @param {WeboUserDataConf|SfbxLiteDataConf} weboDataConf + * @param {cacheGetCallback} cacheGet + * @param {cacheSetCallback} cacheSet + * @param {string} defaultLocalStorageProfileKey + * @param {string} targetingSection + * @param {string} source + * @returns {[Profile,boolean]} webo (user|lite) data profile + isDefault boolean flag + */ +function getDataFromLocalStorage(weboDataConf, cacheGet, cacheSet, defaultLocalStorageProfileKey, targetingSection, source) { + const defaultProfile = weboDataConf.defaultProfile || {}; + if (storage.hasLocalStorage() && storage.localStorageIsEnabled() && !cacheGet()) { + const localStorageProfileKey = weboDataConf.localStorageProfileKey || defaultLocalStorageProfileKey; + const entry = storage.getDataFromLocalStorage(localStorageProfileKey); + if (entry) { + const data = JSON.parse(entry); + if (data && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPlainObject)(data) && targetingSection in data) { + /** @type {profile} */ + const profile = data[targetingSection]; + const valid = isValidProfile(profile); + if (!valid) { + logger.logMessage(`WARNING: found invalid ${source} profile on local storage key ${localStorageProfileKey}, section ${targetingSection}: `, profile); + return [defaultProfile, true]; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(data)) { + cacheSet(profile); + } + } + } + } + const profile = cacheGet(); + if (profile) { + return [profile, false]; + } + return [defaultProfile, true]; +} +/** @type {Components} */ +const components = { + WeboCtx: { + initialized: false, + data: null, + user: false, + source: WEBO_CTX_SOURCE_LABEL, + callbackBuilder: getContextualProfile + }, + WeboUserData: { + initialized: false, + data: null, + user: true, + source: WEBO_USER_DATA_SOURCE_LABEL, + callbackBuilder: getWeboUserDataProfile + }, + SfbxLiteData: { + initialized: false, + data: null, + user: false, + source: SFBX_LITE_DATA_SOURCE_LABEL, + callbackBuilder: getSfbxLiteDataProfile + } +}; +const weboramaSubmodule = new WeboramaRtdProvider(components); +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_9__.submodule)(MODULE_NAME, weboramaSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('weboramaRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["urlUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/weboramaRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["welectBidAdapter"],{ + +/***/ "./modules/welectBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/welectBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests + */ + +const BIDDER_CODE = 'welect'; +const DEFAULT_DOMAIN = 'www.welect.de'; +const spec = { + code: BIDDER_CODE, + aliases: ['wlt'], + gvlid: 282, + supportedMediaTypes: ['video'], + // short code + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bid, 'mediaTypes.video.context') === 'instream' && !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} validBidRequests - an array of bids + * @return {Object} Info describing the request to the server. + */ + buildRequests: function (validBidRequests) { + return validBidRequests.map(bidRequest => { + let rawSizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"])(bidRequest, 'mediaTypes.video.playerSize') || bidRequest.sizes; + let size = rawSizes[0]; + let domain = bidRequest.params.domain || DEFAULT_DOMAIN; + let url = `https://${domain}/api/v2/preflight/${bidRequest.params.placementId}`; + let gdprConsent = null; + if (bidRequest && bidRequest.gdprConsent) { + gdprConsent = { + gdpr_consent: { + gdprApplies: bidRequest.gdprConsent.gdprApplies, + tcString: bidRequest.gdprConsent.gdprConsent + } + }; + } + const data = { + width: size[0], + height: size[1], + bid_id: bidRequest.bidId, + ...gdprConsent + }; + return { + method: 'POST', + url: url, + data: data, + options: { + contentType: 'application/json', + withCredentials: false, + crossOrigin: true + } + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const responseBody = serverResponse.body; + if (typeof responseBody !== 'object' || responseBody.available !== true) { + return []; + } + const bidResponses = []; + const bidResponse = { + requestId: responseBody.bidResponse.requestId, + cpm: responseBody.bidResponse.cpm, + width: responseBody.bidResponse.width, + height: responseBody.bidResponse.height, + creativeId: responseBody.bidResponse.creativeId, + currency: responseBody.bidResponse.currency, + netRevenue: responseBody.bidResponse.netRevenue, + ttl: responseBody.bidResponse.ttl, + ad: responseBody.bidResponse.ad, + vastUrl: responseBody.bidResponse.vastUrl, + meta: { + advertiserDomains: responseBody.bidResponse.meta.advertiserDomains + } + }; + bidResponses.push(bidResponse); + return bidResponses; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_1__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('welectBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/welectBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["widespaceBidAdapter"],{ + +/***/ "./modules/widespaceBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/widespaceBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/boundingClientRect/boundingClientRect.js */ "./libraries/boundingClientRect/boundingClientRect.js"); + + + + + + + +const BIDDER_CODE = 'widespace'; +const WS_ADAPTER_VERSION = '2.0.1'; +const LS_KEYS = { + PERF_DATA: 'wsPerfData', + LC_UID: 'wsLcuid', + CUST_DATA: 'wsCustomData' +}; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +let preReqTime = 0; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: ['banner'], + isBidRequestValid: function (bid) { + if (bid.params && bid.params.sid) { + return true; + } + return false; + }, + buildRequests: function (validBidRequests, bidderRequest) { + let serverRequests = []; + const REQUEST_SERVER_URL = getEngineUrl(); + const DEMO_DATA_PARAMS = ['gender', 'country', 'region', 'postal', 'city', 'yob']; + const PERF_DATA = getData(LS_KEYS.PERF_DATA).map(perfData => JSON.parse(perfData)); + const CUST_DATA = getData(LS_KEYS.CUST_DATA, false)[0]; + const LC_UID = getLcuid(); + let isInHostileIframe = false; + try { + window.top.location.toString(); + isInHostileIframe = false; + } catch (e) { + isInHostileIframe = true; + } + validBidRequests.forEach((bid, i) => { + let data = { + 'screenWidthPx': screen && screen.width, + 'screenHeightPx': screen && screen.height, + 'adSpaceHttpRefUrl': getTopWindowReferrer(), + 'referer': (isInHostileIframe ? window : window.top).location.href.split('#')[0], + 'inFrame': 1, + 'sid': bid.params.sid, + 'lcuid': LC_UID, + 'vol': isInHostileIframe ? '' : visibleOnLoad(document.getElementById(bid.adUnitCode)), + 'gdprCmp': bidderRequest && bidderRequest.gdprConsent ? 1 : 0, + 'hb': '1', + 'hb.cd': CUST_DATA ? encodedParamValue(CUST_DATA) : '', + 'hb.floor': '', + 'hb.spb': i === 0 ? pixelSyncPossibility() : -1, + 'hb.ver': WS_ADAPTER_VERSION, + 'hb.name': "prebidjs-9.45.0-pre", + 'hb.bidId': bid.bidId, + 'hb.sizes': (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseSizesInput)(bid.sizes).join(','), + 'hb.currency': bid.params.cur || bid.params.currency || '' + }; + + // Include demo data + if (bid.params.demo) { + DEMO_DATA_PARAMS.forEach(key => { + if (bid.params.demo[key]) { + data[key] = bid.params.demo[key]; + } + }); + } + + // Include performance data + if (PERF_DATA[i]) { + Object.keys(PERF_DATA[i]).forEach(perfDataKey => { + data[perfDataKey] = PERF_DATA[i][perfDataKey]; + }); + } + + // Include connection info if available + const CONNECTION = navigator.connection || navigator.webkitConnection; + if (CONNECTION && CONNECTION.type && CONNECTION.downlinkMax) { + data['netinfo.type'] = CONNECTION.type; + data['netinfo.downlinkMax'] = CONNECTION.downlinkMax; + } + + // Include debug data when available + if (!isInHostileIframe) { + data.forceAdId = ((0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(window.top.location.hash.split('&'), val => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(val, 'WS_DEBUG_FORCEADID')) || '').split('=')[1]; + } + + // GDPR Consent info + if (data.gdprCmp) { + const { + gdprApplies, + consentString, + vendorData + } = bidderRequest.gdprConsent; + const hasGlobalScope = vendorData && vendorData.hasGlobalScope; + data.gdprApplies = gdprApplies ? 1 : gdprApplies === undefined ? '' : 0; + data.gdprConsentData = consentString; + data.gdprHasGlobalScope = hasGlobalScope ? 1 : hasGlobalScope === undefined ? '' : 0; + } + + // Remove empty params + Object.keys(data).forEach(key => { + if (data[key] === '' || data[key] === undefined) { + delete data[key]; + } + }); + serverRequests.push({ + method: 'POST', + options: { + contentType: 'application/x-www-form-urlencoded' + }, + url: REQUEST_SERVER_URL, + data: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.parseQueryStringParameters)(data) + }); + }); + preReqTime = Date.now(); + return serverRequests; + }, + interpretResponse: function (serverResponse, request) { + const responseTime = Date.now() - preReqTime; + const successBids = serverResponse.body || []; + let bidResponses = []; + successBids.forEach(bid => { + storeData({ + 'perf_status': 'OK', + 'perf_reqid': bid.reqId, + 'perf_ms': responseTime + }, `${LS_KEYS.PERF_DATA}${bid.reqId}`); + if (bid.status === 'ad') { + bidResponses.push({ + requestId: bid.bidId, + cpm: bid.cpm, + width: bid.width, + height: bid.height, + creativeId: bid.adId, + currency: bid.currency, + netRevenue: Boolean(bid.netRev), + ttl: bid.ttl, + referrer: getTopWindowReferrer(), + ad: bid.code, + meta: { + advertiserDomains: bid.adomain || [] + } + }); + } + }); + return bidResponses; + }, + getUserSyncs: function (syncOptions) { + let serverResponses = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + let userSyncs = []; + userSyncs = serverResponses.reduce((allSyncPixels, response) => { + if (response && response.body && response.body[0]) { + (response.body[0].syncPixels || []).forEach(url => { + allSyncPixels.push({ + type: 'image', + url + }); + }); + } + return allSyncPixels; + }, []); + return userSyncs; + } +}; +function storeData(data, name) { + let stringify = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + const value = stringify ? JSON.stringify(data) : data; + if (storage.hasLocalStorage()) { + storage.setDataInLocalStorage(name, value); + return true; + } else if (storage.cookiesAreEnabled()) { + const theDate = new Date(); + const expDate = new Date(theDate.setMonth(theDate.getMonth() + 12)).toGMTString(); + storage.setCookie(name, value, expDate); + return true; + } +} +function getData(name) { + let remove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let data = []; + return data; +} +function pixelSyncPossibility() { + const userSync = _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('userSync'); + return userSync && userSync.pixelEnabled && userSync.syncEnabled ? userSync.syncsPerBidder : -1; +} +function visibleOnLoad(element) { + if (element) { + const topPos = (0,_libraries_boundingClientRect_boundingClientRect_js__WEBPACK_IMPORTED_MODULE_4__.getBoundingClientRect)(element).top; + return topPos < screen.height && topPos >= window.top.pageYOffset ? 1 : 0; + } + return ''; +} +function getLcuid() { + let lcuid = getData(LS_KEYS.LC_UID, false)[0]; + if (!lcuid) { + const random = ('4' + new Date().getTime() + String(Math.floor(Math.random() * 1000000000))).substring(0, 18); + storeData(random, LS_KEYS.LC_UID, false); + lcuid = getData(LS_KEYS.LC_UID, false)[0]; + } + return lcuid; +} +function encodedParamValue(value) { + const requiredStringify = typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(value) === 'object'; + return encodeURIComponent(requiredStringify ? JSON.stringify(value) : value); +} +function getEngineUrl() { + const ENGINE_URL = 'https://engine.widespace.com/map/engine/dynadreq'; + return window.wisp && window.wisp.ENGINE_URL ? window.wisp.ENGINE_URL : ENGINE_URL; +} +function getTopWindowReferrer() { + try { + return window.top.document.referrer; + } catch (e) { + return ''; + } +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_5__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_6__.registerModule)('widespaceBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["boundingClientRect","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/widespaceBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["winrBidAdapter"],{ + +/***/ "./modules/winrBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/winrBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports storage, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); +/* harmony import */ var _libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../libraries/appnexusUtils/anKeywords.js */ "./libraries/appnexusUtils/anKeywords.js"); +/* harmony import */ var _libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/appnexusUtils/anUtils.js */ "./libraries/appnexusUtils/anUtils.js"); +/* harmony import */ var _libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../libraries/sizeUtils/tranformSize.js */ "./libraries/sizeUtils/tranformSize.js"); + + + + + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + */ + +const BIDDER_CODE = 'winr'; +const URL = 'https://ib.adnxs.com/ut/v3/prebid'; +const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid'; +const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language']; +const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately +const SOURCE = 'pbjs'; +const DEFAULT_CURRENCY = 'USD'; +const GATE_COOKIE_NAME = 'wnr_gate'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + bidderCode: BIDDER_CODE +}); +function buildBid(bidData) { + const bid = bidData; + const position = { + domParent: bid.meta.domParent ? `'${bid.meta.domParent}'` : null, + child: bid.meta.child ? bid.meta.child : 4 + }; + bid.ad = wrapAd(bid, position); + return bid; +} +function getMediaTypeFromBid(bid) { + return bid.mediaTypes && Object.keys(bid.mediaTypes)[0]; +} +function wrapAd(bid, position) { + return ` + + + + + + + + + + `; +} +const spec = { + code: BIDDER_CODE, + aliases: ['wnr'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {object} bid The bid to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // Return false for each bid request if the media type is not 'banner' + if (getMediaTypeFromBid(bid) !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + return false; + } + + // Return false for each bid request if the cookies disabled + if (!storage.cookiesAreEnabled()) { + return false; + } + + // Return false for each bid request if the gate cookie is set + if (storage.getCookie(GATE_COOKIE_NAME) !== null) { + return false; + } + + // Return false for each bid request if no placementId exists + if (!bid.params.placementId) { + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const tags = bidRequests.map(bidToTag); + const userObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasUserInfo); + let userObj = {}; + if (_src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('coppa') === true) { + userObj = { + 'coppa': true + }; + } + if (userObjBid) { + Object.keys(userObjBid.params.user).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(USER_PARAMS, param)).forEach(param => { + let uparam = (0,_libraries_appnexusUtils_anUtils_js__WEBPACK_IMPORTED_MODULE_4__.convertCamelToUnderscore)(param); + if (param === 'segments' && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isArray)(userObjBid.params.user[param])) { + let segs = []; + userObjBid.params.user[param].forEach(val => { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isNumber)(val)) { + segs.push({ + id: val + }); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isPlainObject)(val)) { + segs.push(val); + } + }); + userObj[uparam] = segs; + } else if (param !== 'segments') { + userObj[uparam] = userObjBid.params.user[param]; + } + }); + } + const appDeviceObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasAppDeviceInfo); + let appDeviceObj; + if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app) { + appDeviceObj = {}; + Object.keys(appDeviceObjBid.params.app).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(APP_DEVICE_PARAMS, param)).forEach(param => appDeviceObj[param] = appDeviceObjBid.params.app[param]); + } + const appIdObjBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasAppId); + let appIdObj; + if (appIdObjBid && appIdObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) { + appIdObj = { + appid: appIdObjBid.params.app.id + }; + } + const memberIdBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(bidRequests, hasMemberId); + const member = memberIdBid ? parseInt(memberIdBid.params.member, 10) : 0; + const schain = bidRequests[0].schain; + const payload = { + tags: [...tags], + user: userObj, + sdk: { + source: SOURCE, + version: "9.45.0-pre" + }, + schain: schain + }; + if (member > 0) { + payload.member_id = member; + } + if (appDeviceObjBid) { + payload.device = appDeviceObj; + } + if (appIdObjBid) { + payload.app = appIdObj; + } + if (bidderRequest && bidderRequest.gdprConsent) { + // note - objects for impbus use underscore instead of camelCase + payload.gdpr_consent = { + consent_string: bidderRequest.gdprConsent.consentString, + consent_required: bidderRequest.gdprConsent.gdprApplies + }; + } + if (bidderRequest && bidderRequest.uspConsent) { + payload.us_privacy = bidderRequest.uspConsent; + } + if (bidderRequest && bidderRequest.refererInfo) { + let refererinfo = { + // TODO: this collects everything it finds, except for canonicalUrl + rd_ref: encodeURIComponent(bidderRequest.refererInfo.topmostLocation), + rd_top: bidderRequest.refererInfo.reachedTop, + rd_ifs: bidderRequest.refererInfo.numIframes, + rd_stk: bidderRequest.refererInfo.stack.map(url => encodeURIComponent(url)).join(',') + }; + payload.referrer_detection = refererinfo; + } + if (bidRequests[0].userId) { + let eids = []; + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequests[0], `userId.criteoId`), 'criteo.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequests[0], `userId.netId`), 'netid.de', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequests[0], `userId.idl_env`), 'liveramp.com', null); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequests[0], `userId.tdid`), 'adserver.org', 'TDID'); + addUserId(eids, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bidRequests[0], `userId.uid2.id`), 'uidapi.com', 'UID2'); + if (eids.length) { + payload.eids = eids; + } + } + if (tags[0].publisher_id) { + payload.publisher_id = tags[0].publisher_id; + } + const request = formatRequest(payload, bidderRequest); + return request; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {*} serverResponse A successful response from the server. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, _ref) { + let { + bidderRequest + } = _ref; + serverResponse = serverResponse.body; + const bids = []; + if (!serverResponse || serverResponse.error) { + let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`; + if (serverResponse && serverResponse.error) { + errorMessage += `: ${serverResponse.error}`; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(errorMessage); + return bids; + } + if (serverResponse.tags) { + serverResponse.tags.forEach(serverBid => { + const rtbBid = getRtbBid(serverBid); + if (rtbBid) { + if (rtbBid.cpm !== 0 && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.includes)(this.supportedMediaTypes, rtbBid.ad_type)) { + const bid = newBid(serverBid, rtbBid, bidderRequest); + bid.mediaType = parseMediaType(rtbBid); + bids.push(bid); + } + } + }); + } + return bids.map(bid => buildBid(bid)); + }, + getUserSyncs: function (syncOptions) { + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: 'https://acdn.adnxs.com/dmp/async_usersync.html' + }]; + } + } +}; +function formatRequest(payload, bidderRequest) { + let request = []; + let options = { + withCredentials: true + }; + let endpointUrl = URL; + if (!(0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_7__.hasPurpose1Consent)(bidderRequest?.gdprConsent)) { + endpointUrl = URL_SIMPLE; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.getParameterByName)('apn_test').toUpperCase() === 'TRUE' || _src_config_js__WEBPACK_IMPORTED_MODULE_3__.config.getConfig('apn_test') === true) { + options.customHeaders = { + 'X-Is-Test': 1 + }; + } + const payloadString = JSON.stringify(payload); + request = { + method: 'POST', + url: endpointUrl, + data: payloadString, + bidderRequest, + options + }; + return request; +} + +/** + * Unpack the Server's Bid into a Prebid-compatible one. + * @param serverBid + * @param rtbBid + * @param bidderRequest + * @return Bid + */ +function newBid(serverBid, rtbBid, bidderRequest) { + const bidRequest = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.getBidRequest)(serverBid.uuid, [bidderRequest]); + const bid = { + adType: rtbBid.ad_type, + requestId: serverBid.uuid, + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + auctionId: bidRequest.auctionId, + cpm: rtbBid.cpm, + creativeId: rtbBid.creative_id, + brandCategoryId: rtbBid.brandCategoryId, + dealId: rtbBid.deal_id, + currency: DEFAULT_CURRENCY, + netRevenue: true, + ttl: 300, + source: rtbBid.content_source, + mediaSubtypeId: rtbBid.media_subtype_id, + mediaTypeId: rtbBid.media_type_id, + adUnitCode: bidRequest.adUnitCode, + buyerMemberId: rtbBid.buyer_member_id, + appnexus: { + buyerMemberId: rtbBid.buyer_member_id, + dealPriority: rtbBid.deal_priority, + dealCode: rtbBid.deal_code + } + }; + + // WE DON'T FULLY SUPPORT THIS ATM - future spot for adomain code; creating a stub for 5.0 compliance + if (rtbBid.adomain) { + bid.meta = Object.assign({}, bid.meta, { + advertiserDomains: [] + }); + } + if (rtbBid.advertiser_id) { + bid.meta = Object.assign({}, bid.meta, { + advertiserId: rtbBid.advertiser_id + }); + } + if (bidRequest.params) { + const { + placementId, + siteId, + domParent, + child + } = bidRequest.params; + bid.meta = Object.assign({}, bid.meta, { + placementId: placementId, + siteId: siteId, + domParent: domParent, + child: child + }); + } + Object.assign(bid, { + width: rtbBid.rtb.banner.width, + height: rtbBid.rtb.banner.height + }); + try { + if (rtbBid.rtb.banner && rtbBid.rtb.trackers) { + bid.banner = Object.assign({}, bid.banner, { + content: rtbBid.rtb.banner.content, + width: rtbBid.rtb.banner.width, + height: rtbBid.rtb.banner.height, + trackers: rtbBid.rtb.trackers + }); + } + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)('Error assigning ad', error); + } + return bid; +} +function bidToTag(bid) { + const tag = {}; + tag.sizes = (0,_libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_8__.transformSizes)(bid.sizes); + tag.primary_size = tag.sizes[0]; + tag.ad_types = []; + tag.uuid = bid.bidId; + if (bid.params.placementId) { + tag.id = parseInt(bid.params.placementId, 10); + } else { + tag.code = bid.params.invCode; + } + tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false; + tag.use_pmt_rule = bid.params.usePaymentRule || false; + tag.prebid = true; + tag.disable_psa = true; + let bidFloor = getBidFloor(bid); + if (bidFloor) { + tag.reserve = bidFloor; + } + if (bid.params.trafficSourceCode) { + tag.traffic_source_code = bid.params.trafficSourceCode; + } + if (bid.params.privateSizes) { + tag.private_sizes = (0,_libraries_sizeUtils_tranformSize_js__WEBPACK_IMPORTED_MODULE_8__.transformSizes)(bid.params.privateSizes); + } + if (bid.params.pubClick) { + tag.pubclick = bid.params.pubClick; + } + if (bid.params.publisherId) { + tag.publisher_id = parseInt(bid.params.publisherId, 10); + } + if (bid.params.externalImpId) { + tag.external_imp_id = bid.params.externalImpId; + } + tag.keywords = (0,_libraries_appnexusUtils_anKeywords_js__WEBPACK_IMPORTED_MODULE_9__.getANKeywordParam)(bid.ortb2, bid.params.keywords); + let gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_6__["default"])(bid, 'ortb2Imp.ext.data.pbadslot'); + if (gpid) { + tag.gpid = gpid; + } + tag.hb_source = 1; + if (tag.ad_types.length === 0) { + delete tag.ad_types; + } + return tag; +} +function hasUserInfo(bid) { + return !!bid.params.user; +} +function hasMemberId(bid) { + return !!parseInt(bid.params.member, 10); +} +function hasAppDeviceInfo(bid) { + if (bid.params) { + return !!bid.params.app; + } +} +function hasAppId(bid) { + if (bid.params && bid.params.app) { + return !!bid.params.app.id; + } + return !!bid.params.app; +} +function getRtbBid(tag) { + return tag && tag.ads && tag.ads.length && (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_2__.find)(tag.ads, ad => ad.rtb); +} +function parseMediaType(rtbBid) { + const adType = rtbBid.ad_type; + if (adType !== _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER) { + return false; + } + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER; +} +function addUserId(eids, id, source, rti) { + if (id) { + if (rti) { + eids.push({ + source, + id, + rti_partner: rti + }); + } else { + eids.push({ + source, + id + }); + } + } + return eids; +} +function getBidFloor(bid) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isFn)(bid.getFloor)) { + return bid.params.reserve ? bid.params.reserve : null; + } + let floor = bid.getFloor({ + currency: 'USD', + mediaType: '*', + size: '*' + }); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.isPlainObject)(floor) && !isNaN(floor.floor) && floor.currency === 'USD') { + return floor.floor; + } + return null; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_10__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_11__.registerModule)('winrBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","sizeUtils","keywords","appnexusUtils","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/winrBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["wipesBidAdapter"],{ + +/***/ "./modules/wipesBidAdapter.js": +/*!************************************!*\ + !*** ./modules/wipesBidAdapter.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const BIDDER_CODE = 'wipes'; +const ALIAS_BIDDER_CODE = ['wi']; +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]; +const ENDPOINT_URL = 'https://adn-srv.reckoner-api.com/v1/prebid'; +function isBidRequestValid(bid) { + switch (true) { + case !!bid.params.asid: + break; + default: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`isBidRequestValid Error. ${bid.params}, please check your implementation.`); + return false; + } + return true; +} +function buildRequests(validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const bidId = bidRequest.bidId; + const params = bidRequest.params; + const asid = params.asid; + return { + method: 'GET', + url: ENDPOINT_URL, + data: { + asid: asid, + bid_id: bidId + } + }; + }); +} +function interpretResponse(serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + const cpm = response.cpm || 0; + if (cpm !== 0) { + const netRevenue = response.netRevenue === undefined ? true : response.netRevenue; + const bidResponse = { + requestId: response.bid_id, + cpm: cpm, + width: response.width, + height: response.height, + creativeId: response.video_creative_id || 0, + dealId: response.deal_id, + currency: 'JPY', + netRevenue: netRevenue, + ttl: 60, + referrer: bidRequest.data.r || '', + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, + ad: response.ad_tag, + meta: { + advertiserDomains: response.advertiser_domain ? [response.advertiser_domain] : [] + } + }; + bidResponses.push(bidResponse); + } + return bidResponses; +} +const spec = { + code: BIDDER_CODE, + aliases: ALIAS_BIDDER_CODE, + isBidRequestValid, + buildRequests, + interpretResponse, + supportedMediaTypes: SUPPORTED_MEDIA_TYPES +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('wipesBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/wipesBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["wurflRtdProvider"],{ + +/***/ "./modules/wurflRtdProvider.js": +/*!*************************************!*\ + !*** ./modules/wurflRtdProvider.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports bidderData, lowEntropyData, enrichBidderRequest, makeOrtb2DeviceType, toNumber, wurflSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adloader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/adloader.js */ "./src/adloader.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + +// Constants +const REAL_TIME_MODULE = 'realTimeData'; +const MODULE_NAME = 'wurfl'; + +// WURFL_JS_HOST is the host for the WURFL service endpoints +const WURFL_JS_HOST = 'https://prebid.wurflcloud.com'; +// WURFL_JS_ENDPOINT_PATH is the path for the WURFL.js endpoint used to load WURFL data +const WURFL_JS_ENDPOINT_PATH = '/wurfl.js'; +// STATS_ENDPOINT_PATH is the path for the stats endpoint used to send analytics data +const STATS_ENDPOINT_PATH = '/v1/prebid/stats'; +const logger = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.prefixLog)('[WURFL RTD Submodule]'); + +// enrichedBidders holds a list of prebid bidder names, of bidders which have been +// injected with WURFL data +const enrichedBidders = new Set(); + +/** + * init initializes the WURFL RTD submodule + * @param {Object} config Configuration for WURFL RTD submodule + * @param {Object} userConsent User consent data + */ +const init = (config, userConsent) => { + logger.logMessage('initialized'); + return true; +}; + +/** + * getBidRequestData enriches the OpenRTB 2.0 device data with WURFL data + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Function} callback Called on completion + * @param {Object} config Configuration for WURFL RTD submodule + * @param {Object} userConsent User consent data + */ +const getBidRequestData = (reqBidsConfigObj, callback, config, userConsent) => { + const altHost = config.params?.altHost ?? null; + const isDebug = config.params?.debug ?? false; + const bidders = new Set(); + reqBidsConfigObj.adUnits.forEach(adUnit => { + adUnit.bids.forEach(bid => { + bidders.add(bid.bidder); + }); + }); + let host = WURFL_JS_HOST; + if (altHost) { + host = altHost; + } + const url = new URL(host); + url.pathname = WURFL_JS_ENDPOINT_PATH; + if (isDebug) { + url.searchParams.set('debug', 'true'); + } + url.searchParams.set('mode', 'prebid'); + url.searchParams.set('wurfl_id', 'true'); + try { + (0,_src_adloader_js__WEBPACK_IMPORTED_MODULE_1__.loadExternalScript)(url.toString(), _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_2__.MODULE_TYPE_RTD, MODULE_NAME, () => { + logger.logMessage('script injected'); + window.WURFLPromises.complete.then(res => { + logger.logMessage('received data', res); + if (!res.wurfl_pbjs) { + logger.logError('invalid WURFL.js for Prebid response'); + } else { + enrichBidderRequests(reqBidsConfigObj, bidders, res); + } + callback(); + }); + }); + } catch (err) { + logger.logError(err); + callback(); + } +}; + +/** + * enrichBidderRequests enriches the OpenRTB 2.0 device data with WURFL data for Business Edition + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {Array} bidders List of bidders + * @param {Object} wjsResponse WURFL.js response + */ +function enrichBidderRequests(reqBidsConfigObj, bidders, wjsResponse) { + const authBidders = wjsResponse.wurfl_pbjs?.authorized_bidders ?? {}; + const caps = wjsResponse.wurfl_pbjs?.caps ?? []; + bidders.forEach(bidderCode => { + if (bidderCode in authBidders) { + // inject WURFL data + enrichedBidders.add(bidderCode); + const data = bidderData(wjsResponse.WURFL, caps, authBidders[bidderCode]); + data['enrich_device'] = true; + enrichBidderRequest(reqBidsConfigObj, bidderCode, data); + return; + } + // inject WURFL low entropy data + const data = lowEntropyData(wjsResponse.WURFL, wjsResponse.wurfl_pbjs?.low_entropy_caps); + enrichBidderRequest(reqBidsConfigObj, bidderCode, data); + }); +} + +/** + * bidderData returns the WURFL data for a bidder + * @param {Object} wurflData WURFL data + * @param {Array} caps Capability list + * @param {Array} filter Filter list + * @returns {Object} Bidder data + */ +const bidderData = (wurflData, caps, filter) => { + const data = {}; + if ('wurfl_id' in wurflData) { + data['wurfl_id'] = wurflData.wurfl_id; + } + caps.forEach((cap, index) => { + if (!filter.includes(index)) { + return; + } + if (cap in wurflData) { + data[cap] = wurflData[cap]; + } + }); + return data; +}; + +/** + * lowEntropyData returns the WURFL low entropy data + * @param {Object} wurflData WURFL data + * @param {Array} lowEntropyCaps Low entropy capability list + * @returns {Object} Bidder data + */ +const lowEntropyData = (wurflData, lowEntropyCaps) => { + const data = {}; + lowEntropyCaps.forEach((cap, _) => { + let value = wurflData[cap]; + if (cap == 'complete_device_name') { + value = value.replace(/Apple (iP(hone|ad|od)).*/, 'Apple iP$2'); + } + data[cap] = value; + }); + if ('model_name' in wurflData) { + data['model_name'] = wurflData.model_name.replace(/(iP(hone|ad|od)).*/, 'iP$2'); + } + if ('brand_name' in wurflData) { + data['brand_name'] = wurflData.brand_name; + } + if ('wurfl_id' in wurflData) { + data['wurfl_id'] = wurflData.wurfl_id; + } + return data; +}; +/** + * enrichBidderRequest enriches the bidder request with WURFL data + * @param {Object} reqBidsConfigObj Bid request configuration object + * @param {String} bidderCode Bidder code + * @param {Object} wurflData WURFL data + */ +const enrichBidderRequest = (reqBidsConfigObj, bidderCode, wurflData) => { + const ortb2data = { + 'device': { + 'ext': {} + } + }; + const device = reqBidsConfigObj.ortb2Fragments.global.device; + enrichOrtb2DeviceData('make', wurflData.brand_name, device, ortb2data); + enrichOrtb2DeviceData('model', wurflData.model_name, device, ortb2data); + if (wurflData.enrich_device) { + delete wurflData.enrich_device; + enrichOrtb2DeviceData('devicetype', makeOrtb2DeviceType(wurflData), device, ortb2data); + enrichOrtb2DeviceData('os', wurflData.advertised_device_os, device, ortb2data); + enrichOrtb2DeviceData('osv', wurflData.advertised_device_os_version, device, ortb2data); + enrichOrtb2DeviceData('hwv', wurflData.model_name, device, ortb2data); + enrichOrtb2DeviceData('h', wurflData.resolution_height, device, ortb2data); + enrichOrtb2DeviceData('w', wurflData.resolution_width, device, ortb2data); + enrichOrtb2DeviceData('ppi', wurflData.pixel_density, device, ortb2data); + enrichOrtb2DeviceData('pxratio', toNumber(wurflData.density_class), device, ortb2data); + enrichOrtb2DeviceData('js', toNumber(wurflData.ajax_support_javascript), device, ortb2data); + } + ortb2data.device.ext['wurfl'] = wurflData; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.mergeDeep)(reqBidsConfigObj.ortb2Fragments.bidder, { + [bidderCode]: ortb2data + }); +}; + +/** + * makeOrtb2DeviceType returns the ortb2 device type based on WURFL data + * @param {Object} wurflData WURFL data + * @returns {Number} ortb2 device type + * @see https://www.scientiamobile.com/how-to-populate-iab-openrtb-device-object/ + */ +function makeOrtb2DeviceType(wurflData) { + if (wurflData.is_mobile) { + if (!('is_phone' in wurflData) || !('is_tablet' in wurflData)) { + return undefined; + } + if (wurflData.is_phone || wurflData.is_tablet) { + return 1; + } + return 6; + } + if (wurflData.is_full_desktop) { + return 2; + } + if (wurflData.is_connected_tv) { + return 3; + } + if (wurflData.is_phone) { + return 4; + } + if (wurflData.is_tablet) { + return 5; + } + if (wurflData.is_ott) { + return 7; + } + return undefined; +} + +/** + * enrichOrtb2DeviceData enriches the ortb2data device data with WURFL data. + * Note: it does not overrides properties set by Prebid.js + * @param {String} key the device property key + * @param {any} value the value of the device property + * @param {Object} device the ortb2 device object from Prebid.js + * @param {Object} ortb2data the ortb2 device data enrchiced with WURFL data + */ +function enrichOrtb2DeviceData(key, value, device, ortb2data) { + if (device?.[key] !== undefined) { + // value already defined by Prebid.js, do not overrides + return; + } + if (value === undefined) { + return; + } + ortb2data.device[key] = value; +} + +/** + * toNumber converts a given value to a number. + * Returns `undefined` if the conversion results in `NaN`. + * @param {any} value - The value to convert to a number. + * @returns {number|undefined} The converted number, or `undefined` if the conversion fails. + */ +function toNumber(value) { + if (value === '' || value === null) { + return undefined; + } + const num = Number(value); + return Number.isNaN(num) ? undefined : num; +} + +/** + * onAuctionEndEvent is called when the auction ends + * @param {Object} auctionDetails Auction details + * @param {Object} config Configuration for WURFL RTD submodule + * @param {Object} userConsent User consent data + */ +function onAuctionEndEvent(auctionDetails, config, userConsent) { + const altHost = config.params?.altHost ?? null; + let host = WURFL_JS_HOST; + if (altHost) { + host = altHost; + } + const url = new URL(host); + url.pathname = STATS_ENDPOINT_PATH; + if (enrichedBidders.size === 0) { + return; + } + var payload = JSON.stringify({ + bidders: [...enrichedBidders] + }); + const sentBeacon = (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.sendBeacon)(url.toString(), payload); + if (sentBeacon) { + return; + } + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_3__.fetch)(url.toString(), { + method: 'POST', + body: payload, + mode: 'no-cors', + keepalive: true + }); +} + +// The WURFL submodule +const wurflSubmodule = { + name: MODULE_NAME, + init, + getBidRequestData, + onAuctionEndEvent +}; + +// Register the WURFL submodule as submodule of realTimeData +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_4__.submodule)(REAL_TIME_MODULE, wurflSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('wurflRtdProvider'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/wurflRtdProvider.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["xeBidAdapter"],{ + +/***/ "./modules/xeBidAdapter.js": +/*!*********************************!*\ + !*** ./modules/xeBidAdapter.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/xeUtils/bidderUtils.js */ "./libraries/xeUtils/bidderUtils.js"); + + + + +const BIDDER_CODE = 'xe'; +const ENDPOINT = 'https://pbjs.xe.works/bid'; +const spec = { + code: BIDDER_CODE, + aliases: ['xeworks', 'lunamediax'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + isBidRequestValid: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.isBidRequestValid, + buildRequests: (validBidRequests, bidderRequest) => (0,_libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.buildRequests)(validBidRequests, bidderRequest, ENDPOINT), + interpretResponse: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.interpretResponse, + getUserSyncs: _libraries_xeUtils_bidderUtils_js__WEBPACK_IMPORTED_MODULE_1__.getUserSyncs +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('xeBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["sizeUtils","xeUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/xeBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yahooAdsBidAdapter"],{ + +/***/ "./modules/yahooAdsBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/yahooAdsBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils/gdpr.js */ "./src/utils/gdpr.js"); + + + + + + + +const INTEGRATION_METHOD = 'prebid.js'; +const BIDDER_CODE = 'yahooAds'; +const GVLID = 25; +const BIDDER_ALIASES = [{ + code: 'yahoossp', + gvlid: GVLID +}, { + code: 'yahooAdvertising', + gvlid: GVLID +}]; +const ADAPTER_VERSION = '1.1.0'; +const PREBID_VERSION = "9.45.0-pre"; +const DEFAULT_BID_TTL = 300; +const TEST_MODE_DCN = '8a969516017a7a396ec539d97f540011'; +const TEST_MODE_PUBID_DCN = '1234567'; +const TEST_MODE_BANNER_POS = '8a969978017a7aaabab4ab0bc01a0009'; +const TEST_MODE_VIDEO_POS = '8a96958a017a7a57ac375d50c0c700cc'; +const DEFAULT_RENDERER_TIMEOUT = 700; +const DEFAULT_CURRENCY = 'USD'; +const SSP_ENDPOINT_DCN_POS = 'https://c2shb.pubgw.yahoo.com/bidRequest'; +const SSP_ENDPOINT_PUBID = 'https://c2shb.pubgw.yahoo.com/admax/bid/partners/PBJS'; +const SUPPORTED_USER_ID_SOURCES = ['admixer.net', 'adserver.org', 'adtelligent.com', 'akamai.com', 'amxdt.net', 'audigent.com', 'britepool.com', 'criteo.com', 'crwdcntrl.net', 'deepintent.com', 'epsilon.com', 'hcn.health', 'id5-sync.com', 'idx.lat', 'intentiq.com', 'intimatemerger.com', 'liveintent.com', 'liveramp.com', 'mediawallahscript.com', 'merkleinc.com', 'netid.de', 'neustar.biz', 'nextroll.com', 'novatiq.com', 'pubcid.org', 'quantcast.com', 'tapad.com', 'uidapi.com', 'yahoo.com', 'zeotap.com']; + +/* Utility functions */ + +function getConfigValue(bid, key) { + const bidderCode = bid.bidder || bid.bidderCode; + return _src_config_js__WEBPACK_IMPORTED_MODULE_0__.config.getConfig(`${bidderCode}.${key}`); +} +function getSize(size) { + return { + w: parseInt(size[0]), + h: parseInt(size[1]) + }; +} +function transformSizes(sizes) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes) && sizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(sizes[0])) { + return [getSize(sizes)]; + } + return sizes.map(getSize); +} +function extractUserSyncUrls(syncOptions, pixels) { + let itemsRegExp = /(img|iframe)[\s\S]*?src\s*=\s*("|')(.*?)\2/gi; + let tagNameRegExp = /\w*(?=\s)/; + let srcRegExp = /src=("|')(.*?)\1/; + let userSyncObjects = []; + if (pixels) { + let matchedItems = pixels.match(itemsRegExp); + if (matchedItems) { + matchedItems.forEach(item => { + let tagName = item.match(tagNameRegExp)[0]; + let url = item.match(srcRegExp)[2]; + if (tagName && url) { + let tagType = tagName.toLowerCase() === 'img' ? 'image' : 'iframe'; + if (!syncOptions.iframeEnabled && tagType === 'iframe' || !syncOptions.pixelEnabled && tagType === 'image') { + return; + } + userSyncObjects.push({ + type: tagType, + url: url + }); + } + }); + } + } + return userSyncObjects; +} + +/** + * @param {string} url + * @param {object} consentData + * @param {object} consentData.gpp + * @param {string} consentData.gpp.gppConsent + * @param {Array} consentData.gpp.applicableSections + * @param {object} consentData.gdpr + * @param {object} consentData.gdpr.consentString + * @param {object} consentData.gdpr.gdprApplies + * @param {string} consentData.uspConsent + */ +function updateConsentQueryParams(url, consentData) { + const parameterMap = { + 'gdpr_consent': consentData.gdpr ? consentData.gdpr.consentString : '', + 'gdpr': consentData.gdpr && consentData.gdpr.gdprApplies ? '1' : '0', + 'us_privacy': consentData.uspConsent ? consentData.uspConsent : '', + 'gpp': consentData.gpp ? consentData.gpp.gppString : '', + 'gpp_sid': consentData.gpp && Array.isArray(consentData.gpp.applicableSections) ? consentData.gpp.applicableSections.join(',') : '' + }; + const existingUrl = new URL(url); + const params = existingUrl.searchParams; + for (const [key, value] of Object.entries(parameterMap)) { + params.set(key, value); + } + existingUrl.search = params.toString(); + return existingUrl.toString(); +} +; +function getSupportedEids(bid) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'userIdAsEids'))) { + return bid.userIdAsEids.filter(eid => { + return SUPPORTED_USER_ID_SOURCES.indexOf(eid.source) !== -1; + }); + } + return []; +} +function isSecure(bid) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.secure') ?? bid.ortb2Imp?.secure ?? 1; +} +; +function getPubIdMode(bid) { + let pubIdMode; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.pubId')) { + pubIdMode = true; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.dcn') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.pos')) { + pubIdMode = false; + } + ; + return pubIdMode; +} +; +function getAdapterMode(bid) { + let adapterMode = getConfigValue(bid, 'mode'); + adapterMode = adapterMode ? adapterMode.toLowerCase() : undefined; + if (typeof adapterMode === 'undefined' || adapterMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + } else if (adapterMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + } else if (adapterMode === 'all') { + return '*'; + } +} +; +function getResponseFormat(bid) { + const adm = bid.adm; + if (adm.indexOf('o2playerSettings') !== -1 || adm.indexOf('YAHOO.VideoPlatform.VideoPlayer') !== -1 || adm.indexOf('AdPlacement') !== -1) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + } else if (adm.indexOf('VAST') !== -1) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + } +} +; +function getFloorModuleData(bid) { + const adapterMode = getAdapterMode(bid); + const getFloorRequestObject = { + currency: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.cur') || DEFAULT_CURRENCY, + mediaType: adapterMode, + size: '*' + }; + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isFn)(bid.getFloor) ? bid.getFloor(getFloorRequestObject) : false; +} +; +function filterBidRequestByMode(validBidRequests) { + const mediaTypesMode = getAdapterMode(validBidRequests[0]); + let result = []; + if (mediaTypesMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + result = validBidRequests.filter(bid => { + return Object.keys(bid.mediaTypes).some(item => item === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER); + }); + } else if (mediaTypesMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + result = validBidRequests.filter(bid => { + return Object.keys(bid.mediaTypes).some(item => item === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO); + }); + } else if (mediaTypesMode === '*') { + result = validBidRequests.filter(bid => { + return Object.keys(bid.mediaTypes).some(item => item === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER || item === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO); + }); + } + ; + return result; +} +; +function validateAppendObject(validationType, allowedKeys, inputObject, appendToObject) { + const outputObject = { + ...appendToObject + }; + for (const objectKey in inputObject) { + switch (validationType) { + case 'string': + if (allowedKeys.indexOf(objectKey) !== -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(inputObject[objectKey])) { + outputObject[objectKey] = inputObject[objectKey]; + } + ; + break; + case 'number': + if (allowedKeys.indexOf(objectKey) !== -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(inputObject[objectKey])) { + outputObject[objectKey] = inputObject[objectKey]; + } + ; + break; + case 'array': + if (allowedKeys.indexOf(objectKey) !== -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(inputObject[objectKey])) { + outputObject[objectKey] = inputObject[objectKey]; + } + ; + break; + case 'object': + if (allowedKeys.indexOf(objectKey) !== -1 && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(inputObject[objectKey])) { + outputObject[objectKey] = inputObject[objectKey]; + } + ; + break; + case 'objectAllKeys': + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(inputObject)) { + outputObject[objectKey] = inputObject[objectKey]; + } + ; + break; + } + ; + } + ; + return outputObject; +} +; +function getTtl(bidderRequest) { + const globalTTL = getConfigValue(bidderRequest, 'ttl'); + return globalTTL ? validateTTL(globalTTL) : validateTTL((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'params.ttl')); +} +; +function validateTTL(ttl) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(ttl) && ttl > 0 && ttl < 3600 ? ttl : DEFAULT_BID_TTL; +} +; +function isNotEmptyStr(value) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(value) && value.length > 0; +} +; +function generateOpenRtbObject(bidderRequest, bid) { + if (bidderRequest) { + let outBoundBidRequest = { + id: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID)(), + cur: [getFloorModuleData(bidderRequest).currency || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.cur') || DEFAULT_CURRENCY], + imp: [], + site: { + page: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page') + }, + device: { + dnt: 0, + ua: navigator.userAgent, + ip: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.device.ip') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.ext.ip') || undefined, + w: window.screen.width, + h: window.screen.height + }, + regs: { + ext: { + 'us_privacy': bidderRequest.uspConsent ? bidderRequest.uspConsent : '', + gdpr: bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? 1 : 0, + gpp: bidderRequest.gppConsent ? bidderRequest.gppConsent.gppString : '', + gpp_sid: bidderRequest.gppConsent ? bidderRequest.gppConsent.applicableSections : [] + } + }, + source: { + ext: { + hb: 1, + adapterver: ADAPTER_VERSION, + prebidver: PREBID_VERSION, + integration: { + name: INTEGRATION_METHOD, + ver: PREBID_VERSION + } + }, + fd: 1 + }, + user: { + ext: { + consent: bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies ? bidderRequest.gdprConsent.consentString : '', + eids: getSupportedEids(bid) + } + } + }; + if (getPubIdMode(bid) === true) { + outBoundBidRequest.site.publisher = { + id: bid.params.pubId + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.site.id') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.siteId')) { + outBoundBidRequest.site.id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.site.id') || bid.params.siteId; + } + } else { + outBoundBidRequest.site.id = bid.params.dcn; + } + ; + if (bidderRequest.ortb2?.regs?.gpp) { + outBoundBidRequest.regs.ext.gpp = bidderRequest.ortb2.regs.gpp; + outBoundBidRequest.regs.ext.gpp_sid = bidderRequest.ortb2.regs.gpp_sid; + } + ; + if (bidderRequest.ortb2) { + outBoundBidRequest = appendFirstPartyData(outBoundBidRequest, bid); + } + ; + const schainData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'schain.nodes'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(schainData) && schainData.length > 0) { + outBoundBidRequest.source.ext.schain = bid.schain; + outBoundBidRequest.source.ext.schain.nodes[0].rid = outBoundBidRequest.id; + } + ; + return outBoundBidRequest; + } + ; +} +; +function appendImpObject(bid, openRtbObject) { + const mediaTypeMode = getAdapterMode(bid); + if (openRtbObject && bid) { + const impObject = { + id: bid.bidId, + secure: isSecure(bid), + bidfloor: getFloorModuleData(bid)?.floor || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.bidfloor') + }; + if (bid.mediaTypes.banner && (typeof mediaTypeMode === 'undefined' || mediaTypeMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER || mediaTypeMode === '*')) { + impObject.banner = { + mimes: bid.mediaTypes.banner.mimes || ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'], + format: transformSizes(bid.sizes) + }; + if (bid.mediaTypes.banner.pos) { + impObject.banner.pos = bid.mediaTypes.banner.pos; + } + ; + } + ; + if (bid.mediaTypes.video && (mediaTypeMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO || mediaTypeMode === '*')) { + const playerSize = transformSizes(bid.mediaTypes.video.playerSize); + impObject.video = { + mimes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.mimes') || bid.mediaTypes.video.mimes || ['video/mp4', 'application/javascript'], + w: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.w') || playerSize[0].w, + h: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.h') || playerSize[0].h, + maxbitrate: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.maxbitrate') || bid.mediaTypes.video.maxbitrate || undefined, + maxduration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.maxduration') || bid.mediaTypes.video.maxduration || undefined, + minduration: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.minduration') || bid.mediaTypes.video.minduration || undefined, + api: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.api') || bid.mediaTypes.video.api || [2], + delivery: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.delivery') || bid.mediaTypes.video.delivery || undefined, + pos: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.pos') || bid.mediaTypes.video.pos || undefined, + playbackmethod: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.playbackmethod') || bid.mediaTypes.video.playbackmethod || undefined, + placement: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.placement') || bid.mediaTypes.video.placement || undefined, + plcmt: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.plcmt') || bid.mediaTypes.video.plcmt || undefined, + linearity: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.linearity') || bid.mediaTypes.video.linearity || 1, + protocols: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.protocols') || bid.mediaTypes.video.protocols || [2, 5], + startdelay: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.startdelay') || bid.mediaTypes.video.startdelay || 0, + rewarded: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.bidOverride.imp.video.rewarded') || undefined + }; + } + impObject.ext = { + dfp_ad_unit_code: bid.adUnitCode + }; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.kvp') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bid.params.kvp)) { + impObject.ext.kvs = {}; + for (const key in bid.params.kvp) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(bid.params.kvp[key]) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.params.kvp[key])) { + impObject.ext.kvs[key] = bid.params.kvp[key]; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(bid.params.kvp[key])) { + const array = bid.params.kvp[key]; + if (array.every(value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr)(value)) || array.every(value => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(value))) { + impObject.ext.kvs[key] = bid.params.kvp[key]; + } + } + } + } + ; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.ext.data') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(bid.ortb2Imp.ext.data)) { + impObject.ext.data = bid.ortb2Imp.ext.data; + } + ; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'ortb2Imp.instl') && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(bid.ortb2Imp.instl) && bid.ortb2Imp.instl === 1) { + impObject.instl = bid.ortb2Imp.instl; + } + ; + if (getPubIdMode(bid) === false) { + impObject.tagid = bid.params.pos; + impObject.ext.pos = bid.params.pos; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'params.placementId')) { + impObject.tagid = bid.params.placementId; + } + ; + openRtbObject.imp.push(impObject); + } + ; +} +; +function appendFirstPartyData(outBoundBidRequest, bid) { + const ortb2Object = bid.ortb2; + const siteObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ortb2Object, 'site') || undefined; + const siteContentObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(siteObject, 'content') || undefined; + const sitePublisherObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(siteObject, 'publisher') || undefined; + const siteContentDataArray = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(siteObject, 'content.data') || undefined; + const appContentObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ortb2Object, 'app.content') || undefined; + const appContentDataArray = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ortb2Object, 'app.content.data') || undefined; + const userObject = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ortb2Object, 'user') || undefined; + if (siteObject && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(siteObject)) { + const allowedSiteStringKeys = ['name', 'domain', 'page', 'ref', 'keywords', 'search']; + const allowedSiteArrayKeys = ['cat', 'sectioncat', 'pagecat']; + const allowedSiteObjectKeys = ['ext']; + outBoundBidRequest.site = validateAppendObject('string', allowedSiteStringKeys, siteObject, outBoundBidRequest.site); + outBoundBidRequest.site = validateAppendObject('array', allowedSiteArrayKeys, siteObject, outBoundBidRequest.site); + outBoundBidRequest.site = validateAppendObject('object', allowedSiteObjectKeys, siteObject, outBoundBidRequest.site); + } + ; + if (sitePublisherObject && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(sitePublisherObject)) { + const allowedPublisherObjectKeys = ['ext']; + outBoundBidRequest.site.publisher = validateAppendObject('object', allowedPublisherObjectKeys, sitePublisherObject, outBoundBidRequest.site.publisher); + } + if (siteContentObject && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(siteContentObject)) { + const allowedContentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language']; + const allowedContentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len']; + const allowedContentArrayKeys = ['cat']; + const allowedContentObjectKeys = ['ext']; + outBoundBidRequest.site.content = validateAppendObject('string', allowedContentStringKeys, siteContentObject, outBoundBidRequest.site.content); + outBoundBidRequest.site.content = validateAppendObject('number', allowedContentNumberkeys, siteContentObject, outBoundBidRequest.site.content); + outBoundBidRequest.site.content = validateAppendObject('array', allowedContentArrayKeys, siteContentObject, outBoundBidRequest.site.content); + outBoundBidRequest.site.content = validateAppendObject('object', allowedContentObjectKeys, siteContentObject, outBoundBidRequest.site.content); + if (siteContentDataArray && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(siteContentDataArray)) { + siteContentDataArray.every(dataObject => { + let newDataObject = {}; + const allowedContentDataStringKeys = ['id', 'name']; + const allowedContentDataArrayKeys = ['segment']; + const allowedContentDataObjectKeys = ['ext']; + newDataObject = validateAppendObject('string', allowedContentDataStringKeys, dataObject, newDataObject); + newDataObject = validateAppendObject('array', allowedContentDataArrayKeys, dataObject, newDataObject); + newDataObject = validateAppendObject('object', allowedContentDataObjectKeys, dataObject, newDataObject); + outBoundBidRequest.site.content.data = []; + outBoundBidRequest.site.content.data.push(newDataObject); + }); + } + ; + } + ; + if (appContentObject && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(appContentObject)) { + if (appContentDataArray && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(appContentDataArray)) { + appContentDataArray.every(dataObject => { + let newDataObject = {}; + const allowedContentDataStringKeys = ['id', 'name']; + const allowedContentDataArrayKeys = ['segment']; + const allowedContentDataObjectKeys = ['ext']; + newDataObject = validateAppendObject('string', allowedContentDataStringKeys, dataObject, newDataObject); + newDataObject = validateAppendObject('array', allowedContentDataArrayKeys, dataObject, newDataObject); + newDataObject = validateAppendObject('object', allowedContentDataObjectKeys, dataObject, newDataObject); + outBoundBidRequest.app = { + content: { + data: [] + } + }; + outBoundBidRequest.app.content.data.push(newDataObject); + }); + } + ; + } + ; + if (userObject && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(userObject)) { + const allowedUserStrings = ['id', 'buyeruid', 'gender', 'keywords', 'customdata']; + const allowedUserNumbers = ['yob']; + const allowedUserArrays = ['data']; + const allowedUserObjects = ['ext']; + outBoundBidRequest.user = validateAppendObject('string', allowedUserStrings, userObject, outBoundBidRequest.user); + outBoundBidRequest.user = validateAppendObject('number', allowedUserNumbers, userObject, outBoundBidRequest.user); + outBoundBidRequest.user = validateAppendObject('array', allowedUserArrays, userObject, outBoundBidRequest.user); + outBoundBidRequest.user.ext = validateAppendObject('object', allowedUserObjects, userObject, outBoundBidRequest.user.ext); + } + ; + return outBoundBidRequest; +} +; +function generateServerRequest(_ref) { + let { + payload, + requestOptions, + bidderRequest + } = _ref; + const pubIdMode = getPubIdMode(bidderRequest); + const overrideEndpoint = getConfigValue(bidderRequest, 'endpoint'); + let sspEndpoint = overrideEndpoint || SSP_ENDPOINT_DCN_POS; + if (pubIdMode === true) { + sspEndpoint = overrideEndpoint || SSP_ENDPOINT_PUBID; + } + ; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'params.testing.e2etest') === true) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('Adapter e2etest mode is active'); + requestOptions.withCredentials = false; + if (pubIdMode === true) { + payload.site.id = TEST_MODE_PUBID_DCN; + } else { + const mediaTypeMode = getAdapterMode(bidderRequest); + payload.site.id = TEST_MODE_DCN; + payload.imp.forEach(impObject => { + impObject.ext.e2eTestMode = true; + if (mediaTypeMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + impObject.tagid = TEST_MODE_BANNER_POS; // banner passback + } else if (mediaTypeMode === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + impObject.tagid = TEST_MODE_VIDEO_POS; // video passback + } else { + const bidderCode = bidderRequest.bidderCode; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`e2etest mode does not support ${bidderCode}.mode="all". \n Please specify either "banner" or "video"`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)(`Adapter e2etest mode: Please make sure your adUnit matches the ${bidderCode}.mode video or banner`); + } + }); + } + } + ; + return { + url: sspEndpoint, + method: 'POST', + data: payload, + options: requestOptions, + bidderRequest // Additional data for use in interpretResponse() + }; +} +; +function createRenderer(bidderRequest, bidResponse) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__.Renderer.install({ + url: 'https://s.yimg.com/kp/prebid-outstream-renderer/renderer.js', + loaded: false, + adUnitCode: bidderRequest.adUnitCode + }); + try { + renderer.setRender(function (bidResponse) { + setTimeout(function () { + // eslint-disable-next-line no-undef + o2PlayerRender(bidResponse); + }, (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'params.testing.renderer.setTimeout') || DEFAULT_RENDERER_TIMEOUT); + }); + } catch (error) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Renderer error: setRender() failed', error); + } + return renderer; +} + +/* Utility functions */ + +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + aliases: BIDDER_ALIASES, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO], + isBidRequestValid: function (bid) { + const params = bid.params; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(params, 'testing.e2etest') === true) { + return true; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(params) && (isNotEmptyStr(params.pubId) || isNotEmptyStr(params.dcn) && isNotEmptyStr(params.pos))) { + return true; + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Bidder params missing or incorrect, please pass object with either: dcn & pos OR pubId'); + return false; + } + }, + buildRequests: function (validBidRequests, bidderRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(validBidRequests) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(bidderRequest)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('buildRequests called with either empty "validBidRequests" or "bidderRequest"'); + return undefined; + } + ; + const requestOptions = { + contentType: 'application/json', + customHeaders: { + 'x-openrtb-version': '2.5' + } + }; + requestOptions.withCredentials = (0,_src_utils_gdpr_js__WEBPACK_IMPORTED_MODULE_5__.hasPurpose1Consent)(bidderRequest.gdprConsent); + const filteredBidRequests = filterBidRequestByMode(validBidRequests); + if (getConfigValue(bidderRequest, 'singleRequestMode') === true) { + const payload = generateOpenRtbObject(bidderRequest, filteredBidRequests[0]); + filteredBidRequests.forEach(bid => { + appendImpObject(bid, payload); + }); + return [generateServerRequest({ + payload, + requestOptions, + bidderRequest + })]; + } + return filteredBidRequests.map(bid => { + const payloadClone = generateOpenRtbObject(bidderRequest, bid); + appendImpObject(bid, payloadClone); + return generateServerRequest({ + payload: payloadClone, + requestOptions, + bidderRequest: bid + }); + }); + }, + interpretResponse: function (serverResponse, _ref2) { + let { + bidderRequest + } = _ref2; + const response = []; + if (!serverResponse.body || !Array.isArray(serverResponse.body.seatbid)) { + return response; + } + let seatbids = serverResponse.body.seatbid; + seatbids.forEach(seatbid => { + let bid; + try { + bid = seatbid.bid[0]; + } catch (e) { + return response; + } + let cpm = bid.ext && bid.ext.encp ? bid.ext.encp : bid.price; + let bidResponse = { + adId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, 'adId') ? bid.adId : bid.impid || bid.crid, + requestId: bid.impid, + cpm: cpm, + width: bid.w, + height: bid.h, + creativeId: bid.crid || 0, + currency: bid.cur || DEFAULT_CURRENCY, + dealId: bid.dealid ? bid.dealid : null, + netRevenue: true, + ttl: getTtl(bidderRequest), + meta: { + advertiserDomains: bid.adomain + } + }; + const responseAdmFormat = getResponseFormat(bid); + if (responseAdmFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + bidResponse.ad = bid.adm; + bidResponse.meta.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.BANNER; + } else if (responseAdmFormat === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + bidResponse.meta.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO; + bidResponse.vastXml = bid.adm; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'mediaTypes.video.context') === 'outstream' && !bidderRequest.renderer && bidResponse.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_3__.VIDEO) { + bidResponse.renderer = createRenderer(bidderRequest, bidResponse) || undefined; + } + response.push(bidResponse); + }); + return response; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) { + const bidResponse = !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(serverResponses) && serverResponses[0].body; + if (bidResponse && bidResponse.ext && bidResponse.ext.pixels) { + const userSyncObjects = extractUserSyncUrls(syncOptions, bidResponse.ext.pixels); + userSyncObjects.forEach(userSyncObject => { + userSyncObject.url = updateConsentQueryParams(userSyncObject.url, { + gpp: gppConsent, + gdpr: gdprConsent, + uspConsent: uspConsent + }); + }); + return userSyncObjects; + } + return []; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('yahooAdsBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yahooAdsBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yandexAnalyticsAdapter"],{ + +/***/ "./modules/yandexAnalyticsAdapter.js": +/*!*******************************************!*\ + !*** ./modules/yandexAnalyticsAdapter.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports PBJS_INIT_EVENT_NAME, EVENTS_TO_TRACK */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/events.js */ "./src/events.js"); + + + + + + + +const timeoutIds = {}; +const tryUntil = (operationId, conditionCb, cb) => { + if (!conditionCb()) { + cb(); + timeoutIds[operationId] = setTimeout(() => tryUntil(conditionCb, conditionCb, cb), 100); + } +}; +const clearTryUntilTimeouts = timeouts => { + timeouts.forEach(timeoutID => { + if (timeoutIds[timeoutID]) { + clearTimeout(timeoutIds[timeoutID]); + } + }); +}; +const PBJS_INIT_EVENT_NAME = 'pbjsInit'; +const SEND_EVENTS_BUNDLE_TIMEOUT = 1500; +const { + BID_REQUESTED, + BID_RESPONSE, + BID_ADJUSTMENT, + BID_WON, + BIDDER_DONE, + AUCTION_END, + BID_TIMEOUT, + AD_RENDER_FAILED, + AD_RENDER_SUCCEEDED, + BIDDER_ERROR +} = _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS; +const EVENTS_TO_TRACK = [BID_REQUESTED, BID_RESPONSE, BID_ADJUSTMENT, BID_WON, BIDDER_DONE, AUCTION_END, BID_TIMEOUT, AD_RENDER_FAILED, AD_RENDER_SUCCEEDED, BIDDER_ERROR]; +const yandexAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_1__["default"])({ + analyticsType: 'endpoint' +}), { + bufferedEvents: [], + initTimeoutId: 0, + counters: {}, + counterInitTimeouts: {}, + oneCounterInited: false, + onEvent: (eventName, eventData) => { + const innerEvent = { + event: eventName, + data: eventData + }; + yandexAnalytics.bufferedEvents.push(innerEvent); + }, + sendEvents: () => { + if (yandexAnalytics.bufferedEvents.length) { + const data = yandexAnalytics.bufferedEvents.splice(0, yandexAnalytics.bufferedEvents.length); + Object.keys(yandexAnalytics.counters).forEach(counterId => { + yandexAnalytics.counters[counterId].pbjs(data); + }); + } + setTimeout(yandexAnalytics.sendEvents, SEND_EVENTS_BUNDLE_TIMEOUT); + }, + onCounterInit: counterId => { + yandexAnalytics.counters[counterId] = window[`yaCounter${counterId}`]; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Found metrika counter ${counterId}`); + if (!yandexAnalytics.oneCounterInited) { + yandexAnalytics.oneCounterInited = true; + setTimeout(() => { + yandexAnalytics.sendEvents(); + }, SEND_EVENTS_BUNDLE_TIMEOUT); + clearTimeout(yandexAnalytics.initTimeoutId); + } + }, + enableAnalytics: config => { + yandexAnalytics.options = config && config.options || {}; + const { + counters + } = yandexAnalytics.options || {}; + const validCounters = counters.filter(counterId => { + if (!counterId) { + return false; + } + if (isNaN(counterId)) { + return false; + } + return true; + }); + if (!validCounters.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('options.counters contains no valid counter ids'); + return; + } + const unsubscribeCallbacks = [() => clearTryUntilTimeouts(['countersInit'])]; + yandexAnalytics.initTimeoutId = setTimeout(() => { + yandexAnalytics.bufferedEvents = []; + unsubscribeCallbacks.forEach(cb => cb()); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Can't find metrika counter after 25 seconds.`); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Aborting yandex analytics provider initialization.'); + }, 25000); + yandexAnalytics.onEvent(PBJS_INIT_EVENT_NAME, { + 'version': (0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.getGlobal)().version + }); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.getEvents().forEach(event => { + if (event && EVENTS_TO_TRACK.indexOf(event.eventType) >= 0) { + yandexAnalytics.onEvent(event.eventType, event); + } + }); + EVENTS_TO_TRACK.forEach(eventName => { + const eventCallback = yandexAnalytics.onEvent.bind(null, eventName); + unsubscribeCallbacks.push(() => _src_events_js__WEBPACK_IMPORTED_MODULE_4__.off(eventName, eventCallback)); + _src_events_js__WEBPACK_IMPORTED_MODULE_4__.on(eventName, eventCallback); + }); + let allCountersInited = false; + tryUntil('countersInit', () => allCountersInited, () => { + allCountersInited = validCounters.reduce((result, counterId) => { + if (yandexAnalytics.counters[counterId]) { + return result && true; + } + if (window[`yaCounter${counterId}`]) { + yandexAnalytics.onCounterInit(counterId); + return result && true; + } + return false; + }, true); + }); + } +}); +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_5__["default"].registerAnalyticsAdapter({ + adapter: yandexAnalytics, + code: 'yandex' +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (yandexAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('yandexAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yandexAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yandexBidAdapter"],{ + +/***/ "./modules/yandexBidAdapter.js": +/*!*************************************!*\ + !*** ./modules/yandexBidAdapter.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports NATIVE_ASSETS, spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../libraries/ortb2Utils/currency.js */ "./libraries/ortb2Utils/currency.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').BidderSpec} BidderSpec + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + * @typedef {import('../src/auction.js').BidderRequest} BidderRequest + * @typedef {import('../src/mediaTypes.js').MediaType} MediaType + * @typedef {import('../src/utils.js').MediaTypes} MediaTypes + * @typedef {import('../modules/priceFloors.js').getFloor} GetFloor + */ + +/** + * @typedef {Object} CustomServerRequestFields + * @property {BidRequest} bidRequest + */ + +/** + * @typedef {ServerRequest & CustomServerRequestFields} YandexServerRequest + */ + +/** + * Yandex bidder-specific params which the publisher used in their bid request. + * + * @typedef {Object} YandexBidRequestParams + * @property {string} placementId Possible formats: `R-I-123456-2`, `R-123456-1`, `123456-789`. + * @property {number} [pageId] Deprecated. Please use `placementId` instead. + * @property {number} [impId] Deprecated. Please use `placementId` instead. + */ + +/** + * @typedef {Object} AdditionalBidRequestFields + * @property {GetFloor} [getFloor] + * @property {MediaTypes} [mediaTypes] + */ + +/** + * @typedef {BidRequest & AdditionalBidRequestFields} ExtendedBidRequest + */ + +const BIDDER_CODE = 'yandex'; +const BIDDER_URL = 'https://yandex.ru/ads/prebid'; +const DEFAULT_TTL = 180; +const DEFAULT_CURRENCY = 'EUR'; +/** + * @type {MediaType[]} + */ +const SUPPORTED_MEDIA_TYPES = [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO]; +const SSP_ID = 10500; +const ADAPTER_VERSION = '2.3.0'; +const IMAGE_ASSET_TYPES = { + ICON: 1, + IMAGE: 3 +}; +const DATA_ASSET_TYPES = { + TITLE: 0, + SPONSORED: 1, + DESC: 2, + RATING: 3, + LIKES: 4, + ADDRESS: 9, + DESC2: 10, + DISPLAY_URL: 11, + CTA_TEXT: 12, + E_504: 504 +}; +const NATIVE_ASSETS = { + title: [1, DATA_ASSET_TYPES.TITLE], + body: [2, DATA_ASSET_TYPES.DESC], + body2: [3, DATA_ASSET_TYPES.DESC2], + sponsoredBy: [4, DATA_ASSET_TYPES.SPONSORED], + icon: [5, IMAGE_ASSET_TYPES.ICON], + image: [6, IMAGE_ASSET_TYPES.IMAGE], + displayUrl: [7, DATA_ASSET_TYPES.DISPLAY_URL], + cta: [8, DATA_ASSET_TYPES.CTA_TEXT], + rating: [9, DATA_ASSET_TYPES.RATING], + likes: [10, DATA_ASSET_TYPES.LIKES] +}; +const NATIVE_ASSETS_IDS = {}; +(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._each)(NATIVE_ASSETS, (asset, key) => { + NATIVE_ASSETS_IDS[asset[0]] = key; +}); + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + aliases: ['ya'], + // short code + supportedMediaTypes: SUPPORTED_MEDIA_TYPES, + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid request to validate. + * @returns {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + const { + params + } = bid; + if (!params) { + return false; + } + const { + pageId, + impId + } = extractPlacementIds(params); + if (!(pageId && impId)) { + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {ExtendedBidRequest[]} validBidRequests An array of bids. + * @param {BidderRequest} bidderRequest Bidder request object. + * @returns {YandexServerRequest[]} Objects describing the requests to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_2__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const ortb2 = bidderRequest.ortb2; + let timeout = null; + if (bidderRequest) { + timeout = bidderRequest.timeout; + } + const adServerCurrency = (0,_libraries_ortb2Utils_currency_js__WEBPACK_IMPORTED_MODULE_3__.getCurrencyFromBidderRequest)(bidderRequest); + return validBidRequests.map(bidRequest => { + const { + params + } = bidRequest; + const { + targetRef, + withCredentials = true, + cur + } = params; + const { + pageId, + impId + } = extractPlacementIds(params); + const queryParams = { + 'imp-id': impId, + 'target-ref': targetRef || ortb2?.site?.domain, + 'adapter-version': ADAPTER_VERSION, + 'ssp-id': SSP_ID + }; + const gdprApplies = Boolean((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'gdprConsent.gdprApplies')); + if (gdprApplies) { + const consentString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidderRequest, 'gdprConsent.consentString'); + queryParams['gdpr'] = 1; + queryParams['tcf-consent'] = consentString; + } + const imp = { + id: impId, + banner: mapBanner(bidRequest), + native: mapNative(bidRequest), + video: mapVideo(bidRequest), + displaymanager: 'Prebid.js', + displaymanagerver: "9.45.0-pre" + }; + const bidfloor = getBidfloor(bidRequest); + if (bidfloor) { + imp.bidfloor = bidfloor.floor; + imp.bidfloorcur = bidfloor.currency; + } + const currency = cur || adServerCurrency; + if (currency) { + queryParams['ssp-cur'] = currency; + } + const data = { + id: bidRequest.bidId, + imp: [imp], + site: ortb2?.site, + tmax: timeout, + user: ortb2?.user, + device: ortb2?.device + }; + if (!data?.site?.content?.language) { + const documentLang = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(ortb2, 'site.ext.data.documentLang'); + if (documentLang) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(data, 'site.content.language', documentLang); + } + } + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'userIdAsEids'); + if (eids && eids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.dset)(data, 'user.ext.eids', eids); + } + const queryParamsString = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.formatQS)(queryParams); + const request = { + method: 'POST', + url: BIDDER_URL + `/${pageId}?${queryParamsString}`, + data, + options: { + withCredentials + }, + bidRequest + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo)('ServerRequest', request); + return request; + }); + }, + interpretResponse: interpretResponse, + /** + * Register bidder specific code, which will execute if a bid from this bidder won the auction. + * @param {Bid} bid The bid that won the auction. + */ + onBidWon: function (bid) { + const nurl = addRTT(bid['nurl'], bid.timeToRespond); + if (!nurl) { + return; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(nurl); + } +}; + +/** + * @param {YandexBidRequestParams} bidRequestParams + */ +function extractPlacementIds(bidRequestParams) { + const { + placementId + } = bidRequestParams; + const result = { + pageId: null, + impId: null + }; + let pageId, impId; + if (placementId) { + /* + * Possible formats + * R-I-123456-2 + * R-123456-1 + * 123456-789 + */ + const num = placementId.lastIndexOf('-'); + if (num === -1) { + return result; + } + const num2 = placementId.lastIndexOf('-', num - 1); + pageId = placementId.slice(num2 + 1, num); + impId = placementId.slice(num + 1); + } else { + pageId = bidRequestParams.pageId; + impId = bidRequestParams.impId; + } + if (!parseInt(pageId, 10) || !parseInt(impId, 10)) { + return result; + } + result.pageId = pageId; + result.impId = impId; + return result; +} + +/** + * @param {ExtendedBidRequest} bidRequest + */ +function getBidfloor(bidRequest) { + const floors = []; + if (typeof bidRequest.getFloor === 'function') { + SUPPORTED_MEDIA_TYPES.forEach(type => { + if (bidRequest.hasOwnProperty(type)) { + const floorInfo = bidRequest.getFloor({ + currency: DEFAULT_CURRENCY, + mediaType: type, + size: bidRequest.sizes || '*' + }); + floors.push(floorInfo); + } + }); + } + return floors.sort((a, b) => b.floor - a.floor)[0]; +} + +/** + * @param {ExtendedBidRequest} bidRequest + */ +function mapBanner(bidRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.banner')) { + const sizes = bidRequest.sizes || bidRequest.mediaTypes.banner.sizes; + const format = sizes.map(size => ({ + w: size[0], + h: size[1] + })); + const { + w, + h + } = format[0]; + return { + format, + w, + h + }; + } +} + +/** + * Maps video parameters from bid request to OpenRTB video object. + * @param {ExtendedBidRequest} bidRequest + */ +function mapVideo(bidRequest) { + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.video'); + if (videoParams) { + const { + sizes, + playerSize + } = videoParams; + const format = (playerSize || sizes)?.map(size => ({ + w: size[0], + h: size[1] + })); + const [firstSize] = format || []; + delete videoParams.sizes; + return { + ...videoParams, + w: firstSize?.w, + h: firstSize?.h, + format + }; + } +} + +/** + * @param {ExtendedBidRequest} bidRequest + */ +function mapNative(bidRequest) { + const adUnitNativeAssets = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_4__["default"])(bidRequest, 'mediaTypes.native'); + if (adUnitNativeAssets) { + const assets = []; + Object.keys(adUnitNativeAssets).forEach(assetCode => { + if (NATIVE_ASSETS.hasOwnProperty(assetCode)) { + const nativeAsset = NATIVE_ASSETS[assetCode]; + const adUnitAssetParams = adUnitNativeAssets[assetCode]; + const asset = mapAsset(assetCode, adUnitAssetParams, nativeAsset); + assets.push(asset); + } + }); + return { + ver: 1.1, + request: JSON.stringify({ + ver: 1.1, + assets + }) + }; + } +} +function mapAsset(assetCode, adUnitAssetParams, nativeAsset) { + const [nativeAssetId, nativeAssetType] = nativeAsset; + const asset = { + id: nativeAssetId + }; + if (adUnitAssetParams.required) { + asset.required = 1; + } + if (assetCode === 'title') { + asset.title = { + len: adUnitAssetParams.len || 25 + }; + } else if (assetCode === 'image' || assetCode === 'icon') { + asset.img = mapImageAsset(adUnitAssetParams, nativeAssetType); + } else { + asset.data = { + type: nativeAssetType, + len: adUnitAssetParams.len + }; + } + return asset; +} +function mapImageAsset(adUnitImageAssetParams, nativeAssetType) { + const img = { + type: nativeAssetType + }; + if (adUnitImageAssetParams.aspect_ratios) { + const ratio = adUnitImageAssetParams.aspect_ratios[0]; + const minWidth = ratio.min_width || 100; + img.wmin = minWidth; + img.hmin = minWidth / ratio.ratio_width * ratio.ratio_height; + } + if (adUnitImageAssetParams.sizes) { + const size = Array.isArray(adUnitImageAssetParams.sizes[0]) ? adUnitImageAssetParams.sizes[0] : adUnitImageAssetParams.sizes; + img.w = size[0]; + img.h = size[1]; + } + return img; +} + +/** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {YandexServerRequest} yandexServerRequest + * @return {Bid[]} An array of bids which were nested inside the server. + */ +function interpretResponse(serverResponse, _ref) { + let { + bidRequest + } = _ref; + let response = serverResponse.body; + if (!response.seatbid) { + return []; + } + const { + seatbid, + cur + } = serverResponse.body; + const bidsReceived = seatbid.map(seatbid => seatbid.bid).reduce((a, b) => a.concat(b), []); + const currency = cur || DEFAULT_CURRENCY; + return bidsReceived.map(bidReceived => { + const price = bidReceived.price; + /** @type {Bid} */ + let prBid = { + requestId: bidRequest.bidId, + cpm: price, + currency: currency, + width: bidReceived.w, + height: bidReceived.h, + creativeId: bidReceived.adid, + nurl: replaceAuctionPrice(bidReceived.nurl, price, currency), + netRevenue: true, + ttl: DEFAULT_TTL, + meta: { + advertiserDomains: bidReceived.adomain && bidReceived.adomain.length > 0 ? bidReceived.adomain : [] + } + }; + if (bidReceived.adm.indexOf('{') === 0) { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + prBid.native = interpretNativeAd(bidReceived, price, currency); + } else if (bidReceived.adm.indexOf(' -1) { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + prBid.vastXml = bidReceived.adm; + } else { + prBid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + prBid.ad = bidReceived.adm; + } + return prBid; + }); +} +function interpretNativeAd(bidReceived, price, currency) { + try { + const { + adm + } = bidReceived; + const { + native + } = JSON.parse(adm); + const result = { + clickUrl: native.link.url + }; + native.assets.forEach(asset => { + const assetCode = NATIVE_ASSETS_IDS[asset.id]; + if (!assetCode) { + return; + } + if (assetCode === 'image' || assetCode === 'icon') { + result[assetCode] = { + url: asset.img.url, + width: asset.img.w, + height: asset.img.h + }; + } else if (assetCode === 'title') { + result[assetCode] = asset.title.text; + } else { + result[assetCode] = asset.data.value; + } + }); + result.impressionTrackers = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__._map)(native.imptrackers, tracker => replaceAuctionPrice(tracker, price, currency)); + return result; + } catch (e) {} +} +function replaceAuctionPrice(url, price, currency) { + if (!url) return; + return url.replace(/\${AUCTION_PRICE}/, price).replace(/\${AUCTION_CURRENCY}/, currency); +} +function addRTT(url, rtt) { + if (!url) return; + if (url.indexOf(`\${RTT}`) > -1) { + return url.replace(/\${RTT}/, rtt ?? -1); + } + const urlObj = new URL(url); + if (Number.isInteger(rtt)) { + urlObj.searchParams.set('rtt', rtt); + } else { + urlObj.searchParams.delete('rtt'); + } + url = urlObj.toString(); + return url; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('yandexBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["ortb2Utils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yandexBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yandexIdSystem"],{ + +/***/ "./modules/yandexIdSystem.js": +/*!***********************************!*\ + !*** ./modules/yandexIdSystem.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports BIDDER_EID_KEY, YANDEX_ID_KEY, YANDEX_EXT_COOKIE_NAMES, BIDDER_CODE, YANDEX_USER_ID_KEY, YANDEX_STORAGE_TYPE, YANDEX_MIN_EXPIRE_DAYS, PREBID_STORAGE, yandexIdSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + +/** + * The {@link module:modules/userId} module is required + * @module modules/yandexIdSystem + * @requires module:modules/userId + */ + +// @ts-check + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + + + + + + +// .com suffix is just a convention for naming the bidder eids +// See https://github.com/prebid/Prebid.js/pull/11196#discussion_r1591165139 +const BIDDER_EID_KEY = 'yandex.com'; +const YANDEX_ID_KEY = 'yandexId'; +const YANDEX_EXT_COOKIE_NAMES = ['_ym_fa']; +const BIDDER_CODE = 'yandex'; +const YANDEX_USER_ID_KEY = '_ym_uid'; +const YANDEX_STORAGE_TYPE = _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.STORAGE_TYPE_COOKIES; +const YANDEX_MIN_EXPIRE_DAYS = 30; +const PREBID_STORAGE = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: BIDDER_CODE, + bidderCode: undefined +}); + +/** @type {Submodule} */ +const yandexIdSubmodule = { + name: BIDDER_CODE, + /** + * Decodes the stored id value for passing to bid requests. + * @param {string} value + */ + decode(value) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Decoded ${YANDEX_ID_KEY}`, value); + return { + [YANDEX_ID_KEY]: value + }; + }, + getId(submoduleConfig, _consentData, storedId) { + if (checkConfigHasErrorsAndReport(submoduleConfig)) { + return; + } + if (storedId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)('Got storedId', storedId); + return { + id: storedId + }; + } + return { + id: new YandexIdGenerator().generate() + }; + }, + eids: { + [YANDEX_ID_KEY]: { + source: BIDDER_EID_KEY, + /** + * Agent Type 1 means that it is an ID + * which is tied to a specific web browser or device (cookie-based, probabilistic, or other). + * @see https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--agent-types- + */ + atype: 1, + getUidExt() { + if (PREBID_STORAGE.cookiesAreEnabled()) { + return YANDEX_EXT_COOKIE_NAMES.reduce((acc, cookieName) => ({ + ...acc, + [cookieName]: PREBID_STORAGE.getCookie(cookieName) + }), {}); + } + } + } + } +}; + +/** + * @param {SubmoduleConfig} submoduleConfig + * @returns {boolean} `true` - when there are errors, `false` - otherwise. + */ +function checkConfigHasErrorsAndReport(submoduleConfig) { + let error = false; + const READABLE_MODULE_NAME = 'Yandex ID module'; + if (submoduleConfig.storage == null) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Misconfigured ${READABLE_MODULE_NAME}. "storage" is required.`); + return true; + } + if (submoduleConfig.storage.name !== YANDEX_USER_ID_KEY) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Misconfigured ${READABLE_MODULE_NAME}, "storage.name" is expected to be "${YANDEX_USER_ID_KEY}", actual is "${submoduleConfig.storage.name}"`); + error = true; + } + if (submoduleConfig.storage.type !== YANDEX_STORAGE_TYPE) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Misconfigured ${READABLE_MODULE_NAME}, "storage.type" is expected to be "${YANDEX_STORAGE_TYPE}", actual is "${submoduleConfig.storage.type}"`); + error = true; + } + if ((submoduleConfig.storage.expires ?? 0) < YANDEX_MIN_EXPIRE_DAYS) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)(`Misconfigured ${READABLE_MODULE_NAME}, "storage.expires" is expected not to be less than "${YANDEX_MIN_EXPIRE_DAYS}", actual is "${submoduleConfig.storage.expires}"`); + error = true; + } + return error; +} + +/** + * Yandex-specific generator for uid. Needs to be compatible with Yandex Metrica tag. + * @see https://github.com/yandex/metrica-tag/blob/main/src/utils/uid/uid.ts#L51 + */ +class YandexIdGenerator { + generate() { + const yandexId = [this._getCurrentSecTimestamp(), this._getRandomInteger(1000000, 999999999)].join(''); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(`Generated ${YANDEX_ID_KEY}`, yandexId); + return yandexId; + } + _getCurrentSecTimestamp() { + return Math.round(Date.now() / 1000); + } + + /** + * @param {number} min + * @param {number} max + */ + _getRandomInteger(min, max) { + const generateRandom = this._getRandomGenerator(); + + /** + * Needs to be compatible with Yandex Metrica `getRandom` function. + * @see https://github.com/yandex/metrica-tag/blob/main/src/utils/number/random.ts#L12 + */ + return Math.floor(generateRandom() * (max - min)) + min; + } + _getRandomGenerator() { + if (window.crypto) { + return () => { + const buffer = new Uint32Array(1); + crypto.getRandomValues(buffer); + return buffer[0] / 0xffffffff; + }; + } + + // Polyfill for environments that don't support Crypto API + return () => Math.random(); + } +} +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', yandexIdSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('yandexIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yandexIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldlabBidAdapter"],{ + +/***/ "./modules/yieldlabBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/yieldlabBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_native_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/native.js */ "./src/native.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const ENDPOINT = 'https://ad.yieldlab.net'; +const BIDDER_CODE = 'yieldlab'; +const BID_RESPONSE_TTL_SEC = 300; +const CURRENCY_CODE = 'EUR'; +const OUTSTREAMPLAYER_URL = 'https://ad.adition.com/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event'; +const GVLID = 70; +const DIMENSION_SIGN = 'x'; +const IMG_TYPE_ICON = 1; +const IMG_TYPE_MAIN = 3; +const spec = { + code: BIDDER_CODE, + gvlid: GVLID, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE], + /** + * @param {object} bid + * @returns {boolean} + */ + isBidRequestValid(bid) { + return !!(bid && bid.params && bid.params.adslotId && bid.params.supplyId); + }, + /** + * This method should build correct URL + * @param {BidRequest[]} validBidRequests + * @param [bidderRequest] + * @returns {ServerRequest|ServerRequest[]} + */ + buildRequests(validBidRequests, bidderRequest) { + // convert Native ORTB definition to old-style prebid native definition + validBidRequests = (0,_src_native_js__WEBPACK_IMPORTED_MODULE_1__.convertOrtbRequestToProprietaryNative)(validBidRequests); + const adslotIds = []; + const adslotSizes = []; + const adslotFloors = []; + const timestamp = Date.now(); + const query = { + ts: timestamp, + json: true + }; + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__._each)(validBidRequests, function (bid) { + adslotIds.push(bid.params.adslotId); + const sizes = extractSizes(bid); + if (sizes.length > 0) { + adslotSizes.push(bid.params.adslotId + ':' + sizes.join('|')); + } + if (bid.params.extId) { + query.id = bid.params.extId; + } + if (bid.params.targeting) { + query.t = createTargetingString(bid.params.targeting); + } + if (bid.userIdAsEids && Array.isArray(bid.userIdAsEids)) { + query.ids = createUserIdString(bid.userIdAsEids); + query.atypes = createUserIdAtypesString(bid.userIdAsEids); + } + if (bid.params.customParams && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(bid.params.customParams)) { + for (const prop in bid.params.customParams) { + query[prop] = bid.params.customParams[prop]; + } + } + if (bid.schain && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(bid.schain) && Array.isArray(bid.schain.nodes)) { + query.schain = createSchainString(bid.schain); + } + const iabContent = getContentObject(bid); + if (iabContent) { + query.iab_content = createIabContentString(iabContent); + } + const floor = getBidFloor(bid, sizes); + if (floor) { + adslotFloors.push(bid.params.adslotId + ':' + floor); + } + }); + if (bidderRequest) { + if (bidderRequest.refererInfo && bidderRequest.refererInfo.page) { + // TODO: is 'page' the right value here? + query.pubref = bidderRequest.refererInfo.page; + } + if (bidderRequest.gdprConsent) { + query.gdpr = typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' ? bidderRequest.gdprConsent.gdprApplies : true; + if (query.gdpr) { + query.gdpr_consent = bidderRequest.gdprConsent.consentString; + } + } + if (bidderRequest.ortb2?.regs?.ext?.dsa !== undefined) { + const dsa = bidderRequest.ortb2.regs.ext.dsa; + assignIfNotUndefined(query, 'dsarequired', dsa.dsarequired); + assignIfNotUndefined(query, 'dsapubrender', dsa.pubrender); + assignIfNotUndefined(query, 'dsadatatopub', dsa.datatopub); + if (Array.isArray(dsa.transparency)) { + const filteredTransparencies = dsa.transparency.filter(_ref => { + let { + domain, + dsaparams + } = _ref; + return domain && !domain.includes('~') && Array.isArray(dsaparams) && dsaparams.length > 0 && dsaparams.every(param => typeof param === 'number'); + }); + if (filteredTransparencies.length === 1) { + const { + domain, + dsaparams + } = filteredTransparencies[0]; + assignIfNotUndefined(query, 'dsadomain', domain); + assignIfNotUndefined(query, 'dsaparams', dsaparams.join(',')); + } else if (filteredTransparencies.length > 1) { + const dsatransparency = filteredTransparencies.map(_ref2 => { + let { + domain, + dsaparams + } = _ref2; + return `${domain}~${dsaparams.join('_')}`; + }).join('~~'); + if (dsatransparency) { + query.dsatransparency = dsatransparency; + } + } + } + } + const topics = getGoogleTopics(bidderRequest); + if (topics) { + assignIfNotUndefined(query, 'segtax', topics.segtax); + assignIfNotUndefined(query, 'segclass', topics.segclass); + assignIfNotUndefined(query, 'segments', topics.segments); + } + } + const adslots = adslotIds.join(','); + if (adslotSizes.length > 0) { + query.sizes = adslotSizes.join(','); + } + if (adslotFloors.length > 0) { + query.floor = adslotFloors.join(','); + } + const queryString = createQueryString(query); + return { + method: 'GET', + url: `${ENDPOINT}/yp/${adslots}?${queryString}`, + validBidRequests: validBidRequests, + queryParams: query + }; + }, + /** + * Map ad values and pricing and stuff + * @param {ServerResponse} serverResponse + * @param {BidRequest} originalBidRequest + * @returns {Bid[]} + */ + interpretResponse(serverResponse, originalBidRequest) { + const bidResponses = []; + const timestamp = Date.now(); + const reqParams = originalBidRequest.queryParams; + originalBidRequest.validBidRequests.forEach(function (bidRequest) { + if (!serverResponse.body) { + return; + } + const matchedBid = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(serverResponse.body, function (bidResponse) { + return bidRequest.params.adslotId == bidResponse.id; + }); + if (matchedBid) { + const adUnitSize = bidRequest.sizes.length === 2 && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bidRequest.sizes[0]) ? bidRequest.sizes : bidRequest.sizes[0]; + const adSize = bidRequest.params.adSize !== undefined ? parseSize(bidRequest.params.adSize) : matchedBid.adsize !== undefined ? parseSize(matchedBid.adsize) : adUnitSize; + const extId = bidRequest.params.extId !== undefined ? '&id=' + bidRequest.params.extId : ''; + const adType = matchedBid.adtype !== undefined ? matchedBid.adtype : ''; + const gdprApplies = reqParams.gdpr ? '&gdpr=' + reqParams.gdpr : ''; + const gdprConsent = reqParams.gdpr_consent ? '&gdpr_consent=' + reqParams.gdpr_consent : ''; + const pvId = matchedBid.pvid !== undefined ? '&pvid=' + matchedBid.pvid : ''; + const iabContent = reqParams.iab_content ? '&iab_content=' + reqParams.iab_content : ''; + const bidResponse = { + requestId: bidRequest.bidId, + cpm: matchedBid.price / 100, + width: adSize[0], + height: adSize[1], + creativeId: '' + matchedBid.id, + dealId: matchedBid['c.dealid'] ? matchedBid['c.dealid'] : matchedBid.pid, + currency: CURRENCY_CODE, + netRevenue: false, + ttl: BID_RESPONSE_TTL_SEC, + referrer: '', + ad: ``, + meta: { + advertiserDomains: [matchedBid.advertiser ? matchedBid.advertiser : 'n/a'] + } + }; + const dsa = getDigitalServicesActObjectFromMatchedBid(matchedBid); + if (dsa !== undefined) { + bidResponse.meta = { + ...bidResponse.meta, + dsa: dsa + }; + } + if (isVideo(bidRequest, adType)) { + const playersize = getPlayerSize(bidRequest); + if (playersize) { + bidResponse.width = playersize[0]; + bidResponse.height = playersize[1]; + } + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bidResponse.vastUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}${iabContent}`; + if (isOutstream(bidRequest)) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_4__.Renderer.install({ + id: bidRequest.bidId, + url: OUTSTREAMPLAYER_URL, + loaded: false + }); + renderer.setRender(outstreamRender); + bidResponse.renderer = renderer; + } + } + if (isNative(bidRequest, adType)) { + const { + native + } = matchedBid; + const { + assets + } = native; + bidResponse.adUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`; + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.NATIVE; + const nativeIconAssetObj = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(assets, isImageAssetOfType(IMG_TYPE_ICON)); + const nativeImageAssetObj = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(assets, isImageAssetOfType(IMG_TYPE_MAIN)); + const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : { + url: '', + w: 0, + h: 0 + }; + const nativeTitleAsset = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(assets, asset => hasValidProperty(asset, 'title')); + const nativeBodyAsset = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_3__.find)(assets, asset => hasValidProperty(asset, 'data')); + bidResponse.native = { + title: nativeTitleAsset ? nativeTitleAsset.title.text : '', + body: nativeBodyAsset ? nativeBodyAsset.data.value : '', + ...(nativeIconAssetObj?.img && { + icon: { + url: nativeIconAssetObj.img.url, + width: nativeIconAssetObj.img.w, + height: nativeIconAssetObj.img.h + } + }), + image: { + url: nativeImageAsset.url, + width: nativeImageAsset.w, + height: nativeImageAsset.h + }, + clickUrl: native.link.url, + impressionTrackers: native.imptrackers, + assets: assets + }; + } + bidResponses.push(bidResponse); + } + }); + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @param {Object} gdprConsent Is the GDPR Consent object wrapping gdprApplies {boolean} and consentString {string} attributes. + * @param {string} uspConsent Is the US Privacy Consent string. + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + if (syncOptions.iframeEnabled) { + const params = []; + params.push(`ts=${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.timestamp)()}`); + params.push(`type=h`); + if (gdprConsent && typeof gdprConsent.gdprApplies === 'boolean') { + params.push(`gdpr=${Number(gdprConsent.gdprApplies)}`); + } + if (gdprConsent && typeof gdprConsent.consentString === 'string') { + params.push(`gdpr_consent=${gdprConsent.consentString}`); + } + syncs.push({ + type: 'iframe', + url: `${ENDPOINT}/d/6846326/766/2x2?${params.join('&')}` + }); + } + return syncs; + } +}; + +/** + * Is this a video format? + * @param {Object} format + * @param {String} adtype + * @returns {Boolean} + */ +function isVideo(format, adtype) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(format, 'mediaTypes.video') && adtype.toLowerCase() === 'video'; +} + +/** + * Is this a native format? + * @param {Object} format + * @param {String} adtype + * @returns {Boolean} + */ +function isNative(format, adtype) { + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(format, 'mediaTypes.native') && adtype.toLowerCase() === 'native'; +} + +/** + * Is this an outstream context? + * @param {Object} format + * @returns {Boolean} + */ +function isOutstream(format) { + const context = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(format, 'mediaTypes.video.context'); + return context === 'outstream'; +} + +/** + * Gets optional player size + * @param {Object} format + * @returns {Array} + */ +function getPlayerSize(format) { + const playerSize = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(format, 'mediaTypes.video.playerSize'); + return playerSize && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(playerSize[0]) ? playerSize[0] : playerSize; +} + +/** + * Expands a 'WxH' string to a 2-element [W, H] array + * @param {String} size + * @returns {Array} + */ +function parseSize(size) { + return size.split(DIMENSION_SIGN).map(Number); +} + +/** + * Creates a string out of an array of eids with source and uid + * @param {Array.<{source: String, uids: Array.<{id: String, atype: Number, ext: Object}>}>} eids + * @returns {String} + */ +function createUserIdString(eids) { + const str = []; + for (let i = 0; i < eids.length; i++) { + str.push(eids[i].source + ':' + eids[i].uids[0].id); + } + return str.join(','); +} + +/** + * Creates a string from an array of eids with ID provider and atype if atype exists + * @param {Array.<{source: String, uids: Array.<{id: String, atype: Number, ext: Object}>}>} eids + * @returns {String} idprovider:atype,idprovider2:atype2,... + */ +function createUserIdAtypesString(eids) { + const str = []; + for (let i = 0; i < eids.length; i++) { + if (eids[i].uids[0].atype) { + str.push(eids[i].source + ':' + eids[i].uids[0].atype); + } + } + return str.join(','); +} + +/** + * Creates a querystring out of an object with key-values + * @param {Object} obj + * @returns {String} + */ +function createQueryString(obj) { + const str = []; + for (const p in obj) { + if (obj.hasOwnProperty(p)) { + const val = obj[p]; + if (p !== 'schain' && p !== 'iab_content') { + str.push(encodeURIComponent(p) + '=' + encodeURIComponent(val)); + } else { + str.push(p + '=' + val); + } + } + } + return str.join('&'); +} + +/** + * Creates an unencoded targeting string out of an object with key-values + * @param {Object} obj + * @returns {String} + */ +function createTargetingString(obj) { + const str = []; + for (const p in obj) { + if (obj.hasOwnProperty(p)) { + const key = p; + const val = obj[p]; + str.push(key + '=' + val); + } + } + return str.join('&'); +} + +/** + * Creates a string out of a schain object + * @param {Object} schain + * @returns {String} + */ +function createSchainString(schain) { + const ver = schain.ver || ''; + const complete = schain.complete === 1 || schain.complete === 0 ? schain.complete : ''; + const keys = ['asi', 'sid', 'hp', 'rid', 'name', 'domain', 'ext']; + const nodesString = schain.nodes.reduce((acc, node) => { + return acc += `!${keys.map(key => node[key] ? encodeURIComponentWithBangIncluded(node[key]) : '').join(',')}`; + }, ''); + return `${ver},${complete}${nodesString}`; +} + +/** + * Get content object from bid request + * First get content from bidder params; + * If not provided in bidder params, get from first party data under 'ortb2.site.content' or 'ortb2.app.content' + * @param {Object} bid + * @returns {Object} + */ +function getContentObject(bid) { + if (bid.params.iabContent && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(bid.params.iabContent)) { + return bid.params.iabContent; + } + const globalContent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2.site') ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2.site.content') : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2.app.content'); + if (globalContent && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(globalContent)) { + return globalContent; + } + return undefined; +} + +/** + * Creates a string for iab_content object by + * 1. flatten the iab content object + * 2. encoding the values + * 3. joining array of defined keys ('keyword', 'cat') into one value seperated with '|' + * 4. encoding the whole string + * @param {Object} iabContent + * @returns {String} + */ +function createIabContentString(iabContent) { + const arrKeys = ['keywords', 'cat']; + const str = []; + const transformObjToParam = function () { + let obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let extraKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + for (const key in obj) { + if (arrKeys.indexOf(key) !== -1 && Array.isArray(obj[key])) { + // Array of defined keyword which have to be joined into one value from "key: [value1, value2, value3]" to "key:value1|value2|value3" + str.push(''.concat(key, ':', obj[key].map(node => encodeURIComponent(node)).join('|'))); + } else if (typeof obj[key] !== 'object') { + str.push(''.concat(extraKey + key, ':', encodeURIComponent(obj[key]))); + } else { + // Object has to be further flattened + transformObjToParam(obj[key], ''.concat(extraKey, key, '.')); + } + } + return str.join(','); + }; + return encodeURIComponent(transformObjToParam(iabContent)); +} + +/** + * Encodes URI Component with exlamation mark included. Needed for schain object. + * @param {String} str + * @returns {String} + */ +function encodeURIComponentWithBangIncluded(str) { + return encodeURIComponent(str).replace(/!/g, '%21'); +} + +/** + * Handles an outstream response after the library is loaded + * @param {Object} bid + */ +function outstreamRender(bid) { + bid.renderer.push(() => { + window.ma_width = bid.width; + window.ma_height = bid.height; + window.ma_vastUrl = bid.vastUrl; + window.ma_container = bid.adUnitCode; + window.document.dispatchEvent(new Event('ma-start-event')); + }); +} + +/** + * Extract sizes for a given bid from either `mediaTypes` or `sizes` directly. + * + * @param {Object} bid + * @returns {string[]} + */ +function extractSizes(bid) { + const { + mediaTypes + } = bid; // see https://docs.prebid.org/dev-docs/adunit-reference.html#examples + const sizes = []; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(mediaTypes)) { + const { + [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER]: bannerType + } = mediaTypes; + + // only applies for multi size Adslots -> BANNER + if (bannerType && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bannerType.sizes)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bannerType.sizes[0])) { + // multiple sizes given + sizes.push(bannerType.sizes); + } else { + // just one size provided as array -> wrap to uniformly flatten later + sizes.push([bannerType.sizes]); + } + } + // The bid top level field `sizes` is deprecated and should not be used anymore. Keeping it for compatibility. + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.sizes)) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(bid.sizes[0])) { + sizes.push(bid.sizes); + } else { + sizes.push([bid.sizes]); + } + } + + /** @type {Set} */ + const deduplicatedSizeStrings = new Set(sizes.flat().map(_ref3 => { + let [width, height] = _ref3; + return width + DIMENSION_SIGN + height; + })); + return Array.from(deduplicatedSizeStrings); +} + +/** + * Gets the floor price if the Price Floors Module is enabled for a given auction, + * which will add the getFloor() function to the bidRequest object. + * + * @param {Object} bid + * @param {string[]} sizes + * @returns The floor CPM in cents of a matched rule based on the rule selection process (mediaType, size and currency), + * using the getFloor() inputs. Multi sizes and unsupported media types will default to '*' + */ +function getBidFloor(bid, sizes) { + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isFn)(bid.getFloor)) { + return undefined; + } + const mediaTypes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'mediaTypes'); + const mediaType = mediaTypes !== undefined ? Object.keys(mediaTypes)[0].toLowerCase() : undefined; + const floor = bid.getFloor({ + currency: CURRENCY_CODE, + mediaType: mediaType !== undefined && spec.supportedMediaTypes.includes(mediaType) ? mediaType : '*', + size: sizes.length !== 1 ? '*' : sizes[0].split(DIMENSION_SIGN) + }); + if (floor?.currency === CURRENCY_CODE) { + return (floor.floor * 100).toFixed(0); + } + return undefined; +} + +/** + * Checks if an object has a property with a given name and the property value is not null or undefined. + * + * @param {Object} obj - The object to check. + * @param {string} propName - The name of the property to check. + * @returns {boolean} Returns true if the object has a property with the given name and the property value is not null or undefined, otherwise false. + */ +function hasValidProperty(obj, propName) { + return obj.hasOwnProperty(propName) && obj[propName] != null; +} + +/** + * Returns a filtering function for image assets based on type. + * @param {number} type - The desired asset type to filter for i.e. IMG_TYPE_ICON = 1, IMG_TYPE_MAIN = 3 + * @returns {function} - A filtering function that accepts an asset and checks if its img.type matches the desired type. + */ +function isImageAssetOfType(type) { + return asset => asset?.img?.type === type; +} + +/** + * Retrieves the Digital Services Act (DSA) object from a matched bid. + * Only includes specific attributes (behalf, paid, transparency, adrender) from the DSA object. + * + * @param {Object} matchedBid - The server response body to inspect for the DSA information. + * @returns {Object|undefined} A copy of the DSA object if it exists, or undefined if not. + */ +function getDigitalServicesActObjectFromMatchedBid(matchedBid) { + if (matchedBid.dsa) { + const { + behalf, + paid, + transparency, + adrender + } = matchedBid.dsa; + return { + ...(behalf !== undefined && { + behalf + }), + ...(paid !== undefined && { + paid + }), + ...(transparency !== undefined && { + transparency + }), + ...(adrender !== undefined && { + adrender + }) + }; + } + return undefined; +} + +/** + * Conditionally assigns a value to a specified key on an object if the value is not undefined. + * + * @param {Object} obj - The object to which the value will be assigned. + * @param {string} key - The key under which the value should be assigned. + * @param {*} value - The value to be assigned, if it is not undefined. + */ +function assignIfNotUndefined(obj, key, value) { + if (value !== undefined) { + obj[key] = value; + } +} +function getGoogleTopics(bid) { + const userData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(bid, 'ortb2.user.data') || []; + const validData = userData.filter(dataObj => dataObj.segment && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isArray)(dataObj.segment) && dataObj.segment.length > 0 && dataObj.segment.every(seg => seg.id && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmptyStr)(seg.id) && isFinite(seg.id)))[0]; + if (validData) { + return { + segtax: validData.ext?.segtax, + segclass: validData.ext?.segclass, + segments: validData.segment.map(seg => Number(seg.id)).join(',') + }; + } + return undefined; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('yieldlabBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldlabBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldliftBidAdapter"],{ + +/***/ "./modules/yieldliftBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/yieldliftBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const ENDPOINT_URL = 'https://x.yieldlift.com/pbjs'; +const DEFAULT_BID_TTL = 300; +const DEFAULT_CURRENCY = 'USD'; +const DEFAULT_NET_REVENUE = true; +const spec = { + code: 'yieldlift', + aliases: ['yl'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!bid.params.unitId && typeof bid.params.unitId === 'string' || !!bid.params.networkId && typeof bid.params.networkId === 'string' || !!bid.params.publisherId && typeof bid.params.publisherId === 'string'; + }, + buildRequests: function (validBidRequests, bidderRequest) { + if (!validBidRequests || !bidderRequest) { + return; + } + const publisherId = validBidRequests[0].params.publisherId; + const networkId = validBidRequests[0].params.networkId; + const impressions = validBidRequests.map(bidRequest => ({ + id: bidRequest.bidId, + banner: { + format: bidRequest.mediaTypes.banner.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1] + })) + }, + ext: { + exchange: { + unitId: bidRequest.params.unitId + } + } + })); + const openrtbRequest = { + id: bidderRequest.bidderRequestId, + imp: impressions, + site: { + domain: bidderRequest.refererInfo?.domain, + page: bidderRequest.refererInfo?.page, + ref: bidderRequest.refererInfo?.ref + }, + ext: { + exchange: { + publisherId: publisherId, + networkId: networkId + } + } + }; + + // adding schain object + if (validBidRequests[0].schain) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(openrtbRequest, 'source.ext.schain', validBidRequests[0].schain); + } + + // Attaching GDPR Consent Params + if (bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(openrtbRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(openrtbRequest, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(openrtbRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + + // EIDS + const eids = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(validBidRequests[0], 'userIdAsEids'); + if (Array.isArray(eids) && eids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.dset)(openrtbRequest, 'user.ext.eids', eids); + } + const payloadString = JSON.stringify(openrtbRequest); + return { + method: 'POST', + url: ENDPOINT_URL, + data: payloadString + }; + }, + interpretResponse: function (serverResponse) { + const bidResponses = []; + const response = (serverResponse || {}).body; + // response is always one seat (exchange) with (optional) bids for each impression + if (response && response.seatbid && response.seatbid.length === 1 && response.seatbid[0].bid && response.seatbid[0].bid.length) { + response.seatbid[0].bid.forEach(bid => { + bidResponses.push({ + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ad: bid.adm, + ttl: typeof bid.exp === 'number' ? bid.exp : DEFAULT_BID_TTL, + creativeId: bid.crid, + netRevenue: DEFAULT_NET_REVENUE, + currency: DEFAULT_CURRENCY, + meta: { + advertiserDomains: bid && bid.advertiserDomains ? bid.advertiserDomains : [] + } + }); + }); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('yieldlift.interpretResponse :: no valid responses to interpret'); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('yieldlift.getUserSyncs', 'syncOptions', syncOptions, 'serverResponses', serverResponses); + let syncs = []; + if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) { + return syncs; + } + serverResponses.forEach(resp => { + const userSync = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(resp, 'body.ext.usersync'); + if (userSync) { + let syncDetails = []; + Object.keys(userSync).forEach(key => { + const value = userSync[key]; + if (value.syncs && value.syncs.length) { + syncDetails = syncDetails.concat(value.syncs); + } + }); + syncDetails.forEach(syncDetails => { + syncs.push({ + type: syncDetails.type === 'iframe' ? 'iframe' : 'image', + url: syncDetails.url + }); + }); + if (!syncOptions.iframeEnabled) { + syncs = syncs.filter(s => s.type !== 'iframe'); + } + if (!syncOptions.pixelEnabled) { + syncs = syncs.filter(s => s.type !== 'image'); + } + } + }); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.logInfo)('yieldlift.getUserSyncs result=%o', syncs); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_5__.registerModule)('yieldliftBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldliftBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldloveBidAdapter"],{ + +/***/ "./modules/yieldloveBidAdapter.js": +/*!****************************************!*\ + !*** ./modules/yieldloveBidAdapter.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + +const ENDPOINT_URL = 'https://s2s.yieldlove-ad-serving.net/openrtb2/auction'; +const DEFAULT_BID_TTL = 300; /* 5 minutes */ +const DEFAULT_CURRENCY = 'EUR'; +const participatedBidders = []; +const spec = { + gvlid: 251, + code: 'yieldlove', + aliases: [], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + isBidRequestValid: function (bid) { + return !!(bid.params.pid && bid.params.rid); + }, + buildRequests: function (validBidRequests, bidderRequest) { + const anyValidBidRequest = validBidRequests[0]; + const impressions = validBidRequests.map(bidRequest => { + return { + ext: { + prebid: { + storedrequest: { + id: bidRequest.params.pid?.toString() + } + } + }, + banner: { + format: bidRequest.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1] + })) + }, + secure: 1, + id: bidRequest.bidId + }; + }); + const s2sRequest = { + device: { + ua: window.navigator.userAgent, + w: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions().innerWidth, + h: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.getWinDimensions().innerHeight + }, + site: { + ver: '1.9.0', + publisher: { + id: anyValidBidRequest.params.rid + }, + page: window.location.href, + domain: anyValidBidRequest.params.rid + }, + ext: { + prebid: { + targeting: {}, + cache: { + bids: {} + }, + storedrequest: { + id: anyValidBidRequest.params.rid + } + } + }, + user: { + ext: { + consent: bidderRequest.gdprConsent?.consentString + } + }, + id: _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.generateUUID(), + imp: impressions, + regs: { + ext: { + gdpr: 1 + } + } + }; + return { + method: 'POST', + url: ENDPOINT_URL, + data: s2sRequest, + options: { + contentType: 'text/plain', + withCredentials: true + } + }; + }, + interpretResponse: function (serverResponse) { + const bidResponses = []; + const seatBids = serverResponse.body?.seatbid || []; + seatBids.reduce((bids, cur) => { + if (cur.bid && cur.bid.length > 0) bids = bids.concat(cur.bid); + return bids; + }, []).forEach(bid => { + bidResponses.push({ + requestId: bid.impid, + cpm: bid.price, + width: bid.w, + height: bid.h, + ad: bid.adm, + ttl: DEFAULT_BID_TTL, + creativeId: bid.crid, + netRevenue: true, + currency: DEFAULT_CURRENCY + }); + }); + const bidders = serverResponse.body?.ext.responsetimemillis || {}; + Object.keys(bidders).forEach(bidder => { + if (!participatedBidders.includes(bidder)) participatedBidders.push(bidder); + }); + if (bidResponses.length === 0) { + _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logInfo('interpretResponse :: no bid'); + } + return bidResponses; + }, + getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) { + const syncs = []; + let gdprParams = ''; + gdprParams = `gdpr=${Number(gdprConsent?.gdprApplies)}&`; + gdprParams += `gdpr_consent=${gdprConsent?.consentString || ''}`; + let bidderParams = ''; + if (participatedBidders.length > 0) { + bidderParams = `bidders=${participatedBidders.join(',')}`; + } + syncs.push({ + type: 'iframe', + url: `https://cdn-a.yieldlove.com/load-cookie.html?endpoint=yieldlove&max_sync_count=100&${gdprParams}&${bidderParams}` + }); + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_2__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_3__.registerModule)('yieldloveBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldloveBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldmoBidAdapter"],{ + +/***/ "./modules/yieldmoBidAdapter.js": +/*!**************************************!*\ + !*** ./modules/yieldmoBidAdapter.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +const BIDDER_CODE = 'yieldmo'; +const GVLID = 173; +const CURRENCY = 'USD'; +const TIME_TO_LIVE = 300; +const NET_REVENUE = true; +const PB_COOKIE_ASSIST_SYNC_ENDPOINT = `https://ads.yieldmo.com/pbcas`; +const BANNER_PATH = '/exchange/prebid'; +const VIDEO_PATH = '/exchange/prebidvideo'; +const STAGE_DOMAIN = 'https://ads-stg.yieldmo.com'; +const PROD_DOMAIN = 'https://ads.yieldmo.com'; +const OUTSTREAM_VIDEO_PLAYER_URL = 'https://prebid-outstream.yieldmo.com/bundle.js'; +const OPENRTB_VIDEO_BIDPARAMS = ['mimes', 'startdelay', 'placement', 'plcmt', 'skipafter', 'protocols', 'api', 'playbackmethod', 'maxduration', 'minduration', 'pos', 'skip', 'skippable']; +const OPENRTB_VIDEO_SITEPARAMS = ['name', 'domain', 'cat', 'keywords']; +const LOCAL_WINDOW = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)(); +const DEFAULT_PLAYBACK_METHOD = 2; +const DEFAULT_START_DELAY = 0; +const VAST_TIMEOUT = 15000; +const MAX_BANNER_REQUEST_URL_LENGTH = 8000; +const BANNER_REQUEST_PROPERTIES_TO_REDUCE = ['description', 'title', 'pr', 'page_url']; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO], + gvlid: GVLID, + /** + * Determines whether or not the given bid request is valid. + * @param {object} bid bid to validate + * @return {boolean} true if valid, otherwise false + */ + isBidRequestValid: function (bid) { + return !!(bid && bid.adUnitCode && bid.bidId && (hasBannerMediaType(bid) || hasVideoMediaType(bid)) && validateVideoParams(bid)); + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server. + * @param {BidderRequest} bidderRequest bidder request object. + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (bidRequests, bidderRequest) { + const stage = isStage(bidderRequest); + const bannerUrl = getAdserverUrl(BANNER_PATH, stage); + const videoUrl = getAdserverUrl(VIDEO_PATH, stage); + const bannerBidRequests = bidRequests.filter(request => hasBannerMediaType(request)); + const videoBidRequests = bidRequests.filter(request => hasVideoMediaType(request)); + let serverRequests = []; + const eids = getEids(bidRequests[0]) || []; + const topicsData = getTopics(bidderRequest); + const cdep = getCdep(bidderRequest); + if (bannerBidRequests.length > 0) { + let serverRequest = { + pbav: "9.45.0-pre", + p: [], + // TODO: is 'page' the right value here? + page_url: bidderRequest.refererInfo.page, + bust: new Date().getTime().toString(), + dnt: getDNT(), + description: getPageDescription(), + tmax: bidderRequest.timeout || 400, + userConsent: JSON.stringify({ + // case of undefined, stringify will remove param + gdprApplies: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gdprConsent.gdprApplies') || '', + cmp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gdprConsent.consentString') || '', + gpp: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gppConsent.gppString') || '', + gpp_sid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gppConsent.applicableSections') || [] + }), + us_privacy: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'uspConsent') || '' + }; + if (topicsData) { + serverRequest.topics = JSON.stringify(topicsData); + } + const gpc = getGPCSignal(bidderRequest); + if (gpc) { + serverRequest.gpc = gpc; + } + if (cdep) { + serverRequest.cdep = cdep; + } + if (canAccessTopWindow()) { + serverRequest.pr = LOCAL_WINDOW.document && LOCAL_WINDOW.document.referrer || ''; + serverRequest.scrd = LOCAL_WINDOW.devicePixelRatio || 0; + serverRequest.title = LOCAL_WINDOW.document.title || ''; + serverRequest.w = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().innerWidth; + serverRequest.h = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWinDimensions)().innerHeight; + } + const mtp = window.navigator.maxTouchPoints; + if (mtp) { + serverRequest.mtp = mtp; + } + bannerBidRequests.forEach(request => { + serverRequest.p.push(addPlacement(request)); + const pubcid = getId(request, 'pubcid'); + if (pubcid) { + serverRequest.pubcid = pubcid; + } else if (request.crumbs && request.crumbs.pubcid) { + serverRequest.pubcid = request.crumbs.pubcid; + } + const tdid = getId(request, 'tdid'); + if (tdid) { + serverRequest.tdid = tdid; + } + const criteoId = getId(request, 'criteoId'); + if (criteoId) { + serverRequest.cri_prebid = criteoId; + } + if (request.schain) { + serverRequest.schain = JSON.stringify(request.schain); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'params.lr_env')) { + serverRequest.ats_envelope = request.params.lr_env; + } + }); + serverRequest.p = '[' + serverRequest.p.toString() + ']'; + if (eids.length) { + serverRequest.eids = JSON.stringify(eids); + } + ; + // check if url exceeded max length + const fullUrl = `${bannerUrl}?${(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryStringParameters)(serverRequest)}`; + let extraCharacters = fullUrl.length - MAX_BANNER_REQUEST_URL_LENGTH; + if (extraCharacters > 0) { + for (let i = 0; i < BANNER_REQUEST_PROPERTIES_TO_REDUCE.length; i++) { + extraCharacters = shortcutProperty(extraCharacters, serverRequest, BANNER_REQUEST_PROPERTIES_TO_REDUCE[i]); + if (extraCharacters <= 0) { + break; + } + } + } + serverRequests.push({ + method: 'GET', + url: bannerUrl, + data: serverRequest + }); + } + if (videoBidRequests.length > 0) { + const serverRequest = openRtbRequest(videoBidRequests, bidderRequest); + if (topicsData) { + serverRequest.topics = topicsData; + } + if (eids.length) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(serverRequest, 'user.ext.eids', eids); + } + ; + serverRequests.push({ + method: 'POST', + url: videoUrl, + data: serverRequest + }); + } + return serverRequests; + }, + /** + * Makes Yieldmo Ad Server response compatible to Prebid specs + * @param {ServerResponse} serverResponse successful response from Ad Server + * @param {ServerRequest} bidRequest + * @return {Bid[]} an array of bids + */ + interpretResponse: function (serverResponse, bidRequest) { + let bids = []; + const data = serverResponse.body; + if (data.length > 0) { + data.forEach(response => { + if (response.cpm > 0) { + bids.push(createNewBannerBid(response)); + } + }); + } + if (data.seatbid) { + const seatbids = data.seatbid.reduce((acc, seatBid) => acc.concat(seatBid.bid), []); + seatbids.forEach(bid => bids.push(createNewVideoBid(bid, bidRequest))); + } + return bids; + }, + getUserSyncs: function (syncOptions, serverResponses) { + let gdprConsent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let uspConsent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + const syncs = []; + const gdprFlag = `&gdpr=${gdprConsent.gdprApplies ? 1 : 0}`; + const gdprString = `&gdpr_consent=${encodeURIComponent(gdprConsent.consentString || '')}`; + const usPrivacy = `us_privacy=${encodeURIComponent(uspConsent)}`; + const pbCookieAssistSyncUrl = `${PB_COOKIE_ASSIST_SYNC_ENDPOINT}?${usPrivacy}${gdprFlag}${gdprString}`; + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: pbCookieAssistSyncUrl + '&type=iframe' + }); + } else if (syncOptions.pixelEnabled) { + syncs.push({ + type: 'image', + url: pbCookieAssistSyncUrl + '&type=image' + }); + } + return syncs; + } +}; +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_4__.registerBidder)(spec); + +/*************************************** + * Helper Functions + ***************************************/ + +/** + * @param {BidRequest} bidRequest bid request + */ +function hasBannerMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner'); +} + +/** + * @param {BidRequest} bidRequest bid request + */ +function hasVideoMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video'); +} + +/** + * Adds placement information to array + * @param request bid request + */ +function addPlacement(request) { + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'ortb2Imp.ext.data.pbadslot'); + const tagid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'ortb2Imp.ext.tagid'); + const divid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'ortb2Imp.ext.divid'); + const placementInfo = { + placement_id: request.adUnitCode, + callback_id: request.bidId, + sizes: request.mediaTypes.banner.sizes + }; + if (request.params) { + if (request.params.placementId) { + placementInfo.ym_placement_id = request.params.placementId; + } + const bidfloor = getBidFloor(request, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER); + if (bidfloor) { + placementInfo.bidFloor = bidfloor; + } + } + if (gpid) { + placementInfo.gpid = gpid; + } + if (tagid) { + placementInfo.tagid = tagid; + } + if (divid) { + placementInfo.divid = divid; + } + + // get the transaction id for the banner bid. + const transactionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'ortb2Imp.ext.tid'); + if (transactionId) { + placementInfo.tid = transactionId; + } + if (request.auctionId) { + // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781 + placementInfo.auctionId = request.auctionId; + } + return JSON.stringify(placementInfo); +} + +/** + * creates a new banner bid with response information + * @param response server response + */ +function createNewBannerBid(response) { + return { + dealId: response.publisherDealId, + requestId: response['callback_id'], + cpm: response.cpm, + width: response.width, + height: response.height, + creativeId: response.creative_id, + currency: CURRENCY, + netRevenue: NET_REVENUE, + ttl: TIME_TO_LIVE, + ad: response.ad, + meta: { + advertiserDomains: response.adomain || [], + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.BANNER + } + }; +} + +/** + * creates a new video bid with response information + * @param response openRTB server response + * @param bidRequest server request + */ +function createNewVideoBid(response, bidRequest) { + const imp = (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.find)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'data.imp') || [], imp => imp.id === response.impid); + let result = { + dealId: response.dealid, + requestId: imp.id, + cpm: response.price, + width: imp.video.w, + height: imp.video.h, + creativeId: response.crid || response.adid, + currency: CURRENCY, + netRevenue: NET_REVENUE, + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO, + ttl: TIME_TO_LIVE, + vastXml: response.adm, + meta: { + advertiserDomains: response.adomain || [], + mediaType: _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO + } + }; + if (imp.video.plcmt && imp.video.plcmt !== 1) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_6__.Renderer.install({ + url: OUTSTREAM_VIDEO_PLAYER_URL, + config: { + width: result.width, + height: result.height, + vastTimeout: VAST_TIMEOUT, + maxAllowedVastTagRedirects: 5, + allowVpaid: true, + autoPlay: true, + preload: true, + mute: true + }, + id: imp.tagid, + loaded: false + }); + renderer.setRender(function (bid) { + bid.renderer.push(() => { + const { + id, + config + } = bid.renderer; + window.YMoutstreamPlayer(bid, id, config); + }); + }); + result.renderer = renderer; + } + return result; +} + +/** + * Detects whether dnt is true + * @returns true if user enabled dnt + */ +function getDNT() { + return window.doNotTrack === '1' || window.navigator.doNotTrack === '1' || false; +} + +/** + * get page description + */ +function getPageDescription() { + if (document.querySelector('meta[name="description"]')) { + return document.querySelector('meta[name="description"]').getAttribute('content') || ''; // Value of the description metadata from the publisher's page. + } else { + return ''; + } +} + +/** + * Gets an id from the userId object if it exists + * @param {*} request + * @param {*} idType + * @returns an id if there is one, or undefined + */ +function getId(request, idType) { + return typeof (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'userId') === 'object' ? request.userId[idType] : undefined; +} + +/** + * @param {BidRequest[]} bidRequests bid request object + * @param {BidderRequest} bidderRequest bidder request object + * @return Object OpenRTB request object + */ +function openRtbRequest(bidRequests, bidderRequest) { + const schain = bidRequests[0].schain; + let openRtbRequest = { + id: bidRequests[0].bidderRequestId, + tmax: bidderRequest.timeout || 400, + at: 1, + imp: bidRequests.map(bidRequest => openRtbImpression(bidRequest)), + site: openRtbSite(bidRequests[0], bidderRequest), + device: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.device'), + badv: bidRequests[0].params.badv || [], + bcat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'bcat') || bidRequests[0].params.bcat || [], + ext: { + prebid: "9.45.0-pre" + }, + ats_envelope: bidRequests[0].params.lr_env + }; + if (schain) { + openRtbRequest.schain = schain; + } + const gpc = getGPCSignal(bidderRequest); + if (gpc) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbRequest, 'regs.ext.gpc', gpc); + } + if (bidRequests[0].auctionId) { + openRtbRequest.auctionId = bidRequests[0].auctionId; + } + populateOpenRtbGdpr(openRtbRequest, bidderRequest); + return openRtbRequest; +} +function getGPCSignal(bidderRequest) { + const gpc = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.regs.ext.gpc'); + return gpc; +} +function getCdep(bidderRequest) { + const cdep = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.device.ext.cdep') || null; + return cdep; +} +function getTopics(bidderRequest) { + const userData = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'ortb2.user.data') || []; + const topicsData = userData.filter(dataObj => { + const segtax = dataObj.ext?.segtax; + return segtax >= 600 && segtax <= 609; + })[0]; + if (topicsData) { + let topicsObject = { + taxonomy: topicsData.ext.segtax, + classifier: topicsData.ext.segclass, + // topics needs to be array of numbers + topics: Object.values(topicsData.segment).map(i => Number(i)) + }; + return topicsObject; + } + return null; +} + +/** + * @param {BidRequest} bidRequest bidder request object. + * @return Object OpenRTB's 'imp' (impression) object + */ +function openRtbImpression(bidRequest) { + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.gpid') || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.data.pbadslot'); + const tagid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.tagid'); + const divid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.divid'); + const size = extractPlayerSize(bidRequest); + const imp = { + id: bidRequest.bidId, + tagid: bidRequest.adUnitCode, + bidfloor: getBidFloor(bidRequest, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_1__.VIDEO), + ext: { + placement_id: bidRequest.params.placementId, + tid: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'ortb2Imp.ext.tid') + }, + video: { + w: size[0], + h: size[1], + linearity: 1 + } + }; + const mediaTypesParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video', {}); + Object.keys(mediaTypesParams).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(OPENRTB_VIDEO_BIDPARAMS, param)).forEach(param => imp.video[param] = mediaTypesParams[param]); + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.video', {}); + Object.keys(videoParams).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(OPENRTB_VIDEO_BIDPARAMS, param)).forEach(param => imp.video[param] = videoParams[param]); + if (imp.video.skippable) { + imp.video.skip = 1; + delete imp.video.skippable; + } + if (imp.video.plcmt !== 1 || imp.video.placement !== 1) { + imp.video.startdelay = DEFAULT_START_DELAY; + imp.video.playbackmethod = [DEFAULT_PLAYBACK_METHOD]; + } + if (gpid) { + imp.ext.gpid = gpid; + } + if (tagid) { + imp.ext.tagid = tagid; + } + if (divid) { + imp.ext.divid = divid; + } + return imp; +} +function getBidFloor(bidRequest, mediaType) { + let floorInfo = {}; + if (typeof bidRequest.getFloor === 'function') { + floorInfo = bidRequest.getFloor({ + currency: CURRENCY, + mediaType, + size: '*' + }); + } + return floorInfo.floor || bidRequest.params.bidfloor || bidRequest.params.bidFloor || 0; +} + +/** + * @param {BidRequest} bidRequest bidder request object. + * @return [number, number] || null Player's width and height, or undefined otherwise. + */ +function extractPlayerSize(bidRequest) { + const sizeArr = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video.playerSize'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(sizeArr, 2)) { + return sizeArr; + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(sizeArr) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(sizeArr[0], 2)) { + return sizeArr[0]; + } + return null; +} + +/** + * @param {BidRequest} bidRequest bid request object + * @param {BidderRequest} bidderRequest bidder request object + * @return Object OpenRTB's 'site' object + */ +function openRtbSite(bidRequest, bidderRequest) { + let result = {}; + const loc = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseUrl)((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'refererInfo.page')); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(loc)) { + result.page = `${loc.protocol}://${loc.hostname}${loc.pathname}`; + } + if (bidderRequest.refererInfo?.ref) { + result.ref = bidderRequest.refererInfo.ref; + } + const keywords = document.getElementsByTagName('meta')['keywords']; + if (keywords && keywords.content) { + result.keywords = keywords.content; + } + const siteParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'params.site'); + if (siteParams) { + Object.keys(siteParams).filter(param => (0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_5__.includes)(OPENRTB_VIDEO_SITEPARAMS, param)).forEach(param => result[param] = siteParams[param]); + } + return result; +} + +/** + * Updates openRtbRequest with GDPR info from bidderRequest, if present. + * @param {Object} openRtbRequest OpenRTB's request to update. + * @param {BidderRequest} bidderRequest bidder request object. + */ +function populateOpenRtbGdpr(openRtbRequest, bidderRequest) { + const gdpr = bidderRequest.gdprConsent; + const gpp = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gppConsent.gppString'); + const gppsid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'gppConsent.applicableSections'); + if (gpp) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbRequest, 'regs.ext.gpp', gpp); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbRequest, 'regs.ext.gdpr', gdpr && gdpr.gdprApplies ? 1 : 0); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbRequest, 'user.ext.consent', gdpr && gdpr.consentString ? gdpr.consentString : ''); + } + if (gppsid && gppsid.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbRequest, 'regs.ext.gpp_sid', gppsid); + } + const uspConsent = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest, 'uspConsent'); + if (!gpp && uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(openRtbRequest, 'regs.ext.us_privacy', uspConsent); + } +} + +/** + * Determines whether or not the given video bid request is valid. If it's not a video bid, returns true. + * @param {object} bid bid to validate + * @return {boolean} true if valid, otherwise false + */ +function validateVideoParams(bid) { + if (!hasVideoMediaType(bid)) { + return true; + } + const paramRequired = (paramStr, value, conditionStr) => { + let error = `"${paramStr}" is required`; + if (conditionStr) { + error += ' when ' + conditionStr; + } + throw new Error(error); + }; + const paramInvalid = (paramStr, value, expectedStr) => { + expectedStr = expectedStr ? ', expected: ' + expectedStr : ''; + value = JSON.stringify(value); + throw new Error(`"${paramStr}"=${value} is invalid${expectedStr}`); + }; + const isDefined = val => typeof val !== 'undefined'; + const validate = (fieldPath, validateCb, errorCb, errorCbParam) => { + if (fieldPath.indexOf('video') === 0) { + const valueFieldPath = 'params.' + fieldPath; + const mediaFieldPath = 'mediaTypes.' + fieldPath; + const valueParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, valueFieldPath); + const mediaTypesParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, mediaFieldPath); + const hasValidValueParams = validateCb(valueParams); + const hasValidMediaTypesParams = validateCb(mediaTypesParams); + if (hasValidValueParams) return valueParams;else if (hasValidMediaTypesParams) return hasValidMediaTypesParams;else { + if (!hasValidValueParams) errorCb(valueFieldPath, valueParams, errorCbParam);else if (!hasValidMediaTypesParams) errorCb(mediaFieldPath, mediaTypesParams, errorCbParam); + } + return valueParams || mediaTypesParams; + } else { + const value = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bid, fieldPath); + if (!validateCb(value)) { + errorCb(fieldPath, value, errorCbParam); + } + return value; + } + }; + try { + validate('video.context', val => !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(val), paramRequired); + validate('params.placementId', val => !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(val), paramRequired); + validate('video.playerSize', val => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(val, 2) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(val) && val.every(v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(v, 2)), paramInvalid, 'array of 2 integers, ex: [640,480] or [[640,480]]'); + validate('video.mimes', val => isDefined(val), paramRequired); + validate('video.mimes', val => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(val) && val.every(v => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isStr)(v)), paramInvalid, 'array of strings, ex: ["video/mp4"]'); + validate('video.protocols', val => isDefined(val), paramRequired); + validate('video.api', val => isDefined(val), paramRequired); + // PS-6597 - Allow video.api to be any number greater than 0 + validate('video.api', val => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(val) && val.every(v => v >= 1), paramInvalid, 'array of numbers, ex: [2,3]'); + validate('video.playbackmethod', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArrayOfNums)(val), paramInvalid, 'array of integers, ex: [2,6]'); + validate('video.maxduration', val => isDefined(val), paramRequired); + validate('video.maxduration', val => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isInteger)(val), paramInvalid); + validate('video.minduration', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(val), paramInvalid); + validate('video.skippable', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBoolean)(val), paramInvalid); + validate('video.skipafter', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(val), paramInvalid); + validate('video.pos', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isNumber)(val), paramInvalid); + validate('params.badv', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(val), paramInvalid, 'array of strings, ex: ["ford.com","pepsi.com"]'); + validate('params.bcat', val => !isDefined(val) || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isArray)(val), paramInvalid, 'array of strings, ex: ["IAB1-5","IAB1-6"]'); + return true; + } catch (e) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.logError)(e.message); + return false; + } +} + +/** + * Shortcut object property and check if required characters count was deleted + * + * @param {number} extraCharacters count of characters to remove + * @param {object} target object on which string property length should be reduced + * @param {string} propertyName name of property to reduce + * @return {number} 0 if required characters count was removed otherwise count of how many left + */ +function shortcutProperty(extraCharacters, target, propertyName) { + if (target[propertyName].length > extraCharacters) { + target[propertyName] = target[propertyName].substring(0, target[propertyName].length - extraCharacters); + return 0; + } + const charactersLeft = extraCharacters - target[propertyName].length; + target[propertyName] = ''; + return charactersLeft; +} + +/** + * Creates and returnes eids arr using createEidsArray from './userId/eids.js' module; + * @param {Object} bidRequest OpenRTB's request as a cource of userId. + * @return array of eids objects + */ +function getEids(bidRequest) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'userIdAsEids')) { + return bidRequest.userIdAsEids || []; + } +} +; + +/** + * Check if top window can be accessed + * + * @return {boolean} true if can access top window otherwise false + */ +function canAccessTopWindow() { + try { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.getWindowTop)().location.href) { + return true; + } + } catch (error) { + return false; + } +} +function isStage(bidderRequest) { + return !!bidderRequest.refererInfo?.referer?.includes('pb_force_a'); +} +function getAdserverUrl(path, stage) { + const domain = stage ? STAGE_DOMAIN : PROD_DOMAIN; + return `${domain}${path}`; +} +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('yieldmoBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldmoBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldmoSyntheticInventoryModule"],{ + +/***/ "./modules/yieldmoSyntheticInventoryModule.js": +/*!****************************************************!*\ + !*** ./modules/yieldmoSyntheticInventoryModule.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports MODULE_NAME, init, validateConfig */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); + + + +const MODULE_NAME = 'Yieldmo Synthetic Inventory Module'; +function init(config) { + validateConfig(config); + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_0__.isGptPubadsDefined)()) { + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + } + const googletag = window.googletag; + const containerName = 'ym_sim_container_' + config.placementId; + googletag.cmd.push(() => { + if (window.document.body) { + googletagCmd(config, containerName, googletag); + } else { + window.document.addEventListener('DOMContentLoaded', () => googletagCmd(config, containerName, googletag)); + } + }); +} +function validateConfig(config) { + if (!('placementId' in config)) { + throw new Error(`${MODULE_NAME}: placementId required`); + } + if (!('adUnitPath' in config)) { + throw new Error(`${MODULE_NAME}: adUnitPath required`); + } +} +function googletagCmd(config, containerName, googletag) { + const gamContainer = window.document.createElement('div'); + gamContainer.id = containerName; + window.document.body.appendChild(gamContainer); + googletag.defineSlot(config.adUnitPath, [1, 1], containerName).addService(googletag.pubads()).setTargeting('ym_sim_p_id', config.placementId); + googletag.enableServices(); + googletag.display(containerName); +} +_src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('yieldmo_synthetic_inventory', config => init(config.yieldmo_synthetic_inventory)); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_2__.registerModule)('yieldmoSyntheticInventoryModule'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldmoSyntheticInventoryModule.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldoneAnalyticsAdapter"],{ + +/***/ "./modules/yieldoneAnalyticsAdapter.js": +/*!*********************************************!*\ + !*** ./modules/yieldoneAnalyticsAdapter.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_targeting_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/targeting.js */ "./src/targeting.js"); +/* harmony import */ var _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/auctionManager.js */ "./src/auctionManager.js"); + + + + + + + + +const ANALYTICS_CODE = 'yieldone'; +const analyticsType = 'endpoint'; +// const VERSION = '1.0.0'; +const defaultUrl = 'https://pool.tsukiji.iponweb.net/hba'; +const requestedBidders = {}; +const requestedBids = {}; +const referrers = {}; +const ignoredEvents = {}; +ignoredEvents[_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_ADJUSTMENT] = true; +ignoredEvents[_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BIDDER_DONE] = true; +ignoredEvents[_src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_END] = true; +let currentAuctionId = ''; +let url = defaultUrl; +let pubId = ''; +function makeAdUnitNameMap() { + if (window.googletag && window.googletag.pubads) { + // eslint-disable-next-line no-undef + const p = googletag.pubads(); + if (p && p.getSlots) { + const slots = p.getSlots(); + if (slots && slots.length) { + const map = {}; + slots.forEach(slot => { + const id = slot.getSlotElementId(); + const name = (slot.getAdUnitPath() || '').split('/').pop(); + map[id] = name; + }); + return map; + } + } + } +} +function addAdUnitNameForArray(ar, map) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(ar)) { + ar.forEach(it => { + addAdUnitName(it, map); + }); + } +} +function addAdUnitName(params, map) { + if (params.adUnitCode && map[params.adUnitCode]) { + params.adUnitName = map[params.adUnitCode]; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params.adUnits)) { + params.adUnits.forEach(adUnit => { + if (adUnit.code && map[adUnit.code]) { + adUnit.name = map[adUnit.code]; + } + }); + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(params.adUnitCodes)) { + params.adUnitNames = params.adUnitCodes.map(code => map[code]); + } + ['bids', 'bidderRequests', 'bidsReceived', 'noBids'].forEach(it => { + addAdUnitNameForArray(params[it], map); + }); +} +const yieldoneAnalytics = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_2__["default"])({ + analyticsType +}), { + getUrl() { + return url; + }, + track(_ref) { + let { + eventType, + args = {} + } = _ref; + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_REQUESTED) { + const reqBidderId = `${args.bidderCode}_${args.auctionId}`; + requestedBidders[reqBidderId] = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.deepClone)(args); + requestedBidders[reqBidderId].bids = []; + args.bids.forEach(bid => { + requestedBids[`${bid.bidId}_${bid.auctionId}`] = bid; + }); + } + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_TIMEOUT && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(args)) { + const eventsStorage = yieldoneAnalytics.eventsStorage; + const reqBidders = {}; + args.forEach(bid => { + const reqBidId = `${bid.bidId}_${bid.auctionId}`; + const reqBidderId = `${bid.bidder}_${bid.auctionId}`; + if (!eventsStorage[bid.auctionId]) eventsStorage[bid.auctionId] = { + events: [] + }; + if ((requestedBidders[reqBidderId] || reqBidders[bid.bidder]) && requestedBids[reqBidId]) { + if (!reqBidders[bid.bidder]) { + reqBidders[bid.bidder] = requestedBidders[reqBidderId]; + eventsStorage[bid.auctionId].events.push({ + eventType, + params: reqBidders[bid.bidder] + }); + delete requestedBidders[reqBidderId]; + } + reqBidders[bid.bidder].bids.push(requestedBids[reqBidId]); + delete requestedBids[reqBidId]; + } + }); + } else { + currentAuctionId = args.auctionId || currentAuctionId; + if (currentAuctionId) { + const eventsStorage = yieldoneAnalytics.eventsStorage; + if (!eventsStorage[currentAuctionId]) eventsStorage[currentAuctionId] = { + events: [] + }; + // TODO: is 'page' the right value here? + const referrer = args.refererInfo && args.refererInfo.page; + if (referrer && referrers[currentAuctionId] !== referrer) { + referrers[currentAuctionId] = referrer; + } + const params = Object.assign({}, args); + delete params.ad; + if (params.bidsReceived) { + params.bidsReceived = params.bidsReceived.map(bid => { + const res = Object.assign({}, bid); + delete res.ad; + return res; + }); + } + if (!ignoredEvents[eventType]) { + eventsStorage[currentAuctionId].events.push({ + eventType, + params + }); + } + if (eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.AUCTION_END || eventType === _src_constants_js__WEBPACK_IMPORTED_MODULE_0__.EVENTS.BID_WON) { + params.adServerTargeting = _src_targeting_js__WEBPACK_IMPORTED_MODULE_3__.targeting.getAllTargeting(_src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.getAdUnitCodes(), _src_auctionManager_js__WEBPACK_IMPORTED_MODULE_4__.auctionManager.getBidsReceived()); + if (yieldoneAnalytics.eventsStorage[currentAuctionId] && yieldoneAnalytics.eventsStorage[currentAuctionId].events.length) { + yieldoneAnalytics.eventsStorage[currentAuctionId].page = { + url: referrers[currentAuctionId] + }; + yieldoneAnalytics.eventsStorage[currentAuctionId].pubId = pubId; + yieldoneAnalytics.eventsStorage[currentAuctionId].wrapper_version = "9.45.0-pre"; + const adUnitNameMap = makeAdUnitNameMap(); + if (adUnitNameMap) { + yieldoneAnalytics.eventsStorage[currentAuctionId].events.forEach(it => { + addAdUnitName(it.params, adUnitNameMap); + }); + } + } + yieldoneAnalytics.sendStat(yieldoneAnalytics.eventsStorage[currentAuctionId], currentAuctionId); + } + } + } + }, + sendStat(data, auctionId) { + if (!data || !data.events || !data.events.length) return; + delete yieldoneAnalytics.eventsStorage[auctionId]; + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_5__.ajax)(url, { + success: function () {}, + error: function () {} + }, JSON.stringify(data), { + method: 'POST' + }); + } +}); +yieldoneAnalytics.eventsStorage = {}; + +// save the base class function +yieldoneAnalytics.originEnableAnalytics = yieldoneAnalytics.enableAnalytics; + +// override enableAnalytics so we can get access to the config passed in from the page +yieldoneAnalytics.enableAnalytics = function (config) { + const options = config && config.options; + if (options) { + if (typeof options.url === 'string') { + url = options.url; + } + if (options.pubId) { + pubId = options.pubId.toString(); + } + } + yieldoneAnalytics.originEnableAnalytics(config); // call the base class function +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: yieldoneAnalytics, + code: ANALYTICS_CODE +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (yieldoneAnalytics); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('yieldoneAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldoneAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yieldoneBidAdapter"],{ + +/***/ "./modules/yieldoneBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/yieldoneBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/Renderer.js */ "./src/Renderer.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/userAgentUtils/index.js */ "./libraries/userAgentUtils/index.js"); +/* harmony import */ var _libraries_userAgentUtils_userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/userAgentUtils/userAgentTypes.enums.js */ "./libraries/userAgentUtils/userAgentTypes.enums.js"); + + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory').BidderSpec} BidderSpec + * @typedef {import('../src/adapters/bidderFactory').ServerRequest} ServerRequest + * @typedef {import('../src/adapters/bidderFactory').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory').UserSync} UserSync + * @typedef {import('../src/auction').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'yieldone'; +const ENDPOINT_URL = 'https://y.one.impact-ad.jp/h_bid'; +const USER_SYNC_URL = 'https://y.one.impact-ad.jp/push_sync'; +const VIDEO_PLAYER_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/dac-video-prebid.min.js'; +const CMER_PLAYER_URL = 'https://an.cmertv.com/hb/renderer/cmertv-video-yone-prebid.min.js'; +const VIEWABLE_PERCENTAGE_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstview/js/prebid-adformat-config.js'; +const DEFAULT_VIDEO_SIZE = { + w: 640, + h: 360 +}; + +/** @type {BidderSpec} */ +const spec = { + code: BIDDER_CODE, + aliases: ['y1'], + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * @param {BidRequest} bid The bid params to validate. + * @returns {boolean} True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + return !!bid.params.placementId; + }, + /** + * Make a server request from the list of BidRequests. + * @param {Bid[]} validBidRequests - An array of bids. + * @param {BidderRequest} bidderRequest - bidder request object. + * @returns {ServerRequest|ServerRequest[]} ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + return validBidRequests.map(bidRequest => { + const params = bidRequest.params; + const placementId = params.placementId; + const cb = Math.floor(Math.random() * 99999999999); + // TODO: is 'page' the right value here? + const referrer = bidderRequest.refererInfo.page; + const bidId = bidRequest.bidId; + const transactionId = bidRequest.ortb2Imp?.ext?.tid; + const unitCode = bidRequest.adUnitCode; + const timeout = bidderRequest.timeout; + const language = window.navigator.language; + const screenSize = window.screen.width + 'x' + window.screen.height; + const payload = { + v: 'hb1', + p: placementId, + cb: cb, + r: referrer, + uid: bidId, + tid: transactionId, + uc: unitCode, + tmax: timeout, + t: 'i', + language: language, + screen_size: screenSize + }; + const mediaType = getMediaType(bidRequest); + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + payload.sz = getBannerSizes(bidRequest); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + const videoSize = getVideoSize(bidRequest); + payload.w = videoSize.w; + payload.h = videoSize.h; + break; + default: + break; + } + + // LiveRampID + const idlEnv = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userId.idl_env'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(idlEnv) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(idlEnv)) { + payload.lr_env = idlEnv; + } + + // IMID + const imuid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userId.imuid'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(imuid) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(imuid)) { + payload.imuid = imuid; + } + + // DACID + const fuuid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userId.dacId.fuuid'); + const dacid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userId.dacId.id'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(fuuid) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(fuuid)) { + payload.fuuid = fuuid; + } + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(dacid) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(dacid)) { + payload.dac_id = dacid; + } + + // ID5 + const id5id = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userId.id5id.uid'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(id5id) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(id5id)) { + payload.id5Id = id5id; + } + + // UID2.0 + const uid2 = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'userId.uid2.id'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(uid2) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(uid2)) { + payload.uid2id = uid2; + } + + // GPID + const gpid = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'ortb2Imp.ext.gpid'); + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(gpid) && !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(gpid)) { + payload.gpid = gpid; + } + return { + method: 'GET', + url: ENDPOINT_URL, + data: payload + }; + }); + }, + /** + * Unpack the response from the server into a list of bids. + * @param {ServerResponse} serverResponse - A successful response from the server. + * @param {BidRequest} bidRequest + * @returns {Bid[]} - An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + const bidResponses = []; + const response = serverResponse.body; + const crid = response.crid || 0; + const width = response.width || 0; + const height = response.height || 0; + const cpm = response.cpm * 1000 || 0; + if (width !== 0 && height !== 0 && cpm !== 0 && crid !== 0) { + const dealId = response.dealId || ''; + const renderId = response.renderid || ''; + const currency = response.currency || 'JPY'; + const netRevenue = response.netRevenue === undefined ? true : response.netRevenue; + const referrer = bidRequest.data.r || ''; + const bidResponse = { + requestId: response.uid, + cpm: cpm, + width: response.width, + height: response.height, + creativeId: crid, + dealId: dealId, + currency: currency, + netRevenue: netRevenue, + ttl: 60, + referrer: referrer, + meta: { + advertiserDomains: response.adomain ? response.adomain : [] + } + }; + if (response.adTag && renderId === 'ViewableRendering') { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + let viewableScript = ` + + + `; + bidResponse.ad = viewableScript; + } else if (response.adTag) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + bidResponse.ad = response.adTag; + } else if (response.adm) { + bidResponse.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + bidResponse.vastXml = response.adm; + if (renderId === 'cmer') { + bidResponse.renderer = newCmerRenderer(response); + } else { + bidResponse.renderer = newRenderer(response); + } + } + bidResponses.push(bidResponse); + } + return bidResponses; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @param {Object} gdprConsent Is the GDPR Consent object wrapping gdprApplies {boolean} and consentString {string} attributes. + * @returns {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, gdprConsent) { + if (syncOptions.iframeEnabled && !skipSync(gdprConsent)) { + return [{ + type: 'iframe', + url: USER_SYNC_URL + }]; + } + } +}; + +/** + * NOTE: server side does not yet support multiple formats. + * @param {Object} bidRequest - + * @param {boolean} [enabledOldFormat = true] - default: `true`. + * @returns {string|null} - `"banner"` or `"video"` or `null`. + */ +function getMediaType(bidRequest) { + let enabledOldFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let hasBannerType = Boolean((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner')); + let hasVideoType = Boolean((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video')); + if (enabledOldFormat) { + hasBannerType = hasBannerType || bidRequest.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER || (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(bidRequest.mediaTypes) && (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(bidRequest.mediaType); + hasVideoType = hasVideoType || bidRequest.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } + if (hasBannerType && hasVideoType) { + const playerParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.playerParams'); + if (playerParams) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } else { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + } else if (hasBannerType) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } else if (hasVideoType) { + return _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO; + } + return null; +} + +/** + * NOTE: + * If `mediaTypes.banner` exists, then `mediaTypes.banner.sizes` must also exist. + * The reason for this is that Prebid.js will perform the verification and + * if `mediaTypes.banner.sizes` is inappropriate, it will delete the entire `mediaTypes.banner`. + * @param {Object} bidRequest - + * @param {Object} bidRequest.banner - + * @param {Array} bidRequest.banner.sizes - + * @param {boolean} [enabledOldFormat = true] - default: `true`. + * @returns {string} - strings like `"300x250"` or `"300x250,728x90"`. + */ +function getBannerSizes(bidRequest) { + let enabledOldFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let sizes = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.banner.sizes'); + if (enabledOldFormat) { + sizes = sizes || bidRequest.sizes; + } + return (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(sizes).join(','); +} + +/** + * @param {Object} bidRequest - + * @param {boolean} [enabledOldFormat = true] - default: `true`. + * @param {boolean} [enabled1x1 = true] - default: `true`. + * @returns {{w: number, h: number}} - + */ +function getVideoSize(bidRequest) { + let enabledOldFormat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let enabled1x1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + /** + * @param {Array | Array>} sizes - + * @return {{w: number, h: number} | null} - + */ + const _getPlayerSize = sizes => { + let result = null; + const size = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(sizes)[0]; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(size)) { + return result; + } + const splited = size.split('x'); + const sizeObj = { + w: parseInt(splited[0], 10), + h: parseInt(splited[1], 10) + }; + const _isValidPlayerSize = !(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(sizeObj) && isFinite(sizeObj.w) && isFinite(sizeObj.h); + if (!_isValidPlayerSize) { + return result; + } + result = sizeObj; + return result; + }; + let playerSize = _getPlayerSize((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'mediaTypes.video.playerSize')); + if (enabledOldFormat) { + playerSize = playerSize || _getPlayerSize(bidRequest.sizes); + } + if (enabled1x1) { + // NOTE: `video.playerSize` in 1x1 is always [1,1]. + if (playerSize && playerSize.w === 1 && playerSize.h === 1) { + // NOTE: `params.playerSize` is a specific object to support `1x1`. + playerSize = _getPlayerSize((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bidRequest, 'params.playerSize')); + } + } + return playerSize || DEFAULT_VIDEO_SIZE; +} + +/** + * Create render for outstream video. + * @param {Object} response - + * @returns {Renderer} - Prebid Renderer object + */ +function newRenderer(response) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: response.uid, + url: VIDEO_PLAYER_URL, + loaded: false + }); + try { + renderer.setRender(outstreamRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Prebid Error calling setRender on newRenderer', err); + } + return renderer; +} + +/** + * Handles an outstream response after the library is loaded + * @param {Object} bid + */ +function outstreamRender(bid) { + bid.renderer.push(() => { + window.DACIVTPREBID.renderPrebid(bid); + }); +} + +/** + * Create render for cmer outstream video. + * @param {Object} response - + * @returns {Renderer} - Prebid Renderer object + */ +function newCmerRenderer(response) { + const renderer = _src_Renderer_js__WEBPACK_IMPORTED_MODULE_3__.Renderer.install({ + id: response.uid, + url: CMER_PLAYER_URL, + loaded: false + }); + try { + renderer.setRender(cmerRender); + } catch (err) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logWarn)('Prebid Error calling setRender on newRenderer', err); + } + return renderer; +} + +/** + * Handles an outstream response after the library is loaded + * @param {Object} bid + */ +function cmerRender(bid) { + bid.renderer.push(() => { + window.CMERYONEPREBID.renderPrebid(bid); + }); +} + +/** + * Stop sending push_sync requests in case it's either Safari browser OR iOS device OR GDPR applies. + * Data extracted from navigator's userAgent + * @param {Object} gdprConsent Is the GDPR Consent object wrapping gdprApplies {boolean} and consentString {string} attributes. + */ +function skipSync(gdprConsent) { + return (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_4__.getBrowser)() === _libraries_userAgentUtils_userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_5__.browserTypes.SAFARI || (0,_libraries_userAgentUtils_index_js__WEBPACK_IMPORTED_MODULE_4__.getOS)() === _libraries_userAgentUtils_userAgentTypes_enums_js__WEBPACK_IMPORTED_MODULE_5__.osTypes.IOS || gdprApplies(gdprConsent); +} + +/** + * Check if GDPR applies. + */ +function gdprApplies(gdprConsent) { + return gdprConsent && typeof gdprConsent.gdprApplies === 'boolean' && gdprConsent.gdprApplies; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('yieldoneBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["userAgentUtils","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yieldoneBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["yuktamediaAnalyticsAdapter"],{ + +/***/ "./modules/yuktamediaAnalyticsAdapter.js": +/*!***********************************************!*\ + !*** ./modules/yuktamediaAnalyticsAdapter.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); +/* harmony import */ var _src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/polyfill.js */ "./src/polyfill.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + + + + + + + + + + +const MODULE_CODE = 'yuktamedia'; +const storage = (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_ANALYTICS, + moduleName: MODULE_CODE +}); +const yuktamediaAnalyticsVersion = 'v3.1.0'; +let initOptions; +const events = { + auctions: {} +}; +const localStoragePrefix = 'yuktamediaAnalytics_'; +const utmTags = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; +const location = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.getWindowLocation)(); +// TODO: is 'page' the right value here? +const referer = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_3__.getRefererInfo)().page; +const _pageInfo = { + userAgent: window.navigator.userAgent, + timezoneOffset: new Date().getTimezoneOffset(), + language: window.navigator.language, + screenWidth: window.screen.width, + screenHeight: window.screen.height, + pageViewId: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(), + host: location.host, + path: location.pathname, + search: location.search, + hash: location.hash, + referer: referer, + refererDomain: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseUrl)(referer).host, + yuktamediaAnalyticsVersion: yuktamediaAnalyticsVersion, + prebidVersion: 'v' + 'prebid.version$' +}; +function getParameterByName(param) { + let vars = {}; + window.location.href.replace(location.hash, '').replace(/[?&]+([^=&]+)=?([^&]*)?/gi, function (m, key, value) { + vars[key] = value !== undefined ? value : ''; + }); + return vars[param] ? vars[param] : ''; +} +function updateSessionId() { + if (isSessionIdTimeoutExpired()) { + let newSessionId = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.generateUUID)(); + storage.setDataInLocalStorage(localStoragePrefix.concat('session_id'), newSessionId); + } + initOptions.sessionId = getSessionId(); + updateSessionIdTimeout(); +} +function updateSessionIdTimeout() { + storage.setDataInLocalStorage(localStoragePrefix.concat('session_timeout'), Date.now()); +} +function isSessionIdTimeoutExpired() { + let cpmSessionTimestamp = storage.getDataFromLocalStorage(localStoragePrefix.concat('session_timeout')); + return Date.now() - cpmSessionTimestamp > 3600000; +} +function getSessionId() { + return storage.getDataFromLocalStorage(localStoragePrefix.concat('session_id')) ? storage.getDataFromLocalStorage(localStoragePrefix.concat('session_id')) : ''; +} +function isUtmTimeoutExpired() { + let utmTimestamp = storage.getDataFromLocalStorage(localStoragePrefix.concat('utm_timeout')); + return Date.now() - utmTimestamp > 3600000; +} +function send(data, status) { + data.initOptions = Object.assign(_pageInfo, initOptions); + const yuktamediaAnalyticsRequestUrl = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.buildUrl)({ + protocol: 'https', + hostname: 'analytics-prebid.yuktamedia.com', + pathname: '/api/bids' + }); + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.fetch)(yuktamediaAnalyticsRequestUrl, { + body: JSON.stringify(data), + keepalive: true, + withCredentials: true, + method: 'POST' + }).catch(_e => { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_4__.ajax)(yuktamediaAnalyticsRequestUrl, undefined, JSON.stringify(data), { + method: 'POST', + contentType: 'text/plain' + }); + }); +} +var yuktamediaAnalyticsAdapter = Object.assign((0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_5__["default"])({ + analyticsType: 'endpoint' +}), { + track(_ref) { + let { + eventType, + args + } = _ref; + if (typeof args !== 'undefined') { + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_INIT: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'AUCTION_INIT:', JSON.stringify(args)); + if (typeof args.auctionId !== 'undefined' && args.auctionId.length) { + events.auctions[args.auctionId] = { + bids: {} + }; + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_REQUESTED: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'BID_REQUESTED:', JSON.stringify(args)); + if (typeof args.auctionId !== 'undefined' && args.auctionId.length) { + if (typeof events.auctions[args.auctionId] === 'undefined') { + events.auctions[args.auctionId] = { + bids: {} + }; + } + events.auctions[args.auctionId]['timeStamp'] = args.start; + args.bids.forEach(function (bidRequest) { + events.auctions[args.auctionId]['bids'][bidRequest.bidId] = { + bidder: bidRequest.bidder, + adUnit: bidRequest.adUnitCode, + sizes: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.parseSizesInput)(bidRequest.sizes).toString(), + isBid: false, + won: false, + timeout: false, + renderStatus: 'bid-requested', + bidId: bidRequest.bidId, + auctionId: args.auctionId + }; + if (typeof initOptions.enableUserIdCollection !== 'undefined' && initOptions.enableUserIdCollection && typeof bidRequest['userId'] !== 'undefined') { + for (let [userIdProvider, userId] in Object.entries(bidRequest['userId'])) { + userIdProvider = typeof userIdProvider !== 'string' ? JSON.stringify(userIdProvider) : userIdProvider; + userId = typeof userId !== 'string' ? JSON.stringify(userId) : userId; + events.auctions[args.auctionId]['bids'][bidRequest.bidId]['userID-'.concat(userIdProvider)] = userId; + } + } + }); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_RESPONSE: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'BID_RESPONSE:', JSON.stringify(args)); + if (typeof args.auctionId !== 'undefined' && args.auctionId.length) { + if (typeof events.auctions[args.auctionId] === 'undefined') { + events.auctions[args.auctionId] = { + bids: {} + }; + } else if (Object.keys(events.auctions[args.auctionId]['bids']).length) { + let bidResponse = events.auctions[args.auctionId]['bids'][args.requestId]; + bidResponse.isBid = args.getStatusCode() === _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.STATUS.GOOD; + bidResponse.cpm = args.cpm; + bidResponse.currency = args.currency; + bidResponse.netRevenue = args.netRevenue; + bidResponse.dealId = typeof args.dealId !== 'undefined' ? args.dealId : ''; + bidResponse.mediaType = args.mediaType; + if (bidResponse.mediaType === 'native') { + bidResponse.nativeTitle = typeof args['native']['title'] !== 'undefined' ? args['native']['title'] : ''; + bidResponse.nativeSponsoredBy = typeof args['native']['sponsoredBy'] !== 'undefined' ? args['native']['sponsoredBy'] : ''; + } + bidResponse.timeToRespond = args.timeToRespond; + bidResponse.requestTimestamp = args.requestTimestamp; + bidResponse.responseTimestamp = args.responseTimestamp; + bidResponse.bidForSize = args.size; + for (const [adserverTargetingKey, adserverTargetingValue] of Object.entries(args.adserverTargeting)) { + if (['body', 'icon', 'image', 'linkurl', 'host', 'path'].every(ele => !(0,_src_polyfill_js__WEBPACK_IMPORTED_MODULE_7__.includes)(adserverTargetingKey, ele))) { + bidResponse['adserverTargeting-' + adserverTargetingKey] = adserverTargetingValue; + } + } + bidResponse.renderStatus = 'bid-response-received'; + } + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.NO_BID: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'NO_BID:', JSON.stringify(args)); + if (typeof args.auctionId !== 'undefined' && args.auctionId.length) { + if (typeof events.auctions[args.auctionId] === 'undefined') { + events.auctions[args.auctionId] = { + bids: {} + }; + } else if (Object.keys(events.auctions[args.auctionId]['bids']).length) { + const noBid = events.auctions[args.auctionId]['bids'][args.bidId]; + noBid.renderStatus = 'no-bid'; + } + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_WON: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'BID_WON:', JSON.stringify(args)); + if (typeof initOptions.enableSession !== 'undefined' && initOptions.enableSession) { + updateSessionId(); + } + if (typeof args.auctionId !== 'undefined' && args.auctionId.length) { + if (typeof events.auctions[args.auctionId] === 'undefined') { + events.auctions[args.auctionId] = { + bids: {} + }; + } else if (Object.keys(events.auctions[args.auctionId]['bids']).length) { + const wonBid = events.auctions[args.auctionId]['bids'][args.requestId]; + wonBid.won = true; + wonBid.renderStatus = 'bid-won'; + send({ + 'bids': [wonBid] + }, 'won'); + } + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.BID_TIMEOUT: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'BID_TIMEOUT:', JSON.stringify(args)); + if (args.length) { + args.forEach(timeout => { + if (typeof timeout !== 'undefined' && typeof timeout.auctionId !== 'undefined' && timeout.auctionId.length) { + if (typeof events.auctions[args.auctionId] === 'undefined') { + events.auctions[args.auctionId] = { + bids: {} + }; + } else if (Object.keys(events.auctions[args.auctionId]['bids']).length) { + const timeoutBid = events.auctions[timeout.auctionId].bids[timeout.bidId]; + timeoutBid.timeout = true; + timeoutBid.renderStatus = 'bid-timedout'; + } + } + }); + } + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_6__.EVENTS.AUCTION_END: + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logInfo)(localStoragePrefix + 'AUCTION_END:', JSON.stringify(args)); + if (typeof initOptions.enableSession !== 'undefined' && initOptions.enableSession) { + updateSessionId(); + } + if (typeof args.auctionId !== 'undefined' && args.auctionId.length) { + const bids = Object.values(events.auctions[args.auctionId]['bids']); + send({ + 'bids': bids + }, 'auctionEnd'); + } + break; + } + } + } +}); +yuktamediaAnalyticsAdapter.buildUtmTagData = function (options) { + let utmTagData = {}; + let utmTagsDetected = false; + if (typeof options.enableUTMCollection !== 'undefined' && options.enableUTMCollection) { + utmTags.forEach(function (utmTagKey) { + let utmTagValue = getParameterByName(utmTagKey); + if (utmTagValue !== '') { + utmTagsDetected = true; + } + utmTagData[utmTagKey] = utmTagValue; + }); + utmTags.forEach(function (utmTagKey) { + if (utmTagsDetected) { + storage.setDataInLocalStorage(localStoragePrefix.concat(utmTagKey), utmTagData[utmTagKey]); + storage.setDataInLocalStorage(localStoragePrefix.concat('utm_timeout'), Date.now()); + } else { + if (!isUtmTimeoutExpired()) { + utmTagData[utmTagKey] = storage.getDataFromLocalStorage(localStoragePrefix.concat(utmTagKey)) ? storage.getDataFromLocalStorage(localStoragePrefix.concat(utmTagKey)) : ''; + storage.setDataInLocalStorage(localStoragePrefix.concat('utm_timeout'), Date.now()); + } + } + }); + } + return utmTagData; +}; +yuktamediaAnalyticsAdapter.originEnableAnalytics = yuktamediaAnalyticsAdapter.enableAnalytics; +yuktamediaAnalyticsAdapter.enableAnalytics = function (config) { + if (config && config.options) { + if (typeof config.options.pubId === 'undefined' || typeof config.options.pubKey === 'undefined') { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.logError)('Need pubId and pubKey to log auction results. Please contact a YuktaMedia representative if you do not know your pubId and pubKey.'); + return; + } + } + initOptions = Object.assign({}, config.options, this.buildUtmTagData(config.options)); + yuktamediaAnalyticsAdapter.originEnableAnalytics(config); +}; +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].registerAnalyticsAdapter({ + adapter: yuktamediaAnalyticsAdapter, + code: MODULE_CODE +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (yuktamediaAnalyticsAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_9__.registerModule)('yuktamediaAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/yuktamediaAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["zeotapIdPlusIdSystem"],{ + +/***/ "./modules/zeotapIdPlusIdSystem.js": +/*!*****************************************!*\ + !*** ./modules/zeotapIdPlusIdSystem.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports getStorage, storage, zeotapIdPlusSubmodule */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_hook_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/hook.js */ "./src/hook.js"); +/* harmony import */ var _src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/storageManager.js */ "./src/storageManager.js"); +/* harmony import */ var _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/activities/modules.js */ "./src/activities/modules.js"); + +/** + * This module adds Zeotap to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/zeotapIdPlusIdSystem + * @requires module:modules/userId + */ + + + + + +/** + * @typedef {import('../modules/userId/index.js').Submodule} Submodule + * @typedef {import('../modules/userId/index.js').SubmoduleConfig} SubmoduleConfig + */ + +const ZEOTAP_COOKIE_NAME = 'IDP'; +const ZEOTAP_VENDOR_ID = 301; +const ZEOTAP_MODULE_NAME = 'zeotapIdPlus'; +function readCookie() { + return storage.cookiesAreEnabled() ? storage.getCookie(ZEOTAP_COOKIE_NAME) : null; +} +function readFromLocalStorage() { + return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(ZEOTAP_COOKIE_NAME) : null; +} +function getStorage() { + return (0,_src_storageManager_js__WEBPACK_IMPORTED_MODULE_0__.getStorageManager)({ + moduleType: _src_activities_modules_js__WEBPACK_IMPORTED_MODULE_1__.MODULE_TYPE_UID, + moduleName: ZEOTAP_MODULE_NAME + }); +} +const storage = getStorage(); + +/** @type {Submodule} */ +const zeotapIdPlusSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: ZEOTAP_MODULE_NAME, + /** + * Vendor ID of Zeotap + * @type {Number} + */ + gvlid: ZEOTAP_VENDOR_ID, + /** + * decode the stored id value for passing to bid requests + * @function + * @param { Object | string | undefined } value + * @return { Object | string | undefined } + */ + decode(value) { + const id = value ? (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isStr)(value) ? value : (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(value) ? value.id : undefined : undefined; + return id ? { + 'IDP': JSON.parse(atob(id)) + } : undefined; + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @return {{id: string | undefined} | undefined} + */ + getId() { + const id = readCookie() || readFromLocalStorage(); + return id ? { + id + } : undefined; + }, + eids: { + 'IDP': { + source: 'zeotap.com', + atype: 1 + } + } +}; +(0,_src_hook_js__WEBPACK_IMPORTED_MODULE_3__.submodule)('userId', zeotapIdPlusSubmodule); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('zeotapIdPlusIdSystem'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/zeotapIdPlusIdSystem.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["zetaBidAdapter"],{ + +/***/ "./modules/zetaBidAdapter.js": +/*!***********************************!*\ + !*** ./modules/zetaBidAdapter.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').Bids} Bids + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').SyncOptions} SyncOptions + * @typedef {import('../src/adapters/bidderFactory.js').UserSync} UserSync + */ + +const BIDDER_CODE = 'zeta_global'; +const PREBID_DEFINER_ID = '44253'; +const ENDPOINT_URL = 'https://prebid.rfihub.com/prebid'; +const USER_SYNC_URL = 'https://p.rfihub.com/cm?in=1&pub='; +const DEFAULT_CUR = 'USD'; +const TTL = 200; +const NET_REV = true; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // check for all required bid fields + if (!(bid && bid.bidId && bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required bid data'); + return false; + } + if (!(bid.params.user && bid.params.user.buyeruid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required user data'); + return false; + } + if (!(bid.params.device && bid.params.device.ip)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required device data'); + return false; + } + if (!bid.params.definerId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required definer data'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Bids[]} validBidRequests - an array of bidRequest objects + * @param {BidderRequest} bidderRequest - master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const secure = 1; // treat all requests as secure + const request = validBidRequests[0]; + const params = request.params; + let impData = { + id: request.bidId, + secure: secure, + banner: buildBanner(request) + }; + let payload = { + id: bidderRequest.bidderRequestId, + imp: [impData], + site: params.site ? params.site : {}, + app: params.app ? params.app : {}, + device: params.device ? params.device : {}, + user: params.user ? params.user : {}, + at: params.at, + tmax: params.tmax, + wseat: params.wseat, + bseat: params.bseat, + allimps: params.allimps, + cur: [DEFAULT_CUR], + wlang: params.wlang, + bcat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2Imp, 'bcat') || params.bcat, + badv: params.badv, + bapp: params.bapp, + source: params.source ? params.source : {}, + regs: params.regs ? params.regs : {}, + ext: params.ext ? params.ext : {} + }; + payload.device.ua = navigator.userAgent; + payload.device.ip = navigator.ip; + payload.site.page = bidderRequest.refererInfo.page; + payload.site.mobile = /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent) ? 1 : 0; + payload.ext.definerId = params.definerId; + if (params.test) { + payload.test = params.test; + } + if (request.gdprConsent) { + payload.regs.ext = Object.assign(payload.regs.ext, { + gdpr: request.gdprConsent.gdprApplies === true ? 1 : 0 + }); + } + if (request.gdprConsent && request.gdprConsent.gdprApplies) { + payload.user.ext = Object.assign(payload.user.ext, { + consent: request.gdprConsent.consentString + }); + } + const postUrl = params.definerId !== PREBID_DEFINER_ID ? ENDPOINT_URL.concat('/', params.definerId) : ENDPOINT_URL; + return { + method: 'POST', + url: postUrl, + data: JSON.stringify(payload) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequest The payload from the server's response. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bidResponse = []; + if (Object.keys(serverResponse.body).length !== 0) { + let zetaResponse = serverResponse.body; + let zetaBid = zetaResponse.seatbid[0].bid[0]; + let bid = { + requestId: zetaBid.impid, + cpm: zetaBid.price, + currency: zetaResponse.cur, + width: zetaBid.w, + height: zetaBid.h, + ad: zetaBid.adm, + ttl: TTL, + creativeId: zetaBid.crid, + netRevenue: NET_REV + }; + bidResponse.push(bid); + } + return bidResponse; + }, + /** + * Register the user sync pixels which should be dropped after the auction. + * + * @param {SyncOptions} syncOptions Which user syncs are allowed? + * @param {ServerResponse[]} serverResponses List of server's responses. + * @param definerId The calling entity's definer id + * @param gdprConsent The GDPR consent parameters + * @param uspConsent The USP consent parameters + * @return {UserSync[]} The user syncs which should be dropped. + */ + getUserSyncs: function (syncOptions, serverResponses, definerId, gdprConsent, uspConsent) { + const syncs = []; + if (definerId === '' || definerId === null) { + definerId = PREBID_DEFINER_ID; + } + if (syncOptions.iframeEnabled) { + syncs.push({ + type: 'iframe', + url: USER_SYNC_URL.concat(definerId) + }); + } + return syncs; + } +}; +function buildBanner(request) { + let sizes = request.sizes; + if (request.mediaTypes && request.mediaTypes.banner && request.mediaTypes.banner.sizes) { + sizes = request.mediaTypes.banner.sizes; + } + return { + w: sizes[0][0], + h: sizes[0][1] + }; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('zetaBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/zetaBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["zeta_global_sspAnalyticsAdapter"],{ + +/***/ "./modules/zeta_global_sspAnalyticsAdapter.js": +/*!****************************************************!*\ + !*** ./modules/zeta_global_sspAnalyticsAdapter.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { + +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_ajax_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ajax.js */ "./src/ajax.js"); +/* harmony import */ var _src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapterManager.js */ "./src/adapterManager.js"); +/* harmony import */ var _src_constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/constants.js */ "./src/constants.js"); +/* harmony import */ var _libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../libraries/analyticsAdapter/AnalyticsAdapter.js */ "./libraries/analyticsAdapter/AnalyticsAdapter.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + + +const ZETA_GVL_ID = 833; +const ADAPTER_CODE = 'zeta_global_ssp'; +const BASE_URL = 'https://ssp.disqus.com/prebid/event'; +const LOG_PREFIX = 'ZetaGlobalSsp-Analytics: '; + +/// /////////// VARIABLES //////////////////////////////////// + +let zetaParams; + +/// /////////// HELPER FUNCTIONS ///////////////////////////// + +function sendEvent(eventType, event) { + (0,_src_ajax_js__WEBPACK_IMPORTED_MODULE_0__.ajax)(BASE_URL + '/' + eventType, null, JSON.stringify(event)); +} + +/// /////////// ADAPTER EVENT HANDLER FUNCTIONS ////////////// + +function adRenderSucceededHandler(args) { + const page = _src_config_js__WEBPACK_IMPORTED_MODULE_1__.config.getConfig('pageUrl') || args.doc?.location?.host + args.doc?.location?.pathname; + const event = { + zetaParams: zetaParams, + domain: (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.parseDomain)(page, { + noLeadingWww: true + }), + page: page, + bid: { + adId: args.bid?.adId, + requestId: args.bid?.requestId, + auctionId: args.bid?.auctionId, + creativeId: args.bid?.creativeId, + bidder: args.bid?.bidderCode, + mediaType: args.bid?.mediaType, + size: args.bid?.size, + adomain: args.bid?.adserverTargeting?.hb_adomain, + timeToRespond: args.bid?.timeToRespond, + cpm: args.bid?.cpm, + adUnitCode: args.bid?.adUnitCode + }, + device: { + ua: navigator.userAgent + } + }; + sendEvent(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AD_RENDER_SUCCEEDED, event); +} +function auctionEndHandler(args) { + const event = { + zetaParams: zetaParams, + bidderRequests: args.bidderRequests?.map(br => ({ + bidderCode: br?.bidderCode, + domain: br?.refererInfo?.domain, + page: br?.refererInfo?.page, + bids: br?.bids?.map(b => ({ + bidId: b?.bidId, + auctionId: b?.auctionId, + bidder: b?.bidder, + mediaType: b?.mediaTypes?.video ? 'VIDEO' : b?.mediaTypes?.banner ? 'BANNER' : undefined, + size: b?.sizes?.filter(s => s && s.length === 2).filter(s => Number.isInteger(s[0]) && Number.isInteger(s[1])).map(s => s[0] + 'x' + s[1]).find(s => s), + device: b?.ortb2?.device, + adUnitCode: b?.adUnitCode + })) + })), + bidsReceived: args.bidsReceived?.map(br => ({ + adId: br?.adId, + requestId: br?.requestId, + creativeId: br?.creativeId, + bidder: br?.bidder, + mediaType: br?.mediaType, + size: br?.size, + adomain: br?.adserverTargeting?.hb_adomain, + timeToRespond: br?.timeToRespond, + cpm: br?.cpm, + adUnitCode: br?.adUnitCode + })) + }; + sendEvent(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END, event); +} +function bidTimeoutHandler(args) { + const event = { + zetaParams: zetaParams, + domain: args.find(t => t?.ortb2?.site?.domain)?.ortb2?.site?.domain, + page: args.find(t => t?.ortb2?.site?.page)?.ortb2?.site?.page, + timeouts: args.map(t => ({ + bidId: t?.bidId, + auctionId: t?.auctionId, + bidder: t?.bidder, + mediaType: t?.mediaTypes?.video ? 'VIDEO' : t?.mediaTypes?.banner ? 'BANNER' : undefined, + size: t?.sizes?.filter(s => s && s.length === 2).filter(s => Number.isInteger(s[0]) && Number.isInteger(s[1])).map(s => s[0] + 'x' + s[1]).find(s => s), + timeout: t?.timeout, + device: t?.ortb2?.device, + adUnitCode: t?.adUnitCode + })) + }; + sendEvent(_src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT, event); +} + +/// /////////// ADAPTER DEFINITION /////////////////////////// + +let baseAdapter = (0,_libraries_analyticsAdapter_AnalyticsAdapter_js__WEBPACK_IMPORTED_MODULE_4__["default"])({ + analyticsType: 'endpoint' +}); +let zetaAdapter = Object.assign({}, baseAdapter, { + enableAnalytics() { + let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (config.options && config.options.sid) { + zetaParams = config.options; + baseAdapter.enableAnalytics.call(this, config); + } else { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(LOG_PREFIX + 'Config not found'); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__.logError)(LOG_PREFIX + 'Analytics is disabled due to error(s)'); + } + }, + disableAnalytics() { + zetaParams = undefined; + baseAdapter.disableAnalytics.apply(this, arguments); + }, + track(_ref) { + let { + eventType, + args + } = _ref; + switch (eventType) { + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AD_RENDER_SUCCEEDED: + adRenderSucceededHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.AUCTION_END: + auctionEndHandler(args); + break; + case _src_constants_js__WEBPACK_IMPORTED_MODULE_3__.EVENTS.BID_TIMEOUT: + bidTimeoutHandler(args); + break; + } + } +}); + +/// /////////// ADAPTER REGISTRATION ///////////////////////// + +_src_adapterManager_js__WEBPACK_IMPORTED_MODULE_6__["default"].registerAnalyticsAdapter({ + adapter: zetaAdapter, + code: ADAPTER_CODE, + gvlid: ZETA_GVL_ID +}); +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (zetaAdapter); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('zeta_global_sspAnalyticsAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["analyticsAdapter","chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/zeta_global_sspAnalyticsAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["zeta_global_sspBidAdapter"],{ + +/***/ "./modules/zeta_global_sspBidAdapter.js": +/*!**********************************************!*\ + !*** ./modules/zeta_global_sspBidAdapter.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony export spec */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dset/dist/index.mjs"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); +/* harmony import */ var _src_config_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/config.js */ "./src/config.js"); +/* harmony import */ var _src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/refererDetection.js */ "./src/refererDetection.js"); + + + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + * @typedef {import('../src/adapters/bidderFactory.js').Bids} Bids + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + */ + +const BIDDER_CODE = 'zeta_global_ssp'; +const ENDPOINT_URL = 'https://ssp.disqus.com/bid/prebid'; +const USER_SYNC_URL_IFRAME = 'https://ssp.disqus.com/sync?type=iframe'; +const USER_SYNC_URL_IMAGE = 'https://ssp.disqus.com/sync?type=image'; +const DEFAULT_CUR = 'USD'; +const TTL = 300; +const NET_REV = true; +const DATA_TYPES = { + 'NUMBER': 'number', + 'STRING': 'string', + 'BOOLEAN': 'boolean', + 'ARRAY': 'array', + 'OBJECT': 'object' +}; +const VIDEO_CUSTOM_PARAMS = { + 'mimes': DATA_TYPES.ARRAY, + 'minduration': DATA_TYPES.NUMBER, + 'maxduration': DATA_TYPES.NUMBER, + 'startdelay': DATA_TYPES.NUMBER, + 'playbackmethod': DATA_TYPES.ARRAY, + 'api': DATA_TYPES.ARRAY, + 'protocols': DATA_TYPES.ARRAY, + 'w': DATA_TYPES.NUMBER, + 'h': DATA_TYPES.NUMBER, + 'battr': DATA_TYPES.ARRAY, + 'linearity': DATA_TYPES.NUMBER, + 'placement': DATA_TYPES.NUMBER, + 'plcmt': DATA_TYPES.NUMBER, + 'minbitrate': DATA_TYPES.NUMBER, + 'maxbitrate': DATA_TYPES.NUMBER, + 'skip': DATA_TYPES.NUMBER +}; +const spec = { + code: BIDDER_CODE, + gvlid: 469, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // check for all required bid fields + if (!(bid && bid.bidId && bid.params && bid.params.sid)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required bid data'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Bids[]} validBidRequests - an array of bidRequest objects + * @param {BidderRequest} bidderRequest - master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const secure = 1; // treat all requests as secure + const params = validBidRequests[0].params; + const imps = validBidRequests.map(request => { + const impData = { + id: request.bidId, + secure: secure + }; + const tagid = request.params?.tagid; + if (tagid) { + impData.tagid = tagid; + } + if (request.mediaTypes) { + for (const mediaType in request.mediaTypes) { + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + impData.banner = buildBanner(request); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + impData.video = buildVideo(request); + break; + } + } + } + if (!impData.banner && !impData.video) { + impData.banner = buildBanner(request); + } + if (typeof request.getFloor === 'function') { + const floorInfo = request.getFloor({ + currency: 'USD', + mediaType: impData.video ? 'video' : 'banner', + size: [impData.video ? impData.video.w : impData.banner.w, impData.video ? impData.video.h : impData.banner.h] + }); + if (floorInfo && floorInfo.floor) { + impData.bidfloor = floorInfo.floor; + } + } + if (!impData.bidfloor) { + const bidfloor = request.params?.bidfloor; + if (bidfloor) { + impData.bidfloor = bidfloor; + } + } + return impData; + }); + let payload = { + id: bidderRequest.bidderRequestId, + cur: [DEFAULT_CUR], + imp: imps, + site: { + ...bidderRequest?.ortb2?.site, + ...params?.site + }, + device: { + ...bidderRequest?.ortb2?.device, + ...params?.device + }, + user: params.user ? params.user : {}, + app: params.app ? params.app : {}, + ext: { + tags: params.tags ? params.tags : {}, + sid: params.sid ? params.sid : undefined + } + }; + const rInfo = bidderRequest.refererInfo; + // TODO: do the fallbacks make sense here? + payload.site.page = cropPage(rInfo.page || rInfo.topmostLocation); + payload.site.domain = (0,_src_refererDetection_js__WEBPACK_IMPORTED_MODULE_2__.parseDomain)(payload.site.page, { + noLeadingWww: true + }); + payload.device.ua = navigator.userAgent; + payload.device.language = navigator.language; + payload.device.w = screen.width; + payload.device.h = screen.height; + if (bidderRequest.ortb2?.user?.geo && bidderRequest.ortb2?.device?.geo) { + payload.device.geo = { + ...payload.device.geo, + ...bidderRequest.ortb2?.device.geo + }; + payload.user.geo = { + ...payload.user.geo, + ...bidderRequest.ortb2?.user.geo + }; + } else { + if (bidderRequest.ortb2?.user?.geo) { + payload.user.geo = payload.device.geo = { + ...payload.user.geo, + ...bidderRequest.ortb2?.user.geo + }; + } + if (bidderRequest.ortb2?.device?.geo) { + payload.user.geo = payload.device.geo = { + ...payload.user.geo, + ...bidderRequest.ortb2?.device.geo + }; + } + } + if (bidderRequest?.ortb2?.device?.sua) { + payload.device.sua = bidderRequest.ortb2.device.sua; + } + if (params.test) { + payload.test = params.test; + } + + // Attaching GDPR Consent Params + if (bidderRequest && bidderRequest.gdprConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0); + } + + // CCPA + if (bidderRequest && bidderRequest.uspConsent) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent); + } + + // schain + if (validBidRequests[0].schain) { + payload.source = { + ext: { + schain: validBidRequests[0].schain + } + }; + } + if (bidderRequest?.timeout) { + payload.tmax = bidderRequest.timeout; + } + if (bidderRequest?.ortb2?.bcat) { + payload.bcat = bidderRequest.ortb2.bcat; + } + if (bidderRequest?.ortb2?.badv) { + payload.badv = bidderRequest.ortb2.badv; + } + provideEids(validBidRequests[0], payload); + provideSegments(bidderRequest, payload); + const url = params.sid ? ENDPOINT_URL.concat('?sid=', params.sid) : ENDPOINT_URL; + return { + method: 'POST', + url: url, + data: JSON.stringify(clearEmpties(payload)) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param bidRequest The payload from the server's response. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bidResponses = []; + const response = (serverResponse || {}).body; + if (response && response.seatbid && response.seatbid[0].bid && response.seatbid[0].bid.length) { + response.seatbid.forEach(zetaSeatbid => { + const seat = zetaSeatbid.seat; + zetaSeatbid.bid.forEach(zetaBid => { + let bid = { + requestId: zetaBid.impid, + cpm: zetaBid.price, + currency: response.cur, + width: zetaBid.w, + height: zetaBid.h, + ad: zetaBid.adm, + ttl: TTL, + creativeId: zetaBid.crid, + netRevenue: NET_REV + }; + if (zetaBid.adomain && zetaBid.adomain.length) { + bid.meta = { + advertiserDomains: zetaBid.adomain + }; + } + provideMediaType(zetaBid, bid, bidRequest.data); + if (bid.mediaType === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO) { + bid.vastXml = bid.ad; + } + if (seat) { + bid.dspId = seat; + } + bidResponses.push(bid); + }); + }); + } + return bidResponses; + }, + /** + * Register User Sync. + */ + getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent) => { + let syncurl = ''; + + // Attaching GDPR Consent Params in UserSync url + if (gdprConsent) { + syncurl += '&gdpr=' + (gdprConsent.gdprApplies ? 1 : 0); + syncurl += '&gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || ''); + } + + // CCPA + if (uspConsent) { + syncurl += '&us_privacy=' + encodeURIComponent(uspConsent); + } + + // coppa compliance + if (_src_config_js__WEBPACK_IMPORTED_MODULE_4__.config.getConfig('coppa') === true) { + syncurl += '&coppa=1'; + } + if (syncOptions.iframeEnabled) { + return [{ + type: 'iframe', + url: USER_SYNC_URL_IFRAME + syncurl + }]; + } else { + return [{ + type: 'image', + url: USER_SYNC_URL_IMAGE + syncurl + }]; + } + } +}; +function buildBanner(request) { + let sizes = request.sizes; + if (request.mediaTypes && request.mediaTypes.banner && request.mediaTypes.banner.sizes) { + sizes = request.mediaTypes.banner.sizes; + } + if (sizes.length > 1) { + const format = sizes.map(s => { + return { + w: s[0], + h: s[1] + }; + }); + return { + w: sizes[0][0], + h: sizes[0][1], + format: format + }; + } else { + return { + w: sizes[0][0], + h: sizes[0][1] + }; + } +} +function buildVideo(request) { + let video = {}; + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_5__["default"])(request, 'mediaTypes.video', {}); + for (const key in VIDEO_CUSTOM_PARAMS) { + if (videoParams.hasOwnProperty(key)) { + video[key] = checkParamDataType(key, videoParams[key], VIDEO_CUSTOM_PARAMS[key]); + } + } + if (videoParams.playerSize) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(videoParams.playerSize[0])) { + video.w = parseInt(videoParams.playerSize[0][0], 10); + video.h = parseInt(videoParams.playerSize[0][1], 10); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(videoParams.playerSize[0])) { + video.w = parseInt(videoParams.playerSize[0], 10); + video.h = parseInt(videoParams.playerSize[1], 10); + } + } + return video; +} +function checkParamDataType(key, value, datatype) { + let functionToExecute; + switch (datatype) { + case DATA_TYPES.BOOLEAN: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean; + break; + case DATA_TYPES.NUMBER: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber; + break; + case DATA_TYPES.STRING: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr; + break; + case DATA_TYPES.ARRAY: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray; + break; + } + if (functionToExecute(value)) { + return value; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Ignoring param key: ' + key + ', expects ' + datatype + ', found ' + typeof value); + return undefined; +} +function provideEids(request, payload) { + if (Array.isArray(request.userIdAsEids) && request.userIdAsEids.length > 0) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_3__.dset)(payload, 'user.ext.eids', request.userIdAsEids); + } +} +function provideSegments(bidderRequest, payload) { + const data = bidderRequest.ortb2?.user?.data; + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(data)) { + const segments = data.filter(d => d?.segment).map(d => d.segment).filter(s => (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(s)).flatMap(s => s).filter(s => s?.id); + if (segments.length > 0) { + if (!payload.user) { + payload.user = {}; + } + if (!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(payload.user.data)) { + payload.user.data = []; + } + const payloadData = { + segment: segments + }; + payload.user.data.push(payloadData); + } + } +} +function provideMediaType(zetaBid, bid, bidRequest) { + if (zetaBid.ext && zetaBid.ext.prebid && zetaBid.ext.prebid.type) { + bid.mediaType = zetaBid.ext.prebid.type === _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } else { + bid.mediaType = bidRequest.imp[0].video ? _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO : _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } +} +function cropPage(page) { + if (page) { + if (page.length > 100) { + page = page.substring(0, 100); + } + if (page.startsWith('https://')) { + page = page.substring(8); + } else if (page.startsWith('http://')) { + page = page.substring(7); + } + if (page.startsWith('www.')) { + page = page.substring(4); + } + for (let i = 3; i < page.length; i++) { + const c = page[i]; + if (c === '#' || c === '?') { + return page.substring(0, i); + } + } + return page; + } + return ''; +} +function clearEmpties(o) { + for (let k in o) { + if (o[k] === null) { + delete o[k]; + continue; + } + if (!o[k] || typeof o[k] !== 'object') { + continue; + } + clearEmpties(o[k]); + if (Object.keys(o[k]).length === 0) { + delete o[k]; + } + } + return o; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_6__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_7__.registerModule)('zeta_global_sspBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/zeta_global_sspBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +"use strict"; +(self["pbjsChunk"] = self["pbjsChunk"] || []).push([["zmaticooBidAdapter"],{ + +/***/ "./modules/zmaticooBidAdapter.js": +/*!***************************************!*\ + !*** ./modules/zmaticooBidAdapter.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* unused harmony exports spec, checkParamDataType, _getDomainFromURL */ +/* harmony import */ var _src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/prebidGlobal.js */ "./src/prebidGlobal.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/utils.js */ "./src/utils.js"); +/* harmony import */ var _src_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/utils.js */ "./node_modules/dlv/index.js"); +/* harmony import */ var _src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/adapters/bidderFactory.js */ "./src/adapters/bidderFactory.js"); +/* harmony import */ var _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/mediaTypes.js */ "./src/mediaTypes.js"); + + + + + +/** + * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').Bids} Bids + * @typedef {import('../src/adapters/bidderFactory.js').BidderRequest} BidderRequest + * @typedef {import('../src/adapters/bidderFactory.js').ServerResponse} ServerResponse + */ + +const BIDDER_CODE = 'zmaticoo'; +const ENDPOINT_URL = 'https://bid.zmaticoo.com/prebid/bid'; +const DEFAULT_CUR = 'USD'; +const TTL = 200; +const NET_REV = true; +const DATA_TYPES = { + 'NUMBER': 'number', + 'STRING': 'string', + 'BOOLEAN': 'boolean', + 'ARRAY': 'array', + 'OBJECT': 'object' +}; +const VIDEO_CUSTOM_PARAMS = { + 'mimes': DATA_TYPES.ARRAY, + 'minduration': DATA_TYPES.NUMBER, + 'maxduration': DATA_TYPES.NUMBER, + 'startdelay': DATA_TYPES.NUMBER, + 'playbackmethod': DATA_TYPES.ARRAY, + 'api': DATA_TYPES.ARRAY, + 'protocols': DATA_TYPES.ARRAY, + 'w': DATA_TYPES.NUMBER, + 'h': DATA_TYPES.NUMBER, + 'battr': DATA_TYPES.ARRAY, + 'linearity': DATA_TYPES.NUMBER, + 'placement': DATA_TYPES.NUMBER, + 'plcmt': DATA_TYPES.NUMBER, + 'minbitrate': DATA_TYPES.NUMBER, + 'maxbitrate': DATA_TYPES.NUMBER, + 'skip': DATA_TYPES.NUMBER +}; +const spec = { + code: BIDDER_CODE, + supportedMediaTypes: [_src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER, _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO], + /** + * Determines whether or not the given bid request is valid. + * + * @param {BidRequest} bid The bid params to validate. + * @return boolean True if this is a valid bid, and false otherwise. + */ + isBidRequestValid: function (bid) { + // check for all required bid fields + if (!(hasBannerMediaType(bid) || hasVideoMediaType(bid))) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required mediaTypes'); + return false; + } + if (!(bid && bid.params)) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required bid data'); + return false; + } + if (!bid.params.pubId) { + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Invalid bid request - missing required field pubId'); + return false; + } + return true; + }, + /** + * Make a server request from the list of BidRequests. + * + * @param {Bids[]} validBidRequests - an array of bidRequest objects + * @param {BidderRequest} bidderRequest - master bidRequest object + * @return ServerRequest Info describing the request to the server. + */ + buildRequests: function (validBidRequests, bidderRequest) { + const secure = 1; + const request = validBidRequests[0]; + const params = request.params; + const imps = validBidRequests.map(request => { + const impData = { + id: request.bidId, + secure: secure, + ext: { + bidder: { + pubId: params.pubId + } + } + }; + if (params.tagid) { + impData.tagid = params.tagid; + } + if (request.mediaTypes) { + for (const mediaType in request.mediaTypes) { + switch (mediaType) { + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER: + impData.banner = buildBanner(request); + break; + case _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.VIDEO: + impData.video = buildVideo(request); + break; + } + } + } + if (typeof bidderRequest.getFloor === 'function') { + const floorInfo = bidderRequest.getFloor({ + currency: 'USD', + mediaType: impData.video ? 'video' : 'banner', + size: [impData.video ? impData.video.w : impData.banner.w, impData.video ? impData.video.h : impData.banner.h] + }); + if (floorInfo && floorInfo.floor) { + impData.bidfloor = floorInfo.floor; + } + } + if (!impData.bidfloor && params.bidfloor) { + impData.bidfloor = params.bidfloor; + } + return impData; + }); + let payload = { + id: bidderRequest.bidderRequestId, + imp: imps, + site: params.site ? params.site : {}, + app: params.app ? params.app : {}, + device: params.device ? params.device : {}, + user: params.user ? params.user : {}, + at: params.at, + tmax: params.tmax, + wseat: params.wseat, + bseat: params.bseat, + allimps: params.allimps, + cur: [DEFAULT_CUR], + wlang: params.wlang, + bcat: (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidderRequest.ortb2Imp, 'bcat') || params.bcat, + badv: params.badv, + bapp: params.bapp, + source: params.source ? params.source : {}, + regs: params.regs ? params.regs : {}, + ext: params.ext ? params.ext : {} + }; + payload.regs.ext = {}; + payload.user.ext = {}; + payload.device.ua = navigator.userAgent; + payload.device.ip = navigator.ip; + payload.site.page = bidderRequest?.refererInfo?.page || window.location.href; + payload.site.domain = _getDomainFromURL(payload.site.page); + payload.site.mobile = /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent) ? 1 : 0; + if (params.test) { + payload.test = params.test; + } + if (bidderRequest.gdprConsent) { + payload.regs.ext = Object.assign(payload.regs.ext, { + gdpr: bidderRequest.gdprConsent.gdprApplies == true ? 1 : 0 + }); + } + if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { + payload.user.ext = Object.assign(payload.user.ext, { + consent: bidderRequest.gdprConsent.consentString + }); + } + const postUrl = ENDPOINT_URL; + return { + method: 'POST', + url: postUrl, + data: JSON.stringify(payload) + }; + }, + /** + * Unpack the response from the server into a list of bids. + * + * @param {ServerResponse} serverResponse A successful response from the server. + * @param {BidRequest} bidRequest The payload from the server's response. + * @return {Bid[]} An array of bids which were nested inside the server. + */ + interpretResponse: function (serverResponse, bidRequest) { + let bidResponses = []; + const response = (serverResponse || {}).body; + if (response && response.seatbid && response.seatbid.length && response.seatbid[0].bid && response.seatbid[0].bid.length) { + response.seatbid.forEach(zmSeatbid => { + zmSeatbid.bid.forEach(zmBid => { + let bid = { + requestId: zmBid.impid, + cpm: zmBid.price, + currency: response.cur, + width: zmBid.w, + height: zmBid.h, + ad: zmBid.adm, + ttl: TTL, + creativeId: zmBid.crid, + netRevenue: NET_REV, + nurl: zmBid.nurl + }; + bid.meta = { + advertiserDomains: zmBid.adomain && zmBid.adomain.length ? zmBid.adomain : [] + }; + if (zmBid.ext && zmBid.ext.vast_url) { + bid.vastXml = zmBid.ext.vast_url; + } + if (zmBid.ext && zmBid.ext.prebid) { + bid.mediaType = zmBid.ext.prebid.type; + } else { + bid.mediaType = _src_mediaTypes_js__WEBPACK_IMPORTED_MODULE_0__.BANNER; + } + bidResponses.push(bid); + }); + }); + } + return bidResponses; + }, + onBidWon: function (bid) { + if (!bid['nurl']) { + return false; + } + const winCpm = bid.hasOwnProperty('originalCpm') ? bid.originalCpm : bid.cpm; + const winCurr = bid.hasOwnProperty('originalCurrency') && bid.hasOwnProperty('originalCpm') ? bid.originalCurrency : bid.currency; + const winUrl = bid.nurl.replace(/\$\{AUCTION_PRICE\}/, winCpm).replace(/\$\{AUCTION_IMP_ID\}/, bid.requestId).replace(/\$\{AUCTION_CURRENCY\}/, winCurr).replace(/\$\{AUCTON_BID_ID\}/, bid.bidId).replace(/\$\{AUCTION_ID\}/, bid.auctionId); + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.triggerPixel)(winUrl); + return true; + } +}; +function buildBanner(request) { + let sizes = request.sizes; + if (request.mediaTypes && request.mediaTypes.banner && request.mediaTypes.banner.sizes) { + sizes = request.mediaTypes.banner.sizes; + } + return { + w: sizes[0][0], + h: sizes[0][1] + }; +} +function buildVideo(request) { + let video = {}; + const videoParams = (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(request, 'mediaTypes.video', {}); + for (const key in VIDEO_CUSTOM_PARAMS) { + if (videoParams.hasOwnProperty(key)) { + video[key] = checkParamDataType(key, videoParams[key], VIDEO_CUSTOM_PARAMS[key]); + } + } + if (videoParams.playerSize) { + if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray)(videoParams.playerSize[0])) { + video.w = parseInt(videoParams.playerSize[0][0], 10); + video.h = parseInt(videoParams.playerSize[0][1], 10); + } else if ((0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber)(videoParams.playerSize[0])) { + video.w = parseInt(videoParams.playerSize[0], 10); + video.h = parseInt(videoParams.playerSize[1], 10); + } + } + return video; +} +function checkParamDataType(key, value, datatype) { + let functionToExecute; + switch (datatype) { + case DATA_TYPES.BOOLEAN: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBoolean; + break; + case DATA_TYPES.NUMBER: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isNumber; + break; + case DATA_TYPES.STRING: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isStr; + break; + case DATA_TYPES.ARRAY: + functionToExecute = _src_utils_js__WEBPACK_IMPORTED_MODULE_1__.isArray; + break; + } + if (functionToExecute(value)) { + return value; + } + (0,_src_utils_js__WEBPACK_IMPORTED_MODULE_1__.logWarn)('Ignoring param key: ' + key + ', expects ' + datatype + ', found ' + typeof value); + return undefined; +} +function hasBannerMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.banner'); +} + +/** + * @param {BidRequest} bidRequest bid request + */ +function hasVideoMediaType(bidRequest) { + return !!(0,_src_utils_js__WEBPACK_IMPORTED_MODULE_2__["default"])(bidRequest, 'mediaTypes.video'); +} +function _getDomainFromURL(url) { + let anchor = document.createElement('a'); + anchor.href = url; + return anchor.hostname; +} +(0,_src_adapters_bidderFactory_js__WEBPACK_IMPORTED_MODULE_3__.registerBidder)(spec); +(0,_src_prebidGlobal_js__WEBPACK_IMPORTED_MODULE_4__.registerModule)('zmaticooBidAdapter'); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["chunk-core","viewport","greedy","creative-renderer-display"], () => (__webpack_exec__("./modules/zmaticooBidAdapter.js"))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); + +})() + + pbjs.processQueue(); + +} else { + try { + if(window.pbjs.getConfig('debug')) { + console.warn('Attempted to load a copy of Prebid.js that clashes with the existing \'pbjs\' instance. Load aborted.'); + } + } catch (e) {} +} + +//# sourceMappingURL=prebid.js.map diff --git a/im_test/public/userid.html b/im_test/public/userid.html new file mode 100644 index 00000000000..4ff260554c7 --- /dev/null +++ b/im_test/public/userid.html @@ -0,0 +1,130 @@ + + + + + User ID Modules Example + + + + + + + + + + + + +

User ID Modules Example

+ +

Generated EIDs

+ +

+
+  

Ad Slot

+
+ +
+ + + diff --git a/im_test/server.js b/im_test/server.js new file mode 100644 index 00000000000..2218503e703 --- /dev/null +++ b/im_test/server.js @@ -0,0 +1,15 @@ +const path = require('path'); +const fs = require('fs'); +console.log('Copying prebid.js to public directory...'); +fs.copyFileSync( + path.resolve(__dirname + '/../build/dev/prebid.js'), + path.resolve(__dirname + '/public/prebid.js') +); +console.log('Copying prebid.js done!'); + +console.log('Setting up static file server...'); +const express = require('express'); +const app = express(); +app.use(express.static(__dirname + '/public')); +app.listen(3000); +console.log('Static file server is running on http://localhost:3000'); diff --git a/modules/imuIdSystem.js b/modules/imuIdSystem.js index 3e9904c526f..c0ed15a832e 100644 --- a/modules/imuIdSystem.js +++ b/modules/imuIdSystem.js @@ -8,8 +8,9 @@ import { timestamp, logError } from '../src/utils.js'; import { ajax } from '../src/ajax.js' import { submodule } from '../src/hook.js'; -import {getStorageManager} from '../src/storageManager.js'; -import {MODULE_TYPE_UID} from '../src/activities/modules.js'; +import { getStorageManager } from '../src/storageManager.js'; +import { MODULE_TYPE_UID } from '../src/activities/modules.js'; +import { getRefererInfo } from '../src/refererDetection.js'; /** * @typedef {import('../modules/userId/index.js').Submodule} Submodule @@ -57,10 +58,11 @@ export function getLocalData() { } export function getApiUrl(cid, url) { - if (url) { - return `${url}?cid=${cid}`; - } - return `https://${apiDomain}/${cid}/pid`; + const baseUrl = url ? `${url}?cid=${cid}&` : `https://${apiDomain}/${cid}/pid?`; + const refererInfo = getRefererInfo(); + return baseUrl + + `page=${encodeURIComponent(refererInfo.page || '')}` + + `&ref=${encodeURIComponent(refererInfo.ref || '')}`; } export function apiSuccessProcess(jsonResponse) {