{"version":3,"file":"bundle.4674.efc994142c0f9d4c0cf162ccaa4a6576.js","mappings":"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","sources":["webpack://ws-tagging/./node_modules/ws-scripts/modules/logger.js","webpack://ws-tagging/./src/utils/createNestedObject.js","webpack://ws-tagging/./src/utils/putInArrayIfNotArray.js","webpack://ws-tagging/./src/utils/create.js","webpack://ws-tagging/./src/utils/scripts.js","webpack://ws-tagging/./src/utils/previousData.js","webpack://ws-tagging/./src/utils/objectMutator.js","webpack://ws-tagging/./src/utils/copyPayload.js","webpack://ws-tagging/./src/utils/reportToEventViewer.js","webpack://ws-tagging/./src/utils/cloneObject.js","webpack://ws-tagging/./src/utils/executeObjectFunctions.js","webpack://ws-tagging/./src/utils/jsonStringifyWithFunctions.js","webpack://ws-tagging/./src/utils/dataMapper.js","webpack://ws-tagging/./src/utils/eventShouldBeTracked.js","webpack://ws-tagging/./src/utils/inTestSuite.js","webpack://ws-tagging/./src/utils/logIfNotInTestSuite.js","webpack://ws-tagging/./src/utils/nrSwitcher.js","webpack://ws-tagging/./node_modules/process/browser.js","webpack://ws-tagging/./node_modules/ws-scripts/src/global/logger/index.js","webpack://ws-tagging/./node_modules/ws-scripts/src/global/logger/logger-browser.js","webpack://ws-tagging/./node_modules/ws-scripts/src/global/logger/logger-common.js"],"sourcesContent":["module.exports = {\n\t...require('../src/global/logger')\n};\n","// https://newbedev.com/javascript-how-to-dynamically-create-nested-objects-using-object-names-given-by-an-array\n\n/**\n *\n * @param {Object} base - Base object to create nested object from\n * @param {string} path - Dot notation string such as 'aaa.bbb.ccc' which is turned into nested objects on 'base'\n * @param {*} val - Default value which base.path will be set to.\n * @description This method will create a nested object on 'base' by creating objects from the dot notation string in 'path'.\n * @example\n * // base = window\n * // path = 'aaa.bbb.ccc'\n * // val = 'ddd'\n * // window:\n * {\n * \t\taaa: {\n * \t\t\tbbb: {\n * \t\t\t\tccc: 'ddd'\n * \t\t\t}\n * \t\t}\n * }\n */\nconst createNestedObject = (base, path, val) => {\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tconst lastObj = keys.reduce((obj, key) => {\n\t\t// intentional as we do want to modify the previous value\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tobj[key] = obj[key] || {};\n\t\treturn obj[key];\n\t}, base);\n\tlastObj[lastKey] = val;\n};\n\nexport default createNestedObject;\n","/*\n\tPuts something in an array if it is not array.\n\tMade because we support things a schema where one or more items may be tested.\n*/\n/**\n *\n * @param {*} item - The thing you want to put in an array\n * @returns The item in an array if it's not already an array. This was made because there are a few places\n * in this widget where we support thing1: '{}' or thing2: [{},{}] and we just turn the thing1 into an array\n * in the code before moving on.\n */\nconst putInArrayIfNotInArray = (item) => (Array.isArray(item) ? item : [item]);\n\nexport default putInArrayIfNotInArray;\n","import createNestedObject from './createNestedObject';\n\n/**\n *\n * @param {Object} objectOfCreation - An object with each property reprensting something to create.\n * @example\n * objectOfCreation: {\n *\t\trandomNameYouChoose: {\n *\t\t\tobjectPath: 'aaa.bbb', // path to create on window object window.aaa.bbb\n *\t\t\tvalue: 'defaultValue' // default value\n *\t\t}\n *\t}\n */\nconst create = (objectOfCreation, win) => {\n\tObject.values(objectOfCreation).forEach(({ objectPath, value }) => {\n\t\tif (objectPath && value) {\n\t\t\tconst valueCopy = JSON.parse(JSON.stringify(value));\n\t\t\tcreateNestedObject(\n\t\t\t\twin,\n\t\t\t\tobjectPath,\n\t\t\t\tvalueCopy === 'emptyfunc' ? () => {} : valueCopy\n\t\t\t);\n\t\t}\n\t});\n};\n\nexport default create;\n","const scriptsConstants = {\n\tDYNAMIC_SCRIPT_INSERT: 'dynamic-script-insert',\n\tDYNAMIC_SCRIPT_INSERT_WIAPI: 'dynamic-script-insert-wiapi'\n};\n\n/**\n * This is an object of different methods of adding scripts to the site.\n * Import this file and reference the method you want through the scriptsConstants\n */\nconst scripts = {\n\t[scriptsConstants.DYNAMIC_SCRIPT_INSERT]: ({ src }) =>\n\t\tnew Promise((resolve, reject) => {\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.src = src;\n\t\t\tscript.addEventListener('load', resolve);\n\t\t\tscript.addEventListener('error', (e) => reject(e.error));\n\t\t\tdocument.head.appendChild(script);\n\t\t}),\n\t[scriptsConstants.DYNAMIC_SCRIPT_INSERT_WIAPI]: async ({ src, win }) => {\n\t\tconst { APILoader } = win.DDC;\n\t\tconst API = await APILoader.create('ws-tagging');\n\t\treturn API.loadJS(src);\n\t}\n};\n\nexport default scripts;\nexport { scriptsConstants };\n","import createNestedObject from './createNestedObject';\nimport getDotNotationFromString from './getDotNotationFromString';\nimport slugMap from './slugMap';\n\n/**\n *\n * @param {Object} prevDataConfig The prev object from the project configuration\n * @param {string} project The project name from ws-tagging\n * @param {string} grouping The grouping name from ws-tagging\n * @param {Object} window The window object\n * @description Method will loop through prevDataConfig and save any requested items to localStorage\n */\nconst writePrevData = (prevDataConfig, project, grouping, window) => {\n\tconst prev = {};\n\n\t// [slug,] looks funky and it's because we don't need the second argument yet\n\tObject.entries(prevDataConfig).forEach(([slug]) => {\n\t\tconst slugPath = slugMap[slug];\n\t\tconst item = getDotNotationFromString(window.DDC, slugPath);\n\t\tif (item) {\n\t\t\tcreateNestedObject(prev, slugPath.replace('dataLayer.', ''), item);\n\t\t}\n\t});\n\n\tif (Object.keys(prev).length > 0) {\n\t\t// writing this out project/grouping specific to:\n\t\t// - avoid future collisions of multiple tracking projects on one site\n\t\twindow.localStorage.setItem(\n\t\t\t`wsTaggingPrev|${project}|${grouping}`,\n\t\t\tJSON.stringify(prev)\n\t\t);\n\t} else {\n\t\twindow.localStorage.removeItem(`wsTaggingPrev|${project}|${grouping}`);\n\t}\n};\n\n/**\n *\n * @param {string} project The project name from ws-tagging\n * @param {string} grouping The grouping name from ws-tagging\n * @param {Object} window The window object\n * @returns An object of data from the previous page\n */\nexport const getPreviousData = (project, grouping, window) => {\n\treturn JSON.parse(\n\t\twindow.localStorage.getItem(`wsTaggingPrev|${project}|${grouping}`)\n\t);\n};\n\n/**\n *\n * @param {Object} prevDataConfig The prev object from the project configuration\n * @param {string} project The project name from ws-tagging\n * @param {string} grouping The grouping name from ws-tagging\n * @param {Object} window The window object\n * @description Method facilitates populating a localStorage property with data to be used on the next page load\n */\nexport const saveDDCDataLayer = (\n\tprevDataConfig = {},\n\tproject,\n\tgrouping,\n\twindow\n) => {\n\t// initial pass of window.DDC.dataLayer from page load\n\twritePrevData(prevDataConfig, project, grouping, window);\n\n\tif (window?.DDC?.APILoader) {\n\t\t// window.DDC.dataLayer is populated with more data post page load\n\t\t// window.DDC.dataLayer.page.attributes.vehicleResultCount is null until wiapi vehicle-data-updated-v1 triggers\n\t\t(async (APILoader) => {\n\t\t\tconst API = await APILoader.create('ws-tagging');\n\t\t\t// may need what we subscribe to to be configurable in the future\n\t\t\tAPI.subscribe('vehicle-data-updated-v1', () => {\n\t\t\t\t// second call repopulates data now that vehicle data has been updated\n\t\t\t\twritePrevData(prevDataConfig, project, grouping, window);\n\t\t\t});\n\t\t})(window.DDC.APILoader);\n\t}\n};\n\nexport const savePrevEventData = (\n\tprevDataConfigEvents = {},\n\tproject,\n\tgrouping,\n\tevent,\n\teventData,\n\twin\n) => {\n\tconst localStorageKey = `wsTaggingPrevEvents${project}${grouping}`;\n\tconst prevEventData =\n\t\tJSON.parse(win.localStorage.getItem(localStorageKey)) || {};\n\tlet updated = false;\n\tObject.entries(prevDataConfigEvents).forEach(([eventName, properties]) => {\n\t\tif (eventName === event) {\n\t\t\tproperties.forEach((property) => {\n\t\t\t\tif (eventData?.[property]) {\n\t\t\t\t\tconst eventNameNoPeriod = eventName.replaceAll('.', '');\n\t\t\t\t\tprevEventData[eventNameNoPeriod] =\n\t\t\t\t\t\tprevEventData[eventNameNoPeriod] || {};\n\t\t\t\t\tprevEventData[eventNameNoPeriod][property] =\n\t\t\t\t\t\teventData[property];\n\t\t\t\t\tupdated = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\tif (updated) {\n\t\tlocalStorage.setItem(localStorageKey, JSON.stringify(prevEventData));\n\t}\n\treturn prevEventData;\n};\n","import isObject from './isObject';\nimport mutateItem, { STRIP_RETURN_CHARS, TO_LOWER_CASE } from './mutateItem';\n\nconst mutateObject = (obj, fn) => {\n\tObject.entries(obj).forEach(([key, value]) => {\n\t\tif (isObject(value)) {\n\t\t\tmutateObject(value, fn);\n\t\t} else if (Array.isArray(value)) {\n\t\t\tvalue.forEach((item, index) => {\n\t\t\t\tif (typeof item === 'string') {\n\t\t\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\t\t\tvalue[index] = fn(item);\n\t\t\t\t} else {\n\t\t\t\t\tmutateObject(item, fn);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (typeof value === 'string') {\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tobj[key] = fn(value);\n\t\t}\n\t});\n};\n\n/**\n *\n * @param {Object} obj The object whose values you wish to mutate\n * @param {*} fn A function which will process the value and do something to it\n * @returns\n */\nconst objectMutator = (obj, fn) => {\n\tconst mutatedReplacement = JSON.parse(JSON.stringify(obj));\n\tmutateObject(mutatedReplacement, fn);\n\treturn mutatedReplacement;\n};\n\nexport const stripAndLowerCaseObjectValues = (obj) => {\n\treturn objectMutator(\n\t\tobj,\n\t\tmutateItem.bind(undefined, [TO_LOWER_CASE, STRIP_RETURN_CHARS])\n\t);\n};\n\nexport default objectMutator;\n","/**\n *\n * @param {Object} obj Object to replace things in\n * @returns Object with {{NULL}} and {{UNDEFINED}} special slugs replaced with null/undefined\n *\n * Will not parse through an Array with an overridden push method (something we have done for some reason)\n */\nconst replaceNullAndUndefined = (obj) => {\n\tif (Array.isArray(obj) && obj.push === Array.prototype.push) {\n\t\treturn obj.map((item) => replaceNullAndUndefined(item));\n\t} else if (!Array.isArray(obj) && typeof obj === 'object' && obj !== null) {\n\t\treturn Object.keys(obj).reduce((acc, key) => {\n\t\t\tacc[key] = replaceNullAndUndefined(obj[key]);\n\t\t\treturn acc;\n\t\t}, {});\n\t} else if (obj === '{{UNDEFINED}}') {\n\t\treturn undefined;\n\t} else if (obj === '{{NULL}}') {\n\t\treturn null;\n\t} else {\n\t\treturn obj;\n\t}\n};\n\n/**\n *\n * @param {Object} payload The payload to be copied and have special slugs replaced\n * @param {Object} eventData The current events eventData\n *\n * Copy the payload object and replace any special slugs: {{xxxxxx}}\n *\n * Special slugs:\n * {{UNDEFINED}} - Preserves undefined in the payload\n * {{REMOVEKEY}} - Removes the key from the payload\n * {{EMPTYSTRING}} - Will set value to empty string if special slug is toggled\n * {{EMPTYOBJECT}} - Will set value to empty object if special slug is toggled\n */\nconst copyPayload = (payload) => {\n\tconst exceptions = {};\n\n\tconst payloadStringified = JSON.stringify(payload, (key, value) => {\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.push !== Array.prototype.push) {\n\t\t\t\texceptions[key] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t});\n\n\tconst payloadCopy = JSON.parse(payloadStringified, (key, value) => {\n\t\tlet newValue = value;\n\n\t\tif (value?.includes?.('{{REMOVEKEY}}')) {\n\t\t\tnewValue = undefined;\n\t\t} else if (value?.includes?.('{{EMPTYSTRING}}')) {\n\t\t\tnewValue = '';\n\t\t} else if (value?.includes?.('{{EMPTYOBJECT}}')) {\n\t\t\tnewValue = {};\n\t\t}\n\n\t\tif (exceptions[key]) {\n\t\t\tnewValue = exceptions[key];\n\t\t}\n\n\t\treturn newValue;\n\t});\n\n\treturn replaceNullAndUndefined(payloadCopy);\n};\n\nexport default copyPayload;\n","/**\n\nSends data to the Event Viewer component (ws-event-viewer) by dispatching a CustomEvent with the provided parameters.\n@param {object} data - The data to be sent to the Event Viewer.\n@param {string} event - The name of the event to be sent to the Event Viewer.\n@param {string} name - The name of the project.\n@param {string} sender - The sender of the data to be sent to the Event Viewer.\n@param {string} senders - A list of senders of the data to be sent to the Event Viewer.\n@returns {void}\n*/\nconst reportToEventViewer = ({\n\tproject,\n\tpayload,\n\tevent,\n\t...additionalAttributes\n}) => {\n\tconst report = () => {\n\t\t// dispatch data for the Event Viewer (ws-event-viewer)\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent('eventViewerData', {\n\t\t\t\tdetail: {\n\t\t\t\t\tcommon: {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t\tsource: 'ws-tagging',\n\t\t\t\t\t\tproject,\n\t\t\t\t\t\t...additionalAttributes\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t};\n\tif (window?.DDC?.WidgetData?.['ws-event-viewer']?.ready) {\n\t\treport();\n\t} else {\n\t\twindow.addEventListener(\n\t\t\t'wsEventViewerReady',\n\t\t\t() => {\n\t\t\t\treport();\n\t\t\t},\n\t\t\t{\n\t\t\t\tonce: true\n\t\t\t}\n\t\t);\n\t}\n};\n\nexport default reportToEventViewer;\n","const cloneObject = (obj) => {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj;\n\t}\n\n\tif (obj instanceof Function) {\n\t\treturn obj;\n\t}\n\n\tif (obj instanceof Date) {\n\t\treturn new Date(obj);\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map((item) => cloneObject(item));\n\t}\n\n\tif (typeof obj === 'object') {\n\t\tconst copiedObj = {};\n\t\tObject.keys(obj).forEach((key) => {\n\t\t\tcopiedObj[key] = cloneObject(obj[key]);\n\t\t});\n\t\treturn copiedObj;\n\t}\n\treturn undefined;\n};\n\nexport default cloneObject;\n","const executeObjectFunctions = (obj, ...args) => {\n\tif (\n\t\tobj === null ||\n\t\t(typeof obj !== 'object' && typeof obj !== 'function')\n\t) {\n\t\treturn obj;\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map((item) => executeObjectFunctions(item, ...args));\n\t} else if (typeof obj === 'function') {\n\t\treturn obj(...args); // Execute the function with provided arguments\n\t} else if (typeof obj === 'object') {\n\t\tconst executedObj = {};\n\t\tObject.keys(obj).forEach((key) => {\n\t\t\tconst value = obj[key];\n\t\t\tif (typeof value === 'function') {\n\t\t\t\texecutedObj[key] = value(...args); // Execute the function with provided arguments\n\t\t\t} else {\n\t\t\t\texecutedObj[key] = executeObjectFunctions(value, ...args); // Recursively process non-function values\n\t\t\t}\n\t\t});\n\t\treturn executedObj;\n\t}\n\n\treturn obj;\n};\n\nexport default executeObjectFunctions;\n","/**\n *\n * @param {*} potentialObject - The thing you want to test to see if it's an object\n * @returns True if the potentialObject has the typeof 'object' and it's not an array and it's not null\n */\nconst jsonStringifyWithFunctions = (obj) => {\n\treturn JSON.stringify(obj, (key, val) => {\n\t\treturn typeof val === 'function' ? val.toString() : val;\n\t});\n};\n\nexport default jsonStringifyWithFunctions;\n","import { addNewRelicPageAction } from 'ddc-new-relic';\nimport isObject from './isObject';\nimport getDotNotationFromString from './getDotNotationFromString';\nimport putInArrayIfNotArray from './putInArrayIfNotArray';\nimport create from './create';\nimport createNestedObject from './createNestedObject';\nimport scripts from './scripts';\nimport {\n\tgetPreviousData,\n\tsaveDDCDataLayer,\n\tsavePrevEventData\n} from './previousData';\nimport vehicleDataUpdated from './vehicleDataUpdated';\nimport logIfNotInTestSuite from './logIfNotInTestSuite';\nimport mutateItem from './mutateItem';\nimport objectMutator from './objectMutator';\nimport formatSlugs from './formatSlugs';\nimport replaceSlugs from './replaceSlugs';\nimport getReplacement from './getReplacement';\nimport eventShouldBeTracked from './eventShouldBeTracked';\nimport copyPayload from './copyPayload';\nimport reportToEventViewer from './reportToEventViewer';\nimport getEnv from './getEnv';\nimport cloneObject from './cloneObject.js';\nimport executeObjectFunctions from './executeObjectFunctions.js';\nimport nrSwitcherOn from './nrSwitcher';\nimport jsonStringifyWithFunctions from './jsonStringifyWithFunctions';\n\nconst uuidsShown = new Set();\nlet flags;\n\nconst VEHICLE_ATTRS = [\n\t'accountId',\n\t'askingPrice',\n\t'autodataCaId',\n\t'bodyStyle',\n\t'certified',\n\t'chromeId',\n\t'cityFuelEconomy',\n\t'classification',\n\t'dealerCodes',\n\t'doors',\n\t'driveLine',\n\t'engine',\n\t'engineSize',\n\t'exteriorColor',\n\t'finalPrice',\n\t'fuelType',\n\t'highestPrice',\n\t'highwayFuelEconomy',\n\t'images',\n\t'interiorColor',\n\t'internetPrice',\n\t'inventoryType',\n\t'link',\n\t'make',\n\t'model',\n\t'modelCode',\n\t'msrp',\n\t'odometer',\n\t'optionCodes',\n\t'retailValue',\n\t'salePrice',\n\t'startingPrice',\n\t'status',\n\t'stockNumber',\n\t'transmission',\n\t'trim',\n\t'uuid',\n\t'vin',\n\t'year'\n];\n\n/**\n *\n * @param {Object} vehicle A vehicle object to be converted to the WIAPI vehicle spec\n * @returns A vehicle object matching the WIAPI vehicle spec.\n *\n * Currently supports an object where the keys are lowercase versions of what the WIAPI returns.\n * An address, dealerCodes, and images objects are created to match the WIAPI as well\n */\nconst getWIAPIVehicle = (win, vehicle) => {\n\tconst newVehicle = {\n\t\taddress: {\n\t\t\taccountName: undefined,\n\t\t\tcity: vehicle?.city,\n\t\t\tstate: vehicle?.state,\n\t\t\tstreet: vehicle?.address,\n\t\t\tpostalCode: vehicle?.zipcode,\n\t\t\tcountry: undefined\n\t\t}\n\t};\n\n\tVEHICLE_ATTRS.forEach((attr) => {\n\t\tconst value = vehicle?.[attr?.toLowerCase()];\n\n\t\tif (value && value !== 'null') {\n\t\t\tnewVehicle[attr] = value;\n\t\t}\n\t});\n\n\tnewVehicle.dealerCodes = win?.DDC?.dataLayer?.dealership?.dealerCode;\n\tnewVehicle.images =\n\t\tvehicle?.images && Array.isArray(vehicle?.images)\n\t\t\t? vehicle?.images\n\t\t\t: vehicle?.images?.split(',');\n\n\treturn newVehicle;\n};\n\nconst pushToFirehose = (message, DDC, featureFlags) => {\n\tif (\n\t\t(message?.event?.startsWith('ddc.') ||\n\t\t\t['userEvent', 'specialsEvent', 'widgetUserEvent'].includes(\n\t\t\t\tmessage?.event\n\t\t\t)) &&\n\t\t/^[A-Za-z.]+$/.test(message?.event)\n\t) {\n\t\tlet eventCategory = 'ddcEvent';\n\t\tlet eventName = message.event;\n\t\tlet payload = message;\n\t\tif (!message.event.startsWith('ddc.')) {\n\t\t\teventCategory = message.event;\n\t\t}\n\t\tif (eventCategory === 'widgetUserEvent') {\n\t\t\teventName = message.widgetName;\n\t\t} else if (eventCategory === 'userEvent') {\n\t\t\teventName = message.eventAction;\n\t\t} else if (eventCategory === 'specialsEvent') {\n\t\t\teventName = message.specialType;\n\t\t}\n\t\tif (message?.eventData?.vehicle) {\n\t\t\tconst {\n\t\t\t\teventData: {\n\t\t\t\t\tvehicle: {\n\t\t\t\t\t\tfeatures: _features,\n\t\t\t\t\t\timages: _images,\n\t\t\t\t\t\t...restOfVehicle\n\t\t\t\t\t},\n\t\t\t\t\t...restOfEventData\n\t\t\t\t},\n\t\t\t\t...restOfMessage\n\t\t\t} = message;\n\t\t\tpayload = {\n\t\t\t\t...restOfMessage,\n\t\t\t\teventData: {\n\t\t\t\t\t...restOfEventData,\n\t\t\t\t\tvehicle: {\n\t\t\t\t\t\timages: [],\n\t\t\t\t\t\t...restOfVehicle\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\teventCategory === 'ddcEvent' &&\n\t\t\tpayload?.eventData &&\n\t\t\ttypeof payload.eventData === 'object'\n\t\t) {\n\t\t\t/* If this is a ddc.x event, the real data is store in payload.eventData, flatten this for easier aggragation */\n\t\t\tpayload = payload.eventData;\n\t\t}\n\t\tDDC.pushToFirehose(\n\t\t\teventCategory,\n\t\t\teventName,\n\t\t\t{\n\t\t\t\t...payload,\n\t\t\t\t...(typeof payload.element !== 'string' && { element: '' }),\n\t\t\t\t...(typeof payload.elementCTA !== 'string' && {\n\t\t\t\t\telementCTA: ''\n\t\t\t\t})\n\t\t\t},\n\t\t\tfeatureFlags?.['ws-tagging-firehose'] || 1\n\t\t);\n\t}\n};\n\n/**\n * Creates a new MappingConfiguration\n * @class\n * @param {Object} configuration - A tracking project configuration.\n * @param {string} name - The name of the tracking project.\n */\nclass MappingConfiguration {\n\tconstructor(configuration, name) {\n\t\tconst {\n\t\t\tgrouping,\n\t\t\tconfiguration: {\n\t\t\t\tcreate: objectOfCreation = false,\n\t\t\t\tlookups,\n\t\t\t\tpreviousData: previousDataConfig = {},\n\t\t\t\tsendingLogic = {}\n\t\t\t} = false,\n\t\t\tevent: {\n\t\t\t\tevents = false,\n\t\t\t\ttriggerEvents = false,\n\t\t\t\tfireGroups = false\n\t\t\t} = false,\n\t\t\tutils = {},\n\t\t\tpreview = false\n\t\t} = configuration;\n\n\t\t// allows looking up anything in DDC.WdigetData['ws-tagging'].mapping.xxxxxx\n\t\t// ex. [[mapping.pagealias.pageType]]\n\t\t// ex. [[mapping.form.init.SERVICE_APPT]]\n\t\tthis.mapping = configuration;\n\n\t\t// THOUGHTS: should there be this.event.events, this.event.triggerEvents, this.event.fireGroups or keep like below?\n\t\tthis.event = events;\n\t\tthis.triggerEvents = triggerEvents;\n\t\tthis.fireGroups = fireGroups;\n\n\t\t// this is the configuration for a tagging project\n\t\t// sendData, sharedPayloads, scripts, create, looksups are all things you will find in this\n\t\tthis.configuration = configuration.configuration;\n\n\t\tthis.name = name;\n\t\tthis.grouping = grouping;\n\t\tthis.prevData = getPreviousData(name, grouping, window);\n\t\tthis.preview = preview;\n\t\tthis.scriptsLoaded = new Set();\n\t\tthis.sendingLogic = sendingLogic;\n\t\tthis.lookups = lookups;\n\t\tthis.utils = utils;\n\t\tthis.triggeredEvents = new Map();\n\t\tthis.firedGroups = new Map();\n\n\t\tconst prevEventDataKey = `wsTaggingPrevEvents${name}${grouping}`;\n\t\tconst prevEventData = JSON.parse(\n\t\t\tlocalStorage.getItem(prevEventDataKey)\n\t\t);\n\t\tthis.mapping.prevEventData = prevEventData;\n\t\tlocalStorage.removeItem(prevEventDataKey);\n\n\t\t// don't create things when in preview mode\n\t\tif (!preview && objectOfCreation) {\n\t\t\tcreate(objectOfCreation, window);\n\t\t}\n\n\t\tsaveDDCDataLayer(\n\t\t\tpreviousDataConfig?.ddcDataLayer,\n\t\t\tname,\n\t\t\tgrouping,\n\t\t\twindow\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @param {Object} replacement Current replacement value at time of function call\n\t * @returns string\n\t * @description Mutate every value of an object with globalPayloadMutators\n\t */\n\thandleGlobalPayloadMutators(replacement) {\n\t\tconst mutators = this.configuration?.globalPayloadMutators;\n\t\treturn mutators\n\t\t\t? objectMutator(replacement, mutateItem.bind(undefined, mutators))\n\t\t\t: replacement;\n\t}\n\n\t/**\n\t *\n\t * @param {Object} logic - Object that includes the mustNotInclude and/or mustNotExist and/or mustInclude objects.\n\t * The dot notation string follows the slug logic.\n\t * @param {Object} eventData - The data from the current event\n\t * @returns {boolean}\n\t * @example\n\t *\n\t * logic:\n\t * {\n\t * \tmustInclude|mustIncludeOr|mustNotInclude|mustNotEqual|mustEqual|mustEqualOr: {\n\t * \t 'slugVal': 'testVal'\n\t * }\n\t * }\n\t *\n\t * @description This method returns:\n\t * mustInclude && mustIncludeOneOf:\n\t * slugVal is undefined: false\n\t * testVal is *: true\n\t * slugVal includes testVal: true\n\t * mustNotInclude:\n\t * slugVal is undefined: true\n\t * slugVal and testVal are '': false\n\t * testVal is an '': true\n\t * testVal is *: false\n\t * slugVal includes testVal: false\n\t * mustNotEqual:\n\t * testVal is {{EMPTYSTRING}} and slugVal is '': false\n\t * slugVal is undefined and testVal is not '' and slugVal is not '': true\n\t * testVal is *: false\n\t * slugVal equals testVal: false\n\t * mustEqual && mustEqualOneOf\n\t * testVal is {{EMPTYSTRING}} and slugVal is '': true\n\t * testVal is *: true\n\t * slugVal equals testVal: true\n\t * slugVal is undefined and testVal is undefined: true\n\t *\n\t * The 'or' versions of functions only require one of the items in the array to pass.\n\t */\n\ttestLogic = (logicValue, eventData, element) => {\n\t\tif (typeof logicValue === 'function') {\n\t\t\treturn logicValue({\n\t\t\t\teventData,\n\t\t\t\tmapping: this.mapping,\n\t\t\t\tutils: this.utils,\n\t\t\t\tlookups: this.lookups,\n\t\t\t\tflags,\n\t\t\t\telement\n\t\t\t});\n\t\t}\n\t\tconst {\n\t\t\tmustEqual = false,\n\t\t\tmustEqualOneOf = false,\n\t\t\tmustInclude = false,\n\t\t\tmustIncludeOneOf = false,\n\t\t\tmustNotEqual = false,\n\t\t\tmustNotInclude = false\n\t\t} = logicValue;\n\t\tlet result = true;\n\n\t\tif (\n\t\t\tmustEqual ||\n\t\t\tmustEqualOneOf ||\n\t\t\tmustInclude ||\n\t\t\tmustIncludeOneOf ||\n\t\t\tmustNotEqual ||\n\t\t\tmustNotInclude\n\t\t) {\n\t\t\tconst test = (entries, type) => {\n\t\t\t\treturn (\n\t\t\t\t\t!entries ||\n\t\t\t\t\tObject.entries(entries).every(\n\t\t\t\t\t\t([testKey, testValMaybeArray]) => {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t// support testing an array of items\n\t\t\t\t\t\t\t\t\"mustNotInclude\": {\n\t\t\t\t\t\t\t\t\t\"eventData.url\": [\"cool\",\"site\"]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tconst testValArr = !Array.isArray(testValMaybeArray)\n\t\t\t\t\t\t\t\t? [testValMaybeArray]\n\t\t\t\t\t\t\t\t: testValMaybeArray;\n\n\t\t\t\t\t\t\tconst testValArrType =\n\t\t\t\t\t\t\t\tmustEqualOneOf || mustIncludeOneOf\n\t\t\t\t\t\t\t\t\t? 'some'\n\t\t\t\t\t\t\t\t\t: 'every';\n\n\t\t\t\t\t\t\treturn testValArr[testValArrType]((testVal) => {\n\t\t\t\t\t\t\t\tconst slugVal = getReplacement({\n\t\t\t\t\t\t\t\t\tstr: testKey,\n\t\t\t\t\t\t\t\t\teventData,\n\t\t\t\t\t\t\t\t\tmapping: this.mapping,\n\t\t\t\t\t\t\t\t\tutils: this.utils,\n\t\t\t\t\t\t\t\t\tlookups: this.lookups,\n\t\t\t\t\t\t\t\t\tflags\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tlet pass = true;\n\t\t\t\t\t\t\t\tconst slugValUndefined =\n\t\t\t\t\t\t\t\t\ttypeof slugVal === 'undefined';\n\t\t\t\t\t\t\t\tconst wildcard = testVal === '*';\n\t\t\t\t\t\t\t\tconst testValEmptyString = testVal === '';\n\t\t\t\t\t\t\t\tconst slugValEmptyString = slugVal === '';\n\t\t\t\t\t\t\t\tconst emptyStringMatch =\n\t\t\t\t\t\t\t\t\ttestValEmptyString && slugValEmptyString;\n\n\t\t\t\t\t\t\t\tif (type === 'include') {\n\t\t\t\t\t\t\t\t\tif (slugValUndefined) {\n\t\t\t\t\t\t\t\t\t\tpass = false;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tpass =\n\t\t\t\t\t\t\t\t\t\t\twildcard ||\n\t\t\t\t\t\t\t\t\t\t\tString(slugVal).includes(testVal);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (type === 'notinclude') {\n\t\t\t\t\t\t\t\t\tif (slugValUndefined) {\n\t\t\t\t\t\t\t\t\t\tpass = true;\n\t\t\t\t\t\t\t\t\t} else if (emptyStringMatch) {\n\t\t\t\t\t\t\t\t\t\tpass = false;\n\t\t\t\t\t\t\t\t\t} else if (testValEmptyString) {\n\t\t\t\t\t\t\t\t\t\tpass = true;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tpass =\n\t\t\t\t\t\t\t\t\t\t\t!wildcard &&\n\t\t\t\t\t\t\t\t\t\t\t!String(slugVal).includes(testVal);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (type === 'notequal') {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\ttestVal === '{{EMPTYSTRING}}' &&\n\t\t\t\t\t\t\t\t\t\tslugVal === ''\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tpass = false;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tslugValUndefined &&\n\t\t\t\t\t\t\t\t\t\t!testValEmptyString &&\n\t\t\t\t\t\t\t\t\t\t!emptyStringMatch\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tpass = true;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tpass = !wildcard && slugVal !== testVal;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (type === 'equal') {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\ttestVal === '{{EMPTYSTRING}}' &&\n\t\t\t\t\t\t\t\t\t\tslugVal === ''\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tpass = true;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tpass = wildcard || slugVal === testVal;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn pass;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tresult =\n\t\t\t\ttest(mustEqual, 'equal') &&\n\t\t\t\ttest(mustEqualOneOf, 'equal') &&\n\t\t\t\ttest(mustNotInclude, 'notinclude') &&\n\t\t\t\ttest(mustNotEqual, 'notequal') &&\n\t\t\t\ttest(mustInclude, 'include') &&\n\t\t\t\ttest(mustIncludeOneOf, 'include');\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t/**\n\t *\n\t * @param {Object} logic - Logic rule from the event configuration\n\t * @param {Object} eventData - The data from the current event\n\t * @returns {boolean} Whether the rules passes or not.\n\t */\n\ttestRule(logic, eventData = {}, element) {\n\t\tconst {\n\t\t\tmustExist = false,\n\t\t\t// we do not care about the next three but do not want them in the properties\n\t\t\t// _ avoids linter error\n\t\t\tmustEqual: _mustEqual,\n\t\t\tmustInclude: _mustInclude,\n\t\t\tmustNotEqual: _mustNotEqual,\n\t\t\tmustNotInclude: _mustNotInclue,\n\t\t\t...properties\n\t\t} = logic;\n\n\t\treturn (\n\t\t\t(!mustExist ||\n\t\t\t\tputInArrayIfNotArray(mustExist).every(\n\t\t\t\t\t(test) =>\n\t\t\t\t\t\ttypeof replaceSlugs({\n\t\t\t\t\t\t\tinput: test,\n\t\t\t\t\t\t\teventData,\n\t\t\t\t\t\t\tmapping: this.mapping,\n\t\t\t\t\t\t\tutils: this.utils,\n\t\t\t\t\t\t\tlookups: this.lookups,\n\t\t\t\t\t\t\tflags\n\t\t\t\t\t\t}) !== 'undefined'\n\t\t\t\t)) &&\n\t\t\tthis.testLogic(logic, eventData, element) &&\n\t\t\tObject.entries(properties).every(\n\t\t\t\t([key, value]) => {\n\t\t\t\t\t/*\n\t\t\t\t\tSupport logic like:\n\t\t\t\t\t{\n\t\t\t\t\t\t'eventData.attributes.data-phone-ref': 'SALES'\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\tconst replacement = getReplacement({\n\t\t\t\t\t\tstr: key,\n\t\t\t\t\t\teventData,\n\t\t\t\t\t\tmapping: this.mapping,\n\t\t\t\t\t\tutils: this.utils,\n\t\t\t\t\t\tlookups: this.lookups,\n\t\t\t\t\t\tflags\n\t\t\t\t\t});\n\n\t\t\t\t\t// this allows testing of boolean false\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof replacement === 'boolean' &&\n\t\t\t\t\t\ttypeof value === 'boolean'\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn replacement === value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst test = replacement || eventData[key];\n\n\t\t\t\t\t\tif (typeof test === 'string') {\n\t\t\t\t\t\t\treturn test?.includes(value);\n\t\t\t\t\t\t} else if (typeof test === 'boolean') {\n\t\t\t\t\t\t\treturn test === value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// if the mapping is set to look for something that doesn't exist in the eventData the optional chaining prevents a js error\n\n\t\t\t\t/*\n\t\t\t\t\tlogic: {\n\t\t\t\t\t\t'eventData.attributes.data-phone-ref': 'SALES'\n\t\t\t\t\t}\n\t\t\t\t*/\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @param {String} fireGroup - The group the event is part of\n\t * @returns Whether the fireGroup meets the criteria to pass\n\t * If there is no count for the fireGroup then returns true and message logged\n\t * If count is zero then returns true and message logged\n\t * If count > 0 then true returned if fireGroup tally is less than the count\n\t * Side effect: function tallys fireGroup count for use in this function\n\t */\n\ttestFireGroup(fireGroup) {\n\t\tlet fireGroupPass = true;\n\t\tif (fireGroup) {\n\t\t\tconst operationsToRun = Object.keys(this?.fireGroups?.[fireGroup]);\n\t\t\t/* Update to support an array of operations when we support triggering from here. */\n\t\t\tswitch (operationsToRun[0]) {\n\t\t\t\tcase undefined: {\n\t\t\t\t\tlogIfNotInTestSuite({\n\t\t\t\t\t\tmsg: 'An operation is required when using a fireGroup'\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'maxCount': {\n\t\t\t\t\tconst maxCount = this?.fireGroups?.[fireGroup]?.maxCount;\n\t\t\t\t\tif (maxCount === 0) {\n\t\t\t\t\t\tlogIfNotInTestSuite({\n\t\t\t\t\t\t\tmsg: 'maxCount can not be zero'\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst firedGroupCount = this.firedGroups.get(fireGroup);\n\n\t\t\t\t\t\tif (!firedGroupCount) {\n\t\t\t\t\t\t\tthis.firedGroups.set(fireGroup, 1);\n\t\t\t\t\t\t} else if (firedGroupCount < maxCount) {\n\t\t\t\t\t\t\tthis.firedGroups.set(\n\t\t\t\t\t\t\t\tfireGroup,\n\t\t\t\t\t\t\t\tfiredGroupCount + 1\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfireGroupPass = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'minCount': {\n\t\t\t\t\tconst minCount = this?.fireGroups?.[fireGroup]?.minCount;\n\t\t\t\t\tif (minCount === 0) {\n\t\t\t\t\t\tlogIfNotInTestSuite({\n\t\t\t\t\t\t\tmsg: 'minCount can not be zero'\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst firedGroupCount = this.firedGroups.get(fireGroup);\n\n\t\t\t\t\t\tif (firedGroupCount >= minCount) {\n\t\t\t\t\t\t\tfireGroupPass = true;\n\t\t\t\t\t\t} else if (!firedGroupCount) {\n\t\t\t\t\t\t\tfireGroupPass = false;\n\t\t\t\t\t\t\tthis.firedGroups.set(fireGroup, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfireGroupPass = false;\n\t\t\t\t\t\t\tthis.firedGroups.set(\n\t\t\t\t\t\t\t\tfireGroup,\n\t\t\t\t\t\t\t\tfiredGroupCount + 1\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (fireGroupPass && operationsToRun.length) {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('wsTaggingRuleMatch', {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tdata: fireGroup,\n\t\t\t\t\t\t\ttype: 'fireGroup'\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn fireGroupPass;\n\t}\n\n\t/**\n\t *\n\t * @param {Object} eventData - The data from the current event\n\t * @param {Object} rules - Object of a specific events rule or array of rules and their payloads w/ associated logic\n\t * and whatever else we put in there\n\t * @returns The rule that has the payload to send to the third party or undefined if no rule found or one should not be sent\n\t * @example\n\t * // possible return value:\n\t * {\n\t * \tlogic: {...},\n\t * \tpayload: {...}\n\t * }\n\t */\n\tgetRule(eventData, rules, element) {\n\t\tlet mutableMapping = cloneObject(rules);\n\n\t\tif (!Array.isArray(mutableMapping)) {\n\t\t\t// support simple mappings with no logic\n\t\t\tif (!mutableMapping.logic) {\n\t\t\t\treturn mutableMapping;\n\t\t\t}\n\n\t\t\t// support simple mappings with logic\n\t\t\tmutableMapping = [mutableMapping];\n\t\t}\n\n\t\t// support mappings with multiple rules\n\t\treturn mutableMapping.find((rule) => {\n\t\t\tconst { fireGroup = false } = rule;\n\n\t\t\tconst rulePass =\n\t\t\t\trule.logic &&\n\t\t\t\tputInArrayIfNotArray(rule.logic).some((logic) =>\n\t\t\t\t\tthis.testRule(logic, eventData, element)\n\t\t\t\t);\n\t\t\tconst noLogic = !rule.logic && true; // && true ??? what's this?\n\t\t\tconst fireGroupPass =\n\t\t\t\t(rulePass || noLogic) && this.testFireGroup(fireGroup);\n\n\t\t\treturn (rulePass || noLogic) && fireGroupPass;\n\t\t});\n\t}\n\n\t/**\n\t *\n\t * @param {string} event - The DDC event that was triggered\n\t * @param {string} clientEventName - What the client labels this event as. Not all clients/events will have a value for this.\n\t * @param {Object} eventData - The eventData in the message.\n\t * @param {Object} props - Extra attributes to send to NewRelic\n\t * @param {Object} win - The window object. Passed in mainly to make testing cleaner.\n\t * @param {String} sender - The sender (where the data is going window.utag for example)\n\t */\n\treportToNewRelic({\n\t\tclientEventName,\n\t\tevent,\n\t\teventData = {},\n\t\tsender = '',\n\t\twin = {},\n\t\t...props\n\t}) {\n\t\tif (\n\t\t\teventShouldBeTracked() &&\n\t\t\tnrSwitcherOn(flags, this.name, clientEventName || event)\n\t\t) {\n\t\t\tconst pageTrackingTags =\n\t\t\t\twin?.DDC?.dataLayer?.page?.trackingTags || {};\n\t\t\tconst pageTrackingTagsKeys =\n\t\t\t\tObject.keys(pageTrackingTags).toString();\n\t\t\tconst pageTrackingTagsValues =\n\t\t\t\tObject.values(pageTrackingTags).toString();\n\t\t\tconst eventTrackingTags = eventData?.trackingTags;\n\n\t\t\taddNewRelicPageAction(`${this.name}_send_data`, {\n\t\t\t\teventName: clientEventName || event,\n\t\t\t\t...(eventTrackingTags && { eventTrackingTags }),\n\t\t\t\tmappingGroup: this.grouping,\n\t\t\t\tmappingSource: 'native ws-tagging',\n\t\t\t\t...(pageTrackingTagsKeys && {\n\t\t\t\t\tpageTrackingTags: pageTrackingTagsKeys\n\t\t\t\t}),\n\t\t\t\t...(pageTrackingTagsValues && { pageTrackingTagsValues }),\n\t\t\t\t...props,\n\t\t\t\tsourceEvent: event,\n\t\t\t\twsTaggingPreview: this.preview,\n\t\t\t\t...(sender && { sender }),\n\t\t\t\t...(eventData?.widgetName && {\n\t\t\t\t\twidgetName: eventData.widgetName\n\t\t\t\t})\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param {string|Function|Object[]} sender - Sender can be:\n\t * * string like 'bbb' or 'aaa.bbb' then 'bbb' is set to the payload\n\t * * array then the payload is pushed into it\n\t * * function then the function is called with the payload as the argument\n\t * @param {Object} payload - The payload to send to the third party\n\t * @param {string} senderString - The string from the configuration before\n\t * @returns Whether or not something was sent.\n\t * @description Sends an event to the client\n\t */\n\tsendEvent(\n\t\tsender,\n\t\tpayload,\n\t\tsenderString,\n\t\t{\n\t\t\taddSourceToSecondArgument = false,\n\t\t\taddEventToSecondArgument = false,\n\t\t\tevent = ''\n\t\t} = {}\n\t) {\n\t\tlet sent = false;\n\n\t\ttry {\n\t\t\tif (typeof sender === 'function') {\n\t\t\t\tconst args = [payload];\n\t\t\t\tconst secondArg = {};\n\t\t\t\tif (addSourceToSecondArgument) {\n\t\t\t\t\tsecondArg.source = 'ws-tagging';\n\t\t\t\t}\n\t\t\t\tif (addEventToSecondArgument) {\n\t\t\t\t\tsecondArg.event = event;\n\t\t\t\t}\n\t\t\t\tif (Object.keys(secondArg).length) {\n\t\t\t\t\targs.push(secondArg);\n\t\t\t\t}\n\t\t\t\tsender(...args);\n\t\t\t\tsent = true;\n\t\t\t} else if (Array.isArray(sender)) {\n\t\t\t\tsender.push(payload);\n\t\t\t\tsent = true;\n\t\t\t} else if (typeof sender === 'string') {\n\t\t\t\tcreateNestedObject(window, sender, payload);\n\t\t\t\tsent = true;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogIfNotInTestSuite({\n\t\t\t\tmsg: `Error sending ${senderString}: ${error.message}`\n\t\t\t});\n\t\t}\n\n\t\tif (sent) {\n\t\t\tlogIfNotInTestSuite({\n\t\t\t\tmsg: `Sending payload for ${this.name} to the ${\n\t\t\t\t\ttypeof sender === 'string' ? 'object' : typeof sender\n\t\t\t\t} ${senderString}`\n\t\t\t});\n\t\t}\n\n\t\treturn sent;\n\t}\n\n\tresolveClientEventName({ clientEventName, eventData, payload }) {\n\t\treturn (\n\t\t\tpayload?.[clientEventName] ||\n\t\t\tformatSlugs({\n\t\t\t\tinput: clientEventName,\n\t\t\t\teventData,\n\t\t\t\tconfiguration: this.configuration,\n\t\t\t\tutils: this.utils,\n\t\t\t\tmapping: this.mapping,\n\t\t\t\tflags,\n\t\t\t\tpayload\n\t\t\t}) ||\n\t\t\teventData.event\n\t\t);\n\t}\n\n\tsendEvents(\n\t\tpayloadIn,\n\t\tevent,\n\t\texcludedSender = '',\n\t\teventData = {},\n\t\tsenderOverride\n\t) {\n\t\tconst { reporting: { clientEventName = undefined } = false } =\n\t\t\tthis.configuration;\n\n\t\t// support a custom sender for the event rule\n\t\t// added to array as sendData supports an array of senders\n\t\tconst sendData = senderOverride\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tsender: senderOverride\n\t\t\t\t\t}\n\t\t\t ]\n\t\t\t: this.configuration.sendData;\n\n\t\t// Convert single payloads into an array\n\t\t// This supports a payload being an array of payloads\n\t\tconst payloads = Array.isArray(payloadIn) ? payloadIn : [payloadIn];\n\t\tlet reportsForEventViewer = [];\n\t\tlet reportsForNewRelic = [];\n\n\t\tpayloads.forEach(async (payload) => {\n\t\t\tconst data = copyPayload(payload, eventData);\n\t\t\tconst resolvedClientEventName = this.resolveClientEventName({\n\t\t\t\tclientEventName,\n\t\t\t\teventData,\n\t\t\t\tpayload: data\n\t\t\t});\n\n\t\t\t// if no senderOverride and\n\t\t\t// if a sending util is found then sending is handled there\n\t\t\tif (!senderOverride && this?.utils?.sending) {\n\t\t\t\tconst {\n\t\t\t\t\treportsForEventViewer: reportForEventViewer,\n\t\t\t\t\treportsForNewRelic: reportForNewRelic = {}\n\t\t\t\t} = this.utils.sending({\n\t\t\t\t\tdata,\n\t\t\t\t\tevent,\n\t\t\t\t\teventData,\n\t\t\t\t\tflags,\n\t\t\t\t\t...(this.utils.groupingSending && {\n\t\t\t\t\t\tgroupingSending: this.utils.groupingSending\n\t\t\t\t\t}),\n\t\t\t\t\tmapping: this.mapping,\n\t\t\t\t\tpreview: this.preview,\n\t\t\t\t\twin: window\n\t\t\t\t});\n\n\t\t\t\treportsForEventViewer =\n\t\t\t\t\treportsForEventViewer.concat(reportForEventViewer);\n\t\t\t\treportsForNewRelic =\n\t\t\t\t\treportsForNewRelic.concat(reportForNewRelic);\n\t\t\t} else {\n\t\t\t\tsendData.forEach(\n\t\t\t\t\t({\n\t\t\t\t\t\tsender: senderString,\n\t\t\t\t\t\treport = true,\n\t\t\t\t\t\teventViewer = true,\n\t\t\t\t\t\taddEventToSecondArgument = false,\n\t\t\t\t\t\taddSourceToSecondArgument = false\n\t\t\t\t\t}) => {\n\t\t\t\t\t\tif (eventViewer) {\n\t\t\t\t\t\t\treportsForEventViewer.push({\n\t\t\t\t\t\t\t\tpayload: data,\n\t\t\t\t\t\t\t\tsender: senderString,\n\t\t\t\t\t\t\t\tclientEventName: resolvedClientEventName\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the commas ensure exact matches of what is excluded\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!`,${excludedSender},`.includes(`,${senderString},`)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (report) {\n\t\t\t\t\t\t\t\treportsForNewRelic.push({\n\t\t\t\t\t\t\t\t\tclientEventName: resolvedClientEventName,\n\t\t\t\t\t\t\t\t\tsender: senderString\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst sender = getDotNotationFromString(\n\t\t\t\t\t\t\t\twindow,\n\t\t\t\t\t\t\t\tsenderString\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!this.preview) {\n\t\t\t\t\t\t\t\t// next bit of logic got messy trying to handle senders being functions, arrays, objects\n\t\t\t\t\t\t\t\t// if sender is an object we pass the sender string\n\t\t\t\t\t\t\t\t// otherwise we pass the function/array to call/push to\n\n\t\t\t\t\t\t\t\tconst args = [\n\t\t\t\t\t\t\t\t\tisObject(sender) ? senderString : sender,\n\t\t\t\t\t\t\t\t\tcopyPayload(payload, eventData),\n\t\t\t\t\t\t\t\t\tsenderString\n\t\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\taddEventToSecondArgument ||\n\t\t\t\t\t\t\t\t\taddSourceToSecondArgument\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\targs.push({\n\t\t\t\t\t\t\t\t\t\taddEventToSecondArgument,\n\t\t\t\t\t\t\t\t\t\taddSourceToSecondArgument,\n\t\t\t\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis.sendEvent(...args);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogIfNotInTestSuite({\n\t\t\t\t\t\t\t\tmsg: `Skipping excluded ${senderString} for ${this.name}`\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treportsForNewRelic.forEach(async (report) => {\n\t\t\tconst { clientEventName: reportClientEventName, sender } =\n\t\t\t\tawait report;\n\n\t\t\tthis.reportToNewRelic({\n\t\t\t\t...(reportClientEventName && {\n\t\t\t\t\tclientEventName: reportClientEventName\n\t\t\t\t}),\n\t\t\t\tevent,\n\t\t\t\teventData,\n\t\t\t\tsender,\n\t\t\t\twin: window\n\t\t\t});\n\t\t});\n\n\t\treportsForEventViewer.forEach(async (report) => {\n\t\t\tif (report) {\n\t\t\t\tconst {\n\t\t\t\t\tpayload,\n\t\t\t\t\tclientEventName: reportClientEventName,\n\t\t\t\t\t...additionalAttributes\n\t\t\t\t} = await report;\n\n\t\t\t\tif (payload) {\n\t\t\t\t\treportToEventViewer({\n\t\t\t\t\t\t...(reportClientEventName && {\n\t\t\t\t\t\t\tclientEventName: reportClientEventName\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t\tproject: this.name,\n\t\t\t\t\t\t...additionalAttributes\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t *\n\t * @param {Object} payload - A payload with a 'shared' object\n\t * @param {Object} eventData - The current events data\n\t * @param {Object} rule\n\t * @param {Object} event\n\t * @returns A new object with only the specific 'shared' part resolved\n\t */\n\treduceSharedPayload = (payloadIn, eventData, rule, event, element) => {\n\t\tconst payloads = Array.isArray(payloadIn) ? payloadIn : [payloadIn];\n\n\t\tconst resolvedPayloads = payloads.map((payload) => {\n\t\t\tconst { shared = [], ...rest } = payload;\n\t\t\treturn shared.reduce(\n\t\t\t\t(partialObject, currentItem) => {\n\t\t\t\t\tlet mergedObject;\n\n\t\t\t\t\t// conditional shared payload\n\t\t\t\t\tif (currentItem?.logic && currentItem?.payload) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.testRule(currentItem.logic, eventData, element)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// in an events shared payload array each passing rule overwrites previous things\n\t\t\t\t\t\t\tmergedObject = {\n\t\t\t\t\t\t\t\t...partialObject,\n\t\t\t\t\t\t\t\t...currentItem.payload\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\t\t\tnew CustomEvent('wsTaggingRuleMatch', {\n\t\t\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\t\t\tdata: jsonStringifyWithFunctions({\n\t\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\t\t...rule,\n\t\t\t\t\t\t\t\t\t\t\tsharedBlock: currentItem.logic\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\ttype: 'rule'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmergedObject = partialObject;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// the non-shared items of the payload overwrite the shared items\n\t\t\t\t\t\tmergedObject = { ...currentItem, ...partialObject };\n\t\t\t\t\t}\n\n\t\t\t\t\treturn mergedObject;\n\t\t\t\t},\n\t\t\t\t{ ...rest }\n\t\t\t);\n\t\t});\n\n\t\treturn Array.isArray(payloadIn)\n\t\t\t? resolvedPayloads\n\t\t\t: resolvedPayloads[0];\n\t};\n\n\t/**\n\t *\n\t * @param {Object} payload - The events payload which should have shared items resolved\n\t * @param {Object} eventData - The current events data\n\t * @returns A new object with the shared pieces resolved\n\t * @example\n\t * \"payload\": {\n\t * \t\t\"shared\": [\n\t * \t\t\t// anything in the configuration sharedPayload pageView will be\n\t * \t\t\t// overwritten by succeeding items in the events shared array\n\t * \t\t\t\"[[mapping.configuration.sharedPayloads.pageView]]\",\n\t * \t\t\t{\n\t * \t\t\t\t\"logic\": {\n\t * \t\t\t\t\t\"eventData.isModal\": true\n\t * \t\t\t\t},\n\t * \t\t\t\t\"payload\": {\n\t * \t\t\t\t\t\"dialog\": true\n\t * \t\t\t\t}\n\t * \t\t\t}\n\t * \t\t],\n\t * \t\t// overwrites any of the shared items\n\t * \t\t\"nonSharedItem\": 'nonSharedItem'\n\t * }\n\t */\n\tresolveSharedPayload = (payloadIn, eventData, rule, event, element) => {\n\t\tconst payloads = Array.isArray(payloadIn) ? payloadIn : [payloadIn];\n\n\t\tconst resolvedPayloads = payloads.map((payloadInIn) => {\n\t\t\tconst payload = payloadInIn;\n\t\t\t// we could create a recursive function to traverse as many levels of nestedness as needed,\n\t\t\t// for now, maybe just to go one more level is enough\n\t\t\tObject.keys(payload).forEach((key) => {\n\t\t\t\tif (typeof payload[key] === 'object' && payload[key]?.shared) {\n\t\t\t\t\tpayload[key] = this.reduceSharedPayload(\n\t\t\t\t\t\tpayload[key],\n\t\t\t\t\t\teventData,\n\t\t\t\t\t\trule,\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\telement\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn this.reduceSharedPayload(\n\t\t\t\tpayload,\n\t\t\t\teventData,\n\t\t\t\trule,\n\t\t\t\tevent,\n\t\t\t\telement\n\t\t\t);\n\t\t});\n\n\t\treturn Array.isArray(payloadIn)\n\t\t\t? resolvedPayloads\n\t\t\t: resolvedPayloads[0];\n\t};\n\n\t/**\n\t *\n\t * @param {string} whenArg - When the script should be processed.\n\t * @param {string} triggerArg - What triggers the script processing?\n\t * @param {string} eventArg - What event should the script be added during?\n\t * @description The three arguments to this function correspond with where this function is called in the dataMapper.\n\t * If you want a script to be processed in a particular place you set up the configuration scripts object with the same\n\t * arguments that this function is called with. You can see an example of this in the Blast/Genesis configuration.\n\t *\n\t * If multiple scripts are configured to be loaded they happen in the order configured.\n\t * Each script is also fully loaded before the next one loads.\n\t */\n\tasync processScripts(whenArg, triggerArg, eventArg) {\n\t\tconst processScriptsInfo = {\n\t\t\terror: false,\n\t\t\tmessage: '',\n\t\t\tmessages: []\n\t\t};\n\n\t\tif (this.configuration.scripts) {\n\t\t\tconst { when, trigger, event, configs } =\n\t\t\t\tthis.configuration.scripts;\n\n\t\t\tif (\n\t\t\t\twhenArg === when &&\n\t\t\t\ttriggerArg === trigger &&\n\t\t\t\teventArg === event\n\t\t\t) {\n\t\t\t\t// can't use for..of as eslint has some big warning\n\t\t\t\t// also get warning for for loop but disabling the eslint rule for reasons below\n\t\t\t\tfor (let i = 0; i < configs.length; i++) {\n\t\t\t\t\tconst { name, src, srcNp, type } = configs[i];\n\t\t\t\t\tif (!name || !src || !type) {\n\t\t\t\t\t\tprocessScriptsInfo.error = true;\n\t\t\t\t\t\tprocessScriptsInfo.message = `${this.name} ${this.grouping} script not configured correctly:`;\n\t\t\t\t\t\tlogIfNotInTestSuite({\n\t\t\t\t\t\t\tmsg: processScriptsInfo.message\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!name) {\n\t\t\t\t\t\t\tconst message = 'must have a name';\n\t\t\t\t\t\t\tprocessScriptsInfo.messages.push(message);\n\t\t\t\t\t\t\tlogIfNotInTestSuite({ msg: message });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!src) {\n\t\t\t\t\t\t\tconst message = 'must have a src';\n\t\t\t\t\t\t\tprocessScriptsInfo.messages.push(message);\n\t\t\t\t\t\t\tlogIfNotInTestSuite({ msg: message });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!type) {\n\t\t\t\t\t\t\tconst message = 'must have a type';\n\t\t\t\t\t\t\tprocessScriptsInfo.messages.push(message);\n\t\t\t\t\t\t\tlogIfNotInTestSuite({ msg: message });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!this.scriptsLoaded.has(name)) {\n\t\t\t\t\t\t// extra safety check to make sure we don't attempt loading a script twice\n\t\t\t\t\t\tconst srcFromEnv =\n\t\t\t\t\t\t\tsrcNp && getEnv() !== 'prod' ? srcNp : src;\n\t\t\t\t\t\tconst sluglessSrc = replaceSlugs({\n\t\t\t\t\t\t\tinput: srcFromEnv,\n\t\t\t\t\t\t\teventData: undefined,\n\t\t\t\t\t\t\tmapping: this.mapping,\n\t\t\t\t\t\t\tutils: this.utils,\n\t\t\t\t\t\t\tlookups: this.lookups,\n\t\t\t\t\t\t\tflags\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// don't load third party scripts in preview mode\n\t\t\t\t\t\tif (!this.preview) {\n\t\t\t\t\t\t\t// we need these to happen sequentially and for loop is the way to go\n\t\t\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\t\t\tawait scripts[type]({\n\t\t\t\t\t\t\t\tflags,\n\t\t\t\t\t\t\t\tsrc: sluglessSrc,\n\t\t\t\t\t\t\t\twin: window\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.scriptsLoaded.add(name);\n\t\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\t\tnew Event(\n\t\t\t\t\t\t\t\t`ws-tagging-${this.name}-${this.grouping}-script-${name}-loaded`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn Promise.resolve(processScriptsInfo);\n\t}\n\n\tasync handleRule(_rule, event, eventData, element) {\n\t\tconst rule = _rule;\n\t\tif (rule) {\n\t\t\twindow.dispatchEvent(\n\t\t\t\tnew CustomEvent('wsTaggingRuleMatch', {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tdata: jsonStringifyWithFunctions({\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t...rule\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttype: 'rule'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\n\t\tif (rule && rule.payload) {\n\t\t\tawait vehicleDataUpdated(window);\n\n\t\t\trule.payload = executeObjectFunctions(rule.payload, {\n\t\t\t\telement,\n\t\t\t\teventData,\n\t\t\t\tconfiguration: this.configuration,\n\t\t\t\tflags,\n\t\t\t\tmapping: this.mapping,\n\t\t\t\tutils: this.utils\n\t\t\t});\n\n\t\t\t// since rule.payload may change, we need to check again\n\t\t\tif (rule.payload) {\n\t\t\t\t// TODO: This formats the shared payload even if it will not be used due to shared payload logic\n\t\t\t\t// can we resolve shared payload first?\n\t\t\t\tlet payload = formatSlugs({\n\t\t\t\t\tinput: rule.payload,\n\t\t\t\t\teventData,\n\t\t\t\t\tconfiguration: this.configuration,\n\t\t\t\t\tutils: this.utils,\n\t\t\t\t\tmapping: this.mapping,\n\t\t\t\t\tflags\n\t\t\t\t});\n\n\t\t\t\tpayload = this.resolveSharedPayload(\n\t\t\t\t\tpayload,\n\t\t\t\t\teventData,\n\t\t\t\t\trule,\n\t\t\t\t\tevent,\n\t\t\t\t\telement\n\t\t\t\t);\n\t\t\t\tpayload = this.handleGlobalPayloadMutators(payload);\n\n\t\t\t\tconst senderOverride = rule?.sender;\n\n\t\t\t\tif (this.event['ddc.wstagging.first']) {\n\t\t\t\t\tconst firstPromise = new Promise((resolve) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.firstFired ||\n\t\t\t\t\t\t\tevent === 'ddc.wstagging.first'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.firstFired = true;\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst interval = setInterval(() => {\n\t\t\t\t\t\t\t\tif (this.firstFired) {\n\t\t\t\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, 10);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tawait firstPromise;\n\t\t\t\t}\n\n\t\t\t\tthis.sendEvents(\n\t\t\t\t\tpayload,\n\t\t\t\t\tevent,\n\t\t\t\t\trule.excluded,\n\t\t\t\t\teventData,\n\t\t\t\t\tsenderOverride\n\t\t\t\t);\n\n\t\t\t\t// script processing entry point\n\t\t\t\tawait this.processScripts('after', 'event', event);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param {String} triggerName - Name of the event to trigger\n\t * @param {Object} eventData - The current events data\n\t * @returns A matching rule from the configured triggerEvents.\n\t * undefined is returned if the triggerName is not found in the triggerEvents\n\t * undefined is returned if the payload is missing in the triggeredEvent\n\t * undefined is returned if the triggeredEvent does not have passing logic (see getRule)\n\t * undefined is returned if the triggeredEvent has a count and the count has already been met\n\t */\n\tgetTriggeredRule(triggerName, eventData, element) {\n\t\tlet ruleToReturn;\n\n\t\t// const {\n\t\t// \tlogic,\n\t\t// \tpayload,\n\t\t// \tsender,\n\t\t// \tconfiguration: { count } = {}\n\t\t// } = this.triggerEvents?.[triggerName] || {};\n\t\tconst rule = this.triggerEvents?.[triggerName] || {};\n\n\t\tif (!this.triggerEvents?.[triggerName]) {\n\t\t\tlogIfNotInTestSuite({\n\t\t\t\tmsg: `${triggerName} not found in triggerEvents`,\n\t\t\t\tdata: this.triggerEvents\n\t\t\t});\n\t\t} else if (!rule.payload) {\n\t\t\tlogIfNotInTestSuite({\n\t\t\t\tmsg: `payload must exist in the triggerEvent: ${triggerName}`\n\t\t\t});\n\t\t} else {\n\t\t\t// need to make sure logic passes in the rule\n\t\t\tconst triggerRule = this.getRule(eventData, rule, element);\n\n\t\t\tif (triggerRule) {\n\t\t\t\tif (rule?.configuration?.count) {\n\t\t\t\t\tconst triggeredEventCount =\n\t\t\t\t\t\tthis.triggeredEvents.get(triggerName);\n\n\t\t\t\t\tif (!triggeredEventCount) {\n\t\t\t\t\t\tthis.triggeredEvents.set(triggerName, 1);\n\t\t\t\t\t\truleToReturn = triggerRule;\n\t\t\t\t\t} else if (triggeredEventCount < rule.configuration.count) {\n\t\t\t\t\t\tthis.triggeredEvents.set(\n\t\t\t\t\t\t\ttriggerName,\n\t\t\t\t\t\t\ttriggeredEventCount + 1\n\t\t\t\t\t\t);\n\t\t\t\t\t\truleToReturn = triggerRule;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\truleToReturn = triggerRule;\n\t\t\t\t}\n\n\t\t\t\tif (ruleToReturn) {\n\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent('wsTaggingRuleMatch', {\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\tdata: triggerName,\n\t\t\t\t\t\t\t\ttype: 'trigger'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ruleToReturn;\n\t}\n\n\t/**\n\t *\n\t * @param {Object} message - A message recieved by our widget with the event and some data.\n\t * @param {string} message.event - The event in the message.\n\t * @param {Object} message.eventData - The eventData in the message.\n\t * @description This method:\n\t * * Determines if the configuration has a matching event.\n\t * * Determines the payload to send.\n\t * * Sends the payload to all senders in the configuration.\n\t * * Scripts are processed 'after' an 'event' matching message.event.\n\t */\n\tasync listener(message) {\n\t\tconst { event } = message;\n\t\tconst rawEventData = [\n\t\t\t'userEvent',\n\t\t\t'thirdPartyUserEvent',\n\t\t\t'specialsEvent'\n\t\t].includes(message.event)\n\t\t\t? message\n\t\t\t: message.eventData;\n\n\t\tthis.mapping.prevEventData = {\n\t\t\t...this.mapping.prevEventData,\n\t\t\t...savePrevEventData(\n\t\t\t\tthis.configuration?.previousData?.events,\n\t\t\t\tthis.name,\n\t\t\t\tthis.grouping,\n\t\t\t\tevent,\n\t\t\t\trawEventData,\n\t\t\t\twindow\n\t\t\t)\n\t\t};\n\n\t\t// the this.event?.['*'] matches event.js file which has rules for any event not yet matched\n\t\t// made for unite to pass all ASC stuff through\n\t\tconst eventRules = this.event?.[event] || this.event?.['*'];\n\n\t\tif (eventRules) {\n\t\t\tconst eventData = {\n\t\t\t\t...rawEventData,\n\t\t\t\t...(this.prevData && { prev: this.prevData }),\n\t\t\t\t// 1) No circular references\n\t\t\t\t// 2) No scraping the page or getting tricky with this!\n\t\t\t\t// 3) widgetUserEvent uses 'element' and it is a string\n\t\t\t\t// 4) Do the decoration of eventData in ws-tracking please\n\t\t\t\telement:\n\t\t\t\t\ttypeof rawEventData.element === 'string'\n\t\t\t\t\t\t? rawEventData.element\n\t\t\t\t\t\t: '',\n\t\t\t\t...(rawEventData?.elementCTA && {\n\t\t\t\t\telementCTA:\n\t\t\t\t\t\ttypeof rawEventData?.elementCTA === 'string'\n\t\t\t\t\t\t\t? rawEventData.elementCTA\n\t\t\t\t\t\t\t: ''\n\t\t\t\t})\n\t\t\t};\n\n\t\t\tconst script = this.sendingLogic?.waitFor?.script;\n\t\t\tconst eventException = this.sendingLogic?.exception?.event;\n\n\t\t\tconst waitToHandle = new Promise((resolve) => {\n\t\t\t\t// Example use case of below logic: Except for ddc.page.view Genesis events require utag.js to have loaded\n\t\t\t\tif (\n\t\t\t\t\tscript &&\n\t\t\t\t\t!this.scriptsLoaded.has(`${script}`) &&\n\t\t\t\t\t(!eventException || eventException !== event)\n\t\t\t\t) {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.scriptsLoaded.add(script);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\twindow.addEventListener(\n\t\t\t\t\t\t`ws-tagging-${this.name}-${this.grouping}-script-${script}-loaded`,\n\t\t\t\t\t\tlistener,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonce: true\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tawait waitToHandle;\n\n\t\t\tconst rule = this.getRule(\n\t\t\t\teventData,\n\t\t\t\teventRules,\n\t\t\t\trawEventData.element\n\t\t\t);\n\n\t\t\t// if there is no specific event that matches and the event.js has a match all event\n\t\t\tif (!this.event?.[event] && this.event?.['*']) {\n\t\t\t\t// dispatch an event so we know this rule was matched for the match all event (*)\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('wsTaggingRuleMatch', {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tdata: jsonStringifyWithFunctions({\n\t\t\t\t\t\t\t\tevent: '*',\n\t\t\t\t\t\t\t\t...rule\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttype: 'rule'\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst rulesToHandle = [rule];\n\n\t\t\tconst triggers =\n\t\t\t\t(rule?.trigger && putInArrayIfNotArray(rule.trigger)) || [];\n\n\t\t\ttriggers.forEach((triggerName) => {\n\t\t\t\tconst triggeredRule = this.getTriggeredRule(\n\t\t\t\t\ttriggerName,\n\t\t\t\t\teventData,\n\t\t\t\t\trawEventData.element\n\t\t\t\t);\n\t\t\t\tif (triggeredRule) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.triggerEvents?.[triggerName]?.configuration\n\t\t\t\t\t\t\t?.when === 'first'\n\t\t\t\t\t) {\n\t\t\t\t\t\trulesToHandle.unshift(triggeredRule);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trulesToHandle.push(triggeredRule);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// need these to happen in order\n\t\t\tfor (let i = 0; i < rulesToHandle.length; i++) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tawait this.handleRule(\n\t\t\t\t\trulesToHandle[i],\n\t\t\t\t\tevent,\n\t\t\t\t\teventData,\n\t\t\t\t\trawEventData.element\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst mappingConfigurations = [];\n\n/**\n *\n * @param {Object} message - A message recieved by our widget with the event and some data.\n * @param {string} message.event - The event in the message.\n * @param {Object} message.eventData - The eventData in the message.\n * @description Calls the listener function for each MappingConfiguration in mappingConfigurations with the message.\n */\nconst callListener = (message) =>\n\t(message.eventData ||\n\t\t['userEvent', 'thirdPartyUserEvent', 'specialsEvent'].includes(\n\t\t\tmessage.event\n\t\t)) &&\n\tmappingConfigurations.forEach((configuration) =>\n\t\tconfiguration.listener(message)\n\t);\n\n/**\n *\n * @param {Object} mappings Object representing all tracking projects for the current site.\n * @description This method:\n * * Iterates through all properties (mappingConfiguration's) of mappings\n * * If mappingConfiguration.event and mappingConfiguration.configuration exist create a new MappingConfiguration class.\n * * The class is constructed with the mappingConfiguration and that mappingConfigurations name.\n * * This is then pushed into the mappingConfigurations array.\n */\nconst setMappingConfigurations = (mappings) => {\n\tObject.entries(mappings).forEach(([mappingName, mappingConfiguration]) => {\n\t\tif (\n\t\t\tmappingConfiguration?.event &&\n\t\t\tmappingConfiguration?.configuration\n\t\t) {\n\t\t\tmappingConfigurations.push(\n\t\t\t\tnew MappingConfiguration(mappingConfiguration, mappingName)\n\t\t\t);\n\t\t}\n\t});\n\n\t// some projects need to have their rules run before other projects\n\t// if the configuration has a priority set then projects with the lowest priority get ordered first\n\tmappingConfigurations.sort(\n\t\t(\n\t\t\t{\n\t\t\t\tconfiguration: {\n\t\t\t\t\tpriority: priorityA = 999 // really high number that we can bump if we ever reach (999 projects that have an order...don't think so)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ configuration: { priority: priorityB = 999 } }\n\t\t) => {\n\t\t\treturn priorityA - priorityB;\n\t\t}\n\t);\n};\n\nconst initVehicleShown = async (win) => {\n\tconst call = ({ vehicle, vehicle: { uuid }, timestamp, type }) => {\n\t\t// only fire once per page\n\t\tif (uuid && !uuidsShown.has(uuid)) {\n\t\t\tuuidsShown.add(uuid);\n\t\t\tconst eventId =\n\t\t\t\twin.DDC.dataLayer?.page?.generateId?.() ||\n\t\t\t\tMath.trunc(Math.random() * 1000000000);\n\t\t\tcallListener({\n\t\t\t\tevent: 'vehicle-shown',\n\t\t\t\teventData: {\n\t\t\t\t\teventId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype,\n\t\t\t\t\tvehicle\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\t// SRP\n\tconst API =\n\t\twin?.DDC?.APILoader && (await win?.DDC?.APILoader.create('ws-tagging'));\n\tAPI?.subscribe(\n\t\t'vehicle-shown-v1',\n\t\t({ timestamp, type, payload: vehicle = {} } = {}) => {\n\t\t\tcall({\n\t\t\t\ttimestamp,\n\t\t\t\ttype,\n\t\t\t\tvehicle\n\t\t\t});\n\t\t}\n\t);\n\n\t// Legacy VLP\n\tconst observerCallback = (entries, hproduct) => {\n\t\tentries.forEach((entry) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tcall({\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\ttype: 'vehicle-shown-legacy-vlp',\n\t\t\t\t\tvehicle: getWIAPIVehicle(win, hproduct.dataset)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t};\n\n\tdocument.querySelectorAll('.hproduct').forEach((hproduct) => {\n\t\t// if (hproduct) {\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tobserverCallback(entries, hproduct);\n\t\t\t},\n\t\t\t{\n\t\t\t\tthreshold: 1\n\t\t\t}\n\t\t);\n\t\tobserver.observe(hproduct);\n\t\t// }\n\t});\n};\n\nconst initVehicleDataUpdated = async (win) => {\n\tconst API = await win?.DDC?.APILoader?.create?.('ws-tagging');\n\tAPI?.subscribe?.(\n\t\t'vehicle-data-updated-v1',\n\t\t({ payload: { vehicleData } = {}, timestamp, type } = {}) => {\n\t\t\tconst eventId =\n\t\t\t\twin.DDC.dataLayer?.page?.generateId?.() ||\n\t\t\t\tMath.trunc(Math.random() * 1000000000);\n\n\t\t\tcallListener({\n\t\t\t\tevent: 'vehicle-data-updated',\n\t\t\t\teventData: {\n\t\t\t\t\teventId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype,\n\t\t\t\t\tvehicles: vehicleData\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t);\n};\n\n/**\n * @param {Object} flags An object of feature flags.\n * @description This method grabs mappings out of DDC.WidgetData['ws-tagging'] and sets up the mapping configurations.\n * If there are mappings it then sets up a DDC style event (ex. ddc.page.view) listener as well as a WidgetUserEvent listener.\n */\nconst init = async ({ flags: featureFlags } = {}) => {\n\tconst { DDC } = window;\n\tconst wsTagging = DDC.WidgetData['ws-tagging'];\n\twsTagging.browserEventNames = [];\n\n\tconst mappings = wsTagging?.mapping;\n\t// Check DDC widget data to see what mappingConfigurations are enabled.\n\tif (mappings) {\n\t\tsetMappingConfigurations(mappings);\n\n\t\tif (mappingConfigurations.length > 0) {\n\t\t\tcallListener({\n\t\t\t\tevent: 'ddc.wstagging.first',\n\t\t\t\teventData: {\n\t\t\t\t\talias: DDC?.dataLayer?.page?.pageInfo?.pageName,\n\t\t\t\t\teventId: DDC?.dataLayer?.generateId?.()\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// there seem to be cases where window.dataLayer is not defined at this point\n\t\t\t// - saw this in NR JS errors\n\t\t\twindow.dataLayer = window.dataLayer || [];\n\n\t\t\twsTagging.ascDataLayerHelper = new window.DataLayerHelper(\n\t\t\t\twindow?.asc_datalayer?.events || [],\n\t\t\t\t(_dataLayer, message) => {\n\t\t\t\t\tcallListener({\n\t\t\t\t\t\tevent: message.event,\n\t\t\t\t\t\teventData: message\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\n\t\t\twsTagging.dataLayerHelper = new window.DataLayerHelper(\n\t\t\t\twindow.dataLayer || [], // if window.dataLayer is again undefined just send an empty array to avoid js errors\n\t\t\t\t// ignore widgetUserEvents from window.dataLayer pushes as the optionalData we might want is stripped out\n\t\t\t\t(dataLayer, message) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tmessage &&\n\t\t\t\t\t\tmessage.event &&\n\t\t\t\t\t\tmessage.event !== 'widgetUserEvent'\n\t\t\t\t\t) {\n\t\t\t\t\t\tcallListener(message);\n\t\t\t\t\t}\n\n\t\t\t\t\tpushToFirehose(message, DDC, featureFlags);\n\t\t\t\t},\n\t\t\t\ttrue\n\t\t\t);\n\n\t\t\tif (DDC.receiveTrackingEvent) {\n\t\t\t\t// widgetUserEvents are published through trackEvent and can come with optionalData that we want included\n\t\t\t\tDDC.receiveTrackingEvent(\n\t\t\t\t\t(event, eventData = {}, optionalData = {}) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tisObject(eventData) &&\n\t\t\t\t\t\t\teventData.event &&\n\t\t\t\t\t\t\teventData.event === 'widgetUserEvent'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst eventDataForListener = {\n\t\t\t\t\t\t\t\t...eventData,\n\t\t\t\t\t\t\t\t...(isObject(optionalData) && {\n\t\t\t\t\t\t\t\t\t...optionalData\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tcallListener({\n\t\t\t\t\t\t\t\tevent: eventData.event,\n\t\t\t\t\t\t\t\teventData: eventDataForListener\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// docs/debug.md\n\t\t\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\t\t\tnew CustomEvent('wsTaggingWUE', {\n\t\t\t\t\t\t\t\t\tdetail: eventDataForListener\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (window.DDC?.dataLayer?.page?.pageInfo?.isVlp) {\n\t\t\t\tinitVehicleDataUpdated(window);\n\t\t\t\tawait initVehicleShown(window);\n\t\t\t}\n\n\t\t\tif (DDC.WidgetData['ws-tracking']?.ddctrackingMessages?.forEach) {\n\t\t\t\tDDC.WidgetData['ws-tracking']?.ddctrackingMessages.forEach(\n\t\t\t\t\t(event) => {\n\t\t\t\t\t\tcallListener({\n\t\t\t\t\t\t\tevent: 'ddc.message',\n\t\t\t\t\t\t\teventData: event.data\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\twindow?.newrelic?.addPageAction?.(\n\t\t\t\t\t'wsTaggingTrackingMessagesNotFound',\n\t\t\t\t\t{\n\t\t\t\t\t\tlocation: '1'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\twindow.addEventListener('ddcTrackingData', ({ detail }) => {\n\t\t\t\tcallListener({\n\t\t\t\t\tevent: 'ddc.message',\n\t\t\t\t\teventData: detail\n\t\t\t\t});\n\t\t\t});\n\n\t\t\twindow.coxAutoDataLayer?.subscribe?.(\n\t\t\t\t({ state: _state }, eventData) => {\n\t\t\t\t\tcallListener({\n\t\t\t\t\t\tevent: 'commonDataLayerEvent',\n\t\t\t\t\t\teventData\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n};\n\nlet initialized = false;\n\nconst setInitialized = (value) => {\n\tinitialized = value;\n};\n\nconst setFlags = (flagsArg) => {\n\tflags = flagsArg;\n};\n\n/**\n * @description This method ensures there is ws-tagging data on the page before running the init() function\n */\nexport const initIfWsTaggingReady = (flagsArg) => {\n\tif (!initialized) {\n\t\tflags = flagsArg;\n\t\tif (window?.DDC?.WidgetData?.['ws-tagging']?.mapping) {\n\t\t\tinit({\n\t\t\t\tflags: flagsArg\n\t\t\t});\n\t\t} else {\n\t\t\twindow.addEventListener('ws-tagging-ready', () => {\n\t\t\t\tinit({\n\t\t\t\t\tflags: flagsArg\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tinitialized = true;\n\t}\n};\n\n// only export if the test framework is running\nexport const exportedForTesting = {\n\t...(typeof test !== 'undefined' && {\n\t\tMappingConfiguration,\n\t\tmappingConfigurations,\n\t\tcallListener,\n\t\tsetFlags,\n\t\tsetMappingConfigurations,\n\t\tinit,\n\t\tsetInitialized\n\t})\n};\n","import getEnv, { PROD } from './getEnv';\n\n/**\n * On nonprod always returns true and if on live returns true 10% of the time.\n *\n * @returns {boolean} true 10% of the time on prod and 100% of the time on NP\n * @example\n */\nconst eventShouldBeTracked = () =>\n\tgetEnv() !== PROD || Math.floor(Math.random() * (100 - 0) + 1) <= 10;\n\nexport default eventShouldBeTracked;\n","/**\n *\n * @param {window} win Takes the window object (which makes testing easier)\n * @returns True or false depending on if things are running in the test suite\n */\nconst inTestSuite = (win = false) =>\n\twin && Object.prototype.hasOwnProperty.call(win, 'test');\n\nexport default inTestSuite;\n","import logger from 'ws-scripts/modules/logger';\nimport inTestSuite from './inTestSuite';\nimport isObject from './isObject';\n\nconst loggerLevels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];\n\n/**\n *\n * @param {string} msg The message to send to logger.info if not in the test suite\n * @returns\n */\nconst logIfNotInTestSuite = ({ msg, data, level = 'info' }) => {\n\tconst args = [msg];\n\tconst loggerLevel = loggerLevels.includes(level) ? level : 'info';\n\tlet dataShallowCopy = data;\n\n\tif (isObject(data)) {\n\t\tdataShallowCopy = {\n\t\t\t...data,\n\t\t\t...(data?.eventData && {\n\t\t\t\teventData: {\n\t\t\t\t\t...data.eventData\n\t\t\t\t}\n\t\t\t})\n\t\t};\n\t}\n\n\tif (dataShallowCopy) {\n\t\targs.push(dataShallowCopy);\n\t}\n\n\treturn typeof window === 'undefined'\n\t\t? logger[loggerLevel](...args)\n\t\t: !inTestSuite(window) && logger[loggerLevel](...args);\n};\n\nexport default logIfNotInTestSuite;\n","// TODO: implement originator param\nconst nrSwitcherOn = (flags, project, event) => {\n\tconst switcherRules = flags?.['ws-tagging-nr-switcher'];\n\tif (!switcherRules || !Array.isArray(switcherRules)) {\n\t\t// if no flag, allow reporting\n\t\treturn true;\n\t}\n\n\t// turn off reporting only if project, event and originator match what we have specified in a rule\n\t// the flag is an array so we can combine rules\n\tconst isOff = switcherRules.some(\n\t\t(rule) =>\n\t\t\t(rule.project === 'allProjects' || rule.project === project) &&\n\t\t\t(rule.event === 'allEvents' || rule.event === event)\n\t\t// && (\n\t\t// rule.originator === 'allOriginators' ||\n\t\t// rule.originator === originator\n\t\t// )\n\t);\n\treturn !isOff;\n};\nexport default nrSwitcherOn;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","// Webpack will replace 'logger-node' with 'logger-browser' in browser environments.\nconst { log } = require('./logger-node');\n\n/**\n * The FATAL level designates very severe error events that will presumably lead the application to abort.\n * @param {(String|Error)} msg String message (or Error object) providing context for the log entry.\n * @param {Object} data Optional object whose properties will be included in the log data (as JSON).\n */\nconst fatal = (msg, data = null) => {\n\tlog('FATAL', msg, data);\n};\n\n/**\n * The ERROR level designates error events that might still allow the application to continue running.\n * @param {(String|Error)} msg String message (or Error object) providing context for the log entry.\n * @param {Object} data Optional object whose properties will be included in the log data (as JSON).\n */\nconst error = (msg, data = null) => {\n\tlog('ERROR', msg, data);\n};\n\n/**\n * The WARN level designates potentially harmful situations.\n * @param {(String|Error)} msg String message (or Error object) providing context for the log entry.\n * @param {Object} data Optional object whose properties will be included in the log data (as JSON).\n */\nconst warn = (msg, data = null) => {\n\tlog('WARN', msg, data);\n};\n\n/**\n * The INFO level designates informational messages that highlight the progress of the application at coarse-grained level.\n * @param {[string, unknown][]} msg String message (or Error object) providing context for the log entry.\n * @param {Object} data Optional object whose properties will be included in the log data (as JSON).\n */\nconst info = (msg, data = null) => {\n\tlog('INFO', msg, data);\n};\n\n/**\n * The DEBUG level designates fine-grained informational events that are most useful to debug an application.\n * @param {(String|Error)} msg String message (or Error object) providing context for the log entry.\n * @param {Object} data Optional object whose properties will be included in the log data (as JSON).\n */\nconst debug = (msg, data = null) => {\n\tlog('DEBUG', msg, data);\n};\n\n/**\n * The TRACE level designates finer-grained informational events than the DEBUG level.\n * @param {(String|Error)} msg String message (or Error object) providing context for the log entry.\n * @param {Object} data Optional object whose properties will be included in the log data (as JSON).\n */\nconst trace = (msg, data = null) => {\n\tlog('TRACE', msg, data);\n};\n\nmodule.exports = {\n\tfatal,\n\terror,\n\twarn,\n\tinfo,\n\tdebug,\n\ttrace\n};\n","const { levels, colors, logLevel, stderrLevels } = require('./logger-common');\n\nconst logLevelInt = levels[logLevel];\nconst browserColors = { ...colors, FATAL: 'red; font-weight: bold' };\nconst devLog = process.env.NODE_ENV !== 'production';\n\nconst log = (level, msg, data) => {\n\t/* eslint-disable no-console */\n\tif (devLog && levels[level] <= logLevelInt) {\n\t\tconst color = `color: ${browserColors[level]}`;\n\t\tconst outputStream = stderrLevels.has(level)\n\t\t\t? console.error\n\t\t\t: console.log;\n\t\toutputStream(`%c${level} : ${msg}`, color);\n\t\tif (data) {\n\t\t\toutputStream(`%c${JSON.stringify(data, undefined, 4)}`, color);\n\t\t}\n\t}\n\t/* eslint-enable no-console */\n};\n\nmodule.exports = {\n\tlog\n};\n","const logLevel = process.env.LOG_LEVEL || 'INFO';\n\nconst levels = {\n\tFATAL: 0,\n\tERROR: 1,\n\tWARN: 2,\n\tINFO: 3,\n\tDEBUG: 4,\n\tTRACE: 5\n};\n\nconst stderrLevels = new Set();\nObject.keys(levels).forEach((level) => {\n\tif (levels[level] < levels.INFO) {\n\t\tstderrLevels.add(level);\n\t}\n});\n\nconst colors = {\n\tFATAL: 'red bold',\n\tERROR: 'red',\n\tWARN: 'yellow',\n\tINFO: 'green',\n\tDEBUG: 'cyan',\n\tTRACE: 'blue'\n};\n\nmodule.exports = { levels, logLevel, stderrLevels, colors };\n"],"names":["module","exports","require","base","path","val","keys","split","lastKey","pop","reduce","obj","key","item","Array","isArray","objectOfCreation","win","Object","values","forEach","objectPath","value","valueCopy","JSON","parse","stringify","createNestedObject","scriptsConstants","src","Promise","resolve","reject","script","document","createElement","addEventListener","e","error","head","appendChild","async","APILoader","DDC","create","loadJS","writePrevData","prevDataConfig","project","grouping","window","prev","entries","slug","slugPath","slugMap","getDotNotationFromString","replace","length","localStorage","setItem","removeItem","savePrevEventData","prevDataConfigEvents","event","eventData","localStorageKey","prevEventData","getItem","updated","eventName","properties","property","eventNameNoPeriod","replaceAll","mutateObject","fn","isObject","index","objectMutator","mutatedReplacement","replaceNullAndUndefined","push","prototype","map","acc","payload","exceptions","payloadStringified","payloadCopy","newValue","includes","undefined","additionalAttributes","report","dispatchEvent","CustomEvent","detail","common","source","WidgetData","ready","once","cloneObject","Function","Date","copiedObj","executeObjectFunctions","args","executedObj","toString","uuidsShown","Set","flags","VEHICLE_ATTRS","getWIAPIVehicle","vehicle","newVehicle","address","accountName","city","state","street","postalCode","zipcode","country","attr","toLowerCase","dealerCodes","dataLayer","dealership","dealerCode","images","MappingConfiguration","constructor","configuration","name","logicValue","element","mapping","this","utils","lookups","mustEqual","mustEqualOneOf","mustInclude","mustIncludeOneOf","mustNotEqual","mustNotInclude","result","test","type","every","testKey","testValMaybeArray","testVal","slugVal","getReplacement","str","pass","slugValUndefined","wildcard","testValEmptyString","emptyStringMatch","String","payloadIn","rule","resolvedPayloads","shared","rest","partialObject","currentItem","mergedObject","logic","testRule","data","jsonStringifyWithFunctions","sharedBlock","payloadInIn","reduceSharedPayload","previousData","previousDataConfig","sendingLogic","events","triggerEvents","fireGroups","preview","prevData","getPreviousData","scriptsLoaded","triggeredEvents","Map","firedGroups","prevEventDataKey","subscribe","saveDDCDataLayer","ddcDataLayer","handleGlobalPayloadMutators","replacement","mutators","globalPayloadMutators","mutateItem","bind","mustExist","_mustEqual","_mustInclude","_mustNotEqual","_mustNotInclue","putInArrayIfNotArray","replaceSlugs","input","testLogic","testFireGroup","fireGroup","fireGroupPass","operationsToRun","logIfNotInTestSuite","msg","maxCount","firedGroupCount","get","set","minCount","getRule","rules","mutableMapping","find","rulePass","some","noLogic","reportToNewRelic","clientEventName","sender","props","eventShouldBeTracked","nrSwitcherOn","pageTrackingTags","page","trackingTags","pageTrackingTagsKeys","pageTrackingTagsValues","eventTrackingTags","addNewRelicPageAction","mappingGroup","mappingSource","sourceEvent","wsTaggingPreview","widgetName","sendEvent","senderString","addSourceToSecondArgument","addEventToSecondArgument","sent","secondArg","message","resolveClientEventName","formatSlugs","sendEvents","excludedSender","senderOverride","reporting","sendData","payloads","reportsForEventViewer","reportsForNewRelic","copyPayload","resolvedClientEventName","sending","reportForEventViewer","reportForNewRelic","groupingSending","concat","eventViewer","reportClientEventName","reportToEventViewer","processScripts","whenArg","triggerArg","eventArg","processScriptsInfo","messages","scripts","when","trigger","configs","i","srcNp","has","srcFromEnv","getEnv","sluglessSrc","add","Event","handleRule","_rule","vehicleDataUpdated","resolveSharedPayload","firstPromise","firstFired","interval","setInterval","clearInterval","excluded","getTriggeredRule","triggerName","ruleToReturn","triggerRule","count","triggeredEventCount","listener","rawEventData","eventRules","elementCTA","waitFor","eventException","exception","waitToHandle","rulesToHandle","triggeredRule","unshift","mappingConfigurations","callListener","setMappingConfigurations","mappings","mappingName","mappingConfiguration","sort","priority","priorityA","priorityB","initVehicleShown","call","uuid","timestamp","eventId","generateId","Math","trunc","random","API","querySelectorAll","hproduct","observer","IntersectionObserver","entry","isIntersecting","now","dataset","observerCallback","threshold","observe","init","featureFlags","wsTagging","browserEventNames","alias","pageInfo","pageName","ascDataLayerHelper","DataLayerHelper","asc_datalayer","_dataLayer","dataLayerHelper","startsWith","eventCategory","eventAction","specialType","features","_features","_images","restOfVehicle","restOfEventData","restOfMessage","pushToFirehose","receiveTrackingEvent","optionalData","eventDataForListener","isVlp","vehicleData","vehicles","initVehicleDataUpdated","ddctrackingMessages","newrelic","addPageAction","location","coxAutoDataLayer","_state","initialized","initIfWsTaggingReady","flagsArg","PROD","floor","hasOwnProperty","loggerLevels","level","loggerLevel","dataShallowCopy","inTestSuite","logger","switcherRules","cachedSetTimeout","cachedClearTimeout","process","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","setTimeout","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","noop","nextTick","arguments","apply","title","browser","env","argv","version","versions","on","addListener","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","log","fatal","warn","info","debug","trace","levels","colors","logLevel","stderrLevels","LOG_LEVEL","FATAL","ERROR","WARN","INFO","DEBUG","TRACE"],"sourceRoot":""}