{"title":"ScanIA GPT","description":"\u003cdiv style=\"padding:20px; background:#111; border-radius:10px;\"\u003e\n\n\u003cdiv style=\"\nposition:relative;\nmargin-bottom:10px;\n\"\u003e\n\n\u003cinput id=\"busquedaGenesis\" type=\"text\" placeholder=\"ScanIA GPT. Buscar refacción...\" style=\"\nwidth:100%;\npadding:15px;\npadding-right:45px;\nfont-size:18px;\nbackground:#000;\ncolor:#fff;\nborder:1px solid white;\nbox-sizing:border-box;\n\"\u003e\n\n\u003cspan id=\"limpiarBusqueda\" style=\"\nposition:absolute;\nright:15px;\ntop:50%;\ntransform:translateY(-50%);\ncolor:#999;\nfont-size:22px;\ncursor:pointer;\ndisplay:none;\nuser-select:none;\n\"\u003e\n✕\n\u003c\/span\u003e\n\n\u003c\/div\u003e\n\n\u003cbutton id=\"btnBuscarGenesis\" onclick=\"buscarGenesis()\" style=\"\nwidth:100%;\npadding:15px;\nfont-size:18px;\nbackground:red;\ncolor:white;\nborder:none;\ncursor:pointer;\ndisplay:block;\nmargin-bottom:0;\n\"\u003e\n\nBUSCAR\n\n\u003c\/button\u003e\n\n\u003c!-- SUGERENCIAS --\u003e\n\u003cdiv id=\"sugerenciasGenesis\" style=\"\nbackground:#0b0b0b;\nborder:1px solid rgba(255,255,255,0.08);\nborder-radius:12px;\nmargin-top:6px;\noverflow:hidden;\ndisplay:none;\n\"\u003e\u003c\/div\u003e\n\n\u003cdiv id=\"resultadoGenesis\" style=\"\nmargin-top:0px;\nbackground:#000;\ncolor:#00ff00;\npadding:0px;\noverflow:auto;\nborder-radius:10px;\n\"\u003e\n\u003c\/div\u003e\n\n\u003cdiv id=\"genesisRelacionados\"\u003e\u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\n\n\u003cscript\u003e\n\ndocument.addEventListener(\n    'dblclick',\n    function() {\n\n        let texto =\n            window.getSelection()\n            .toString()\n            .trim();\n\n        if (!texto) return;\n\n        texto = texto\n            .replace(\/-\/g, '')\n            .replace(\/\\s\/g, '');\n\n        window.open(\n\n            'https:\/\/genesis1.mx\/search?q='\n            + encodeURIComponent(texto),\n\n            '_blank'\n\n        );\n\n    }\n);\n\n\u003c\/script\u003e\n\n\n\u003cscript\u003e\n\nfunction buscarSeleccionCelular() {\n\n    let texto = window.getSelection()\n        .toString()\n        .trim();\n\n    if (!texto) return;\n\n    texto = texto\n        .replace(\/-\/g, '')\n        .replace(\/\\s\/g, '');\n\n    if (texto.length \u003c 3) return;\n\n    window.open(\n        'https:\/\/genesis1.mx\/search?q='\n        + encodeURIComponent(texto),\n        '_blank'\n    );\n\n}\n\ndocument.addEventListener(\n    'selectionchange',\n    function () {\n\n        if (window.innerWidth \u003e 768) return;\n\n        clearTimeout(window.buscarTimer);\n\n        window.buscarTimer = setTimeout(() =\u003e {\n\n            let texto = window.getSelection()\n                .toString()\n                .trim();\n\n            if (texto.length \u003e= 3) {\n\n                buscarSeleccionCelular();\n\n            }\n\n        }, 2000);\n\n    }\n);\n\n\u003c\/script\u003e\n\n\n\u003cscript\u003e\n\ndocument.getElementById(\n    'busquedaGenesis'\n).addEventListener(\n    'keypress',\n    function(e){\n\n        if(e.key === 'Enter'){\n\n            buscarGenesis();\n\n        }\n\n    }\n);\n\n\u003c\/script\u003e\n          \n\n\u003cscript\u003e\n\nconst inputBusqueda =\ndocument.getElementById(\n    'busquedaGenesis'\n);\n\n  const sugerenciasGenesis =\ndocument.getElementById(\n'sugerenciasGenesis'\n);\n\n\/\/ =====================================\n\/\/ AUTOCOMPLETE VISUAL\n\/\/ =====================================\n\ninputBusqueda.addEventListener(\n'input',\nfunction(){\n\n    let valor =\n    this.value.trim();\n\n  \/\/ LIMPIAR RESULTADOS ANTERIORES\n\ndocument.getElementById(\n'resultadoGenesis'\n).innerHTML = '';\n\ndocument.getElementById(\n'genesisRelacionados'\n).innerHTML = '';\n\ndocument.getElementById(\n'genesisRelacionados'\n).style.display = 'none';\n\nlet cajaFlotante = document.getElementById(\n'codigoFlotanteGenesis'\n);\n\nif(cajaFlotante){\n\n    cajaFlotante.remove();\n\n}\n\n    \/\/ MINIMO 3 LETRAS\n\n    if(valor.length \u003c 3){\n\n        sugerenciasGenesis.style.display =\n        'none';\n\n        sugerenciasGenesis.innerHTML = '';\n\n        return;\n\n    }\n\n    \/\/ =====================================\n    \/\/ MOSTRAR DEMO\n    \/\/ =====================================\n\n    sugerenciasGenesis.style.display =\n    'block';\n\n   \n\/\/ =====================================\n\/\/ CONSULTAR SUGERENCIAS REALES\n\/\/ =====================================\n\nfetch(\n\n'https:\/\/pseudoepiscopal-chrystal-commendably.ngrok-free.dev\/sugerencias?q='\n\n+ encodeURIComponent(valor),\n\n{\n\nheaders: {\n\n'ngrok-skip-browser-warning': '1'\n\n}\n\n}\n\n)\n\n.then(r =\u003e r.json())\n\n.then(data =\u003e {\n\n  console.log(data);\n\n    sugerenciasGenesis.style.display =\n    'block';\n\n    \/\/ LIMPIAR\n\n    sugerenciasGenesis.innerHTML = '';\n  if(data.length === 0){\n    document.getElementById(\n'btnBuscarGenesis'\n).style.display = 'none';\n\n    sugerenciasGenesis.innerHTML = `\n\n    \u003cdiv class=\"itemSugerencia ia\"\n\n    onclick=\"\n\n    buscarGenesis(true);\n\n    \"\n\n    \u003e\n\n   \n    Buscar con ScanIA GPT\n\n    \u003c\/div\u003e\n\n    `;\n\n    return;\n\n}\n\n    \/\/ =====================================\n    \/\/ RECORRER RESULTADOS\n    \/\/ =====================================\ndocument.getElementById(\n'btnBuscarGenesis'\n).style.display = 'block';\n  \n    data.forEach(item =\u003e {\n\n    sugerenciasGenesis.innerHTML += `\n\n\u003cdiv class=\"itemSugerencia itemReal\"\n\nonclick=\"\n\ndocument.getElementById(\n'busquedaGenesis'\n).value = \\`${item.texto}\\`;\n\ndocument.getElementById(\n'sugerenciasGenesis'\n).style.display = 'none';\n\nbuscarGenesis();\n\n\"\n\n\u003e\n\n\u003cdiv style=\"\ndisplay:flex;\nflex-direction:column;\nalign-items:flex-start;\ngap:6px;\n\"\u003e\n\n\u003cdiv style=\"\nline-height:1.35;\ncolor:white;\nfont-size:16px;\npadding-left:2px;\n\"\u003e\n\n🔍 ${item.bloque1} ${item.texto}\n\n\u003c\/div\u003e\n\n\u003cdiv style=\"\n\ncolor:#d8d8d8 !important;\npadding:5px 10px;\nborder-radius:8px;\nfont-size:16px;\nfont-weight:bold;\nline-height:1.4;\nword-break:break-word;\nmax-width:100%;\n\"\u003e\n\n${item.codigo}\n\n\u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003c\/div\u003e\n\n`;\n\n});\n\n    \/\/ =====================================\n    \/\/ OPCION GPT\n    \/\/ =====================================\n\n    sugerenciasGenesis.innerHTML += `\n\n\u003cdiv class=\"itemSugerencia ia\"\n\nonclick=\"\n\nlet caja = document.getElementById(\n'sugerenciasGenesis'\n);\n\ncaja.style.display = 'none';\n\ncaja.innerHTML = '';\n\nbuscarGenesis(true);\n\n\"\n\n\u003e\n\n🧠 Buscar con ScanIA GPT\n\n\u003c\/div\u003e\n\n`;\n\n});\n\n  });\n\n\nconst limpiarBusqueda =\ndocument.getElementById(\n    'limpiarBusqueda'\n);\n\ninputBusqueda.addEventListener(\n    'input',\n    function(){\n\n        limpiarBusqueda.style.display =\n\n        this.value.length \u003e 0\n\n        ? 'block'\n\n        : 'none';\n\n    }\n);\n\nlimpiarBusqueda.addEventListener(\n    'click',\n    function(){\n\n        inputBusqueda.value = '';\n\n        limpiarBusqueda.style.display =\n        'none';\n\n        inputBusqueda.focus();\n\n    }\n);\n\n\u003c\/script\u003e\n\n\n\u003cscript\u003e\n\nasync function buscarGenesis(\nsoloGPT = false\n) {\n  \n    let q =\n        document.getElementById(\n            'busquedaGenesis'\n        ).value;\n\n    let resultado =\n        document.getElementById(\n            'resultadoGenesis'\n        );\n  \n    let mensajeAviso =\n    window.innerWidth \u003c= 768\n\n    ? '⚡ Selecciona el código a buscar.'\n\n    : '⚡ Doble click en el código a buscar.';\n\n    let aviso = `\n    \u003cdiv style=\"\n    background:#001a1a;\n    color:#00ff99;\n    padding:6px;\n    margin-top:5px;\n    margin-bottom:4px;\n    border-radius:8px;\n    font-size:14px;\n    font-weight:bold;\n    text-align:center;\n    border:1px solid white;\n    \"\u003e\n    ${mensajeAviso}\n    \u003c\/div\u003e\n    `;\n\n    window.contadorBusquedas =\n\n    (window.contadorBusquedas || 0)\n\n    + 1;\n\n    resultado.innerHTML = `\n\n\u003cdiv style=\"\nbackground:#111;\npadding:10px;\nborder-radius:10px;\ntext-align:center;\nline-height:1.15;\ncolor:#00ff99;\nfont-size:16px;\nfont-weight:bold;\nborder:1px solid #333;\n\"\u003e\n\n🧠 Buscando información...\n\n\u003c\/div\u003e\n\n`;\n\nwindow.scrollBy({\n    top:300,\n    behavior:'smooth'\n});\n\n\n\n    try {\n\n        let url =\n\n'https:\/\/pseudoepiscopal-chrystal-commendably.ngrok-free.dev\/buscar?q='        \n\n        + encodeURIComponent(q)\n\n        + '\u0026site=chatgpt'\n\n+ '\u0026modo='\n\n+ (\n\nsoloGPT\n\n? 'gpt'\n\n: 'normal'\n\n);\n\n        console.log(url);\n\n        let respuesta =\n        await fetch(url, {\n            headers: {\n                'ngrok-skip-browser-warning': '1'\n            }\n        });\n\n        let data =\n        await respuesta.json();\n\n        console.log(data);\n\n  console.log(data);\n\nconst info = {\n\nbloque_1:\ndata.bloque_1 || '',\n\nbloque_2:\ndata.bloque_2 || '',\n\nbloque_3:\ndata.bloque_3 || '',\n\nbloque_4:\ndata.bloque_4 || ''\n\n};\n\nconsole.log('BLOQUE 1:', info.bloque_1);\n\nconsole.log('BLOQUE 2:', info.bloque_2);\n\nconsole.log('BLOQUE 3:', info.bloque_3);\n\nconsole.log('BLOQUE 4:', info.bloque_4);\n\n\n\n\n\n        \/\/ =========================================\n        \/\/ DETECTAR CODIGO MAS REPETIDO\n        \/\/ =========================================\n\n        let textoAnalizar = `\n\n${info.bloque_1 || ''}\n\n${info.bloque_2 || ''}\n\n${info.bloque_3 || ''}\n\n${info.bloque_4 || ''}\n\n`;\n\n        let codigos = textoAnalizar.match(\n\/\\b[A-Z0-9\\-]{4,25}\\b\/g\n) || [];\n\n      console.log(\n'MATCH ORIGINAL:',\nJSON.stringify(codigos)\n);\n\n\n\/\/ =============================\n\/\/ FILTRAR SOLO CODIGOS REALES\n\/\/ =============================\n\ncodigos = codigos.filter(codigo =\u003e {\n\n    codigo = codigo\n.toUpperCase()\n.replace(\/-\/g,'')\n.replace(\/\\s+\/g,'')\n.trim();\n\n    \/\/ =========================\n    \/\/ DEBE TENER LETRAS Y NUMEROS\n    \/\/ =========================\n\n    let tieneLetras =\n\/[A-Z]\/.test(codigo);\n\nlet tieneNumeros =\n\/\\d\/.test(codigo);\n\nlet esNumericoLargo =\n\n\/^\\d{4,}$\/.test(codigo);\n\n    \/\/ =========================\n    \/\/ BLOQUEADOS\n    \/\/ =========================\n\n    let bloqueados = [\n\n        'F150',\n        'F250',\n        'F350',\n        'A4',\n        'X5',\n        'S10',\n        'RAM',\n        'JETTA',\n        'GOLF',\n        'BORA',\n        'FORD',\n        'CHEVY',\n        'CHEVROLET',\n        'NISSAN',\n        'HONDA',\n        'TOYOTA',\n        'AUDI',\n        'BMW',\n        'VW',\n        '4X4',\n        '4X2',\n        'RWD',\n        'AWD',\n        'FWD',\n        'V6',\n        'V8',\n        'TDI',\n        'TSI',\n        'GLI'\n\n    ];\n\n    \/\/ =========================\n    \/\/ IGNORAR SOLO AÑOS\n    \/\/ =========================\n\n    let numero = parseInt(codigo);\n\nlet esAnio =\n\n\/^\\d{4}$\/.test(codigo)\n\n\u0026\u0026\n\nnumero \u003e= 1950\n\n\u0026\u0026\n\nnumero \u003c= 2035;\n\n    \/\/ =========================\n    \/\/ IGNORAR CODIGOS MUY GENERICOS\n    \/\/ =========================\n\n    let demasiadasLetras =\n    \/^[A-Z]+$\/.test(codigo);\n\n    \/\/ =========================\n    \/\/ VALIDACION FINAL\n    \/\/ =========================\n\n    return (\n\n        codigo.length \u003e= 4\n\u0026\u0026\n(\n\n(\ntieneLetras\n\u0026\u0026\ntieneNumeros\n)\n\n||\n\nesNumericoLargo\n\n)\n\n\u0026\u0026\n!esAnio\n\u0026\u0026\n!demasiadasLetras\n\u0026\u0026\n!bloqueados.includes(codigo)\n\n    );\n\n});\n\n        codigos = codigos.map(c =\u003e\n\n    c\n    .toUpperCase()\n    .trim()\n    .replace(\/\\s+\/g,'')\n    .replace(\/-\/g,'')\n\n);\n\nconsole.log(\n'CODIGOS EXTRAIDOS:',\nJSON.stringify(codigos)\n);\n\n      \n\n        let contadorCodigos = {};\n\n        codigos.forEach(codigo =\u003e {\n\n            contadorCodigos[codigo] =\n\n            (contadorCodigos[codigo] || 0)\n\n            + 1;\n\n        });\n\n        let rankingCodigos =\n\n        Object.entries(contadorCodigos)\n\n        .sort((a,b) =\u003e b[1] - a[1]);\n\n        console.log(\n            'RANKING:',\n            rankingCodigos\n        );\n\n        let codigoMasRepetido =\n\n        rankingCodigos.length\n\n        ? rankingCodigos[0][0]\n\n        : 'SIN CODIGO';\n\n  let segundoCodigo =\n\nrankingCodigos.length \u003e 1\n\n? rankingCodigos[1][0]\n\n: 'SIN SEGUNDO';\n\n      let codigosGPT =\n\nrankingCodigos\n.map(x =\u003e x[0]);\n\nconsole.log(\n'CODIGOS GPT JSON:',\nJSON.stringify(codigosGPT)\n);\n\n\/\/ =====================================\n\/\/ CAJA FLOTANTE\n\/\/ =====================================\n\nlet cajaFlotante = document.getElementById(\n'codigoFlotanteGenesis'\n);\n\nif(!cajaFlotante){\n\n    cajaFlotante =\n    document.createElement('div');\n\n    cajaFlotante.id =\n    'codigoFlotanteGenesis';\n\n    document.body.appendChild(\n    cajaFlotante\n    );\n\n}\n\ncajaFlotante.innerHTML = `\n\n\u003cdiv id=\"cerrarCajaGenesis\" style=\"\nposition:absolute;\ntop:10px;\nright:12px;\nfont-size:26px;\ncolor:white;\ncursor:pointer;\nfont-weight:bold;\nline-height:1;\nz-index:999999;\n\"\u003e\n✕\n\u003c\/div\u003e\n\n\u003cdiv style=\"\nfont-size:13px;\ncolor:#00ff99;\nmargin-bottom:1px;\n\"\u003e\n\n🔥 Códigos más detectados\n\n\u003c\/div\u003e\n\n\u003cdiv style=\"\nfont-size:18px;\nfont-weight:bold;\ncolor:white;\nmargin-bottom:6px;\nword-break:break-word;\n\"\u003e\n\n${codigoMasRepetido}\n\n\u003c\/div\u003e\n\n\u003cdiv style=\"\nfont-size:12px;\ncolor:#00ff99;\nmargin-bottom:6px;\nopacity:0.8;\n\"\u003e\n\n\n\n\u003c\/div\u003e\n\n\u003cdiv style=\"\nfont-size:16px;\nfont-weight:bold;\ncolor:#00ccff;\nword-break:break-word;\n\"\u003e\n\n${segundoCodigo}\n\n\u003c\/div\u003e\n\n\u003cdiv id=\"resultadosGenesisShopify\"\u003e\u003c\/div\u003e\n\n`;\n\ncajaFlotante.style.cssText = `\nbottom:50px;\nleft:20px;\nz-index:999999;\n\nbackground:rgba(15,15,15,0.96);\n\nborder:1px solid rgba(255,255,255,0.08);\n\nborder-radius:18px;\n\npadding:14px;\n\nmin-width:210px;\nmax-width:290px;\nmax-height:85vh;\n\noverflow-y:auto;\noverflow-x:hidden;\n\ntext-align:center;\n\nbox-shadow:\n0 10px 35px rgba(0,0,0,0.45);\n\nbackdrop-filter:blur(10px);\n\nfont-family:Arial,sans-serif;\n\ncolor:white;\n`;\n\ncajaFlotante.style.display = 'none';  \n\ncajaFlotante.style.position = 'fixed';\n\nsetTimeout(() =\u003e {\n\n    let botonCerrar =\n    document.getElementById(\n    'cerrarCajaGenesis'\n    );\n\n    if(botonCerrar){\n\n        botonCerrar.onclick = function(){\n\n            let caja =\n            document.getElementById(\n            'codigoFlotanteGenesis'\n            );\n\n            if(caja){\n\n                caja.remove();\n\n            }\n\n        };\n\n    }\n\n}, 500);\n\nbuscarEnShopify(codigoMasRepetido);\n      \n      agruparCodigosGPT(\n        codigosGPT\n        );\n     \n\n      \/\/ =====================================\n\/\/ BUSCAR TAMBIEN SEGUNDO CODIGO\n\/\/ =====================================\n\nif(\ntypeof segundoCodigo !== 'undefined'\n\u0026\u0026\nsegundoCodigo !== 'SIN SEGUNDO'\n){\n\n    setTimeout(() =\u003e {\n\n        buscarEnShopify(segundoCodigo);\n\n    }, 1200);\n\n}\n\n      info.bloque_1 = (info.bloque_1 || '')\n.trim()\n.replace(\/\\n\/g,'\u003cbr\u003e');\n\ninfo.bloque_2 = (info.bloque_2 || '')\n.trim()\n.replace(\/\\n\/g,'\u003cbr\u003e');\n\ninfo.bloque_3 = (info.bloque_3 || '')\n.trim()\n.replace(\/\\n\/g,'\u003cbr\u003e');\n\ninfo.bloque_4 = (info.bloque_4 || '')\n.trim()\n.replace(\/\\n\/g,'\u003cbr\u003e');\nresultado.innerHTML = aviso + `\n\n\u003cdiv style=\"\nwhite-space:normal;\ncolor:#eaeaea;\nfont-size:16px;\nline-height:1.45;\nfont-family:Arial,sans-serif;\npadding:1px;\n\"\u003e\n\n${\ninfo.bloque_1\n?\n`\n\u003cdiv style=\"\nmargin-bottom:20px;\npadding:18px 22px;\nbackground:#0b0b0b;\nborder:1px solid rgba(0,255,153,0.25);\nborder-radius:10px;\n\"\u003e\n\n${info.bloque_1}\n\n\u003c\/div\u003e\n`\n:\n''\n}\n\n${\ninfo.bloque_2\n?\n`\n\u003cdiv style=\"\nmargin-bottom:20px;\npadding:18px 22px;\nbackground:#0b0b0b;\nborder:1px solid rgba(0,255,153,0.25);\nborder-radius:10px;\n\"\u003e\n\n${info.bloque_2}\n\n\u003c\/div\u003e\n`\n:\n''\n}\n\n${\ninfo.bloque_3\n?\n`\n\u003cdiv style=\"\nmargin-bottom:20px;\npadding:18px 22px;\nbackground:#0b0b0b;\nborder:1px solid rgba(0,255,153,0.25);\nborder-radius:10px;\n\"\u003e\n\n${info.bloque_3}\n\n\u003c\/div\u003e\n`\n:\n''\n}\n\n${\ninfo.bloque_4\n?\n`\n\u003cdiv style=\"\nmargin-bottom:20px;\npadding:18px 22px;\nbackground:#0b0b0b;\nborder:1px solid rgba(0,255,153,0.25);\nborder-radius:10px;\n\"\u003e\n\n${info.bloque_4}\n\n\u003c\/div\u003e\n`\n:\n''\n}\n\n\u003c\/div\u003e\n\n`;\n\n        setTimeout(() =\u003e {\n\n            \/\/ mostrarDisponiblesVisual();\n\n        }, 1000);\n\n    } catch (e) {\n\n        console.log(e);\n\n        resultado.innerHTML =\n        'Error conectando servidor';\n\n    }\n\n}\n\n\u003c\/script\u003e\n\n\n\n\u003cscript\u003e\n\n\/\/ =====================================\n\/\/ BUSQUEDA SHOPIFY PRO\n\/\/ =====================================\n\nasync function buscarEnShopify(codigo) {\n\n    try {\n\n        let respuesta = await fetch(\n\n            'https:\/\/genesis1.mx\/search?q='\n\n            + encodeURIComponent(codigo)\n\n        );\n\n        let html = await respuesta.text();\n\n        let parser = new DOMParser();\n\n        let doc = parser.parseFromString(\n            html,\n            'text\/html'\n        );\n\n\n\n        \/\/ =====================================\n        \/\/ DETECTAR BLOQUES PRODUCTO\n        \/\/ =====================================\n\n        let contenedorBusqueda =\n\ndoc.querySelector(\n'.main-content'\n)\n\n|| doc.querySelector(\n'#MainContent'\n)\n\n|| doc;\n\n\n\nlet productos = [\n\n    ...contenedorBusqueda.querySelectorAll(\n        'a[href*=\"\/products\/\"]'\n    )\n\n];\n\n\n\n        \/\/ =====================================\n        \/\/ ELIMINAR DUPLICADOS\n        \/\/ =====================================\n\n        let usados = [];\n\n        productos = productos.filter(p =\u003e {\n\n            let href = p.href;\n\n            if(usados.includes(href)){\n\n                return false;\n\n            }\n\n            usados.push(href);\n\n            return true;\n\n        });\n\n\n\n        \/\/ =====================================\n        \/\/ SOLO 10\n        \/\/ =====================================\n\n        productos = productos.slice(0,20);\n\n\n\n        \/\/ =====================================\n        \/\/ CREAR HTML REAL\n        \/\/ =====================================\n\n        let htmlProductos = '';\n\n\n\n        productos.forEach(producto =\u003e {\n\n    let bloque =\n\n    producto.closest('.grid__item')\n\n    || producto.closest('.product-item')\n\n    || producto.closest('.card-wrapper')\n\n    || producto.closest('li')\n\n    || producto.parentElement;\n\n    if(!bloque) return;\n\n\n\n    \/\/ =====================================\n    \/\/ VALIDAR CONTIENE CODIGO\n    \/\/ =====================================\n\n       let textoBloque =\n\nbloque.innerText\n.toUpperCase();\n\n\n\n    let codigoLimpio =\n\n    codigo\n    .toUpperCase()\n    .replace(\/-\/g,'');\n\n\n\n    \/\/ IGNORAR SI NO CONTIENE CODIGO\n\n    \/\/ =====================================\n\/\/ BUSQUEDA FLEXIBLE\n\/\/ =====================================\n\nlet coincidenciaExacta =\n\ntextoBloque.includes(\n    codigoLimpio\n);\n\n\n\n\/\/ ULTIMOS 4 DIGITOS\n\nlet ultimos4 =\n\ncodigoLimpio.slice(-4);\n\n\n\n\/\/ COINCIDENCIA FLEXIBLE\n\nlet coincidenciaFlexible =\n\ntextoBloque.includes(\n    ultimos4\n);\n\n\n\n\/\/ SI NO HAY NADA\n\/\/ IGNORA\n\nif(\n    !coincidenciaExacta\n    \u0026\u0026\n    !coincidenciaFlexible\n){\n\n    return;\n\n}\n\n\n\n    let contenido =\n\n    bloque.innerHTML;\n\n  \/\/ =====================================\n\/\/ DETECTAR CODIGO DE LA TARJETA\n\/\/ =====================================\n\nlet codigoTarjeta =\n\ntextoBloque.match(\n\/\\b[A-Z0-9\\-]{4,25}\\b\/\n);\n\ncodigoTarjeta =\n\ncodigoTarjeta\n? codigoTarjeta[0]\n: codigo;\n\n\/\/ =====================================\n\/\/ QUITAR SUFIJOS\n\/\/ =====================================\n\ncodigoTarjeta =\n\ncodigoTarjeta.split('-')[0];\n\n\/\/ =====================================\n\/\/ REEMPLAZAR LINKS\n\/\/ =====================================\n\ncontenido = contenido.replace(\n\n\/href=\"[^\"]*\"\/g,\n\n'href=\"https:\/\/genesis1.mx\/search?q='\n+ encodeURIComponent(codigoTarjeta) +\n'\" target=\"_blank\"'\n\n);\n\n\n\n    htmlProductos += `\n\n            \u003cdiv style=\"\n            background:#050505;\n            border:1px solid #00ff99;\n            border-radius:14px;\n            padding:10px;\n            margin-top:12px;\n            overflow:hidden;\n            \"\u003e\n\n            ${contenido}\n\n            \u003c\/div\u003e\n\n            `;\n\n        });\n\n\n\n        \/\/ =====================================\n\/\/ MOSTRAR EN CAJA\n\/\/ =====================================\n\nlet contenedorResultados =\ndocument.getElementById(\n'resultadosGenesisShopify'\n);\n\nif(contenedorResultados){\n\n    contenedorResultados.innerHTML += `\n\n    \u003cdiv style=\"\n    margin-top:8px;\n    padding-top:8px;\n    border-top:1px solid #003300;\n    \"\u003e\n\n    ${contenedorResultados.innerHTML.includes('Resultados Genesis1.mx')\n? ''\n: `\n\u003cdiv style=\"\ncolor:#00ff99;\nfont-size:13px;\nmargin-bottom:10px;\n\"\u003e\n\n🛒 Resultados Genesis1.mx\n\n\u003c\/div\u003e\n`\n}\n\n    ${htmlProductos || `\n\n    \u003cdiv style=\"\n    color:#ff5555;\n    font-size:14px;\n    \"\u003e\n\n    Sin resultados\n\n    \u003c\/div\u003e\n\n    `}\n\n    \u003c\/div\u003e\n\n    `;\n\n}\n\n    } catch(e) {\n\n        console.log(\n            'ERROR SHOPIFY:',\n            e\n        );\n\n    }\n\n}\n\n\u003c\/script\u003e\n\n\n\u003cscript\u003e\n\n\/\/ =====================================\n\/\/ SIMILITUD CODIGOS\n\/\/ =====================================\n\nfunction parecidoCodigo(a,b){\n\n    a = a\n    .toUpperCase()\n    .replace(\/[^A-Z0-9]\/g,'');\n\n    b = b\n    .toUpperCase()\n    .replace(\/[^A-Z0-9]\/g,'');\n\n    let iguales = 0;\n\n    for(let char of a){\n\n        if(b.includes(char)){\n\n            iguales++;\n\n        }\n\n    }\n\n    return iguales \/ Math.max(\n        a.length,\n        b.length\n    );\n\n}\n\n\u003c\/script\u003e\n\n\u003cscript\u003e\n\nasync function agruparCodigosGPT(codigosGPT){\n\n    let caja = document.getElementById(\n        'genesisRelacionados'\n    );\n\n    if(!caja) return;\n\n    caja.style.display = 'block';\n\n    caja.innerHTML = `\n\n    \u003cdiv class=\"relacionadosTitulo\"\u003e\n\n    🧐 Posibles códigos relacionados\n\n    \u003c\/div\u003e\n\n    `;\n\n  caja.innerHTML += `\n\n\u003cdiv id=\"loadingRelacionados\"\nstyle=\"\npadding:18px;\ntext-align:center;\ncolor:#00ff99;\nfont-size:15px;\n\"\u003e\n\n⌛ Buscando relacionados...\n\n\u003c\/div\u003e\n\n`;\n\n    let mostrados = [];\n\n    \/\/ =====================================\n    \/\/ BUSQUEDA ORIGINAL\n    \/\/ =====================================\n\n    let busquedaOriginal = (\n\n        document.getElementById(\n        'busquedaGenesis'\n        )?.value || ''\n\n    ).toUpperCase();\n\n    \/\/ =====================================\n    \/\/ PALABRAS IMPORTANTES\n    \/\/ =====================================\n\n    let palabrasClave =\n\n    busquedaOriginal\n\n    .split(' ')\n\n    .filter(p =\u003e\n\n        p.length \u003e 4\n\n        \u0026\u0026\n\n        !p.match(\/[0-9]\/)\n\n    )\n\n    .slice(0,3);\n\n    \/\/ =====================================\n    \/\/ RECORRER CODIGOS\n    \/\/ =====================================\n\n    for(let codigo of codigosGPT){\n\n        codigo = codigo\n        .trim()\n        .toUpperCase();\n\n        if(\n            !codigo\n            ||\n            codigo.length \u003c 3\n        ){\n\n            continue;\n\n        }\n\n        try{\n\n            let respuesta = await fetch(\n\n    'https:\/\/genesis1.mx\/search?q='\n    + encodeURIComponent(codigo)\n\n);\n\n            let html =\n            await respuesta.text();\n\n            let parser =\n            new DOMParser();\n\n            let doc =\n            parser.parseFromString(\n                html,\n                'text\/html'\n            );\n\n            let contenedorBusqueda =\n\ndoc.querySelector('.main-content')\n\n|| doc.querySelector('#MainContent')\n\n|| doc;\n\nlet productos = [\n\n...contenedorBusqueda.querySelectorAll(\n'a[href*=\"\/products\/\"]'\n)\n\n];\n\n            productos.forEach(producto =\u003e {\n\n                let titulo =\n\nproducto.getAttribute('title')\n\n||\n\nproducto.innerText\n\n||\n\n'';\n\ntitulo = titulo.trim();\n\n                if(\n                    !titulo\n                ){\n\n                    return;\n\n                }\n\n                \/\/ =====================================\n                \/\/ CARD\n                \/\/ =====================================\n\n                let card =\n\nproducto.closest('.grid__item')\n\n|| producto.closest('.product-item')\n\n|| producto.closest('.card-wrapper')\n\n|| producto.closest('li')\n\n|| producto.parentElement;\n\n                let imagen = '';\n                let precio = '';\n\n                if(card){\n\n                    let img =\n                    card.querySelector('img');\n\n                    if(img){\n\n                        imagen =\n                        img.src || '';\n\n                    }\n\n                    let precioEl =\n\n                    card.querySelector(\n                    '.price, .money'\n                    );\n\n                    if(precioEl){\n\n                        precio =\n                        precioEl.innerText\n                        .trim();\n\n                    }\n\n                }\n\n                \/\/ =====================================\n                \/\/ TEXTO COMPLETO CARD\n                \/\/ =====================================\n\n                let textoCard = '';\n\n                if(card){\n\n                    textoCard =\n\n                    card.innerText\n                    .toUpperCase();\n\n                }else{\n\n                    textoCard =\n\n                    titulo.toUpperCase();\n\n                }\n\n                \/\/ =====================================\n                \/\/ NORMALIZAR\n                \/\/ =====================================\n\n                let codigoNormal =\n\n                codigo\n                .replace(\/[^A-Z0-9]\/g,'');\n\n                let textoNormal =\n\n                textoCard\n                .replace(\/[^A-Z0-9]\/g,'');\n\n                \/\/ =====================================\n                \/\/ VALIDAR CODIGO\n                \/\/ =====================================\n\n                let parecido =\n\n                parecidoCodigo(\n                    codigoNormal,\n                    textoNormal\n                );\n\n                let esNumerico = \/^\\d+$\/.test(\n    codigoNormal\n);\n\nif(\n\n    esNumerico\n\n){\n\n    let ultimos6 =\n\n    codigoNormal.slice(-6);\n\n    if(\n        !textoNormal.includes(\n        ultimos6\n        )\n    ){\n\n        return;\n\n    }\n\n}else{\n\n    if(\n        !textoNormal.includes(\n        codigoNormal\n        )\n    ){\n\n        return;\n\n    }\n\n}\n\n                \/\/ =====================================\n                \/\/ VALIDAR CONTEXTO\n                \/\/ =====================================\n\n                let coincidePalabra =\n\n                palabrasClave.some(p =\u003e\n\n                    textoCard.includes(p)\n\n                );\n              let coincideCodigo =\n\ntextoNormal.includes(codigoNormal);\n\n                if(\n    !coincidePalabra\n    \u0026\u0026\n    !coincideCodigo\n){\n\n    return;\n\n}\n\n                \/\/ =====================================\n                \/\/ EVITAR DUPLICADOS\n                \/\/ =====================================\n\n                if(\n                    mostrados.includes(\n                    titulo\n                    )\n                ){\n\n                    return;\n\n                }\n\n                mostrados.push(\n                    titulo\n                );\n\n                \/\/ =====================================\n                \/\/ MOSTRAR CARD\n                \/\/ =====================================\n\n              \n                caja.innerHTML += `\n\n\u003cdiv class=\"codigoRelacionado\"\nonclick=\"\nwindow.open(\n'https:\/\/genesis1.mx\/search?q=${encodeURIComponent(titulo.split(' ')[0])}',\n'_blank'\n)\n\"\n\u003e\n\n\u003cdiv style=\"\ndisplay:flex;\nalign-items:center;\ngap:12px;\n\"\u003e\n\n${\nimagen\n?\n`\n\u003cimg src=\"${imagen}\"\nstyle=\"\nwidth:95px;\nheight:95px;\nobject-fit:contain;\nbackground:#111;\nborder-radius:10px;\npadding:4px;\n\"\u003e\n`\n:\n''\n}\n\n\u003cdiv style=\"\nflex:1;\ntext-align:left;\n\"\u003e\n\n\u003cdiv style=\"\ncolor:#00e5ff;\nfont-weight:bold;\nfont-size:15px;\nmargin-bottom:4px;\nline-height:1.3;\n\"\u003e\n\n${titulo}\n\n\u003c\/div\u003e\n\n\u003cdiv style=\"\ncolor:#cccccc;\nfont-size:13px;\nmargin-top:4px;\nline-height:1.4;\n\"\u003e\n\n${card\n? card.innerText\n    .replaceAll(titulo,'')\n    .replace(\/\\s+\/g,' ')\n    .trim()\n    .substring(0,120)\n: ''\n}\n\n\u003c\/div\u003e\n\n${\nprecio\n?\n`\n\u003cdiv style=\"\ncolor:#00ff99;\nfont-size:14px;\nfont-weight:bold;\n\"\u003e\n${precio}\n\u003c\/div\u003e\n`\n:\n''\n}\n\n\u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003c\/div\u003e\n\n`;\n\n            });\n\n        }catch(e){\n\n            console.log(e);\n\n        }\n\n    }\n\n\n  let loading = document.getElementById(\n'loadingRelacionados'\n);\n\nif(loading){\n\n    loading.remove();\n\n}\n  \n    \/\/ =====================================\n    \/\/ SIN RESULTADOS\n    \/\/ =====================================\n\n    if(\n        mostrados.length === 0\n    ){\n\n        caja.innerHTML += `\n\n\u003cdiv style=\"\ncolor:#ff6666;\ntext-align:center;\npadding:10px;\n\"\u003e\n\nSin relacionados\n\n\u003c\/div\u003e\n\n`;\n\n    }\n\n}\n\n\u003c\/script\u003e\n\n   \n\u003cstyle\u003e\n\n@media (max-width:768px){\n\n    #busquedaGenesis{\n\n        font-size:16px !important;\n        padding:14px !important;\n        border-radius:10px;\n\n    }\n\n    #resultadoGenesis{\n\n        padding:0px !important;\n        border-radius:12px;\n\n    }\n\n   #resultadoGenesis \u003e div{\n\n    font-size:15px !important;\n    line-height:1.2 !important;\n    padding:0px !important;\n\n}\n\n    #resultadoGenesis span{\n\n        font-size:20px !important;\n\n    }\n\n    button{\n\n        font-size:18px !important;\n        padding:14px !important;\n        border-radius:10px;\n\n    }\n\n}\n\n\u003c\/style\u003e\n\n\n\n\u003cstyle\u003e\n\n#codigoFlotanteGenesis h3,\n#codigoFlotanteGenesis h2,\n#codigoFlotanteGenesis h4,\n#codigoFlotanteGenesis .product-title,\n#codigoFlotanteGenesis a{\n\n    color:#00ccff !important;\n\n    font-size:16px !important;\n\n    font-weight:bold !important;\n\n    line-height:1.3 !important;\n\n}\n\n\u003c\/style\u003e\n\n\u003cstyle\u003e\n\n#codigoFlotanteGenesis img{\n\n    max-width:120px !important;\n    max-height:120px !important;\n    object-fit:contain !important;\n    display:block !important;\n    margin:auto !important;\n    border-radius:8px !important;\n\n}\n\n\n\n\u003c\/style\u003e\n\n  \n\n\u003cstyle\u003e\n\n\/* IMAGENES *\/\n\n#codigoFlotanteGenesis img{\n\n    max-width:120px !important;\n    max-height:120px !important;\n    object-fit:contain !important;\n    display:block !important;\n    margin:auto !important;\n    border-radius:8px !important;\n\n}\n\n\/* ELIMINAR WHATSAPP COMPLETO *\/\n\n#codigoFlotanteGenesis a[href*=\"whatsapp\"],\n#codigoFlotanteGenesis a[href*=\"wa.me\"],\n#codigoFlotanteGenesis a[href*=\"api.whatsapp\"],\n#codigoFlotanteGenesis .whatsapp,\n#codigoFlotanteGenesis .wk-button,\n#codigoFlotanteGenesis .wk-btn,\n#codigoFlotanteGenesis .wa-button,\n#codigoFlotanteGenesis .wa_btn,\n#codigoFlotanteGenesis .product-card__whatsapp,\n#codigoFlotanteGenesis [class*=\"whatsapp\"],\n#codigoFlotanteGenesis [id*=\"whatsapp\"]{\n\n    display:none !important;\n\n}\n\n\/* OCULTAR TEXTO WHATSAPP *\/\n\n#codigoFlotanteGenesis *{\n\n    font-family:Arial,sans-serif;\n\n}\n\n#codigoFlotanteGenesis a{\n\n    text-decoration:none !important;\n\n}\n\n#codigoFlotanteGenesis a:has(span),\n#codigoFlotanteGenesis a:has(svg){\n\n    display:none !important;\n\n}\n\n\u003c\/style\u003e\n\n\n\n  \u003cstyle\u003e\n\n\/* =========================================\nCAJA FLOTANTE GENESIS MOBILE PRO\n========================================= *\/\n\n@media (max-width:768px){\n\n    #codigoFlotanteGenesis{\n\n        position:fixed !important;\n\n        left:50% !important;\n        transform:translateX(-50%) !important;\n\n        bottom:12px !important;\n\n        width:68vw !important;\n        max-width:68vw !important;\n        min-width:auto !important;\n\n        max-height:58vh !important;\n\n        overflow-y:auto !important;\n        overflow-x:hidden !important;\n\n        padding:14px !important;\n\n        border-radius:18px !important;\n\n        background:rgba(10,10,10,0.96) !important;\n\n        border:1px solid rgba(255,255,255,0.08) !important;\n\n        backdrop-filter:blur(12px) !important;\n\n        box-shadow:\n        0 10px 35px rgba(0,0,0,0.45) !important;\n\n        z-index:999999 !important;\n\n    }\n\n    \/* =========================================\n    TITULOS\n    ========================================= *\/\n\n    #codigoFlotanteGenesis div{\n\n        line-height:1.4 !important;\n\n    }\n\n    \/* TEXTO PEQUEÑO *\/\n\n    #codigoFlotanteGenesis div[style*=\"font-size:13px\"]{\n\n        font-size:12px !important;\n\n    }\n\n    \/* CODIGO PRINCIPAL *\/\n\n    #codigoFlotanteGenesis div[style*=\"font-size:24px\"]{\n\n        font-size:20px !important;\n        line-height:1.2 !important;\n\n        word-break:break-word !important;\n\n    }\n\n    \/* SEGUNDO CODIGO *\/\n\n    #codigoFlotanteGenesis div[style*=\"font-size:20px\"]{\n\n        font-size:17px !important;\n        line-height:1.2 !important;\n\n    }\n\n    \/* =========================================\n    TARJETAS SHOPIFY\n    ========================================= *\/\n\n    #codigoFlotanteGenesis .grid__item,\n    #codigoFlotanteGenesis .product-item,\n    #codigoFlotanteGenesis .card-wrapper,\n    #codigoFlotanteGenesis li{\n\n        margin-bottom:10px !important;\n\n    }\n\n    \/* =========================================\n    IMAGENES\n    ========================================= *\/\n\n    #codigoFlotanteGenesis img{\n\n        max-width:85px !important;\n        max-height:85px !important;\n\n        object-fit:contain !important;\n\n        border-radius:10px !important;\n\n        display:block !important;\n\n        margin:auto !important;\n\n    }\n\n    \/* =========================================\n    TEXTOS PRODUCTOS\n    ========================================= *\/\n\n    #codigoFlotanteGenesis a,\n    #codigoFlotanteGenesis span,\n    #codigoFlotanteGenesis p,\n    #codigoFlotanteGenesis h2,\n    #codigoFlotanteGenesis h3,\n    #codigoFlotanteGenesis h4{\n\n        font-size:13px !important;\n        line-height:1.4 !important;\n\n        word-break:break-word !important;\n\n    }\n\n    \/* =========================================\n    BOTONES\n    ========================================= *\/\n\n    #codigoFlotanteGenesis button{\n\n        font-size:13px !important;\n\n        padding:8px 10px !important;\n\n        border-radius:10px !important;\n\n    }\n\n    \/* =========================================\n    SCROLL BONITO\n    ========================================= *\/\n\n    #codigoFlotanteGenesis::-webkit-scrollbar{\n\n        width:5px;\n\n    }\n\n    #codigoFlotanteGenesis::-webkit-scrollbar-thumb{\n\n        background:#00ff99;\n        border-radius:10px;\n\n    }\n\n}\n\n\u003c\/style\u003e\n\n\n\n\u003cstyle\u003e\n\n#cerrarCajaGenesis{\n\n    position:absolute !important;\n\n    top:8px !important;\n    right:10px !important;\n\n    width:32px !important;\n    height:32px !important;\n\n    display:flex !important;\n    align-items:center !important;\n    justify-content:center !important;\n\n    background:rgba(255,255,255,0.08) !important;\n\n    border-radius:50% !important;\n\n    color:white !important;\n\n    font-size:22px !important;\n    font-weight:bold !important;\n\n    cursor:pointer !important;\n\n    z-index:999999999 !important;\n\n    user-select:none !important;\n\n}\n\u003c\/style\u003e\n\n\n\u003cstyle\u003e\n\n#genesisRelacionados{\n\n    margin-top:18px;\n\n    background:#050505;\n\n    border:1px solid rgba(0,255,153,0.25);\n\n    border-radius:18px;\n\n    padding:16px;\n\n    display:none;\n\n    color:white;\n\n}\n\n.relacionadosTitulo{\n\n    color:#00ff99;\n\n    font-size:20px;\n\n    font-weight:bold;\n\n    margin-bottom:14px;\n\n    text-align:center;\n\n}\n\n.codigoRelacionado{\n\n    background:#0d0d0d;\n\n    border:1px solid rgba(255,255,255,0.08);\n\n    border-radius:12px;\n\n    padding:12px;\n\n    margin-bottom:10px;\n\n    color:#00ccff;\n\n    font-weight:bold;\n\n    cursor:pointer;\n\n    transition:0.2s ease;\n\n    word-break:break-word;\n\n}\n\n.codigoRelacionado:hover{\n\n    border-color:#00ff99;\n\n    transform:scale(1.02);\n\n    background:#111;\n\n}\n\n@media(max-width:768px){\n\n    #genesisRelacionados{\n\n        padding:14px;\n\n    }\n\n    .codigoRelacionado{\n\n        font-size:14px;\n\n        padding:10px;\n\n    }\n\n}\n\n\u003c\/style\u003e  \n\n\n  \u003cstyle\u003e\n\n.itemSugerencia{\n\n    padding:14px;\n\n    border-bottom:1px solid rgba(255,255,255,0.06);\n\n    cursor:pointer;\n\n    color:white;\n\n    font-size:15px;\n\n    transition:0.2s;\n\n}\n\n.itemSugerencia:hover{\n\n    background:#1a2332;\n     border-radius:8px;\n\n}\n\n.itemSugerencia.ia{\n\n    background:#cc0000;\n\n    color:white;\n\n    font-weight:bold;\n\n    text-align:center;\n\n    font-size:20px;\n\n    padding:20px;\n\n}\n\u003c\/style\u003e","products":[],"url":"https:\/\/genesis1.mx\/collections\/scania-gpt.oembed","provider":"Genesis","version":"1.0","type":"link"}