
      if(window.location.hostname === 'www.lithiafordmissoula.com') {
        
            const createSchemaObjects = (schemaInfo, imageUrl) => ({      '@context': 'http://schema.org',      '@type': 'Car',      'vehicleIdentificationNumber': `${schemaInfo.vin}`,      'vehicleModelDate': schemaInfo.modelDate,      'model': {        '@type': 'ProductModel',        'name': `${schemaInfo.name}`,        'image': `${imageUrl}`,        'offers': {          '@type': 'Offer',          'price': schemaInfo.price,          'priceCurrency': `${schemaInfo.currency}`        }      },      'image': {        '@type': 'ImageObject',        'contentUrl': `${imageUrl}`      },      'name': `${schemaInfo.name}`    });  
        
    const injectToHTML = (location, cssSelector, div) => {
      switch(location){
        case 'afterAsFirstChild':
          document.querySelector(cssSelector).prepend(div);
          return;
        case 'afterAsLastChild':
          document.querySelector(cssSelector).appendChild(div);
          return;
        case 'beforeAsSibling': {
          let element = document.querySelector(cssSelector);
          element.parentNode.insertBefore(div, element.previousSibling);
          return;
        }
        case 'afterAsSibling': {
          let element = document.querySelector(cssSelector);
          element.parentNode.insertBefore(div, element.nextSibling);
          return;
        }
        default: {
          document.querySelector(cssSelector).prepend(div);
          return;
        }
      }
    }
  
        
  const makeRandomString = () => {
    let result = '';
    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    const charsLength = characters.length;

    for (let i = 0; i < 6; i++) {
      result += characters.charAt(Math.floor(Math.random() * charsLength));
    }
    return result;
  }

        const createGridResponse = (
      data,
      cssSelector,
      idx,
      modifiers,
      isEmbedAsHTML,
      embedJs,
      variables,
      seoTextList,
      schemaInfoList,
      offerImpressionList
      ) => {
      return new MutationObserver(function(mutations, me){
        let offerImpressHTMLArr = [];
      let offerClickHTMLArr = [];
      if(offerImpressionList){
        for(const offerInd of offerImpressionList) {
        const impressionKeys = Object.keys(offerInd);
      
        let offerImpressHTML = "";
        let offerClickHTML = "";

        offerImpressHTML += ("event" + ': "' + "offerImpression") + '",';
        offerClickHTML += ("event" + ': "' + "offerClick") + '",';
        const offerKey = "num_of_offers";
        offerImpressHTML += ("num_of_offers" + ': "' + (offerInd[offerKey] || "")) + '",'; 
        impressionKeys.forEach(impressKey => {
          if(impressKey.includes("offerImpression")){
            offerImpressHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';    
          }
      
          if(impressKey.includes("offerClick")){
            offerClickHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';
          }
        });
      
        impressionHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerImpressHTML + "});";
        clickHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerClickHTML + "});";
        offerImpressHTMLArr.push(impressionHTMLStr);
        offerClickHTMLArr.push(clickHTMLStr);
        }
      }

        let div;
        let platform;
        if(cssSelector.mobile && window.innerWidth <= 740) {
          div = document.querySelector(cssSelector.mobile);
          platform = 'mobile'
        }
        else if(cssSelector.desktop && window.innerWidth > 740) {
          div = document.querySelector(cssSelector.desktop);
          platform = 'desktop'
        }
        else {
          return;
        }
        if (div) {
          cssSelector = cssSelector[platform];
          let wrapper = document.createElement('div');
          injectToHTML(modifiers[platform], cssSelector, wrapper);

          let xDown = null;
          let yDown = null;
          let isCanvasPointerEventOn = isEmbedAsHTML;

          wrapper.addEventListener('touchstart', function (e) {
            xDown = e.touches[0].clientX; 
            yDown = e.touches[0].clientY;
          });

          wrapper.addEventListener('touchmove', function(e) {
            if (!xDown || !yDown) return;
            let xUp = e.touches[0].clientX;
            let yUp = e.touches[0].clientY;
            
            let xDiff = xDown - xUp;
            let yDiff = yDown - yUp;

            if (Math.abs(xDiff) + Math.abs(yDiff) > 50) {
              if (isCanvasPointerEventOn && isEmbedAsHTML) {
                const validVariables = variables.filter(variable => {
                  return variable.length > 0;
                });
                validVariables.forEach(variable => {
                  document.getElementById(variable[1]).parentElement.style.pointerEvents = 'none';
                });
                isCanvasPointerEventOn = false;
              }              
              xDown = null;
              yDown = null;
            }
          });

          if (isEmbedAsHTML) {
            wrapper.style= 'width: 100%; margin-top: 10px; margin-bottom: 10px;';
            for(let idx = 1; idx < variables.length; idx += 2) {
              let div = document.createElement('div');
              let div1 = document.createElement('div');
              let div2 = document.createElement('div');
              let canvas1 = document.createElement('canvas');
              canvas1.style.pointerEvents = 'none';
              let canvas2 = document.createElement('canvas');
              canvas2.style.pointerEvents = 'none';
              let img1 = document.createElement('img');
              img1.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                wrapper.append(offerClickScript);
              };
              let img2 = document.createElement('img');
              img2.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx];
                wrapper.append(offerClickScript);
              };

              if (variables[idx - 1].length === 0 && variables[idx].length === 0) {
                img1.src = data[idx - 1].imageUrl;
                img1.style = 'width: 100%';
                if(data[idx - 1].imageLink) {
                  let a1 = document.createElement('a');
                  a1.href = data[idx - 1].imageLink;
                  if (data[idx - 1].imageLink.includes('?')) {
                    a1.href = data[idx - 1].imageLink + '&' + data[idx - 1].targetData
                  } else {
                    a1.href = data[idx - 1].imageLink + '?' + data[idx - 1].targetData
                  }
                  a1.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx - 1].target) a1.target = data[idx - 1].target;
                  if(a1.target === '_blank') a1.rel = 'noreferrer noopener';
                  a1.style = 'display: inline-block';
                  a1.appendChild(img1);
                  div1.appendChild(a1);
                }
                else div1.appendChild(img1);

                img2.src = data[idx].imageUrl;
                img2.style = 'width: 100%';
                if(data[idx].imageLink) {
                  let a2 = document.createElement('a');
                  a2.href = data[idx].imageLink;
                  if (data[idx].imageLink.includes('?')) {
                    a2.href = data[idx].imageLink + '&' + data[idx].targetData
                  } else {
                    a2.href = data[idx].imageLink + '?' + data[idx].targetData
                  }
                  a2.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx].target) a2.target = data[idx].target;
                  if(a2.target === '_blank') a2.rel = 'noreferrer noopener';
                  a2.style = 'display: inline-block';
                  a2.appendChild(img2);
                  div2.appendChild(a2);
                }
                else div2.appendChild(img2);
              }
              else if (variables[idx - 1].length === 0 && variables[idx]) {
                img1.src = data[idx - 1].imageUrl;
                img1.style = 'width: 100%';
                if(data[idx - 1].imageLink) {
                  let a1 = document.createElement('a');
                  a1.href = data[idx - 1].imageLink;
                  if (data[idx - 1].imageLink.includes('?')) {
                    a1.href = data[idx - 1].imageLink + '&' + data[idx - 1].targetData
                  } else {
                    a1.href = data[idx - 1].imageLink + '?' + data[idx - 1].targetData
                  }
                  a1.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx - 1].target) a1.target = data[idx - 1].target;
                  if(a1.target === '_blank') a1.rel = 'noreferrer noopener';
                  a1.style = 'display: inline-block';
                  a1.appendChild(img1);
                  div1.appendChild(a1);
                }
                else div1.appendChild(img1);

                canvas2.id = variables[idx][1];
                if(data[idx].imageLink) {
                  let a2 = document.createElement('a');
                  a2.href = data[idx].imageLink;
                  if (data[idx].imageLink.includes('?')) {
                    a2.href = data[idx].imageLink + '&' + data[idx].targetData
                  } else {
                    a2.href = data[idx].imageLink + '?' + data[idx].targetData
                  }
                  a2.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx].target) a2.target = data[idx].target;
                  if(a2.target === '_blank') a2.rel = 'noreferrer noopener';
                  a2.style = 'display: inline-block';
                  a2.appendChild(canvas2);
                  div2.appendChild(a2);
                }
                else div2.append(canvas2);
              }
              else if (variables[idx - 1] && variables[idx].length === 0) {
                canvas1.id = variables[idx - 1][1];
                if (data[idx - 1].imageLink) {
                  let a1 = document.createElement('a');
                  a1.href = data[idx - 1].imageLink;
                  if (data[idx - 1].imageLink.includes('?')) {
                    a1.href = data[idx - 1].imageLink + '&' + data[idx - 1].targetData
                  } else {
                    a1.href = data[idx - 1].imageLink + '?' + data[idx - 1].targetData
                  }
                  a1.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx - 1].target) a1.target = data[idx - 1].target;
                  if(a1.target === '_blank') a1.rel = 'noreferrer noopener';
                  a1.style = 'display: inline-block';
                  a1.appendChild(canvas1);
                  div1.appendChild(a1);
                }
                else div1.append(canvas1);

                img2.src = data[idx].imageUrl;
                img2.style = 'width: 100%';
                if (data[idx].imageLink) {
                  let a2 = document.createElement('a');
                  a2.href = data[idx].imageLink;
                  if (data[idx].imageLink.includes('?')) {
                    a2.href = data[idx].imageLink + '&' + data[idx].targetData
                  } else {
                    a2.href = data[idx].imageLink + '?' + data[idx].targetData
                  }
                  a2.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx].target) a2.target = data[idx].target;
                  if(a2.target === '_blank') a2.rel = 'noreferrer noopener';
                  a2.style = 'display: inline-block';
                  a2.appendChild(img2);
                  div2.appendChild(a2);
                }
                else div2.appendChild(img2);
              }
              else {
                canvas1.id = variables[idx - 1][1];
                if(data[idx - 1].imageLink) {
                  let a1 = document.createElement('a');
                  a1.href = data[idx - 1].imageLink;
                  if (data[idx - 1].imageLink.includes('?')) {
                    a1.href = data[idx - 1].imageLink + '&' + data[idx - 1].targetData
                  } else {
                    a1.href = data[idx - 1].imageLink + '?' + data[idx - 1].targetData
                  }
                  a1.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx - 1].target) a1.target = data[idx - 1].target;
                  if(a1.target === '_blank') a1.rel = 'noreferrer noopener';
                  a1.style = 'display: inline-block';
                  a1.appendChild(canvas1);
                  div1.appendChild(a1);
                }
                else div1.append(canvas1);

                canvas2.id = variables[idx][1];
                if(data[idx].imageLink) {
                  let a2 = document.createElement('a');
                  a2.href = data[idx].imageLink;
                  if (data[idx].imageLink.includes('?')) {
                    a2.href = data[idx].imageLink + '&' + data[idx].targetData
                  } else {
                    a2.href = data[idx].imageLink + '?' + data[idx].targetData
                  }
                  a2.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[idx];
                      wrapper.append(offerClickScript);
                    };
                  if(data[idx].target) a2.target = data[idx].target;
                  if(a2.target === '_blank') a2.rel = 'noreferrer noopener';
                  a2.style = 'display: inline-block';
                  a2.appendChild(canvas2);
                  div2.appendChild(a2);
                }
                else div2.append(canvas2);
              }

              div.style = 'width: 100%; display: flex; align-items: center; justify-content: center;';
              div1.style = 'max-width: 50%; padding: 2%';
              div2.style = 'max-width: 50%; padding: 2%';
              div.append(div1);
              div.append(div2);

              if (platform === 'mobile') {                
                div.style.flexDirection = 'column';
                div1.style.maxWidth = '100%';
                div2.style.maxWidth = '100%';
                div1.style.width = '100%';
                div2.style.width = '100%';
              }
              wrapper.append(div);
            }
            if (variables.length % 2 !== 0) {
              let lastImage = data[data.length - 1];
              let lastDiv = document.createElement('div');
              let lastDiv1 = document.createElement('div');
              let lastCanvas = document.createElement('canvas');
              let lastImg = document.createElement('img');

              lastCanvas.style.pointerEvents = 'none';

              if (variables[variables.length - 1].length === 0) {
                lastImg.src = data[data.length - 1].imageUrl;
                if(lastImage.imageLink) {
                  let lastA = document.createElement('a');
                  lastA.href = lastImage.imageLink;
                  if (lastImage.imageLink.includes('?')) {
                    lastA.href = lastImage.imageLink + '&' + lastImage.targetData
                  } else {
                    lastA.href = lastImage.imageLink + '?' + lastImage.targetData
                  }
                  if(lastImage.target) lastA.target = lastImage.target;
                  if(lastA.target === '_blank') lastA.rel = 'noreferrer noopener';
                  lastA.style = 'display: inline-block';
                  lastA.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[data.length - 1];
                      wrapper.append(offerClickScript);
                    };
                  lastA.appendChild(lastImg);
                  lastDiv1.appendChild(lastA);
                }
                else {
                  lastDiv1.appendChild(lastImg);
                  lastDiv1.style = 'display: inline-block';
                }
                lastDiv.append(lastDiv1);
                lastDiv.style = 'width: 100%; display: flex; align-items: center; justify-content: center;';
                wrapper.append(lastDiv);
              }
              else {
                lastCanvas.id = variables[variables.length - 1][1];
                if(data[variables.length - 1].imageLink) {
                  let lastA = document.createElement('a');
                  lastA.href = data[variables.length - 1].imageLink;
                  if (data[variables.length - 1].imageLink.includes('?')) {
                    lastA.href = data[variables.length - 1].imageLink + '&' + data[variables.length - 1].targetData
                  } else {
                    lastA.href = data[variables.length - 1].imageLink + '?' + data[variables.length - 1].targetData
                  }
                  lastA.onclick = function() {
                      console.log("image clicked - add GA")
                      let offerClickScript = document.createElement('script');
                      offerClickScript.innerHTML = offerClickHTMLArr[variables.length - 1];
                      wrapper.append(offerClickScript);
                    };
                  if(data[variables.length - 1].target) lastA.target = data[variables.length - 1].target;
                  if(lastA.target === '_blank') lastA.rel = 'noreferrer noopener';
                  lastA.style = 'display: inline-block';
                  lastA.appendChild(lastCanvas);
                  lastDiv1.appendChild(lastA);
                }
                else lastDiv1.append(lastCanvas);
                lastDiv.append(lastDiv1);
                lastDiv.style = 'width: 100%; display: flex; align-items: center; justify-content: center;';
                wrapper.append(lastDiv);
              }
            }
            let scriptTag = document.createElement('script');
            scriptTag.innerHTML = embedJs;
            wrapper.append(scriptTag);
          }
          else {
            wrapper.style= 'width: 100%; margin-top: 10px; margin-bottom: 10px;';
            for (let idx = 1; idx < data.length; idx += 2) {
              let div = document.createElement('div');
              let div1 = document.createElement('div');
              let div2 = document.createElement('div');
              let img1 = document.createElement('img');
              img1.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                wrapper.append(offerClickScript);
              };
              let img2 = document.createElement('img');
              img2.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx];
                wrapper.append(offerClickScript);
              };
              if(data[idx - 1].imageLink) {
                let a1 = document.createElement('a');
                a1.href = data[idx - 1].imageLink;
                if (data[idx - 1].imageLink.includes('?')) {
                  a1.href = data[idx - 1].imageLink + '&' + data[idx - 1].targetData
                } else {
                  a1.href = data[idx - 1].imageLink + '?' + data[idx - 1].targetData
                }
                a1.onclick = function() {
                  console.log("image clicked - add GA")
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx - 1];
                  wrapper.append(offerClickScript);
                };
                if(data[idx - 1].target) a1.target = data[idx - 1].target;
                if(a1.target === '_blank') a1.rel = 'noreferrer noopener';
                a1.style = 'display: inline-block';
                a1.appendChild(img1);
                div1.appendChild(a1);
              }
              else div1.appendChild(img1);
              if(data[idx].imageLink) {
                let a2 = document.createElement('a');
                a2.href = data[idx].imageLink;
                if (data[idx].imageLink.includes('?')) {
                  a2.href = data[idx].imageLink + '&' + data[idx].targetData
                } else {
                  a2.href = data[idx].imageLink + '?' + data[idx].targetData
                }
                a2.onclick = function() {
                  console.log("image clicked - add GA")
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx];
                  wrapper.append(offerClickScript);
                };
                if(data[idx].target) a2.target = data[idx].target;
                if(a2.target === '_blank') a2.rel = 'noreferrer noopener';
                a2.style = 'display: inline-block';
                a2.appendChild(img2);
                div2.appendChild(a2);
              }
              else div2.appendChild(img2);
              div.appendChild(div1);
              div.appendChild(div2);
              div.style = 'width: 100%; display: flex; align-items: center; justify-content: center;';
              div1.style = 'max-width: 50%; padding: 2%';
              div2.style = 'max-width: 50%; padding: 2%';
              img1.style = 'width: 100%';
              img1.src = data[idx - 1].imageUrl;
              img1.alt = data[idx - 1].imageAltText;
              img2.style = 'width: 100%';
              img2.src = data[idx].imageUrl;
              img2.alt = data[idx].imageAltText;
              if(platform === 'mobile'){
                div.style.flexDirection = 'column';
                div1.style.maxWidth = '100%';
                div2.style.maxWidth = '100%';
                div1.style.width = '100%';
                div2.style.width = '100%';
              }
              wrapper.appendChild(div);
            }
            if(data.length % 2 !== 0) {
              let lastImage = data[data.length - 1];
              let lastDiv = document.createElement('div');
              let lastDiv1 = document.createElement('div');
              let lastImg = document.createElement('img');
              if(lastImage.imageLink) {
                let lastA = document.createElement('a');
                lastA.href = lastImage.imageLink;
                if (lastImage.imageLink.includes('?')) {
                  lastA.href = lastImage.imageLink + '&' + lastImage.targetData
                } else {
                  lastA.href = lastImage.imageLink + '?' + lastImage.targetData
                }
                lastA.onclick = function() {
                  console.log("image clicked - add GA")
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[data.length - 1];
                  wrapper.append(offerClickScript);
                };
                if(lastImage.target) lastA.target = lastImage.target;
                if(lastA.target === '_blank') lastA.rel = 'noreferrer noopener';
                lastA.style = 'display: inline-block';
                lastA.appendChild(lastImg);
                lastDiv1.appendChild(lastA);
              }
              else {
                lastDiv1.appendChild(lastImg);
                lastDiv1.style = 'display: inline-block';
              }
              lastImg.style = 'width: 100%';
              lastImg.src = lastImage.imageUrl;
              lastImg.alt = lastImage.imageAltText;
              lastDiv.style = 'width: 100%; display: flex; align-items: center; justify-content: center;';
              lastDiv.appendChild(lastDiv1);
              wrapper.appendChild(lastDiv);
            }
          }
          if (seoTextList && !!seoTextList.length) {
            let text = "";
            seoTextList.forEach(seoText => {
              text += seoText;
            });
            let seoTag = document.createElement('div');
            seoTag.innerHTML = text;
            seoTag.style.display = 'none';
            wrapper.append(seoTag);
          }
          if (schemaInfoList) {
        const schemaInfo = [];
        for (let i = 0; i < schemaInfoList.length; i++) {
          schemaInfo.push(createSchemaObjects(schemaInfoList[i], data[i].imageUrl));
          let seoDiv = document.createElement('div');
          seoDiv.style.display = 'none';
          let productDiv = document.createElement('div');
          productDiv.id = 'product';
          seoDiv.append(productDiv);

          let strongText = document.createElement('strong');
          strongText.innerHTML = schemaInfoList[i].name || '';
          productDiv.append(strongText);

          let paragraph = document.createElement('p');
          paragraph.innerHTML = schemaInfoList[i].text || '';
          productDiv.append(paragraph);
          if(offerImpressionList){
            const impressionKeys = Object.keys(offerImpressionList[i]);
            impressionKeys.forEach(impressKey => {
              let impressionP = document.createElement('p');
              impressionP.innerHTML = offerImpressionList[i][impressKey] || '';
              productDiv.append(impressionP);
            });
            let offerImpressionScript = document.createElement('script');
              offerImpressionScript.innerHTML = offerImpressHTMLArr[i];
              wrapper.append(offerImpressionScript);
          }

          let image = document.createElement('img');
          image.src = data.imageUrl;
          productDiv.append(image);

          let stamp = document.createElement('p');
          stamp.innerHTML = schemaInfoList[i].stamp || '';
          productDiv.append(stamp);

          wrapper.append(seoDiv);
        }
        let schemaTag = document.createElement('script');
        schemaTag.type = 'application/ld+json';
        schemaTag.innerHTML = JSON.stringify(schemaInfo);
        wrapper.append(schemaTag);
      }
          me.disconnect();
          return ;
        }
      });
    }
  
        
  const createSingleImageResponse = (
      data,
      cssSelector,
      idx,
      modifiers,
      isEmbedAsHTML,
      embedJs,
      variables,
      seoText,
      schemaInfoList,
      offerImpressionList,
      ) => {
      let offerImpressHTMLArr = [];
      let offerClickHTMLArr = [];
      if(offerImpressionList){
        for(const offerInd of offerImpressionList) {
        const impressionKeys = Object.keys(offerInd);
        let offerImpressHTML = "";
        let offerClickHTML = "";
        
        offerImpressHTML += ("event" + ': "' + "offerImpression") + '",';
        offerClickHTML += ("event" + ': "' + "offerClick") + '",';
        const offerKey = "num_of_offers";
        offerImpressHTML += ("num_of_offers" + ': "' + (offerInd[offerKey] || "")) + '",'; 
        impressionKeys.forEach(impressKey => {
          if(impressKey.includes("offerImpression")){
            offerImpressHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';    
          }
          
          if(impressKey.includes("offerClick")){
            offerClickHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';
          }
        });
      
        impressionHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerImpressHTML + "});";
        clickHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerClickHTML + "});";
        offerImpressHTMLArr.push(impressionHTMLStr);
        offerClickHTMLArr.push(clickHTMLStr);
        }
      }

      return new MutationObserver(function (mutations, me){
        let div;
        let platform;
        if(cssSelector.mobile && window.innerWidth <= 740) {
          div = document.querySelector(cssSelector.mobile);
          platform = 'mobile'
        }
        else if(cssSelector.desktop && window.innerWidth > 740) {
          div = document.querySelector(cssSelector.desktop);
          platform = 'desktop'
        }
        else {
          return;
        }
        if (div) {
          console.log("offerImpressionList", offerImpressionList);
          cssSelector = cssSelector[platform];
          let wrapper = document.createElement('div');
          injectToHTML(modifiers[platform], cssSelector, wrapper);

          let xDown = null;
          let yDown = null;
          let isCanvasPointerEventOn = isEmbedAsHTML;

          wrapper.addEventListener('touchstart', function (e) {
            xDown = e.touches[0].clientX; 
            yDown = e.touches[0].clientY;
          });

          wrapper.addEventListener('touchmove', function(e) {
            if (!xDown || !yDown) return;
            let xUp = e.touches[0].clientX;
            let yUp = e.touches[0].clientY;
            
            let xDiff = xDown - xUp;
            let yDiff = yDown - yUp;

            if (Math.abs(xDiff) + Math.abs(yDiff) > 50) {
              if (isCanvasPointerEventOn && isEmbedAsHTML) {
                document.getElementById(variables[0][1]).parentElement.style.pointerEvents = 'none';                
                isCanvasPointerEventOn = false;
              }              
              xDown = null;
              yDown = null;
            }
          });

          if (isEmbedAsHTML){
            console.log("offerImpressionList-isEmbedAsHTML", offerImpressionList);
            let canvasTag = document.createElement('canvas');
            canvasTag.style.pointerEvents = 'none';
            if (data.imageLink) {
              let a = document.createElement('a');
              a.href = data.imageLink;
              a.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[0];
                wrapper.append(offerClickScript);
              };
              a.onmouseover = function() {
                console.log("a image hover - add GA")
              };
              if (data.imageLink.includes('?')) {
                a.href = data.imageLink + '&' + data.targetData
              } else {
                a.href = data.imageLink + '?' + data.targetData
              }
              if(data.target) a.target = data.target;
              if(a.target === '_blank') a.rel = 'noreferrer noopener';
              a.append(canvasTag);
              wrapper.append(a);
            }
            else wrapper.append(canvasTag);
            wrapper.style = 'display: flex; justify-content: center; align-items: center; width: 100%; margin-top: 10px; margin-bottom: 10px;';
            canvasTag.id = variables[0][1];
            let scriptTag = document.createElement('script');
            scriptTag.innerHTML = embedJs;
            wrapper.append(scriptTag);

            const canvasWidth = parseInt(canvasTag.style.width);
            const canvasHeight = parseInt(canvasTag.style.height);

            let parentContainerWidth = window.getComputedStyle(wrapper.parentElement, null).getPropertyValue('width');
            parentContainerWidth = parseInt(parentContainerWidth);
            const properWidth = parentContainerWidth > canvasWidth ? canvasWidth : parentContainerWidth;

            if (canvasWidth > properWidth && platform === 'desktop') {
              const newRatio = Math.min(parentContainerWidth / canvasWidth, 1);
              canvasTag.style.width = (canvasWidth * newRatio).toString() + 'px';
              canvasTag.style.height = (canvasHeight * newRatio).toString() + 'px';
              canvasTag.parentElement.style.width = properWidth.toString() + 'px';
              canvasTag.nextSibling.style.width = properWidth.toString() + 'px';
            }
          }
          else {
            let imageData = new Image();
            imageData.src = data.imageUrl;
            imageData.onload = function() {
              wrapper.style= 'width: 100%; display: flex; justify-content: center; margin-top: 10px; margin-bottom: 10px;';
              let img = document.createElement('img');
              if(data.imageLink) {
                let a = document.createElement('a');
                a.href = data.imageLink;
                if (data.imageLink.includes('?')) {
                  a.href = data.imageLink + '&' + data.targetData
                } else {
                  a.href = data.imageLink + '?' + data.targetData
                }
                if(data.target) a.target = data.target;
                if(a.target === '_blank') a.rel = 'noreferrer noopener';
                a.appendChild(img);
                wrapper.appendChild(a);
              }
              else wrapper.appendChild(img);
              img.src = data.imageUrl;
              img.alt = data.imageAltText;
              img.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[0];
                wrapper.append(offerClickScript);
              };
              img.onmouseover = function() {
                console.log("image hover - add GA")
              };
              if(platform === 'mobile') {
                img.style.width = '100%';
              }
              else if(this.width > 2500) img.style.width = '100%';
            }
          }
          if (seoText && seoText[0]) {
            let seoTag = document.createElement('div');
            seoTag.innerHTML = seoText[0];
            seoTag.style.display = 'none';
            wrapper.append(seoTag);
          }
          if (schemaInfoList) {
            const schemaInfo = [];
            for (let i = 0; i < schemaInfoList.length; i++) {
              schemaInfo.push(createSchemaObjects(schemaInfoList[i], data[i].imageUrl));
              let seoDiv = document.createElement('div');
              seoDiv.style.display = 'none';
              let productDiv = document.createElement('div');
              productDiv.id = 'product';
              seoDiv.append(productDiv);
    
              let strongText = document.createElement('strong');
              strongText.innerHTML = schemaInfoList[i].name || '';
              productDiv.append(strongText);
    
              let paragraph = document.createElement('p');
              paragraph.innerHTML = schemaInfoList[i].text || '';
              productDiv.append(paragraph);
              if(offerImpressionList){
                const impressionKeys = Object.keys(offerImpressionList[i]);
                impressionKeys.forEach(impressKey => {
                  let impressionP = document.createElement('p');
                  impressionP.innerHTML = (impressKey + ":" + offerImpressionList[i][impressKey]) || '';
                  productDiv.append(impressionP);
                });

                let offerImpressionScript = document.createElement('script');
                offerImpressionScript.innerHTML = offerImpressHTMLArr[i];
                wrapper.append(offerImpressionScript);
              }
    
              let image = document.createElement('img');
              image.src = data.imageUrl;
              productDiv.append(image);
    
              let stamp = document.createElement('p');
              stamp.innerHTML = schemaInfoList[i].stamp || '';
              productDiv.append(stamp);
    
              wrapper.append(seoDiv);
            }
            let schemaTag = document.createElement('script');
            schemaTag.type = 'application/ld+json';
            schemaTag.innerHTML = JSON.stringify(schemaInfo);
            wrapper.append(schemaTag);
          }
          me.disconnect();
          return;
        }
      });
    }
  
        
