/**
* Control Center Biddr+ Definition file
*/
// {"adUnits":[{"bidder":1007,"name":"top-leaderboard-ad","code":"top-leaderboard-ad","guid":"3a295fc8","div":"top-leaderboard-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[728,90],[970,90],[970,250]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[[728,90],[970,90],[970,250]]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3471,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320281","invCode":"","member":"","keywords":""},"position":3,"id":36689,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3471,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330525","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":4,"id":36690,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3471,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190792","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":5,"id":36691,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3471,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23877"},"position":6,"id":44446,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3471,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"first-sidebar-ad","code":"first-sidebar-ad","guid":"51327865","div":"first-sidebar-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[120,600],[160,600],[300,600]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[[120,600],[160,600],[300,600]]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3472,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320286","invCode":"","member":"","keywords":""},"position":2,"id":36695,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3472,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190792","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":3,"id":36696,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3472,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330524","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":4,"id":36697,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3472,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23881"},"position":6,"id":44447,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3472,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"mid-sidebar-ad","code":"mid-sidebar-ad","guid":"7a2d2392","div":"mid-sidebar-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[300,250]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[[300,250]]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3473,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320288","invCode":"","member":"","keywords":""},"position":2,"id":36702,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3473,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190792","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":3,"id":36703,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3473,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330523","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":4,"id":36704,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3473,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23875"},"position":5,"id":44448,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3473,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"mid-leaderboard-ad","code":"mid-leaderboard-ad","guid":"c81d05cf","div":"mid-leaderboard-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[728,90]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[[728,90]]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3474,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320282","invCode":"","member":"","keywords":""},"position":1,"id":36707,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3474,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190792","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":2,"id":36708,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3474,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330525","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":3,"id":36709,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3474,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23879"},"position":4,"id":44450,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3474,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"second-sidebar-ad","code":"second-sidebar-ad","guid":"7c5cd91d","div":"second-sidebar-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[120,600],[300,250],[160,600],[300,600]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[[120,600],[160,600],[300,250],[300,600]]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3475,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320287","invCode":"","member":"","keywords":""},"position":5,"id":36716,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3475,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190794","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":6,"id":36717,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3475,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330524","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":7,"id":36718,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3475,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23873"},"position":8,"id":44449,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3475,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"bottom-leaderboard-ad","code":"bottom-leaderboard-ad","guid":"8dcf6962","div":"bottom-leaderboard-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[728,90],[970,90],[970,250]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[[728,90],[970,90],[970,250]]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3476,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320283","invCode":"","member":"","keywords":""},"position":3,"id":36723,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3476,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190794","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":4,"id":36724,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3476,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330525","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":5,"id":36725,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3476,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23883"},"position":6,"id":44451,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3476,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"first-mobile-ad","code":"first-mobile-ad","guid":"1eb00cb9","div":"first-mobile-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[320,50],[320,100],[300,50],[300,100]],"sizeMapping":{"activated":false,"devices":[]},"id":3477,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.5","demandPartners":[{"enabled":true,"params":{"placementId":"11320284","invCode":"","member":"","keywords":""},"position":5,"id":36732,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3477,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330526","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":7,"id":43813,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3477,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23863"},"position":7,"id":44452,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3477,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"second-mobile-ad","code":"second-mobile-ad","guid":"94decb13","div":"second-mobile-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[300,250],[320,50],[320,100],[300,50],[300,100]],"sizeMapping":{"activated":false,"devices":[]},"id":3478,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.5","demandPartners":[{"enabled":true,"params":{"placementId":"11320284","invCode":"","member":"","keywords":""},"position":3,"id":36737,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3478,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330526","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":6,"id":43814,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3478,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330523","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":7,"id":43815,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3478,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23865"},"position":7,"id":44453,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3478,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"third-mobile-ad","code":"third-mobile-ad","guid":"d7d728e7","div":"third-mobile-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[300,250],[320,50],[320,100],[300,50],[300,100]],"sizeMapping":{"activated":false,"devices":[]},"id":3479,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.5","demandPartners":[{"enabled":true,"params":{"placementId":"11320285","invCode":"","member":"","keywords":""},"position":6,"id":36746,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3479,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330526","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":10,"id":43816,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3479,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330523","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":11,"id":43817,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3479,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23867"},"position":11,"id":44454,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3479,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"fourth-mobile-ad","code":"fourth-mobile-ad","guid":"97f7a0bc","div":"fourth-mobile-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[300,250],[320,50],[320,100],[300,50],[300,100]],"sizeMapping":{"activated":false,"devices":[]},"id":3480,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.5","demandPartners":[{"enabled":true,"params":{"placementId":"11320285","invCode":"","member":"","keywords":""},"position":2,"id":36752,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3480,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330526","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":4,"id":43818,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3480,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330523","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":5,"id":43819,"createdAt":"2018-08-29T13:12:25.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3480,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23869"},"position":5,"id":44455,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3480,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]},{"bidder":1007,"name":"article-sidebar-ad","code":"article-sidebar-ad","guid":"e92d9d1a","div":"article-sidebar-ad","enabled":true,"clientEnabled":true,"serverEnabled":true,"randomizeDemandPartner":true,"sizes":[[120,600],[160,600],[300,250],[300,600]],"sizeMapping":{"activated":false,"devices":[{"deviceName":"Desktop","minWidth":990,"sizes":[]},{"deviceName":"Tablet","minWidth":748,"sizes":[]},{"deviceName":"Phone","minWidth":300,"sizes":[]}]},"id":3481,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","hardFloor":"0.4","demandPartners":[{"enabled":true,"params":{"placementId":"11320286","invCode":"","member":"","keywords":""},"position":4,"id":36758,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3481,"demandPartner":{"params":[],"displayName":"AppNexus","guid":"7d45183f","code":"appnexus","minVersion":null,"maxVersion":null,"logo":"appnexus.png","gdpr":true,"id":2,"createdAt":"2016-10-14T18:45:12.000Z","updatedAt":"2016-10-14T18:45:12.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"rp_account":"","rp_site":"","rp_zonesize":"","accountId":"12144","siteId":"44028","zoneId":"190792","sizes":"","keywords":"","inventory":"","visitor":"","position":"","userId":""},"position":5,"id":36759,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3481,"demandPartner":{"params":[],"displayName":"Rubicon","guid":"343ff593","code":"rubicon","minVersion":null,"maxVersion":null,"logo":"rubicon.png","gdpr":true,"id":1,"createdAt":"2016-10-14T18:44:36.000Z","updatedAt":"2016-10-14T18:44:36.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"placement":"4330524","network":"10798.1","alias":"","server":"","sizeId":"","bidFloor":""},"position":6,"id":36760,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3481,"demandPartner":{"params":[],"displayName":"AOL","guid":"e0578034","code":"aol","minVersion":null,"maxVersion":null,"logo":"aol.png","gdpr":true,"id":3,"createdAt":"2016-10-14T18:46:35.000Z","updatedAt":"2016-10-14T18:46:35.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}},{"enabled":true,"params":{"tagid":"23885"},"position":8,"id":44456,"createdAt":"2018-09-28T07:37:47.000Z","updatedAt":"2018-11-21T19:49:16.000Z","adUnit":3481,"demandPartner":{"params":[],"displayName":"EMX Digital","guid":"38428462","code":"emx_digital","minVersion":"3.9.3","maxVersion":null,"logo":"emxdgt.png","gdpr":true,"id":197,"createdAt":"2018-09-28T07:25:54.000Z","updatedAt":"2018-09-28T07:25:54.000Z","type":{"type":"client","displayName":"Client Side","id":1,"createdAt":"2017-05-10T05:05:11.000Z","updatedAt":"2017-05-10T05:05:11.000Z"}}}]}],"createdBy":8,"updatedBy":222,"client":{"guid":"297e8678","name":"Forum Communications"},"organization":24,"lock":41,"name":"Forum Communications Biddr360 - Dynamic","iID":"28228967-1007","server":{"enabled":true,"demandPartners":[]},"deleted":false,"paused":false,"bidAdjustments":{"server":{},"aol":0.8,"rubicon":0.8,"brealtime":0.8,"emx_digital":0.8},"unminified":true,"engineVersion":"3.9.5","controlCenterVersion":"1.5.12","integrations":{"dAUT":true,"dAUTF":false,"instantAuction":false,"onlyTargetSlotDivId":true,"onlyTargetSlotCode":false,"queRefresh":false,"guaranteedRefresh":false,"immediateFirePixel":false,"enableLineItemAutomation":false,"refresh":true,"refreshOption":false,"internalRefresh":true,"randomizeDemandPartner":false,"waitForSlotDefinition":false,"adUnitHardFloor":true,"gptInstantLoad":true,"biddr3x":true,"biddr4":false},"hardFloor":"0.5","timeout":{"type":"static","staticTimeout":900},"priceBuckets":[{"min":"0.40","value":"0.01"},{"min":"4.50","value":"0.05"},{"min":"10.00","value":"0.10"},{"min":"20.00","value":"0.25"},{"min":"50.00","value":"0.50"},{"min":"98.00","value":"1.00"}],"sizeGUID":null,"bidderGUID":null,"id":1007,"createdAt":"2018-08-06T21:12:51.000Z","updatedAt":"2018-11-21T19:49:16.000Z","map":{"size":[{"width":120,"height":600,"mobile":null,"desktop":null,"guid":"80bee5b9","active":true,"id":1,"createdAt":"2016-12-19T18:08:24.000Z","updatedAt":"2016-12-19T18:08:24.000Z"},{"width":160,"height":600,"mobile":null,"desktop":null,"guid":"40a0566a","active":true,"id":2,"createdAt":"2016-12-19T18:08:27.000Z","updatedAt":"2016-12-19T18:08:27.000Z"},{"width":300,"height":250,"mobile":null,"desktop":null,"guid":"87888d28","active":true,"id":3,"createdAt":"2016-12-19T18:19:39.000Z","updatedAt":"2016-12-19T18:19:39.000Z"},{"width":300,"height":600,"mobile":null,"desktop":null,"guid":"76750e9c","active":true,"id":4,"createdAt":"2016-12-19T18:19:42.000Z","updatedAt":"2016-12-19T18:19:42.000Z"},{"width":300,"height":1050,"mobile":null,"desktop":null,"guid":"fa78b558","active":true,"id":5,"createdAt":"2016-12-19T18:19:45.000Z","updatedAt":"2016-12-19T18:19:45.000Z"},{"width":320,"height":50,"mobile":null,"desktop":null,"guid":"93d0fcb4","active":true,"id":6,"createdAt":"2016-12-19T18:19:47.000Z","updatedAt":"2016-12-19T18:19:47.000Z"},{"width":320,"height":100,"mobile":null,"desktop":null,"guid":"7cf4c32a","active":true,"id":7,"createdAt":"2016-12-19T18:19:50.000Z","updatedAt":"2016-12-19T18:19:50.000Z"},{"width":336,"height":280,"mobile":null,"desktop":null,"guid":"a08cb357","active":true,"id":8,"createdAt":"2016-12-19T18:19:52.000Z","updatedAt":"2016-12-19T18:19:52.000Z"},{"width":400,"height":300,"mobile":null,"desktop":null,"guid":"3bae7e84","active":true,"id":9,"createdAt":"2016-12-19T18:19:54.000Z","updatedAt":"2016-12-19T18:19:54.000Z"},{"width":468,"height":60,"mobile":null,"desktop":null,"guid":"810714b2","active":true,"id":10,"createdAt":"2016-12-19T18:19:57.000Z","updatedAt":"2016-12-19T18:19:57.000Z"},{"width":728,"height":90,"mobile":null,"desktop":null,"guid":"b8081874","active":true,"id":11,"createdAt":"2016-12-19T18:19:59.000Z","updatedAt":"2016-12-19T18:19:59.000Z"},{"width":970,"height":90,"mobile":null,"desktop":null,"guid":"97986cf0","active":true,"id":12,"createdAt":"2016-12-19T18:20:02.000Z","updatedAt":"2016-12-19T18:20:02.000Z"},{"width":970,"height":250,"mobile":null,"desktop":null,"guid":"ed59483f","active":true,"id":13,"createdAt":"2016-12-19T18:20:05.000Z","updatedAt":"2016-12-19T18:20:05.000Z"},{"width":300,"height":50,"mobile":null,"desktop":null,"guid":"d6f21635","active":true,"id":14,"createdAt":"2016-12-22T16:14:53.000Z","updatedAt":"2016-12-22T16:14:53.000Z"},{"width":300,"height":100,"mobile":null,"desktop":null,"guid":"b28f0e76","active":true,"id":15,"createdAt":"2017-02-10T19:18:32.000Z","updatedAt":"2017-02-10T19:18:32.000Z"},{"width":260,"height":60,"mobile":null,"desktop":null,"guid":"15f04072","active":true,"id":16,"createdAt":"2017-04-25T15:36:35.000Z","updatedAt":"2017-04-25T15:36:35.000Z"},{"width":280,"height":70,"mobile":null,"desktop":null,"guid":"2da17b79","active":true,"id":17,"createdAt":"2017-06-12T17:14:02.000Z","updatedAt":"2017-06-12T17:14:02.000Z"},{"width":500,"height":250,"mobile":null,"desktop":null,"guid":"02901325","active":true,"id":18,"createdAt":"2017-06-12T17:23:36.000Z","updatedAt":"2017-06-12T17:23:36.000Z"},{"width":234,"height":60,"mobile":null,"desktop":null,"guid":"baa19cd1","active":true,"id":19,"createdAt":"2017-06-12T17:31:29.000Z","updatedAt":"2017-06-12T17:31:29.000Z"},{"width":560,"height":90,"mobile":null,"desktop":null,"guid":"7e89b28a","active":true,"id":20,"createdAt":"2017-06-12T17:46:05.000Z","updatedAt":"2017-06-12T17:46:05.000Z"},{"width":650,"height":250,"mobile":null,"desktop":null,"guid":"6db3663d","active":true,"id":22,"createdAt":"2017-11-01T21:28:20.000Z","updatedAt":"2017-11-01T21:28:20.000Z"},{"width":5,"height":5,"mobile":null,"desktop":null,"guid":"9242bf7f","active":true,"id":23,"createdAt":"2018-04-24T16:23:53.000Z","updatedAt":"2018-04-24T16:23:53.000Z"},{"width":1,"height":1,"mobile":null,"desktop":null,"guid":"deadbeaf","active":true,"id":24,"createdAt":"2018-04-24T16:23:59.000Z","updatedAt":"2018-04-24T16:23:59.000Z"},{"width":640,"height":480,"mobile":null,"desktop":null,"guid":"8a610748","active":true,"id":25,"createdAt":"2018-04-24T16:26:06.000Z","updatedAt":"2018-04-24T16:26:06.000Z"},{"width":4,"height":4,"mobile":null,"desktop":null,"guid":"d15ea5e","active":true,"id":26,"createdAt":"2018-05-07T20:44:05.000Z","updatedAt":"2018-05-07T20:44:05.000Z"},{"width":721,"height":611,"mobile":null,"desktop":null,"guid":"a65d2cf9","active":true,"id":27,"createdAt":"2018-08-10T19:55:37.000Z","updatedAt":"2018-08-10T19:55:37.000Z"},{"width":120,"height":60,"mobile":null,"desktop":null,"guid":"53a0b486","active":true,"id":28,"createdAt":"2018-11-08T21:05:30.000Z","updatedAt":"2018-11-08T21:05:30.000Z"}],"bidStatus":[{"slug":"timedout","displayName":"Timed Out","id":1,"createdAt":"2018-08-02T18:40:53.000Z","updatedAt":"2018-08-02T18:40:53.000Z"},{"slug":"bid","displayName":"Bid","id":2,"createdAt":"2018-08-02T18:41:17.000Z","updatedAt":"2018-08-02T18:41:17.000Z"},{"slug":"error","displayName":"Error","id":3,"createdAt":"2018-08-02T18:41:23.000Z","updatedAt":"2018-08-02T18:41:23.000Z"},{"slug":"winner","displayName":"Winner","id":4,"createdAt":"2018-08-02T18:41:36.000Z","updatedAt":"2018-08-02T18:41:36.000Z"}],"connectionSpeed":[{"slug":"3g","displayName":"3G","min":0,"max":0.99,"id":1,"createdAt":"2018-08-02T18:28:57.000Z","updatedAt":"2018-08-02T18:28:57.000Z"},{"slug":"4g","displayName":"4G","min":1,"max":3.99,"id":2,"createdAt":"2018-08-02T18:33:05.000Z","updatedAt":"2018-08-02T18:33:05.000Z"},{"slug":"ethernet","displayName":"Ethernet","min":4,"max":29.99,"id":3,"createdAt":"2018-08-02T18:34:55.000Z","updatedAt":"2018-08-02T18:34:55.000Z"},{"slug":"high-speed","displayName":"High Speed","min":30,"max":100000,"id":4,"createdAt":"2018-08-02T18:35:34.000Z","updatedAt":"2018-08-02T18:35:34.000Z"}],"adFormat":[{"slug":"banner","displayName":"Banner","id":1,"createdAt":"2018-08-02T18:39:58.000Z","updatedAt":"2018-08-02T18:39:58.000Z"},{"slug":"native","displayName":"Native","id":2,"createdAt":"2018-08-02T18:40:10.000Z","updatedAt":"2018-08-02T18:40:10.000Z"},{"slug":"video","displayName":"Video","id":3,"createdAt":"2018-08-02T18:40:20.000Z","updatedAt":"2018-08-02T18:40:20.000Z"}]}}
var adJsonTimeout = {"type":"static","staticTimeout":900};
//TODO: need to implement default timeout in UI
window.biddrDynamicTimeout = adJsonTimeout.staticTimeout || 2000;
window.biddr = window.biddr || {};
window.onload = function() {
var head = document.getElementsByTagName("head")[0];
var checkFrame = document.createElement("iframe");
checkFrame.src = "about:blank";
checkFrame.visibility = "hidden";
checkFrame.width = 0;
checkFrame.height = 0;
checkFrame.border = "none";
head.appendChild(checkFrame);
if (checkFrame.contentWindow) {
checkFrame = checkFrame.contentWindow;
} else {
if (checkFrame.contentDocument && checkFrame.contentDocument.document) {
checkFrame = checkFrame.contentDocument.document;
} else {
checkFrame = checkFrame.contentDocument;
}
}
var script = document.createElement("script");
script.type = "application/javascript";
script.src = "//biddr.brealtime.com/check.js";
checkFrame.document.open();
checkFrame.document.appendChild(script);
checkFrame.document.close();
};
// including Biddr+ core engine
(function() {
if(!window.biddr||(window.biddr&&(typeof window.biddr.biddrLoaded == 'undefined' || !window.biddr.biddrLoaded))) {
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ var parentJsonpFunction = window["biddrChunk"];
/******/ window["biddrChunk"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [], result;
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(installedChunks[chunkId]) {
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);
/******/ while(resolves.length) {
/******/ resolves.shift()();
/******/ }
/******/ if(executeModules) {
/******/ for(i=0; i < executeModules.length; i++) {
/******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]);
/******/ }
/******/ }
/******/ return result;
/******/ };
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // objects to store loaded and loading chunks
/******/ var installedChunks = {
/******/ 183: 0
/******/ };
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // on error function for async loading
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 616);
/******/ })
/************************************************************************/
/******/ ({
/***/ 0:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getLatestHighestCpmBid = exports.getOldestHighestCpmBid = exports.getHighestCpm = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.getAdUnitSizes = getAdUnitSizes;
exports.parseSizesInput = parseSizesInput;
exports.parseGPTSingleSizeArray = parseGPTSingleSizeArray;
exports.uniques = uniques;
exports.flatten = flatten;
exports.getBidRequest = getBidRequest;
exports.getKeys = getKeys;
exports.getValue = getValue;
exports.getBidderCodes = getBidderCodes;
exports.isGptPubadsDefined = isGptPubadsDefined;
exports.shuffle = shuffle;
exports.adUnitsFilter = adUnitsFilter;
exports.isSrcdocSupported = isSrcdocSupported;
exports.deepClone = deepClone;
exports.inIframe = inIframe;
exports.isSafariBrowser = isSafariBrowser;
exports.replaceAuctionPrice = replaceAuctionPrice;
exports.timestamp = timestamp;
exports.checkCookieSupport = checkCookieSupport;
exports.cookiesAreEnabled = cookiesAreEnabled;
exports.delayExecution = delayExecution;
exports.groupBy = groupBy;
exports.deepAccess = deepAccess;
exports.createContentToExecuteExtScriptInFriendlyFrame = createContentToExecuteExtScriptInFriendlyFrame;
exports.getDefinedParams = getDefinedParams;
exports.isValidMediaTypes = isValidMediaTypes;
exports.getBidderRequest = getBidderRequest;
exports.getUserConfiguredParams = getUserConfiguredParams;
exports.getOrigin = getOrigin;
exports.getDNT = getDNT;
exports.isAdUnitCodeMatchingSlot = isAdUnitCodeMatchingSlot;
exports.isSlotMatchingAdUnitCode = isSlotMatchingAdUnitCode;
exports.unsupportedBidderMessage = unsupportedBidderMessage;
exports.deletePropertyFromObject = deletePropertyFromObject;
exports.removeRequestId = removeRequestId;
exports.isInteger = isInteger;
exports.convertCamelToUnderscore = convertCamelToUnderscore;
exports.transformBidderParamKeywords = transformBidderParamKeywords;
exports.convertTypes = convertTypes;
var _config = __webpack_require__(3);
var _justClone = __webpack_require__(68);
var _justClone2 = _interopRequireDefault(_justClone);
var _find = __webpack_require__(10);
var _find2 = _interopRequireDefault(_find);
var _includes = __webpack_require__(7);
var _includes2 = _interopRequireDefault(_includes);
var _url = __webpack_require__(11);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var CONSTANTS = __webpack_require__(4);
var _loggingChecked = false;
var tArr = 'Array';
var tStr = 'String';
var tFn = 'Function';
var tNumb = 'Number';
var tObject = 'Object';
var tBoolean = 'Boolean';
var toString = Object.prototype.toString;
var consoleExists = Boolean(window.console);
var consoleLogExists = Boolean(consoleExists && window.console.log);
var consoleInfoExists = Boolean(consoleExists && window.console.info);
var consoleWarnExists = Boolean(consoleExists && window.console.warn);
var consoleErrorExists = Boolean(consoleExists && window.console.error);
/*
* Substitutes into a string from a given map using the token
* Usage
* var str = 'text %%REPLACE%% this text with %%SOMETHING%%';
* var map = {};
* map['replace'] = 'it was subbed';
* map['something'] = 'something else';
* console.log(replaceTokenInString(str, map, '%%')); => "text it was subbed this text with something else"
*/
exports.replaceTokenInString = function (str, map, token) {
exports._each(map, function (value, key) {
value = value === undefined ? '' : value;
var keyString = token + key.toUpperCase() + token;
var re = new RegExp(keyString, 'g');
str = str.replace(re, value);
});
return str;
};
/* utility method to get incremental integer starting from 1 */
var getIncrementalInteger = function () {
var count = 0;
return function () {
count++;
return count;
};
}();
function _getUniqueIdentifierStr() {
return getIncrementalInteger() + Math.random().toString(16).substr(2);
}
// generate a random string (to be used as a dynamic JSONP callback)
exports.getUniqueIdentifierStr = _getUniqueIdentifierStr;
/**
* 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
*/
exports.generateUUID = 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;
}
}
exports.getBidIdParameter = function (key, paramsObj) {
if (paramsObj && paramsObj[key]) {
return paramsObj[key];
}
return '';
};
exports.tryAppendQueryString = function (existingUrl, key, value) {
if (value) {
return existingUrl += key + '=' + encodeURIComponent(value) + '&';
}
return existingUrl;
};
// parse a query string object passed in bid params
// bid params should be an object such as {key: "value", key1 : "value1"}
exports.parseQueryStringParameters = function (queryObj) {
var result = '';
for (var k in queryObj) {
if (queryObj.hasOwnProperty(k)) {
result += k + '=' + encodeURIComponent(queryObj[k]) + '&';
}
}
return result;
};
// transform an AdServer targeting bids into a query string to send to the adserver
exports.transformAdServerTargetingObj = function (targeting) {
// we expect to receive targeting for a single slot at a time
if (targeting && Object.getOwnPropertyNames(targeting).length > 0) {
return getKeys(targeting).map(function (key) {
return key + '=' + encodeURIComponent(getValue(targeting, key));
}).join('&');
} else {
return '';
}
};
/**
* 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[number]]} array of arrays containing numeric sizes
*/
function getAdUnitSizes(adUnit) {
if (!adUnit) {
return;
}
var sizes = [];
if (adUnit.mediaTypes && adUnit.mediaTypes.banner && Array.isArray(adUnit.mediaTypes.banner.sizes)) {
var bannerSizes = adUnit.mediaTypes.banner.sizes;
if (Array.isArray(bannerSizes[0])) {
sizes = bannerSizes;
} else {
sizes.push(bannerSizes);
}
} else if (Array.isArray(adUnit.sizes)) {
if (Array.isArray(adUnit.sizes[0])) {
sizes = adUnit.sizes;
} else {
sizes.push(adUnit.sizes);
}
}
return sizes;
}
/**
* 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|number]} sizeObj Input array or double array [300,250] or [[300,250], [728,90]]
* @return {array[string]} Array of strings like `["300x250"]` or `["300x250", "728x90"]`
*/
function parseSizesInput(sizeObj) {
var parsedSizes = [];
// if a string for now we can assume it is a single size, like "300x250"
if (typeof sizeObj === 'string') {
// multiple sizes will be comma-separated
var sizes = sizeObj.split(',');
// regular expression to match strigns like 300x250
// start of line, at least 1 number, an "x" , then at least 1 number, and the then end of the line
var sizeRegex = /^(\d)+x(\d)+$/i;
if (sizes) {
for (var curSizePos in sizes) {
if (hasOwn(sizes, curSizePos) && sizes[curSizePos].match(sizeRegex)) {
parsedSizes.push(sizes[curSizePos]);
}
}
}
} else if ((typeof sizeObj === 'undefined' ? 'undefined' : _typeof(sizeObj)) === 'object') {
var sizeArrayLength = sizeObj.length;
// don't process empty array
if (sizeArrayLength > 0) {
// if we are a 2 item array of 2 numbers, we must be a SingleSize array
if (sizeArrayLength === 2 && typeof sizeObj[0] === 'number' && typeof sizeObj[1] === 'number') {
parsedSizes.push(parseGPTSingleSizeArray(sizeObj));
} else {
// otherwise, we must be a MultiSize array
for (var i = 0; i < sizeArrayLength; i++) {
parsedSizes.push(parseGPTSingleSizeArray(sizeObj[i]));
}
}
}
}
return parsedSizes;
};
// parse a GPT style sigle size array, (i.e [300,250])
// into an AppNexus style string, (i.e. 300x250)
function parseGPTSingleSizeArray(singleSize) {
// if we aren't exactly 2 items in this array, it is invalid
if (exports.isArray(singleSize) && singleSize.length === 2 && !isNaN(singleSize[0]) && !isNaN(singleSize[1])) {
return singleSize[0] + 'x' + singleSize[1];
}
};
/**
* @deprecated This function will be removed soon. Use http://prebid.org/dev-docs/bidder-adaptor.html#referrers
*/
exports.getTopWindowLocation = function () {
if (exports.inIframe()) {
var loc = void 0;
try {
loc = exports.getAncestorOrigins() || exports.getTopFrameReferrer();
} catch (e) {
logInfo('could not obtain top window location', e);
}
if (loc) return (0, _url.parse)(loc, { 'decodeSearchAsString': true });
}
return exports.getWindowLocation();
};
/**
* @deprecated This function will be removed soon. Use http://prebid.org/dev-docs/bidder-adaptor.html#referrers
*/
exports.getTopFrameReferrer = function () {
try {
// force an exception in x-domain environments. #1509
window.top.location.toString();
var referrerLoc = '';
var currentWindow = void 0;
do {
currentWindow = currentWindow ? currentWindow.parent : window;
if (currentWindow.document && currentWindow.document.referrer) {
referrerLoc = currentWindow.document.referrer;
}
} while (currentWindow !== window.top);
return referrerLoc;
} catch (e) {
return window.document.referrer;
}
};
/**
* @deprecated This function will be removed soon. Use http://prebid.org/dev-docs/bidder-adaptor.html#referrers
*/
exports.getAncestorOrigins = function () {
if (window.document.location && window.document.location.ancestorOrigins && window.document.location.ancestorOrigins.length >= 1) {
return window.document.location.ancestorOrigins[window.document.location.ancestorOrigins.length - 1];
}
};
exports.getWindowTop = function () {
return window.top;
};
exports.getWindowSelf = function () {
return window.self;
};
exports.getWindowLocation = function () {
return window.location;
};
/**
* @deprecated This function will be removed soon. Use http://prebid.org/dev-docs/bidder-adaptor.html#referrers
*/
exports.getTopWindowUrl = function () {
var href = void 0;
try {
href = exports.getTopWindowLocation().href;
} catch (e) {
href = '';
}
return href;
};
/**
* @deprecated This function will be removed soon. Use http://prebid.org/dev-docs/bidder-adaptor.html#referrers
*/
exports.getTopWindowReferrer = function () {
try {
return window.top.document.referrer;
} catch (e) {
return document.referrer;
}
};
/**
* Wrappers to console.(log | info | warn | error). Takes N arguments, the same as the native methods
*/
exports.logMessage = function () {
var _arguments = arguments;
if (debugTurnedOn() && consoleLogExists) {
window.biddr.que.push(function () {
biddr.listeners.send('MESSAGE:', _arguments);
});
}
};
exports.logInfo = function () {
if (debugTurnedOn() && consoleInfoExists) {
window.biddr.que.push(function () {
// biddr.listeners.send('INFO:', arguments);
});
}
};
exports.logWarn = function () {
var _arguments2 = arguments;
if (debugTurnedOn() && consoleWarnExists) {
window.biddr.que.push(function () {
biddr.listeners.send('WARNING:', _arguments2, '', 'background: gold');
});
}
};
exports.logError = function () {
if (debugTurnedOn() && consoleErrorExists) {
console.error.apply(console, decorateLog(arguments, 'ERROR:'));
}
};
function decorateLog(args, prefix) {
args = [].slice.call(args);
prefix && args.unshift(prefix);
args.unshift('display: inline-block; color: #fff; background: #3b88c3; padding: 1px 4px; border-radius: 3px;');
args.unshift('%cPrebid');
return args;
}
function hasConsoleLogger() {
return consoleLogExists;
}
exports.hasConsoleLogger = hasConsoleLogger;
var debugTurnedOn = function debugTurnedOn() {
if (_config.config.getConfig('debug') === false && _loggingChecked === false) {
var debug = getParameterByName(CONSTANTS.DEBUG_MODE).toUpperCase() === 'TRUE';
_config.config.setConfig({ debug: debug });
_loggingChecked = true;
}
return !!_config.config.getConfig('debug');
};
exports.debugTurnedOn = debugTurnedOn;
exports.createInvisibleIframe = function _createInvisibleIframe() {
var f = document.createElement('iframe');
f.id = _getUniqueIdentifierStr();
f.height = 0;
f.width = 0;
f.border = '0px';
f.hspace = '0';
f.vspace = '0';
f.marginWidth = '0';
f.marginHeight = '0';
f.style.border = '0';
f.scrolling = 'no';
f.frameBorder = '0';
f.src = 'about:blank';
f.style.display = 'none';
return f;
};
/*
* Check if a given parameter name exists in query string
* and if it does return the value
*/
var getParameterByName = function getParameterByName(name) {
var regexS = '[\\?&]' + name + '=([^]*)';
var regex = new RegExp(regexS);
var results = regex.exec(window.location.search);
if (results === null) {
return '';
}
return decodeURIComponent(results[1].replace(/\+/g, ' '));
};
exports.getParameterByName = getParameterByName;
/**
* This function validates paramaters.
* @param {object[string]} paramObj [description]
* @param {string[]} requiredParamsArr [description]
* @return {bool} Bool if paramaters are valid
*/
exports.hasValidBidRequest = function (paramObj, requiredParamsArr, adapter) {
var found = false;
function findParam(value, key) {
if (key === requiredParamsArr[i]) {
found = true;
}
}
for (var i = 0; i < requiredParamsArr.length; i++) {
found = false;
exports._each(paramObj, findParam);
if (!found) {
exports.logError('Params are missing for bid request. One of these required paramaters are missing: ' + requiredParamsArr, adapter);
return false;
}
}
return true;
};
// Handle addEventListener gracefully in older browsers
exports.addEventHandler = function (element, event, func) {
if (element.addEventListener) {
element.addEventListener(event, func, true);
} else if (element.attachEvent) {
element.attachEvent('on' + event, func);
}
};
/**
* 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
*/
exports.isA = function (object, _t) {
return toString.call(object) === '[object ' + _t + ']';
};
exports.isFn = function (object) {
return exports.isA(object, tFn);
};
exports.isStr = function (object) {
return exports.isA(object, tStr);
};
exports.isArray = function (object) {
return exports.isA(object, tArr);
};
exports.isNumber = function (object) {
return exports.isA(object, tNumb);
};
exports.isPlainObject = function (object) {
return exports.isA(object, tObject);
};
exports.isBoolean = function (object) {
return exports.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
*/
exports.isEmpty = function (object) {
if (!object) return true;
if (exports.isArray(object) || exports.isStr(object)) {
return !(object.length > 0);
}
for (var k in object) {
if (hasOwnProperty.call(object, k)) return false;
}
return true;
};
/**
* Return if string is empty, null, or undefined
* @param str string to test
* @returns {boolean} if string is empty
*/
exports.isEmptyStr = function (str) {
return exports.isStr(str) && (!str || str.length === 0);
};
/**
* Iterate object with the function
* falls back to es5 `forEach`
* @param {Array|Object} object
* @param {Function(value, key, object)} fn
*/
exports._each = function (object, fn) {
if (exports.isEmpty(object)) return;
if (exports.isFn(object.forEach)) return object.forEach(fn, this);
var k = 0;
var l = object.length;
if (l > 0) {
for (; k < l; k++) {
fn(object[k], k, object);
}
} else {
for (k in object) {
if (hasOwnProperty.call(object, k)) fn.call(this, object[k], k);
}
}
};
exports.contains = function (a, obj) {
if (exports.isEmpty(a)) {
return false;
}
if (exports.isFn(a.indexOf)) {
return a.indexOf(obj) !== -1;
}
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
};
exports.indexOf = function () {
if (Array.prototype.indexOf) {
return Array.prototype.indexOf;
}
// ie8 no longer supported
// return polyfills.indexOf;
}();
/**
* Map an array or object into another array
* given a function
* @param {Array|Object} object
* @param {Function(value, key, object)} callback
* @return {Array}
*/
exports._map = function (object, callback) {
if (exports.isEmpty(object)) return [];
if (exports.isFn(object.map)) return object.map(callback);
var output = [];
exports._each(object, function (value, key) {
output.push(callback(value, key, object));
});
return output;
};
var hasOwn = function hasOwn(objectToCheck, propertyToCheckFor) {
if (objectToCheck.hasOwnProperty) {
return objectToCheck.hasOwnProperty(propertyToCheckFor);
} else {
return typeof objectToCheck[propertyToCheckFor] !== 'undefined' && objectToCheck.constructor.prototype[propertyToCheckFor] !== objectToCheck[propertyToCheckFor];
}
};
exports.insertElement = function (elm, doc, target) {
doc = doc || document;
var elToAppend = void 0;
if (target) {
elToAppend = doc.getElementsByTagName(target);
} else {
elToAppend = doc.getElementsByTagName('head');
}
try {
elToAppend = elToAppend.length ? elToAppend : doc.getElementsByTagName('body');
if (elToAppend.length) {
elToAppend = elToAppend[0];
elToAppend.insertBefore(elm, elToAppend.firstChild);
}
} catch (e) {}
};
exports.triggerPixel = function (url) {
var img = new Image();
img.src = url;
};
exports.callBurl = function (_ref) {
var source = _ref.source,
burl = _ref.burl;
if (source === CONSTANTS.S2S.SRC && burl) {
exports.triggerPixel(burl);
}
};
/**
* 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
*/
exports.insertHtmlIntoIframe = function (htmlCode) {
if (!htmlCode) {
return;
}
var iframe = document.createElement('iframe');
iframe.id = exports.getUniqueIdentifierStr();
iframe.width = 0;
iframe.height = 0;
iframe.hspace = '0';
iframe.vspace = '0';
iframe.marginWidth = '0';
iframe.marginHeight = '0';
iframe.style.display = 'none';
iframe.style.height = '0px';
iframe.style.width = '0px';
iframe.scrolling = 'no';
iframe.frameBorder = '0';
iframe.allowtransparency = 'true';
exports.insertElement(iframe, document, 'body');
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(htmlCode);
iframe.contentWindow.document.close();
};
/**
* Inserts empty iframe with the specified `url` for cookie sync
* @param {string} url URL to be requested
* @param {string} encodeUri boolean if URL should be encoded before inserted. Defaults to true
*/
exports.insertUserSyncIframe = function (url) {
var iframeHtml = exports.createTrackPixelIframeHtml(url, false, 'allow-scripts allow-same-origin');
var div = document.createElement('div');
div.innerHTML = iframeHtml;
var iframe = div.firstChild;
exports.insertElement(iframe);
};
/**
* Creates a snippet of HTML that retrieves the specified `url`
* @param {string} url URL to be requested
* @return {string} HTML snippet that contains the img src = set to `url`
*/
exports.createTrackPixelHtml = function (url) {
if (!url) {
return '';
}
var escapedUrl = encodeURI(url);
var img = '
';
img += '
';
return img;
};
/**
* 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`
*/
exports.createTrackPixelIframeHtml = function (url) {
var encodeUri = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var sandbox = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
if (!url) {
return '';
}
if (encodeUri) {
url = encodeURI(url);
}
if (sandbox) {
sandbox = 'sandbox="' + sandbox + '"';
}
return '';
};
/**
* Returns iframe document in a browser agnostic way
* @param {object} iframe reference
* @return {object} iframe `document` reference
*/
exports.getIframeDocument = function (iframe) {
if (!iframe) {
return;
}
var doc = void 0;
try {
if (iframe.contentWindow) {
doc = iframe.contentWindow.document;
} else if (iframe.contentDocument.document) {
doc = iframe.contentDocument.document;
} else {
doc = iframe.contentDocument;
}
} catch (e) {
exports.logError('Cannot get iframe document', e);
}
return doc;
};
exports.getValueString = function (param, val, defaultValue) {
if (val === undefined || val === null) {
return defaultValue;
}
if (exports.isStr(val)) {
return val;
}
if (exports.isNumber(val)) {
return val.toString();
}
exports.logWarn('Unsuported type for param: ' + param + ' required type: String');
};
function uniques(value, index, arry) {
return arry.indexOf(value) === index;
}
function flatten(a, b) {
return a.concat(b);
}
function getBidRequest(id, bidderRequests) {
var bidRequest = void 0;
bidderRequests.some(function (bidderRequest) {
var result = (0, _find2['default'])(bidderRequest.bids, function (bid) {
return ['bidId', 'adId', 'bid_id'].some(function (type) {
return bid[type] === id;
});
});
if (result) {
bidRequest = result;
}
return result;
});
return bidRequest;
}
function getKeys(obj) {
return Object.keys(obj);
}
function getValue(obj, key) {
return obj[key];
}
function getBidderCodes() {
var adUnits = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : biddr.adUnits;
// this could memoize adUnits
return adUnits.map(function (unit) {
return unit.bids.map(function (bid) {
return bid.bidder;
}).reduce(flatten, []);
}).reduce(flatten).filter(uniques);
}
function isGptPubadsDefined() {
if (window.googletag && exports.isFn(window.googletag.pubads) && exports.isFn(window.googletag.pubads().getSlots)) {
return true;
}
}
// This function will get highest cpm value bid, in case of tie it will return the bid with lowest timeToRespond
var getHighestCpm = exports.getHighestCpm = getHighestCpmCallback('timeToRespond', function (previous, current) {
return previous > current;
});
// 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
var getOldestHighestCpmBid = exports.getOldestHighestCpmBid = getHighestCpmCallback('responseTimestamp', function (previous, current) {
return previous > current;
});
// 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
var getLatestHighestCpmBid = exports.getLatestHighestCpmBid = getHighestCpmCallback('responseTimestamp', function (previous, current) {
return previous < current;
});
function getHighestCpmCallback(useTieBreakerProperty, tieBreakerCallback) {
return function (previous, current) {
if (previous.cpm === current.cpm) {
return tieBreakerCallback(previous[useTieBreakerProperty], current[useTieBreakerProperty]) ? current : previous;
}
return previous.cpm < current.cpm ? current : previous;
};
}
/**
* Fisher–Yates shuffle
* http://stackoverflow.com/a/6274398
* https://bost.ocks.org/mike/shuffle/
* istanbul ignore next
*/
function shuffle(array) {
var counter = array.length;
// while there are elements in the array
while (counter > 0) {
// pick a random index
var index = Math.floor(Math.random() * counter);
// decrease counter by 1
counter--;
// and swap the last element with it
var temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
}
function adUnitsFilter(filter, bid) {
return (0, _includes2['default'])(filter, bid && bid.adUnitCode);
}
/**
* Check if parent iframe of passed document supports content rendering via 'srcdoc' property
* @param {HTMLDocument} doc document to check support of 'srcdoc'
*/
function isSrcdocSupported(doc) {
// Firefox is excluded due to https://bugzilla.mozilla.org/show_bug.cgi?id=1265961
return doc.defaultView && doc.defaultView.frameElement && 'srcdoc' in doc.defaultView.frameElement && !/firefox/i.test(navigator.userAgent);
}
function deepClone(obj) {
return (0, _justClone2['default'])(obj);
}
function inIframe() {
try {
return exports.getWindowSelf() !== exports.getWindowTop();
} catch (e) {
return true;
}
}
function isSafariBrowser() {
return (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)
);
}
function replaceAuctionPrice(str, cpm) {
if (!str) return;
return str.replace(/\$\{AUCTION_PRICE\}/g, cpm);
}
function timestamp() {
return new Date().getTime();
}
function checkCookieSupport() {
if (window.navigator.cookieEnabled || !!document.cookie.length) {
return true;
}
}
function cookiesAreEnabled() {
if (exports.checkCookieSupport()) {
return true;
}
window.document.cookie = 'prebid.cookieTest';
return window.document.cookie.indexOf('prebid.cookieTest') != -1;
}
/**
* 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 {int} 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);
}
var numCalls = 0;
return function () {
numCalls++;
if (numCalls === numRequiredCalls) {
func.apply(null, arguments);
}
};
}
/**
* https://stackoverflow.com/a/34890276/428704
* @export
* @param {array} xs
* @param {string} key
* @returns {${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;
}, {});
}
/**
* deepAccess utility function useful for doing safe access (will not throw exceptions) of deep object paths.
* @param {object} obj The object containing the values you would like to access.
* @param {string|number} path Object path to the value you would like to access. Non-strings are coerced to strings.
* @returns {*} The value found at the specified object path, or undefined if path is not found.
*/
function deepAccess(obj, path) {
if (!obj) {
return;
}
path = String(path).split('.');
for (var i = 0; i < path.length; i++) {
obj = obj[path[i]];
if (typeof obj === 'undefined') {
return;
}
}
return obj;
}
/**
* Returns content for a friendly iframe to execute a URL in script tag
* @param {url} URL to be executed in a script tag in a friendly iframe
* and are macros left to be replaced if required
*/
function createContentToExecuteExtScriptInFriendlyFrame(url) {
if (!url) {
return '';
}
return '';
}
/**
* 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(function (param) {
return object[param];
}).reduce(function (bid, param) {
return _extends(bid, _defineProperty({}, 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) {
var SUPPORTED_MEDIA_TYPES = ['banner', 'native', 'video'];
var SUPPORTED_STREAM_TYPES = ['instream', 'outstream'];
var types = Object.keys(mediaTypes);
if (!types.every(function (type) {
return (0, _includes2['default'])(SUPPORTED_MEDIA_TYPES, type);
})) {
return false;
}
if (mediaTypes.video && mediaTypes.video.context) {
return (0, _includes2['default'])(SUPPORTED_STREAM_TYPES, mediaTypes.video.context);
}
return true;
}
function getBidderRequest(bidRequests, bidder, adUnitCode) {
return (0, _find2['default'])(bidRequests, function (request) {
return request.bids.filter(function (bid) {
return bid.bidder === bidder && bid.adUnitCode === adUnitCode;
}).length > 0;
}) || { start: null, auctionId: null };
}
/**
* Returns user configured bidder params from adunit
* @param {object} adunits
* @param {string} adunit code
* @param {string} bidder code
* @return {Array} user configured param for the given bidder adunit configuration
*/
function getUserConfiguredParams(adUnits, adUnitCode, bidder) {
return adUnits.filter(function (adUnit) {
return adUnit.code === adUnitCode;
}).map(function (adUnit) {
return adUnit.bids;
}).reduce(flatten, []).filter(function (bidderData) {
return bidderData.bidder === bidder;
}).map(function (bidderData) {
return bidderData.params || {};
});
}
/**
* 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;
}
}
/**
* Returns Do Not Track state
*/
function getDNT() {
return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNotTrack === '1' || navigator.doNotTrack === 'yes';
}
var compareCodeAndSlot = function compareCodeAndSlot(slot, adUnitCode) {
return 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 function (adUnitCode) {
return compareCodeAndSlot(slot, adUnitCode);
};
}
/**
* Returns filter function to match adUnitCode in slot
* @param {string} adUnitCode AdUnit code
* @return {function} filter function
*/
function isSlotMatchingAdUnitCode(adUnitCode) {
return function (slot) {
return 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) {
var mediaType = Object.keys(adUnit.mediaTypes || { 'banner': 'banner' }).join(', ');
return '\n ' + adUnit.code + ' is a ' + mediaType + ' ad unit\n containing bidders that don\'t support ' + mediaType + ': ' + bidder + '.\n This bidder won\'t fetch demand.\n ';
}
/**
* Delete property from object
* @param {Object} object
* @param {string} prop
* @return {Object} object
*/
function deletePropertyFromObject(object, prop) {
var result = _extends({}, object);
delete result[prop];
return result;
}
/**
* Delete requestId from external bid object.
* @param {Object} bid
* @return {Object} bid
*/
function removeRequestId(bid) {
return exports.deletePropertyFromObject(bid, 'requestId');
}
/**
* Checks input is integer or not
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
* @param {*} value
*/
function isInteger(value) {
if (Number.isInteger) {
return Number.isInteger(value);
} else {
return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
}
}
/**
* 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(/^_/, '');
}
/**
* 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{Arrays}} keywords object of arrays representing keyvalue pairs
* @param {string} paramName name of parent object (eg 'keywords') containing keyword data, used in error handling
*/
function transformBidderParamKeywords(keywords) {
var paramName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'keywords';
var arrs = [];
exports._each(keywords, function (v, k) {
if (exports.isArray(v)) {
var values = [];
exports._each(v, function (val) {
val = exports.getValueString(paramName + '.' + k, val);
if (val || val === '') {
values.push(val);
}
});
v = values;
} else {
v = exports.getValueString(paramName + '.' + k, v);
if (exports.isStr(v)) {
v = [v];
} else {
return;
} // unsuported types - don't send a key
}
arrs.push({ key: k, value: v });
});
return arrs;
}
/**
* 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(function (key) {
if (params[key]) {
if (exports.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;
}
/***/ }),
/***/ 1:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.registerBidder = registerBidder;
exports.newBidder = newBidder;
exports.isValid = isValid;
var _adapter = __webpack_require__(28);
var _adapter2 = _interopRequireDefault(_adapter);
var _adaptermanager = __webpack_require__(8);
var _adaptermanager2 = _interopRequireDefault(_adaptermanager);
var _config = __webpack_require__(3);
var _bidfactory = __webpack_require__(16);
var _bidfactory2 = _interopRequireDefault(_bidfactory);
var _userSync = __webpack_require__(18);
var _native = __webpack_require__(17);
var _video = __webpack_require__(41);
var _constants = __webpack_require__(4);
var _constants2 = _interopRequireDefault(_constants);
var _events = __webpack_require__(9);
var _events2 = _interopRequireDefault(_events);
var _includes = __webpack_require__(7);
var _includes2 = _interopRequireDefault(_includes);
var _utils = __webpack_require__(0);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
/**
* 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} 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 [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
var COMMON_BID_RESPONSE_KEYS = ['requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency'];
/**
* 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) {
var mediaTypes = Array.isArray(spec.supportedMediaTypes) ? { supportedMediaTypes: spec.supportedMediaTypes } : undefined;
function putBidder(spec) {
var bidder = newBidder(spec);
_adaptermanager2['default'].registerBidAdapter(bidder, spec.code, mediaTypes);
}
putBidder(spec);
if (Array.isArray(spec.aliases)) {
spec.aliases.forEach(function (alias) {
_adaptermanager2['default'].aliasRegistry[alias] = spec.code;
putBidder(_extends({}, spec, { code: alias }));
});
}
}
/**
* 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 _extends(new _adapter2['default'](spec.code), {
getSpec: function getSpec() {
return Object.freeze(spec);
},
registerSyncs: registerSyncs,
callBids: function callBids(bidderRequest, addBidResponse, done, ajax) {
if (!Array.isArray(bidderRequest.bids)) {
return;
}
var adUnitCodesHandled = {};
function addBidWithCode(adUnitCode, bid) {
adUnitCodesHandled[adUnitCode] = true;
if (isValid(adUnitCode, bid, [bidderRequest])) {
addBidResponse(adUnitCode, bid);
}
}
// After all the responses have come back, call done() and
// register any required usersync pixels.
var responses = [];
function afterAllResponses(bids) {
done();
_events2['default'].emit(_constants2['default'].EVENTS.BIDDER_DONE, bidderRequest);
registerSyncs(responses, bidderRequest.gdprConsent);
}
var validBidRequests = bidderRequest.bids.filter(filterAndWarn);
if (validBidRequests.length === 0) {
afterAllResponses();
return;
}
var bidRequestMap = {};
validBidRequests.forEach(function (bid) {
bidRequestMap[bid.bidId] = bid;
// Delete this once we are 1.0
if (!bid.adUnitCode) {
bid.adUnitCode = bid.placementCode;
}
});
var requests = spec.buildRequests(validBidRequests, bidderRequest);
if (!requests || requests.length === 0) {
afterAllResponses();
return;
}
if (!Array.isArray(requests)) {
requests = [requests];
}
// Callbacks don't compose as nicely as Promises. We should call done() once _all_ the
// Server requests have returned and been processed. Since `ajax` accepts a single callback,
// we need to rig up a function which only executes after all the requests have been responded.
var onResponse = (0, _utils.delayExecution)(afterAllResponses, requests.length);
requests.forEach(processRequest);
function formatGetParameters(data) {
if (data) {
return '?' + ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' ? (0, _utils.parseQueryStringParameters)(data) : data);
}
return '';
}
function processRequest(request) {
switch (request.method) {
case 'GET':
ajax('' + request.url + formatGetParameters(request.data), {
success: onSuccess,
error: onFailure
}, undefined, _extends({
method: 'GET',
withCredentials: true
}, request.options));
break;
case 'POST':
ajax(request.url, {
success: onSuccess,
error: onFailure
}, typeof request.data === 'string' ? request.data : JSON.stringify(request.data), _extends({
method: 'POST',
contentType: 'text/plain',
withCredentials: true
}, request.options));
break;
default:
(0, _utils.logWarn)('Skipping invalid request from ' + spec.code + '. Request type ' + request.type + ' must be GET or POST');
onResponse();
}
// 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 `onResponse` function so that we're one step closer to calling done().
function onSuccess(response, responseObj) {
// BRTCFD-1276: custom logic in here (mostly with the session var)
// to get emptyOrError bids properly recorded;
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)
};
responses.push(response);
var bids = void 0;
try {
bids = spec.interpretResponse(response, request);
} catch (err) {
(0, _utils.logError)('Bidder ' + spec.code + ' failed to interpret the server\'s response. Continuing without bids', null, err);
onResponse();
return;
}
if (bids) {
if (bids.forEach) {
bids.forEach(addBidUsingRequestMap);
} else {
addBidUsingRequestMap(bids);
}
} else {
// biddr custom handling for nonresponse'd bids
var id = request.bidId || request.adId || request.id;
// let session = biddr.v2.analyticsStore[biddr.v2.analyticsMapping[biddr.v2.auctionMapping[biddr.v2.requestMapping[id]]]]
var session = biddr.v2.analyticsStore.getSession(id);
session.emptyOrError = session.emptyOrError || [];
session.emptyOrError.push({
id: id,
bidder: request.bidderCode,
ttl: request.ttl,
statusMessage: 'Bid returned empty or error response'
});
}
onResponse(bids);
function addBidUsingRequestMap(bid) {
var bidRequest = bidRequestMap[bid.requestId];
if (bidRequest) {
var prebidBid = _extends(_bidfactory2['default'].createBid(_constants2['default'].STATUS.GOOD, bidRequest), bid);
addBidWithCode(bidRequest.adUnitCode, prebidBid);
} else {
(0, _utils.logWarn)('Bidder ' + spec.code + ' made bid for unknown request ID: ' + bid.requestId + '. Ignoring.');
}
}
function headerParser(xmlHttpResponse) {
return {
get: responseObj.getResponseHeader.bind(responseObj)
};
}
}
// If the server responds with an error, there's not much we can do. Log it, and make sure to
// call onResponse() so that we're one step closer to calling done().
function onFailure(err) {
biddr.listeners.send('Server call for ' + spec.code + ' failed: ' + err + '. Continuing without bids.', '', '', 'background: #aa3333');
var id = request.bidId || request.adId || request.id;
var tags;
if (!id) {
try {
tags = JSON.parse(request.data).tags;
} catch (err) {
biddr.listeners.send('Error: ', err);
}
}
// BRTCFD-1276:
// further figuring out emptyOrError;
// def open to suggestions for this part;
if (tags) {
for (var t = 0; t < tags.length; t++) {
var tag = tags[t];
id = tag.uuid;
// var session = biddr.v2.analyticsStore[biddr.v2.analyticsMapping[biddr.v2.auctionMapping[biddr.v2.requestMapping[id]]]];
var _session = biddr.v2.analyticsStore.getSession(id);
_session.emptyOrError = _session.emptyOrError || [];
_session.emptyOrError.push({
id: id,
bidder: spec.code,
statusMessage: 'Bid returned empty or error response'
});
}
return;
}
// BRTCFD-1276:
// further figuring out emptyOrError;
var session = biddr.v2.analyticsStore.getSession(request.bidId);
session.emptyOrError = session.emptyOrError || [];
// var session = biddr.v2.analyticsStore[biddr.v2.analyticsMapping[biddr.v2.auctionMapping[biddr.v2.requestMapping[request.bidId]]]];
session.emptyOrError.push({
id: request.bidId,
bidder: spec.code,
statusMessage: 'Bid returned empty or error response'
});
biddr.listeners.send('Server call for ' + spec.code + ' failed: ' + err + '. Continuing without bids.');
onResponse();
}
}
}
});
function registerSyncs(responses, gdprConsent) {
var allow = true;
if (biddr.gdprApplies) {
biddr.removed.forEach(function (bidder) {
if (spec.code === bidder) {
allow = false;
}
});
}
if (!allow) {
return;
}
if (spec.getUserSyncs) {
var filterConfig = _config.config.getConfig('userSync.filterSettings');
var syncs = spec.getUserSyncs({
iframeEnabled: !!(_config.config.getConfig('userSync.iframeEnabled') || filterConfig && (filterConfig.iframe || filterConfig.all)),
pixelEnabled: !!(_config.config.getConfig('userSync.pixelEnabled') || filterConfig && (filterConfig.image || filterConfig.all))
}, responses, gdprConsent);
if (syncs) {
if (!Array.isArray(syncs)) {
syncs = [syncs];
}
syncs.forEach(function (sync) {
_userSync.userSync.registerSync(sync.type, spec.code, sync.url);
});
}
}
}
function filterAndWarn(bid) {
if (!spec.isBidRequestValid(bid)) {
(0, _utils.logWarn)('Invalid bid sent to bidder ' + spec.code + ': ' + JSON.stringify(bid));
return false;
}
return true;
}
}
// check that the bid has a width and height set
function validBidSize(adUnitCode, bid, bidRequests) {
if ((bid.width || bid.width === 0) && (bid.height || bid.height === 0)) {
return true;
}
var adUnit = (0, _utils.getBidderRequest)(bidRequests, bid.bidderCode, adUnitCode);
var sizes = adUnit && adUnit.bids && adUnit.bids[0] && adUnit.bids[0].sizes;
var parsedSizes = (0, _utils.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) {
var _parsedSizes$0$split = parsedSizes[0].split('x'),
_parsedSizes$0$split2 = _slicedToArray(_parsedSizes$0$split, 2),
width = _parsedSizes$0$split2[0],
height = _parsedSizes$0$split2[1];
bid.width = width;
bid.height = height;
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, bidRequests) {
function hasValidKeys() {
var bidKeys = Object.keys(bid);
return COMMON_BID_RESPONSE_KEYS.every(function (key) {
return (0, _includes2['default'])(bidKeys, key) && !(0, _includes2['default'])([undefined, null], bid[key]);
});
}
function errorMessage(msg) {
return 'Invalid bid from ' + bid.bidderCode + '. Ignoring bid: ' + msg;
}
if (!adUnitCode) {
(0, _utils.logWarn)('No adUnitCode was supplied to addBidResponse.');
return false;
}
if (!bid) {
(0, _utils.logWarn)('Some adapter tried to add an undefined bid for ' + adUnitCode + '.');
return false;
}
if (!hasValidKeys()) {
(0, _utils.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 (bid.mediaType === 'native' && !(0, _native.nativeBidIsValid)(bid, bidRequests)) {
(0, _utils.logError)(errorMessage('Native bid missing some required properties.'));
return false;
}
if (bid.mediaType === 'video' && !(0, _video.isValidVideoBid)(bid, bidRequests)) {
(0, _utils.logError)(errorMessage('Video bid does not have required vastUrl or renderer property'));
return false;
}
if (bid.mediaType === 'banner' && !validBidSize(adUnitCode, bid, bidRequests)) {
(0, _utils.logError)(errorMessage('Banner bids require a width and height'));
return false;
}
return true;
}
/***/ }),
/***/ 10:
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(48);
module.exports = __webpack_require__(13).Array.find;
/***/ }),
/***/ 11:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
exports.parseQS = parseQS;
exports.formatQS = formatQS;
exports.parse = parse;
exports.format = format;
function parseQS(query) {
return !query ? {} : query.replace(/^\?/, '').split('&').reduce(function (acc, criteria) {
var _criteria$split = criteria.split('='),
_criteria$split2 = _slicedToArray(_criteria$split, 2),
k = _criteria$split2[0],
v = _criteria$split2[1];
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(function (k) {
return Array.isArray(query[k]) ? query[k].map(function (v) {
return k + '[]=' + v;
}).join('&') : k + '=' + query[k];
}).join('&');
}
function parse(url, options) {
var 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
var 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 : parseQS(parsed.search || ''),
hash: (parsed.hash || '').replace(/^#/, ''),
host: parsed.host || window.location.host
};
}
function format(obj) {
return (obj.protocol || 'http') + '://' + (obj.host || obj.hostname + (obj.port ? ':' + obj.port : '')) + (obj.pathname || '') + (obj.search ? '?' + formatQS(obj.search || '') : '') + (obj.hash ? '#' + obj.hash : '');
}
/***/ }),
/***/ 118:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
var $export = __webpack_require__(14);
var $find = __webpack_require__(34)(6);
var KEY = 'findIndex';
var forced = true;
// Shouldn't skip holes
if (KEY in []) Array(1)[KEY](function () { forced = false; });
$export($export.P + $export.F * forced, 'Array', {
findIndex: function findIndex(callbackfn /* , that = undefined */) {
return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
__webpack_require__(27)(KEY);
/***/ }),
/***/ 12:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Renderer = Renderer;
exports.isRendererRequired = isRendererRequired;
exports.executeRenderer = executeRenderer;
var _adloader = __webpack_require__(29);
var _utils = __webpack_require__(0);
var utils = _interopRequireWildcard(_utils);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
/**
* @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) {
var _this = this;
var url = options.url,
config = options.config,
id = options.id,
callback = options.callback,
loaded = options.loaded;
this.url = url;
this.config = config;
this.handlers = {};
this.id = id;
// a renderer may push to the command queue to delay rendering until the
// render function is loaded by loadScript, at which point the the command
// queue will be processed
this.loaded = loaded;
this.cmd = [];
this.push = function (func) {
if (typeof func !== 'function') {
utils.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 || function () {
_this.loaded = true;
_this.process();
};
// we expect to load a renderer url once only so cache the request to load script
(0, _adloader.loadScript)(url, this.callback, true);
}
Renderer.install = function (_ref) {
var url = _ref.url,
config = _ref.config,
id = _ref.id,
callback = _ref.callback,
loaded = _ref.loaded;
return new Renderer({ url: url, config: config, id: id, callback: callback, loaded: loaded });
};
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) {
var id = _ref2.id,
eventName = _ref2.eventName;
if (typeof this.handlers[eventName] === 'function') {
this.handlers[eventName]();
}
utils.logMessage('Prebid Renderer event for id ' + id + ' type ' + eventName);
};
/*
* Calls functions that were pushed to the command queue before the
* renderer was loaded by `loadScript`
*/
Renderer.prototype.process = function () {
while (this.cmd.length > 0) {
try {
this.cmd.shift().call();
} catch (error) {
utils.logError('Error processing Renderer command: ', 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);
}
/**
* Render the bid returned by the adapter
* @param {Object} renderer Renderer object installed by adapter
* @param {Object} bid Bid response
*/
function executeRenderer(renderer, bid) {
renderer.render(bid);
}
/***/ }),
/***/ 13:
/***/ (function(module, exports) {
var core = module.exports = { version: '2.5.7' };
if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
/***/ }),
/***/ 14:
/***/ (function(module, exports, __webpack_require__) {
var global = __webpack_require__(19);
var core = __webpack_require__(13);
var ctx = __webpack_require__(32);
var hide = __webpack_require__(50);
var has = __webpack_require__(57);
var PROTOTYPE = 'prototype';
var $export = function (type, name, source) {
var IS_FORCED = type & $export.F;
var IS_GLOBAL = type & $export.G;
var IS_STATIC = type & $export.S;
var IS_PROTO = type & $export.P;
var IS_BIND = type & $export.B;
var IS_WRAP = type & $export.W;
var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
var expProto = exports[PROTOTYPE];
var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
var key, own, out;
if (IS_GLOBAL) source = name;
for (key in source) {
// contains in native
own = !IS_FORCED && target && target[key] !== undefined;
if (own && has(exports, key)) continue;
// export native or passed
out = own ? target[key] : source[key];
// prevent global pollution for namespaces
exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
// bind timers to global for call from export context
: IS_BIND && own ? ctx(out, global)
// wrap global constructors for prevent change them in library
: IS_WRAP && target[key] == out ? (function (C) {
var F = function (a, b, c) {
if (this instanceof C) {
switch (arguments.length) {
case 0: return new C();
case 1: return new C(a);
case 2: return new C(a, b);
} return new C(a, b, c);
} return C.apply(this, arguments);
};
F[PROTOTYPE] = C[PROTOTYPE];
return F;
// make static versions for prototype methods
})(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
// export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
if (IS_PROTO) {
(exports.virtual || (exports.virtual = {}))[key] = out;
// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
}
}
};
// type bitmap
$export.F = 1; // forced
$export.G = 2; // global
$export.S = 4; // static
$export.P = 8; // proto
$export.B = 16; // bind
$export.W = 32; // wrap
$export.U = 64; // safe
$export.R = 128; // real proto method for `library`
module.exports = $export;
/***/ }),
/***/ 15:
/***/ (function(module, exports) {
module.exports = function (it) {
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
/***/ }),
/***/ 16:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(0);
/**
Required paramaters
bidderCode,
height,
width,
statusCode
Optional paramaters
adId,
cpm,
ad,
adUrl,
dealId,
priceKeyString;
*/
function Bid(statusCode, bidRequest) {
var _bidId = bidRequest && bidRequest.bidId || utils.getUniqueIdentifierStr();
var _bidSrc = bidRequest && bidRequest.src || 'client';
var _statusCode = statusCode || 0;
this.bidderCode = bidRequest && bidRequest.bidder || '';
this.width = 0;
this.height = 0;
this.statusMessage = _getStatus();
this.adId = _bidId;
this.mediaType = 'banner';
this.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;
};
}
// Bid factory function.
exports.createBid = function (statusCode, bidRequest) {
return new Bid(statusCode, bidRequest);
};
/***/ }),
/***/ 17:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hasNonNativeBidder = exports.nativeBidder = exports.nativeAdUnit = exports.NATIVE_TARGETING_KEYS = exports.nativeAdapters = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.processNativeAdUnitParams = processNativeAdUnitParams;
exports.nativeBidIsValid = nativeBidIsValid;
exports.fireNativeTrackers = fireNativeTrackers;
exports.getNativeTargeting = getNativeTargeting;
var _utils = __webpack_require__(0);
var _includes = __webpack_require__(7);
var _includes2 = _interopRequireDefault(_includes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var CONSTANTS = __webpack_require__(4);
var nativeAdapters = exports.nativeAdapters = [];
var NATIVE_TARGETING_KEYS = exports.NATIVE_TARGETING_KEYS = Object.keys(CONSTANTS.NATIVE_KEYS).map(function (key) {
return CONSTANTS.NATIVE_KEYS[key];
});
var IMAGE = {
image: { required: true },
title: { required: true },
sponsoredBy: { required: true },
clickUrl: { required: true },
body: { required: false },
icon: { required: false }
};
var SUPPORTED_TYPES = {
image: IMAGE
};
/**
* 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)) {
return SUPPORTED_TYPES[params.type];
}
return params;
}
/**
* Check if the native type specified in the adUnit is supported by Prebid.
*/
function typeIsSupported(type) {
if (!(type && (0, _includes2['default'])(Object.keys(SUPPORTED_TYPES), type))) {
(0, _utils.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
*/
var nativeAdUnit = exports.nativeAdUnit = function nativeAdUnit(adUnit) {
var mediaType = adUnit.mediaType === 'native';
var mediaTypes = (0, _utils.deepAccess)(adUnit, 'mediaTypes.native');
return mediaType || mediaTypes;
};
var nativeBidder = exports.nativeBidder = function nativeBidder(bid) {
return (0, _includes2['default'])(nativeAdapters, bid.bidder);
};
var hasNonNativeBidder = exports.hasNonNativeBidder = function hasNonNativeBidder(adUnit) {
return adUnit.bids.filter(function (bid) {
return !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, bidRequests) {
var bidRequest = (0, _utils.getBidRequest)(bid.adId, bidRequests);
if (!bidRequest) {
return false;
}
// all native bid responses must define a landing page url
if (!(0, _utils.deepAccess)(bid, 'native.clickUrl')) {
return false;
}
if ((0, _utils.deepAccess)(bid, 'native.image')) {
if (!(0, _utils.deepAccess)(bid, 'native.image.height') || !(0, _utils.deepAccess)(bid, 'native.image.width')) {
return false;
}
}
if ((0, _utils.deepAccess)(bid, 'native.icon')) {
if (!(0, _utils.deepAccess)(bid, 'native.icon.height') || !(0, _utils.deepAccess)(bid, 'native.icon.width')) {
return false;
}
}
var requestedAssets = bidRequest.nativeParams;
if (!requestedAssets) {
return true;
}
var requiredAssets = Object.keys(requestedAssets).filter(function (key) {
return requestedAssets[key].required;
});
var returnedAssets = Object.keys(bid['native']).filter(function (key) {
return bid['native'][key];
});
return requiredAssets.every(function (asset) {
return (0, _includes2['default'])(returnedAssets, asset);
});
}
/*
* 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, adObject) {
var trackers = void 0;
if (message.action === 'click') {
trackers = adObject['native'] && adObject['native'].clickTrackers;
} else {
trackers = adObject['native'] && adObject['native'].impressionTrackers;
if (adObject['native'] && adObject['native'].javascriptTrackers) {
(0, _utils.insertHtmlIntoIframe)(adObject['native'].javascriptTrackers);
}
}
(trackers || []).forEach(_utils.triggerPixel);
}
/**
* Gets native targeting key-value pairs
* @param {Object} bid
* @return {Object} targeting
*/
function getNativeTargeting(bid) {
var keyValues = {};
Object.keys(bid['native']).forEach(function (asset) {
var key = CONSTANTS.NATIVE_KEYS[asset];
var value = bid['native'][asset];
// native image-type assets can be a string or an object with a url prop
if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.url) {
value = value.url;
}
if (key && value) {
keyValues[key] = value;
}
});
return keyValues;
}
/***/ }),
/***/ 18:
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.userSync = undefined;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.newUserSync = newUserSync;
var _utils = __webpack_require__(0);
var utils = _interopRequireWildcard(_utils);
var _config = __webpack_require__(3);
var _includes = __webpack_require__(7);
var _includes2 = _interopRequireDefault(_includes);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
// Set userSync default values
_config.config.setDefaults({
'userSync': {
syncEnabled: true,
pixelEnabled: true,
syncsPerBidder: 5,
syncDelay: 3000
}
});
/**
* Factory function which creates a new UserSyncPool.
*
* @param {UserSyncDependencies} userSyncDependencies Configuration options and dependencies which the
* UserSync object needs in order to behave properly.
*/
function newUserSync(userSyncDependencies) {
var publicApi = {};
// A queue of user syncs for each adapter
// Let getDefaultQueue() set the defaults
var queue = getDefaultQueue();
// Whether or not user syncs have been trigger on this page load
var hasFired = false;
// How many bids for each adapter
var numAdapterBids = {};
// for now - default both to false in case filterSettings config is absent/misconfigured
var permittedPixels = {
image: false,
iframe: false
// Use what is in config by default
};var usConfig = userSyncDependencies.config;
// Update if it's (re)set
_config.config.getConfig('userSync', function (conf) {
usConfig = _extends(usConfig, conf.userSync);
});
/**
* @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 || !userSyncDependencies.browserSupportsCookies || hasFired) {
return;
}
try {
// Image pixels
fireImagePixels();
// Iframe syncs
loadIframes();
} catch (e) {
return utils.logError('Error firing user syncs', e);
}
// Reset the user sync queue
queue = getDefaultQueue();
hasFired = true;
}
/**
* @function fireImagePixels
* @summary Loops through user sync pixels and fires each one
* @private
*/
function fireImagePixels() {
if (!(usConfig.pixelEnabled || permittedPixels.image)) {
return;
}
// 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
utils.shuffle(queue.image).forEach(function (sync) {
var _sync = _slicedToArray(sync, 2),
bidderName = _sync[0],
trackingPixelUrl = _sync[1];
// utils.logMessage(`Invoking image pixel user sync for bidder: ${bidderName}`);
biddr.listeners.send('User Sync Bidder: ', bidderName);
biddr.listeners.send('User Sync Pixel:', trackingPixelUrl);
if (!biddr.gdprApplies) {
// BRTCFD-1276:
// dupe up the userSyncs data for v2;
biddr.analytics.userSyncs = biddr.analytics.userSyncs || [];
biddr.v2.analytics.userSyncs = biddr.v2.analytics.userSyncs || [];
biddr.analytics.userSyncs.push(bidderName);
biddr.v2.analytics.userSyncs.push(bidderName);
}
// Create image object and add the src url
utils.triggerPixel(trackingPixelUrl);
});
}
/**
* @function loadIframes
* @summary Loops through iframe syncs and loads an iframe element into the page
* @private
*/
function loadIframes() {
if (!(usConfig.iframeEnabled || permittedPixels.iframe)) {
return;
}
// Randomize the order of these syncs just like the pixels above
utils.shuffle(queue.iframe).forEach(function (sync) {
var _sync2 = _slicedToArray(sync, 2),
bidderName = _sync2[0],
iframeUrl = _sync2[1];
utils.logMessage('Invoking iframe user sync for bidder: ' + bidderName);
// Insert iframe into DOM
utils.insertUserSyncIframe(iframeUrl);
});
}
/**
* @function incrementAdapterBids
* @summary Increment the count of user syncs queue for the adapter
* @private
* @params {object} numAdapterBids The object contain counts for all adapters
* @params {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
* @params {string} type The type of the sync including image, iframe
* @params {string} bidder The name of the adapter. e.g. "rubicon"
* @params {string} url Either the pixel url or iframe url depending on the type
* @example