const createCarouselResponse = (
  data,
  cssSelector,
  idx,
  modifiers,
  isEmbedAsHTML,
  embedJs,
  variables,
  seoTextList,
  schemaInfoList,
  isAutoScrollEnabled,
  transitionTime,
  timeUntilNextTransition,
  offerImpressionList,
  isFullWidth,
) => {
  return new MutationObserver((mutations, me) => {
    let offerImpressHTMLArr = [];
    let offerClickHTMLArr = [];
    if(offerImpressionList){
      for(const offerInd of offerImpressionList) {
      const impressionKeys = Object.keys(offerInd);
     
      let offerImpressHTML = "";
      let offerClickHTML = "";

      offerImpressHTML += ("event" + ': "' + "offerImpression") + '",';
      offerClickHTML += ("event" + ': "' + "offerClick") + '",';
      const offerKey = "num_of_offers";
      offerImpressHTML += ("num_of_offers" + ': "' + (offerInd[offerKey] || "")) + '",'; 
      impressionKeys.forEach(impressKey => {
        if(impressKey.includes("offerImpression")){
          offerImpressHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';    
        }
    
        if(impressKey.includes("offerClick")){
          offerClickHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';
        }
      });
    
      let impressionHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerImpressHTML + "});";
      let clickHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerClickHTML + "});";
      offerImpressHTMLArr.push(impressionHTMLStr);
      offerClickHTMLArr.push(clickHTMLStr);
      }
    }
    let offerNavLeftHTML = "";
    let offerNavRightHTML = "";
    offerNavLeftHTML += "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({";
    offerNavLeftHTML += ("event" + ': "' + "navigationInteraction") + '",';
    offerNavLeftHTML += ("navigationInteraction_action" + ': "' + "left arrow click") + '",';
    offerNavLeftHTML += "});";

    offerNavRightHTML += "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({";
    offerNavRightHTML += ("event" + ': "' + "navigationInteraction") + '",';
    offerNavRightHTML += ("navigationInteraction_action" + ': "' + "right arrow click") + '",';
    offerNavRightHTML += "});";
    let div;
    let platform;
    if (cssSelector.mobile && window.innerWidth <= 740) {
      div = document.querySelector(cssSelector.mobile);
      platform = 'mobile';
    }
    else if (cssSelector.desktop && window.innerWidth > 740) {
      div = document.querySelector(cssSelector.desktop);
      platform = 'desktop';
    }
    else {        
      return;
    }

    if (div) {
      const targetCssSelector = cssSelector[platform];
      let carouselContainer = document.createElement('div');
      injectToHTML(modifiers[platform], targetCssSelector, carouselContainer);
      const carouselStyle = 'position: relative; margin: 0 auto; max-width: 90% !important; margin-top: 10px; margin-bottom: 10px;';
      const fullWidthStyle = 'position: relative; margin: 0 !important; max-width: none !important; width: 100% !important;';
      carouselContainer.style = isFullWidth ? fullWidthStyle : carouselStyle;
      carouselContainer.id = 'carousel_' + makeRandomString();

      const controlsContainer = document.createElement('div');
      controlsContainer.className = 'carousel-controls';

      const rightBtnId = 'carousel_right_btn_' + makeRandomString();
      let rightBtn = document.createElement('button');
      rightBtn.id = rightBtnId;
      const btnPosition = isFullWidth ? '20px' : '0px';
      rightBtn.style = 'position: absolute; right: ' + btnPosition + '; top: 50%; background: none; border: none; cursor: pointer; outline: none;';
      let rightBtnIcon = document.createElement('img');
      rightBtnIcon.src = 'https://av2-internal-web-int-dev.s3.amazonaws.com/images/rightArrow.svg';
      rightBtnIcon.alt = 'carousel right button icon';
      rightBtnIcon.style = 'width: 30px;';
      rightBtn.appendChild(rightBtnIcon);
      controlsContainer.appendChild(rightBtn);

      const leftBtnId = 'carousel_left_btn_' + makeRandomString();
      let leftBtn = document.createElement('button');
      leftBtn.id = leftBtnId;
      leftBtn.style = 'position: absolute; left: ' + btnPosition + '; top: 50%; background: none; border: none; cursor: pointer; outline: none;';
      let leftBtnIcon = document.createElement('img');
      leftBtnIcon.src = 'https://av2-internal-web-int-dev.s3.amazonaws.com/images/leftArrow.svg';
      leftBtnIcon.alt = 'carousel left button icon';
      leftBtnIcon.style = 'width: 30px;';
      leftBtn.appendChild(leftBtnIcon);
      controlsContainer.appendChild(leftBtn);

      const carouselContentId = 'carousel_content_' + makeRandomString();
      const carouselContent = document.createElement('div');
      carouselContent.id = carouselContentId;
      carouselContent.style = 'width: 100%; height: 300px; display: flex; justify-content: flex-start; overflow: hidden; position: relative;';
      carouselContainer.appendChild(carouselContent);

      const carouselSliderId = 'carousel_slider_' + makeRandomString();
      let carouselSlider = document.createElement('div');
      carouselSlider.id = carouselSliderId;
      carouselSlider.style = 'display: flex; height: 100%; flex-shrink: 0';
      
      if (transitionTime) {
        const slideTimeTransition = transitionTime === '0' ? '0.75' : transitionTime;
        carouselSlider.style.transition = 'all ' + (slideTimeTransition * 1000).toString() + 'ms';
      } else {
        carouselSlider.style.transition = 'all 625ms';
      }
      carouselSlider.style.width = (data.length * 100).toString() + '%';

      carouselContent.appendChild(carouselSlider);
      carouselContent.appendChild(controlsContainer);

      let carouselDotsNavigator = document.createElement('div');
      carouselDotsNavigator.style = 'display: flex; justify-content: center; padding: 10px 0;';
      carouselContainer.appendChild(carouselDotsNavigator);

      const sectionPercentage = (100 / data.length).toString() + '%';
      
      let direction = -1;      

      const updateDots = (currentDot, targetDot) => {
        currentDot.classList.remove('current_slide');
        currentDot.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;';
        targetDot.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;';
        targetDot.classList.add('current_slide');
        targetDot.style.background = 'rgba(0,0,0, 1)';
        currentDot.style.background = 'rgba(0,0,0, 0.3)';
      }

      let autoScrollInterval = null;
      
      const clearAutoScroll = () => {
        clearInterval(autoScrollInterval);
        autoScrollInterval = setInterval(() => {
          rightBtn.click();
        },
        parseFloat(timeUntilNextTransition) * 1000
        );
      };

      if (isAutoScrollEnabled) {
        autoScrollInterval = setInterval(() => {
          rightBtn.click();
        },
        parseFloat(timeUntilNextTransition) * 1000
        );
      }

      rightBtn.addEventListener('click', (e) => {
        let rightClickScript = document.createElement('script');
        rightClickScript.innerHTML = offerNavRightHTML;
        rightBtn.append(rightClickScript);
        e.stopPropagation();

        if (autoScrollInterval) {
          clearAutoScroll();
        }

        if (direction === 1) {
          carouselSlider.prepend(carouselSlider.lastElementChild);
        }
        direction = -1;

        carouselContent.style.justifyContent = 'flex-start';
        carouselSlider.style.transform = 'translate(-' + sectionPercentage + ')';
      });

      leftBtn.addEventListener('click', (e) => {
        let leftClickScript = document.createElement('script');
        leftClickScript.innerHTML = offerNavLeftHTML;
        leftBtn.append(leftClickScript);
        e.stopPropagation();

        if (autoScrollInterval) {
          clearAutoScroll();
        }

        if (direction === -1) {
          carouselSlider.appendChild(carouselSlider.firstElementChild);
        }
        direction = 1;
        carouselContent.style.justifyContent = 'flex-end';
        carouselSlider.style.transform = 'translate(' + sectionPercentage + ')';
      });

      carouselSlider.addEventListener('transitionend', () => {
        if (direction === 1) {
          carouselSlider.prepend(carouselSlider.lastElementChild);
        } else {
          carouselSlider.appendChild(carouselSlider.firstElementChild);
        }

        carouselSlider.style.transition = 'none';
        carouselSlider.style.transform = 'translate(0)';

        let targetDot;

        const currentDot = carouselDotsNavigator.querySelector('.current_slide');
          
        if (direction === -1) {
          targetDot = currentDot.nextElementSibling;
          if (!targetDot) {
            targetDot = carouselDotsNavigator.firstElementChild;
          }
        }
        else {
          targetDot = currentDot.previousElementSibling;
          if (!targetDot) {
            targetDot = carouselDotsNavigator.lastElementChild;
          }
        }
        updateDots(currentDot, targetDot);

        setTimeout(() => {
          if (transitionTime) {
            const slideTimeTransition = transitionTime === '0' ? '0.75' : transitionTime;
            carouselSlider.style.transition = 'all ' + (slideTimeTransition * 1000).toString() + 'ms';
          } else {
            carouselSlider.style.transition = 'all 625ms';
          }
        });
      }, false);

      if (platform === 'mobile') {
        carouselContainer.style.width = '100%';
        if (!isFullWidth) {
          carouselContainer.style.maxWidth = '100%';
        }
      }

      if (seoTextList && seoTextList.length > 0) {
        let text = '';
        seoTextList.forEach(seoText => {
          text += seoText;
        });
        let seoTag = document.createElement('div');
        seoTag.innerHTML = text;
        seoTag.style.display = 'none';
        carouselContainer.append(seoTag);
      }

      if (schemaInfoList) {
        const schemaInfo = [];
        for (let i = 0; i < schemaInfoList.length; i++) {
          schemaInfo.push(createSchemaObjects(schemaInfoList[i], data[i].imageUrl));
          let seoDiv = document.createElement('div');
          seoDiv.style.display = 'none';
          let productDiv = document.createElement('div');
          productDiv.id = 'product';
          seoDiv.append(productDiv);
          
          let strongText = document.createElement('strong');
          strongText.innerHTML = schemaInfoList[i].name || '';
          productDiv.append(strongText);
          
          let paragraph = document.createElement('p');
          paragraph.innerHTML = schemaInfoList[i].text || '';
          productDiv.append(paragraph);
          if(offerImpressionList){
            const impressionKeys = Object.keys(offerImpressionList[i]);
            impressionKeys.forEach(impressKey => {
              let impressionP = document.createElement('p');
              impressionP.innerHTML = offerImpressionList[i][impressKey] || '';
              productDiv.append(impressionP);
            })
            let offerImpressionScript = document.createElement('script');
            offerImpressionScript.innerHTML = offerImpressHTMLArr[i];
            productDiv.append(offerImpressionScript);
          }
          
          let image = document.createElement('img');
          image.src = data[i].imageUrl;
          productDiv.append(image);
          
          
          let stamp = document.createElement('p');
          stamp.innerHTML = schemaInfoList[i].stamp || '';
          productDiv.append(stamp);
          
          carouselContainer.append(seoDiv);
        }
        let schemaTag = document.createElement('script');
        schemaTag.type = 'application/ld+json';
        schemaTag.innerHTML = JSON.stringify(schemaInfo);
        carouselContainer.append(schemaTag);
      }

      let xDown = null;
      let yDown = null;
      let isCanvasPointerEventOn = isEmbedAsHTML;

      carouselContent.addEventListener('touchstart', function (e) {
        xDown = e.touches[0].clientX;
        yDown = e.touches[0].clientY;
      });

      carouselContent.addEventListener('touchmove', function(e) {
        if (!xDown || !yDown) return;
        let xUp = e.touches[0].clientX;
        let yUp = e.touches[0].clientY;
        
        let xDiff = xDown - xUp;
        let yDiff = yDown - yUp;
        
        if (Math.abs(xDiff) + Math.abs(yDiff) > 50) {
          if (isCanvasPointerEventOn && isEmbedAsHTML) {
            const validVariables = variables.filter(variable => {
              return variable.length > 0;
            });
            validVariables.forEach(variable => {
              document.getElementById(variable[1]).parentElement.style.pointerEvents = 'none';
            });
            isCanvasPointerEventOn = false;
          }
          if (Math.abs(xDiff) > Math.abs(yDiff)) {
            if (xDiff > 0) rightBtn.click();
            else leftBtn.click();
          }
          xDown = null;
          yDown = null;
        }
      });

      let actualDOMImageHeight;
      let actualDOMImageWidth;

      if (isEmbedAsHTML) {
        let referenceSlide;
        variables.forEach((variable, idx) => {
          const imageSlide = document.createElement('div');
          imageSlide.style = 'flex-shrink: 0; display: flex; justify-content: center; align-items: center;';
          imageSlide.style.flexBasis = sectionPercentage;
          imageSlide.setAttribute('data-idx', idx);
          
          const canvasTag = document.createElement('canvas');
          canvasTag.style.pointerEvents = 'none';
          const img = document.createElement('img');   
          img.onclick = function() {
            console.log("image clicked - add GA")
            let offerClickScript = document.createElement('script');
            offerClickScript.innerHTML = offerClickHTMLArr[idx];
            imageSlide.append(offerClickScript);
          };       
          
          if (variable.length === 0) {
            img.src = data[idx].imageUrl;
            if (data[idx].imageLink) {
              let url = data[idx].imageLink;

              if (data[idx].imageLink.includes('?')) {
                url = data[idx].imageLink + '&' + data[idx].targetData;
              } else {
                url = data[idx].imageLink + '?' + data[idx].targetData;
              }
              
              const linkTarget = data[idx].target === '_blank' ? '_blank' : '_self';
              img.onclick = () => { 
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx];
                  imageSlide.append(offerClickScript);
                  window.open(url, linkTarget); 
              };
              img.style.cursor = 'pointer';
            }
            
            imageSlide.appendChild(img);
            carouselSlider.appendChild(imageSlide);
          }
          else {
            canvasTag.id = variable[1];
            if(data[idx].imageLink) {
              let url = data[idx].imageLink;

              if (data[idx].imageLink.includes('?')) {
                url = data[idx].imageLink + '&' + data[idx].targetData;
              } else {
                url = data[idx].imageLink + '?' + data[idx].targetData;
              }
              const linkTarget = data[idx].target === '_blank' ? '_blank' : '_self';
              imageSlide.onclick = () => { 
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx];
                  imageSlide.append(offerClickScript);
                  window.open(url, linkTarget); 
              };
              imageSlide.style.cursor = 'pointer';
            }

            imageSlide.appendChild(canvasTag);

            referenceSlide = imageSlide;
            carouselSlider.appendChild(imageSlide);
          }
          
          const carouselDotIndicator = document.createElement('button');
          carouselDotIndicator.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;'

          if(idx === 0) {
            carouselDotIndicator.style.background = 'rgba(0,0,0, 1)';
            carouselDotIndicator.className = 'current_slide';
            imageSlide.className = 'current_slide';
          }
          else {
            carouselDotIndicator.style.background = 'rgba(0,0,0, 0.3)';
          }
          carouselDotsNavigator.appendChild(carouselDotIndicator);
        });

        const scriptTag = document.createElement('script');
        scriptTag.innerHTML = embedJs;
        carouselContainer.append(scriptTag);

        const validVariables = variables.filter(variable => {
          return variable.length > 0;
        });

        const canvas = document.getElementById(validVariables[0][1]);
        const canvasWidth = parseInt(canvas.style.width);
        const canvasHeight = parseInt(canvas.style.height);
        const parentContainerWidth = parseInt(window.getComputedStyle(carouselContainer, null).getPropertyValue('width'));
        carouselContent.style.height = canvas.style.height;

        let isParentContainerSmaller;

        if (canvasWidth > parentContainerWidth) {
          isParentContainerSmaller = true;
        }
        else {
          isParentContainerSmaller = false;
        }

        let reducedWidth;
        if (platform === 'mobile') {
          reducedWidth = canvasWidth * 0.85;
        }
        else {
          reducedWidth = canvasWidth * 0.95;
        }
        let newRatio;

        if (isParentContainerSmaller) {
          if (platform === 'mobile') {
            newRatio = Math.min((parentContainerWidth * 0.75) / canvasWidth, 1);  
          }
          else {
            newRatio = Math.min((parentContainerWidth) / canvasWidth, 1);
          }
        }
        else {
          newRatio = Math.min(reducedWidth / canvasWidth, 1);
        }
        if (isFullWidth) newRatio = 1;
        validVariables.forEach(variable => {              
          let tempCanvas = document.getElementById(variable[1]);
          if (!isFullWidth) {
            tempCanvas.style.width = (canvasWidth * newRatio).toString() + 'px';
            tempCanvas.style.height = (canvasHeight * newRatio).toString() + 'px';
            tempCanvas.parentElement.style.width = (canvasWidth * newRatio).toString() + 'px';
            tempCanvas.parentElement.style.height = (canvasHeight * newRatio).toString() + 'px';      
          } else {
            carouselContent.style.width = '100% !important';
            carouselContent.style.height = 'none !important';
            tempCanvas.style.width = '100% !important';
            tempCanvas.style.height = 'none !important';
            tempCanvas.parentElement.style.width = '100% !important';
            tempCanvas.parentElement.style.height = 'none !important';
          }    
        });
        if (!isFullWidth) {
          carouselContainer.style.maxWidth = (canvasWidth + 80).toString() + 'px';    
        }
        me.disconnect();
        return;
      } 
      else {
        let imageData = new Image();
        imageData.onload = function() {
          data.forEach((imageInfo, idx) => {
            const imageSlide = document.createElement('div');
            imageSlide.style = 'flex-shrink: 0; display: flex; justify-content: center; align-items: center;';
            imageSlide.style.flexBasis = sectionPercentage;
            imageSlide.setAttribute('data-idx', idx);
            const img = document.createElement('img');
            img.onclick = function() {
              console.log("image clicked - add GA")
              let offerClickScript = document.createElement('script');
              offerClickScript.innerHTML = offerClickHTMLArr[idx];
              imageSlide.append(offerClickScript);
            };  

            img.src = imageInfo.imageUrl;
            img.alt = imageInfo.imageAltText; 
            if (isFullWidth) {
              img.style.maxWidth = 'none !important';
            } else {
              img.style.maxWidth = this.width.toString() + 'px';
            }            

            if (imageInfo.imageLink) {                
              let url = imageInfo.imageLink;

              if (imageInfo.imageLink.includes('?')) {
                url = imageInfo.imageLink + '&' + imageInfo.targetData;
              } else {
                url = imageInfo.imageLink + '?' + imageInfo.targetData;
              }

              const linkTarget = imageInfo.target === '_blank' ? '_blank' : '_self';
              img.onclick = () => { 
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx];
                  imageSlide.append(offerClickScript);
                  window.open(url, linkTarget); 
              };
              img.style.cursor = 'pointer';
            }
                          
            img.style.width = '93%';
            imageSlide.appendChild(img);
                          
            carouselSlider.appendChild(imageSlide);

            if (platform === 'mobile') {
              img.style.width = '75%';
            }

            if (isFullWidth) {
              img.style.width = '100%';
            }
            const carouselDotIndicator = document.createElement('button');
            carouselDotIndicator.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;'

            if (idx === 0) {
              carouselDotIndicator.style.background = 'rgba(0,0,0, 1)';
              carouselDotIndicator.className = 'current_slide';
              imageSlide.className = 'current_slide';
              actualDOMImageHeight = window.getComputedStyle(img, null).getPropertyValue('height');
              actualDOMImageWidth = window.getComputedStyle(img, null).getPropertyValue('width');
            }
            else {
              carouselDotIndicator.style.background = 'rgba(0,0,0, 0.3)';
            }
            carouselDotIndicator.setAttribute('data-idx', idx);
            carouselDotsNavigator.appendChild(carouselDotIndicator);
          });

          if (platform === 'mobile') {
            carouselContent.style.height = actualDOMImageHeight;
          } else {
            carouselContent.style.height = 'auto';
          }

          if (!isFullWidth) {
            carouselContainer.style.maxWidth = (parseInt(actualDOMImageWidth) + 80).toString() + 'px';
          }
        };
        imageData.src = data[0].imageUrl;
        me.disconnect();
        return;
      }
    }
  })
}

        
    const createStackResponse = (
      data,
      cssSelector,
      idx,
      modifiers,
      isEmbedAsHTML,
      embedJs,
      variables,
      seoTextList,
      schemaInfoList,
      offerImpressionList,
      ) => {
      return new MutationObserver(function(mutations, me){
        let offerImpressHTMLArr = [];
        let offerClickHTMLArr = [];
        if(offerImpressionList){
          for(const offerInd of offerImpressionList) {
          const impressionKeys = Object.keys(offerInd);
        
          let offerImpressHTML = "";
          let offerClickHTML = "";

          offerImpressHTML += ("event" + ': "' + "offerImpression") + '",';
          offerClickHTML += ("event" + ': "' + "offerClick") + '",';
          const offerKey = "num_of_offers";
          offerImpressHTML += ("num_of_offers" + ': "' + (offerInd[offerKey] || "")) + '",'; 
          impressionKeys.forEach(impressKey => {
            if(impressKey.includes("offerImpression")){
              offerImpressHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';    
            }
        
            if(impressKey.includes("offerClick")){
              offerClickHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';
            }
          });
        
          impressionHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerImpressHTML + "});";
          clickHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerClickHTML + "});";
          offerImpressHTMLArr.push(impressionHTMLStr);
          offerClickHTMLArr.push(clickHTMLStr);
          }
        }

        let div;
        let platform;
        if(cssSelector.mobile && window.innerWidth <= 740) {
          div = document.querySelector(cssSelector.mobile);
          platform = 'mobile'
        }
        else if(cssSelector.desktop && window.innerWidth > 740) {
          div = document.querySelector(cssSelector.desktop);
          platform = 'desktop'
        }
        else {
          return;
        }
        if (div) {
          cssSelector = cssSelector[platform];
          let wrapper = document.createElement('div');
          injectToHTML(modifiers[platform], cssSelector, wrapper);

          let xDown = null;
          let yDown = null;
          let isCanvasPointerEventOn = isEmbedAsHTML;

          wrapper.addEventListener('touchstart', function (e) {
            xDown = e.touches[0].clientX; 
            yDown = e.touches[0].clientY;
          });

          wrapper.addEventListener('touchmove', function(e) {
            if (!xDown || !yDown) return;
            let xUp = e.touches[0].clientX;
            let yUp = e.touches[0].clientY;
            
            let xDiff = xDown - xUp;
            let yDiff = yDown - yUp;

            if (Math.abs(xDiff) + Math.abs(yDiff) > 50) {
              if (isCanvasPointerEventOn && isEmbedAsHTML) {
                const validVariables = variables.filter(variable => {
                  return variable.length > 0;
                });
                validVariables.forEach(variable => {
                  document.getElementById(variable[1]).parentElement.style.pointerEvents = 'none';
                });
                isCanvasPointerEventOn = false;
              }              
              xDown = null;
              yDown = null;
            }
          });

          if (isEmbedAsHTML) {
            for(let i = 0; i < variables.length; i++) {
              let div = document.createElement('div');
              div.style = 'display: flex; justify-content: center; align-items: center; width: 100%; padding: 1%';
              let canvasTag = document.createElement('canvas');
              let img = document.createElement('img');
              img.onclick = function() {
                console.log("image clicked - add GA")
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[i];
                wrapper.append(offerClickScript);
              };   

              if (variables[i].length === 0) {
                img.src = data[i].imageUrl;
                img.onclick = function() {
                  console.log("image clicked - add GA")
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[i];
                  wrapper.append(offerClickScript);
                };
                if (data[i].imageLink) {
                  let a = document.createElement('a');
                  a.href = data[i].imageLink;
                  if (data[i].imageLink.includes('?')) {
                    a.href = data[i].imageLink + '&' + data[i].targetData
                  } else {
                    a.href = data[i].imageLink + '?' + data[i].targetData
                  }
                  if(data[i].target) a.target = data[i].target;
                  if(a.target === '_blank') a.rel = 'noreferrer noopener';
                  a.appendChild(img);
                  div.appendChild(a);
                }
                else div.appendChild(img);
                wrapper.append(div);
              }
              else {
                canvasTag.id = variables[i][1];
                canvasTag.style.pointerEvents = 'none';
                if (data[i].imageLink) {
                  let a = document.createElement('a');
                  a.href = data[i].imageLink;
                  a.onclick = function() {
                    console.log("image clicked - add GA")
                    let offerClickScript = document.createElement('script');
                    offerClickScript.innerHTML = offerClickHTMLArr[i];
                    wrapper.append(offerClickScript);
                  };
                  if (data[i].imageLink.includes('?')) {
                    a.href = data[i].imageLink + '&' + data[i].targetData
                  } else {
                    a.href = data[i].imageLink + '?' + data[i].targetData
                  }
                  if(data[i].target) a.target = data[i].target;
                  if(a.target === '_blank') a.rel = 'noreferrer noopener';
                  a.append(canvasTag);
                  div.append(a);
                }
                else div.append(canvasTag);
                wrapper.append(div);
              }
            }
            wrapper.style = 'width: 100%; margin-top: 10px; margin-bottom: 10px;';
            let scriptTag = document.createElement('script');
            scriptTag.innerHTML = embedJs;
            wrapper.append(scriptTag);

            const validVariables = variables.filter(variable => {
              if (variable.length > 0) return variable;
            });
            let canvas = document.getElementById(validVariables[0][1]);

            const canvasWidth = parseInt(canvas.style.width);
            const canvasHeight = parseInt(canvas.style.height);

            let parentContainerWidth = window.getComputedStyle(wrapper.parentElement, null).getPropertyValue('width');
            parentContainerWidth = parseInt(parentContainerWidth);
            const properWidth = parentContainerWidth > canvasWidth ? canvasWidth : parentContainerWidth;

            if (canvasWidth > properWidth && platform === 'desktop') {
              const newRatio = Math.min(parentContainerWidth / canvasWidth, 1);
              validVariables.forEach(variable => {
                let tempCanvas = document.getElementById(variable[1]);
                tempCanvas.style.width = (canvasWidth * newRatio).toString() + 'px';
                tempCanvas.style.height = (canvasHeight * newRatio).toString() + 'px';
                tempCanvas.parentElement.style.width = properWidth.toString() + 'px';
                tempCanvas.nextSibling.style.width = properWidth.toString() + 'px';
              });
            }
          }
          else {
            let imageData = new Image();
            imageData.src = data[0].imageUrl;
            imageData.onload = function() {
              wrapper.style = 'width: 100%; margin-top: 10px; margin-bottom: 10px;';
              for(let idx = 0; idx < data.length; idx++) {
                let div = document.createElement('div');
                let img = document.createElement('img');
                img.onclick = function() {
                  console.log("image clicked - add GA")
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx];
                  wrapper.append(offerClickScript);
                };  
                if(data[idx].imageLink) {
                  let a = document.createElement('a');
                  a.href = data[idx].imageLink;
                  a.onclick = function() {
                    console.log("image clicked - add GA")
                    let offerClickScript = document.createElement('script');
                    offerClickScript.innerHTML = offerClickHTMLArr[idx];
                    wrapper.append(offerClickScript);
                  };
                  if (data[idx].imageLink.includes('?')) {
                    a.href = data[idx].imageLink + '&' + data[idx].targetData
                  } else {
                    a.href = data[idx].imageLink + '?' + data[idx].targetData
                  }
                  if(data[idx].target) a.target = data[idx].target;
                  if(a.target === '_blank') a.rel = 'noreferrer noopener';
                  a.appendChild(img);
                  div.appendChild(a);
                }
                else div.appendChild(img);
                div.style = 'display: flex; justify-content: center; padding: 1%;';
                img.src = data[idx].imageUrl;
                img.alt = data[idx].imageAltText;
                img.onclick = function() {
                  console.log("image clicked - add GA")
                  let offerClickScript = document.createElement('script');
                  offerClickScript.innerHTML = offerClickHTMLArr[idx];
                  wrapper.append(offerClickScript);
                };
                if(platform === 'mobile') {
                  img.style.width = '100%';
                }
                else if(this.width > 2500) img.style.width = '100%';
                wrapper.appendChild(div);
              }
            }
          }
          if (seoTextList && !!seoTextList.length) {
            let text = "";
            seoTextList.forEach(seoText => {
              text += seoText;
            });
            let seoTag = document.createElement('div');
            seoTag.innerHTML = text;
            seoTag.style.display = 'none';
            wrapper.append(seoTag);
          }
          if (schemaInfoList) {
            const schemaInfo = [];
            for (let i = 0; i < schemaInfoList.length; i++) {
              schemaInfo.push(createSchemaObjects(schemaInfoList[i], data[i].imageUrl));
              let seoDiv = document.createElement('div');
              seoDiv.style.display = 'none';
              let productDiv = document.createElement('div');
              productDiv.id = 'product';
              seoDiv.append(productDiv);
    
              let strongText = document.createElement('strong');
              strongText.innerHTML = schemaInfoList[i].name || '';
              productDiv.append(strongText);
    
              let paragraph = document.createElement('p');
              paragraph.innerHTML = schemaInfoList[i].text || '';
              productDiv.append(paragraph);
              if(offerImpressionList){
                const impressionKeys = Object.keys(offerImpressionList[i]);
                impressionKeys.forEach(impressKey => {
                  let impressionP = document.createElement('p');
                  impressionP.innerHTML = offerImpressionList[i][impressKey] || '';
                  productDiv.append(impressionP);
                });
                let offerImpressionScript = document.createElement('script');
                offerImpressionScript.innerHTML = offerImpressHTMLArr[i];
                wrapper.append(offerImpressionScript);
              }
    
              let image = document.createElement('img');
              image.src = data.imageUrl;
              image.onclick = () => {
                console.log("image clicked - add GA")
              };
              productDiv.append(image);
    
              let stamp = document.createElement('p');
              stamp.innerHTML = schemaInfoList[i].stamp || '';
              productDiv.append(stamp);
    
              wrapper.append(seoDiv);
            }
            let schemaTag = document.createElement('script');
            schemaTag.type = 'application/ld+json';
            schemaTag.innerHTML = JSON.stringify(schemaInfo);
            wrapper.append(schemaTag);
          }
          me.disconnect();
          return;
        }
      });
    }
  
        
const createMultiImageCarousel = (
  data,
  cssSelector,
  idx,
  modifiers,
  isEmbedAsHTML,
  embedJs,
  variables,
  seoTextList,
  schemaInfoList,
  isAutoScrollEnabled,
  transitionTime,
  timeUntilNextTransition,
  offerImpressionList,
) => {
  return new MutationObserver(async (mutations, me) => {
    let offerImpressHTMLArr = [];
    let offerClickHTMLArr = [];
    if(offerImpressionList){
      for(const offerInd of offerImpressionList) {
      const impressionKeys = Object.keys(offerInd);
     
      let offerImpressHTML = "";
      let offerClickHTML = "";

      offerImpressHTML += ("event" + ': "' + "offerImpression") + '",';
      offerClickHTML += ("event" + ': "' + "offerClick") + '",';
      const offerKey = "num_of_offers";
      offerImpressHTML += ("num_of_offers" + ': "' + (offerInd[offerKey] || "")) + '",'; 
      impressionKeys.forEach(impressKey => {
        if(impressKey.includes("offerImpression")){
          offerImpressHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';    
        }
    
        if(impressKey.includes("offerClick")){
          offerClickHTML += (impressKey + ': "' + offerInd[impressKey]) + '",';
        }
      });
    
      let impressionHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerImpressHTML + "});";
      let clickHTMLStr = "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({" + offerClickHTML + "});";
      offerImpressHTMLArr.push(impressionHTMLStr);
      offerClickHTMLArr.push(clickHTMLStr);
      }
    }
    let offerNavLeftHTML = "";
    let offerNavRightHTML = "";
    offerNavLeftHTML += "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({";
    offerNavLeftHTML += ("event" + ': "' + "navigationInteraction") + '",';
    offerNavLeftHTML += ("navigationInteraction_action" + ': "' + "left arrow click") + '",';
    offerNavLeftHTML += "});";

    offerNavRightHTML += "window.dataLayer = window.dataLayer || [];" + "window.dataLayer.push({";
    offerNavRightHTML += ("event" + ': "' + "navigationInteraction") + '",';
    offerNavRightHTML += ("navigationInteraction_action" + ': "' + "right arrow click") + '",';
    offerNavRightHTML += "});";
    let div;
    let platform;
    if (cssSelector.mobile && window.innerWidth <= 740) {
      div = document.querySelector(cssSelector.mobile);
      platform = 'mobile';
    }
    else if (cssSelector.desktop && window.innerWidth > 740) {
      div = document.querySelector(cssSelector.desktop);
      platform = 'desktop';
    }
    else {        
      return;
    }

    if (div) {
      const targetCssSelector = cssSelector[platform];
      let carouselContainer = document.createElement('div');
      injectToHTML(modifiers[platform], targetCssSelector, carouselContainer);
      carouselContainer.style = 'margin: 0 auto; position: relative; max-width: 90% !important; position: relative; margin-top: 10px; margin-bottom: 10px;';
      carouselContainer.id = 'carousel_' + makeRandomString();

      const controlsContainer = document.createElement('div');
      controlsContainer.className = 'carousel-controls';

      const rightBtnId = 'carousel_right_btn_' + makeRandomString();
      let rightBtn = document.createElement('button');
      rightBtn.id = rightBtnId;
      rightBtn.style = 'position: absolute; right: -40px; top: 50%; background: none; border: none; cursor: pointer; outline: none;';
      let rightBtnIcon = document.createElement('img');
      rightBtnIcon.src = 'https://av2-internal-web-int-dev.s3.amazonaws.com/images/rightArrow.svg';
      rightBtnIcon.alt = 'carousel right button icon';
      rightBtnIcon.style = 'width: 30px;';
      rightBtn.appendChild(rightBtnIcon);
      controlsContainer.appendChild(rightBtn);

      const leftBtnId = 'carousel_left_btn_' + makeRandomString();
      let leftBtn = document.createElement('button');
      leftBtn.id = leftBtnId;
      leftBtn.style = 'position: absolute; left: -40px; top: 50%; background: none; border: none; cursor: pointer; outline: none;';
      let leftBtnIcon = document.createElement('img');
      leftBtnIcon.src = 'https://av2-internal-web-int-dev.s3.amazonaws.com/images/leftArrow.svg';
      leftBtnIcon.alt = 'carousel left button icon';
      leftBtnIcon.style = 'width: 30px;';
      leftBtn.appendChild(leftBtnIcon);
      controlsContainer.appendChild(leftBtn);

      const carouselContentId = 'carousel_content_' + makeRandomString();
      const carouselContent = document.createElement('div');
      carouselContent.id = carouselContentId;
      carouselContent.style = 'width: 100%; height: 300px; display: flex; justify-content: flex-start; overflow: hidden;';
      carouselContainer.appendChild(carouselContent);

      const carouselSliderId = 'carousel_slider_' + makeRandomString();
      let carouselSlider = document.createElement('div');
      carouselSlider.id = carouselSliderId;
      carouselSlider.style = 'display: flex; height: 100%; flex-shrink: 0';
      
      if (transitionTime) {
        const slideTimeTransition = transitionTime === '0' ? '0.75' : transitionTime;
        carouselSlider.style.transition = 'all ' + (slideTimeTransition * 1000).toString() + 'ms';
      } else {
        carouselSlider.style.transition = 'all 625ms';
      }

      carouselContent.appendChild(carouselSlider);
      carouselContainer.appendChild(controlsContainer);

      let carouselDotsNavigator = document.createElement('div');
      carouselDotsNavigator.style = 'display: flex; justify-content: center; padding: 10px 0;';
      carouselContainer.appendChild(carouselDotsNavigator);

      const sectionPercentage = (100 / data.length).toString() + '%';
      
      let direction = -1;      

      const updateDots = (currentDot, targetDot) => {
        currentDot.classList.remove('current_slide');
        currentDot.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;';
        targetDot.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;';
        targetDot.classList.add('current_slide');
        targetDot.style.background = 'rgba(0,0,0, 1)';
        currentDot.style.background = 'rgba(0,0,0, 0.3)';
      }

      let autoScrollInterval = null;
      
      const clearAutoScroll = () => {
        clearInterval(autoScrollInterval);
        autoScrollInterval = setInterval(() => {
          rightBtn.click();
        },
        parseFloat(timeUntilNextTransition) * 1000
        );
      };

      if (isAutoScrollEnabled) {
        autoScrollInterval = setInterval(() => {
          rightBtn.click();
        },
        parseFloat(timeUntilNextTransition) * 1000
        );
      }

      rightBtn.addEventListener('click', (e) => {
        let rightClickScript = document.createElement('script');
        rightClickScript.innerHTML = offerNavRightHTML;
        rightBtn.append(rightClickScript);         
        e.stopPropagation();

        let newSectionPercentage = platform === 'desktop' 
          ? (parseInt(sectionPercentage) + 1).toString() + '%' 
          : sectionPercentage;

        if (autoScrollInterval) {
          clearAutoScroll();
        }

        if (direction === 1 && platform === 'mobile') {
          carouselSlider.prepend(carouselSlider.lastElementChild);
        }

        direction = -1;
        carouselContent.style.justifyContent = 'flex-start';
        carouselSlider.style.transform = 'translate(-' + newSectionPercentage + ')';
      });

      leftBtn.addEventListener('click', (e) => {
        let leftClickScript = document.createElement('script');
        leftClickScript.innerHTML = offerNavLeftHTML;
        leftBtn.append(leftClickScript);
        e.stopPropagation();

        let newSectionPercentage = platform === 'desktop' 
          ? (parseInt(sectionPercentage) + 1).toString() + '%' 
          : sectionPercentage;

        if (autoScrollInterval) {
          clearAutoScroll();
        }

        if (direction === -1 && platform === 'mobile') {
          carouselSlider.appendChild(carouselSlider.firstElementChild);
        }

        direction = 1;
        if (platform === 'mobile') {
          carouselContent.style.justifyContent = 'flex-end';
        }
        carouselSlider.style.transform = 'translate(' + newSectionPercentage + ')';
      });

      carouselSlider.addEventListener('transitionend', () => {
        if (direction === 1) {
          carouselSlider.prepend(carouselSlider.lastElementChild);
        } else {
          carouselSlider.appendChild(carouselSlider.firstElementChild);
        }

        carouselSlider.style.transition = 'none';
        carouselSlider.style.transform = 'translate(0)';

        let targetDot;

        const currentDot = carouselDotsNavigator.querySelector('.current_slide');
          
        if (direction === -1) {
          targetDot = currentDot.nextElementSibling;
          if (!targetDot) {
            targetDot = carouselDotsNavigator.firstElementChild;
          }
        }
        else {
          targetDot = currentDot.previousElementSibling;
          if (!targetDot) {
            targetDot = carouselDotsNavigator.lastElementChild;
          }
        }
        updateDots(currentDot, targetDot);

        setTimeout(() => {
          if (transitionTime) {
            const slideTimeTransition = transitionTime === '0' ? '0.75' : transitionTime;
            carouselSlider.style.transition = 'all ' + (slideTimeTransition * 1000).toString() + 'ms';
          } else {
            carouselSlider.style.transition = 'all 625ms';
          }
        });
      }, false);

      if (platform === 'mobile') {
        carouselContainer.style.width = '100%';
        carouselContainer.style.maxWidth = '100%';
        carouselSlider.style.width = (data.length * 100).toString() + '%';
        rightBtn.style.right = 0;
        leftBtn.style.left = 0;
      }

      if (seoTextList && seoTextList.length > 0) {
        let text = '';
        seoTextList.forEach(seoText => {
          text += seoText;
        });
        let seoTag = document.createElement('div');
        seoTag.innerHTML = text;
        seoTag.style.display = 'none';
        carouselContainer.append(seoTag);
      }

      if (schemaInfoList) {
        const schemaInfo = [];
        for (let i = 0; i < schemaInfoList.length; i++) {
          schemaInfo.push(createSchemaObjects(schemaInfoList[i], data[i].imageUrl));
          let seoDiv = document.createElement('div');
          seoDiv.style.display = 'none';
          let productDiv = document.createElement('div');
          productDiv.id = 'product';
          seoDiv.append(productDiv);
          
          let strongText = document.createElement('strong');
          strongText.innerHTML = schemaInfoList[i].name || '';
          productDiv.append(strongText);
          
          let paragraph = document.createElement('p');
          paragraph.innerHTML = schemaInfoList[i].text || '';
          productDiv.append(paragraph);

          if(offerImpressionList){
            const impressionKeys = Object.keys(offerImpressionList[i]);
            impressionKeys.forEach(impressKey => {
              let impressionP = document.createElement('p');
              impressionP.innerHTML = offerImpressionList[i][impressKey] || '';
              productDiv.append(impressionP);
            });
            let offerImpressionScript = document.createElement('script');
              offerImpressionScript.innerHTML = offerImpressHTMLArr[i];
              productDiv.append(offerImpressionScript);
          }
          
          let image = document.createElement('img');
          image.src = data[i].imageUrl;
          image.onclick = () => {
            console.log("image clicked - add GA")
          }
          productDiv.append(image);
          
          let stamp = document.createElement('p');
          stamp.innerHTML = schemaInfoList[i].stamp || '';
          productDiv.append(stamp);
          
          carouselContainer.append(seoDiv);
        }
        let schemaTag = document.createElement('script');
        schemaTag.type = 'application/ld+json';
        schemaTag.innerHTML = JSON.stringify(schemaInfo);
        carouselContainer.append(schemaTag);
      }

      let xDown = null;
      let yDown = null;
      let isCanvasPointerEventOn = isEmbedAsHTML;

      carouselContent.addEventListener('touchstart', function (e) {
        xDown = e.touches[0].clientX;
        yDown = e.touches[0].clientY;
      });

      carouselContent.addEventListener('touchmove', function(e) {
        if (!xDown || !yDown) return;
        let xUp = e.touches[0].clientX;
        let yUp = e.touches[0].clientY;
        
        let xDiff = xDown - xUp;
        let yDiff = yDown - yUp;
        
        if (Math.abs(xDiff) + Math.abs(yDiff) > 50) {
          if (isCanvasPointerEventOn && isEmbedAsHTML) {
            const validVariables = variables.filter(variable => {
              return variable.length > 0;
            });
            validVariables.forEach(variable => {
              document.getElementById(variable[1]).parentElement.style.pointerEvents = 'none';
            });
            isCanvasPointerEventOn = false;
          }
          if (Math.abs(xDiff) > Math.abs(yDiff)) {
            if (xDiff > 0) rightBtn.click();
            else leftBtn.click();
          }
          xDown = null;
          yDown = null;
        }
      });

      let actualDOMImageHeight;
      let actualDOMImageWidth;
      
      if (isEmbedAsHTML) {
        let referenceSlide;                    
        
        variables.forEach((variable, idx) => {
          const imageSlide = document.createElement('div');
          imageSlide.style = 'flex-shrink: 0; display: flex; justify-content: center; align-items: center; padding: 0.5%;';
          imageSlide.style.flexBasis = sectionPercentage;
          imageSlide.setAttribute('data-idx', idx);
          
          const canvasTag = document.createElement('canvas');
          canvasTag.style.pointerEvents = 'none';
          const img = document.createElement('img');
          img.onclick = function() {
            console.log("image clicked - add GA")
            let offerClickScript = document.createElement('script');
            offerClickScript.innerHTML = offerClickHTMLArr[idx];
            imageSlide.append(offerClickScript);
          };  
          
          if (platform === 'mobile') {
            imageSlide.style.padding = 0;
          }
          
          if (variable.length === 0) {
            const imageData = new Image();
            imageData.onload = () => {
              if (platform === 'desktop') {
                img.style.minWidth = this.width.toString() + 'px';
                img.style.maxWidth = this.width.toString() + 'px';
              } 
              else {
                img.style.width = '100%';
              }
            }; 
            imageData.src = data[idx].imageUrl;
            img.src = data[idx].imageUrl;
            if (data[idx].imageLink) {
              let url = data[idx].imageLink;

              if (data[idx].imageLink.includes('?')) {
                url = data[idx].imageLink + '&' + data[idx].targetData;
              } else {
                url = data[idx].imageLink + '?' + data[idx].targetData;
              }
              
              const linkTarget = data[idx].target === '_blank' ? '_blank' : '_self';
              img.onclick = () => { 
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx];
                imageSlide.append(offerClickScript);
                window.open(url, linkTarget); };
              img.style.cursor = 'pointer';
            }

            imageSlide.appendChild(img);
            carouselSlider.appendChild(imageSlide);
          }
          else {
            canvasTag.id = variable[1];
            if(data[idx].imageLink) {
              let url = data[idx].imageLink;

              if (data[idx].imageLink.includes('?')) {
                url = data[idx].imageLink + '&' + data[idx].targetData;
              } else {
                url = data[idx].imageLink + '?' + data[idx].targetData;
              }
              const linkTarget = data[idx].target === '_blank' ? '_blank' : '_self';
              imageSlide.onclick = () => { 
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx];
                imageSlide.append(offerClickScript);
                window.open(url, linkTarget); };
              imageSlide.style.cursor = 'pointer';
            }
            
            imageSlide.appendChild(canvasTag);
            
            referenceSlide = imageSlide;
            carouselSlider.appendChild(imageSlide);
          }
          
          const carouselDotIndicator = document.createElement('button');
          carouselDotIndicator.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;'

          if(idx === 0) {
            carouselDotIndicator.style.background = 'rgba(0,0,0, 1)';
            carouselDotIndicator.className = 'current_slide';
            imageSlide.className = 'current_slide';
          }
          else {
            carouselDotIndicator.style.background = 'rgba(0,0,0, 0.3)';
          }
          carouselDotsNavigator.appendChild(carouselDotIndicator);
        });

        const scriptTag = document.createElement('script');
        scriptTag.innerHTML = embedJs;
        carouselContainer.append(scriptTag);

        const validVariables = variables.filter(variable => {
          return variable.length > 0;
        });

        const canvas = document.getElementById(validVariables[0][1]);
        const canvasWidth = parseInt(canvas.style.width);
        const canvasHeight = parseInt(canvas.style.height);
        const parentContainerWidth = parseInt(window.getComputedStyle(carouselContainer, null).getPropertyValue('width'));
        carouselContent.style.height = canvas.style.height;

        let isParentContainerSmaller;

        if (canvasWidth > parentContainerWidth) {
          isParentContainerSmaller = true;
        }
        else {
          isParentContainerSmaller = false;
        }

        let reducedWidth;
        if (platform === 'mobile') {
          reducedWidth = canvasWidth * 0.85;
          carouselContainer.style.maxWidth = (canvasWidth + 80).toString() + 'px';
        }
        else {
          reducedWidth = canvasWidth * 0.95;
        }
        let newRatio;

        if (isParentContainerSmaller) {
          if (platform === 'mobile') {
            newRatio = Math.min((parentContainerWidth * 0.75) / canvasWidth, 1);  
          }
          else {
            newRatio = Math.min((parentContainerWidth) / canvasWidth, 1);
          }
        }
        else {
          newRatio = Math.min(reducedWidth / canvasWidth, 1);
        }
        validVariables.forEach(variable => {              
          let tempCanvas = document.getElementById(variable[1]);
          tempCanvas.style.width = (canvasWidth * newRatio).toString() + 'px';
          tempCanvas.style.height = (canvasHeight * newRatio).toString() + 'px';
          tempCanvas.parentElement.style.width = (canvasWidth * newRatio).toString() + 'px';
          tempCanvas.parentElement.style.height = (canvasHeight * newRatio).toString() + 'px';          
        });
        me.disconnect();
        return;
      } 
      else {
        let imageData = new Image();
        imageData.onload = function() {
          data.forEach((imageInfo, idx) => {
            const imageSlide = document.createElement('div');
            imageSlide.style = 'flex-shrink: 0; display: flex; justify-content: center; align-items: center; padding: 0.5%;';
            imageSlide.style.flexBasis = sectionPercentage;
            imageSlide.setAttribute('data-idx', idx);
            const img = document.createElement('img');
            img.onclick = function() {
              console.log("image clicked - add GA")
              let offerClickScript = document.createElement('script');
              offerClickScript.innerHTML = offerClickHTMLArr[idx];
              imageSlide.append(offerClickScript);
            };  

            if (imageInfo.imageLink) {
              let url = imageInfo.imageLink;

              if (imageInfo.imageLink.includes('?')) {
                url = imageInfo.imageLink + '&' + imageInfo.targetData;
              } else {
                url = imageInfo.imageLink + '?' + imageInfo.targetData;
              }

              const linkTarget = imageInfo.target === '_blank' ? '_blank' : '_self';
              img.onclick = () => { 
                let offerClickScript = document.createElement('script');
                offerClickScript.innerHTML = offerClickHTMLArr[idx];
                imageSlide.append(offerClickScript);
                window.open(url, linkTarget); };
              img.style.cursor = 'pointer';
            }
            
            imageSlide.appendChild(img);
            
            img.src = imageInfo.imageUrl;
            img.alt = imageInfo.imageAltText;                         
            img.style.width = '95%';
            img.style.maxWidth = this.width.toString() + 'px';
            carouselSlider.appendChild(imageSlide);

            if (platform === 'mobile') {
              img.style.width = '75%';
              imageSlide.style.padding = 0;
            }
            const carouselDotIndicator = document.createElement('button');
            carouselDotIndicator.style = 'border: 0; border-radius: 50%; width: 15px; min-width: 15px; max-width: 15px; height: 15px; margin: 0 5px; cursor: pointer; padding: unset;'

            if (idx === 0) {
              carouselDotIndicator.style.background = 'rgba(0,0,0, 1)';
              carouselDotIndicator.className = 'current_slide';
              imageSlide.className = 'current_slide';
              actualDOMImageHeight = window.getComputedStyle(img, null).getPropertyValue('height');
              actualDOMImageWidth = window.getComputedStyle(img, null).getPropertyValue('width');
            }
            else {
              carouselDotIndicator.style.background = 'rgba(0,0,0, 0.3)';
            }
            carouselDotIndicator.setAttribute('data-idx', idx);
            carouselDotsNavigator.appendChild(carouselDotIndicator);
          });

          if (platform === 'mobile') {
            carouselContent.style.height = actualDOMImageHeight;
            carouselContainer.style.maxWidth = (parseInt(actualDOMImageWidth) + 80).toString() + 'px';
          } else {
            carouselContent.style.height = 'auto';
          }
        };
        imageData.src = data[0].imageUrl;
        me.disconnect();
        return;
      }
    }
  })
}

        
    const createJsCode = (
      type,
      data,
      cssSelector,
      idx,
      modifiers,
      isEmbedAsHTML,
      embedJs,
      variables,
      seoTextList,
      schemaInfoList,
      offerImpressionList,
      isAutoScrollEnabled,
      transitionTime,
      timeUntilNextTransition,
      ) => {
      switch (type) {
        case 'singleImage':
          return createSingleImageResponse(
            data[0],
            cssSelector,
            idx,
            modifiers,
            isEmbedAsHTML,
            embedJs,
            variables,
            seoTextList,
            schemaInfoList,
            offerImpressionList,
          ).observe(document, {childList: true, subtree: true});
        case 'grid':
          return createGridResponse(
            data,
            cssSelector,
            idx,
            modifiers,
            isEmbedAsHTML,
            embedJs,
            variables,
            seoTextList,
            schemaInfoList,
            offerImpressionList,
          ).observe(document, {childList: true, subtree: true});
        case 'carousel':
        case 'fullWidthCarousel':
          return createCarouselResponse(
            data,
            cssSelector,
            idx,
            modifiers,
            isEmbedAsHTML,
            embedJs,
            variables,
            seoTextList,
            schemaInfoList,
            isAutoScrollEnabled,
            transitionTime,
            timeUntilNextTransition,
            offerImpressionList,
            type === 'fullWidthCarousel',
          ).observe(document, {childList: true, subtree: true});
        case 'stack':
          return createStackResponse(
            data,
            cssSelector,
            idx,
            modifiers,
            isEmbedAsHTML,
            embedJs,
            variables,
            seoTextList,
            schemaInfoList,
            offerImpressionList,
          ).observe(document, {childList: true, subtree: true});
        case 'multiCarousel':
          return createMultiImageCarousel(
            data,
            cssSelector,
            idx,
            modifiers,
            isEmbedAsHTML,
            embedJs,
            variables,
            seoTextList,
            schemaInfoList,
            isAutoScrollEnabled,
            transitionTime,
            timeUntilNextTransition,
            offerImpressionList,
          ).observe(document, {childList: true, subtree: true});
        default:
          return null;
      }
    }
  
        const { instances } = {"domain":"www.lithiafordmissoula.com","instances":[{"domain":"www.lithiafordmissoula.com","instanceID":"6d4404cf-f69a-44c2-ad19-9fc59dced9d6","integrationStatus":true,"integrationID":"","relativePath":"/new-inventory/index.htm","mobileLocation":".ddc-content.ws-inv-page-title.spacing-reset","mobilePositionModifer":"afterAsSibling","location":".ddc-content.ws-inv-page-title.spacing-reset","positionModifer":"afterAsSibling","type":"carousel","images":[{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/5f9b7889-3142-4252-b16f-9b7b301f553d_website_1fter4ph1sle20673_950 x 250_2025_ford_ranger_stx__0.jpeg","imageAltText":"2025 Ford Ranger STX","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-ranger-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FTER4PH1SLE20673-2025-Ford-Ranger","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/e8038618-6f74-4757-8288-7d6d843cdaac_website_3fmcr9bn7sre87339_950 x 250_2025_ford_bronco sport_big bend__1.jpeg","imageAltText":"2025 Ford Bronco Sport Big Bend","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-bronco-sport-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-3FMCR9BN7SRE87339-2025-Ford-Bronco%20Sport","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/b5451d9c-678f-4475-af20-8a483f33a505_website_1ftew2lp0skf74971_950 x 250_2025_ford_f-150_stx__2.jpeg","imageAltText":"2025 Ford F-150 STX","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-f-150-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FTEW2LP0SKF74971-2025-Ford-F-150","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/b299c495-c97f-4d72-b390-b13c6112f68e_website_1fmde6bhxsla85161_950 x 250_2025_ford_bronco_big bend__3.jpeg","imageAltText":"2025 Ford Bronco Big Bend","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-bronco-sport-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FMDE6BHXSLA85161-2025-Ford-Bronco","target":"_parent"}],"instanceStatus":"LIVE","createdBy":"","createdDate":1759426738476,"lastModifiedBy":"","lastModifiedDate":1759426738476,"launchLabel":"Oct NB","startDate":1759426960000,"endDate":1762416000000,"embedAsHTML":false,"embedHtmlUrl":"","variableNamesList":[],"schemaInfo":[{"price":39005,"modelDate":"2025","name":"2025 Ford Ranger STX","stamp":"LEASE OFFER $279 Per Mo. for 36 Mo. $4,109 Due At Signing   ","vin":"1FTER4PH1SLE20673","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Ranger STX. MSRP $39,005. LEASE: 36 monthly lease payments of $279. Amount due at start, $4,109 which includes first month's payment and $695 acquisition fee. $1,000 RCL Cash $2,000 Open Bonus Cash $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. STX 4x4 New 2025 Ford Ranger "},{"price":33085,"modelDate":"2025","name":"2025 Ford Bronco Sport Big Bend","stamp":"LEASE OFFER $289 Per Mo. for 36 Mo. $3,689 Due At Signing   ","vin":"3FMCR9BN7SRE87339","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Bronco Sport Big Bend. MSRP $33,085. LEASE: 36 monthly lease payments of $289. Amount due at start, $3,689 which includes first month's payment and $695 acquisition fee. $1,000 RCL Cash $1,150 Open Bonus Cash $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. Big Bend 4x4 New 2025 Ford Bronco Sport "},{"price":51015,"modelDate":"2025","name":"2025 Ford F-150 STX","stamp":"LEASE OFFER $329 Per Mo. for 36 Mo. $5,529 Due At Signing   ","vin":"1FTEW2LP0SKF74971","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford F-150 STX. MSRP $51,015. LEASE: 36 monthly lease payments of $329. Amount due at start, $5,529 which includes first month's payment and $695 acquisition fee. $2,200 RCL Cash $750 RCL Cash 2.7 Engine Specific $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. STX 4x4 New 2025 Ford F-150 "},{"price":"43765","modelDate":"2025","name":"2025 Ford Bronco Big Bend","stamp":"LEASE OFFER $369 Per Mo. for 36 Mo. $4,969 Due At Signing   ","vin":"1FMDE6BHXSLA85161","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Bronco Big Bend. MSRP $43,765. LEASE: 36 monthly lease payments of $369. Amount due at start, $4,969 which includes first month's payment and $695 acquisition fee. $0 security deposit. Lease end termination fee, $395. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. Big Bend 4x4 New 2025 Ford Bronco "}],"offerImpressions":[{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"Truck","offerImpression_positionPreset":"NB","offerClick_trim":"STX","offerImpression_year":"2025","offerClick_positionPreset":"NB","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"279","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Carousel","offerClick_make":"Ford","offerImpression_model":"Ranger","offerImpression_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"4109","navigationInteraction_action":null,"offerClick_model":"Ranger","offerClick_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_type":"Lease","offerClick_body":"Truck","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"279","offerClick_year":"2025","offerClick_layout":"Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"STX","offerImpression_salesEvent":null,"offerImpression_dueSigning":"4109"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"SUV","offerImpression_positionPreset":"NB","offerClick_trim":"Big Bend","offerImpression_year":"2025","offerClick_positionPreset":"NB","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"289","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Carousel","offerClick_make":"Ford","offerImpression_model":"Bronco Sport","offerImpression_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"3689","navigationInteraction_action":null,"offerClick_model":"Bronco Sport","offerClick_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_type":"Lease","offerClick_body":"SUV","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"289","offerClick_year":"2025","offerClick_layout":"Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"Big Bend","offerImpression_salesEvent":null,"offerImpression_dueSigning":"3689"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"Truck","offerImpression_positionPreset":"NB","offerClick_trim":"STX","offerImpression_year":"2025","offerClick_positionPreset":"NB","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"329","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Carousel","offerClick_make":"Ford","offerImpression_model":"F-150","offerImpression_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"5529","navigationInteraction_action":null,"offerClick_model":"F-150","offerClick_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_type":"Lease","offerClick_body":"Truck","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"329","offerClick_year":"2025","offerClick_layout":"Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"STX","offerImpression_salesEvent":null,"offerImpression_dueSigning":"5529"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"SUV","offerImpression_positionPreset":"NB","offerClick_trim":"Big Bend","offerImpression_year":"2025","offerClick_positionPreset":"NB","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"369","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Carousel","offerClick_make":"Ford","offerImpression_model":"Bronco","offerImpression_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"4969","navigationInteraction_action":null,"offerClick_model":"Bronco","offerClick_theme":" | Ford - Bold - White - 1up - MTMISFOR","offerClick_type":"Lease","offerClick_body":"SUV","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"369","offerClick_year":"2025","offerClick_layout":"Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"Big Bend","offerImpression_salesEvent":null,"offerImpression_dueSigning":"4969"}],"isAutoScrollEnabled":true,"transitionTime":"0.75","timeUntilNextTransition":"5"},{"domain":"www.lithiafordmissoula.com","instanceID":"8a5a701a-b08f-467d-b5de-a60e7055dd6f","integrationStatus":true,"integrationID":"","relativePath":"/","mobileLocation":".ladTechHsOffers","mobilePositionModifer":"afterAsFirstChild","location":".ladTechHsOffers","positionModifer":"afterAsFirstChild","type":"multiCarousel","images":[{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/639f1463-ffd9-4ecf-949a-994d93b12ce7_website_1fter4ph1sle20673_600 x 400_2025_ford_ranger_stx__0.jpeg","imageAltText":"2025 Ford Ranger STX","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-ranger-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FTER4PH1SLE20673-2025-Ford-Ranger","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/c58cd368-fd34-47b3-a0c0-7e19e483fa8b_website_3fmcr9bn7sre87339_600 x 400_2025_ford_bronco sport_big bend__1.jpeg","imageAltText":"2025 Ford Bronco Sport Big Bend","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-bronco-sport-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-3FMCR9BN7SRE87339-2025-Ford-Bronco%20Sport","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/6e0991a5-d425-4f1c-a568-ecf354856d20_website_1ftew2lp0skf74971_600 x 400_2025_ford_f-150_stx__2.jpeg","imageAltText":"2025 Ford F-150 STX","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-f-150-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FTEW2LP0SKF74971-2025-Ford-F-150","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/42034d02-9f89-47ac-9831-0f867cbdfb31_website_1fmde6bhxsla85161_600 x 400_2025_ford_bronco_big bend__3.jpeg","imageAltText":"2025 Ford Bronco Big Bend","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-bronco-sport-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FMDE6BHXSLA85161-2025-Ford-Bronco","target":"_parent"}],"instanceStatus":"LIVE","createdBy":"","createdDate":1759426738476,"lastModifiedBy":"","lastModifiedDate":1759426738476,"launchLabel":"Oct RR","startDate":1759426960000,"endDate":1762416000000,"embedAsHTML":false,"embedHtmlUrl":"","variableNamesList":[],"schemaInfo":[{"price":39005,"modelDate":"2025","name":"2025 Ford Ranger STX","stamp":"LEASE OFFER $279 Per Mo. for 36 Mo. $4,109 Due At Signing   ","vin":"1FTER4PH1SLE20673","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Ranger STX. MSRP $39,005. LEASE: 36 monthly lease payments of $279. Amount due at start, $4,109 which includes first month's payment and $695 acquisition fee. $1,000 RCL Cash $2,000 Open Bonus Cash $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. STX 4x4 New 2025 Ford Ranger "},{"price":33085,"modelDate":"2025","name":"2025 Ford Bronco Sport Big Bend","stamp":"LEASE OFFER $289 Per Mo. for 36 Mo. $3,689 Due At Signing   ","vin":"3FMCR9BN7SRE87339","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Bronco Sport Big Bend. MSRP $33,085. LEASE: 36 monthly lease payments of $289. Amount due at start, $3,689 which includes first month's payment and $695 acquisition fee. $1,000 RCL Cash $1,150 Open Bonus Cash $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. Big Bend 4x4 New 2025 Ford Bronco Sport "},{"price":51015,"modelDate":"2025","name":"2025 Ford F-150 STX","stamp":"LEASE OFFER $329 Per Mo. for 36 Mo. $5,529 Due At Signing   ","vin":"1FTEW2LP0SKF74971","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford F-150 STX. MSRP $51,015. LEASE: 36 monthly lease payments of $329. Amount due at start, $5,529 which includes first month's payment and $695 acquisition fee. $2,200 RCL Cash $750 RCL Cash 2.7 Engine Specific $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. STX 4x4 New 2025 Ford F-150 "},{"price":"43765","modelDate":"2025","name":"2025 Ford Bronco Big Bend","stamp":"LEASE OFFER $369 Per Mo. for 36 Mo. $4,969 Due At Signing   ","vin":"1FMDE6BHXSLA85161","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Bronco Big Bend. MSRP $43,765. LEASE: 36 monthly lease payments of $369. Amount due at start, $4,969 which includes first month's payment and $695 acquisition fee. $0 security deposit. Lease end termination fee, $395. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. Big Bend 4x4 New 2025 Ford Bronco "}],"offerImpressions":[{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"Truck","offerImpression_positionPreset":"RR","offerClick_trim":"STX","offerImpression_year":"2025","offerClick_positionPreset":"RR","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"279","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Multi-Image Carousel","offerClick_make":"Ford","offerImpression_model":"Ranger","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"4109","navigationInteraction_action":null,"offerClick_model":"Ranger","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"Truck","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"279","offerClick_year":"2025","offerClick_layout":"Multi-Image Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"STX","offerImpression_salesEvent":null,"offerImpression_dueSigning":"4109"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"SUV","offerImpression_positionPreset":"RR","offerClick_trim":"Big Bend","offerImpression_year":"2025","offerClick_positionPreset":"RR","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"289","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Multi-Image Carousel","offerClick_make":"Ford","offerImpression_model":"Bronco Sport","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"3689","navigationInteraction_action":null,"offerClick_model":"Bronco Sport","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"SUV","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"289","offerClick_year":"2025","offerClick_layout":"Multi-Image Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"Big Bend","offerImpression_salesEvent":null,"offerImpression_dueSigning":"3689"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"Truck","offerImpression_positionPreset":"RR","offerClick_trim":"STX","offerImpression_year":"2025","offerClick_positionPreset":"RR","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"329","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Multi-Image Carousel","offerClick_make":"Ford","offerImpression_model":"F-150","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"5529","navigationInteraction_action":null,"offerClick_model":"F-150","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"Truck","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"329","offerClick_year":"2025","offerClick_layout":"Multi-Image Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"STX","offerImpression_salesEvent":null,"offerImpression_dueSigning":"5529"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"SUV","offerImpression_positionPreset":"RR","offerClick_trim":"Big Bend","offerImpression_year":"2025","offerClick_positionPreset":"RR","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"369","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Multi-Image Carousel","offerClick_make":"Ford","offerImpression_model":"Bronco","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"4969","navigationInteraction_action":null,"offerClick_model":"Bronco","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"SUV","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"369","offerClick_year":"2025","offerClick_layout":"Multi-Image Carousel","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"Big Bend","offerImpression_salesEvent":null,"offerImpression_dueSigning":"4969"}],"isAutoScrollEnabled":true,"transitionTime":"0.75","timeUntilNextTransition":"5"},{"domain":"www.lithiafordmissoula.com","instanceID":"aced5d33-3606-4655-81bd-f6b16d5c3597","integrationStatus":true,"integrationID":"","relativePath":"/promotions/new/index.htm","mobileLocation":".ddc-page-title","mobilePositionModifer":"afterAsSibling","location":".ddc-page-title","positionModifer":"afterAsSibling","type":"grid","images":[{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/4deb8959-6547-4a54-a2e6-d5d92b436984_website_1fter4ph1sle20673_600 x 400_2025_ford_ranger_stx__0.jpeg","imageAltText":"2025 Ford Ranger STX","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-ranger-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FTER4PH1SLE20673-2025-Ford-Ranger","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/d93cecb7-e35e-4260-9868-875891f28c37_website_3fmcr9bn7sre87339_600 x 400_2025_ford_bronco sport_big bend__1.jpeg","imageAltText":"2025 Ford Bronco Sport Big Bend","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-bronco-sport-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-3FMCR9BN7SRE87339-2025-Ford-Bronco%20Sport","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/f4d11185-c4b3-4c6c-a40c-e203e6c30457_website_1ftew2lp0skf74971_600 x 400_2025_ford_f-150_stx__2.jpeg","imageAltText":"2025 Ford F-150 STX","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-f-150-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FTEW2LP0SKF74971-2025-Ford-F-150","target":"_parent"},{"imageUrl":"https://av2-ladtech-assets-prd.constellationagency.com/order-export/62d5c8e2-291e-4048-8ed4-30dc896de0f2_website_1fmde6bhxsla85161_600 x 400_2025_ford_bronco_big bend__3.jpeg","imageAltText":"2025 Ford Bronco Big Bend","imageLink":"https://www.lithiafordmissoula.com/new-inventory/ford-bronco-sport-for-sale-missoula-mt-ladrr.htm","targetData":"AID=ladtech-prd-Lithia%20Ford%20of%20Missoula-1FMDE6BHXSLA85161-2025-Ford-Bronco","target":"_parent"}],"instanceStatus":"LIVE","createdBy":"","createdDate":1759426738476,"lastModifiedBy":"","lastModifiedDate":1759426738476,"launchLabel":"Oct LT","startDate":1759426960000,"endDate":1762416000000,"embedHtmlUrl":"","variableNamesList":[],"schemaInfo":[{"price":39005,"modelDate":"2025","name":"2025 Ford Ranger STX","stamp":"LEASE OFFER $279 Per Mo. for 36 Mo. $4,109 Due At Signing   ","vin":"1FTER4PH1SLE20673","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Ranger STX. MSRP $39,005. LEASE: 36 monthly lease payments of $279. Amount due at start, $4,109 which includes first month's payment and $695 acquisition fee. $1,000 RCL Cash $2,000 Open Bonus Cash $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. STX 4x4 New 2025 Ford Ranger "},{"price":33085,"modelDate":"2025","name":"2025 Ford Bronco Sport Big Bend","stamp":"LEASE OFFER $289 Per Mo. for 36 Mo. $3,689 Due At Signing   ","vin":"3FMCR9BN7SRE87339","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Bronco Sport Big Bend. MSRP $33,085. LEASE: 36 monthly lease payments of $289. Amount due at start, $3,689 which includes first month's payment and $695 acquisition fee. $1,000 RCL Cash $1,150 Open Bonus Cash $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. Big Bend 4x4 New 2025 Ford Bronco Sport "},{"price":51015,"modelDate":"2025","name":"2025 Ford F-150 STX","stamp":"LEASE OFFER $329 Per Mo. for 36 Mo. $5,529 Due At Signing   ","vin":"1FTEW2LP0SKF74971","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford F-150 STX. MSRP $51,015. LEASE: 36 monthly lease payments of $329. Amount due at start, $5,529 which includes first month's payment and $695 acquisition fee. $2,200 RCL Cash $750 RCL Cash 2.7 Engine Specific $0 security deposit. Lease end termination fee, $475. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. STX 4x4 New 2025 Ford F-150 "},{"price":"43765","modelDate":"2025","name":"2025 Ford Bronco Big Bend","stamp":"LEASE OFFER $369 Per Mo. for 36 Mo. $4,969 Due At Signing   ","vin":"1FMDE6BHXSLA85161","currency":"USD","text":"SHOP NOW > Order yours today. New 2025 Ford Bronco Big Bend. MSRP $43,765. LEASE: 36 monthly lease payments of $369. Amount due at start, $4,969 which includes first month's payment and $695 acquisition fee. $0 security deposit. Lease end termination fee, $395. On approved credit. ALL OFFERS: Price does not include title, license or dealer doc fees. Offer expires 11/05/2025. Big Bend 4x4 New 2025 Ford Bronco "}],"offerImpressions":[{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"Truck","offerImpression_positionPreset":"LT","offerClick_trim":"STX","offerImpression_year":"2025","offerClick_positionPreset":"LT","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"279","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Grid","offerClick_make":"Ford","offerImpression_model":"Ranger","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"4109","navigationInteraction_action":null,"offerClick_model":"Ranger","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"Truck","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"279","offerClick_year":"2025","offerClick_layout":"Grid","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"STX","offerImpression_salesEvent":null,"offerImpression_dueSigning":"4109"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"SUV","offerImpression_positionPreset":"LT","offerClick_trim":"Big Bend","offerImpression_year":"2025","offerClick_positionPreset":"LT","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"289","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Grid","offerClick_make":"Ford","offerImpression_model":"Bronco Sport","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"3689","navigationInteraction_action":null,"offerClick_model":"Bronco Sport","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"SUV","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"289","offerClick_year":"2025","offerClick_layout":"Grid","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"Big Bend","offerImpression_salesEvent":null,"offerImpression_dueSigning":"3689"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"Truck","offerImpression_positionPreset":"LT","offerClick_trim":"STX","offerImpression_year":"2025","offerClick_positionPreset":"LT","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"329","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Grid","offerClick_make":"Ford","offerImpression_model":"F-150","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"5529","navigationInteraction_action":null,"offerClick_model":"F-150","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"Truck","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"329","offerClick_year":"2025","offerClick_layout":"Grid","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"STX","offerImpression_salesEvent":null,"offerImpression_dueSigning":"5529"},{"offerImpression_term":"36","offerClick_storeId":"MTMISFOR","offerImpression_body":"SUV","offerImpression_positionPreset":"LT","offerClick_trim":"Big Bend","offerImpression_year":"2025","offerClick_positionPreset":"LT","offerImpression_type":"Lease","offerClick_term":"36","event":null,"offerClick_price":"369","offerClick_storeName":"Lithia Ford of Missoula","offerImpression_layout":"Grid","offerClick_make":"Ford","offerImpression_model":"Bronco","offerImpression_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_salesEvent":null,"offerClick_dueSigning":"4969","navigationInteraction_action":null,"offerClick_model":"Bronco","offerClick_theme":" | Ford - Bold - White - 1up - RR - MTMISFOR","offerClick_type":"Lease","offerClick_body":"SUV","offerImpression_storeName":"Lithia Ford of Missoula","num_of_offers":"1","offerImpression_make":"Ford","offerImpression_price":"369","offerClick_year":"2025","offerClick_layout":"Grid","offerImpression_storeId":"MTMISFOR","offerImpression_trim":"Big Bend","offerImpression_salesEvent":null,"offerImpression_dueSigning":"4969"}]}]};
        const embedJsList = ["0","1","2"];
        const variablesList = ["0","1","2"];

        for (let idx = 0; idx < instances.length; idx++) {
          let {
            type,
            images,
            seoText,
            location,
            schemaInfo,
            embedAsHTML,
            relativePath,
            transitionTime,
            mobileLocation,
            positionModifer,
            offerImpressions,
            isAutoScrollEnabled,
            mobilePositionModifer,
            timeUntilNextTransition
           } = instances[idx];
          if(!location && !mobileLocation) continue;
          let cssSelector = {
            desktop: location,
            mobile: mobileLocation
          };
          let modifiers = {
            desktop: positionModifer,
            mobile: mobilePositionModifer
          };
          if(window.location.pathname === relativePath) {
            createJsCode(
              type,
              images,
              cssSelector,
              idx,
              modifiers,
              embedAsHTML,
              embedJsList[idx],
              variablesList[idx],
              seoText,
              schemaInfo,
              offerImpressions,
              isAutoScrollEnabled,
              transitionTime,
              timeUntilNextTransition,
            );
          }
        }
      }
    