{"context":{"domain":"www"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"618d6a444e43970b360badd6","name":"www","domain":"www","visibility":"public","settings":{"defaultAccessPolicy":"public"},"updatedAt":"2026-07-27T14:19:36.810Z","createdAt":"2021-11-11T19:08:52.829Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Router","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}}}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"DeviceController","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}},{"_id":"6a62f760209986653b20ffea","component":"data2-core-types@Component","system":"618d6a444e43970b360badd6","params":{"extends":"data2-core-primitives@Block","component":"d2sitev2","package":"www","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n:host,.d2site{\n  --worm:linear-gradient(90deg,#9b5cff,#5b86ff,#4ddfe6,#4de0a1,#84e05a,#e8e84d,#ff6a4d,#ff4d9e,#ff6a4d,#e8e84d,#84e05a,#4de0a1,#4ddfe6,#5b86ff,#9b5cff);\n  --worm-mesh:linear-gradient(125deg,#9b5cff,#5b86ff,#4ddfe6,#4de0a1,#84e05a,#e8e84d,#ff6a4d,#ff4d9e,#ff6a4d,#e8e84d,#84e05a,#4de0a1,#4ddfe6,#5b86ff,#9b5cff);\n  --tile:2400px;\n  --bg:#000; --panel:#0b0b0d; --panel2:#101013; --raise:#17171b;\n  --line:rgba(255,255,255,.09); --line2:rgba(255,255,255,.055);\n  --ink:#f2f2f5; --mut:#8a8a93; --faint:#55555e;\n  --blue:#3a7bff; --blue-soft:rgba(58,123,255,.16);\n  --ok:#4de0a1; --warn:#e8e84d; --bad:#ff6a4d;\n  --sans:\"Helvetica Neue\",Helvetica,Arial,\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",\"Noto Sans CJK SC\",\"Noto Sans SC\",system-ui,sans-serif;\n  --mono:ui-monospace,\"SF Mono\",Menlo,Consolas,monospace;\n  --out:cubic-bezier(.22,1,.36,1); --soft:cubic-bezier(.4,0,.2,1); --spring:cubic-bezier(.34,1.4,.5,1);\n  --hue:#5b86ff;\n}\n*{box-sizing:border-box;margin:0;padding:0}\n.d2site{position:relative;height:100%;overflow-y:auto;overflow-x:hidden;background:var(--bg);color:var(--ink);\n  font-family:var(--sans);-webkit-font-smoothing:antialiased;line-height:1.55;scroll-behavior:smooth;scroll-snap-type:y proximity;scroll-padding-top:66px}\n.d2site a{color:inherit;text-decoration:none}\n.d2site ::selection{background:var(--blue);color:#fff}\n@keyframes flow{to{background-position:var(--tile) 0}}\n@keyframes drift{0%{background-position:0% 30%}100%{background-position:100% 70%}}\n@keyframes spin{to{transform:rotate(360deg)}}\n@keyframes orbglow{0%,100%{box-shadow:0 0 14px currentColor,inset 0 2px 6px rgba(255,255,255,.32)}50%{box-shadow:0 0 30px currentColor,inset 0 2px 6px rgba(255,255,255,.44)}}\n.mark{font-weight:500;letter-spacing:-.015em;line-height:1;font-family:var(--sans);display:inline-flex;align-items:center}\n.logo{display:block;width:auto;height:24px}\n.logo use{fill:#fff}\n.mark sup{font-size:.46em;font-weight:500;vertical-align:super;margin-left:.5px}\nheader.nav{position:sticky;top:0;z-index:50;display:flex;align-items:center;justify-content:space-between;\n  padding:20px 40px;transition:background .4s var(--soft),backdrop-filter .4s,border-color .4s;border-bottom:1px solid transparent}\nheader.nav.scrolled{background:rgba(6,6,8,.72);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--line)}\nheader.nav .mark{font-size:26px}\n.navlinks{display:flex;align-items:center;gap:28px;font-size:14px}\n.navlinks a{color:rgba(255,255,255,.82);transition:color .2s}\n.navlinks a:hover{color:#fff}\n.navctl{display:flex;align-items:center;gap:14px}\n.lang{display:inline-flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;font-family:var(--mono);font-size:11px}\n.lang button{background:none;border:0;color:var(--mut);cursor:pointer;padding:6px 11px;font:inherit;letter-spacing:.06em;transition:.25s var(--soft)}\n.lang button.on{background:var(--blue);color:#fff}\n.signin{border:1px solid var(--line);border-radius:999px;padding:8px 18px;font-size:13px;color:#fff;transition:.3s var(--out)}\n.signin:hover{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}\n.burger{display:none;background:none;border:0;cursor:pointer;flex-direction:column;gap:5px;padding:6px}\n.burger span{width:22px;height:2px;background:#fff;border-radius:2px}\n.btn{position:relative;display:inline-flex;align-items:center;gap:9px;overflow:hidden;border:0;cursor:pointer;font:inherit;font-weight:600;color:#08080a;padding:15px 30px;border-radius:999px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 20s linear infinite;box-shadow:inset 0 1.5px 0 rgba(255,255,255,.5),inset 0 -4px 9px rgba(0,0,0,.16),0 8px 26px rgba(0,0,0,.45);transition:transform .42s var(--spring),box-shadow .3s var(--soft),filter .4s}\n.btn:hover{transform:translateY(-2px);filter:saturate(1.06) brightness(1.03);box-shadow:inset 0 1.5px 0 rgba(255,255,255,.55),inset 0 -4px 9px rgba(0,0,0,.16),0 16px 40px rgba(155,92,255,.32)}\n.btn:active{transform:translateY(0) scale(.96)}\n.btn.ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--line);animation:none}\n.btn.ghost:hover{box-shadow:inset 0 0 0 1.5px var(--blue),0 0 0 3px var(--blue-soft);filter:none}\nsection{position:relative;padding:clamp(80px,11vh,150px) 40px;min-height:100vh;display:flex;flex-direction:column;justify-content:center}\n#essence,#levers,#deliver{background:rgba(255,255,255,.014)}\n.wrap{width:100%;max-width:1200px;margin:0 auto}\n.sec-t{font-size:clamp(30px,4.6vw,58px);font-weight:800;letter-spacing:-.02em;line-height:1.04;margin-top:14px;text-wrap:balance}\n.sec-sub{color:var(--mut);font-size:17px;line-height:1.55;margin-top:16px;max-width:60ch}\n.eyebrow{font-family:var(--mono);font-size:12px;letter-spacing:.24em;text-transform:uppercase;color:var(--faint)}\n.reveal{opacity:0;transform:translateY(24px);transition:opacity .8s var(--out),transform .8s var(--out)}\n.reveal.in{opacity:1;transform:none}\n#hero{padding:0;min-height:calc(100vh - 66px);overflow:hidden;scroll-snap-align:start;background:#000}\n#hero .herofx{position:absolute;inset:0;width:100%;height:100%;z-index:0;display:block}\n#hero .corner{position:absolute;inset:0;pointer-events:none;background:radial-gradient(46% 42% at -2% -4%,rgba(255,90,210,.55),transparent 62%)}\n#hero .vig{position:absolute;inset:0;pointer-events:none;background:radial-gradient(140% 110% at 50% 20%,transparent 38%,rgba(4,8,7,.72) 100%)}\n#hero .inner{position:relative;z-index:2;min-height:calc(100vh - 66px);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:80px 40px 90px}\n.h1{font-size:clamp(34px,5vw,74px);line-height:1.02;font-weight:760;letter-spacing:-.025em;text-transform:none;text-wrap:balance;text-shadow:0 2px 40px rgba(0,0,0,.35)}\n.hero-kicker{font-family:var(--mono);font-size:clamp(11px,1.25vw,13px);letter-spacing:.22em;text-transform:uppercase;color:rgba(255,255,255,.62);margin-bottom:26px;font-weight:500}\n#hero .sub{margin-top:30px;max-width:640px;font-size:clamp(16px,2vw,21px);line-height:1.5;color:rgba(255,255,255,.94);font-weight:400;text-wrap:balance}\n#hero .cta{margin-top:44px;display:flex;gap:14px;flex-wrap:wrap;justify-content:center;align-items:center}\n#hero .cta .btn{color:#0a0a0c}\n#hero .cta .btn:not(.ghost){padding:17px 36px;font-size:16px;font-weight:700}\n#hero .cta .btn.ghost{padding:14px 26px;opacity:.9}\n#hero .cta .btn.ghost{color:#fff;box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.5)}\n#hero .cta .btn.ghost:hover{box-shadow:inset 0 0 0 1.5px #fff}\n.herostrip{margin-top:52px;display:flex;flex-direction:column;align-items:center;gap:16px;width:100%;max-width:820px}\n.hs-clients{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 14px;font-size:14px}\n.hs-clients .hs-lead{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}\n.hs-clients .hs-logos{font-weight:600;color:rgba(255,255,255,.72)}\n.hs-steps{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px 16px;font-size:13px;color:var(--mut)}\n.hs-step b{color:#fff;font-weight:700}\n.hs-arrow{color:var(--blue)}\n@media(max-width:600px){.herostrip{margin-top:34px}.hs-steps{font-size:12px}}\n.credit{position:absolute;right:40px;bottom:34px;z-index:2;width:280px;text-align:right;background:rgba(6,10,9,.5);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:12px 15px}\n.credit b{font-size:10px;font-weight:700;display:block;margin-bottom:4px;letter-spacing:.02em}\n.credit p{font-size:10px;line-height:1.5;color:rgba(255,255,255,.72)}\n.scrollcue{position:absolute;left:50%;bottom:30px;z-index:2;transform:translateX(-50%);font-family:var(--mono);font-size:10px;letter-spacing:.22em;color:rgba(255,255,255,.7);text-transform:uppercase;display:flex;flex-direction:column;align-items:center;gap:8px}\n.scrollcue i{width:1px;height:34px;background:linear-gradient(rgba(255,255,255,.8),transparent);display:block}\n#essence{border-bottom:1px solid var(--line)}\n.triad{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:46px}\n.tri{border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:32px 30px;display:flex;flex-direction:column;transition:transform .45s var(--spring),box-shadow .4s,border-color .4s}\n.tri:hover{transform:translateY(-3px);box-shadow:0 22px 60px rgba(0,0,0,.5);border-color:rgba(255,255,255,.16)}\n.tri .accent{height:6px;width:56px;border-radius:999px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 15s linear infinite;margin-bottom:22px}\n.tri .q{font-family:var(--mono);font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);margin-bottom:12px}\n.tri h3{font-size:clamp(21px,2.3vw,28px);font-weight:800;letter-spacing:-.01em;line-height:1.08;margin-bottom:14px;text-wrap:balance}\n.tri p{color:var(--mut);font-size:15.5px;line-height:1.55}\n.tri em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n.tri .foot{margin-top:auto;padding-top:22px}\n.tri .foot .prod-row{gap:8px}\n.tri .foot .chip{padding:5px 10px;font-size:10.5px}\n.tri .inames{display:flex;flex-wrap:wrap;gap:8px 12px;margin-top:auto;padding-top:22px;font-size:14px;color:var(--ink);font-weight:500}\n.baband{display:grid;grid-template-columns:1fr auto 1fr;gap:28px;align-items:center;margin-top:22px;border:1px solid var(--line);border-radius:20px;background:var(--panel2);padding:26px 32px}\n.baband .k{font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);margin-bottom:8px}\n.baband .before p{color:var(--faint);text-decoration:line-through;text-decoration-color:rgba(255,106,77,.5);font-size:15px}\n.baband .arrow{color:var(--blue);font-size:26px;line-height:1}\n.baband .after p{color:var(--ink);font-size:15px}\n#glance{border-bottom:1px solid var(--line);min-height:auto}\n.glance-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:42px}\n.gcard{position:relative;border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:22px;display:flex;flex-direction:column;gap:12px;transition:transform .4s var(--spring),border-color .4s,background .4s;overflow:hidden}\n.gcard:hover{transform:translateY(-3px);border-color:color-mix(in srgb,var(--hue) 55%,var(--line));background:var(--panel2)}\n.gcard .num{position:absolute;top:16px;right:18px;font-family:var(--mono);font-size:11px;color:var(--faint)}\n.gicon{width:42px;height:42px;display:flex;align-items:center;justify-content:center;border-radius:11px;background:color-mix(in srgb,var(--hue) 15%,transparent)}\n.gsvg{width:24px;height:24px;stroke:var(--hue);stroke-width:2.2;fill:none;stroke-linecap:round;stroke-linejoin:round;overflow:visible}\n.gsvg *{transform-box:fill-box;transform-origin:center}\n.gsvg .dot{fill:var(--hue);stroke:none;animation:gdot 2.6s var(--soft) infinite}\n@keyframes gdot{0%{transform:translateX(0);opacity:0}12%{opacity:1}88%{opacity:1}100%{transform:translateX(24px);opacity:0}}\n.gsvg .b2{animation:gpulse 2.2s ease-in-out infinite}\n@keyframes gpulse{0%,100%{opacity:.4}50%{opacity:1}}\n.gsvg .bar{transform-origin:bottom center;animation:gbar 1.9s ease-in-out infinite}\n.gsvg .bar2{animation-delay:.22s}.gsvg .bar3{animation-delay:.44s}\n@keyframes gbar{0%,100%{transform:scaleY(.55)}50%{transform:scaleY(1)}}\n.gsvg .bx{animation:gbox 2.4s var(--spring) infinite}\n@keyframes gbox{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}\n.gname{font-size:16px;font-weight:700;letter-spacing:-.01em}\n.gval{font-size:13px;color:var(--mut);line-height:1.42}\n.clients-row{display:flex;flex-wrap:wrap;align-items:center;gap:14px 40px;margin-top:36px;padding-top:30px;border-top:1px solid var(--line)}\n.clients-row .cl-lead{width:100%;font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-bottom:2px}\n.clients-row .cl{font-size:19px;font-weight:600;color:rgba(255,255,255,.58);filter:grayscale(1);transition:color .3s,opacity .3s;opacity:.85}\n.clients-row .cl:hover{color:#fff;opacity:1}\n@media(max-width:900px){.glance-grid{grid-template-columns:1fr 1fr}}\n@media(max-width:600px){.glance-grid{grid-template-columns:1fr}}\n#proof{min-height:auto;padding:70px 40px;border-bottom:1px solid var(--line)}\n#proof .lead{text-align:center;color:var(--mut);font-size:13px;font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase;margin-bottom:34px}\n.logos{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:14px 54px}\n.logos .lg{font-size:23px;font-weight:600;letter-spacing:.01em;color:rgba(255,255,255,.62);filter:grayscale(1);transition:color .3s,filter .3s,opacity .3s;opacity:.85}\n.logos .lg:hover{color:#fff;opacity:1}\n.prod-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.prod-row .lbl{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-right:4px}\n.chip{font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--ink);border:1px solid var(--line);border-radius:999px;padding:6px 12px;background:var(--panel2)}\n#industries{padding:0;min-height:auto}\n.ind-head{padding:110px 40px 40px;max-width:1180px;margin:0 auto}\n.ind-head h2{font-size:clamp(30px,5vw,62px);font-weight:800;letter-spacing:-.02em;line-height:1;text-wrap:balance}\n.ind-head p{color:var(--mut);font-size:18px;margin-top:18px;max-width:52ch}\n.industry{position:relative;min-height:100vh;display:flex;align-items:center;padding:110px 40px;overflow:hidden;border-top:1px solid var(--line);scroll-snap-align:start}\n.industry .glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(60% 70% at 82% 30%,color-mix(in srgb,var(--hue) 42%,transparent),transparent 66%)}\n.industry .glow2{position:absolute;inset:0;pointer-events:none;background:radial-gradient(50% 60% at 10% 90%,color-mix(in srgb,var(--hue) 20%,transparent),transparent 60%)}\n.industry .flow{position:absolute;inset:0;z-index:1;width:100%;height:100%;pointer-events:none;mix-blend-mode:screen}\n.industry .inner{position:relative;z-index:2;max-width:1180px;margin:0 auto;width:100%;display:grid;grid-template-columns:1.05fr .95fr;gap:64px;align-items:center}\n.ix-num{font-family:var(--mono);font-size:13px;letter-spacing:.2em;color:var(--hue);margin-bottom:20px}\n.ix-num span{color:var(--faint)}\n.ix-name{font-size:clamp(34px,5.6vw,74px);font-weight:800;line-height:.96;letter-spacing:-.02em;text-wrap:balance}\n.ix-poss{margin-top:26px;font-size:clamp(19px,2.3vw,27px);line-height:1.28;font-weight:500;color:#fff;text-wrap:balance;max-width:22ch}\n.ix-poss b{color:var(--hue);font-weight:700}\n.ix-side{display:flex;flex-direction:column;gap:22px}\n.caps{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:16px;background:rgba(12,12,15,.55);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);overflow:hidden}\n.caps .cap{display:flex;align-items:center;gap:14px;padding:15px 20px;border-bottom:1px solid var(--line2);font-size:15px}\n.caps .cap:last-child{border-bottom:0}\n.caps .cap .dot{width:8px;height:8px;border-radius:50%;background:var(--hue);flex:none;box-shadow:0 0 10px var(--hue)}\n.ix-proof{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--mut)}\n.ix-proof .who{color:#fff;font-weight:600;filter:grayscale(1);opacity:.9}\n.industry{display:none}\n.indacc{display:none}\n#industries{display:none}\n.gcard{cursor:pointer}\n.gcard::after{content:\"↗\";position:absolute;bottom:16px;right:18px;color:var(--faint);font-size:14px;transition:color .3s,transform .3s}\n.gcard:hover::after{color:var(--hue);transform:translate(2px,-2px)}\n.uni-overlay{position:fixed;inset:0;z-index:300;background:#05060a;visibility:hidden;opacity:0;transition:opacity .5s var(--out),visibility .5s;--hue:#4ddfe6}\n.uni-overlay.on{visibility:visible;opacity:1}\n.uni-scroll{position:absolute;inset:0;overflow-y:auto;scroll-behavior:smooth}\n.uni-top{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;padding:20px 40px;background:linear-gradient(180deg,rgba(5,6,10,.92),rgba(5,6,10,0));pointer-events:none}\n.uni-top .mark{font-size:22px;pointer-events:auto;color:#fff}\n.uni-close{pointer-events:auto;width:44px;height:44px;border-radius:999px;border:1px solid var(--line);background:rgba(12,12,15,.7);color:#fff;font-size:15px;cursor:pointer;transition:.3s;backdrop-filter:blur(8px)}\n.uni-close:hover{border-color:var(--hue);box-shadow:0 0 0 3px color-mix(in srgb,var(--hue) 20%,transparent)}\n.uni-hero{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:90px 40px 60px;position:relative;margin-top:-64px}\n.uni-hero .glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(58% 55% at 50% 42%,color-mix(in srgb,var(--hue) 22%,transparent),transparent 70%)}\n.uni-eyebrow{font-family:var(--mono);font-size:12px;letter-spacing:.24em;text-transform:uppercase;color:var(--hue);position:relative}\n.uni-hero h1{font-size:clamp(34px,6vw,74px);font-weight:800;letter-spacing:-.02em;line-height:.98;margin-top:16px;text-transform:uppercase;position:relative;text-wrap:balance}\n.uni-hero .lead{color:var(--mut);font-size:clamp(16px,2vw,20px);max-width:52ch;margin-top:18px;position:relative}\n.sysmap{position:relative;width:100%;max-width:860px;margin:34px auto 0}\n.sysmap.gl{aspect-ratio:16/9;border-radius:16px;overflow:hidden;border:1px solid var(--line);box-shadow:0 30px 90px rgba(0,0,0,.55)}\n.sysmap.gl canvas.dioramaGL{display:block;width:100%;height:100%}\n.sysmap svg{width:100%;height:auto;overflow:visible;filter:drop-shadow(0 0 2px color-mix(in srgb,var(--hue) 40%,transparent))}\n.sysmap .wire{fill:none;stroke:color-mix(in srgb,var(--hue) 45%,transparent);stroke-width:1.5;stroke-dasharray:5 7;animation:wireflow 1.5s linear infinite}\n@keyframes wireflow{to{stroke-dashoffset:-24}}\n.sysmap .flowdot{fill:var(--hue);filter:drop-shadow(0 0 5px var(--hue))}\n.sysmap .comp{cursor:pointer;transition:filter .3s}\n.sysmap .comp .f{fill:color-mix(in srgb,var(--hue) 18%,transparent)}\n.sysmap .comp .s{fill:none;stroke:var(--hue);stroke-width:2;stroke-linejoin:round;stroke-linecap:round}\n.sysmap .comp .dot{fill:var(--hue)}\n.sysmap .comp:hover{filter:drop-shadow(0 0 8px var(--hue))}\n.sysmap .comp:hover .f{fill:color-mix(in srgb,var(--hue) 36%,transparent)}\n.sysmap .clabel{fill:#fff;font-family:var(--sans);font-size:12px;font-weight:600;text-anchor:middle;opacity:.82}\n.sysmap .comp:hover .clabel{opacity:1}\n.sys-hint{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-top:28px;position:relative}\n.uni-overlay{--fct:color-mix(in srgb,var(--hue) 36%,transparent);--fcl:color-mix(in srgb,var(--hue) 18%,transparent);--fcr:color-mix(in srgb,var(--hue) 7%,transparent)}\n.sysmap .comp:hover{--fct:color-mix(in srgb,var(--hue) 52%,transparent);--fcl:color-mix(in srgb,var(--hue) 30%,transparent)}\n.iso svg,.sysmap svg{overflow:visible}\n.iso svg use,.sysmap svg use{--x:0}\n.iso-svg{width:100%;height:100%;overflow:visible;filter:drop-shadow(0 0 2px rgba(255,255,255,.04))}\n.iso-svg .ft{fill:color-mix(in srgb,var(--h) 34%,transparent);stroke:var(--h);stroke-width:1.5;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .fl{fill:color-mix(in srgb,var(--h) 17%,transparent);stroke:var(--h);stroke-width:1.5;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .fr{fill:color-mix(in srgb,var(--h) 8%,transparent);stroke:var(--h);stroke-width:1.5;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .seam{stroke:var(--h);opacity:.45;stroke-width:1;vector-effect:non-scaling-stroke}\n.iso-svg .det{stroke:var(--h);opacity:.7;stroke-width:1.3;vector-effect:non-scaling-stroke;fill:none}\n.iso-svg .iso-lbl{fill:#fff;font-family:var(--sans);font-size:12px;font-weight:600;text-anchor:middle;opacity:.9}\n.iso-svg .iso-wire{fill:none;stroke:color-mix(in srgb,var(--h) 55%,transparent);stroke-width:1.5;stroke-dasharray:5 7;animation:isowire 1.5s linear infinite}\n@keyframes isowire{to{stroke-dashoffset:-24}}\n.iso-svg .iso-flow{fill:var(--h);filter:drop-shadow(0 0 5px var(--h))}\n.iso-blk{transform-box:fill-box;transform-origin:center}\n.iso-float{animation:isofloat 3s ease-in-out infinite}\n@keyframes isofloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}\n.iso-bob{animation:isobob 3.4s ease-in-out infinite}\n@keyframes isobob{0%,100%{transform:translateY(0)}50%{transform:translateY(5px)}}\n.iso-pulse{animation:isopulse 2.4s ease-in-out infinite}\n@keyframes isopulse{0%,100%{opacity:.68}50%{opacity:1}}\n.iso-svg .face{stroke:none}\n.iso-svg .glow2{fill:none;stroke:var(--h);stroke-width:11;opacity:.05;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .glow1{fill:none;stroke:var(--h);stroke-width:5.5;opacity:.13;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .edge{fill:none;stroke:var(--h);stroke-width:1.6;opacity:.95;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .core{fill:none;stroke:#fff;stroke-width:.7;opacity:.7;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .contact{pointer-events:none}\n.iso-svg .floor-glow{pointer-events:none}\n.iso-svg .grid{fill:none;stroke:color-mix(in srgb,var(--h) 24%,transparent);stroke-width:.8;opacity:.13;vector-effect:non-scaling-stroke}\n.iso-svg .ghost{opacity:.22}\n.iso-svg .gface{stroke:none;fill:color-mix(in srgb,var(--h) 8%,#070810)}\n.iso-svg .gedge{fill:none;stroke:color-mix(in srgb,var(--h) 34%,#0a0b12);stroke-width:1;opacity:.7;vector-effect:non-scaling-stroke}\n.iso-svg .dust{fill:#cdd8f7;animation-name:dustf;animation-timing-function:linear;animation-iteration-count:infinite}\n@keyframes dustf{0%{opacity:0;transform:translateY(6px)}25%{opacity:.5}75%{opacity:.38}100%{opacity:0;transform:translateY(-10px)}}\n.iso-svg .ic{fill:none;stroke:var(--h);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .lbl-bg{fill:rgba(6,7,10,.72);stroke:rgba(255,255,255,.06);stroke-width:1;vector-effect:non-scaling-stroke}\n.iso-svg .det{stroke:var(--h);opacity:.22;stroke-width:1;vector-effect:non-scaling-stroke;fill:none}\n.iso-svg .iso-lbl{fill:#fff;font-family:var(--sans);font-weight:600;text-anchor:middle;dominant-baseline:central;opacity:.96;letter-spacing:.01em}\n.sysmap,.ud-viz .iso{position:relative}\n.sysmap::after,.ud-viz .iso::after{content:\"\";position:absolute;inset:0;pointer-events:none;mix-blend-mode:overlay;opacity:.06;border-radius:inherit;background:url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"140\" height=\"140\"><filter id=\"n\"><feTurbulence type=\"fractalNoise\" baseFrequency=\"0.85\" numOctaves=\"2\" stitchTiles=\"stitch\"/><feColorMatrix type=\"saturate\" values=\"0\"/></filter><rect width=\"140\" height=\"140\" filter=\"url(%23n)\"/></svg>')}\n.sysmap .iso-blk.comp{cursor:pointer;transition:filter .3s}\n.sysmap .iso-blk.comp:hover{filter:drop-shadow(0 0 9px var(--h)) brightness(1.14)}\n.sysmap .iso-blk.comp:hover .iso-lbl{opacity:1}\n.uni-detail{min-height:100vh;max-width:1080px;margin:0 auto;padding:100px 40px;display:grid;grid-template-columns:.78fr 1.22fr;gap:56px;align-items:center;border-top:1px solid var(--line)}\n.ud-gain{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:24px}\n.ug-col{border:1px solid var(--line);border-radius:12px;padding:16px 18px;background:var(--panel)}\n.ug-k{font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;display:block;margin-bottom:8px}\n.ug-old .ug-k{color:var(--bad)}\n.ug-new .ug-k{color:var(--hue)}\n.ug-col p{font-size:13.5px;line-height:1.45;color:var(--mut)}\n.ug-new p{color:var(--ink)}\n@media(max-width:640px){.ud-gain{grid-template-columns:1fr}}\n.uni-detail:nth-child(odd) .ud-viz{order:2}\n.ud-viz{display:flex;align-items:center;justify-content:center}\n.ud-viz .iso{width:230px;height:210px}\n.ud-num{font-family:var(--mono);font-size:13px;color:var(--hue);letter-spacing:.2em}\n.ud-t{font-size:clamp(24px,3vw,38px);font-weight:800;letter-spacing:-.02em;margin:10px 0 14px;text-wrap:balance}\n.ud-d{color:var(--mut);font-size:17px;line-height:1.5;max-width:46ch}\n.ud-res{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}\n.ud-res .r{border:1px solid var(--line);border-radius:10px;padding:10px 14px;font-size:13px;color:var(--ink);background:var(--panel)}\n.ud-res .r b{color:var(--hue);font-weight:800}\n.ud-points{display:flex;flex-direction:column;gap:9px;margin-top:20px}\n.ud-point{display:flex;align-items:flex-start;gap:10px;font-size:14.5px;color:var(--ink);line-height:1.42}\n.ud-point .pk{color:var(--hue);flex:none;margin-top:1px;font-weight:700}\n.uni-more{text-align:center;padding:96px 40px 120px;border-top:1px solid var(--line);position:relative}\n.uni-more .glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(50% 60% at 50% 50%,color-mix(in srgb,var(--hue) 16%,transparent),transparent 70%)}\n.uni-more h2{font-size:clamp(28px,4.4vw,52px);font-weight:800;letter-spacing:-.02em;text-wrap:balance;max-width:22ch;margin:0 auto;position:relative}\n.uni-more h2 em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n.uni-more p{color:var(--mut);font-size:18px;margin:18px auto 34px;max-width:48ch;position:relative}\n.uni-more .btn{position:relative;display:inline-flex;width:auto;max-width:max-content}\n@media(max-width:760px){.uni-detail{grid-template-columns:1fr;gap:22px}.uni-detail:nth-child(odd) .ud-viz{order:0}.ud-viz .iso{width:170px;height:160px}}\n.indacc{margin-top:44px;border:1px solid var(--line);border-radius:18px;overflow:hidden;background:var(--panel)}\n.acc-item{border-bottom:1px solid var(--line);--hue:#5b86ff}\n.acc-item:last-child{border-bottom:0}\n.acc-head{display:flex;align-items:center;gap:16px;padding:22px 26px;cursor:pointer;transition:background .3s}\n.acc-head:hover{background:var(--panel2)}\n.acc-item.open .acc-head{background:var(--panel2)}\n.acc-dot{width:10px;height:10px;border-radius:50%;background:var(--hue);box-shadow:0 0 12px var(--hue);flex:none}\n.acc-name{font-size:clamp(18px,2.2vw,24px);font-weight:700;letter-spacing:-.01em}\n.acc-val{color:var(--mut);font-size:14px;margin-left:auto;text-align:right}\n.acc-chev{flex:none;color:var(--faint);transition:transform .35s var(--spring),color .3s;font-size:20px;line-height:1;margin-left:14px}\n.acc-item.open .acc-chev{transform:rotate(90deg);color:var(--hue)}\n.acc-body{max-height:0;overflow:hidden;transition:max-height .5s var(--out)}\n.acc-item.open .acc-body{max-height:1200px}\n.universe{max-height:640px;overflow-y:auto;padding:6px 26px 30px 52px}\n.uni-head{margin-bottom:22px}\n.uni-head h3{font-size:clamp(20px,2.4vw,28px);font-weight:800;letter-spacing:-.01em}\n.uni-head p{color:var(--mut);font-size:15px;margin-top:6px;max-width:60ch}\n.uni-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}\n.deliv{border:1px solid var(--line);border-radius:14px;background:rgba(12,12,15,.5);padding:18px;display:flex;gap:16px;align-items:flex-start;transition:border-color .3s,transform .3s}\n.deliv:hover{border-color:color-mix(in srgb,var(--hue) 50%,var(--line));transform:translateY(-2px)}\n.iso{width:84px;height:78px;flex:none;display:flex;align-items:center;justify-content:center}\n.iso svg{width:100%;height:100%;overflow:visible;filter:drop-shadow(0 0 3px var(--hue)) drop-shadow(0 0 9px color-mix(in srgb,var(--hue) 55%,transparent))}\n.iso svg .f{fill:color-mix(in srgb,var(--hue) 16%,transparent)}\n.iso svg .s{fill:none;stroke:var(--hue);stroke-width:2;stroke-linejoin:round;stroke-linecap:round}\n.iso svg .dot{fill:var(--hue)}\n.deliv-tx{display:flex;flex-direction:column;gap:5px}\n.deliv-t{font-size:15px;font-weight:700;letter-spacing:-.01em}\n.deliv-d{font-size:13px;color:var(--mut);line-height:1.45}\n.uni-prods{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px;align-items:center}\n.uni-prods .lbl{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);margin-right:4px}\n@media(max-width:640px){.uni-grid{grid-template-columns:1fr}.universe{padding-left:26px}}\n.acc-inner{padding:2px 26px 28px 52px;display:flex;flex-wrap:wrap;gap:22px 44px;align-items:flex-start}\n.acc-caps{display:flex;flex-direction:column;gap:10px;flex:1;min-width:260px}\n.acc-cap{display:flex;align-items:center;gap:10px;font-size:14px;color:var(--ink)}\n.acc-cap .d{width:6px;height:6px;border-radius:50%;background:var(--hue);flex:none}\n.acc-prods{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-start;max-width:300px}\n@media(max-width:640px){.acc-val{display:none}.acc-inner{padding-left:26px}}\n#threads{border-top:1px solid var(--line);min-height:auto;padding:90px 40px}\n.threads-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;margin-top:40px}\n.thread{background:var(--panel);padding:30px 26px;transition:background .4s}\n.thread:hover{background:var(--panel2)}\n.thread .t{font-size:18px;font-weight:600;margin-bottom:8px}\n.thread .d{color:var(--mut);font-size:14px}\n.thread .n{font-family:var(--mono);font-size:11px;color:var(--faint);letter-spacing:.16em}\n#levers{border-top:1px solid var(--line);min-height:auto}\n.levers-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;margin-top:40px}\n.lever{background:var(--panel);padding:28px 24px;display:flex;flex-direction:column;gap:9px;transition:background .4s}\n.lever:hover{background:var(--panel2)}\n.lever .lv-cap{font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}\n.lever .lv-num{font-size:clamp(30px,3.6vw,44px);font-weight:800;letter-spacing:-.02em;line-height:1;color:#fff}\n.lever .lv-num b{background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 16s linear infinite;font-weight:800}\n.lever .lv-txt{font-size:13.5px;color:var(--mut);line-height:1.42}\n@media(max-width:900px){.levers-grid{grid-template-columns:1fr 1fr}}\n@media(max-width:560px){.levers-grid{grid-template-columns:1fr}}\n#platform{border-top:1px solid var(--line)}\n.plat-sub{color:var(--mut);font-size:18px;margin-top:18px;max-width:60ch}\n.flow-strip{position:relative;display:flex;flex-wrap:wrap;margin-top:40px;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:var(--panel)}\n.flow-strip::before{content:\"\";position:absolute;top:0;left:0;right:0;height:3px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 12s linear infinite;z-index:1}\n.fnode{flex:1;min-width:130px;padding:26px 16px;text-align:center;border-right:1px solid var(--line)}\n.fnode:last-child{border-right:0}\n.fn-code{font-family:var(--mono);font-size:13px;letter-spacing:.1em;font-weight:600;color:var(--ink)}\n.fn-lbl{font-size:12.5px;color:var(--mut);margin-top:7px}\n.eng-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;margin-top:26px}\n.eng-row .eng-lead{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}\n.eng-chip{font-family:var(--mono);font-size:11px;color:var(--mut);border:1px solid var(--line);border-radius:8px;padding:6px 11px}\n@media(max-width:600px){.fnode{flex:1 0 50%;border-bottom:1px solid var(--line)}}\n#alternatives{border-top:1px solid var(--line)}\n.alt-pills{display:flex;flex-wrap:wrap;gap:10px;margin-top:34px}\n.alt-pill{font-family:var(--mono);font-size:12px;letter-spacing:.06em;border:1px solid var(--line);border-radius:999px;padding:9px 16px;color:var(--mut);text-decoration:line-through;text-decoration-color:rgba(255,106,77,.5)}\n.alt-verdict{margin-top:24px;font-size:clamp(20px,3.2vw,34px);font-weight:800;letter-spacing:-.01em;text-wrap:balance}\n.alt-nos{display:flex;flex-wrap:wrap;gap:14px 22px;margin-top:22px}\n.alt-no{display:flex;align-items:center;gap:9px;font-size:15px;color:var(--mut)}\n.alt-no .x{color:var(--bad);font-weight:800;font-family:var(--mono)}\n.alt-counter{margin-top:32px;padding-top:26px;border-top:1px solid var(--line);font-size:clamp(18px,2.4vw,26px);font-weight:700;letter-spacing:-.01em}\n.alt-counter em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n#products{border-top:1px solid var(--line)}\n.prod-wrap{display:grid;grid-template-columns:minmax(340px,440px) 1fr;gap:70px;align-items:center;margin-top:20px}\n.ring{position:relative;width:100%;aspect-ratio:1;max-width:440px;margin:0 auto}\n.ring .orb{position:absolute;width:15.5%;aspect-ratio:1;border-radius:50%;transform:translate(-50%,-50%);cursor:pointer;box-shadow:0 0 20px currentColor,inset 0 2px 6px rgba(255,255,255,.35);animation:orbglow 4.5s ease-in-out infinite;transition:transform .4s var(--spring),filter .3s}\n.ring .orb:hover,.ring .orb.on{transform:translate(-50%,-50%) scale(1.22);filter:brightness(1.12)}\n.ring .orb::after{content:attr(data-code);position:absolute;left:50%;top:118%;transform:translateX(-50%);font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--mut);white-space:nowrap}\n.ring .center{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center}\n.ring .center .mark{font-size:40px;color:#fff}\n.ring .center small{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.2em;color:var(--faint);margin-top:6px;text-transform:uppercase}\n.prod-detail .code{font-family:var(--mono);font-size:13px;letter-spacing:.18em;color:var(--pc,#fff)}\n.prod-detail h3{font-size:clamp(26px,3.4vw,40px);font-weight:800;letter-spacing:-.01em;margin:8px 0 14px;text-wrap:balance}\n.prod-detail p{color:var(--mut);font-size:18px;max-width:40ch}\n.prod-detail .what{color:var(--faint);font-family:var(--mono);font-size:12px;letter-spacing:.06em;margin-top:16px;text-transform:uppercase}\n.prod-detail .soon{display:inline-block;margin-left:8px;font-family:var(--mono);font-size:10px;color:#08080a;background:var(--warn);border-radius:999px;padding:2px 8px;letter-spacing:.1em}\n.prod-showcase{display:flex;flex-direction:column;align-items:center;gap:6px}\n.prod-showcase .ring{margin:16px auto 6px}\n.pgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:34px;width:100%}\n.pcard{border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:18px 18px 20px;display:flex;flex-direction:column;gap:7px;transition:transform .4s var(--spring),border-color .4s,background .4s}\n.pcard:hover{transform:translateY(-3px);border-color:color-mix(in srgb,var(--pc) 55%,var(--line));background:var(--panel2)}\n.pcard .ptop{display:flex;align-items:center;gap:9px}\n.pcard .pcdot{width:10px;height:10px;border-radius:50%;background:var(--pc);box-shadow:0 0 12px var(--pc);flex:none}\n.pcard .pccode{font-family:var(--mono);font-size:12px;letter-spacing:.14em;color:var(--pc)}\n.pcard .pcname{font-size:16px;font-weight:700;letter-spacing:-.01em}\n.pcard .pctag{font-size:13px;color:var(--mut);line-height:1.45}\n.pcard .soon{margin-left:auto;font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:#08080a;background:var(--warn);border-radius:999px;padding:2px 7px}\n@media(max-width:900px){.pgrid{grid-template-columns:1fr 1fr}}\n@media(max-width:560px){.pgrid{grid-template-columns:1fr}}\n#deliver{border-top:1px solid var(--line)}\n.deliver-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:44px}\n.card{border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:34px;position:relative;overflow:hidden;transition:transform .45s var(--spring),box-shadow .4s,border-color .4s}\n.card:hover{transform:translateY(-3px);box-shadow:0 22px 60px rgba(0,0,0,.5);border-color:rgba(255,255,255,.16)}\n.card .accent{height:6px;border-radius:999px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 15s linear infinite;margin-bottom:22px;width:64px}\n.card h3{font-size:26px;font-weight:700;letter-spacing:-.01em;margin-bottom:10px}\n.card>p{color:var(--mut);font-size:16px;margin-bottom:20px;max-width:42ch}\n.flavors{display:flex;gap:10px;flex-wrap:wrap}\n.flavor{font-family:var(--mono);font-size:12px;letter-spacing:.08em;border:1px solid var(--line);border-radius:10px;padding:9px 14px;color:var(--ink)}\n.card .own{font-size:clamp(28px,3.6vw,44px);font-weight:800;letter-spacing:-.02em;line-height:1;margin-bottom:14px}\n.card .own em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n.fde-band{margin-top:26px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;border:1px solid var(--line);border-radius:16px;background:var(--panel2);padding:22px 28px}\n.fde-flow{display:flex;flex-wrap:wrap;align-items:center;gap:12px;font-size:clamp(16px,2vw,22px);font-weight:700;letter-spacing:-.01em}\n.fde-flow i{color:var(--blue);font-style:normal;font-weight:400}\n.fde-pay{font-family:var(--mono);font-size:13px;letter-spacing:.06em;color:var(--mut)}\n.cta-kicker{font-family:var(--mono);font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--faint);margin-bottom:20px}\n#cta .cta-row{display:flex;gap:14px;flex-wrap:wrap;justify-content:center}\n#cta{border-top:1px solid var(--line);text-align:center;align-items:center}\n#cta .big{font-size:clamp(34px,6vw,84px);font-weight:800;letter-spacing:-.02em;line-height:.95;text-transform:uppercase;text-wrap:balance}\n#cta .sub{color:var(--mut);font-size:19px;margin:22px auto 40px;max-width:44ch}\nfooter{padding:60px 40px 50px;border-top:1px solid var(--line);background:var(--panel)}\n.foot{max-width:1180px;margin:0 auto;display:flex;justify-content:space-between;align-items:flex-start;gap:40px;flex-wrap:wrap}\n.foot .mark{font-size:30px}\n.foot .cols{display:flex;gap:60px;flex-wrap:wrap}\n.foot .fc h5{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-bottom:14px}\n.foot .fc a{display:block;color:var(--mut);font-size:14px;margin-bottom:9px;transition:color .2s}\n.foot .fc a:hover{color:#fff}\n.foot .fine{width:100%;border-top:1px solid var(--line);margin-top:36px;padding-top:22px;display:flex;justify-content:space-between;color:var(--faint);font-size:12px;font-family:var(--mono);letter-spacing:.04em;flex-wrap:wrap;gap:10px}\n.rail{position:absolute;right:22px;transform:translateY(-50%);z-index:40;display:flex;flex-direction:column;gap:12px}\n.rail a{width:9px;height:9px;border-radius:50%;border:1.4px solid rgba(255,255,255,.4);transition:.3s var(--spring)}\n.rail a.on{background:#fff;border-color:#fff;transform:scale(1.15)}\n.rail a:hover{border-color:#fff}\n@media(max-width:900px){\n  .navlinks{display:none}\n  .burger{display:flex}\n  header.nav.open .navlinks{display:flex;position:absolute;top:100%;left:0;right:0;flex-direction:column;gap:0;background:rgba(6,6,8,.96);backdrop-filter:blur(16px);padding:10px 40px 24px;border-bottom:1px solid var(--line)}\n  header.nav.open .navlinks a{padding:12px 0;border-bottom:1px solid var(--line2)}\n  section{padding:90px 24px}\n  .industry .inner{grid-template-columns:1fr;gap:34px}\n  .threads-grid{grid-template-columns:1fr}\n  .prod-wrap{grid-template-columns:1fr;gap:40px}\n  .deliver-grid{grid-template-columns:1fr}\n  .triad{grid-template-columns:1fr}\n  .baband{grid-template-columns:1fr;gap:12px}\n  .baband .arrow{transform:rotate(90deg)}\n  .rail{display:none}\n  .credit{display:none}\n}\n`,\n  render(d2){\n    return `<div class=\"d2site\" id=\"site\">\n<svg width=\"0\" height=\"0\" aria-hidden=\"true\" style=\"position:absolute;width:0;height:0;overflow:hidden\"><symbol id=\"d2wm\" viewBox=\"0 0 459.554 148.471\"><g transform=\"translate(-678.859 -300.605)\"><path d=\"M14.359-122.138H75.428a148.024,148.024,0,0,1,16.175.865,49.592,49.592,0,0,1,16.349,5.017,50.6,50.6,0,0,1,14.445,10.38,58.331,58.331,0,0,1,9.774,13.58,61.26,61.26,0,0,1,5.536,15.483,77.146,77.146,0,0,1,1.73,16.089q0,17.819-6.92,30.708A54.761,54.761,0,0,1,114.7-9.861a51.9,51.9,0,0,1-11.072,5.45,68.767,68.767,0,0,1-11.5,2.941,98.6,98.6,0,0,1-11.5,1.211Q74.909,0,69.719,0H14.359ZM26.469-10.207H65.394q6.055,0,12.369-.173a73.177,73.177,0,0,0,12.37-1.384A64.307,64.307,0,0,0,101.9-15.311a37.089,37.089,0,0,0,10.726-6.834,39.087,39.087,0,0,0,11.245-17.473,68.5,68.5,0,0,0,3.114-20.414,67.7,67.7,0,0,0-2.6-18.857,47.079,47.079,0,0,0-8.131-16.089,39.361,39.361,0,0,0-10.553-9.688,48.312,48.312,0,0,0-11.245-5.1,45.376,45.376,0,0,0-10.553-1.9q-5.017-.259-8.3-.259H26.469ZM263.133-.173q-2.595.346-5.1.519t-5.277.173q-7.266,0-10.207-3.114t-3.979-10.034q-2.595,1.9-6.4,4.411a59.467,59.467,0,0,1-9.256,4.844,68.866,68.866,0,0,1-12.8,3.893,82.923,82.923,0,0,1-17.04,1.557q-11.764,0-17.387-1.9a56.36,56.36,0,0,1-7.525-2.941,28.342,28.342,0,0,1-9.6-9.255A24.591,24.591,0,0,1,154.835-25.6a24.907,24.907,0,0,1,3.027-12.456,25.929,25.929,0,0,1,7.353-8.477,36.879,36.879,0,0,1,11.937-5.19,103.75,103.75,0,0,1,16.694-2.768q9.429-.865,20.76-1.125t23.788-.433a48.376,48.376,0,0,0-.605-7.612,12.089,12.089,0,0,0-3.893-6.92Q230.609-73.7,223.43-75.6T203.1-77.5a85.006,85.006,0,0,0-16.521,1.3,30.566,30.566,0,0,0-10.034,3.633,16.669,16.669,0,0,0-5.622,5.536,33.568,33.568,0,0,0-3.114,7.006l-11.937-.519a40.255,40.255,0,0,1,1.557-5.277,28.9,28.9,0,0,1,2.941-5.8,30.014,30.014,0,0,1,8.217-8.391,39.385,39.385,0,0,1,10.294-4.93,58.16,58.16,0,0,1,11.591-2.335q6.055-.606,12.11-.606,4.152,0,8.736.259a85.752,85.752,0,0,1,9.256,1.038,90.48,90.48,0,0,1,9.082,1.99,31.348,31.348,0,0,1,7.872,3.287,19.89,19.89,0,0,1,6.4,5.622,25.409,25.409,0,0,1,3.374,6.574,27.817,27.817,0,0,1,1.384,6.4q.259,3.028.259,4.757v36.5a29.841,29.841,0,0,0,.519,5.968,8.188,8.188,0,0,0,1.99,4.066,8.512,8.512,0,0,0,4.238,2.249,24.406,24.406,0,0,0,7.439.346ZM238.567-46.364q-9.688,0-19.549.173t-18.511.951a108,108,0,0,0-15.484,2.422,30.135,30.135,0,0,0-10.639,4.411,16.457,16.457,0,0,0-5.622,6.142,15.459,15.459,0,0,0-1.643,6.833q0,5.882,3.2,9.342a20.362,20.362,0,0,0,7.612,5.19,35.483,35.483,0,0,0,9,2.249,69.488,69.488,0,0,0,7.525.519,66.684,66.684,0,0,0,12.369-1.125A73.708,73.708,0,0,0,217.893-12.2a41.312,41.312,0,0,0,8.91-4.325,34.318,34.318,0,0,0,6.228-5.1,20.75,20.75,0,0,0,4.844-10.726A86.815,86.815,0,0,0,238.567-46.364Zm53.8-73.7v34.6h24.22v9H292.37v40.655q0,6.228.259,11.332a26.276,26.276,0,0,0,1.816,8.823,11.668,11.668,0,0,0,4.931,5.709q3.373,1.989,9.6,1.99a58.913,58.913,0,0,0,7.612-.519V.692q-2.941.519-5.622.865a45.4,45.4,0,0,1-5.8.346,33.2,33.2,0,0,1-11.937-1.99A16.222,16.222,0,0,1,285.1-6.747a25.125,25.125,0,0,1-3.547-11.245q-.605-6.574-.605-15.743V-76.466H264.69v-9h16.262v-29.064ZM432.522-.188c-1.73.231-3.28.419-4.952.534s-3.431.173-5.276.173q-7.266,0-10.207-3.114t-3.979-10.034q-2.595,1.9-6.4,4.411a59.465,59.465,0,0,1-9.256,4.844,68.865,68.865,0,0,1-12.8,3.893,82.922,82.922,0,0,1-17.04,1.557q-11.764,0-17.386-1.9A56.359,56.359,0,0,1,337.7-2.768a28.342,28.342,0,0,1-9.6-9.255,24.591,24.591,0,0,1-3.72-13.581A24.907,24.907,0,0,1,327.4-38.06a25.929,25.929,0,0,1,7.352-8.477,36.879,36.879,0,0,1,11.937-5.19,103.749,103.749,0,0,1,16.694-2.768q9.429-.865,20.76-1.125t23.788-.433a48.378,48.378,0,0,0-.605-7.612,12.089,12.089,0,0,0-3.893-6.92Q400.149-73.7,392.97-75.6t-20.327-1.9a85.006,85.006,0,0,0-16.522,1.3,30.566,30.566,0,0,0-10.034,3.633,16.669,16.669,0,0,0-5.622,5.536,33.567,33.567,0,0,0-3.114,7.006l-11.937-.519a40.254,40.254,0,0,1,1.557-5.277,28.9,28.9,0,0,1,2.941-5.8,30.014,30.014,0,0,1,8.217-8.391,39.385,39.385,0,0,1,10.294-4.93,58.159,58.159,0,0,1,11.591-2.335q6.055-.606,12.11-.606,4.152,0,8.736.259a85.751,85.751,0,0,1,9.256,1.038A90.482,90.482,0,0,1,399.2-84.6a31.348,31.348,0,0,1,7.872,3.287,19.891,19.891,0,0,1,6.4,5.622,25.409,25.409,0,0,1,3.374,6.574,27.818,27.818,0,0,1,1.384,6.4q.26,3.028.259,4.757v36.5a29.841,29.841,0,0,0,.519,5.968A8.189,8.189,0,0,0,421-11.418a8.512,8.512,0,0,0,4.238,2.249,23.452,23.452,0,0,0,7.288.331ZM408.107-46.364q-9.688,0-19.549.173t-18.511.951a108,108,0,0,0-15.483,2.422,30.135,30.135,0,0,0-10.639,4.411,16.457,16.457,0,0,0-5.622,6.142,15.459,15.459,0,0,0-1.643,6.833q0,5.882,3.2,9.342a20.362,20.362,0,0,0,7.612,5.19,35.483,35.483,0,0,0,9,2.249,69.488,69.488,0,0,0,7.525.519,66.684,66.684,0,0,0,12.37-1.125A73.707,73.707,0,0,0,387.434-12.2a41.312,41.312,0,0,0,8.91-4.325,34.318,34.318,0,0,0,6.228-5.1,20.749,20.749,0,0,0,4.844-10.726A86.812,86.812,0,0,0,408.107-46.364Z\" transform=\"translate(664.5 447)\" fill=\"#fff\"/><path d=\"M.512-37.631C.512-44,2.263-49.153,5.339-53.064a33.374,33.374,0,0,1,11.47-9.294q9.822-4.878,12.755-7.251A7.727,7.727,0,0,0,32.5-75.937a9.882,9.882,0,0,0-2.439-6.987q-2.439-2.637-7.778-2.637T14.832-82.2a15.491,15.491,0,0,0-2.175,8.174H2.307q0-9.888,5.636-15.128t14.667-5.24q9.163,0,14.733,4.417t5.57,12.92q0,7.844-4.054,11.865t-12.821,8.24q-11.272,5.076-13.25,10.085H42.913v9.229Z\" transform=\"translate(1095.5 395)\" fill=\"#fff\"/></g></symbol></svg>\n<header class=\"nav\" id=\"nav\">\n  <a href=\"#hero\" class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:22px\"><use href=\"#d2wm\"></use></svg></a>\n  <nav class=\"navlinks\">\n    <a href=\"#industries\" data-pt=\"Indústrias\" data-en=\"Industries\">Indústrias</a>\n    <a href=\"#products\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</a>\n    <a href=\"#deliver\" data-pt=\"Como entregamos\" data-en=\"How we deliver\">Como entregamos</a>\n    <a href=\"#proof\" data-pt=\"Clientes\" data-en=\"Customers\">Clientes</a>\n    <a href=\"#cta\" data-pt=\"Demo\" data-en=\"Demo\">Demo</a>\n  </nav>\n  <div class=\"navctl\">\n    <div class=\"lang\" id=\"lang\"><button data-l=\"pt\" class=\"on\">PT</button><button data-l=\"en\">EN</button><button data-l=\"zh\">中文</button></div>\n    <a href=\"#\" class=\"signin\" data-pt=\"Entrar\" data-en=\"Sign in\">Entrar</a>\n    <button class=\"burger\" id=\"burger\" aria-label=\"menu\"><span></span><span></span><span></span></button>\n  </div>\n</header>\n<div class=\"rail\" id=\"rail\"></div>\n<section id=\"hero\">    <canvas class=\"herofx\"></canvas>\n  <div class=\"inner\">\n    <div class=\"hero-kicker reveal\" data-pt=\"Consultoria de engenharia · plataforma e runtimes próprios\" data-en=\"Engineering consultancy · proprietary platform & runtimes\" data-zh=\"工程咨询 · 自有平台与运行时\">Consultoria de engenharia · plataforma e runtimes próprios</div>\n    <h1 class=\"h1\" data-pt=\"Do problema de negócio<br>ao software em produção.\" data-en=\"From a business problem<br>to software in production.\">Do problema de negócio<br>ao software em produção.</h1>\n    <p class=\"sub\" data-pt=\"Uma consultoria de engenharia com plataforma e runtimes próprios. Encaramos os problemas difíceis das grandes operações — e entregamos rodando, com o seu time junto.\" data-en=\"An engineering consultancy with a proprietary platform and runtimes. We take on the hard problems of large operations — and ship them to production, with your team alongside.\">Uma consultoria de engenharia com plataforma e runtimes próprios. Encaramos os problemas difíceis das grandes operações — e entregamos rodando, com o seu time junto.</p>\n    <div class=\"cta\">\n      <a href=\"#industries\" class=\"btn\"><span data-pt=\"Ver o que é possível\" data-en=\"See what's possible\">Ver o que é possível</span></a>\n      <a href=\"#cta\" class=\"btn ghost\"><span data-pt=\"Agendar demo\" data-en=\"Book a demo\">Agendar demo</span></a>\n    </div>\n    <div class=\"herostrip reveal\">\n      <div class=\"hs-clients\"><span class=\"hs-lead\" data-pt=\"Já em produção com\" data-en=\"Already in production with\">Já em produção com</span><span class=\"hs-logos\">Natura · XP · Americanas · Whirlpool · Arcadis · Raízen</span></div>\n      <div class=\"hs-steps\"><span class=\"hs-step\"><b>30 min</b> <span data-pt=\"mapeamos onde dói\" data-en=\"we map where it hurts\">mapeamos onde dói</span></span><span class=\"hs-arrow\">→</span><span class=\"hs-step\"><b data-pt=\"2–4 semanas\" data-en=\"2–4 weeks\">2–4 semanas</b> <span data-pt=\"sprint com engenheiro embarcado\" data-en=\"sprint with an embedded engineer\">sprint com engenheiro embarcado</span></span><span class=\"hs-arrow\">→</span><span class=\"hs-step\"><b data-pt=\"Em produção\" data-en=\"In production\">Em produção</b> <span data-pt=\"seu time é dono\" data-en=\"your team owns it\">seu time é dono</span></span></div>\n    </div>\n  </div>\n  <div class=\"scrollcue\"><span data-pt=\"ROLE\" data-en=\"SCROLL\">ROLE</span><i></i></div>\n</section>\n<section id=\"essence\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"A Data² em uma tela\" data-en=\"Data² in one screen\">A Data² em uma tela</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"O que vemos, o que fazemos e para quem.\" data-en=\"What we see, what we do, and who for.\">O que vemos, o que fazemos e para quem.</h2>\n    <div class=\"triad\">\n      <div class=\"tri reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"q\" data-pt=\"O que vemos\" data-en=\"What we see\">O que vemos</div>\n        <h3 data-pt=\"Toda área tem um <em>software esperando pra existir</em>.\" data-en=\"Every area has <em>software waiting to exist</em>.\">.</h3>\n        <p data-pt=\"A tecnologia já permite construir quase tudo. O que faltava era a ponte direta entre quem conhece o problema e a solução rodando em produção.\" data-en=\"Technology already lets us build almost anything. What was missing is the direct bridge between the people who know the problem and the solution running in production.\">.</p>\n      </div>\n      <div class=\"tri reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"q\" data-pt=\"O que fazemos\" data-en=\"What we do\">O que fazemos</div>\n        <h3 data-pt=\"Uma suíte que vira <em>software de verdade</em>.\" data-en=\"A suite that becomes <em>real software</em>.\">.</h3>\n        <p data-pt=\"8 produtos com AI, omnichannel, dados reais, automação e dashboards — montados no builder visual e publicados em produção. Sem código.\" data-en=\"8 products with AI, omnichannel, real data, automation and dashboards — assembled in the visual builder and shipped to production. No code.\">.</p>\n        <div class=\"foot\"><div class=\"prod-row\"><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">MEDIA</span><span class=\"chip\">ID</span><span class=\"chip\">CONNECT</span><span class=\"chip\">DOMAIN</span><span class=\"chip\">RUSH</span><span class=\"chip\">CASHIER</span></div></div>\n      </div>\n      <div class=\"tri reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"q\" data-pt=\"Para quem\" data-en=\"Who for\">Para quem</div>\n        <h3 data-pt=\"Para a área que <em>tem o problema</em>.\" data-en=\"For the area that <em>owns the problem</em>.\">.</h3>\n        <p data-pt=\"Times de negócio de grandes empresas que não querem mais esperar. Nós somos os enablers entre a ideia e a produção.\" data-en=\"Business teams at large companies that won't wait anymore. We are the enablers between the idea and production.\">.</p>\n        <div class=\"inames\" data-pt=\"RH · Supply · Financeiro · CX · Varejo · Vendas · BI · Seguros · Compras\" data-en=\"HR · Supply · Financial · CX · Retail · Sales · BI · Insurance · Procurement\">RH · Supply · Financeiro · CX · Varejo · Vendas · BI · Seguros · Compras</div>\n      </div>\n    </div>\n    <div class=\"baband reveal\">\n      <div class=\"before\"><div class=\"k\" data-pt=\"Antes\" data-en=\"Before\">Antes</div><p data-pt=\"Da ideia à entrega: muitas mãos, muitas traduções, muito tempo.\" data-en=\"From idea to delivery: many hands, many translations, a lot of time.\">.</p></div>\n      <div class=\"arrow\">→</div>\n      <div class=\"after\"><div class=\"k\" data-pt=\"Com a Data²\" data-en=\"With Data²\">Com a Data²</div><p data-pt=\"A própria área desenha, conecta o dado real, publica e opera. Em produção.\" data-en=\"The business area itself designs, connects the real data, ships and operates. In production.\">.</p></div>\n    </div>\n  </div>\n</section>\n<section id=\"glance\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Panorama\" data-en=\"At a glance\" data-zh=\"概览\">Panorama</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"As frentes onde já entregamos\" data-en=\"Where we already deliver\" data-zh=\"我们已交付的领域\">As frentes onde já entregamos</h2>\n    <div class=\"glance-grid\">\n      <div class=\"gcard reveal\" style=\"--hue:#5b86ff\"><span class=\"num\">01</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"5\" y=\"8\" width=\"20\" height=\"14\" rx=\"4\"></rect><rect class=\"b2\" x=\"17\" y=\"19\" width=\"18\" height=\"13\" rx=\"4\"></rect></svg></span><span class=\"gname\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\" data-zh=\"人力资源\">RH & Pessoas</span><span class=\"gval\" data-pt=\"Atendimento ao colaborador com AI\" data-en=\"AI employee support\" data-zh=\"AI 员工服务\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#4de0a1\"><span class=\"num\">02</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"9\" y=\"23\" width=\"22\" height=\"9\" rx=\"2\"></rect><rect class=\"bx\" x=\"14\" y=\"9\" width=\"12\" height=\"10\" rx=\"2\"></rect></svg></span><span class=\"gname\" data-pt=\"Supply & Operações\" data-en=\"Supply & Operations\" data-zh=\"供应与运营\">Supply & Operações</span><span class=\"gval\" data-pt=\"Cenários que viram plano de produção\" data-en=\"Scenarios into production plans\" data-zh=\"情景转化为生产计划\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#e8b84d\"><span class=\"num\">03</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><circle cx=\"8\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"20\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"32\" cy=\"20\" r=\"3.2\"></circle><path d=\"M11.5 20h5.5M23 20h5.5\"></path><circle class=\"dot\" cx=\"8\" cy=\"20\" r=\"2.4\"></circle></svg></span><span class=\"gname\" data-pt=\"Serviços Financeiros\" data-en=\"Financial Services\" data-zh=\"金融服务\">Serviços Financeiros</span><span class=\"gval\" data-pt=\"Prospecção 1-a-1 personalizada por AI\" data-en=\"AI-personalized outreach\" data-zh=\"AI 个性化触达\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#4ddfe6\"><span class=\"num\">04</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"5\" y=\"8\" width=\"20\" height=\"14\" rx=\"4\"></rect><rect class=\"b2\" x=\"17\" y=\"19\" width=\"18\" height=\"13\" rx=\"4\"></rect></svg></span><span class=\"gname\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\" data-zh=\"客户体验\">CX & Contact Center</span><span class=\"gval\" data-pt=\"Um contact center numa plataforma\" data-en=\"A contact center on one platform\" data-zh=\"一体化呼叫中心\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#ff4d9e\"><span class=\"num\">05</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"9\" y=\"23\" width=\"22\" height=\"9\" rx=\"2\"></rect><rect class=\"bx\" x=\"14\" y=\"9\" width=\"12\" height=\"10\" rx=\"2\"></rect></svg></span><span class=\"gname\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\" data-zh=\"零售电商\">Varejo & E-commerce</span><span class=\"gval\" data-pt=\"Da vitrine ao ERP\" data-en=\"From storefront to ERP\" data-zh=\"从门店到 ERP\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#9b5cff\"><span class=\"num\">06</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><circle cx=\"8\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"20\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"32\" cy=\"20\" r=\"3.2\"></circle><path d=\"M11.5 20h5.5M23 20h5.5\"></path><circle class=\"dot\" cx=\"8\" cy=\"20\" r=\"2.4\"></circle></svg></span><span class=\"gname\" data-pt=\"Força de Vendas\" data-en=\"Sales Enablement\" data-zh=\"销售赋能\">Força de Vendas</span><span class=\"gval\" data-pt=\"Copiloto de vendas para a força\" data-en=\"A sales copilot for the field\" data-zh=\"一线销售副驾\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#84e05a\"><span class=\"num\">07</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect class=\"bar bar1\" x=\"8\" y=\"12\" width=\"6\" height=\"20\" rx=\"1.5\"></rect><rect class=\"bar bar2\" x=\"17\" y=\"12\" width=\"6\" height=\"20\" rx=\"1.5\"></rect><rect class=\"bar bar3\" x=\"26\" y=\"12\" width=\"6\" height=\"20\" rx=\"1.5\"></rect></svg></span><span class=\"gname\" data-pt=\"BI & Analytics\" data-en=\"BI & Analytics\" data-zh=\"数据分析\">BI & Analytics</span><span class=\"gval\" data-pt=\"Do dado vivo ao plano de ação\" data-en=\"Live data to action plan\" data-zh=\"从实时数据到行动计划\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#ff6a4d\"><span class=\"num\">08</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"5\" y=\"8\" width=\"20\" height=\"14\" rx=\"4\"></rect><rect class=\"b2\" x=\"17\" y=\"19\" width=\"18\" height=\"13\" rx=\"4\"></rect></svg></span><span class=\"gname\" data-pt=\"Seguros & CX\" data-en=\"Insurance & CX\" data-zh=\"保险\">Seguros & CX</span><span class=\"gval\" data-pt=\"Conhecimento com busca semântica\" data-en=\"Semantic knowledge base\" data-zh=\"语义知识库\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#e8e84d\"><span class=\"num\">09</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"9\" y=\"23\" width=\"22\" height=\"9\" rx=\"2\"></rect><rect class=\"bx\" x=\"14\" y=\"9\" width=\"12\" height=\"10\" rx=\"2\"></rect></svg></span><span class=\"gname\" data-pt=\"Compras & Procurement\" data-en=\"Procurement\" data-zh=\"采购\">Compras & Procurement</span><span class=\"gval\" data-pt=\"Modelagem e planejamento de compras\" data-en=\"Sourcing modeling & planning\" data-zh=\"采购建模与规划\">.</span></div>\n    </div>\n    \n  </div>\n</section>\n\n<section id=\"cases\" style=\"padding:0;position:relative;background:#04050a\">${d2.render('www@nUYyYfWeNHEK6YeaD5kcd',{},{style:'display:block;width:100%;height:86vh'})}</section>\n\n<section id=\"proof\">\n  <p class=\"lead\" data-pt=\"Times de negócio já constroem na Data²\" data-en=\"Business teams already build on Data²\">Times de negócio já constroem na Data²</p>\n  <div class=\"logos\">\n    <span class=\"lg\">Natura</span><span class=\"lg\">XP</span><span class=\"lg\">Americanas</span><span class=\"lg\">Vivara</span><span class=\"lg\">Avon</span><span class=\"lg\">Justos</span>\n  </div>\n</section>\n<section id=\"industries\">\n  <div class=\"ind-head\">\n    <p class=\"eyebrow reveal\" data-pt=\"O que é possível\" data-en=\"What's possible\">O que é possível</p>\n    <h2 class=\"reveal\" style=\"margin-top:16px\" data-pt=\"Uma plataforma. Toda indústria.\" data-en=\"One platform. Every industry.\">Uma plataforma. Toda indústria.</h2>\n    <p class=\"reveal\" data-pt=\"Não vendemos slides. Cada frente abaixo é software real, em produção, construído pela própria área de negócio.\" data-en=\"We don't sell slides. Each frontier below is real software, in production, built by the business area itself.\">.</p>\n  </div>\n  <div class=\"indacc reveal\" id=\"indacc\">\n  <div class=\"acc-item\" style=\"--hue:#5b86ff\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\">RH & Pessoas</span><span class=\"acc-val\" data-pt=\"Atendimento ao colaborador com AI\" data-en=\"AI employee support\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Assistente de AI para o colaborador\" data-en=\"AI assistant for employees\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Transbordo para atendimento humano\" data-en=\"Handoff to human agents\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Leitura de documentos (OCR)\" data-en=\"Document reading (OCR)\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Respostas e regras configuráveis pela área\" data-en=\"Answers & rules configured by the team\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Analytics e CSAT\" data-en=\"Analytics & CSAT\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#4de0a1\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Supply & Operações\" data-en=\"Supply & Operations\">Supply & Operações</span><span class=\"acc-val\" data-pt=\"Cenários que viram plano de produção\" data-en=\"Scenarios into production plans\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Simulação de cenários de produção\" data-en=\"Production scenario simulation\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Explosão de estrutura (BOM)\" data-en=\"Bill-of-materials explosion\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Score de economia e viabilidade\" data-en=\"Savings & feasibility scoring\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"SQL self-service sobre o data lake\" data-en=\"Self-service SQL over the data lake\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Exportação para planilha\" data-en=\"Export to spreadsheet\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#e8b84d\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Serviços Financeiros\" data-en=\"Financial Services\">Serviços Financeiros</span><span class=\"acc-val\" data-pt=\"Prospecção 1-a-1 personalizada por AI\" data-en=\"AI-personalized outreach\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"CRM + automação de outreach\" data-en=\"CRM + outreach automation\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Ondas de mensagens omnichannel\" data-en=\"Omnichannel message waves\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Copy gerada por AI no tom do lead\" data-en=\"AI-written copy in the lead's tone\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Modelagem de proposta e ROI\" data-en=\"Offer & ROI modeling\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"SSO corporativo\" data-en=\"Corporate SSO\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#4ddfe6\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</span><span class=\"acc-val\" data-pt=\"Um contact center numa plataforma\" data-en=\"A contact center on one platform\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"universe\"><div class=\"uni-head\"><h3 data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</h3><p data-pt=\"Um contact center inteiro numa plataforma — cada peça, um módulo Data².\" data-en=\"An entire contact center on one platform — each piece, a Data² module.\" data-zh=\"一体化呼叫中心 —— 每个环节都是一个 Data² 模块。\">.</p></div><div class=\"uni-grid\"><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m0\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Webchat omnichannel\" data-en=\"Omnichannel webchat\">.</div><div class=\"deliv-d\" data-pt=\"Widget no site + WhatsApp, voz e e-mail no mesmo fluxo.\" data-en=\"On-site widget + WhatsApp, voice and email in one flow.\" data-zh=\"网站挂件 + WhatsApp、语音与邮件，统一流程。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m1\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Bot de triagem com AI\" data-en=\"AI triage bot\">.</div><div class=\"deliv-d\" data-pt=\"A AI entende a intenção, resolve o simples e classifica o resto.\" data-en=\"AI reads intent, resolves the simple, routes the rest.\" data-zh=\"AI 理解意图，解决简单问题，分流其余。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m2\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Transbordo bot → humano\" data-en=\"Bot → human handoff\">.</div><div class=\"deliv-d\" data-pt=\"Passagem fluida do bot pro atendente, com todo o contexto.\" data-en=\"Seamless bot-to-human handoff, with full context.\" data-zh=\"从机器人到人工的无缝转接，携带完整上下文。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m3\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Console de agente + supervisor\" data-en=\"Agent workspace + supervisor console\">.</div><div class=\"deliv-d\" data-pt=\"Fila, transferências, status e supervisão num painel só.\" data-en=\"Queue, transfers, status and supervision in one console.\" data-zh=\"队列、转接、状态与督导，集于一个控制台。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m4\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Automação de filas e CSAT\" data-en=\"Queue automation & CSAT\">.</div><div class=\"deliv-d\" data-pt=\"Filas que se auto-gerenciam, detecção de abandono e pesquisa de satisfação.\" data-en=\"Self-managing queues, abandonment detection and CSAT surveys.\" data-zh=\"自我管理的队列、弃单检测与满意度调查。\">.</div></div></div></div><div class=\"uni-prods\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">UI</span><span class=\"chip\">MEDIA</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#ff4d9e\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\">Varejo & E-commerce</span><span class=\"acc-val\" data-pt=\"Da vitrine ao ERP\" data-en=\"From storefront to ERP\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Experiências de catálogo e produto\" data-en=\"Catalog & product experiences\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Integração VTEX / GraphQL\" data-en=\"VTEX / GraphQL integration\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Estúdio de foto com AI\" data-en=\"AI photo studio\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"ERP e operações de loja\" data-en=\"ERP & store operations\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">MEDIA</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#9b5cff\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Força de Vendas\" data-en=\"Sales Enablement\">Força de Vendas</span><span class=\"acc-val\" data-pt=\"Copiloto de vendas para a força\" data-en=\"A sales copilot for the field\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Copiloto de vendas em linguagem natural\" data-en=\"Sales copilot in natural language\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Recomendação de próxima melhor ação\" data-en=\"Next-best-action recommendation\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Busca de clientes e segmentos com AI\" data-en=\"AI search over customers & segments\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Painéis de performance da carteira\" data-en=\"Portfolio performance dashboards\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">REGISTRY</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#84e05a\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"BI & Analytics\" data-en=\"BI & Analytics\">BI & Analytics</span><span class=\"acc-val\" data-pt=\"Do dado vivo ao plano de ação\" data-en=\"Live data to action plan\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Painéis executivos sobre dado vivo\" data-en=\"Executive dashboards on live data\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Ingestão diária automatizada\" data-en=\"Automated daily ingestion\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Metas e plano de ação acompanhados\" data-en=\"Targets & action plan tracked\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Alertas e monitoramento\" data-en=\"Alerts & monitoring\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#ff6a4d\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Seguros & CX\" data-en=\"Insurance & CX\">Seguros & CX</span><span class=\"acc-val\" data-pt=\"Conhecimento com busca semântica\" data-en=\"Semantic knowledge base\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Base de conhecimento com busca semântica\" data-en=\"Semantic-search knowledge base\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Triagem e atendimento com AI\" data-en=\"AI triage & support\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Respostas ancoradas na fonte\" data-en=\"Answers grounded in the source\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Analytics de atendimento\" data-en=\"Support analytics\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">A.I.</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">UI</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#e8e84d\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Compras & Procurement\" data-en=\"Procurement\">Compras & Procurement</span><span class=\"acc-val\" data-pt=\"Modelagem e planejamento de compras\" data-en=\"Sourcing modeling & planning\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Planejamento de fornecimento\" data-en=\"Supply planning\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Modelagem financeira de cenários\" data-en=\"Financial scenario modeling\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Simuladores e croquis de decisão\" data-en=\"Decision simulators & builders\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Compras orientadas a dado\" data-en=\"Data-driven sourcing\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div></div></div></div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#5b86ff\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">01 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\">RH & Pessoas</div>\n        <div class=\"ix-poss\" data-pt=\"Um RH que responde <b>milhares de colaboradores</b>, em vários idiomas — na hora.\" data-en=\"An HR that answers <b>thousands of employees</b>, in multiple languages — instantly.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Assistente de AI para o colaborador\" data-en=\"AI assistant for employees\">Assistente de AI para o colaborador</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Transbordo para atendimento humano\" data-en=\"Handoff to human agents\">Transbordo para atendimento humano</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Leitura de documentos (OCR)\" data-en=\"Document reading (OCR)\">Leitura de documentos (OCR)</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Respostas e regras configuráveis pela área\" data-en=\"Answers & rules configured by the team\">Respostas e regras configuráveis pela área</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Analytics e CSAT\" data-en=\"Analytics & CSAT\">Analytics e CSAT</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#4de0a1\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">02 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Supply & Operações\" data-en=\"Supply & Operations\">Supply & Operações</div>\n        <div class=\"ix-poss\" data-pt=\"Transformar <b>sobra de estoque em plano de produção</b> priorizado — em minutos, não semanas.\" data-en=\"Turn <b>leftover stock into a prioritized production plan</b> — in minutes, not weeks.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Simulação de cenários de produção\" data-en=\"Production scenario simulation\">Simulação de cenários de produção</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Explosão de estrutura (BOM)\" data-en=\"Bill-of-materials explosion\">Explosão de estrutura (BOM)</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Score de economia e viabilidade\" data-en=\"Savings & feasibility scoring\">Score de economia e viabilidade</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"SQL self-service sobre o data lake\" data-en=\"Self-service SQL over the data lake\">SQL self-service sobre o data lake</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Exportação para planilha\" data-en=\"Export to spreadsheet\">Exportação para planilha</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#e8b84d\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">03 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Serviços Financeiros\" data-en=\"Financial Services\">Serviços Financeiros</div>\n        <div class=\"ix-poss\" data-pt=\"Prospecção <b>1-a-1 personalizada por AI</b>, em escala de milhares — operada pelo próprio time comercial.\" data-en=\"<b>AI-personalized 1-to-1 outreach</b> at a scale of thousands — run by the commercial team itself.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"CRM + automação de outreach\" data-en=\"CRM + outreach automation\">CRM + automação de outreach</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Ondas de mensagens omnichannel\" data-en=\"Omnichannel message waves\">Ondas de mensagens omnichannel</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Copy gerada por AI no tom do lead\" data-en=\"AI-written copy in the lead's tone\">Copy gerada por AI no tom do lead</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Modelagem de proposta e ROI\" data-en=\"Offer & ROI modeling\">Modelagem de proposta e ROI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"SSO corporativo\" data-en=\"Corporate SSO\">SSO corporativo</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#4ddfe6\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">04 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</div>\n        <div class=\"ix-poss\" data-pt=\"Um <b>contact center inteiro</b> — do widget no site à automação de fila — numa plataforma só.\" data-en=\"An <b>entire contact center</b> — from the on-site widget to queue automation — on a single platform.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Webchat omnichannel\" data-en=\"Omnichannel webchat\">Webchat omnichannel</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Bot de triagem com AI\" data-en=\"AI triage bot\">Bot de triagem com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Transbordo bot → humano\" data-en=\"Bot → human handoff\">Transbordo bot → humano</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Workspace de agente + console de supervisor\" data-en=\"Agent workspace + supervisor console\">Workspace de agente + console de supervisor</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Automação de filas e CSAT\" data-en=\"Queue automation & CSAT\">Automação de filas e CSAT</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">UI</span><span class=\"chip\">MEDIA</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#ff4d9e\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">05 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\">Varejo & E-commerce</div>\n        <div class=\"ix-poss\" data-pt=\"Da <b>vitrine ao ERP</b>: experiências de compra sob medida, com os dados reais do seu e-commerce.\" data-en=\"From <b>storefront to ERP</b>: tailor-made buying experiences, with your e-commerce's real data.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Experiências de catálogo e produto\" data-en=\"Catalog & product experiences\">Experiências de catálogo e produto</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Integração VTEX / GraphQL\" data-en=\"VTEX / GraphQL integration\">Integração VTEX / GraphQL</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Estúdio de foto com AI\" data-en=\"AI photo studio\">Estúdio de foto com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"ERP e operações de loja\" data-en=\"ERP & store operations\">ERP e operações de loja</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">MEDIA</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#9b5cff\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">06 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Força de Vendas\" data-en=\"Sales Enablement\">Força de Vendas</div>\n        <div class=\"ix-poss\" data-pt=\"Um <b>copiloto de vendas</b> que diz a cada vendedor a próxima melhor ação — em linguagem natural.\" data-en=\"A <b>sales copilot</b> that tells each rep the next best action — in natural language.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Copiloto de vendas em linguagem natural\" data-en=\"Sales copilot in natural language\">Copiloto de vendas em linguagem natural</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Recomendação de próxima melhor ação\" data-en=\"Next-best-action recommendation\">Recomendação de próxima melhor ação</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Busca de clientes e segmentos com AI\" data-en=\"AI search over customers & segments\">Busca de clientes e segmentos com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Painéis de performance da carteira\" data-en=\"Portfolio performance dashboards\">Painéis de performance da carteira</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Geração de conteúdo e imagem com AI\" data-en=\"AI content & image generation\">Geração de conteúdo e imagem com AI</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">REGISTRY</span></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#84e05a\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">07 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"BI & Analytics\" data-en=\"BI & Analytics\">BI & Analytics</div>\n        <div class=\"ix-poss\" data-pt=\"Do <b>dado vivo ao plano de ação</b> — painéis que a área lê e age, sem exportar pra planilha.\" data-en=\"From <b>live data to an action plan</b> — dashboards the team reads and acts on, no spreadsheet export.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Painéis executivos sobre dado vivo\" data-en=\"Executive dashboards on live data\">Painéis executivos sobre dado vivo</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Ingestão diária automatizada\" data-en=\"Automated daily ingestion\">Ingestão diária automatizada</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Metas e plano de ação acompanhados\" data-en=\"Targets & action plan tracked\">Metas e plano de ação acompanhados</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Alertas e monitoramento\" data-en=\"Alerts & monitoring\">Alertas e monitoramento</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#ff6a4d\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">08 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Seguros & CX\" data-en=\"Insurance & CX\">Seguros & CX</div>\n        <div class=\"ix-poss\" data-pt=\"Atendimento que <b>responde na fonte certa</b> — base de conhecimento com busca semântica e triagem por AI.\" data-en=\"Support that <b>answers from the right source</b> — a semantic knowledge base with AI triage.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Base de conhecimento com busca semântica\" data-en=\"Semantic-search knowledge base\">Base de conhecimento com busca semântica</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Triagem e atendimento com AI\" data-en=\"AI triage & support\">Triagem e atendimento com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Respostas ancoradas na fonte\" data-en=\"Answers grounded in the source\">Respostas ancoradas na fonte</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Analytics de atendimento\" data-en=\"Support analytics\">Analytics de atendimento</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">A.I.</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">UI</span></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#e8e84d\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">09 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Compras & Procurement\" data-en=\"Procurement\">Compras & Procurement</div>\n        <div class=\"ix-poss\" data-pt=\"<b>Excelência em compras</b>: modelagem financeira e planejamento de fornecimento, simulados em minutos.\" data-en=\"<b>Procurement excellence</b>: financial modeling and supply planning, simulated in minutes.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Planejamento de fornecimento\" data-en=\"Supply planning\">Planejamento de fornecimento</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Modelagem financeira de cenários\" data-en=\"Financial scenario modeling\">Modelagem financeira de cenários</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Simuladores e croquis de decisão\" data-en=\"Decision simulators & builders\">Simuladores e croquis de decisão</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Compras orientadas a dado\" data-en=\"Data-driven sourcing\">Compras orientadas a dado</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div>\n      </div>\n    </div>\n  </div>\n</section>\n<section id=\"threads\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Em toda indústria\" data-en=\"Across every industry\">Em toda indústria</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"O mesmo motor, seja qual for o problema\" data-en=\"The same engine, whatever the problem\">O mesmo motor, seja qual for o problema</h2>\n    <div class=\"threads-grid reveal\">\n      <div class=\"thread\"><div class=\"n\">A.I.</div><div class=\"t\" data-pt=\"AI embutida\" data-en=\"AI built in\">AI embutida</div><div class=\"d\" data-pt=\"Detecção, classificação, geração e visão — em linguagem natural.\" data-en=\"Detection, classification, generation and vision — in natural language.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">OMNI</div><div class=\"t\" data-pt=\"Omnichannel\" data-en=\"Omnichannel\">Omnichannel</div><div class=\"d\" data-pt=\"WhatsApp, voz, webchat e e-mail no mesmo fluxo.\" data-en=\"WhatsApp, voice, webchat and email in one flow.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">DATA</div><div class=\"t\" data-pt=\"Dados reais + integrações\" data-en=\"Real data + integrations\">Dados reais + integrações</div><div class=\"d\" data-pt=\"Databricks, VTEX, CRMs, SSO — conectados de verdade.\" data-en=\"Databricks, VTEX, CRMs, SSO — genuinely connected.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">AUTO</div><div class=\"t\" data-pt=\"Automação\" data-en=\"Automation\">Automação</div><div class=\"d\" data-pt=\"Eventos, webhooks e agendadores reagindo em tempo real.\" data-en=\"Events, webhooks and schedulers reacting in real time.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">VIEW</div><div class=\"t\" data-pt=\"Dashboards\" data-en=\"Dashboards\">Dashboards</div><div class=\"d\" data-pt=\"Painéis e analytics sobre o dado vivo da operação.\" data-en=\"Panels and analytics over the operation's live data.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">NOCODE</div><div class=\"t\" data-pt=\"Sem código\" data-en=\"No code\">Sem código</div><div class=\"d\" data-pt=\"Tudo montado no builder visual — pela própria área.\" data-en=\"All assembled in the visual builder — by the business team itself.\">.</div></div>\n    </div>\n  </div>\n</section>\n<section id=\"levers\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Resultados\" data-en=\"Results\" data-zh=\"成果\">Resultados</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"No fim do dia, movemos KPIs.\" data-en=\"At the end of the day, we move KPIs.\" data-zh=\"归根结底，我们撬动 KPI。\">No fim do dia, movemos KPIs.</h2>\n    <p class=\"sec-sub reveal\" data-pt=\"As alavancas que a Data² move na operação dos nossos clientes — o que realmente importa no fim do dia.\" data-en=\"The levers Data² moves in our customers' operations — what actually matters at the end of the day.\" data-zh=\"Data² 在客户运营中撬动的杠杆 —— 归根结底真正重要的东西。\">.</p>\n    <div class=\"levers-grid\">\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Contact Center\" data-en=\"Contact Center\" data-zh=\"呼叫中心\">Contact Center</span><span class=\"lv-num\" data-pt=\"até <b>90%</b>\" data-en=\"up to <b>90%</b>\" data-zh=\"高达 <b>90%</b>\">.</span><span class=\"lv-txt\" data-pt=\"dos contatos resolvidos — com mais satisfação\" data-en=\"of contacts resolved — with higher satisfaction\" data-zh=\"的联系得到解决 —— 满意度更高\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\">NPS</span><span class=\"lv-num\" data-pt=\"<b>+26</b> pts\" data-en=\"<b>+26</b> pts\" data-zh=\"<b>+26</b> 分\">.</span><span class=\"lv-txt\" data-pt=\"de NPS no atendimento ao cliente\" data-en=\"in customer-support NPS\" data-zh=\"客户服务 NPS 提升\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Conversão\" data-en=\"Conversion\" data-zh=\"转化\">Conversão</span><span class=\"lv-num\" data-pt=\"<b>+20%</b>\" data-en=\"<b>+20%</b>\" data-zh=\"<b>+20%</b>\">.</span><span class=\"lv-txt\" data-pt=\"de conversão na jornada de compra\" data-en=\"conversion in the buying journey\" data-zh=\"购买旅程转化率\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Operações\" data-en=\"Operations\" data-zh=\"运营\">Operações</span><span class=\"lv-num\" data-pt=\"<b>−85%</b>\" data-en=\"<b>−85%</b>\" data-zh=\"<b>−85%</b>\">.</span><span class=\"lv-txt\" data-pt=\"de chamados na operação\" data-en=\"tickets in the operation\" data-zh=\"运营工单\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Compras\" data-en=\"Procurement\" data-zh=\"采购\">Compras</span><span class=\"lv-num\" data-pt=\"<b>milhões</b>\" data-en=\"<b>millions</b>\" data-zh=\"<b>数百万</b>\">.</span><span class=\"lv-txt\" data-pt=\"economizados por mês em procurement\" data-en=\"saved per month in procurement\" data-zh=\"每月采购节省\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Time-to-market\" data-en=\"Time-to-market\" data-zh=\"上线周期\">Time-to-market</span><span class=\"lv-num\" data-pt=\"<b>30</b> dias\" data-en=\"<b>30</b> days\" data-zh=\"<b>30</b> 天\">.</span><span class=\"lv-txt\" data-pt=\"da ideia à produção\" data-en=\"from idea to production\" data-zh=\"从创意到上线\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Escala\" data-en=\"Scale\" data-zh=\"规模\">Escala</span><span class=\"lv-num\" data-pt=\"<b>100k+</b>/dia\" data-en=\"<b>100k+</b>/day\" data-zh=\"每日 <b>10万+</b>\">.</span><span class=\"lv-txt\" data-pt=\"atendimentos automatizados\" data-en=\"interactions automated\" data-zh=\"自动化服务\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Retenção\" data-en=\"Retention\" data-zh=\"客户留存\">Retenção</span><span class=\"lv-num\" data-pt=\"<b>85%</b>\" data-en=\"<b>85%</b>\" data-zh=\"<b>85%</b>\">.</span><span class=\"lv-txt\" data-pt=\"de retenção de clientes\" data-en=\"customer retention\" data-zh=\"客户留存率\">.</span></div>\n    </div>\n  </div>\n</section>\n\n<section id=\"products\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"A Suíte\" data-en=\"The Suite\">A Suíte</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"Oito produtos. Um só sistema.\" data-en=\"Eight products. One system.\">Oito produtos. Um só sistema.</h2>\n    <div class=\"prod-showcase\">\n      <div class=\"ring reveal\" id=\"ring\"><div class=\"center\"><div class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:26px\"><use href=\"#d2wm\"></use></svg></div><small data-pt=\"8 produtos · 1 sistema\" data-en=\"8 products · 1 system\">8 produtos · 1 sistema</small></div></div>\n      <div class=\"pgrid reveal\">\n        <div class=\"pcard\" style=\"--pc:#5b86ff\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">UI</span></div><div class=\"pcname\" data-pt=\"Interface\" data-en=\"Interface\">Interface</div><div class=\"pctag\" data-pt=\"Desenhe o app, não uma foto dele.\" data-en=\"Design the app, not a picture of it.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#ff5a4d\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">REGISTRY</span></div><div class=\"pcname\" data-pt=\"Dados\" data-en=\"Data\">Dados</div><div class=\"pctag\" data-pt=\"Modele, armazene e analise em escala. Adeus, Lorem Ipsum.\" data-en=\"Model, store and analyze at scale. Goodbye Lorem Ipsum.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#e8e84d\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">MEDIA</span></div><div class=\"pcname\" data-pt=\"Mídia\" data-en=\"Media\">Mídia</div><div class=\"pctag\" data-pt=\"Otimize e distribua arquivos, na nuvem.\" data-en=\"Optimize and distribute files, in the cloud.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#4de0a1\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">ID</span></div><div class=\"pcname\" data-pt=\"Identidade\" data-en=\"Identity\">Identidade</div><div class=\"pctag\" data-pt=\"Ciclos completos, do onboarding ao reset de senha.\" data-en=\"Full lifecycles, from onboarding to password reset.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#4ddfe6\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">CONNECT</span></div><div class=\"pcname\" data-pt=\"Integrações\" data-en=\"Integrations\">Integrações</div><div class=\"pctag\" data-pt=\"Conecte-se a qualquer serviço externo.\" data-en=\"Connect to any external service.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#ff4d9e\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">DOMAIN</span></div><div class=\"pcname\" data-pt=\"Domínio · AI\" data-en=\"Domain · AI\">Domínio · AI</div><div class=\"pctag\" data-pt=\"Seu modelo, nunca escondido em código. AI multimodal.\" data-en=\"Your model, never hidden in code. Multimodal AI.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#9b5cff\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">RUSH</span></div><div class=\"pcname\" data-pt=\"Automação\" data-en=\"Automation\">Automação</div><div class=\"pctag\" data-pt=\"Reaja a eventos em tempo real. Webhooks e agendadores.\" data-en=\"React to events in real time. Webhooks and schedulers.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#84e05a\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">CASHIER</span><span class=\"soon\">SOON</span></div><div class=\"pcname\" data-pt=\"Pagamentos\" data-en=\"Payments\">Pagamentos</div><div class=\"pctag\" data-pt=\"Cobre e receba — qualquer transação de valor.\" data-en=\"Charge and get paid — any value transaction.\">.</div></div>\n      </div>\n    </div>\n  </div>\n</section>\n<section id=\"platform\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"A plataforma\" data-en=\"The platform\" data-zh=\"平台\">A plataforma</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"Escrita desde 2020. Não embrulhada.\" data-en=\"Written since 2020. Not wrapped.\" data-zh=\"自 2020 年自研，而非套壳。\">Escrita desde 2020. Não embrulhada.</h2>\n    <p class=\"plat-sub reveal\" data-pt=\"Agent-native de verdade: o builder É um servidor MCP. Agentes compõem os mesmos primitivos governados que um engenheiro — validados antes de entrar no ar.\" data-en=\"Truly agent-native: the builder IS an MCP server. Agents compose the same governed primitives an engineer would — validated before they ship.\" data-zh=\"真正的 agent-native：构建器本身就是一个 MCP 服务器。智能体与工程师使用同一套受治理的原语进行组装 —— 上线前即经校验。\">.</p>\n    <div class=\"flow-strip reveal\">\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:var(--faint)\">EVENTO</div><div class=\"fn-lbl\" data-pt=\"entra\" data-en=\"comes in\" data-zh=\"进入\">entra</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#9b5cff\">RUSH</div><div class=\"fn-lbl\" data-pt=\"decide\" data-en=\"decides\" data-zh=\"决策\">decide</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#4ddfe6\">CONNECT · DOMAIN</div><div class=\"fn-lbl\" data-pt=\"AI + integrações\" data-en=\"AI + integrations\" data-zh=\"AI + 集成\">AI + integrações</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#ff5a4d\">REGISTRY</div><div class=\"fn-lbl\" data-pt=\"dados\" data-en=\"data\" data-zh=\"数据\">dados</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#5b86ff\">DATASET</div><div class=\"fn-lbl\" data-pt=\"reativo\" data-en=\"reactive\" data-zh=\"响应式\">reativo</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#e8e84d\">UI</div><div class=\"fn-lbl\" data-pt=\"em tela\" data-en=\"on screen\" data-zh=\"呈现\">em tela</div></div>\n    </div>\n    <div class=\"eng-row reveal\">\n      <span class=\"eng-lead\" data-pt=\"Nível de engenharia\" data-en=\"Engineering-grade\" data-zh=\"工程级\">Nível de engenharia</span>\n      <span class=\"eng-chip\">Auth &amp; SSO</span><span class=\"eng-chip\">Key Vaults</span><span class=\"eng-chip\">SSR</span><span class=\"eng-chip\">Cron</span><span class=\"eng-chip\">WebSockets</span><span class=\"eng-chip\">Logs</span><span class=\"eng-chip\" data-pt=\"Semantic Search\" data-en=\"Semantic Search\" data-zh=\"语义搜索\">Semantic Search</span><span class=\"eng-chip\">Staging → Publish</span>\n    </div>\n  </div>\n</section>\n\n<section id=\"deliver\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Como entregamos\" data-en=\"How we deliver\">Como entregamos</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"Nossa stack. Nossos serviços.\" data-en=\"Our stack. Our services.\">Nossa stack. Nossos serviços.</h2>\n    <div class=\"deliver-grid\">\n      <div class=\"card reveal\">\n        <div class=\"accent\"></div>\n        <h3 data-pt=\"Sprints\" data-en=\"Sprints\">Sprints</h3>\n        <p data-pt=\"Nossos Forward Deployed Engineers entram junto da sua área: entendem a dor, prototipam e constroem com você — do primeiro passo à produção.\" data-en=\"Our Forward Deployed Engineers embed with your area: they learn the pain, prototype and build with you — from first step to production.\" data-zh=\"我们的前署工程师与您的业务团队并肩作战：洞察痛点、快速原型、与您共同构建 — 从第一步到上线。\">.</p>\n        <div class=\"flavors\"><span class=\"flavor\">Forward Deployed Engineers</span><span class=\"flavor\" data-pt=\"Ideação\" data-en=\"Ideation\">Ideação</span><span class=\"flavor\">Design</span><span class=\"flavor\" data-pt=\"Protótipo\" data-en=\"Prototype\">Protótipo</span></div>\n      </div>\n      <div class=\"card reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"own\" data-pt=\"<em>Seus dados</em> são seus.\" data-en=\"<em>Own</em> your data.\">.</div>\n        <p data-pt=\"O Data Framework mantém seu modelo e sua infraestrutura sob seu domínio — nunca escondidos em código, nunca reféns de um fornecedor.\" data-en=\"The Data Framework keeps your model and infrastructure under your control — never hidden in code, never hostage to a vendor.\">.</p>\n        <div class=\"flavors\"><span class=\"flavor\" data-pt=\"Domain-Driven\" data-en=\"Domain-Driven\">Domain-Driven</span><span class=\"flavor\" data-pt=\"Linguagem única de dados\" data-en=\"Single Data Language\">Linguagem única de dados</span></div>\n      </div>\n    </div>\n    <div class=\"fde-band reveal\">\n      <div class=\"fde-flow\"><span data-pt=\"Seu time aprende\" data-en=\"Your team learns\" data-zh=\"你的团队学习\">Seu time aprende</span><i>→</i><span data-pt=\"é dono\" data-en=\"owns it\" data-zh=\"拥有它\">é dono</span><i>→</i><span data-pt=\"evolui\" data-en=\"evolves\" data-zh=\"持续进化\">evolui</span></div>\n      <div class=\"fde-pay\" data-pt=\"Pague por entrega, não por hora.\" data-en=\"Pay by delivery, not by hours.\" data-zh=\"按交付付费，而非按工时。\">Pague por entrega, não por hora.</div>\n    </div>\n  </div>\n</section>\n<section id=\"cta\">\n  <div class=\"wrap\">\n    <p class=\"cta-kicker reveal\" data-pt=\"Pronto pra começar?\" data-en=\"Ready to build?\" data-zh=\"准备好开始了吗？\">Pronto pra começar?</p>\n    <h2 class=\"big reveal\" data-pt=\"Do problema<br>à produção.\" data-en=\"From problem<br>to production.\">Do problema<br>à produção.</h2>\n    <p class=\"sub reveal\" data-pt=\"Traga o desafio da sua área. A gente transforma em software — em produção.\" data-en=\"Bring your area's challenge. We turn it into software — in production.\">.</p>\n    <div class=\"cta-row reveal\"><a href=\"#\" class=\"btn\"><span data-pt=\"Agendar uma demo\" data-en=\"Book a demo\">Agendar uma demo</span></a><a href=\"#\" class=\"btn ghost\"><span data-pt=\"Falar com a gente\" data-en=\"Talk to us\" data-zh=\"联系我们\">Falar com a gente</span></a></div>\n  </div>\n</section>\n<footer>\n  <div class=\"foot\">\n    <div>\n      <div class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:26px\"><use href=\"#d2wm\"></use></svg></div>\n      <p style=\"color:var(--faint);font-size:13px;margin-top:12px;max-width:26ch\" data-pt=\"A Digital Expression Suite. Do problema à produção.\" data-en=\"The Digital Expression Suite. From problem to production.\">.</p>\n    </div>\n    <div class=\"cols\">\n      <div class=\"fc\"><h5 data-pt=\"Produto\" data-en=\"Product\">Produto</h5><a href=\"#products\" data-pt=\"A Suíte\" data-en=\"The Suite\">A Suíte</a><a href=\"#industries\" data-pt=\"Indústrias\" data-en=\"Industries\">Indústrias</a><a href=\"#deliver\">Sprints</a><a href=\"#\" data-pt=\"Integrações\" data-en=\"Integrations\">Integrações</a></div>\n      <div class=\"fc\"><h5 data-pt=\"Empresa\" data-en=\"Company\">Empresa</h5><a href=\"#\" data-pt=\"Sobre\" data-en=\"About\">Sobre</a><a href=\"#proof\" data-pt=\"Clientes\" data-en=\"Customers\">Clientes</a><a href=\"#\" data-pt=\"Pessoas\" data-en=\"People\">Pessoas</a><a href=\"#\" data-pt=\"Contato\" data-en=\"Contact\">Contato</a></div>\n      <div class=\"fc\"><h5 data-pt=\"Indústrias\" data-en=\"Industries\" data-zh=\"行业\">Indústrias</h5><a href=\"#glance\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\">RH & Pessoas</a><a href=\"#glance\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</a><a href=\"#glance\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\">Varejo & E-commerce</a><a href=\"#glance\" data-pt=\"Ver todas\" data-en=\"See all\" data-zh=\"查看全部\">Ver todas</a></div>\n      <div class=\"fc\"><h5 data-pt=\"Recursos\" data-en=\"Resources\" data-zh=\"资源\">Recursos</h5><a href=\"#platform\" data-pt=\"A plataforma\" data-en=\"The platform\">A plataforma</a><a href=\"#deliver\">Sprints</a><a href=\"#levers\" data-pt=\"Resultados\" data-en=\"Results\">Resultados</a><a href=\"#\" data-pt=\"Contato\" data-en=\"Contact\">Demo</a></div>\n    </div>\n    <div class=\"fine\"><span>© 2026 Data² · www.data2.app</span><span data-pt=\"Feito na Data². Sem uma linha de código.\" data-en=\"Made on Data². Without a single line of code.\">Feito na Data². Sem uma linha de código.</span></div>\n  </div>\n</footer>\n<div class=\"uni-overlay\" id=\"uni\" style=\"--hue:#4ddfe6\">\n  <div class=\"uni-scroll\">\n    <svg width=\"0\" height=\"0\" style=\"position:absolute;width:0;height:0\" aria-hidden=\"true\"><defs>\n      <symbol id=\"isocube\" viewBox=\"0 0 100 100\"><polygon points=\"50,4 96,29 50,54 4,29\" fill=\"var(--fct)\" stroke=\"var(--hue)\" stroke-width=\"1.5\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"></polygon><polygon points=\"4,29 50,54 50,98 4,73\" fill=\"var(--fcl)\" stroke=\"var(--hue)\" stroke-width=\"1.5\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"></polygon><polygon points=\"96,29 50,54 50,98 96,73\" fill=\"var(--fcr)\" stroke=\"var(--hue)\" stroke-width=\"1.5\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"></polygon></symbol>\n      <symbol id=\"m0\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"4\" y=\"6\" width=\"56\" height=\"56\"></use><use href=\"#isocube\" x=\"46\" y=\"40\" width=\"46\" height=\"46\"></use></symbol>\n      <symbol id=\"m1\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"1\" y=\"24\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"31\" y=\"42\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"61\" y=\"24\" width=\"38\" height=\"38\"></use></symbol>\n      <symbol id=\"m2\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"2\" y=\"10\" width=\"44\" height=\"44\"></use><use href=\"#isocube\" x=\"54\" y=\"46\" width=\"44\" height=\"44\"></use></symbol>\n      <symbol id=\"m3\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"2\" y=\"34\" width=\"96\" height=\"60\"></use><use href=\"#isocube\" x=\"24\" y=\"8\" width=\"28\" height=\"28\"></use><use href=\"#isocube\" x=\"50\" y=\"16\" width=\"26\" height=\"26\"></use></symbol>\n      <symbol id=\"m4\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"26\" y=\"46\" width=\"48\" height=\"48\"></use><use href=\"#isocube\" x=\"26\" y=\"28\" width=\"48\" height=\"48\"></use><use href=\"#isocube\" x=\"26\" y=\"10\" width=\"48\" height=\"48\"></use></symbol>\n      <symbol id=\"m5\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"30\" y=\"44\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"30\" y=\"18\" width=\"40\" height=\"40\"></use></symbol>\n      <symbol id=\"m6\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"30\" y=\"6\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"8\" y=\"26\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"52\" y=\"26\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"30\" y=\"46\" width=\"40\" height=\"40\"></use></symbol>\n      <symbol id=\"m7\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"2\" y=\"40\" width=\"96\" height=\"54\"></use><use href=\"#isocube\" x=\"35\" y=\"22\" width=\"30\" height=\"30\"></use></symbol>\n      <symbol id=\"m8\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"8\" y=\"52\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"34\" y=\"35\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"60\" y=\"18\" width=\"38\" height=\"38\"></use></symbol>\n    </defs></svg>\n    <div class=\"uni-top\"><span class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:22px\"><use href=\"#d2wm\"></use></svg></span><button class=\"uni-close\" id=\"uniClose\" aria-label=\"close\">✕</button></div>\n    <div class=\"uni-body\" id=\"uniBody\">\n    <section class=\"uni-hero\"><div class=\"glow\"></div>\n      <div class=\"uni-eyebrow\" data-pt=\"Universo\" data-en=\"Universe\" data-zh=\"宇宙\">Universo</div>\n      <h1 data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</h1>\n      <p class=\"lead\" data-pt=\"Um contact center inteiro, funcionando como um sistema vivo — cada componente é um módulo Data². Passe o mouse. Role para os detalhes.\" data-en=\"An entire contact center, running as a living system — each component is a Data² module. Hover. Scroll for the details.\" data-zh=\"一个完整的呼叫中心，如同一个活的系统在运行 —— 每个组件都是一个 Data² 模块。悬停查看，下滚了解详情。\">.</p>\n      <div class=\"sysmap\"><svg viewBox=\"0 0 820 400\">\n        <path class=\"wire\" d=\"M150,150 L360,110\"></path><path class=\"wire\" d=\"M390,140 L400,275\"></path><path class=\"wire\" d=\"M430,110 L620,150\"></path><path class=\"wire\" d=\"M440,285 L630,175\"></path><path class=\"wire\" d=\"M660,185 L600,300\"></path>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"2.6s\" repeatCount=\"indefinite\" path=\"M150,150 L360,110\"></animateMotion></circle>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"3s\" repeatCount=\"indefinite\" path=\"M430,110 L620,150\"></animateMotion></circle>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"2.4s\" repeatCount=\"indefinite\" path=\"M660,185 L600,300\"></animateMotion></circle>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"3.2s\" repeatCount=\"indefinite\" path=\"M390,140 L400,275\"></animateMotion></circle>\n        <g class=\"comp\" data-i=\"0\" transform=\"translate(108,86)\"><use href=\"#m0\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"116\" data-pt=\"Webchat\" data-en=\"Webchat\" data-zh=\"网页聊天\">Webchat</text></g>\n        <g class=\"comp\" data-i=\"1\" transform=\"translate(345,38)\"><use href=\"#m1\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"112\" data-pt=\"Bot de triagem\" data-en=\"Triage bot\" data-zh=\"分流机器人\">Bot de triagem</text></g>\n        <g class=\"comp\" data-i=\"2\" transform=\"translate(355,236)\"><use href=\"#m2\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"112\" data-pt=\"Transbordo\" data-en=\"Handoff\" data-zh=\"转接\">Transbordo</text></g>\n        <g class=\"comp\" data-i=\"3\" transform=\"translate(612,84)\"><use href=\"#m3\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"114\" data-pt=\"Console\" data-en=\"Console\" data-zh=\"控制台\">Console</text></g>\n        <g class=\"comp\" data-i=\"4\" transform=\"translate(556,246)\"><use href=\"#m4\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"118\" data-pt=\"Filas & CSAT\" data-en=\"Queues & CSAT\" data-zh=\"队列与 CSAT\">Filas & CSAT</text></g>\n      </svg></div>\n      <div class=\"sys-hint\" data-pt=\"Passe o mouse · clique um componente · role\" data-en=\"Hover · click a component · scroll\" data-zh=\"悬停 · 点击组件 · 下滚\">Passe o mouse · clique um componente · role</div>\n    </section>\n    <section class=\"uni-detail\" data-i=\"0\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m0\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">01 / 05</div><div class=\"ud-t\" data-pt=\"Webchat omnichannel\" data-en=\"Omnichannel webchat\">.</div><div class=\"ud-d\" data-pt=\"Um widget no seu site conversa no mesmo fluxo que WhatsApp, voz e e-mail. O cliente começa onde quiser e a conversa nunca se perde.\" data-en=\"A widget on your site talks in the same flow as WhatsApp, voice and email. Customers start anywhere and the conversation is never lost.\" data-zh=\"网站挂件与 WhatsApp、语音和邮件处于同一流程。客户可从任何渠道开始，对话永不丢失。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Widget embutido via iframe + websockets\" data-en=\"Embedded widget via iframe + websockets\" data-zh=\"通过 iframe + websockets 嵌入挂件\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Ponte com provedor de mensageria e voz (CPaaS)\" data-en=\"Bridge to a messaging/voice provider (CPaaS)\" data-zh=\"对接消息/语音服务商（CPaaS）\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Sessões, mensagens e transferências unificadas por cliente\" data-en=\"Sessions, messages and transfers unified per customer\" data-zh=\"按客户统一会话、消息与转接\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Continuidade de contexto ao trocar de canal\" data-en=\"Context continuity across channels\" data-zh=\"跨渠道保持上下文连续\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Canais soltos, sem histórico compartilhado. O cliente repete tudo a cada troca; o atendente trabalha às cegas.\" data-en=\"Disconnected channels, no shared history. Customers repeat everything on each switch; agents work blind.\" data-zh=\"渠道割裂、无共享历史。客户每次切换都要重复，坐席只能盲目应对。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"Um só fluxo, um só histórico. Menos repetição, respostas mais rápidas, e o cliente começa onde for mais fácil.\" data-en=\"One flow, one history. Less repetition, faster answers, and customers start wherever is easiest.\" data-zh=\"统一流程、统一历史。更少重复、更快响应，客户从最方便的渠道开始。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>100k+</b> <span data-pt=\"atendimentos/dia\" data-en=\"interactions/day\" data-zh=\"次服务/天\">atendimentos/dia</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"1\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m1\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">02 / 05</div><div class=\"ud-t\" data-pt=\"Bot de triagem com AI\" data-en=\"AI triage bot\">.</div><div class=\"ud-d\" data-pt=\"A AI entende a intenção, resolve na hora o que é simples e classifica o resto para a fila certa — antes de qualquer humano tocar.\" data-en=\"AI reads intent, instantly resolves the simple, and routes the rest to the right queue — before any human touches it.\" data-zh=\"AI 理解意图，即时解决简单问题，并将其余分流到正确队列 —— 无需任何人工介入。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Detecção de caso de uso por AI\" data-en=\"AI use-case detection\" data-zh=\"AI 用例识别\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Fluxos guiados: cancelamento, troca, reembolso, atraso\" data-en=\"Guided flows: cancel, exchange, refund, delay\" data-zh=\"引导式流程：取消、换货、退款、延迟\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Leitura de imagem e classificação de texto livre\" data-en=\"Image reading and free-text classification\" data-zh=\"图像识别与自由文本分类\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Abertura de ticket no CRM externo\" data-en=\"Ticket creation in the external CRM\" data-zh=\"在外部 CRM 中创建工单\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Todo contato cai na fila humana, até os triviais. A fila cresce e o custo por contato dispara.\" data-en=\"Every contact hits the human queue, even trivial ones. The queue grows and cost-per-contact soars.\" data-zh=\"所有联系都进入人工队列，连琐事也是。队列膨胀，单次联系成本飪升。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"A AI resolve o repetitivo na hora e só encaminha o que precisa de gente — menos fila, menos custo, 24/7.\" data-en=\"AI resolves the repetitive instantly and only routes what needs a human — less queue, less cost, 24/7.\" data-zh=\"AI 即时解决重复问题，只转交需人工的部分 —— 更短队列、更低成本、7×24。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>−50%</b> <span data-pt=\"tempo de resolução\" data-en=\"resolution time\" data-zh=\"解决时间\">tempo de resolução</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"2\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m2\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">03 / 05</div><div class=\"ud-t\" data-pt=\"Transbordo bot → humano\" data-en=\"Bot → human handoff\">.</div><div class=\"ud-d\" data-pt=\"Quando o humano precisa entrar, entra com todo o histórico e o contexto na mão. Zero ‘reconte tudo de novo’.\" data-en=\"When a human is needed, they step in with the full history and context in hand. Zero ‘tell me everything again’.\" data-zh=\"当需要人工时，坐席携带完整历史与上下文接手。无需‘重新说一遍’。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Handoff com histórico e contexto completos\" data-en=\"Handoff with full history and context\" data-zh=\"携带完整历史与上下文的转接\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Transferência entre filas e times\" data-en=\"Transfer across queues and teams\" data-zh=\"跨队列与团队转接\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Detecção de inatividade e abandono\" data-en=\"Inactivity and abandonment detection\" data-zh=\"闲置与弃单检测\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Respostas prontas + atalhos do atendente\" data-en=\"Canned replies + agent shortcuts\" data-zh=\"预设回复 + 坐席快捷方式\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"A passagem pro humano perde o contexto. ‘Me conta tudo de novo’ vira regra e a satisfação despenca.\" data-en=\"The handoff loses context. ‘Tell me everything again’ becomes the rule and satisfaction drops.\" data-zh=\"转人工时丢失上下文。‘请再说一遍’成常态，满意度骤降。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"O atendente entra com histórico e contexto completos. Transição invisível pro cliente.\" data-en=\"The agent steps in with full history and context. An invisible transition for the customer.\" data-zh=\"坐席携带完整历史与上下文接手。对客户而言，转接无感。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>100%</b> <span data-pt=\"do contexto preservado\" data-en=\"context preserved\" data-zh=\"上下文保留\">do contexto preservado</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"3\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m3\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">04 / 05</div><div class=\"ud-t\" data-pt=\"Console de agente + supervisor\" data-en=\"Agent workspace + supervisor console\">.</div><div class=\"ud-d\" data-pt=\"Fila, transferências, status dos agentes e supervisão ao vivo — tudo num painel só, sobre o dado real da operação.\" data-en=\"Queue, transfers, agent status and live supervision — all in one console, over the operation’s real data.\" data-zh=\"队列、转接、坐席状态与实时督导 —— 全部集于一个控制台，基于运营真实数据。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Workspace do agente: status, presets, chatrooms\" data-en=\"Agent workspace: status, presets, chatrooms\" data-zh=\"坐席工作台：状态、预设、聊天室\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Console do supervisor: fila e métricas ao vivo\" data-en=\"Supervisor console: live queue and metrics\" data-zh=\"主管控制台：实时队列与指标\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Classificação de transferências\" data-en=\"Transfer classification\" data-zh=\"转接分类\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Fechamentos mensais e sync de metadados\" data-en=\"Monthly closings and metadata sync\" data-zh=\"月度结算与元数据同步\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Supervisão por planilha e telas espalhadas. Ninguém enxerga a operação ao vivo; decisão no achismo.\" data-en=\"Supervision by spreadsheet and scattered screens. No one sees the live operation; decisions by guesswork.\" data-zh=\"靠表格与零散界面督导。无人实时掌控，决策靠猜。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"Uma tela com fila, status, transferências e métricas ao vivo — decisão sobre o dado real.\" data-en=\"One screen with live queue, status, transfers and metrics — decisions on real data.\" data-zh=\"一屏掌握实时队列、状态、转接与指标 —— 基于真实数据决策。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>1</b> <span data-pt=\"tela para toda a operação\" data-en=\"screen for the whole operation\" data-zh=\"一屏掌控全局\">tela para toda a operação</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"4\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m4\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">05 / 05</div><div class=\"ud-t\" data-pt=\"Automação de filas & CSAT\" data-en=\"Queue automation & CSAT\">.</div><div class=\"ud-d\" data-pt=\"Filas que se auto-gerenciam: detecção de abandono, repriorização e pesquisa de satisfação disparada na hora certa.\" data-en=\"Self-managing queues: abandonment detection, re-prioritization and CSAT surveys fired at the right moment.\" data-zh=\"自我管理的队列：弃单检测、重新优先级排序，并在恰当时机发起满意度调查。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Agendadores (Rush) mantêm a fila saudável\" data-en=\"Schedulers (Rush) keep the queue healthy\" data-zh=\"调度器（Rush）维持队列健康\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Detecção de abandono + auto-cura da fila\" data-en=\"Abandonment detection + queue self-healing\" data-zh=\"弃单检测 + 队列自愈\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"CSAT disparado no momento certo\" data-en=\"CSAT fired at the right moment\" data-zh=\"在恰当时机发起 CSAT\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Analytics de custo por caso de uso + export\" data-en=\"Cost analytics by use-case + export\" data-zh=\"按用例的成本分析 + 导出\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Filas travadas por transferências esquecidas e abandono não detectado. Satisfação medida tarde ou nunca.\" data-en=\"Queues stuck by forgotten transfers and undetected abandonment. Satisfaction measured late, or never.\" data-zh=\"队列被遗忘的转接与未检测的弃单拖垮。满意度测得太晚，甚至从不测。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"Rush mantém a fila saudável sozinho e dispara o CSAT na hora certa — melhoria contínua com dado.\" data-en=\"Rush keeps the queue healthy on its own and fires CSAT at the right time — continuous improvement, data-driven.\" data-zh=\"Rush 自动维持队列健康，并在恰当时机发起 CSAT —— 数据驱动的持续改进。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>85%</b> <span data-pt=\"retenção\" data-en=\"retention\" data-zh=\"留存率\">retenção</span></span><span class=\"r\"><b>+26</b> <span data-pt=\"NPS\" data-en=\"NPS\" data-zh=\"NPS\">NPS</span></span></div></div></section>\n    <section class=\"uni-more\"><div class=\"glow\"></div><h2 data-pt=\"E isso é só o começo. <em>Qualquer coisa</em> pode ser construída.\" data-en=\"And this is just the start. <em>Anything</em> can be built.\" data-zh=\"而这只是开始。<em>任何东西</em>都能被构建。\">.</h2><p data-pt=\"Cada componente aqui é um módulo Data². Precisa de algo que ainda não existe? A gente constrói — no mesmo sistema, com o mesmo dado.\" data-en=\"Every component here is a Data² module. Need something that doesn’t exist yet? We build it — same system, same data.\" data-zh=\"这里的每个组件都是一个 Data² 模块。需要尚不存在的东西？我们构建它 —— 同一系统，同一数据。\">.</p><a href=\"#\" class=\"btn\"><span data-pt=\"Agendar uma demo\" data-en=\"Book a demo\">Agendar uma demo</span></a></section>\n    </div>\n  </div>\n</div>\n</div>`;\n  },\n  mounted(d2, root){\n    var mq = window.matchMedia && window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n    var reduce = mq ? mq.matches : false;\n    var sc = root.querySelector(\".d2site\");\n    if(!sc) return;\n    var lang = \"pt\";\n    var ZH = {\n  \"Industries\": \"行业方案\",\n  \"Products\": \"产品\",\n  \"How we deliver\": \"交付方式\",\n  \"Customers\": \"客户\",\n  \"Demo\": \"演示\",\n  \"Sign in\": \"登录\",\n  \"EXPRESS YOURSELF<br>AT SCALE.\": \"尽情表达，<br>规模无限。\",\n  \"From a business problem to software in production. Data² is the suite that turns any team into the team that ships.\": \"从业务难题到上线软件。Data² 让每一个团队都成为能交付的团队。\",\n  \"See what's possible\": \"看看能实现什么\",\n  \"Book a demo\": \"预约演示\",\n  \"Imagery from the Data² Synthesys Project.\": \"图像来自 Data² Synthesys 项目。\",\n  \"Synthesys is a concept created and captured by Lívia Elektra, representing the power of expression and freedom that Data² provides.\": \"Synthesys 是 Lívia Elektra 创作并捕捉的概念，象征 Data² 所带来的表达力与自由。\",\n  \"SCROLL\": \"向下滚动\",\n  \"Data² in one screen\": \"一屏读懂 Data²\",\n  \"What we see, what we do, and who for.\": \"我们看见什么、我们做什么、为谁而做。\",\n  \"What we see\": \"我们看见什么\",\n  \"Every area has <em>software waiting to exist</em>.\": \"每个业务部门，都有<em>一款等待诞生的软件</em>。\",\n  \"Technology already lets us build almost anything. What was missing is the direct bridge between the people who know the problem and the solution running in production.\": \"技术早已能构建几乎一切。所缺的，是让懂问题的人与上线运行的方案之间，直接搭起的那座桥。\",\n  \"What we do\": \"我们做什么\",\n  \"A suite that becomes <em>real software</em>.\": \"一套真正<em>变成软件</em>的套件。\",\n  \"8 products with AI, omnichannel, real data, automation and dashboards — assembled in the visual builder and shipped to production. No code.\": \"8 款产品，涵盖 AI、全渠道、真实数据、自动化与仪表盘 —— 在可视化构建器中组装，直接上线生产。无需代码。\",\n  \"Who for\": \"为谁而做\",\n  \"For the area that <em>owns the problem</em>.\": \"为<em>真正面对问题</em>的那个部门。\",\n  \"Business teams at large companies that won't wait anymore. We are the enablers between the idea and production.\": \"为不愿再等待的大型企业业务团队。我们，是连接创意与生产的赋能者。\",\n  \"HR · Supply · Financial · CX · Retail · Sales · BI · Insurance · Procurement\": \"人力 · 供应 · 财务 · 客户体验 · 零售 · 销售 · 商业智能 · 保险 · 采购\",\n  \"Before\": \"过去\",\n  \"From idea to delivery: many hands, many translations, a lot of time.\": \"从创意到交付：经手无数、层层转译、耗时漫长。\",\n  \"With Data²\": \"有了 Data²\",\n  \"The business area itself designs, connects the real data, ships and operates. In production.\": \"业务部门亲手设计、接入真实数据、发布并运营。直接在生产环境。\",\n  \"At a glance\": \"概览\",\n  \"Where we already deliver\": \"我们已交付的领域\",\n  \"HR & People\": \"人力资源与员工\",\n  \"AI employee support\": \"AI 员工服务\",\n  \"Supply & Operations\": \"供应链与运营\",\n  \"Scenarios into production plans\": \"情景转化为生产计划\",\n  \"Financial Services\": \"金融服务\",\n  \"AI-personalized outreach\": \"AI 个性化触达\",\n  \"CX & Contact Center\": \"客户体验与呼叫中心\",\n  \"A contact center on one platform\": \"一体化呼叫中心\",\n  \"Retail & E-commerce\": \"零售与电商\",\n  \"From storefront to ERP\": \"从门店到 ERP\",\n  \"Sales Enablement\": \"销售赋能\",\n  \"A sales copilot for the field\": \"一线销售副驾\",\n  \"BI & Analytics\": \"商业智能与分析\",\n  \"Live data to action plan\": \"从实时数据到行动计划\",\n  \"Insurance & CX\": \"保险与客户体验\",\n  \"Semantic knowledge base\": \"语义知识库\",\n  \"Procurement\": \"采购\",\n  \"Sourcing modeling & planning\": \"采购建模与规划\",\n  \"Built on Data² by\": \"他们在 Data² 上构建\",\n  \"Business teams already build on Data²\": \"业务团队已在 Data² 上构建\",\n  \"What's possible\": \"无限可能\",\n  \"One platform. Every industry.\": \"一个平台，服务每个行业。\",\n  \"We don't sell slides. Each frontier below is real software, in production, built by the business area itself.\": \"我们不卖幻灯片。以下每一个领域，都是真实、上线、由业务部门亲手构建的软件。\",\n  \"An HR that answers <b>thousands of employees</b>, in multiple languages — instantly.\": \"一个能<b>即时回应数千名员工</b>、支持多语言的人力资源。\",\n  \"AI assistant for employees\": \"面向员工的 AI 助手\",\n  \"Handoff to human agents\": \"转接人工客服\",\n  \"Document reading (OCR)\": \"文档识别（OCR）\",\n  \"Answers & rules configured by the team\": \"答案与规则由业务团队配置\",\n  \"Analytics & CSAT\": \"分析与满意度（CSAT）\",\n  \"Turn <b>leftover stock into a prioritized production plan</b> — in minutes, not weeks.\": \"把<b>过剩库存变成有优先级的生产计划</b> —— 只需几分钟，而非数周。\",\n  \"Production scenario simulation\": \"生产情景模拟\",\n  \"Bill-of-materials explosion\": \"物料清单（BOM）展开\",\n  \"Savings & feasibility scoring\": \"节省与可行性评分\",\n  \"Self-service SQL over the data lake\": \"面向数据湖的自助 SQL\",\n  \"Export to spreadsheet\": \"导出到表格\",\n  \"<b>AI-personalized 1-to-1 outreach</b> at a scale of thousands — run by the commercial team itself.\": \"<b>AI 一对一个性化触达</b>，规模可达数千 —— 由商务团队自己操盘。\",\n  \"CRM + outreach automation\": \"CRM + 触达自动化\",\n  \"Omnichannel message waves\": \"全渠道消息波次\",\n  \"AI-written copy in the lead's tone\": \"以客户口吻由 AI 撜写文案\",\n  \"Offer & ROI modeling\": \"方案与 ROI 建模\",\n  \"Corporate SSO\": \"企业单点登录（SSO）\",\n  \"An <b>entire contact center</b> — from the on-site widget to queue automation — on a single platform.\": \"一个<b>完整的呼叫中心</b> —— 从网站挂件到队列自动化 —— 全在一个平台上。\",\n  \"Omnichannel webchat\": \"全渠道网页聊天\",\n  \"AI triage bot\": \"AI 分流机器人\",\n  \"Bot → human handoff\": \"机器人 → 人工转接\",\n  \"Agent workspace + supervisor console\": \"坐席工作台 + 主管控制台\",\n  \"Queue automation & CSAT\": \"队列自动化与满意度（CSAT）\",\n  \"From <b>storefront to ERP</b>: tailor-made buying experiences, with your e-commerce's real data.\": \"从<b>门店到 ERP</b>：量身定制的购物体验，用你电商的真实数据驱动。\",\n  \"Catalog & product experiences\": \"目录与商品体验\",\n  \"VTEX / GraphQL integration\": \"VTEX / GraphQL 集成\",\n  \"AI photo studio\": \"AI 影像工作室\",\n  \"ERP & store operations\": \"ERP 与门店运营\",\n  \"A <b>sales copilot</b> that tells each rep the next best action — in natural language.\": \"一个<b>销售副驾</b>，用自然语言告诉每位销售下一步的最佳行动。\",\n  \"Sales copilot in natural language\": \"自然语言销售副驾\",\n  \"Next-best-action recommendation\": \"下一最佳行动推荐\",\n  \"AI search over customers & segments\": \"面向客户与细分的 AI 搜索\",\n  \"Portfolio performance dashboards\": \"客户组合业绩仪表盘\",\n  \"AI content & image generation\": \"AI 内容与图像生成\",\n  \"From <b>live data to an action plan</b> — dashboards the team reads and acts on, no spreadsheet export.\": \"从<b>实时数据到行动计划</b> —— 业务团队看得懂、能行动的仪表盘，无需导出表格。\",\n  \"Executive dashboards on live data\": \"基于实时数据的高管仪表盘\",\n  \"Automated daily ingestion\": \"每日自动数据接入\",\n  \"Targets & action plan tracked\": \"目标与行动计划全程追踪\",\n  \"Alerts & monitoring\": \"告警与监控\",\n  \"Support that <b>answers from the right source</b> — a semantic knowledge base with AI triage.\": \"从<b>正确来源作答</b>的客服 —— 配备语义知识库与 AI 分流。\",\n  \"Semantic-search knowledge base\": \"语义搜索知识库\",\n  \"AI triage & support\": \"AI 分流与客服\",\n  \"Answers grounded in the source\": \"答案有据可依，源自原文\",\n  \"Support analytics\": \"客服分析\",\n  \"<b>Procurement excellence</b>: financial modeling and supply planning, simulated in minutes.\": \"<b>采购卓越</b>：财务建模与供应规划，几分钟即可模拟完成。\",\n  \"Supply planning\": \"供应规划\",\n  \"Financial scenario modeling\": \"财务情景建模\",\n  \"Decision simulators & builders\": \"决策模拟器与构建器\",\n  \"Data-driven sourcing\": \"数据驱动的采购\",\n  \"Across every industry\": \"贯穿每个行业\",\n  \"The same engine, whatever the problem\": \"无论什么问题，都是同一套引擎\",\n  \"AI built in\": \"内置 AI\",\n  \"Detection, classification, generation and vision — in natural language.\": \"检测、分类、生成与视觉 —— 皆以自然语言驱动。\",\n  \"Omnichannel\": \"全渠道\",\n  \"WhatsApp, voice, webchat and email in one flow.\": \"WhatsApp、语音、网页聊天与邮件，统一于一条流程。\",\n  \"Real data + integrations\": \"真实数据 + 集成\",\n  \"Databricks, VTEX, CRMs, SSO — genuinely connected.\": \"Databricks、VTEX、各类 CRM、SSO —— 真正打通连接。\",\n  \"Automation\": \"自动化\",\n  \"Events, webhooks and schedulers reacting in real time.\": \"事件、Webhook 与定时任务，实时响应。\",\n  \"Dashboards\": \"仪表盘\",\n  \"Panels and analytics over the operation's live data.\": \"基于业务实时数据的面板与分析。\",\n  \"No code\": \"无需代码\",\n  \"All assembled in the visual builder — by the business team itself.\": \"全部在可视化构建器中组装 —— 由业务团队亲手完成。\",\n  \"The Suite\": \"套件\",\n  \"Eight products. One system.\": \"八款产品，同一个系统。\",\n  \"8 products · 1 system\": \"8 款产品 · 1 个系统\",\n  \"Interface\": \"界面\",\n  \"Design the app, not a picture of it.\": \"设计真正的应用，而非它的一张图。\",\n  \"Data\": \"数据\",\n  \"Model, store and analyze at scale. Goodbye Lorem Ipsum.\": \"大规模建模、存储与分析。告别占位假数据。\",\n  \"Media\": \"媒体\",\n  \"Optimize and distribute files, in the cloud.\": \"在云端优化与分发文件。\",\n  \"Identity\": \"身份\",\n  \"Full lifecycles, from onboarding to password reset.\": \"完整的生命周期，从注册入门到密码重置。\",\n  \"Integrations\": \"集成\",\n  \"Connect to any external service.\": \"连接任何外部服务。\",\n  \"Domain · AI\": \"领域 · AI\",\n  \"Your model, never hidden in code. Multimodal AI.\": \"你的模型，绝不藏在代码里。多模态 AI。\",\n  \"Automation\": \"自动化\",\n  \"React to events in real time. Webhooks and schedulers.\": \"实时响应事件。Webhook 与定时任务。\",\n  \"Payments\": \"支付\",\n  \"Charge and get paid — any value transaction.\": \"收款与入账 —— 任何价值交易。\",\n  \"Our stack. Our services.\": \"我们的技术栈。我们的服务。\",\n  \"Our Forward Deployed Engineers embed with your area: they learn the pain, prototype and build with you — from first step to production.\": \"我们的前置部署工程师入驻你的部门：读懂痛点，与你一起做原型、共同构建 —— 从第一步到生产上线。\",\n  \"Ideation\": \"创意构思\",\n  \"Prototype\": \"原型\",\n  \"<em>Own</em> your data.\": \"<em>掌控</em>你的数据。\",\n  \"The Data Framework keeps your model and infrastructure under your control — never hidden in code, never hostage to a vendor.\": \"数据框架让你的模型与基础设施始终在你掌控之中 —— 绝不藏于代码，绝不受制于供应商。\",\n  \"Domain-Driven\": \"领域驱动\",\n  \"Single Data Language\": \"统一数据语言\",\n  \"From problem<br>to production.\": \"从问题<br>到生产。\",\n  \"Bring your area's challenge. We turn it into software — in production.\": \"带来你部门的挑战，我们把它变成软件 —— 直接上线生产。\",\n  \"The Digital Expression Suite. From problem to production.\": \"数字表达套件。从问题到生产。\",\n  \"Product\": \"产品\",\n  \"Company\": \"公司\",\n  \"About\": \"关于我们\",\n  \"People\": \"团队\",\n  \"Contact\": \"联系我们\",\n  \"Made on Data². Without a single line of code.\": \"在 Data² 上打造。未写一行代码。\",\n  \"Already in production with\": \"已上线客户\",\n  \"we map where it hurts\": \"我们找出痛点所在\",\n  \"2–4 weeks\": \"2–4 周\",\n  \"sprint with an embedded engineer\": \"工程师入驻的冲刺\",\n  \"In production\": \"上线生产\",\n  \"your team owns it\": \"你的团队主导\"\n};\n    function unesc(s){ return String(s).replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&amp;/g,\"&\"); }\n    var ZH2 = {}; for(var zk in ZH){ ZH2[unesc(zk)] = unesc(ZH[zk]); }\n    var nodes = root.querySelectorAll(\"[data-pt],[data-en]\");\n    function applyLang(l){\n      lang = l;\n      nodes.forEach(function(n){ var v; if(l===\"zh\"){ v=n.getAttribute(\"data-zh\")||ZH2[n.getAttribute(\"data-en\")]||n.getAttribute(\"data-en\"); } else { v=n.getAttribute(\"data-\"+l)||n.getAttribute(\"data-en\"); } if(v!=null) n.innerHTML=v; });\n      root.querySelectorAll(\"#lang button\").forEach(function(b){ b.classList.toggle(\"on\", b.dataset.l===l); });\n    }\n    root.querySelectorAll(\"#lang button\").forEach(function(b){\n      b.addEventListener(\"click\", function(){ applyLang(b.dataset.l); renderProduct(); if(window.__reRenderUni) window.__reRenderUni(); });\n    });\n\n    var nav = root.querySelector(\"#nav\");\n    var burger = root.querySelector(\"#burger\");\n    if(burger) burger.addEventListener(\"click\", function(){ nav.classList.toggle(\"open\"); });\n\n    sc.addEventListener(\"click\", function(e){\n      var a = e.target.closest ? e.target.closest('a[href^=\"#\"]') : null;\n      if(!a) return;\n      var id = a.getAttribute(\"href\").slice(1);\n      if(!id){ e.preventDefault(); return; }\n      var t = root.getElementById ? root.getElementById(id) : root.querySelector(\"#\"+id);\n      if(t){ e.preventDefault(); if(nav) nav.classList.remove(\"open\");\n        sc.scrollTo({ top: Math.max(0, t.offsetTop - 66), behavior: reduce ? \"auto\" : \"smooth\" }); }\n    });\n\n    var secs = [\"hero\",\"essence\",\"glance\",\"proof\",\"levers\",\"products\",\"platform\",\"deliver\",\"cta\"];\n    var rail = root.querySelector(\"#rail\");\n    secs.forEach(function(id){ var a=document.createElement(\"a\"); a.href=\"#\"+id; rail.appendChild(a); });\n    var railDots = rail.querySelectorAll(\"a\");\n    function placeRail(){ rail.style.top = (sc.scrollTop + sc.clientHeight/2) + \"px\"; }\n    sc.addEventListener(\"scroll\", function(){ if(nav) nav.classList.toggle(\"scrolled\", sc.scrollTop>40); placeRail(); }, {passive:true});\n    placeRail();\n\n    if(\"IntersectionObserver\" in window && !reduce){\n      var io = new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add(\"in\"); io.unobserve(e.target); } }); }, {root:sc, threshold:.18});\n      root.querySelectorAll(\".reveal\").forEach(function(el){ io.observe(el); });\n    } else {\n      root.querySelectorAll(\".reveal\").forEach(function(el){ el.classList.add(\"in\"); });\n    }\n    if(\"IntersectionObserver\" in window){\n      var io2 = new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting){ var i=secs.indexOf(e.target.id); railDots.forEach(function(d2n,di){ d2n.classList.toggle(\"on\", di===i); }); } }); }, {root:sc, threshold:.5});\n      secs.forEach(function(id){ var el=root.querySelector(\"#\"+id); if(el) io2.observe(el); });\n    }\n\n    var PRODUCTS = [\n      {code:\"UI\", color:\"#5b86ff\", what_pt:\"Interface do usuário\", what_en:\"User Interface\", t_pt:\"Design the app, not a picture of it.\", t_en:\"Design the app, not a picture of it.\", d_pt:\"Interface de verdade, com dados reais — não um mockup estático.\", d_en:\"A real interface, with real data — not a static mockup.\"},\n      {code:\"REGISTRY\", color:\"#ff5a4d\", what_pt:\"Seu banco de dados\", what_en:\"Your database\", t_pt:\"Adeus, Lorem Ipsum.\", t_en:\"Say goodbye to Lorem Ipsum.\", d_pt:\"Modele, armazene e analise dados em escala, com uma linguagem única.\", d_en:\"Model, store and analyze data at scale, with a single data language.\"},\n      {code:\"MEDIA\", color:\"#e8e84d\", what_pt:\"Seu storage, na nuvem\", what_en:\"Your storage, in the cloud\", t_pt:\"Arquivos, distribuídos.\", t_en:\"Files, distributed.\", d_pt:\"Todas as ferramentas pra otimizar e distribuir arquivos em escala.\", d_en:\"Every tool you need to optimize and distribute files at scale.\"},\n      {code:\"ID\", color:\"#4de0a1\", what_pt:\"Segurança, identidade e privacidade\", what_en:\"Security, identity & privacy\", t_pt:\"Ciclos de identidade completos.\", t_en:\"Full identity lifecycles.\", d_pt:\"Do onboarding ao reset de senha — em pouquíssimo tempo.\", d_en:\"From onboarding to password reset — in no time.\"},\n      {code:\"CONNECT\", color:\"#4ddfe6\", what_pt:\"APIs e serviços externos\", what_en:\"APIs & external services\", t_pt:\"Conecte-se a qualquer coisa.\", t_en:\"Connect to anything.\", d_pt:\"O framework de aplicação da Data² — seus servidores de back-end.\", d_en:\"Data²'s application framework — your back-end servers.\"},\n      {code:\"DOMAIN\", color:\"#ff4d9e\", what_pt:\"O coração do seu sistema\", what_en:\"The heart of your system\", t_pt:\"Seu modelo, nunca escondido em código.\", t_en:\"Your model, never hidden in code.\", d_pt:\"AI multimodal out-of-the-box, ajustada em linguagem natural. Domain-Driven.\", d_en:\"Multimodal AI out of the box, tuned in natural language. Domain-Driven.\"},\n      {code:\"RUSH\", color:\"#9b5cff\", what_pt:\"Webhooks, requisições, eventos\", what_en:\"Webhooks, requests, events\", t_pt:\"Reaja a eventos em tempo real.\", t_en:\"React to events in real time.\", d_pt:\"Agende, receba e automatize. Automação e monitoramento embutidos.\", d_en:\"Schedule, receive and automate. Automation and monitoring built in.\"},\n      {code:\"CASHIER\", color:\"#84e05a\", what_pt:\"Transações de valor\", what_en:\"Value transactions\", soon:true, t_pt:\"Just charge.\", t_en:\"Just charge.\", d_pt:\"Compre e venda qualquer coisa que dinheiro possa pagar.\", d_en:\"Buy and sell anything money can buy.\"}\n    ];\n    var ring = root.querySelector(\"#ring\");\n    var current = 0;\n    PRODUCTS.forEach(function(p,i){\n      var o = document.createElement(\"div\");\n      o.className = \"orb\"; o.style.color = p.color; o.style.background = p.color;\n      o.setAttribute(\"data-code\", p.code);\n      o.style.animationDelay = (-i*0.5) + \"s\";\n      var ang = (i/PRODUCTS.length)*Math.PI*2 - Math.PI/2, R = 42;\n      o.style.left = (50 + Math.cos(ang)*R) + \"%\";\n      o.style.top  = (50 + Math.sin(ang)*R) + \"%\";\n      o.addEventListener(\"mouseenter\", function(){ current=i; renderProduct(); });\n      o.addEventListener(\"click\", function(){ current=i; renderProduct(); });\n      ring.appendChild(o);\n    });\n    var orbs = ring.querySelectorAll(\".orb\");\n    function renderProduct(){\n      orbs.forEach(function(o,i){ o.classList.toggle(\"on\", i===current); });\n    }\n\n    function initFlow(canvas){\n      var ctx = canvas.getContext && canvas.getContext(\"2d\");\n      if(!ctx) return;\n      var hue = (getComputedStyle(canvas.parentElement).getPropertyValue(\"--hue\")||\"#5b86ff\").trim();\n      var w=0, h=0, dpr = Math.min(window.devicePixelRatio||1, 2);\n      function size(){ w=canvas.clientWidth; h=canvas.clientHeight; if(!w||!h) return; canvas.width=w*dpr; canvas.height=h*dpr; ctx.setTransform(dpr,0,0,dpr,0,0); }\n      size();\n      window.addEventListener(\"resize\", size);\n      var lines = 3;\n      function draw(t){\n        if(!w||!h){ size(); if(!w||!h) return; }\n        ctx.clearRect(0,0,w,h);\n        for(var i=0;i<lines;i++){\n          var yb=h*(0.32+i*0.16), amp=h*0.10+i*8, ph=t*0.00016*(1+i*0.35)+i*1.7;\n          ctx.beginPath();\n          for(var x=0;x<=w;x+=14){ var y=yb+Math.sin(x*0.0045+ph)*amp+Math.sin(x*0.0011-ph*0.7)*amp*0.5; if(x===0) ctx.moveTo(x,y); else ctx.lineTo(x,y); }\n          ctx.strokeStyle=hue; ctx.globalAlpha=0.16-i*0.03; ctx.lineWidth=1.4; ctx.stroke();\n        }\n        ctx.globalAlpha=1;\n      }\n      var raf=null;\n      function loop(t){ draw(t||0); raf=requestAnimationFrame(loop); }\n      if(reduce){ draw(0); }\n      else if(\"IntersectionObserver\" in window){\n        new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting && !raf){ raf=requestAnimationFrame(loop); } else if(!e.isIntersecting && raf){ cancelAnimationFrame(raf); raf=null; } }); }, {root:sc, threshold:.02}).observe(canvas);\n      } else { loop(0); }\n    }\n    root.querySelectorAll(\"canvas.flow\").forEach(initFlow);\n\n    root.querySelectorAll(\".acc-head\").forEach(function(h){\n      h.addEventListener(\"click\", function(){\n        var item=h.parentElement, willOpen=!item.classList.contains(\"open\");\n        root.querySelectorAll(\".acc-item\").forEach(function(it){ it.classList.remove(\"open\"); });\n        if(willOpen) item.classList.add(\"open\");\n      });\n    });\n\n    var hero = root.querySelector(\"#hero\");\n    var hfx = root.querySelector(\".herofx\");\n    if(hfx && hfx.getContext){\n      var hctx = hfx.getContext(\"2d\");\n      var HSTOPS=[[155,92,255],[91,134,255],[77,223,230],[77,224,161],[132,224,90],[232,232,77],[255,106,77],[255,77,158]];\n      var hw=0,hh=0,hdpr=Math.min(window.devicePixelRatio||1,2);\n      var mx=0.5,my=0.42,tx=0.5,ty=0.42,idle=999;\n      function hsize(){ hw=hfx.clientWidth; hh=hfx.clientHeight; if(!hw||!hh)return; hfx.width=hw*hdpr; hfx.height=hh*hdpr; hctx.setTransform(hdpr,0,0,hdpr,0,0); }\n      hsize(); window.addEventListener(\"resize\", hsize);\n      if(hero) hero.addEventListener(\"pointermove\", function(e){ var r=hero.getBoundingClientRect(); tx=(e.clientX-r.left)/r.width; ty=(e.clientY-r.top)/r.height; idle=0; });\n      function wrgb(t){ var p=((t*0.00003)%1)*8; var i=Math.floor(p), f=p-i; var a=HSTOPS[i%8], b=HSTOPS[(i+1)%8]; return [Math.round(a[0]+(b[0]-a[0])*f),Math.round(a[1]+(b[1]-a[1])*f),Math.round(a[2]+(b[2]-a[2])*f)]; }\n      function hdraw(t){\n        if(!hw||!hh){ hsize(); if(!hw||!hh) return; }\n        idle++;\n        if(reduce){ tx=0.5; ty=0.42; }\n        else if(idle>110){ tx=0.5+Math.cos(t*0.00015)*0.18; ty=0.42+Math.sin(t*0.0002)*0.12; }\n        mx+=(tx-mx)*0.045; my+=(ty-my)*0.045;\n        hctx.clearRect(0,0,hw,hh);\n        var c=wrgb(t), gx=mx*hw, gy=my*hh, R=Math.max(hw,hh)*0.55;\n        var g=hctx.createRadialGradient(gx,gy,0,gx,gy,R);\n        g.addColorStop(0,\"rgba(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\",0.11)\");\n        g.addColorStop(0.5,\"rgba(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\",0.04)\");\n        g.addColorStop(1,\"rgba(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\",0)\");\n        hctx.fillStyle=g; hctx.fillRect(0,0,hw,hh);\n        for(var i=0;i<3;i++){ var yb=hh*(0.3+i*0.2), amp=hh*0.07+i*10, ph=t*0.00011*(1+i*0.3)+i*2; hctx.beginPath();\n          for(var x=0;x<=hw;x+=16){ var y=yb+Math.sin(x*0.004+ph)*amp+Math.sin(x*0.0012-ph*0.6)*amp*0.5; if(x===0)hctx.moveTo(x,y); else hctx.lineTo(x,y);} \n          hctx.strokeStyle=\"rgba(255,255,255,\"+(0.05-i*0.012)+\")\"; hctx.lineWidth=1.2; hctx.stroke(); }\n      }\n      if(reduce){ hdraw(0); } else { (function hloop(t){ hdraw(t||0); requestAnimationFrame(hloop); })(0); }\n    }\n\n    var UNIS = [\n  {hue:\"#5b86ff\", name:{pt:\"RH & Pessoas\",en:\"HR & People\",zh:\"人力资源与员工\"}, tagline:{pt:\"Um RH que responde milhares de colaboradores, em vários idiomas — na hora. Cada peça, um módulo Data².\",en:\"An HR that answers thousands of employees, in many languages — instantly. Each piece, a Data² module.\",zh:\"一个能即时回应数千名员工、支持多语言的人力资源 —— 每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m0\", label:{pt:\"Assistente de AI\",en:\"AI assistant\",zh:\"AI 助手\"}, title:{pt:\"Assistente de AI ao colaborador\",en:\"AI assistant for employees\",zh:\"面向员工的 AI 助手\"}, desc:{pt:\"Um assistente que responde dúvidas de RH — benefícios, férias, políticas — em linguagem natural e em vários idiomas, 24/7.\",en:\"An assistant that answers HR questions — benefits, vacation, policies — in natural language and many languages, 24/7.\",zh:\"一个用自然语言、多语言全天候回答人力资源问题（福利、休假、政策）的助手。\"}, points:[{pt:\"Chat com AI treinada nas políticas da empresa\",en:\"Chat with AI trained on company policy\",zh:\"基于公司政策训练的 AI 聊天\"},{pt:\"Respostas ancoradas em documentos internos\",en:\"Answers grounded in internal documents\",zh:\"答案有据可依，源自内部文档\"},{pt:\"Multi-idioma para operações globais\",en:\"Multi-language for global operations\",zh:\"面向全球运营的多语言支持\"},{pt:\"Disponível no portal, WhatsApp e Teams\",en:\"Available on portal, WhatsApp and Teams\",zh:\"支持门户、WhatsApp 与 Teams\"}], oldModel:{pt:\"Colaborador espera dias por uma resposta de RH; o time se afoga em perguntas repetidas.\",en:\"Employees wait days for an HR reply; the team drowns in repeated questions.\",zh:\"员工等待数日才得到人力资源回复；团队被重复问题淹没。\"}, withData2:{pt:\"Resposta na hora, a qualquer hora — e o time de RH foca no que é humano.\",en:\"Instant answers, any time — and the HR team focuses on what's human.\",zh:\"随时即时作答 —— 人力资源团队专注于真正需要人的事。\"}, kpis:[{num:\"24/7\",cap:{pt:\"disponibilidade\",en:\"availability\",zh:\"全天候可用\"}},{num:\"−70%\",cap:{pt:\"perguntas repetidas\",en:\"repeat questions\",zh:\"重复提问\"}}]},\n    {motif:\"m2\", label:{pt:\"Transbordo\",en:\"Handoff\",zh:\"转接\"}, title:{pt:\"Transbordo para atendimento humano\",en:\"Handoff to a human agent\",zh:\"转接人工客服\"}, desc:{pt:\"Quando o caso é sensível, a conversa passa para o analista de RH certo — com todo o histórico.\",en:\"When a case is sensitive, the conversation moves to the right HR analyst — with the full history.\",zh:\"遇到敏感事项时，对话转交给合适的人力资源分析师 —— 携带完整历史。\"}, points:[{pt:\"Escalonamento por assunto e sensibilidade\",en:\"Escalation by topic and sensitivity\",zh:\"按主题与敏感度升级\"},{pt:\"Contexto completo entregue ao analista\",en:\"Full context handed to the analyst\",zh:\"向分析师交付完整上下文\"},{pt:\"Fila e status de atendimento\",en:\"Queue and handling status\",zh:\"队列与处理状态\"},{pt:\"Confidencialidade por perfil de acesso\",en:\"Confidentiality by access profile\",zh:\"按访问权限保密\"}], oldModel:{pt:\"Casos delicados se perdem em e-mails; ninguém sabe quem está tratando o quê.\",en:\"Delicate cases get lost in email; no one knows who is handling what.\",zh:\"敏感事项淹没在邮件里；无人知晓谁在处理什么。\"}, withData2:{pt:\"Cada caso vai para a pessoa certa, com contexto e rastreabilidade.\",en:\"Each case reaches the right person, with context and traceability.\",zh:\"每个事项都送达对的人，带上下文与可追溯。\"}, kpis:[{num:\"100%\",cap:{pt:\"contexto preservado\",en:\"context preserved\",zh:\"上下文保留\"}}]},\n    {motif:\"m3\", label:{pt:\"Leitura de docs\",en:\"Doc reading\",zh:\"文档识别\"}, title:{pt:\"Leitura de documentos (OCR)\",en:\"Document reading (OCR)\",zh:\"文档识别（OCR）\"}, desc:{pt:\"Atestados, comprovantes e formulários lidos automaticamente pela AI — sem digitação manual.\",en:\"Certificates, receipts and forms read automatically by AI — no manual typing.\",zh:\"证明、凭证与表单由 AI 自动识别 —— 无需人工录入。\"}, points:[{pt:\"Extração de dados de imagens e PDFs\",en:\"Data extraction from images and PDFs\",zh:\"从图像与 PDF 中提取数据\"},{pt:\"Validação automática de campos\",en:\"Automatic field validation\",zh:\"字段自动校验\"},{pt:\"Classificação do tipo de documento\",en:\"Document-type classification\",zh:\"文档类型分类\"},{pt:\"Arquivo seguro no storage da empresa\",en:\"Secure filing in company storage\",zh:\"安全归档至公司存储\"}], oldModel:{pt:\"Alguém relê cada atestado e redigita à mão — lento e sujeito a erro.\",en:\"Someone rereads each certificate and retypes it by hand — slow and error-prone.\",zh:\"有人逐一重读证明并手动录入 —— 缓慢且易错。\"}, withData2:{pt:\"A AI lê, valida e arquiva em segundos.\",en:\"AI reads, validates and files in seconds.\",zh:\"AI 数秒内完成识别、校验与归档。\"}, kpis:[{num:\"−90%\",cap:{pt:\"tempo de digitação\",en:\"data-entry time\",zh:\"录入时间\"}}]},\n    {motif:\"m1\", label:{pt:\"Regras\",en:\"Rules\",zh:\"规则\"}, title:{pt:\"Respostas e regras configuráveis pela área\",en:\"Answers & rules configured by the team\",zh:\"答案与规则由业务团队配置\"}, desc:{pt:\"O próprio RH ajusta respostas, fluxos e políticas — sem depender de TI ou de código.\",en:\"HR itself adjusts answers, flows and policies — with no dependency on IT or code.\",zh:\"人力资源团队自行调整答案、流程与政策 —— 无需依赖 IT 或代码。\"}, points:[{pt:\"Editor de respostas e fluxos sem código\",en:\"No-code answer and flow editor\",zh:\"无代码的答案与流程编辑器\"},{pt:\"Regras por país, área e cargo\",en:\"Rules by country, area and role\",zh:\"按国家、部门与岗位设置规则\"},{pt:\"Versões e publicação controladas\",en:\"Versioning and controlled publishing\",zh:\"版本管理与受控发布\"},{pt:\"Testes antes de ir ao ar\",en:\"Tested before going live\",zh:\"上线前测试\"}], oldModel:{pt:\"Cada mudança de política vira um chamado de TI que demora semanas.\",en:\"Every policy change becomes an IT ticket that takes weeks.\",zh:\"每次政策变更都变成耗时数周的 IT 工单。\"}, withData2:{pt:\"A área muda a regra e publica no mesmo dia.\",en:\"The team changes the rule and ships the same day.\",zh:\"业务团队当天即可修改规则并发布。\"}, kpis:[{num:\"0\",cap:{pt:\"dependência de código\",en:\"code dependency\",zh:\"代码依赖\"}}]},\n    {motif:\"m4\", label:{pt:\"Analytics & CSAT\",en:\"Analytics & CSAT\",zh:\"分析与 CSAT\"}, title:{pt:\"Analytics e CSAT\",en:\"Analytics & CSAT\",zh:\"分析与满意度（CSAT）\"}, desc:{pt:\"Painéis mostram volume, temas, tempo de resposta e satisfação — para melhorar continuamente.\",en:\"Dashboards show volume, topics, response time and satisfaction — to improve continuously.\",zh:\"仪表盘呈现工单量、主题、响应时间与满意度 —— 持续改进。\"}, points:[{pt:\"Métricas de volume e tempo de resposta\",en:\"Volume and response-time metrics\",zh:\"工单量与响应时间指标\"},{pt:\"Temas mais perguntados\",en:\"Most-asked topics\",zh:\"最常被问的主题\"},{pt:\"Pesquisa de satisfação (CSAT)\",en:\"Satisfaction survey (CSAT)\",zh:\"满意度调查（CSAT）\"},{pt:\"Alertas de picos e gargalos\",en:\"Alerts for spikes and bottlenecks\",zh:\"峰值与瓶颈告警\"}], oldModel:{pt:\"Ninguém sabe o que mais consome o RH; decisão no achismo.\",en:\"No one knows what consumes HR most; decisions by guesswork.\",zh:\"无人知晓什么最耗费人力资源精力；决策靠猜。\"}, withData2:{pt:\"Dados mostram onde agir — e a experiência do colaborador melhora.\",en:\"Data shows where to act — and the employee experience improves.\",zh:\"数据指明行动方向 —— 员工体验随之提升。\"}, kpis:[{num:\"+CSAT\",cap:{pt:\"satisfação medida\",en:\"satisfaction measured\",zh:\"满意度可量\"}}]}\n  ]},\n  {hue:\"#4de0a1\", name:{pt:\"Supply & Operações\",en:\"Supply & Operations\",zh:\"供应链与运营\"}, tagline:{pt:\"Transformar sobra de estoque em plano de produção priorizado — em minutos, não semanas. Cada peça, um módulo Data².\",en:\"Turn leftover stock into a prioritized production plan — in minutes, not weeks. Each piece, a Data² module.\",zh:\"把过剩库存变成有优先级的生产计划 —— 只需几分钟，而非数周。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m6\", label:{pt:\"Cenários\",en:\"Scenarios\",zh:\"情景\"}, title:{pt:\"Simulação de cenários de produção\",en:\"Production scenario simulation\",zh:\"生产情景模拟\"}, desc:{pt:\"Rode dezenas de cenários 'e se' sobre o dado real de estoque e demanda — e compare resultados lado a lado.\",en:\"Run dozens of 'what-if' scenarios over real stock and demand data — and compare results side by side.\",zh:\"基于真实库存与需求数据运行数十种'假设'情景 —— 并逐一对比结果。\"}, points:[{pt:\"Parâmetros ajustáveis pela área\",en:\"Parameters adjustable by the team\",zh:\"参数由业务团队调整\"},{pt:\"Cálculo sobre dado vivo do data lake\",en:\"Computed over live data-lake data\",zh:\"基于数据湖实时数据计算\"},{pt:\"Comparação de cenários lado a lado\",en:\"Side-by-side scenario comparison\",zh:\"情景并排对比\"},{pt:\"Do cenário ao plano em um clique\",en:\"From scenario to plan in one click\",zh:\"一键从情景到计划\"}], oldModel:{pt:\"Cada simulação é uma planilha nova, feita à mão — e ninguém confia no número.\",en:\"Each simulation is a new hand-made spreadsheet — and no one trusts the number.\",zh:\"每次模拟都是一张新的手工表格 —— 没人信得过那个数字。\"}, withData2:{pt:\"Cenários em minutos sobre o dado real, comparáveis e auditáveis.\",en:\"Scenarios in minutes over real data, comparable and auditable.\",zh:\"几分钟内基于真实数据生成情景，可对比、可审计。\"}, kpis:[{num:\"5min\",cap:{pt:\"por cenário\",en:\"per scenario\",zh:\"每个情景\"}}]},\n    {motif:\"m3\", label:{pt:\"Estrutura (BOM)\",en:\"BOM\",zh:\"物料清单\"}, title:{pt:\"Explosão de estrutura (BOM)\",en:\"Bill-of-materials explosion\",zh:\"物料清单（BOM）展开\"}, desc:{pt:\"A partir de um produto, o Rush explode toda a árvore de componentes — recursivamente, com quantidades.\",en:\"From a product, Rush explodes the whole component tree — recursively, with quantities.\",zh:\"从一个成品出发，Rush 递归展开整棵组件树 —— 带数量。\"}, points:[{pt:\"Explosão recursiva multi-nível\",en:\"Recursive multi-level explosion\",zh:\"多层级递归展开\"},{pt:\"Quantidades e perdas por etapa\",en:\"Quantities and losses per step\",zh:\"每步的用量与损耗\"},{pt:\"Disponibilidade cruzada com estoque\",en:\"Cross-checked with stock availability\",zh:\"与库存可用量交叉核对\"},{pt:\"Reprocessamento em tempo real\",en:\"Real-time recomputation\",zh:\"实时重算\"}], oldModel:{pt:\"Explodir uma BOM à mão leva dias e erra — e some quando o engenheiro sai.\",en:\"Exploding a BOM by hand takes days and errs — and vanishes when the engineer leaves.\",zh:\"手工展开 BOM 耗时数天且易错 —— 工程师一走就没了。\"}, withData2:{pt:\"A estrutura explode sozinha, com quantidades e disponibilidade, em segundos.\",en:\"The structure explodes itself, with quantities and availability, in seconds.\",zh:\"结构自动展开，带数量与可用量，只需数秒。\"}, kpis:[{num:\"−95%\",cap:{pt:\"tempo de cálculo\",en:\"calc time\",zh:\"计算时间\"}}]},\n    {motif:\"m1\", label:{pt:\"Score\",en:\"Score\",zh:\"评分\"}, title:{pt:\"Score de economia e viabilidade\",en:\"Savings & feasibility scoring\",zh:\"节省与可行性评分\"}, desc:{pt:\"Cada plano recebe um score de economia potencial e de viabilidade — para priorizar o que vale a pena.\",en:\"Each plan gets a score for potential savings and feasibility — to prioritize what's worth it.\",zh:\"每个计划都获得潜在节省与可行性评分 —— 优先执行最值得的方案。\"}, points:[{pt:\"Score de economia por cenário\",en:\"Savings score per scenario\",zh:\"每情景节省评分\"},{pt:\"Viabilidade por restrição de capacidade\",en:\"Feasibility by capacity constraints\",zh:\"按产能约束评估可行性\"},{pt:\"Ranking automático de prioridade\",en:\"Automatic priority ranking\",zh:\"自动优先级排序\"},{pt:\"Regras de negócio configuráveis\",en:\"Configurable business rules\",zh:\"可配置业务规则\"}], oldModel:{pt:\"Prioridade definida por intuição; oportunidades de economia passam batido.\",en:\"Priority set by intuition; savings opportunities slip by.\",zh:\"优先级靠直觉；节省机会白白溜走。\"}, withData2:{pt:\"O sistema ranqueia por economia e viabilidade — a área age no que rende mais.\",en:\"The system ranks by savings and feasibility — the team acts on what pays most.\",zh:\"系统按节省与可行性排序 —— 团队优先处理最有回报的。\"}, kpis:[{num:\"×10\",cap:{pt:\"oportunidades vistas\",en:\"opportunities surfaced\",zh:\"发现的机会\"}}]},\n    {motif:\"m2\", label:{pt:\"SQL self-service\",en:\"Self-service SQL\",zh:\"自助 SQL\"}, title:{pt:\"SQL self-service sobre o data lake\",en:\"Self-service SQL over the data lake\",zh:\"面向数据湖的自助 SQL\"}, desc:{pt:\"A área consulta o data lake direto — em SQL ou em linguagem natural — sem abrir chamado para o time de dados.\",en:\"The team queries the data lake directly — in SQL or natural language — with no ticket to the data team.\",zh:\"业务团队直接查询数据湖 —— 用 SQL 或自然语言 —— 无需向数据团队开工单。\"}, points:[{pt:\"Conexão governada ao data lake (Databricks)\",en:\"Governed connection to the data lake (Databricks)\",zh:\"受治理地连接数据湖（Databricks）\"},{pt:\"Consulta em SQL ou linguagem natural\",en:\"Query in SQL or natural language\",zh:\"用 SQL 或自然语言查询\"},{pt:\"Resultados em tabela e gráfico\",en:\"Results as table and chart\",zh:\"结果以表格与图表呈现\"},{pt:\"Permissões por perfil de acesso\",en:\"Permissions by access profile\",zh:\"按访问权限授权\"}], oldModel:{pt:\"Toda pergunta vira chamado para o time de dados; a resposta chega dias depois.\",en:\"Every question becomes a ticket to the data team; the answer arrives days later.\",zh:\"每个问题都变成给数据团队的工单；答案数天后才到。\"}, withData2:{pt:\"A própria área pergunta e recebe na hora — sem fila, com governança.\",en:\"The team asks and gets it instantly — no queue, with governance.\",zh:\"业务团队自行提问即时得到结果 —— 无排队、有治理。\"}, kpis:[{num:\"0\",cap:{pt:\"chamados ao time de dados\",en:\"tickets to the data team\",zh:\"给数据团队的工单\"}}]},\n    {motif:\"m7\", label:{pt:\"Exportação\",en:\"Export\",zh:\"导出\"}, title:{pt:\"Exportação para planilha\",en:\"Export to spreadsheet\",zh:\"导出到表格\"}, desc:{pt:\"Qualquer plano ou consulta vira planilha ou relatório com um clique — para compartilhar com quem ainda vive no Excel.\",en:\"Any plan or query becomes a spreadsheet or report in one click — to share with whoever still lives in Excel.\",zh:\"任何计划或查询一键变成表格或报表 —— 分享给仍离不开 Excel 的人。\"}, points:[{pt:\"Export em um clique (XLSX/CSV)\",en:\"One-click export (XLSX/CSV)\",zh:\"一键导出（XLSX/CSV）\"},{pt:\"Relatórios formatados prontos\",en:\"Ready formatted reports\",zh:\"格式化报表即取即用\"},{pt:\"Agendamento de envios recorrentes\",en:\"Scheduled recurring sends\",zh:\"定时循环发送\"},{pt:\"Histórico de versões exportadas\",en:\"Version history of exports\",zh:\"导出版本历史\"}], oldModel:{pt:\"Copiar e colar entre sistemas e planilhas — retrabalho e erro garantidos.\",en:\"Copy-paste between systems and spreadsheets — guaranteed rework and error.\",zh:\"在系统与表格间复制粘贴 —— 返工与错误在所难免。\"}, withData2:{pt:\"Um clique gera a planilha certa, sempre atualizada.\",en:\"One click generates the right spreadsheet, always up to date.\",zh:\"一键生成正确的表格，始终最新。\"}, kpis:[{num:\"1\",cap:{pt:\"clique para exportar\",en:\"click to export\",zh:\"点击即导出\"}}]}\n  ]},\n  {hue:\"#e8b84d\", name:{pt:\"Serviços Financeiros\",en:\"Financial Services\",zh:\"金融服务\"}, tagline:{pt:\"Prospecção 1-a-1 personalizada por AI, em escala de milhares — operada pelo próprio time comercial. Cada peça, um módulo Data².\",en:\"AI-personalized 1-to-1 outreach at a scale of thousands — run by the commercial team itself. Each piece, a Data² module.\",zh:\"AI 一对一个性化触达，规模可达数千 —— 由商务团队自己操盘。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m3\", label:{pt:\"CRM + outreach\",en:\"CRM + outreach\",zh:\"CRM + 触达\"}, title:{pt:\"CRM + automação de outreach\",en:\"CRM + outreach automation\",zh:\"CRM + 触达自动化\"}, desc:{pt:\"Um CRM próprio da área com automação de prospecção — leads, estágios e cadências, tudo num sistema só.\",en:\"The team's own CRM with outreach automation — leads, stages and cadences, all in one system.\",zh:\"业务团队自有的 CRM，内置触达自动化 —— 线索、阶段与节奏，尽在一个系统。\"}, points:[{pt:\"Base de leads com estágios e dono\",en:\"Lead base with stages and owner\",zh:\"含阶段与负责人的线索库\"},{pt:\"Cadências de contato automatizadas\",en:\"Automated contact cadences\",zh:\"自动化联系节奏\"},{pt:\"Regras de disparo por evento (Rush)\",en:\"Event-triggered sending (Rush)\",zh:\"按事件触发发送（Rush）\"},{pt:\"Histórico completo por lead\",en:\"Full history per lead\",zh:\"每条线索完整历史\"}], oldModel:{pt:\"Prospecção em planilha + envio manual — sem escala e sem rastreio.\",en:\"Outreach in a spreadsheet + manual sending — no scale, no tracking.\",zh:\"用表格做触达 + 手动发送 —— 无规模、无追踪。\"}, withData2:{pt:\"O CRM dispara a cadência certa sozinho e registra tudo.\",en:\"The CRM fires the right cadence on its own and logs everything.\",zh:\"CRM 自动触发正确节奏并记录一切。\"}, kpis:[{num:\"1000s\",cap:{pt:\"leads em cadência\",en:\"leads in cadence\",zh:\"进入节奏的线索\"}}]},\n    {motif:\"m1\", label:{pt:\"Ondas omnichannel\",en:\"Omnichannel waves\",zh:\"全渠道波次\"}, title:{pt:\"Ondas de mensagens omnichannel\",en:\"Omnichannel message waves\",zh:\"全渠道消息波次\"}, desc:{pt:\"Campanhas em ondas por e-mail, WhatsApp e SMS — com controle de volume, horário e resposta.\",en:\"Wave campaigns over email, WhatsApp and SMS — with control of volume, timing and reply.\",zh:\"通过邮件、WhatsApp 与短信分波次投放 —— 掌控数量、时机与回复。\"}, points:[{pt:\"Disparo em ondas com controle de volume\",en:\"Wave sending with volume control\",zh:\"分波次发送并控制数量\"},{pt:\"E-mail, WhatsApp e SMS no mesmo fluxo\",en:\"Email, WhatsApp and SMS in one flow\",zh:\"邮件、WhatsApp 与短信统一流程\"},{pt:\"Janela de horário e frequência\",en:\"Time window and frequency\",zh:\"时间窗口与频次\"},{pt:\"Captura de respostas de volta ao CRM\",en:\"Replies captured back into the CRM\",zh:\"回复自动回流至 CRM\"}], oldModel:{pt:\"Disparo em massa único, sem ritmo — vira spam e queima a base.\",en:\"A single mass blast, no rhythm — becomes spam and burns the base.\",zh:\"一次性群发、毫无节奏 —— 沦为垃圾信息并烧毁客户池。\"}, withData2:{pt:\"Ondas ritmadas e multicanal — mais entrega, menos queima.\",en:\"Paced, multichannel waves — more delivery, less burn.\",zh:\"有节奏的多渠道波次 —— 送达更高、损耗更低。\"}, kpis:[{num:\"3\",cap:{pt:\"canais num fluxo\",en:\"channels in one flow\",zh:\"渠道合一\"}}]},\n    {motif:\"m5\", label:{pt:\"Copy por AI\",en:\"AI copy\",zh:\"AI 文案\"}, title:{pt:\"Copy gerada por AI no tom do lead\",en:\"AI-written copy in the lead's tone\",zh:\"以客户口吻由 AI 撰写文案\"}, desc:{pt:\"A AI escreve cada mensagem no tom e no contexto de cada lead — personalização real, não 'Olá [NOME]'.\",en:\"AI writes each message in each lead's tone and context — real personalization, not 'Hi [NAME]'.\",zh:\"AI 依据每位客户的语气与情境撰写每条消息 —— 真正的个性化，而非'你好 [姓名]'。\"}, points:[{pt:\"Geração de copy por AI multimodal\",en:\"Copy generation via multimodal AI\",zh:\"多模态 AI 生成文案\"},{pt:\"Personalização por perfil e histórico\",en:\"Personalization by profile and history\",zh:\"按画像与历史个性化\"},{pt:\"Tom e idioma ajustáveis\",en:\"Adjustable tone and language\",zh:\"可调语气与语言\"},{pt:\"Aprovação humana antes do envio\",en:\"Human approval before sending\",zh:\"发送前人工审批\"}], oldModel:{pt:\"Template único para todos — genérico, ignorado, baixa resposta.\",en:\"One template for everyone — generic, ignored, low reply.\",zh:\"所有人一个模板 —— 千篇一律、被无视、回复率低。\"}, withData2:{pt:\"Cada lead recebe uma mensagem que parece escrita só para ele.\",en:\"Each lead gets a message that feels written just for them.\",zh:\"每位客户收到的消息，仿佛专为他而写。\"}, kpis:[{num:\"+2×\",cap:{pt:\"taxa de resposta\",en:\"reply rate\",zh:\"回复率\"}}]},\n    {motif:\"m6\", label:{pt:\"Proposta & ROI\",en:\"Offer & ROI\",zh:\"方案与 ROI\"}, title:{pt:\"Modelagem de proposta e ROI\",en:\"Offer & ROI modeling\",zh:\"方案与 ROI 建模\"}, desc:{pt:\"Simule propostas e mostre o ROI para o cliente na hora — números que fecham negócio.\",en:\"Simulate offers and show the client the ROI on the spot — numbers that close deals.\",zh:\"即时模拟方案并向客户展示 ROI —— 用数字促成交易。\"}, points:[{pt:\"Simulador de proposta com parâmetros\",en:\"Offer simulator with parameters\",zh:\"带参数的方案模拟器\"},{pt:\"Cálculo de ROI e payback\",en:\"ROI and payback calculation\",zh:\"ROI 与回收期计算\"},{pt:\"Comparação de opções para o cliente\",en:\"Option comparison for the client\",zh:\"为客户对比多种选项\"},{pt:\"Proposta exportável em PDF\",en:\"Offer exportable to PDF\",zh:\"方案可导出 PDF\"}], oldModel:{pt:\"Proposta feita à mão depois da reunião — o timing passa e o lead esfria.\",en:\"Offer built by hand after the meeting — the timing passes and the lead cools.\",zh:\"会后手工制作方案 —— 时机已过，客户变冷。\"}, withData2:{pt:\"Proposta e ROI na hora, dentro da conversa — o lead decide quente.\",en:\"Offer and ROI on the spot, inside the conversation — the lead decides while hot.\",zh:\"对话中即时给出方案与 ROI —— 趁热促成决策。\"}, kpis:[{num:\"1\",cap:{pt:\"reunião para fechar\",en:\"meeting to close\",zh:\"一次会议成交\"}}]},\n    {motif:\"m2\", label:{pt:\"SSO\",en:\"SSO\",zh:\"单点登录\"}, title:{pt:\"SSO corporativo\",en:\"Corporate SSO\",zh:\"企业单点登录（SSO）\"}, desc:{pt:\"Login integrado ao provedor de identidade da empresa — seguro, auditável e sem senha nova.\",en:\"Login integrated with the company's identity provider — secure, auditable, no new password.\",zh:\"与企业身份提供商集成的登录 —— 安全、可审计、无需新密码。\"}, points:[{pt:\"Integração com IdP corporativo (SSO/SAML/OAuth)\",en:\"Corporate IdP integration (SSO/SAML/OAuth)\",zh:\"对接企业 IdP（SSO/SAML/OAuth）\"},{pt:\"Perfis e permissões por papel\",en:\"Roles and permissions by profile\",zh:\"按角色的权限配置\"},{pt:\"Trilhas de auditoria de acesso\",en:\"Access audit trails\",zh:\"访问审计日志\"},{pt:\"Provisionamento e revogação central\",en:\"Central provisioning and revocation\",zh:\"集中开通与撤销\"}], oldModel:{pt:\"Mais um sistema, mais uma senha — e um buraco de segurança e compliance.\",en:\"One more system, one more password — and a security and compliance hole.\",zh:\"又一个系统、又一个密码 —— 还多一个安全与合规漏洞。\"}, withData2:{pt:\"Entra com a identidade da empresa — seguro e auditável desde o primeiro dia.\",en:\"Sign in with the company identity — secure and auditable from day one.\",zh:\"用企业身份登录 —— 从第一天起即安全可审计。\"}, kpis:[{num:\"SSO\",cap:{pt:\"sem senha nova\",en:\"no new password\",zh:\"无需新密码\"}}]}\n  ]},\n  {hue:\"#4ddfe6\", name:{pt:\"CX & Contact Center\",en:\"CX & Contact Center\",zh:\"客户体验与呼叫中心\"}, tagline:{pt:\"Um contact center inteiro, funcionando como um sistema vivo — cada componente é um módulo Data². Passe o mouse. Role para os detalhes.\",en:\"An entire contact center, running as a living system — each component is a Data² module. Hover. Scroll for the details.\",zh:\"一个完整的呼叫中心，如同一个活的系统在运行 —— 每个组件都是一个 Data² 模块。悬停查看，下滚了解详情。\"}, layout:[[108,86],[345,38],[355,236],[612,84],[556,246]], comps:[\n    {motif:\"m0\", label:{pt:\"Webchat\",en:\"Webchat\",zh:\"网页聊天\"}, title:{pt:\"Webchat omnichannel\",en:\"Omnichannel webchat\",zh:\"全渠道网页聊天\"}, desc:{pt:\"Um widget no seu site conversa no mesmo fluxo que WhatsApp, voz e e-mail. O cliente começa onde quiser e a conversa nunca se perde.\",en:\"A widget on your site talks in the same flow as WhatsApp, voice and email. Customers start anywhere and the conversation is never lost.\",zh:\"网站挂件与 WhatsApp、语音和邮件处于同一流程。客户可从任何渠道开始，对话永不丢失。\"}, points:[{pt:\"Widget embutido via iframe + websockets\",en:\"Embedded widget via iframe + websockets\",zh:\"通过 iframe + websockets 嵌入挂件\"},{pt:\"Ponte com provedor de mensageria e voz (CPaaS)\",en:\"Bridge to a messaging/voice provider (CPaaS)\",zh:\"对接消息/语音服务商（CPaaS）\"},{pt:\"Sessões, mensagens e transferências unificadas por cliente\",en:\"Sessions, messages and transfers unified per customer\",zh:\"按客户统一会话、消息与转接\"},{pt:\"Continuidade de contexto ao trocar de canal\",en:\"Context continuity across channels\",zh:\"跨渠道保持上下文连续\"}], oldModel:{pt:\"Canais soltos, sem histórico compartilhado. O cliente repete tudo a cada troca; o atendente trabalha às cegas.\",en:\"Disconnected channels, no shared history. Customers repeat everything on each switch; agents work blind.\",zh:\"渠道割裂、无共享历史。客户每次切换都要重复，坐席只能盲目应对。\"}, withData2:{pt:\"Um só fluxo, um só histórico. Menos repetição, respostas mais rápidas, e o cliente começa onde for mais fácil.\",en:\"One flow, one history. Less repetition, faster answers, and customers start wherever is easiest.\",zh:\"统一流程、统一历史。更少重复、更快响应，客户从最方便的渠道开始。\"}, kpis:[{num:\"100k+\",cap:{pt:\"atendimentos/dia\",en:\"interactions/day\",zh:\"次服务/天\"}}]},\n    {motif:\"m1\", label:{pt:\"Bot de triagem\",en:\"Triage bot\",zh:\"分流机器人\"}, title:{pt:\"Bot de triagem com AI\",en:\"AI triage bot\",zh:\"AI 分流机器人\"}, desc:{pt:\"A AI entende a intenção, resolve na hora o que é simples e classifica o resto para a fila certa — antes de qualquer humano tocar.\",en:\"AI reads intent, instantly resolves the simple, and routes the rest to the right queue — before any human touches it.\",zh:\"AI 理解意图，即时解决简单问题，并将其余分流到正确队列 —— 无需任何人工介入。\"}, points:[{pt:\"Detecção de caso de uso por AI\",en:\"AI use-case detection\",zh:\"AI 用例识别\"},{pt:\"Fluxos guiados: cancelamento, troca, reembolso, atraso\",en:\"Guided flows: cancel, exchange, refund, delay\",zh:\"引导式流程：取消、换货、退款、延迟\"},{pt:\"Leitura de imagem e classificação de texto livre\",en:\"Image reading and free-text classification\",zh:\"图像识别与自由文本分类\"},{pt:\"Abertura de ticket no CRM externo\",en:\"Ticket creation in the external CRM\",zh:\"在外部 CRM 中创建工单\"}], oldModel:{pt:\"Todo contato cai na fila humana, até os triviais. A fila cresce e o custo por contato dispara.\",en:\"Every contact hits the human queue, even trivial ones. The queue grows and cost-per-contact soars.\",zh:\"所有联系都进入人工队列，连琐事也是。队列膨胀，单次联系成本飙升。\"}, withData2:{pt:\"A AI resolve o repetitivo na hora e só encaminha o que precisa de gente — menos fila, menos custo, 24/7.\",en:\"AI resolves the repetitive instantly and only routes what needs a human — less queue, less cost, 24/7.\",zh:\"AI 即时解决重复问题，只转交需人工的部分 —— 更短队列、更低成本、7×24。\"}, kpis:[{num:\"−50%\",cap:{pt:\"tempo de resolução\",en:\"resolution time\",zh:\"解决时间\"}}]},\n    {motif:\"m2\", label:{pt:\"Transbordo\",en:\"Handoff\",zh:\"转接\"}, title:{pt:\"Transbordo bot → humano\",en:\"Bot → human handoff\",zh:\"机器人 → 人工转接\"}, desc:{pt:\"Quando o humano precisa entrar, entra com todo o histórico e o contexto na mão. Zero 'reconte tudo de novo'.\",en:\"When a human is needed, they step in with the full history and context in hand. Zero 'tell me everything again'.\",zh:\"当需要人工时，坐席携带完整历史与上下文接手。无需'重新说一遍'。\"}, points:[{pt:\"Handoff com histórico e contexto completos\",en:\"Handoff with full history and context\",zh:\"携带完整历史与上下文的转接\"},{pt:\"Transferência entre filas e times\",en:\"Transfer across queues and teams\",zh:\"跨队列与团队转接\"},{pt:\"Detecção de inatividade e abandono\",en:\"Inactivity and abandonment detection\",zh:\"闲置与弃单检测\"},{pt:\"Respostas prontas + atalhos do atendente\",en:\"Canned replies + agent shortcuts\",zh:\"预设回复 + 坐席快捷方式\"}], oldModel:{pt:\"A passagem pro humano perde o contexto. 'Me conta tudo de novo' vira regra e a satisfação despenca.\",en:\"The handoff loses context. 'Tell me everything again' becomes the rule and satisfaction drops.\",zh:\"转人工时丢失上下文。'请再说一遍'成常态，满意度骤降。\"}, withData2:{pt:\"O atendente entra com histórico e contexto completos. Transição invisível pro cliente.\",en:\"The agent steps in with full history and context. An invisible transition for the customer.\",zh:\"坐席携带完整历史与上下文接手。对客户而言，转接无感。\"}, kpis:[{num:\"100%\",cap:{pt:\"do contexto preservado\",en:\"context preserved\",zh:\"上下文保留\"}}]},\n    {motif:\"m3\", label:{pt:\"Console\",en:\"Console\",zh:\"控制台\"}, title:{pt:\"Console de agente + supervisor\",en:\"Agent workspace + supervisor console\",zh:\"坐席工作台 + 主管控制台\"}, desc:{pt:\"Fila, transferências, status dos agentes e supervisão ao vivo — tudo num painel só, sobre o dado real da operação.\",en:\"Queue, transfers, agent status and live supervision — all in one console, over the operation's real data.\",zh:\"队列、转接、坐席状态与实时督导 —— 全部集于一个控制台，基于运营真实数据。\"}, points:[{pt:\"Workspace do agente: status, presets, chatrooms\",en:\"Agent workspace: status, presets, chatrooms\",zh:\"坐席工作台：状态、预设、聊天室\"},{pt:\"Console do supervisor: fila e métricas ao vivo\",en:\"Supervisor console: live queue and metrics\",zh:\"主管控制台：实时队列与指标\"},{pt:\"Classificação de transferências\",en:\"Transfer classification\",zh:\"转接分类\"},{pt:\"Fechamentos mensais e sync de metadados\",en:\"Monthly closings and metadata sync\",zh:\"月度结算与元数据同步\"}], oldModel:{pt:\"Supervisão por planilha e telas espalhadas. Ninguém enxerga a operação ao vivo; decisão no achismo.\",en:\"Supervision by spreadsheet and scattered screens. No one sees the live operation; decisions by guesswork.\",zh:\"靠表格与零散界面督导。无人实时掌控，决策靠猜。\"}, withData2:{pt:\"Uma tela com fila, status, transferências e métricas ao vivo — decisão sobre o dado real.\",en:\"One screen with live queue, status, transfers and metrics — decisions on real data.\",zh:\"一屏掌握实时队列、状态、转接与指标 —— 基于真实数据决策。\"}, kpis:[{num:\"1\",cap:{pt:\"tela para toda a operação\",en:\"screen for the whole operation\",zh:\"一屏掌控全局\"}}]},\n    {motif:\"m4\", label:{pt:\"Filas & CSAT\",en:\"Queues & CSAT\",zh:\"队列与 CSAT\"}, title:{pt:\"Automação de filas & CSAT\",en:\"Queue automation & CSAT\",zh:\"队列自动化与满意度（CSAT）\"}, desc:{pt:\"Filas que se auto-gerenciam: detecção de abandono, repriorização e pesquisa de satisfação disparada na hora certa.\",en:\"Self-managing queues: abandonment detection, re-prioritization and CSAT surveys fired at the right moment.\",zh:\"自我管理的队列：弃单检测、重新优先级排序，并在恰当时机发起满意度调查。\"}, points:[{pt:\"Agendadores (Rush) mantêm a fila saudável\",en:\"Schedulers (Rush) keep the queue healthy\",zh:\"调度器（Rush）维持队列健康\"},{pt:\"Detecção de abandono + auto-cura da fila\",en:\"Abandonment detection + queue self-healing\",zh:\"弃单检测 + 队列自愈\"},{pt:\"CSAT disparado no momento certo\",en:\"CSAT fired at the right moment\",zh:\"在恰当时机发起 CSAT\"},{pt:\"Analytics de custo por caso de uso + export\",en:\"Cost analytics by use-case + export\",zh:\"按用例的成本分析 + 导出\"}], oldModel:{pt:\"Filas travadas por transferências esquecidas e abandono não detectado. Satisfação medida tarde ou nunca.\",en:\"Queues stuck by forgotten transfers and undetected abandonment. Satisfaction measured late, or never.\",zh:\"队列被遗忘的转接与未检测的弃单拖垮。满意度测得太晚，甚至从不测。\"}, withData2:{pt:\"Rush mantém a fila saudável sozinho e dispara o CSAT na hora certa — melhoria contínua com dado.\",en:\"Rush keeps the queue healthy on its own and fires CSAT at the right time — continuous improvement, data-driven.\",zh:\"Rush 自动维持队列健康，并在恰当时机发起 CSAT —— 数据驱动的持续改进。\"}, kpis:[{num:\"85%\",cap:{pt:\"retenção\",en:\"retention\",zh:\"留存率\"}},{num:\"+26\",cap:{pt:\"NPS\",en:\"NPS\",zh:\"NPS\"}}]}\n  ]},\n  {hue:\"#ff4d9e\", name:{pt:\"Varejo & E-commerce\",en:\"Retail & E-commerce\",zh:\"零售与电商\"}, tagline:{pt:\"Da vitrine ao ERP: experiências de compra sob medida, com os dados reais do seu e-commerce. Cada peça, um módulo Data².\",en:\"From storefront to ERP: tailor-made buying experiences, with your e-commerce's real data. Each piece, a Data² module.\",zh:\"从门店到 ERP：量身定制的购物体验，用你电商的真实数据驱动。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m6\", label:{pt:\"Catálogo\",en:\"Catalog\",zh:\"目录\"}, title:{pt:\"Experiências de catálogo e produto\",en:\"Catalog & product experiences\",zh:\"目录与商品体验\"}, desc:{pt:\"Vitrines, páginas de produto e coleções montadas pela área — com o catálogo real, sempre sincronizado.\",en:\"Storefronts, product pages and collections built by the team — with the real catalog, always in sync.\",zh:\"由业务团队搭建的门店、商品页与专题 —— 使用真实目录，始终同步。\"}, points:[{pt:\"Páginas de produto sobre catálogo real\",en:\"Product pages over the real catalog\",zh:\"基于真实目录的商品页\"},{pt:\"Coleções e curadoria pela área\",en:\"Collections and curation by the team\",zh:\"由团队策划专题与选品\"},{pt:\"Busca e filtros configuráveis\",en:\"Configurable search and filters\",zh:\"可配置搜索与筛选\"},{pt:\"Publicação sem depender de TI\",en:\"Publish without depending on IT\",zh:\"发布无需依赖 IT\"}], oldModel:{pt:\"Cada campanha depende da fila de TI; a vitrine nunca acompanha o momento.\",en:\"Every campaign waits in the IT queue; the storefront never keeps up with the moment.\",zh:\"每次活动都要排 IT 队列；门店永远跟不上节奏。\"}, withData2:{pt:\"A área publica a vitrine que quiser, na hora, com o dado real.\",en:\"The team publishes any storefront it wants, instantly, with real data.\",zh:\"团队即时发布想要的门店，用真实数据。\"}, kpis:[{num:\"live\",cap:{pt:\"catálogo sincronizado\",en:\"catalog in sync\",zh:\"目录实时同步\"}}]},\n    {motif:\"m1\", label:{pt:\"VTEX / GraphQL\",en:\"VTEX / GraphQL\",zh:\"VTEX / GraphQL\"}, title:{pt:\"Integração VTEX / GraphQL\",en:\"VTEX / GraphQL integration\",zh:\"VTEX / GraphQL 集成\"}, desc:{pt:\"Conexão direta com a plataforma de e-commerce — produtos, preços e estoque ao vivo via GraphQL.\",en:\"Direct connection to the e-commerce platform — live products, prices and stock via GraphQL.\",zh:\"与电商平台直连 —— 通过 GraphQL 获取实时商品、价格与库存。\"}, points:[{pt:\"Cliente HTTP para VTEX / GraphQL\",en:\"HTTP client for VTEX / GraphQL\",zh:\"面向 VTEX / GraphQL 的 HTTP 客户端\"},{pt:\"Produtos, preços e estoque ao vivo\",en:\"Live products, prices and stock\",zh:\"实时商品、价格与库存\"},{pt:\"Parametrização de queries por variável\",en:\"Query parametrization by variable\",zh:\"按变量参数化查询\"},{pt:\"Cache e resiliência a falhas\",en:\"Caching and failure resilience\",zh:\"缓存与容错\"}], oldModel:{pt:\"Dados de produto colados à mão ou defasados — preço errado, venda perdida.\",en:\"Product data pasted by hand or stale — wrong price, lost sale.\",zh:\"商品数据靠手工粘贴或已过期 —— 价格出错、错失销售。\"}, withData2:{pt:\"Tudo ao vivo, direto da fonte — preço e estoque sempre certos.\",en:\"Everything live, straight from the source — price and stock always right.\",zh:\"一切实时、直取源头 —— 价格与库存始终准确。\"}, kpis:[{num:\"real-time\",cap:{pt:\"preço & estoque\",en:\"price & stock\",zh:\"价格与库存\"}}]},\n    {motif:\"m5\", label:{pt:\"Estúdio de foto\",en:\"Photo studio\",zh:\"影像工作室\"}, title:{pt:\"Estúdio de foto com AI\",en:\"AI photo studio\",zh:\"AI 影像工作室\"}, desc:{pt:\"Gere fotos de produto e cenas com AI — try-on, ângulos e catálogo, sem estúdio físico.\",en:\"Generate product photos and scenes with AI — try-on, angles and catalog, no physical studio.\",zh:\"用 AI 生成商品照片与场景 —— 试穿、角度与目录，无需实体影棚。\"}, points:[{pt:\"Geração de imagem por AI (multimodal)\",en:\"Image generation via AI (multimodal)\",zh:\"多模态 AI 图像生成\"},{pt:\"Try-on e cenas configuráveis\",en:\"Try-on and configurable scenes\",zh:\"试穿与可配置场景\"},{pt:\"Múltiplos ângulos a partir de uma foto\",en:\"Multiple angles from one photo\",zh:\"由一张照片生成多角度\"},{pt:\"Storage e distribuição de mídia (MEDIA)\",en:\"Media storage and distribution (MEDIA)\",zh:\"媒体存储与分发（MEDIA）\"}], oldModel:{pt:\"Cada foto exige estúdio, modelo e dias de produção — caro e lento.\",en:\"Every photo needs a studio, a model and days of production — costly and slow.\",zh:\"每张照片都需影棚、模特与数天制作 —— 昂贵又缓慢。\"}, withData2:{pt:\"Fotos de qualidade em minutos, a um custo marginal.\",en:\"Quality photos in minutes, at a marginal cost.\",zh:\"几分钟出高质量照片，成本极低。\"}, kpis:[{num:\"−90%\",cap:{pt:\"custo de produção\",en:\"production cost\",zh:\"制作成本\"}}]},\n    {motif:\"m3\", label:{pt:\"ERP & loja\",en:\"ERP & store\",zh:\"ERP 与门店\"}, title:{pt:\"ERP e operações de loja\",en:\"ERP & store operations\",zh:\"ERP 与门店运营\"}, desc:{pt:\"Estoque, pedidos, recebimento e produção — o ERP da operação de loja, feito sob medida.\",en:\"Stock, orders, receiving and production — the store operation's ERP, tailor-made.\",zh:\"库存、订单、收货与生产 —— 量身定制的门店运营 ERP。\"}, points:[{pt:\"Estoque e movimentações por local\",en:\"Stock and movements per location\",zh:\"按地点的库存与出入库\"},{pt:\"Pedidos de compra e recebimento\",en:\"Purchase orders and receiving\",zh:\"采购订单与收货\"},{pt:\"Ordens de produção e BOM\",en:\"Production orders and BOM\",zh:\"生产订单与 BOM\"},{pt:\"Fluxos e status configuráveis\",en:\"Configurable flows and statuses\",zh:\"可配置流程与状态\"}], oldModel:{pt:\"ERP genérico que não encaixa na operação — gambiarra em planilha por fora.\",en:\"A generic ERP that doesn't fit the operation — spreadsheet workarounds on the side.\",zh:\"通用 ERP 无法贴合运营 —— 只能在表格里打补丁。\"}, withData2:{pt:\"Um ERP que encaixa exatamente na sua operação — e evolui com ela.\",en:\"An ERP that fits your operation exactly — and evolves with it.\",zh:\"完全贴合你运营的 ERP —— 并随之进化。\"}, kpis:[{num:\"1\",cap:{pt:\"sistema da vitrine ao estoque\",en:\"system from storefront to stock\",zh:\"从门店到库存一体\"}}]}\n  ]},\n  {hue:\"#9b5cff\", name:{pt:\"Força de Vendas\",en:\"Sales Enablement\",zh:\"销售赋能\"}, tagline:{pt:\"Um copiloto de vendas que diz a cada vendedor a próxima melhor ação — em linguagem natural. Cada peça, um módulo Data².\",en:\"A sales copilot that tells each rep the next best action — in natural language. Each piece, a Data² module.\",zh:\"一个销售副驾，用自然语言告诉每位销售下一步的最佳行动。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m1\", label:{pt:\"Copiloto\",en:\"Copilot\",zh:\"副驾\"}, title:{pt:\"Copiloto de vendas em linguagem natural\",en:\"Sales copilot in natural language\",zh:\"自然语言销售副驾\"}, desc:{pt:\"O vendedor pergunta em português e o copiloto responde sobre carteira, clientes e metas — sobre o dado real.\",en:\"The rep asks in plain language and the copilot answers about portfolio, customers and targets — over real data.\",zh:\"销售用自然语言提问，副驾基于真实数据回答客户组合、客户与目标相关问题。\"}, points:[{pt:\"Chat sobre dado vivo da carteira\",en:\"Chat over the portfolio's live data\",zh:\"基于客户组合实时数据的聊天\"},{pt:\"Respostas com números e fontes\",en:\"Answers with numbers and sources\",zh:\"答案带数字与来源\"},{pt:\"Entende perguntas de negócio\",en:\"Understands business questions\",zh:\"理解业务问题\"},{pt:\"No celular, em campo\",en:\"On mobile, in the field\",zh:\"手机端、可在一线使用\"}], oldModel:{pt:\"O vendedor não acha o dado; ou espera BI, ou decide no escuro.\",en:\"The rep can't find the data; either waits for BI, or decides in the dark.\",zh:\"销售找不到数据；要么等 BI，要么摸黑决策。\"}, withData2:{pt:\"Pergunta e recebe na hora, em campo — decisão com base em dado.\",en:\"Ask and get it instantly, in the field — decisions based on data.\",zh:\"在一线即时提问即时得到答案 —— 基于数据决策。\"}, kpis:[{num:\"NL\",cap:{pt:\"pergunta em linguagem natural\",en:\"ask in natural language\",zh:\"自然语言提问\"}}]},\n    {motif:\"m6\", label:{pt:\"Próxima ação\",en:\"Next action\",zh:\"下一步\"}, title:{pt:\"Recomendação de próxima melhor ação\",en:\"Next-best-action recommendation\",zh:\"下一最佳行动推荐\"}, desc:{pt:\"O sistema aponta, por cliente, a próxima ação de maior retorno — quem visitar, o que oferecer, quando.\",en:\"The system points out, per customer, the next highest-return action — who to visit, what to offer, when.\",zh:\"系统针对每位客户指出回报最高的下一步行动 —— 拜访谁、推什么、何时。\"}, points:[{pt:\"Recomendação por cliente e momento\",en:\"Recommendation by customer and timing\",zh:\"按客户与时机推荐\"},{pt:\"Priorização por retorno esperado\",en:\"Prioritization by expected return\",zh:\"按预期回报排序\"},{pt:\"Regras e modelos configuráveis\",en:\"Configurable rules and models\",zh:\"可配置规则与模型\"},{pt:\"Ação a um clique do copiloto\",en:\"Action one click from the copilot\",zh:\"从副驾一键行动\"}], oldModel:{pt:\"Todo cliente tratado igual; o vendedor gasta tempo onde não rende.\",en:\"Every customer treated the same; the rep spends time where it doesn't pay.\",zh:\"所有客户一视同仁；销售把时间花在不出成果的地方。\"}, withData2:{pt:\"Cada visita mira o cliente e a oferta de maior retorno.\",en:\"Every visit targets the customer and offer with the highest return.\",zh:\"每次拜访都瞄准回报最高的客户与方案。\"}, kpis:[{num:\"+20%\",cap:{pt:\"conversão\",en:\"conversion\",zh:\"转化率\"}}]},\n    {motif:\"m2\", label:{pt:\"Busca com AI\",en:\"AI search\",zh:\"AI 搜索\"}, title:{pt:\"Busca de clientes e segmentos com AI\",en:\"AI search over customers & segments\",zh:\"面向客户与细分的 AI 搜索\"}, desc:{pt:\"'Me mostre clientes que compraram X e sumiram' — a AI monta o segmento na hora, sem SQL.\",en:\"'Show me customers who bought X and vanished' — AI builds the segment instantly, no SQL.\",zh:\"'找出买过 X 后消失的客户' —— AI 即时生成细分，无需 SQL。\"}, points:[{pt:\"Segmentação por linguagem natural\",en:\"Segmentation by natural language\",zh:\"自然语言细分\"},{pt:\"Busca semântica sobre a base\",en:\"Semantic search over the base\",zh:\"对客户库的语义搜索\"},{pt:\"Salva e reusa segmentos\",en:\"Save and reuse segments\",zh:\"保存并复用细分\"},{pt:\"Aciona ondas de contato a partir do segmento\",en:\"Trigger contact waves from a segment\",zh:\"从细分触发联系波次\"}], oldModel:{pt:\"Segmentar exige o time de dados e um SQL — dias para uma lista.\",en:\"Segmenting needs the data team and SQL — days for a list.\",zh:\"细分需要数据团队与 SQL —— 一张名单要等数天。\"}, withData2:{pt:\"A força monta o segmento em segundos, com uma frase.\",en:\"The field builds the segment in seconds, with one sentence.\",zh:\"一线用一句话数秒生成细分。\"}, kpis:[{num:\"0\",cap:{pt:\"SQL necessário\",en:\"SQL required\",zh:\"无需 SQL\"}}]},\n    {motif:\"m4\", label:{pt:\"Performance\",en:\"Performance\",zh:\"业绩\"}, title:{pt:\"Painéis de performance da carteira\",en:\"Portfolio performance dashboards\",zh:\"客户组合业绩仪表盘\"}, desc:{pt:\"Metas, ranking e evolução da carteira ao vivo — para o vendedor e para o gestor, na mesma fonte.\",en:\"Targets, ranking and portfolio evolution live — for the rep and the manager, from the same source.\",zh:\"目标、排名与客户组合演变实时呈现 —— 销售与管理者共用同一数据源。\"}, points:[{pt:\"Metas e realizado por vendedor\",en:\"Target vs actual per rep\",zh:\"每位销售目标 vs 实际\"},{pt:\"Ranking e evolução no tempo\",en:\"Ranking and evolution over time\",zh:\"排名与时间演变\"},{pt:\"Drill-down por cliente e produto\",en:\"Drill-down by customer and product\",zh:\"按客户与商品下钻\"},{pt:\"Mesmo dado para campo e gestão\",en:\"Same data for field and management\",zh:\"一线与管理同源数据\"}], oldModel:{pt:\"Cada um com sua planilha; gestor e vendedor discutem número, não cliente.\",en:\"Everyone with their own spreadsheet; manager and rep argue over numbers, not customers.\",zh:\"各持一张表格；管理者与销售争论数字，而非客户。\"}, withData2:{pt:\"Uma fonte só, ao vivo — a conversa vira sobre o cliente.\",en:\"One live source — the conversation shifts to the customer.\",zh:\"唯一实时数据源 —— 对话回归客户本身。\"}, kpis:[{num:\"1\",cap:{pt:\"fonte de verdade\",en:\"source of truth\",zh:\"唯一真相源\"}}]},\n    {motif:\"m5\", label:{pt:\"Conteúdo com AI\",en:\"AI content\",zh:\"AI 内容\"}, title:{pt:\"Geração de conteúdo e imagem com AI\",en:\"AI content & image generation\",zh:\"AI 内容与图像生成\"}, desc:{pt:\"O vendedor gera o material de vendas — texto e imagem — no tom da marca, na hora do contato.\",en:\"The rep generates sales material — text and image — in the brand's tone, at the moment of contact.\",zh:\"销售即时生成销售素材 —— 文本与图像 —— 契合品牌语气。\"}, points:[{pt:\"Geração de texto e imagem por AI\",en:\"AI text and image generation\",zh:\"AI 文本与图像生成\"},{pt:\"No tom e na identidade da marca\",en:\"In the brand's tone and identity\",zh:\"契合品牌语气与识别\"},{pt:\"Personalizado por cliente\",en:\"Personalized per customer\",zh:\"按客户个性化\"},{pt:\"Pronto para enviar em qualquer canal\",en:\"Ready to send on any channel\",zh:\"随时可在任一渠道发送\"}], oldModel:{pt:\"Material genérico do marketing, desatualizado — o vendedor improvisa.\",en:\"Generic, outdated marketing material — the rep improvises.\",zh:\"市场部的通用素材已过时 —— 销售只能临场发挥。\"}, withData2:{pt:\"Conteúdo sob medida na hora, sempre na marca.\",en:\"Tailored content on the spot, always on brand.\",zh:\"即时定制内容，始终契合品牌。\"}, kpis:[{num:\"1\",cap:{pt:\"clique para o material\",en:\"click to material\",zh:\"一键出素材\"}}]}\n  ]},\n  {hue:\"#84e05a\", name:{pt:\"BI & Analytics\",en:\"BI & Analytics\",zh:\"商业智能与分析\"}, tagline:{pt:\"Do dado vivo ao plano de ação — painéis que a área lê e age, sem exportar pra planilha. Cada peça, um módulo Data².\",en:\"From live data to an action plan — dashboards the team reads and acts on, no spreadsheet export. Each piece, a Data² module.\",zh:\"从实时数据到行动计划 —— 业务团队看得懂、能行动的仪表盘，无需导出表格。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m4\", label:{pt:\"Painéis\",en:\"Dashboards\",zh:\"仪表盘\"}, title:{pt:\"Painéis executivos sobre dado vivo\",en:\"Executive dashboards on live data\",zh:\"基于实时数据的高管仪表盘\"}, desc:{pt:\"KPIs, tendências e drill-down sobre o dado vivo da operação — não um print de ontem.\",en:\"KPIs, trends and drill-down over the operation's live data — not a screenshot from yesterday.\",zh:\"基于运营实时数据的 KPI、趋势与下钻 —— 而非昨天的截图。\"}, points:[{pt:\"KPIs e tendências ao vivo\",en:\"Live KPIs and trends\",zh:\"实时 KPI 与趋势\"},{pt:\"Drill-down por dimensão\",en:\"Drill-down by dimension\",zh:\"按维度下钻\"},{pt:\"Painéis por perfil de usuário\",en:\"Dashboards by user profile\",zh:\"按用户画像定制仪表盘\"},{pt:\"Renderização no servidor (SSR), rápida\",en:\"Server-side rendering (SSR), fast\",zh:\"服务端渲染（SSR），快速\"}], oldModel:{pt:\"Relatório em PDF que nasce velho; decisão sobre foto do passado.\",en:\"A PDF report born stale; decisions on a photo of the past.\",zh:\"生来就过时的 PDF 报表；对着过去的快照做决策。\"}, withData2:{pt:\"Painel vivo, sempre atual — decisão sobre o agora.\",en:\"A live panel, always current — decisions on the now.\",zh:\"实时面板、始终最新 —— 对着当下做决策。\"}, kpis:[{num:\"live\",cap:{pt:\"dado sempre atual\",en:\"always-current data\",zh:\"数据始终最新\"}}]},\n    {motif:\"m1\", label:{pt:\"Ingestão\",en:\"Ingestion\",zh:\"数据接入\"}, title:{pt:\"Ingestão diária automatizada\",en:\"Automated daily ingestion\",zh:\"每日自动数据接入\"}, desc:{pt:\"O Rush puxa e consolida os dados todo dia — de Databricks, APIs e planilhas — sem ninguém apertar botão.\",en:\"Rush pulls and consolidates the data every day — from Databricks, APIs and spreadsheets — with no one pressing a button.\",zh:\"Rush 每天自动拉取并整合数据 —— 来自 Databricks、API 与表格 —— 无需任何人点按钮。\"}, points:[{pt:\"Agendadores (Rush) diários\",en:\"Daily schedulers (Rush)\",zh:\"每日调度器（Rush）\"},{pt:\"Fontes: Databricks, APIs, planilhas\",en:\"Sources: Databricks, APIs, spreadsheets\",zh:\"数据源：Databricks、API、表格\"},{pt:\"Consolidação e limpeza automática\",en:\"Automatic consolidation and cleanup\",zh:\"自动整合与清洗\"},{pt:\"Logs e reprocessamento de falhas\",en:\"Logs and failure reprocessing\",zh:\"日志与失败重跑\"}], oldModel:{pt:\"Alguém baixa, junta e corrige planilhas toda manhã — e às vezes esquece.\",en:\"Someone downloads, merges and fixes spreadsheets every morning — and sometimes forgets.\",zh:\"每天早上有人下载、合并并修正表格 —— 有时还会忘。\"}, withData2:{pt:\"Os dados chegam prontos todo dia, sozinhos.\",en:\"The data arrives ready every day, on its own.\",zh:\"数据每天自动就绪。\"}, kpis:[{num:\"0\",cap:{pt:\"trabalho manual diário\",en:\"daily manual work\",zh:\"每日手工\"}}]},\n    {motif:\"m3\", label:{pt:\"Metas & plano\",en:\"Targets & plan\",zh:\"目标与计划\"}, title:{pt:\"Metas e plano de ação acompanhados\",en:\"Targets & action plan tracked\",zh:\"目标与行动计划全程追踪\"}, desc:{pt:\"Metas por área e um plano de ação vivo — cada iniciativa com dono, prazo e status, sobre o mesmo dado.\",en:\"Targets per area and a live action plan — each initiative with owner, deadline and status, over the same data.\",zh:\"按部门设定目标 + 实时行动计划 —— 每项举措都有负责人、期限与状态，同源数据。\"}, points:[{pt:\"Metas por área e período\",en:\"Targets by area and period\",zh:\"按部门与周期设目标\"},{pt:\"Plano de ação com dono e prazo\",en:\"Action plan with owner and deadline\",zh:\"含负责人与期限的行动计划\"},{pt:\"Status e progresso ao vivo\",en:\"Live status and progress\",zh:\"实时状态与进度\"},{pt:\"Ligação direta metas ↔ dado\",en:\"Direct link targets ↔ data\",zh:\"目标与数据直接挂钩\"}], oldModel:{pt:\"Metas numa apresentação e plano num e-mail — ninguém acompanha até o fim do tri.\",en:\"Targets in a slide and plan in an email — no one tracks until quarter-end.\",zh:\"目标在幻灯片、计划在邮件 —— 无人跟进，直到季度末。\"}, withData2:{pt:\"Meta, plano e dado num lugar só — acompanhamento contínuo.\",en:\"Target, plan and data in one place — continuous tracking.\",zh:\"目标、计划与数据合一 —— 持续跟进。\"}, kpis:[{num:\"1\",cap:{pt:\"lugar para meta e ação\",en:\"place for target and action\",zh:\"目标与行动一处\"}}]},\n    {motif:\"m8\", label:{pt:\"Alertas\",en:\"Alerts\",zh:\"告警\"}, title:{pt:\"Alertas e monitoramento\",en:\"Alerts & monitoring\",zh:\"告警与监控\"}, desc:{pt:\"Regras que vigiam o dado e avisam na hora — por WhatsApp, e-mail ou no painel — quando algo sai do trilho.\",en:\"Rules that watch the data and warn instantly — via WhatsApp, email or in the panel — when something goes off track.\",zh:\"规则守护数据并即时预警 —— 通过 WhatsApp、邮件或面板 —— 一旦偏离轨道即刻通知。\"}, points:[{pt:\"Regras de alerta por limite/variação\",en:\"Alert rules by threshold/variation\",zh:\"按阈值/波动的告警规则\"},{pt:\"Notificação em WhatsApp, e-mail, painel\",en:\"Notification via WhatsApp, email, panel\",zh:\"WhatsApp、邮件、面板通知\"},{pt:\"Detecção de anomalia\",en:\"Anomaly detection\",zh:\"异常检测\"},{pt:\"Histórico e reconhecimento de alertas\",en:\"Alert history and acknowledgment\",zh:\"告警历史与确认\"}], oldModel:{pt:\"O problema só aparece no relatório do mês seguinte — tarde demais.\",en:\"The problem only shows up in next month's report — too late.\",zh:\"问题直到下月报表才浮现 —— 为时已晚。\"}, withData2:{pt:\"O sistema avisa na hora — a área age antes de virar prejuízo.\",en:\"The system warns instantly — the team acts before it becomes a loss.\",zh:\"系统即时预警 —— 团队在其造成损失前行动。\"}, kpis:[{num:\"real-time\",cap:{pt:\"alerta na hora\",en:\"instant alert\",zh:\"即时告警\"}}]}\n  ]},\n  {hue:\"#ff6a4d\", name:{pt:\"Seguros & CX\",en:\"Insurance & CX\",zh:\"保险与客户体验\"}, tagline:{pt:\"Atendimento que responde na fonte certa — base de conhecimento com busca semântica e triagem por AI. Cada peça, um módulo Data².\",en:\"Support that answers from the right source — a semantic knowledge base with AI triage. Each piece, a Data² module.\",zh:\"从正确来源作答的客服 —— 配备语义知识库与 AI 分流。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m2\", label:{pt:\"Base semântica\",en:\"Semantic KB\",zh:\"语义知识库\"}, title:{pt:\"Base de conhecimento com busca semântica\",en:\"Semantic-search knowledge base\",zh:\"语义搜索知识库\"}, desc:{pt:\"Apólices, cláusulas e FAQs indexadas por significado — encontra a resposta certa mesmo sem a palavra exata.\",en:\"Policies, clauses and FAQs indexed by meaning — finds the right answer even without the exact word.\",zh:\"保单、条款与 FAQ 按语义索引 —— 即使措辞不同也能找到正确答案。\"}, points:[{pt:\"Indexação por embeddings (semantic search)\",en:\"Embedding indexing (semantic search)\",zh:\"向量索引（语义搜索）\"},{pt:\"Busca por significado, não palavra-chave\",en:\"Search by meaning, not keyword\",zh:\"按语义而非关键词搜索\"},{pt:\"Fontes versionadas e atualizáveis\",en:\"Versioned, updatable sources\",zh:\"可版本化、可更新的来源\"},{pt:\"Cobertura multilíngue\",en:\"Multilingual coverage\",zh:\"多语言覆盖\"}], oldModel:{pt:\"O atendente caça em PDFs e intranet — resposta lenta e às vezes errada.\",en:\"The agent hunts through PDFs and the intranet — slow answers, sometimes wrong.\",zh:\"坐席在 PDF 与内网里翻找 —— 回答缓慢，有时出错。\"}, withData2:{pt:\"A resposta certa aparece na hora, ancorada na fonte oficial.\",en:\"The right answer appears instantly, grounded in the official source.\",zh:\"正确答案即时呈现，源自官方来源。\"}, kpis:[{num:\"semantic\",cap:{pt:\"busca por significado\",en:\"search by meaning\",zh:\"按语义搜索\"}}]},\n    {motif:\"m1\", label:{pt:\"Triagem\",en:\"Triage\",zh:\"分流\"}, title:{pt:\"Triagem e atendimento com AI\",en:\"AI triage & support\",zh:\"AI 分流与客服\"}, desc:{pt:\"A AI entende o pedido — sinistro, dúvida, 2ª via — resolve o simples e encaminha o resto com contexto.\",en:\"AI understands the request — claim, question, reissue — resolves the simple and routes the rest with context.\",zh:\"AI 理解诉求 —— 理赔、咨询、补发 —— 解决简单问题，其余带上下文分流。\"}, points:[{pt:\"Detecção de intenção e caso de uso\",en:\"Intent and use-case detection\",zh:\"意图与用例识别\"},{pt:\"Resolução automática do simples\",en:\"Automatic resolution of the simple\",zh:\"简单诉求自动解决\"},{pt:\"Roteamento com contexto para o humano\",en:\"Context-rich routing to a human\",zh:\"带上下文转人工\"},{pt:\"Leitura de documentos do segurado\",en:\"Reading the insured's documents\",zh:\"识别投保人文档\"}], oldModel:{pt:\"Todo pedido vira fila humana; o segurado espera por qualquer coisa.\",en:\"Every request becomes a human queue; the insured waits for anything.\",zh:\"所有诉求都进人工队列；投保人事事都要等。\"}, withData2:{pt:\"A AI resolve na hora o que dá e prioriza o que precisa de gente.\",en:\"AI instantly resolves what it can and prioritizes what needs a human.\",zh:\"AI 能解决的即时解决，需人工的优先处理。\"}, kpis:[{num:\"−50%\",cap:{pt:\"tempo de resposta\",en:\"response time\",zh:\"响应时间\"}}]},\n    {motif:\"m3\", label:{pt:\"Ancorada na fonte\",en:\"Grounded\",zh:\"源自原文\"}, title:{pt:\"Respostas ancoradas na fonte\",en:\"Answers grounded in the source\",zh:\"答案有据可依，源自原文\"}, desc:{pt:\"Toda resposta cita a cláusula ou o documento de origem — nada de 'a AI inventou'.\",en:\"Every answer cites the source clause or document — no 'the AI made it up'.\",zh:\"每个答案都引用来源条款或文档 —— 杜绝'AI 编造'。\"}, points:[{pt:\"Citação da fonte em cada resposta\",en:\"Source citation in every answer\",zh:\"每个答案标注来源\"},{pt:\"Rastreabilidade cláusula → resposta\",en:\"Traceability clause → answer\",zh:\"条款→答案可追溯\"},{pt:\"Redução de alucinação (grounding)\",en:\"Hallucination reduction (grounding)\",zh:\"降低幻觉（grounding）\"},{pt:\"Conformidade e auditoria\",en:\"Compliance and audit\",zh:\"合规与审计\"}], oldModel:{pt:\"Resposta sem lastro vira risco jurídico e retrabalho.\",en:\"An unsupported answer becomes legal risk and rework.\",zh:\"无依据的回答带来法律风险与返工。\"}, withData2:{pt:\"Cada resposta é rastreável à fonte — confiável e auditável.\",en:\"Every answer is traceable to the source — trustworthy and auditable.\",zh:\"每个答案都可追溯到来源 —— 可信、可审计。\"}, kpis:[{num:\"100%\",cap:{pt:\"respostas com fonte\",en:\"answers with a source\",zh:\"答案均有来源\"}}]},\n    {motif:\"m7\", label:{pt:\"Analytics\",en:\"Analytics\",zh:\"分析\"}, title:{pt:\"Analytics de atendimento\",en:\"Support analytics\",zh:\"客服分析\"}, desc:{pt:\"Volume, temas, resolução e satisfação — para melhorar a base e o atendimento continuamente.\",en:\"Volume, topics, resolution and satisfaction — to continuously improve the base and the service.\",zh:\"工单量、主题、解决率与满意度 —— 持续改进知识库与服务。\"}, points:[{pt:\"Métricas de volume e resolução\",en:\"Volume and resolution metrics\",zh:\"工单量与解决率指标\"},{pt:\"Lacunas na base de conhecimento\",en:\"Knowledge-base gaps\",zh:\"知识库缺口\"},{pt:\"Satisfação (CSAT) por tema\",en:\"Satisfaction (CSAT) by topic\",zh:\"按主题的满意度（CSAT）\"},{pt:\"Alertas de pico e degradação\",en:\"Spike and degradation alerts\",zh:\"峰值与劣化告警\"}], oldModel:{pt:\"Não se sabe o que a base não cobre; os mesmos erros se repetem.\",en:\"No one knows what the base doesn't cover; the same errors repeat.\",zh:\"无人知晓知识库遗漏了什么；同样的错误反复出现。\"}, withData2:{pt:\"Os dados mostram as lacunas — a base melhora sozinha, com curadoria.\",en:\"The data shows the gaps — the base improves with curation.\",zh:\"数据揭示缺口 —— 知识库在策展中持续改善。\"}, kpis:[{num:\"+CSAT\",cap:{pt:\"satisfação medida\",en:\"satisfaction measured\",zh:\"满意度可量\"}}]}\n  ]},\n  {hue:\"#e8e84d\", name:{pt:\"Compras & Procurement\",en:\"Procurement\",zh:\"采购\"}, tagline:{pt:\"Excelência em compras: modelagem financeira e planejamento de fornecimento, simulados em minutos. Cada peça, um módulo Data².\",en:\"Procurement excellence: financial modeling and supply planning, simulated in minutes. Each piece, a Data² module.\",zh:\"采购卓越：财务建模与供应规划，几分钟即可模拟完成。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m3\", label:{pt:\"Planejamento\",en:\"Planning\",zh:\"规划\"}, title:{pt:\"Planejamento de fornecimento\",en:\"Supply planning\",zh:\"供应规划\"}, desc:{pt:\"Consolida demanda, contratos e capacidade de fornecedores num plano de fornecimento — sobre o dado real.\",en:\"Consolidates demand, contracts and supplier capacity into a supply plan — over real data.\",zh:\"将需求、合同与供应商产能整合成供应计划 —— 基于真实数据。\"}, points:[{pt:\"Demanda e contratos consolidados\",en:\"Consolidated demand and contracts\",zh:\"整合需求与合同\"},{pt:\"Capacidade e lead time por fornecedor\",en:\"Capacity and lead time per supplier\",zh:\"每供应商产能与交期\"},{pt:\"Plano de fornecimento priorizado\",en:\"Prioritized supply plan\",zh:\"有优先级的供应计划\"},{pt:\"Sobre o dado real (data lake)\",en:\"Over real data (data lake)\",zh:\"基于真实数据（数据湖）\"}], oldModel:{pt:\"Plano em planilha que não fala com contrato nem com estoque real.\",en:\"A spreadsheet plan that talks to neither the contract nor the real stock.\",zh:\"表格里的计划既不对接合同也不对接真实库存。\"}, withData2:{pt:\"Um plano vivo, ligado a contrato, demanda e capacidade.\",en:\"A live plan, linked to contract, demand and capacity.\",zh:\"一份实时计划，联通合同、需求与产能。\"}, kpis:[{num:\"1\",cap:{pt:\"plano sobre dado real\",en:\"plan on real data\",zh:\"基于真实数据的计划\"}}]},\n    {motif:\"m8\", label:{pt:\"Modelagem\",en:\"Modeling\",zh:\"建模\"}, title:{pt:\"Modelagem financeira de cenários\",en:\"Financial scenario modeling\",zh:\"财务情景建模\"}, desc:{pt:\"Modele o impacto financeiro de cada decisão de compra — preço, câmbio, volume — antes de assinar.\",en:\"Model the financial impact of each purchasing decision — price, FX, volume — before signing.\",zh:\"在签约前对每项采购决策的财务影响建模 —— 价格、汇率、数量。\"}, points:[{pt:\"Modelo financeiro por cenário\",en:\"Financial model per scenario\",zh:\"按情景的财务模型\"},{pt:\"Sensibilidade a preço, câmbio e volume\",en:\"Sensitivity to price, FX and volume\",zh:\"对价格、汇率、数量的敏感性\"},{pt:\"Comparação de fornecedores e prazos\",en:\"Comparison of suppliers and terms\",zh:\"供应商与条款对比\"},{pt:\"Números auditáveis\",en:\"Auditable numbers\",zh:\"可审计的数字\"}], oldModel:{pt:\"Modelo financeiro numa planilha frágil que só uma pessoa entende.\",en:\"A financial model in a fragile spreadsheet only one person understands.\",zh:\"脆弱表格里的财务模型，只有一个人看得懂。\"}, withData2:{pt:\"Modelo robusto e auditável — qualquer cenário em minutos.\",en:\"A robust, auditable model — any scenario in minutes.\",zh:\"稳健可审计的模型 —— 任何情景几分钟出结果。\"}, kpis:[{num:\"MM\",cap:{pt:\"economizados por mês\",en:\"saved per month\",zh:\"每月节省\"}}]},\n    {motif:\"m5\", label:{pt:\"Simuladores\",en:\"Simulators\",zh:\"模拟器\"}, title:{pt:\"Simuladores e croquis de decisão\",en:\"Decision simulators & builders\",zh:\"决策模拟器与构建器\"}, desc:{pt:\"A área monta seus próprios simuladores de decisão — sem código — e testa alternativas na hora.\",en:\"The team builds its own decision simulators — no code — and tests alternatives on the spot.\",zh:\"业务团队无代码搭建自己的决策模拟器 —— 即时测试各种方案。\"}, points:[{pt:\"Simuladores montados pela área (no-code)\",en:\"Simulators built by the team (no-code)\",zh:\"由团队搭建的模拟器（无代码）\"},{pt:\"Parâmetros e regras ajustáveis\",en:\"Adjustable parameters and rules\",zh:\"可调参数与规则\"},{pt:\"Resultado visual imediato\",en:\"Immediate visual result\",zh:\"即时可视化结果\"},{pt:\"Compartilháveis com stakeholders\",en:\"Shareable with stakeholders\",zh:\"可与相关方共享\"}], oldModel:{pt:\"Cada análise depende de um especialista e de uma planilha nova.\",en:\"Every analysis depends on a specialist and a new spreadsheet.\",zh:\"每次分析都依赖一位专家与一张新表格。\"}, withData2:{pt:\"A área simula sozinha e decide na hora, com confiança.\",en:\"The team simulates on its own and decides on the spot, with confidence.\",zh:\"团队自主模拟、即时决策，充满信心。\"}, kpis:[{num:\"0\",cap:{pt:\"código para simular\",en:\"code to simulate\",zh:\"模拟无需代码\"}}]},\n    {motif:\"m1\", label:{pt:\"Orientado a dado\",en:\"Data-driven\",zh:\"数据驱动\"}, title:{pt:\"Compras orientadas a dado\",en:\"Data-driven sourcing\",zh:\"数据驱动的采购\"}, desc:{pt:\"Cada decisão de compra apoiada em dado — histórico, mercado e performance de fornecedor.\",en:\"Every purchasing decision backed by data — history, market and supplier performance.\",zh:\"每项采购决策都有数据支撑 —— 历史、市场与供应商表现。\"}, points:[{pt:\"Histórico de compras e preços\",en:\"Purchase and price history\",zh:\"采购与价格历史\"},{pt:\"Performance e risco de fornecedor\",en:\"Supplier performance and risk\",zh:\"供应商表现与风险\"},{pt:\"Recomendação de melhor opção\",en:\"Best-option recommendation\",zh:\"最优选项推荐\"},{pt:\"Trilha de decisão auditável\",en:\"Auditable decision trail\",zh:\"可审计的决策链路\"}], oldModel:{pt:\"Decisão de compra no relacionamento e no achismo — dinheiro na mesa.\",en:\"Purchasing by relationship and gut feel — money left on the table.\",zh:\"凭关系与直觉采购 —— 白白流失利润。\"}, withData2:{pt:\"Decisão com dado — melhor preço, melhor fornecedor, rastreável.\",en:\"Decisions with data — best price, best supplier, traceable.\",zh:\"用数据决策 —— 最优价格、最优供应商、可追溯。\"}, kpis:[{num:\"−%\",cap:{pt:\"custo de aquisição\",en:\"acquisition cost\",zh:\"采购成本\"}}]}\n  ]}\n];\n    var uni = root.querySelector(\"#uni\");\n    var uniScroll = uni ? uni.querySelector(\".uni-scroll\") : null;\n    var uniBody = root.querySelector(\"#uniBody\");\n    var gcards = root.querySelectorAll(\".gcard\");\n    var currentUni = -1;\n    function L(o){ if(!o) return \"\"; return lang===\"zh\" ? (o.zh||o.en||o.pt||\"\") : (o[lang]||o.en||o.pt||\"\"); }\n    var UNI_META = {\n      eyebrow:{pt:\"Universo\",en:\"Universe\",zh:\"宇宙\"},\n      hint:{pt:\"Passe o mouse · clique um componente · role\",en:\"Hover · click a component · scroll\",zh:\"悬停 · 点击组件 · 下滚\"},\n      old:{pt:\"O modelo não digitalizado\",en:\"The non-digitized model\",zh:\"未数字化的模式\"},\n      wd:{pt:\"Com Data²\",en:\"With Data²\",zh:\"有了 Data²\"},\n      moreH:{pt:\"E isso é só o começo. <em>Qualquer coisa</em> pode ser construída.\",en:\"And this is just the start. <em>Anything</em> can be built.\",zh:\"而这只是开始。<em>任何东西</em>都能被构建。\"},\n      moreP:{pt:\"Cada componente aqui é um módulo Data². Precisa de algo que ainda não existe? A gente constrói — no mesmo sistema, com o mesmo dado.\",en:\"Every component here is a Data² module. Need something that doesn't exist yet? We build it — same system, same data.\",zh:\"这里的每个组件都是一个 Data² 模块。需要尚不存在的东西？我们构建它 —— 同一系统，同一数据。\"},\n      demo:{pt:\"Agendar uma demo\",en:\"Book a demo\",zh:\"预约演示\"}\n    };\n    function uniLayout(u){\n      if(u.layout) return u.layout;\n      var n=u.comps.length, pts=[], pad=40, spanX=(820-100)-pad*2;\n      for(var i=0;i<n;i++){ var fx=n>1?i/(n-1):0.5; pts.push([Math.round(pad+fx*spanX), i%2===0?60:210]); }\n      return pts;\n    }\n    function esc(s){ return String(s); }\n    function parseIso(text){\n      var spec={cell:50,hue:\"#4ddfe6\",blocks:[],wires:[]};\n      (text||\"\").split(\"\\n\").forEach(function(ln){\n        ln=ln.trim(); if(!ln||ln.charAt(0)===\"#\") return;\n        if(ln.indexOf(\"hue \")===0){ spec.hue=ln.slice(4).trim(); return; }\n        if(ln.indexOf(\"cell \")===0){ spec.cell=+ln.slice(5)||50; return; }\n        var w=ln.match(/^([\\w-]+)\\s*->\\s*([\\w-]+)(.*)$/);\n        if(w){ var wi={from:w[1],to:w[2],flow:/\\bflow\\b/.test(w[3])}; var du=w[3].match(/dur:([\\d.]+)/); if(du)wi.dur=+du[1]; var wh=w[3].match(/#([0-9a-fA-F]{3,8})/); if(wh)wi.hue=\"#\"+wh[1]; spec.wires.push(wi); return; }\n        var m=ln.match(/^([\\w-]+)\\s+@(-?\\d+),(-?\\d+)(.*)$/);\n        if(m){ var b={id:m[1],at:[+m[2],+m[3]]}; var rest=m[4]||\"\";\n          var hh=rest.match(/\\bh(\\d+)/); b.h=hh?+hh[1]:1;\n          var an=rest.match(/\\b(float|pulse|bob)\\b/); if(an)b.anim=an[1];\n          var lb=rest.match(/\"([^\"]*)\"/); if(lb)b.label=lb[1];\n          var hu=rest.match(/#([0-9a-fA-F]{3,8})/); if(hu)b.hue=\"#\"+hu[1];\n          if(/\\bwin\\b/.test(rest)) b.detail=\"win\";\n          spec.blocks.push(b);\n        }\n      });\n      return spec;\n    }\n    function isoScene(spec){\n      var s=spec.cell||50, hw=s/2, q=s/4, fh=s*0.5;\n      var minX=1e9,maxX=-1e9,minY=1e9,maxY=-1e9, anchors={}, blocks=[];\n      spec.blocks.forEach(function(b,i){\n        var c=b.at[0], r=b.at[1], h=b.h||1;\n        var X=(c-r)*hw, Ybase=(c+r)*q, topY=Ybase-h*fh, hue=b.hue||spec.hue;\n        anchors[b.id!=null?b.id:i]={x:X,y:topY};\n        blocks.push({b:b,X:X,Ybase:Ybase,topY:topY,h:h,hue:hue,i:i});\n        if(X-hw<minX)minX=X-hw; if(X+hw>maxX)maxX=X+hw;\n        if(topY-q<minY)minY=topY-q; if(Ybase+q+22>maxY)maxY=Ybase+q+22;\n      });\n      var out=\"\";\n      (spec.wires||[]).forEach(function(w){\n        var a=anchors[w.from], z=anchors[w.to]; if(!a||!z) return;\n        var d=\"M\"+a.x.toFixed(1)+\",\"+a.y.toFixed(1)+\" L\"+z.x.toFixed(1)+\",\"+z.y.toFixed(1);\n        out+='<path class=\"iso-wire\" d=\"'+d+'\" style=\"--h:'+(w.hue||spec.hue)+'\"></path>';\n        if(w.flow) out+='<circle class=\"iso-flow\" r=\"3.2\" style=\"--h:'+(w.hue||spec.hue)+'\"><animateMotion dur=\"'+(w.dur||2.6)+'s\" repeatCount=\"indefinite\" path=\"'+d+'\"></animateMotion></circle>';\n      });\n      blocks.sort(function(p,q2){return p.Ybase-q2.Ybase});\n      blocks.forEach(function(bl){\n        var X=bl.X,topY=bl.topY,h=bl.h,hue=bl.hue,b=bl.b;\n        var top=[X+\",\"+(topY-q),(X+hw)+\",\"+topY,X+\",\"+(topY+q),(X-hw)+\",\"+topY].join(\" \");\n        var left=[(X-hw)+\",\"+topY,X+\",\"+(topY+q),X+\",\"+(topY+q+h*fh),(X-hw)+\",\"+(topY+h*fh)].join(\" \");\n        var right=[(X+hw)+\",\"+topY,X+\",\"+(topY+q),X+\",\"+(topY+q+h*fh),(X+hw)+\",\"+(topY+h*fh)].join(\" \");\n        var cls=\"iso-blk\"+(b.anim?(\" iso-\"+b.anim):\"\")+(b.dataI!=null?\" comp\":\"\");\n        var di=(b.dataI!=null?' data-i=\"'+b.dataI+'\"':'');\n        var g='<g class=\"'+cls+'\"'+di+' style=\"--h:'+hue+';animation-delay:'+(-bl.i*0.4).toFixed(2)+'s\">';\n        g+='<polygon class=\"fl\" points=\"'+left+'\"></polygon><polygon class=\"fr\" points=\"'+right+'\"></polygon><polygon class=\"ft\" points=\"'+top+'\"></polygon>';\n        for(var k=1;k<h;k++){ var yy=topY+k*fh; g+='<line class=\"seam\" x1=\"'+(X-hw)+'\" y1=\"'+yy+'\" x2=\"'+X+'\" y2=\"'+(yy+q)+'\"></line><line class=\"seam\" x1=\"'+X+'\" y1=\"'+(yy+q)+'\" x2=\"'+(X+hw)+'\" y2=\"'+yy+'\"></line>'; }\n        if(b.detail===\"win\"){ g+='<line class=\"det\" x1=\"'+(X-hw*0.5)+'\" y1=\"'+(topY-q*0.1)+'\" x2=\"'+(X+hw*0.1)+'\" y2=\"'+(topY+q*0.4)+'\"></line><line class=\"det\" x1=\"'+(X-hw*0.15)+'\" y1=\"'+(topY-q*0.4)+'\" x2=\"'+(X+hw*0.5)+'\" y2=\"'+(topY+q*0.1)+'\"></line>'; }\n        g+='</g>';\n        out+=g;\n        if(b.label) out+='<text class=\"iso-lbl\" x=\"'+X.toFixed(1)+'\" y=\"'+(bl.Ybase+q+18).toFixed(1)+'\">'+b.label+'</text>';\n      });\n      var pad=34, vbx=(minX-pad), vby=(minY-pad), vbw=(maxX-minX)+pad*2, vbh=(maxY-minY)+pad*2;\n      if(!isFinite(vbw)||vbw<=0) return '<svg class=\"iso-svg\" viewBox=\"0 0 100 100\"></svg>';\n      return '<svg class=\"iso-svg\" viewBox=\"'+vbx.toFixed(1)+\" \"+vby.toFixed(1)+\" \"+vbw.toFixed(1)+\" \"+vbh.toFixed(1)+'\" preserveAspectRatio=\"xMidYMid meet\">'+out+'</svg>';\n    }\n    function sceneFor(u){\n      if(u.scene) return u.scene;\n      var n=u.comps.length, anims=[\"float\",\"pulse\",\"bob\"], heights=[2,3,1,2,4,2], lines=[\"hue \"+u.hue,\"cell 52\"];\n      for(var i=0;i<n;i++){ var col=i*2, row=(i%2===0)?0:2, h=heights[i%heights.length], anim=anims[i%3], win=(i%2===0)?\" win\":\"\"; lines.push(i+\" @\"+col+\",\"+row+\" h\"+h+\" \"+anim+win); }\n      for(var jj=1;jj<n;jj++){ lines.push((jj-1)+\" -> \"+jj+\" flow\"); }\n      return lines.join(\"\\n\");\n    }\n    function isoMini(u,j){\n      var a=[\"float\",\"pulse\",\"bob\"][j%3], b2=[\"pulse\",\"bob\",\"float\"][j%3];\n      var dsl=\"hue \"+u.hue+\"\\ncell 44\\na @0,0 h2 \"+a+\" win\\nb @2,1 h1 \"+b2+\"\\na -> b flow\";\n      return isoScene(parseIso(dsl));\n    }\n    // === isolab neon renderer (ported verbatim, namespaced *2) ===\n    var ICONS2={\n      chat:'<path class=\"ic\" d=\"M4 6a2 2 0 012-2h12a2 2 0 012 2v6a2 2 0 01-2 2H9l-4 3v-3H6a2 2 0 01-2-2z\"></path>',\n      ai:'<path class=\"ic\" d=\"M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z\"></path>',\n      user:'<circle class=\"ic\" cx=\"12\" cy=\"8\" r=\"3.2\"></circle><path class=\"ic\" d=\"M5.5 20c0-3.6 3-6 6.5-6s6.5 2.4 6.5 6\"></path>',\n      screen:'<rect class=\"ic\" x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\"></rect><path class=\"ic\" d=\"M8 20h8M12 16v4\"></path>',\n      gear:'<circle class=\"ic\" cx=\"12\" cy=\"12\" r=\"3\"></circle><path class=\"ic\" d=\"M12 3.5v3M12 17.5v3M3.5 12h3M17.5 12h3M6 6l2 2M16 16l2 2M18 6l-2 2M8 16l-2 2\"></path>',\n      bolt:'<path class=\"ic\" d=\"M13 3L5 13h6l-1 8 8-11h-6z\"></path>',\n      plug:'<path class=\"ic\" d=\"M9 3v4M15 3v4M7 7h10v2a5 5 0 01-10 0zM12 16v5\"></path>',\n      db:'<ellipse class=\"ic\" cx=\"12\" cy=\"6\" rx=\"7\" ry=\"2.6\"></ellipse><path class=\"ic\" d=\"M5 6v12c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6V6\"></path><path class=\"ic\" d=\"M5 12c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6\"></path>',\n      chart:'<path class=\"ic\" d=\"M4 20h16M7 20v-6M12 20V8M17 20v-9\"></path>',\n      doc:'<path class=\"ic\" d=\"M7 3h7l4 4v14H7z\"></path><path class=\"ic\" d=\"M14 3v4h4M10 12h5M10 16h5\"></path>',\n      shield:'<path class=\"ic\" d=\"M12 3l7 3v6c0 4.8-3.4 7.8-7 9-3.6-1.2-7-4.2-7-9V6z\"></path>',\n      cart:'<circle class=\"ic\" cx=\"9.5\" cy=\"20\" r=\"1.3\"></circle><circle class=\"ic\" cx=\"17\" cy=\"20\" r=\"1.3\"></circle><path class=\"ic\" d=\"M3 4h2.5l2.2 11h9.8l1.8-8H7\"></path>',\n      node:'<circle class=\"ic\" cx=\"5\" cy=\"12\" r=\"2\"></circle><circle class=\"ic\" cx=\"19\" cy=\"6\" r=\"2\"></circle><circle class=\"ic\" cx=\"19\" cy=\"18\" r=\"2\"></circle><path class=\"ic\" d=\"M6.8 11l10.4-4M6.8 13l10.4 4\"></path>'\n    };\n    function parseIso2(text){\n      var spec={cell:50,hue:\"#4ddfe6\",blocks:[],wires:[],context:false};\n      (text||\"\").split(\"\\n\").forEach(function(ln){\n        ln=ln.trim(); if(!ln||ln.charAt(0)===\"#\") return;\n        if(ln.indexOf(\"hue \")===0){ spec.hue=ln.slice(4).trim(); return; }\n        if(ln.indexOf(\"cell \")===0){ spec.cell=+ln.slice(5)||50; return; }\n        if(ln===\"context\"||ln.indexOf(\"context \")===0){ spec.context=true; return; }\n        var w=ln.match(/^([\\w-]+)\\s*->\\s*([\\w-]+)(.*)$/);\n        if(w){ var wi={from:w[1],to:w[2],flow:/\\bflow\\b/.test(w[3])}; var du=w[3].match(/dur:([\\d.]+)/); if(du)wi.dur=+du[1]; var wh=w[3].match(/#([0-9a-fA-F]{3,8})/); if(wh)wi.hue=\"#\"+wh[1]; spec.wires.push(wi); return; }\n        var m=ln.match(/^([\\w-]+)\\s+@(-?\\d+),(-?\\d+)(.*)$/);\n        if(m){ var b={id:m[1],at:[+m[2],+m[3]]}; var rest=m[4]||\"\";\n          var hh=rest.match(/\\bh(\\d+)/); b.h=hh?+hh[1]:1;\n          var an=rest.match(/\\b(float|pulse|bob)\\b/); if(an)b.anim=an[1];\n          var lb=rest.match(/\"([^\"]*)\"/); if(lb)b.label=lb[1];\n          var hu=rest.match(/#([0-9a-fA-F]{3,8})/); if(hu)b.hue=\"#\"+hu[1];\n          if(/\\bwin\\b/.test(rest)) b.detail=\"win\";\n          var sh=rest.match(/\\bshape:(\\w+)/); if(sh)b.shape=sh[1];\n          var ic=rest.match(/\\bicon:([a-z]+)/); if(ic)b.icon=ic[1];\n          var cp=rest.match(/\\bcomp:(\\d+)/); if(cp)b.dataI=+cp[1];\n          spec.blocks.push(b);\n        }\n      });\n      return spec;\n    }\n    function poly2(a){ return a.map(function(p){return p[0].toFixed(1)+\",\"+p[1].toFixed(1)}).join(\" \"); }\n    function shapeGeo2(shape,X,topY,Ybase,hw,q,H){\n      var g={faces:[],edges:\"\",topC:[X,topY],floor:[X,Ybase,hw*1.3,q*1.25],contact:[X,Ybase,hw*0.95,q*0.85]};\n      function seg(a,b){ return \"M\"+a[0].toFixed(1)+\",\"+a[1].toFixed(1)+\" L\"+b[0].toFixed(1)+\",\"+b[1].toFixed(1)+\" \"; }\n      if(shape===\"cyl\"){\n        var bot=topY+H;\n        var body=\"M\"+(X-hw)+\",\"+topY+\" L\"+(X-hw)+\",\"+bot+\" A\"+hw+\",\"+q+\" 0 0 0 \"+(X+hw)+\",\"+bot+\" L\"+(X+hw)+\",\"+topY+\" A\"+hw+\",\"+q+\" 0 0 1 \"+(X-hw)+\",\"+topY+\" Z\";\n        var topE=\"M\"+(X-hw)+\",\"+topY+\" A\"+hw+\",\"+q+\" 0 1 0 \"+(X+hw)+\",\"+topY+\" A\"+hw+\",\"+q+\" 0 1 0 \"+(X-hw)+\",\"+topY+\" Z\";\n        g.faces.push({cls:\"fl\",d:body});\n        g.faces.push({cls:\"ft\",d:topE});\n        g.edges=topE+\" M\"+(X-hw)+\",\"+topY+\" L\"+(X-hw)+\",\"+bot+\" M\"+(X+hw)+\",\"+topY+\" L\"+(X+hw)+\",\"+bot+\" M\"+(X-hw)+\",\"+bot+\" A\"+hw+\",\"+q+\" 0 0 0 \"+(X+hw)+\",\"+bot;\n        g.floor=[X,bot,hw*1.2,q*1.15]; g.contact=[X,bot,hw*0.9,q*0.78];\n        return g;\n      }\n      if(shape===\"pyr\"){\n        var apex=[X,topY],pl=[X-hw,Ybase],pf=[X,Ybase+q],pr=[X+hw,Ybase];\n        g.faces.push({cls:\"fl\",pts:[apex,pl,pf]});\n        g.faces.push({cls:\"fr\",pts:[apex,pf,pr]});\n        g.edges=seg(apex,pl)+seg(apex,pf)+seg(apex,pr)+seg(pl,pf)+seg(pf,pr);\n        g.topC=[X,topY+(Ybase-topY)*0.42];\n        g.floor=[X,Ybase+q*0.2,hw*1.15,q*1.1]; g.contact=[X,Ybase+q*0.12,hw*0.8,q*0.7];\n        return g;\n      }\n      if(shape===\"hex\"){\n        var bt=topY+H;\n        var R=[X+hw,topY],TR=[X+hw*0.5,topY-q],TL=[X-hw*0.5,topY-q],L=[X-hw,topY],BL=[X-hw*0.5,topY+q],BR=[X+hw*0.5,topY+q];\n        var Ld=[X-hw,bt],BLd=[X-hw*0.5,bt+q],BRd=[X+hw*0.5,bt+q],Rd=[X+hw,bt];\n        g.faces.push({cls:\"ft\",pts:[R,TR,TL,L,BL,BR]});\n        g.faces.push({cls:\"fl\",pts:[L,BL,BLd,Ld]});\n        g.faces.push({cls:\"fm\",pts:[BL,BR,BRd,BLd]});\n        g.faces.push({cls:\"fr\",pts:[BR,R,Rd,BRd]});\n        g.edges=seg(R,TR)+seg(TR,TL)+seg(TL,L)+seg(L,BL)+seg(BL,BR)+seg(BR,R)+seg(L,Ld)+seg(BL,BLd)+seg(BR,BRd)+seg(R,Rd)+seg(Ld,BLd)+seg(BLd,BRd)+seg(BRd,Rd);\n        g.floor=[X,bt,hw*1.25,q*1.2]; g.contact=[X,bt,hw*0.95,q*0.82];\n        return g;\n      }\n      var T=[X,topY-q],Rr=[X+hw,topY],B=[X,topY+q],Ll=[X-hw,topY],fb=[X,topY+q+H],lb=[X-hw,topY+H],rb=[X+hw,topY+H];\n      g.faces.push({cls:\"ft\",pts:[T,Rr,B,Ll]});\n      g.faces.push({cls:\"fl\",pts:[Ll,B,fb,lb]});\n      g.faces.push({cls:\"fr\",pts:[Rr,B,fb,rb]});\n      g.edges=seg(T,Rr)+seg(Rr,B)+seg(B,Ll)+seg(Ll,T)+seg(Ll,lb)+seg(B,fb)+seg(Rr,rb)+seg(lb,fb)+seg(fb,rb);\n      g.floor=[X,topY+q+H,hw*1.3,q*1.25]; g.contact=[X,topY+q+H,hw*0.95,q*0.82];\n      return g;\n    }\n    function isoScene2(spec){\n      var s=spec.cell||50, hw=s/2, q=s/4, fh=s*0.5;\n      var minX=1e9,maxX=-1e9,minY=1e9,maxY=-1e9, anchors={}, blocks=[];\n      spec.blocks.forEach(function(b,i){\n        var c=b.at[0], r=b.at[1], h=b.h||1;\n        var X=(c-r)*hw, Ybase=(c+r)*q, topY=Ybase-h*fh, hue=b.hue||spec.hue;\n        anchors[b.id!=null?b.id:i]={x:X,y:topY};\n        blocks.push({b:b,X:X,Ybase:Ybase,topY:topY,h:h,hue:hue,i:i});\n        if(X-hw*1.3<minX)minX=X-hw*1.3; if(X+hw*1.3>maxX)maxX=X+hw*1.3;\n        if(topY-q<minY)minY=topY-q; if(Ybase+q+s*0.62+16>maxY)maxY=Ybase+q+s*0.62+16;\n      });\n      var minYb=1e9,maxYb=-1e9;\n      blocks.forEach(function(bl){ if(bl.Ybase<minYb)minYb=bl.Ybase; if(bl.Ybase>maxYb)maxYb=bl.Ybase; });\n      var GRID=\"\",GHOSTS=\"\";\n      if(blocks.length){\n        var _cs=spec.blocks.map(function(b){return b.at[0]}),_rs=spec.blocks.map(function(b){return b.at[1]});\n        var minC=Math.min.apply(null,_cs),maxC=Math.max.apply(null,_cs),minR=Math.min.apply(null,_rs),maxR=Math.max.apply(null,_rs);\n        var g0=minC-1,g1=maxC+1,r0=minR-1,r1=maxR+1;\n        var occ={}; spec.blocks.forEach(function(b){occ[b.at[0]+\"_\"+b.at[1]]=1;});\n        var maxCR=Math.max.apply(null,spec.blocks.map(function(b){return b.at[0]+b.at[1]}));\n        var sd=9176,rand=function(){ sd=(sd*1103515245+12345)&0x7fffffff; return sd/0x7fffffff; };\n        var gl=\"\";\n        for(var gc=g0;gc<=g1;gc++){ gl+=\"M\"+((gc-r0)*hw).toFixed(1)+\",\"+((gc+r0)*q).toFixed(1)+\" L\"+((gc-r1)*hw).toFixed(1)+\",\"+((gc+r1)*q).toFixed(1)+\" \"; }\n        for(var gr=r0;gr<=r1;gr++){ gl+=\"M\"+((g0-gr)*hw).toFixed(1)+\",\"+((g0+gr)*q).toFixed(1)+\" L\"+((g1-gr)*hw).toFixed(1)+\",\"+((g1+gr)*q).toFixed(1)+\" \"; }\n        GRID='<path class=\"grid\" style=\"--h:'+spec.hue+'\" d=\"'+gl+'\"></path>';\n        if(spec.context){\n          var gh=[];\n          for(var cc=g0;cc<=g1;cc++){ for(var rr=r0;rr<=r1;rr++){ if(occ[cc+\"_\"+rr]) continue; if(cc+rr>maxCR) continue; if(rand()>0.36) continue; gh.push({c:cc,r:rr,h:1+Math.floor(rand()*3)}); } }\n          gh.sort(function(a,b){return (a.c+a.r)-(b.c+b.r)});\n          gh.forEach(function(o){ var X=(o.c-o.r)*hw,Ybase=(o.c+o.r)*q,topY=Ybase-o.h*fh,H=o.h*fh; var geo=shapeGeo2(\"cube\",X,topY,Ybase,hw,q,H); var gg='<g class=\"ghost\" style=\"--h:'+spec.hue+'\">'; geo.faces.forEach(function(f){ gg+='<polygon class=\"gface\" points=\"'+poly2(f.pts)+'\"></polygon>'; }); gg+='<path class=\"gedge\" d=\"'+geo.edges+'\"></path></g>'; GHOSTS+=gg; if(X-hw<minX)minX=X-hw; if(X+hw>maxX)maxX=X+hw; if(topY-q<minY)minY=topY-q; if(Ybase+q>maxY)maxY=Ybase+q; });\n        }\n        var _xs=[(g0-r0)*hw,(g0-r1)*hw,(g1-r0)*hw,(g1-r1)*hw];\n        minX=Math.min(minX,Math.min.apply(null,_xs)); maxX=Math.max(maxX,Math.max.apply(null,_xs));\n        minY=Math.min(minY,(g0+r0)*q-q); maxY=Math.max(maxY,(g1+r1)*q+q);\n      }\n      var DEFS='<defs><radialGradient id=\"shG\"><stop offset=\"0\" stop-color=\"#000\" stop-opacity=\".55\"/><stop offset=\".72\" stop-color=\"#000\" stop-opacity=\".16\"/><stop offset=\"1\" stop-color=\"#000\" stop-opacity=\"0\"/></radialGradient></defs>';\n      var out=GRID+GHOSTS;\n      (spec.wires||[]).forEach(function(w){\n        var a=anchors[w.from], z=anchors[w.to]; if(!a||!z) return;\n        var d=\"M\"+a.x.toFixed(1)+\",\"+a.y.toFixed(1)+\" L\"+z.x.toFixed(1)+\",\"+z.y.toFixed(1);\n        out+='<path class=\"iso-wire\" style=\"--h:'+(w.hue||spec.hue)+'\" d=\"'+d+'\"></path>';\n        if(w.flow) out+='<circle class=\"iso-flow\" r=\"3.4\" style=\"--h:'+(w.hue||spec.hue)+'\"><animateMotion dur=\"'+(w.dur||2.6)+'s\" repeatCount=\"indefinite\" path=\"'+d+'\"></animateMotion></circle>';\n      });\n      blocks.sort(function(p,q2){return p.Ybase-q2.Ybase});\n      blocks.forEach(function(bl){\n        var X=bl.X,topY=bl.topY,Ybase=bl.Ybase,h=bl.h,hue=bl.hue,b=bl.b,H=h*fh,i=bl.i;\n        var shape=b.shape||\"cube\";\n        var geo=shapeGeo2(shape,X,topY,Ybase,hw,q,H);\n        var dep=maxYb>minYb?(Ybase-minYb)/(maxYb-minYb):1, op=(0.78+0.22*dep).toFixed(3);\n        var mix=function(p,base){ return \"color-mix(in srgb,\"+hue+\" \"+p+\"%,\"+base+\")\"; };\n        var gd='<defs><linearGradient id=\"ftg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(42,\"#0d0e15\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(20,\"#08090f\")+'\"/></linearGradient><linearGradient id=\"flg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(24,\"#0a0b12\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(9,\"#050609\")+'\"/></linearGradient><linearGradient id=\"frg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(13,\"#08080e\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(4,\"#040406\")+'\"/></linearGradient><linearGradient id=\"fmg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(30,\"#0b0c13\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(12,\"#060710\")+'\"/></linearGradient><radialGradient id=\"glowG'+i+'\"><stop offset=\"0\" stop-color=\"'+hue+'\" stop-opacity=\".36\"/><stop offset=\"1\" stop-color=\"'+hue+'\" stop-opacity=\"0\"/></radialGradient></defs>';\n        var cls=\"iso-blk\"+(b.anim?(\" iso-\"+b.anim):\"\")+(b.dataI!=null?\" comp\":\"\");\n        var di=(b.dataI!=null?' data-i=\"'+b.dataI+'\"':'');\n        var g='<g class=\"'+cls+'\"'+di+' style=\"--h:'+hue+';opacity:'+op+';animation-delay:'+(-i*0.4).toFixed(2)+'s\">'+gd;\n        g+='<ellipse class=\"contact\" fill=\"url(#shG)\" cx=\"'+geo.contact[0].toFixed(1)+'\" cy=\"'+geo.contact[1].toFixed(1)+'\" rx=\"'+geo.contact[2].toFixed(1)+'\" ry=\"'+geo.contact[3].toFixed(1)+'\"></ellipse>';\n        g+='<ellipse class=\"floor-glow\" fill=\"url(#glowG'+i+')\" cx=\"'+geo.floor[0].toFixed(1)+'\" cy=\"'+geo.floor[1].toFixed(1)+'\" rx=\"'+geo.floor[2].toFixed(1)+'\" ry=\"'+geo.floor[3].toFixed(1)+'\"></ellipse>';\n        geo.faces.forEach(function(f){ var fill=\"url(#\"+f.cls+\"g\"+i+\")\"; if(f.d) g+='<path class=\"face\" fill=\"'+fill+'\" d=\"'+f.d+'\"></path>'; else g+='<polygon class=\"face\" fill=\"'+fill+'\" points=\"'+poly2(f.pts)+'\"></polygon>'; });\n        if(shape===\"cube\"&&h>1){ for(var k=1;k<h;k++){ var yy=topY+k*fh; g+='<line class=\"det\" x1=\"'+(X-hw)+'\" y1=\"'+yy+'\" x2=\"'+X+'\" y2=\"'+(yy+q)+'\"></line><line class=\"det\" x1=\"'+X+'\" y1=\"'+(yy+q)+'\" x2=\"'+(X+hw)+'\" y2=\"'+yy+'\"></line>'; } }\n        if(b.detail===\"win\"&&shape===\"cube\"){\n          for(var o2=fh*0.5;o2<H;o2+=fh){ g+='<line class=\"det\" x1=\"'+(X-hw)+'\" y1=\"'+(topY+o2)+'\" x2=\"'+X+'\" y2=\"'+(topY+q+o2)+'\"></line><line class=\"det\" x1=\"'+X+'\" y1=\"'+(topY+q+o2)+'\" x2=\"'+(X+hw)+'\" y2=\"'+(topY+o2)+'\"></line>'; }\n          g+='<line class=\"det\" x1=\"'+(X-hw*0.5)+'\" y1=\"'+(topY+q*0.5)+'\" x2=\"'+(X-hw*0.5)+'\" y2=\"'+(topY+q*0.5+H)+'\"></line><line class=\"det\" x1=\"'+(X+hw*0.5)+'\" y1=\"'+(topY+q*0.5)+'\" x2=\"'+(X+hw*0.5)+'\" y2=\"'+(topY+q*0.5+H)+'\"></line>';\n        }\n        g+='<path class=\"glow2\" d=\"'+geo.edges+'\"></path><path class=\"glow1\" d=\"'+geo.edges+'\"></path><path class=\"edge\" d=\"'+geo.edges+'\"></path><path class=\"core\" d=\"'+geo.edges+'\"></path>';\n        if(b.icon&&ICONS2[b.icon]){ var isc=(hw/30).toFixed(3); g+='<g class=\"iso-ic\" transform=\"translate('+geo.topC[0].toFixed(1)+','+geo.topC[1].toFixed(1)+') scale('+isc+') matrix(1,0.5,-1,0.5,0,0) translate(-12,-12)\">'+ICONS2[b.icon]+'</g>'; }\n        g+='</g>';\n        out+=g;\n        if(b.label){ var lf=Math.max(10,Math.round(s*0.26)); var lw=(b.label.length*lf*0.6+18); var ly=(Ybase+q+lf+12); out+='<rect class=\"lbl-bg\" x=\"'+(X-lw/2).toFixed(1)+'\" y=\"'+(ly-lf*0.85).toFixed(1)+'\" width=\"'+lw.toFixed(1)+'\" height=\"'+(lf*1.7).toFixed(1)+'\" rx=\"'+(lf*0.85).toFixed(1)+'\"></rect><text class=\"iso-lbl\" x=\"'+X.toFixed(1)+'\" y=\"'+ly.toFixed(1)+'\" style=\"font-size:'+lf+'px\">'+b.label+'</text>'; }\n      });\n      var pad=42, vbx=(minX-pad), vby=(minY-pad), vbw=(maxX-minX)+pad*2, vbh=(maxY-minY)+pad*2;\n      var sd2=4231,rnd=function(){ sd2=(sd2*1103515245+12345)&0x7fffffff; return sd2/0x7fffffff; };\n      for(var di2=0;di2<14;di2++){ out+='<circle class=\"dust\" cx=\"'+(vbx+rnd()*vbw).toFixed(1)+'\" cy=\"'+(vby+rnd()*vbh).toFixed(1)+'\" r=\"'+(0.6+rnd()*1.5).toFixed(2)+'\" style=\"animation-delay:-'+(rnd()*6).toFixed(2)+'s;animation-duration:'+(5+rnd()*6).toFixed(2)+'s\"></circle>'; }\n      if(!isFinite(vbw)||vbw<=0) return '<svg class=\"iso-svg\" viewBox=\"0 0 100 100\"></svg>';\n      return '<svg class=\"iso-svg\" viewBox=\"'+vbx.toFixed(1)+\" \"+vby.toFixed(1)+\" \"+vbw.toFixed(1)+\" \"+vbh.toFixed(1)+'\" preserveAspectRatio=\"xMidYMid meet\">'+DEFS+out+'</svg>';\n    }\n    var ICON_MAP2=[\n      [/webchat|widget/i,\"chat\"],\n      [/transbordo|handoff|humano|human|\\bsso\\b|identidade|onboard|colaborador|segurad/i,\"user\"],\n      [/\\bbot\\b|triag|copilot|copiloto|assistent|\\bai\\b|recomenda|next-best|semantic|semânt|busca|search/i,\"ai\"],\n      [/console|workspace|supervis|vitrine|storefront|catalog|catálogo|experiência/i,\"screen\"],\n      [/alerta|alert|evento|gatilho|monitor|anomal/i,\"bolt\"],\n      [/integr|vtex|graphql|connect|\\bapi\\b|outreach|ondas|waves|\\bcrm\\b/i,\"plug\"],\n      [/\\bsql\\b|data lake|knowledge|conhecimento|registry|banco|\\bbom\\b|estrutura|planejamento|supply|fornec/i,\"db\"],\n      [/score|analytics|performance|\\bbi\\b|painéis|painel|dashboard|metas|targets|modelagem|modeling|roi|financ|simulad|scenario|cenário/i,\"chart\"],\n      [/fila|queue|csat|automa|\\brush\\b|agendad|scheduler|regras|rules|fluxo|ingest/i,\"gear\"],\n      [/\\bocr\\b|leitura|documento|\\bdoc\\b|proposta|relatóri|export|planilha/i,\"doc\"],\n      [/segment|\\bnode\\b|\\bkb\\b/i,\"node\"],\n      [/foto|photo|imagem|image|estúdio|studio|conteúdo|content|mídia|media/i,\"screen\"],\n      [/erp|loja|store|compra|procurement|sourcing/i,\"cart\"]\n    ];\n    function pickIcon2(comp){\n      var s=((comp.title&&comp.title.en)||\"\")+\" \"+((comp.label&&comp.label.en)||\"\");\n      for(var i=0;i<ICON_MAP2.length;i++){ if(ICON_MAP2[i][0].test(s)) return ICON_MAP2[i][1]; }\n      return \"gear\";\n    }\n    function pickShape2(ic){\n      if(ic===\"db\") return \"cyl\";\n      if(ic===\"plug\"||ic===\"node\") return \"hex\";\n      if(ic===\"bolt\") return \"pyr\";\n      if(ic===\"gear\") return \"hex\";\n      return \"cube\";\n    }\n    var SYS_POS=[[-2,6],[2,6],[2,2],[6,2],[6,-2],[10,-2]];\n    var SYS_H=[2,3,1,2,3,2], SYS_AN=[\"float\",\"pulse\",\"bob\",\"float\",\"pulse\",\"bob\"];\n    function sysmapSpec(u){\n      var n=u.comps.length, lines=[\"hue \"+u.hue,\"cell 58\",\"context\"];\n      for(var i=0;i<n;i++){\n        var c=u.comps[i], ic=pickIcon2(c), sh=pickShape2(ic), p=SYS_POS[i%SYS_POS.length];\n        var lbl=String(L(c.label)||\"\").replace(/\"/g,\"\");\n        lines.push(\"c\"+i+\" @\"+p[0]+\",\"+p[1]+\" h\"+SYS_H[i%SYS_H.length]+\" \"+SYS_AN[i%SYS_AN.length]+\" shape:\"+sh+\" icon:\"+ic+\" comp:\"+i+' \"'+lbl+'\"');\n      }\n      for(var j=1;j<n;j++){ lines.push(\"c\"+(j-1)+\" -> c\"+j+\" flow\"); }\n      return lines.join(\"\\n\");\n    }\n    function detailSpec(u,c,j){\n      var ic=pickIcon2(c), sh=pickShape2(ic);\n      var a=[\"float\",\"pulse\",\"bob\"][j%3], b2=[\"pulse\",\"bob\",\"float\"][j%3];\n      var sh2=[\"hex\",\"cyl\",\"cube\",\"pyr\"][j%4], h1=[2,3,2][j%3];\n      var lines=[\"hue \"+u.hue,\"cell 48\"];\n      lines.push(\"m @0,0 h\"+h1+\" \"+a+\" shape:\"+sh+\" icon:\"+ic);\n      lines.push(\"s @2,1 h1 \"+b2+\" shape:\"+sh2);\n      lines.push(\"m -> s flow\");\n      return lines.join(\"\\n\");\n    }\n    var __dio = null;\n    function hxRgb(h){ h=(h||'#888888').replace('#',''); if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2]; return [parseInt(h.substr(0,2),16)/255,parseInt(h.substr(2,2),16)/255,parseInt(h.substr(4,2),16)/255]; }\n    function rgbHsl(r,g,b){ var mx=Math.max(r,g,b),mn=Math.min(r,g,b),h,s,l=(mx+mn)/2; if(mx===mn){h=0;s=0;} else { var d=mx-mn; s=l>0.5?d/(2-mx-mn):d/(mx+mn); h=(mx===r)?((g-b)/d+(g<b?6:0)):(mx===g)?((b-r)/d+2):((r-g)/d+4); h/=6; } return [h,s,l]; }\n    function hslRgb(h,s,l){ function f(p,q,t){ if(t<0)t+=1; if(t>1)t-=1; if(t<1/6)return p+(q-p)*6*t; if(t<1/2)return q; if(t<2/3)return p+(q-p)*(2/3-t)*6; return p; } if(s===0)return [l,l,l]; var q=l<0.5?l*(1+s):l+s-l*s,p=2*l-q; return [f(p,q,h+1/3),f(p,q,h),f(p,q,h-1/3)]; }\n    function neon(rgb,rotDeg,li){ var hsl=rgbHsl(rgb[0],rgb[1],rgb[2]); var h=(hsl[0]+(rotDeg||0)/360+1)%1; var s=Math.max(hsl[1],0.85); return hslRgb(h,s,li||0.6); }\n    function kanjiFor(c,i){ var key=((((c&&c.label&&c.label.en)||'')+' '+((c&&c.label&&c.label.pt)||'')).toLowerCase()); var MAP=[[['webchat','chat','conversa'],'会話'],[['triage','triagem','bot'],'分流'],[['handoff','transbordo'],'引継'],[['console'],'制御'],[['queue','fila'],'待列'],[['csat','satisf'],'満足'],[['analytic','analy','painel','dashboard','painéis'],'分析'],[['copilot','copiloto','assist','ai '],'知能'],[['search','busca'],'検索'],[['crm','outreach','cadência','lead'],'顧客'],[['sql','query'],'問合'],[['export','planilha','spreadsheet'],'出力'],[['rush','ingest'],'取込'],[['store','record','erp','estoque'],'記録'],[['rule','regra','score'],'規則'],[['bom','estrutura'],'展開'],[['photo','foto','image','imagem','conteúdo','content'],'生成'],[['catalog','catálogo','produto','product'],'商品'],[['vtex','graphql','integr'],'接続'],[['sso','auth','login'],'認証'],[['alert','monitor'],'警報'],[['target','meta','plan'],'目標'],[['scenario','cenário','simul','model'],'模擬'],[['omnichannel','onda','wave','canal'],'波信'],[['semant','semânt','conhecimento','ground','ancorada','fonte','kb'],'知識'],[['next','próxima','ação','action','performance'],'行動'],[['supply','fornecimento','planejamento'],'供給']]; for(var m=0;m<MAP.length;m++){ for(var w=0;w<MAP[m][0].length;w++){ if(key.indexOf(MAP[m][0][w])>=0) return MAP[m][1]; } } var pool=['都','光','夜','街','電','網','機','塔']; return pool[(i||0)%pool.length]; }\n\n    // ---- data-driven scene: each component => one neon building, tinted in the universe hue ----\n    function dioramaScene(u){\n      var boxes=[], sg=[], lamps=[], beacons=[];\n      var ground=[.11,.12,.15], roofC=[.15,.15,.19];\n      function bx(p,s,c,seed){ return {p:p,s:s,c:c,win:0,g:0,seed:seed||0}; }\n      function em(p,s,c){ return {p:p,s:s,c:c,win:2,g:0,seed:0}; }\n      function bld(p,s,tint,seed){ var t=tint||1.0; return {p:p,s:s,c:[0.26*t,0.25*t,0.31*t],win:1,g:0,seed:seed||0}; }\n      function grd(p,s){ return {p:p,s:s,c:ground,win:0,g:1,seed:0}; }\n      function roof(b,seed){ var ty=b.p[1]+b.s[1]/2; boxes.push(bx([b.p[0]-b.s[0]*0.18,ty+0.32,b.p[2]+b.s[2]*0.16],[b.s[0]*0.34,0.64,b.s[2]*0.34],roofC,seed)); boxes.push(bx([b.p[0]+b.s[0]*0.26,ty+0.75,b.p[2]-b.s[2]*0.2],[0.05,1.5,0.05],[.09,.09,.12],seed)); boxes.push(bx([b.p[0]+b.s[0]*0.12,ty+0.16,b.p[2]+b.s[2]*0.3],[b.s[0]*0.3,0.3,b.s[2]*0.22],roofC,seed)); beacons.push([b.p[0]+b.s[0]*0.26,ty+1.55,b.p[2]-b.s[2]*0.2]); }\n      function detail(b,seed){ var fz=b.p[2]+b.s[2]/2, base=b.p[1]-b.s[1]/2, cx=b.p[0]; boxes.push(em([cx,base+0.42,fz+0.04],[b.s[0]*0.66,0.52,0.04],[1.0,0.72,0.36])); boxes.push({p:[cx,base+0.66,fz+0.28],s:[b.s[0]*0.72,0.09,0.5],c:(seed>0.5?[.5,.12,.14]:[.12,.32,.18]),win:0,g:0,seed:0}); boxes.push(bx([cx-b.s[0]/2-0.11,base+b.s[1]*0.58,b.p[2]+0.35],[0.22,0.3,0.36],[.1,.1,.13],0)); boxes.push(bx([cx-b.s[0]/2-0.11,base+b.s[1]*0.34,b.p[2]-0.35],[0.2,0.26,0.32],[.1,.1,.13],0)); }\n      function lamp(x,zz){ boxes.push(bx([x,0.9,zz],[0.06,1.8,0.06],[.08,.08,.10],0)); boxes.push(bx([x-0.13,1.78,zz],[0.28,0.06,0.1],[.08,.08,.10],0)); boxes.push(em([x-0.24,1.72,zz],[0.14,0.1,0.14],[1.0,0.72,0.34])); lamps.push([x-0.2,1.45,zz]); }\n      function road(cx,cz,sx,sz){ boxes.push({p:[cx,0.02,cz],s:[sx,0.06,sz],c:[.05,.055,.075],win:0,g:0,seed:0}); }\n      function paint(cx,cz,sx,sz){ boxes.push({p:[cx,0.055,cz],s:[sx,0.02,sz],c:[.3,.31,.34],win:2,g:0,seed:0}); }\n      function vending(x,z,col){ boxes.push(bx([x,0.45,z],[0.5,0.9,0.42],[.08,.08,.1],0)); boxes.push(em([x,0.52,z+0.22],[0.36,0.64,0.03],col)); }\n      function figure(x,z){ boxes.push(bx([x,0.27,z],[0.16,0.42,0.14],[.05,.05,.07],0)); boxes.push(bx([x,0.55,z],[0.12,0.13,0.12],[.06,.06,.08],0)); }\n      function lanternWire(x1,x2,z,y,n,col){ boxes.push(bx([(x1+x2)*0.5,y+0.04,z],[Math.abs(x2-x1),0.02,0.02],[.06,.06,.07],0)); for(var i=0;i<n;i++){ var f=(i+0.5)/n; boxes.push(em([x1+(x2-x1)*f,y-Math.sin(f*3.14159)*0.3,z],[0.11,0.16,0.11],col)); } }\n      function onZ(b,hy,k,n,c,sc){ sc=sc||1; return {p:[b.p[0],b.p[1]-b.s[1]/2+hy*b.s[1],b.p[2]+b.s[2]/2+0.05],w:1.5*sc,h:1.0*sc,axis:'z',k:k,n:n,c:c,port:false}; }\n      function bladeZ(b,hy,k,n,c,sc){ sc=sc||1; return {p:[b.p[0]-b.s[0]*0.22,b.p[1]-b.s[1]/2+hy*b.s[1],b.p[2]+b.s[2]/2+0.5*sc],w:1.0*sc,h:2.0*sc,axis:'x',k:k,n:n,c:c,port:true}; }\n      // street framework (roads, curbs, crosswalk, lamps, L traffic-light pole) — matches engine coords so the animated heads align\n      boxes.push(grd([0,-0.3,1.0],[19,0.6,15]));\n      boxes.push({p:[0,0.06,1.0],s:[11,0.12,7],c:[.15,.16,.2],win:0,g:1,seed:0});\n      road(0,5.5,17,1.9); road(0,-3.5,17,1.9); road(-6.6,1.0,1.9,11); road(6.6,1.0,1.9,11);\n      boxes.push({p:[0,0.14,4.5],s:[11.2,0.06,0.16],c:[.22,.23,.28],win:0,g:0,seed:0});\n      boxes.push({p:[0,0.14,-2.5],s:[11.2,0.06,0.16],c:[.22,.23,.28],win:0,g:0,seed:0});\n      boxes.push({p:[-5.5,0.14,1.0],s:[0.16,0.06,7.2],c:[.22,.23,.28],win:0,g:0,seed:0});\n      boxes.push({p:[5.5,0.14,1.0],s:[0.16,0.06,7.2],c:[.22,.23,.28],win:0,g:0,seed:0});\n      for(var dx=-7.5;dx<=7.5;dx+=1.5){ paint(dx,5.5,0.6,0.08); paint(dx,-3.5,0.6,0.08); }\n      for(var dz=-3.5;dz<=5.5;dz+=1.5){ paint(-6.6,dz,0.08,0.6); paint(6.6,dz,0.08,0.6); }\n      for(var cz2=4.6;cz2<=6.4;cz2+=0.42) paint(-2.0,cz2,0.9,0.16);\n      lamp(-5.3,4.3); lamp(5.3,4.3); lamp(-5.3,-2.3); lamp(5.3,-2.3);\n      boxes.push(bx([-3.0,1.5,4.4],[0.1,3.0,0.1],[.06,.06,.08],0)); boxes.push(bx([-3.0,2.85,5.02],[0.1,0.1,1.3],[.05,.05,.07],0)); boxes.push(bx([-3.0,2.7,5.62],[0.2,0.44,0.16],[.04,.04,.06],0));\n      // buildings from components\n      var main=neon(hxRgb(u.hue),0,0.6), acc1=neon(hxRgb(u.hue),34,0.62), acc2=neon(hxRgb(u.hue),-30,0.6);\n      var accents=[main,main,acc1,main,acc2,acc1,main,acc2];\n      var slots=[[-3.5,0.4],[-1.1,1.7],[1.3,0.2],[3.6,1.5],[0.2,2.3],[-3.5,2.2],[2.0,2.6],[3.7,-0.5]];\n      var comps=u.comps||[];\n      function hash(i){ var xx=Math.sin(i*12.9898+4.7)*43758.5453; return xx-Math.floor(xx); }\n      for(var i=0;i<comps.length && i<slots.length;i++){\n        var c=comps[i], h1=hash(i), h2=hash(i+9.3);\n        var hgt=2.7+h1*2.1, w=1.55+h2*0.5;\n        var b=bld([slots[i][0], hgt/2, slots[i][1]],[w,hgt,w],(i%2?1.06:0.9), i*0.31);\n        boxes.push(b); roof(b, i*0.31); detail(b,(i%2)?1:0);\n        var lab=L(c.label)||(('0'+(i+1)).slice(-2)), kj=kanjiFor(c,i), col=accents[i%accents.length];\n        if(lab.length<=8 && hgt>3.4) sg.push(bladeZ(b,0.6,kj,lab,col,1.0));\n        else sg.push(onZ(b,0.62,kj,lab,col,0.98));\n      }\n      lanternWire(-5.2,5.2,4.35,2.5,7,[1.0,0.52,0.2]);\n      vending(-4.9,3.7,main); vending(4.7,-1.4,acc1);\n      figure(-2.2,3.95); figure(0.9,4.05);\n      return {boxes:boxes,signs:sg,lamps:lamps,beacons:beacons};\n    }\n\n    // ---- render core: inlined VERBATIM from the isoshader engine (lab UI stripped) ----\n    function mountDiorama(canvas, scene, opts){\n      opts=opts||{};\n      var gl=canvas.getContext('webgl2',{antialias:true,alpha:false,premultipliedAlpha:false});\n      if(!gl){ if(window.console)console.warn('[diorama] WebGL2 indisponivel'); return {destroy:function(){}}; }\n      var CJK='\"Hiragino Sans\",\"Hiragino Kaku Gothic ProN\",\"PingFang SC\",\"Noto Sans CJK JP\",\"Yu Gothic\",sans-serif';\n      var CUBE=[]; (function(){\n        var F=[\n          [[.5,-.5,-.5],[.5,.5,-.5],[.5,.5,.5],[.5,-.5,.5],[1,0,0]],\n          [[-.5,-.5,.5],[-.5,.5,.5],[-.5,.5,-.5],[-.5,-.5,-.5],[-1,0,0]],\n          [[-.5,.5,-.5],[-.5,.5,.5],[.5,.5,.5],[.5,.5,-.5],[0,1,0]],\n          [[-.5,-.5,.5],[-.5,-.5,-.5],[.5,-.5,-.5],[.5,-.5,.5],[0,-1,0]],\n          [[-.5,-.5,.5],[.5,-.5,.5],[.5,.5,.5],[-.5,.5,.5],[0,0,1]],\n          [[.5,-.5,-.5],[-.5,-.5,-.5],[-.5,.5,-.5],[.5,.5,-.5],[0,0,-1]]\n        ];\n        F.forEach(function(f){ [f[0],f[1],f[2],f[0],f[2],f[3]].forEach(function(v){ CUBE.push(v[0],v[1],v[2],f[4][0],f[4][1],f[4][2]); }); });\n      })();\n      function bx(p,s,c,seed){ return {p:p,s:s,c:c,win:0,g:0,seed:seed||0}; }\n      function em(p,s,c){ return {p:p,s:s,c:c,win:2,g:0,seed:0}; }\n      function car(boxes,x,zz,col,ax,dir){ ax=ax||'x'; dir=dir||1;\n        boxes.push(em([x,0.066,zz],[ax==='x'?1.4:0.86,0.02,ax==='x'?0.86:1.4],[.009,.009,.013]));\n        if(ax==='x'){\n          boxes.push(bx([x,0.26,zz],[1.0,0.26,0.52],col,0)); boxes.push(bx([x,0.48,zz],[0.52,0.22,0.48],[col[0]*0.55,col[1]*0.55,col[2]*0.6],0));\n          boxes.push(em([x+dir*0.47,0.28,zz],[0.06,0.12,0.44],[1.,0.95,0.72])); boxes.push(em([x-dir*0.47,0.28,zz],[0.06,0.1,0.44],[1.,0.18,0.12]));\n          boxes.push(bx([x-0.32,0.12,zz-0.29],[0.18,0.18,0.09],[.04,.04,.05],0)); boxes.push(bx([x-0.32,0.12,zz+0.29],[0.18,0.18,0.09],[.04,.04,.05],0)); boxes.push(bx([x+0.32,0.12,zz-0.29],[0.18,0.18,0.09],[.04,.04,.05],0)); boxes.push(bx([x+0.32,0.12,zz+0.29],[0.18,0.18,0.09],[.04,.04,.05],0));\n        } else {\n          boxes.push(bx([x,0.26,zz],[0.52,0.26,1.0],col,0)); boxes.push(bx([x,0.48,zz],[0.48,0.22,0.52],[col[0]*0.55,col[1]*0.55,col[2]*0.6],0));\n          boxes.push(em([x,0.28,zz+dir*0.47],[0.44,0.12,0.06],[1.,0.95,0.72])); boxes.push(em([x,0.28,zz-dir*0.47],[0.44,0.1,0.06],[1.,0.18,0.12]));\n          boxes.push(bx([x-0.29,0.12,zz-0.32],[0.09,0.18,0.18],[.04,.04,.05],0)); boxes.push(bx([x-0.29,0.12,zz+0.32],[0.09,0.18,0.18],[.04,.04,.05],0)); boxes.push(bx([x+0.29,0.12,zz-0.32],[0.09,0.18,0.18],[.04,.04,.05],0)); boxes.push(bx([x+0.29,0.12,zz+0.32],[0.09,0.18,0.18],[.04,.04,.05],0));\n        }\n      }\n      var RA=-6.6,RB=6.6,RF=5.5,RK=-3.5,L0=RB-RA,L1=RF-RK,L2=RB-RA,L3=RF-RK,RP=L0+L1+L2+L3;\n      function ringPos(d){ d=((d%RP)+RP)%RP;\n        if(d<L0) return [RA+d,RF,'x',1];\n        d-=L0; if(d<L1) return [RB,RF-d,'z',-1];\n        d-=L1; if(d<L2) return [RB-d,RK,'x',-1];\n        d-=L2; return [RA,RK+d,'z',1]; }\n\n      function sh(t,s){ var o=gl.createShader(t); gl.shaderSource(o,s); gl.compileShader(o); if(!gl.getShaderParameter(o,gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(o)); return o; }\n      function prog(vs,fs){ var p=gl.createProgram(); gl.attachShader(p,sh(gl.VERTEX_SHADER,vs)); gl.attachShader(p,sh(gl.FRAGMENT_SHADER,fs)); gl.linkProgram(p); if(!gl.getProgramParameter(p,gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(p)); return p; }\n      var VS=`#version 300 es\nlayout(location=0) in vec3 aPos; layout(location=1) in vec3 aNormal;\nlayout(location=2) in vec3 iPos; layout(location=3) in vec3 iSize; layout(location=4) in vec3 iCol; layout(location=5) in float iWin; layout(location=6) in float iSeed;\nuniform mat4 uVP;\nout vec3 vN; out vec3 vObj; out vec3 vCol; out float vWin; out vec3 vW; out float vSeed;\nvoid main(){ vec3 p=aPos*iSize+iPos; gl_Position=uVP*vec4(p,1.0); vN=aNormal; vObj=aPos*iSize; vCol=iCol; vWin=iWin; vW=p; vSeed=iSeed; }`;\n      var FS=`#version 300 es\nprecision highp float;\nin vec3 vN; in vec3 vObj; in vec3 vCol; in float vWin; in vec3 vW; in float vSeed;\nuniform float uWinI; uniform int uNL; uniform vec3 uLP[16]; uniform vec3 uLC[16];\nuniform sampler2D uShadow; uniform mat4 uLVP; uniform float uShAmt; uniform vec3 uLDir; uniform vec3 uEye;\nout vec4 O;\nfloat hash(vec2 p){ p=fract(p*vec2(123.34,456.21)); p+=dot(p,p+45.32); return fract(p.x*p.y); }\nfloat shadow(vec3 w){\n  vec4 lp=uLVP*vec4(w,1.0); vec3 c=lp.xyz/lp.w*0.5+0.5;\n  if(c.x<0.0||c.x>1.0||c.y<0.0||c.y>1.0||c.z>1.0) return 1.0;\n  float bias=0.0025, s=0.0, tx=1.0/1024.0;\n  for(int i=-1;i<=1;i++)for(int j=-1;j<=1;j++){ float d=texture(uShadow,c.xy+vec2(float(i),float(j))*tx).r; s+=(c.z-bias>d)?0.0:1.0; }\n  return s/9.0;\n}\nvoid main(){\n  if(vWin>1.5){ O=vec4(vCol*3.2,1.0); return; }\n  vec3 n=normalize(vN); vec3 an=abs(n);\n  float up=n.y*0.5+0.5;\n  vec3 amb=mix(vec3(0.018,0.022,0.038),vec3(0.08,0.11,0.19),up);\n  float face=(an.y>=an.x&&an.y>=an.z)?1.0:((an.x>an.z)?(n.x>0.0?0.92:0.72):(n.z>0.0?0.84:0.66));\n  float shf=mix(1.0-uShAmt,1.0,shadow(vW));\n  float ndl=max(dot(n,uLDir),0.0);\n  vec3 col=vCol*(amb*face + vec3(0.55,0.62,0.82)*ndl*shf)*1.3;\n  if(vWin>0.5) col*=0.82+0.18*smoothstep(0.0,4.0,vW.y);\n  if(vWin>0.5 && an.y<0.5){\n    vec2 uv=(an.x>0.5)? vObj.zy : vObj.xy;\n    vec2 cell=floor(uv/0.5); vec2 f=fract(uv/0.5);\n    float box=step(0.2,f.x)*step(f.x,0.8)*step(0.28,f.y)*step(f.y,0.86);\n    float h=hash(cell+vSeed*17.0+7.3);\n    float on=step(0.30+0.22*fract(vSeed*5.3),h);\n    float br=0.4+1.0*hash(cell+vSeed*9.0+3.1);\n    vec3 wc=mix(vec3(1.0,0.78,0.44),vec3(1.0,0.94,0.8),hash(cell+9.9));\n    col+=wc*box*on*br*uWinI;\n  }\n  for(int i=0;i<16;i++){ if(i>=uNL) break; vec3 dl=uLP[i]-vW; float d=length(dl); vec3 ld=dl/max(d,0.001); float at=1.0/(1.0+d*d*3.4); col+=uLC[i]*at*(0.28+0.72*max(dot(n,ld),0.0)); }\n  col=mix(col, vec3(0.02,0.028,0.055), (1.0-exp(-max(length(vW-uEye)-22.0,0.0)*0.03))*0.72);\n  O=vec4(col,1.0);\n}`;\n      var DVS=`#version 300 es\nlayout(location=0) in vec3 aPos; layout(location=2) in vec3 iPos; layout(location=3) in vec3 iSize;\nuniform mat4 uLVP;\nvoid main(){ gl_Position=uLVP*vec4(aPos*iSize+iPos,1.0); }`;\n      var DFS=`#version 300 es\nprecision highp float; void main(){}`;\n      var SVS=`#version 300 es\nlayout(location=0) in vec2 aPos; layout(location=1) in vec2 aUv;\nuniform mat4 uVP; uniform mat4 uModel; out vec2 vUv;\nvoid main(){ vUv=aUv; gl_Position=uVP*uModel*vec4(aPos,0.0,1.0); }`;\n      var SFS=`#version 300 es\nprecision highp float;\nin vec2 vUv; out vec4 O; uniform sampler2D uTex; uniform float uGlow;\nvoid main(){ vec4 t=texture(uTex,vUv); if(t.a<0.02) discard; O=vec4(t.rgb*uGlow, t.a); }`;\n      var PVS=`#version 300 es\nlayout(location=0) in vec2 aP; out vec2 vUv; void main(){ vUv=aP*0.5+0.5; gl_Position=vec4(aP,0.,1.); }`;\n      var BLURFS=`#version 300 es\nprecision highp float; in vec2 vUv; out vec4 O; uniform sampler2D uTex; uniform vec2 uDir; uniform float uBright;\nvoid main(){ float w[5]=float[5](0.227,0.194,0.121,0.054,0.016); vec3 c=texture(uTex,vUv).rgb*w[0];\n  for(int i=1;i<5;i++){ c+=texture(uTex,vUv+uDir*float(i)).rgb*w[i]; c+=texture(uTex,vUv-uDir*float(i)).rgb*w[i]; }\n  if(uBright>0.5){ float l=max(c.r,max(c.g,c.b)); c*=smoothstep(0.55,1.0,l); } O=vec4(c,1.); }`;\n      var COMPFS=`#version 300 es\nprecision highp float; in vec2 vUv; out vec4 O; uniform sampler2D uScene; uniform sampler2D uBloom; uniform float uBloomI,uExp,uSat;\nvec3 aces(vec3 x){ return clamp((x*(2.51*x+0.03))/(x*(2.43*x+0.59)+0.14),0.,1.); }\nfloat hash(vec2 p){ p=fract(p*vec2(123.34,456.21)); p+=dot(p,p+45.32); return fract(p.x*p.y); }\nvoid main(){\n  float ca=0.0016; vec3 s=vec3(texture(uScene,vUv+vec2(ca,0.)).r,texture(uScene,vUv).g,texture(uScene,vUv-vec2(ca,0.)).b), b=texture(uBloom,vUv).rgb;\n  vec3 col=aces((s+b*uBloomI)*uExp);\n  float lu=dot(col,vec3(.299,.587,.114));\n  col=mix(col*vec3(0.88,0.96,1.12), col*vec3(1.08,1.0,0.9), smoothstep(0.2,0.7,lu));\n  col=clamp((col-0.5)*1.12+0.5,0.0,1.0);\n  col=mix(vec3(lu),col,uSat); col+=vec3(0.006,0.011,0.02)*(1.0-col);\n  col+=vec3(0.4,0.5,0.72)*exp(-length((vUv-vec2(0.74,0.8))*vec2(1.0,1.25))*3.2)*0.13;\n  vec2 vg=vUv; col*=0.40+0.60*pow(16.0*vg.x*vg.y*(1.0-vg.x)*(1.0-vg.y),0.28);\n  col+=(hash(vUv*vec2(1600.,900.))-0.5)*0.012;\n  col=pow(max(col,0.),vec3(0.4545));\n  O=vec4(col,1.);\n}`;\n      var mainP, depthP, signP, blurP, compP;\n      try{ mainP=prog(VS,FS); depthP=prog(DVS,DFS); signP=prog(SVS,SFS); blurP=prog(PVS,BLURFS); compP=prog(PVS,COMPFS); }\n      catch(err){ if(window.console)console.error('[diorama] shader',(err&&err.message)||String(err)); return {destroy:function(){}}; }\n\n      var cubeVBO=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,cubeVBO); gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(CUBE),gl.STATIC_DRAW);\n      function instData(list){ var a=[]; list.forEach(function(o){ a.push(o.p[0],o.p[1],o.p[2],o.s[0],o.s[1],o.s[2],o.c[0],o.c[1],o.c[2],o.win,o.seed||0); }); return new Float32Array(a); }\n      function buildVAO(list){\n        var vao=gl.createVertexArray(); gl.bindVertexArray(vao);\n        gl.bindBuffer(gl.ARRAY_BUFFER,cubeVBO);\n        gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,3,gl.FLOAT,false,24,0);\n        gl.enableVertexAttribArray(1); gl.vertexAttribPointer(1,3,gl.FLOAT,false,24,12);\n        var ib=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,ib); gl.bufferData(gl.ARRAY_BUFFER,instData(list),gl.STATIC_DRAW);\n        var S=44;\n        gl.enableVertexAttribArray(2); gl.vertexAttribPointer(2,3,gl.FLOAT,false,S,0);  gl.vertexAttribDivisor(2,1);\n        gl.enableVertexAttribArray(3); gl.vertexAttribPointer(3,3,gl.FLOAT,false,S,12); gl.vertexAttribDivisor(3,1);\n        gl.enableVertexAttribArray(4); gl.vertexAttribPointer(4,3,gl.FLOAT,false,S,24); gl.vertexAttribDivisor(4,1);\n        gl.enableVertexAttribArray(5); gl.vertexAttribPointer(5,1,gl.FLOAT,false,S,36); gl.vertexAttribDivisor(5,1);\n        gl.enableVertexAttribArray(6); gl.vertexAttribPointer(6,1,gl.FLOAT,false,S,40); gl.vertexAttribDivisor(6,1);\n        gl.bindVertexArray(null);\n        return {vao:vao,n:list.length};\n      }\n      var SQ=new Float32Array([-.5,-.5,0,1, .5,-.5,1,1, .5,.5,1,0, -.5,-.5,0,1, .5,.5,1,0, -.5,.5,0,0]);\n      var sqVBO=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,sqVBO); gl.bufferData(gl.ARRAY_BUFFER,SQ,gl.STATIC_DRAW);\n      var sqVAO=gl.createVertexArray(); gl.bindVertexArray(sqVAO); gl.bindBuffer(gl.ARRAY_BUFFER,sqVBO); gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,2,gl.FLOAT,false,16,0); gl.enableVertexAttribArray(1); gl.vertexAttribPointer(1,2,gl.FLOAT,false,16,8); gl.bindVertexArray(null);\n      var quadVBO=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,quadVBO); gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),gl.STATIC_DRAW);\n      var quadVAO=gl.createVertexArray(); gl.bindVertexArray(quadVAO); gl.bindBuffer(gl.ARRAY_BUFFER,quadVBO); gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,2,gl.FLOAT,false,0,0); gl.bindVertexArray(null);\n      var carIB=gl.createBuffer();\n      var carVAO=gl.createVertexArray(); gl.bindVertexArray(carVAO);\n      gl.bindBuffer(gl.ARRAY_BUFFER,cubeVBO); gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,3,gl.FLOAT,false,24,0); gl.enableVertexAttribArray(1); gl.vertexAttribPointer(1,3,gl.FLOAT,false,24,12);\n      gl.bindBuffer(gl.ARRAY_BUFFER,carIB); var CS=44;\n      gl.enableVertexAttribArray(2); gl.vertexAttribPointer(2,3,gl.FLOAT,false,CS,0); gl.vertexAttribDivisor(2,1);\n      gl.enableVertexAttribArray(3); gl.vertexAttribPointer(3,3,gl.FLOAT,false,CS,12); gl.vertexAttribDivisor(3,1);\n      gl.enableVertexAttribArray(4); gl.vertexAttribPointer(4,3,gl.FLOAT,false,CS,24); gl.vertexAttribDivisor(4,1);\n      gl.enableVertexAttribArray(5); gl.vertexAttribPointer(5,1,gl.FLOAT,false,CS,36); gl.vertexAttribDivisor(5,1);\n      gl.enableVertexAttribArray(6); gl.vertexAttribPointer(6,1,gl.FLOAT,false,CS,40); gl.vertexAttribDivisor(6,1);\n      gl.bindVertexArray(null);\n\n      function signTex(s){\n        var W=s.port?230:400, H=s.port?432:270;\n        var cv=document.createElement('canvas'); cv.width=W; cv.height=H; var x=cv.getContext('2d');\n        var col='rgb('+Math.round(s.c[0]*255)+','+Math.round(s.c[1]*255)+','+Math.round(s.c[2]*255)+')';\n        var m=24, rr=26;\n        function rrect(){ x.beginPath(); x.moveTo(m+rr,m); x.arcTo(W-m,m,W-m,H-m,rr); x.arcTo(W-m,H-m,m,H-m,rr); x.arcTo(m,H-m,m,m,rr); x.arcTo(m,m,W-m,m,rr); x.closePath(); }\n        rrect(); x.fillStyle='rgba(9,10,14,0.74)'; x.fill();\n        x.shadowColor=col; x.strokeStyle=col; x.shadowBlur=22; x.lineWidth=9; rrect(); x.stroke(); rrect(); x.stroke();\n        x.shadowBlur=3; x.strokeStyle='rgba(255,255,255,0.85)'; x.lineWidth=2.4; rrect(); x.stroke(); x.shadowBlur=0;\n        x.textAlign='center'; x.textBaseline='middle';\n        function glow(txt,px,py,fs){ x.font='600 '+fs+'px '+CJK; x.shadowColor=col; x.fillStyle=col; x.shadowBlur=fs*0.55; x.fillText(txt,px,py); x.fillText(txt,px,py); x.shadowBlur=fs*0.1; x.fillStyle='#ffffff'; x.fillText(txt,px,py); }\n        function fitFs(txt,fs,maxw){ x.font='600 '+fs+'px '+CJK; var tw=x.measureText(txt||'').width; if(tw>maxw) return Math.max(12,Math.floor(fs*maxw/tw)); return fs; }\n        if(s.port){ var ch=(s.k||'').split(''), n=Math.max(1,ch.length), step=Math.min(74,(H-150)/n);\n          for(var i=0;i<n;i++) glow(ch[i], W/2, 66+step*(i+0.5), Math.round(step*0.78)); glow(s.n, W/2, H-46, fitFs(s.n,24,W-46));\n        } else { glow(s.k, W/2, H*0.38, 92); glow(s.n, W/2, H*0.76, fitFs(s.n,36,W-70)); }\n        var t=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,t); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,false);\n        gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,cv);\n        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE); return t;\n      }\n      function signModel(s){ var px=s.p[0],py=s.p[1],pz=s.p[2],w=s.w,h=s.h;\n        if(s.axis==='z') return new Float32Array([w,0,0,0, 0,h,0,0, 0,0,1,0, px,py,pz,1]);\n        return new Float32Array([0,0,-w,0, 0,h,0,0, 1,0,0,0, px,py,pz,1]); }\n      function signBack(s){ if(s.axis==='z') return {p:[s.p[0],s.p[1],s.p[2]-0.07],s:[s.w*1.04,s.h*1.04,0.12],c:[.05,.05,.07],win:0,g:0,seed:0};\n        return {p:[s.p[0]-0.07,s.p[1],s.p[2]],s:[0.12,s.h*1.04,s.w*1.04],c:[.05,.05,.07],win:0,g:0,seed:0}; }\n\n      var boxGeo, signList=[], lampList=[], carState=[], lastT=0, beaconList=[];\n      function loadScene(sc){ var boxes=sc.boxes.slice(); sc.signs.forEach(function(s){ boxes.push(signBack(s)); }); boxGeo=buildVAO(boxes);\n        signList=sc.signs.map(function(s){ return {model:signModel(s), tex:signTex(s), p:s.p, c:s.c}; }); lampList=sc.lamps||[];\n        carState=[{d:0,spd:2.6,c:[.2,.36,.72]},{d:11,spd:2.1,c:[.62,.15,.22]},{d:22,spd:2.8,c:[.78,.62,.2]},{d:33,spd:2.3,c:[.75,.3,.55]}]; beaconList=sc.beacons||[]; }\n      loadScene(scene);\n\n      var SM=1024, shDepth=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,shDepth);\n      gl.texImage2D(gl.TEXTURE_2D,0,gl.DEPTH_COMPONENT24,SM,SM,0,gl.DEPTH_COMPONENT,gl.UNSIGNED_INT,null);\n      gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);\n      var shColorRB=gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER,shColorRB); gl.renderbufferStorage(gl.RENDERBUFFER,gl.RGBA8,SM,SM);\n      var shFBO=gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER,shFBO); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.DEPTH_ATTACHMENT,gl.TEXTURE_2D,shDepth,0); gl.framebufferRenderbuffer(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.RENDERBUFFER,shColorRB); gl.bindFramebuffer(gl.FRAMEBUFFER,null);\n\n      var sceneFBO,sceneTex,sceneRB,bloomFBO=[],bloomTex=[],fbw=0,fbh=0,bw=0,bh=0;\n      function mktex(w,h){ var t=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,t); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,w,h,0,gl.RGBA,gl.UNSIGNED_BYTE,null); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE); return t; }\n      function allocFBO(w,h){ fbw=Math.floor(w*1.35); fbh=Math.floor(h*1.35); bw=Math.max(1,fbw>>1); bh=Math.max(1,fbh>>1);\n        sceneTex=mktex(fbw,fbh); sceneRB=gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER,sceneRB); gl.renderbufferStorage(gl.RENDERBUFFER,gl.DEPTH_COMPONENT16,fbw,fbh);\n        sceneFBO=gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER,sceneFBO); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,sceneTex,0); gl.framebufferRenderbuffer(gl.FRAMEBUFFER,gl.DEPTH_ATTACHMENT,gl.RENDERBUFFER,sceneRB);\n        bloomTex=[mktex(bw,bh),mktex(bw,bh)]; bloomFBO=[gl.createFramebuffer(),gl.createFramebuffer()];\n        for(var i=0;i<2;i++){ gl.bindFramebuffer(gl.FRAMEBUFFER,bloomFBO[i]); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,bloomTex[i],0); }\n        gl.bindFramebuffer(gl.FRAMEBUFFER,null); }\n\n      function mul(a,b){ var o=new Float32Array(16); for(var c=0;c<4;c++)for(var r=0;r<4;r++){ var s=0; for(var k=0;k<4;k++)s+=a[k*4+r]*b[c*4+k]; o[c*4+r]=s; } return o; }\n      function ortho(l,r,b,t,n,f){ return new Float32Array([2/(r-l),0,0,0, 0,2/(t-b),0,0, 0,0,-2/(f-n),0, -(r+l)/(r-l),-(t+b)/(t-b),-(f+n)/(f-n),1]); }\n      function lookAt(e,c,u){ var z=[e[0]-c[0],e[1]-c[1],e[2]-c[2]]; var zl=Math.hypot(z[0],z[1],z[2]); z=[z[0]/zl,z[1]/zl,z[2]/zl];\n        var x=[u[1]*z[2]-u[2]*z[1],u[2]*z[0]-u[0]*z[2],u[0]*z[1]-u[1]*z[0]]; var xl=Math.hypot(x[0],x[1],x[2])||1; x=[x[0]/xl,x[1]/xl,x[2]/xl];\n        var y=[z[1]*x[2]-z[2]*x[1],z[2]*x[0]-z[0]*x[2],z[0]*x[1]-z[1]*x[0]];\n        return new Float32Array([x[0],y[0],z[0],0, x[1],y[1],z[1],0, x[2],y[2],z[2],0, -(x[0]*e[0]+x[1]*e[1]+x[2]*e[2]),-(y[0]*e[0]+y[1]*e[1]+y[2]*e[2]),-(z[0]*e[0]+z[1]*e[1]+z[2]*e[2]),1]); }\n      var LVP=mul(ortho(-12,12,-12,12,1,64), lookAt([-13,26,-11],[0,2.8,0],[0,1,0]));\n\n      var P={exp:1.12,sat:1.08,rot:0,zoom:5.6,glow:1.15,bloom:0.9,win:1,plc:1,shad:0.78};\n\n      var uVP=gl.getUniformLocation(mainP,'uVP'), uWinI=gl.getUniformLocation(mainP,'uWinI'), uNL=gl.getUniformLocation(mainP,'uNL'), uLP=gl.getUniformLocation(mainP,'uLP'), uLC=gl.getUniformLocation(mainP,'uLC'), uSh=gl.getUniformLocation(mainP,'uShadow'), uLVPm=gl.getUniformLocation(mainP,'uLVP'), uShAmt=gl.getUniformLocation(mainP,'uShAmt'), uLDir=gl.getUniformLocation(mainP,'uLDir'), uEye=gl.getUniformLocation(mainP,'uEye');\n      var dLVP=gl.getUniformLocation(depthP,'uLVP');\n      var sVP=gl.getUniformLocation(signP,'uVP'), sModel=gl.getUniformLocation(signP,'uModel'), sTex=gl.getUniformLocation(signP,'uTex'), sGlow=gl.getUniformLocation(signP,'uGlow');\n      var bTex=gl.getUniformLocation(blurP,'uTex'), bDir=gl.getUniformLocation(blurP,'uDir'), bBr=gl.getUniformLocation(blurP,'uBright');\n      var cSc=gl.getUniformLocation(compP,'uScene'), cBl=gl.getUniformLocation(compP,'uBloom'), cBi=gl.getUniformLocation(compP,'uBloomI'), cEx=gl.getUniformLocation(compP,'uExp'), cSa=gl.getUniformLocation(compP,'uSat');\n      function flick(tt,i){ var b=0.84+0.16*Math.sin(tt*6.0+i*1.7); var s=Math.sin(tt*41.0+i*3.1)*Math.sin(tt*11.0+i*0.7); return b*((s>0.985)?0.35:1.0); }\n\n      var t0=0, alive=true, raf=0, cw=0, ch=0;\n      function resize(){ var dpr=Math.min(window.devicePixelRatio||1,1.25); var w=Math.max(2,Math.floor(canvas.clientWidth*dpr)), h=Math.max(2,Math.floor(canvas.clientHeight*dpr)); if(canvas.width!==w||canvas.height!==h){ canvas.width=w; canvas.height=h; cw=w; ch=h; allocFBO(w,h); } }\n      function frame(ts){\n        if(!alive||!canvas.isConnected){ alive=false; if(raf)cancelAnimationFrame(raf); return; }\n        if(!t0)t0=ts; var t=(ts-t0)/1000; resize();\n        var dt=Math.min(0.05,Math.max(0,t-lastT)); lastT=t;\n        var tcyc=t%12.0, tRed=(tcyc>=7.5), tYel=(tcyc>=6.0&&tcyc<7.5);\n        var cb=[];\n        for(var ci=0;ci<carState.length;ci++){ var cc=carState[ci]; var stop=false; var dd=((cc.d%RP)+RP)%RP;\n          if((tRed||tYel) && dd>3.3 && dd<4.7) stop=true;\n          for(var cj=0;cj<carState.length;cj++){ if(cj!==ci){ var g2=((carState[cj].d-cc.d)%RP+RP)%RP; if(g2>0.01 && g2<2.3) stop=true; } }\n          if(!stop) cc.d+=cc.spd*dt;\n          var rp=ringPos(cc.d); car(cb,rp[0],rp[1],cc.c,rp[2],rp[3]); }\n        var toff=[.02,.02,.03];\n        cb.push(em([-3.0,2.82,5.62],[0.14,0.14,0.06],tRed?[1.,.16,.12]:toff));\n        cb.push(em([-3.0,2.68,5.62],[0.14,0.14,0.06],tYel?[1.,.78,.16]:toff));\n        cb.push(em([-3.0,2.54,5.62],[0.14,0.14,0.06],(!tRed&&!tYel)?[.2,1.,.32]:toff));\n        var bon=(t%1.4)<0.55;\n        for(var bi=0;bi<beaconList.length;bi++){ var bp=beaconList[bi]; cb.push(em([bp[0],bp[1],bp[2]],[0.1,0.1,0.1], bon?[1.,.09,.06]:[.03,.006,.006])); }\n        gl.bindBuffer(gl.ARRAY_BUFFER,carIB); gl.bufferData(gl.ARRAY_BUFFER,instData(cb),gl.DYNAMIC_DRAW); var carN=cb.length;\n        var W=cw,H=ch, asp=W/H, z=P.zoom;\n        var ang=0.72+Math.sin(t*0.12*P.rot)*0.28;\n        var dist=40, eye=[Math.sin(ang)*dist,dist*0.72,Math.cos(ang)*dist], ctr=[0,2.6,0];\n        var VP=mul(ortho(-asp*z,asp*z,-z,z,0.1,160), lookAt(eye,ctr,[0,1,0]));\n\n        gl.bindFramebuffer(gl.FRAMEBUFFER,shFBO); gl.viewport(0,0,SM,SM); gl.clear(gl.DEPTH_BUFFER_BIT|gl.COLOR_BUFFER_BIT);\n        gl.useProgram(depthP); gl.uniformMatrix4fv(dLVP,false,LVP); gl.disable(gl.CULL_FACE); gl.enable(gl.DEPTH_TEST); gl.depthMask(true); gl.disable(gl.BLEND);\n        gl.bindVertexArray(boxGeo.vao); gl.drawArraysInstanced(gl.TRIANGLES,0,36,boxGeo.n); if(carN){ gl.bindVertexArray(carVAO); gl.drawArraysInstanced(gl.TRIANGLES,0,36,carN); }\n\n        gl.bindFramebuffer(gl.FRAMEBUFFER,sceneFBO); gl.viewport(0,0,fbw,fbh);\n        gl.clearColor(0.012,0.016,0.032,1); gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);\n        gl.useProgram(mainP); gl.uniformMatrix4fv(uVP,false,VP); gl.uniform1f(uWinI,P.win); gl.uniformMatrix4fv(uLVPm,false,LVP); gl.uniform1f(uShAmt,P.shad); gl.uniform3f(uLDir,-0.4515,0.8088,-0.3762); gl.uniform3f(uEye,eye[0],eye[1],eye[2]);\n        gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D,shDepth); gl.uniform1i(uSh,1);\n        var sigN=Math.min(signList.length,8), FK=[], LPa=new Float32Array(48), LCa=new Float32Array(48), NLt=0;\n        if(P.plc) for(var li=0;li<sigN;li++){ var sgl=signList[li]; var fk=flick(t,li); FK[li]=fk; var g=P.glow*fk*0.95; LPa[NLt*3]=sgl.p[0];LPa[NLt*3+1]=sgl.p[1];LPa[NLt*3+2]=sgl.p[2]; LCa[NLt*3]=sgl.c[0]*g;LCa[NLt*3+1]=sgl.c[1]*g;LCa[NLt*3+2]=sgl.c[2]*g; NLt++; }\n        for(var la=0; la<lampList.length && NLt<16; la++){ var lpp=lampList[la]; LPa[NLt*3]=lpp[0];LPa[NLt*3+1]=lpp[1];LPa[NLt*3+2]=lpp[2]; LCa[NLt*3]=1.15;LCa[NLt*3+1]=0.78;LCa[NLt*3+2]=0.38; NLt++; }\n        gl.uniform1i(uNL,NLt); gl.uniform3fv(uLP,LPa); gl.uniform3fv(uLC,LCa);\n        gl.enable(gl.DEPTH_TEST); gl.depthMask(true); gl.disable(gl.BLEND); gl.disable(gl.CULL_FACE);\n        gl.bindVertexArray(boxGeo.vao); gl.drawArraysInstanced(gl.TRIANGLES,0,36,boxGeo.n); if(carN){ gl.bindVertexArray(carVAO); gl.drawArraysInstanced(gl.TRIANGLES,0,36,carN); }\n        if(P.plc && signList.length){\n          gl.useProgram(signP); gl.uniformMatrix4fv(sVP,false,VP);\n          gl.enable(gl.BLEND); gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); gl.depthMask(false); gl.bindVertexArray(sqVAO);\n          for(var i=0;i<signList.length;i++){ gl.uniform1f(sGlow,P.glow*(FK[i]||1.0)); gl.uniformMatrix4fv(sModel,false,signList[i].model); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,signList[i].tex); gl.uniform1i(sTex,0); gl.drawArrays(gl.TRIANGLES,0,6); }\n          gl.depthMask(true); gl.disable(gl.BLEND);\n        }\n\n        gl.disable(gl.DEPTH_TEST); gl.bindVertexArray(quadVAO); gl.useProgram(blurP);\n        var src=sceneTex, spread=2.0;\n        for(var it=0;it<3;it++){\n          gl.bindFramebuffer(gl.FRAMEBUFFER,bloomFBO[0]); gl.viewport(0,0,bw,bh); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,src); gl.uniform1i(bTex,0); gl.uniform2f(bDir,spread/bw,0); gl.uniform1f(bBr,it===0?1.0:0.0); gl.drawArrays(gl.TRIANGLES,0,3);\n          gl.bindFramebuffer(gl.FRAMEBUFFER,bloomFBO[1]); gl.viewport(0,0,bw,bh); gl.bindTexture(gl.TEXTURE_2D,bloomTex[0]); gl.uniform2f(bDir,0,spread/bh); gl.uniform1f(bBr,0.0); gl.drawArrays(gl.TRIANGLES,0,3); src=bloomTex[1];\n        }\n\n        gl.bindFramebuffer(gl.FRAMEBUFFER,null); gl.viewport(0,0,W,H); gl.useProgram(compP);\n        gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,sceneTex); gl.uniform1i(cSc,0);\n        gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D,bloomTex[1]); gl.uniform1i(cBl,1);\n        gl.uniform1f(cBi,P.bloom); gl.uniform1f(cEx,P.exp); gl.uniform1f(cSa,P.sat); gl.drawArrays(gl.TRIANGLES,0,3);\n        gl.bindVertexArray(null);\n        raf=requestAnimationFrame(frame);\n      }\n      function destroy(){ alive=false; if(raf) cancelAnimationFrame(raf); try{ var lc=gl.getExtension('WEBGL_lose_context'); if(lc) lc.loseContext(); }catch(e){} }\n      raf=requestAnimationFrame(frame);\n      return { destroy: destroy };\n    }\n\n    function renderUniverse(idx){\n      if(!uniBody || !UNIS[idx]) return;\n      currentUni = idx;\n      var u = UNIS[idx];\n      if(uni) uni.style.setProperty(\"--hue\", u.hue);\n      var n = u.comps.length;\n      var hero = '<section class=\"uni-hero\"><div class=\"glow\"></div>'\n        + '<div class=\"uni-eyebrow\">'+L(UNI_META.eyebrow)+'</div>'\n        + '<h1>'+L(u.name)+'</h1>'\n        + '<p class=\"lead\">'+L(u.tagline)+'</p>'\n        + '<div class=\"sysmap gl\"><canvas class=\"dioramaGL\"></canvas></div>'\n        + '<div class=\"sys-hint\">'+L(UNI_META.hint)+'</div></section>';\n      var details=\"\";\n      for(var j=0;j<n;j++){\n        var c=u.comps[j];\n        var pts_html=\"\";\n        for(var p=0;p<c.points.length;p++){ pts_html += '<div class=\"ud-point\"><span class=\"pk\">▸</span><span>'+L(c.points[p])+'</span></div>'; }\n        var res_html=\"\";\n        for(var k=0;k<c.kpis.length;k++){ res_html += '<span class=\"r\"><b>'+esc(c.kpis[k].num)+'</b> <span>'+L(c.kpis[k].cap)+'</span></span>'; }\n        var num = (\"0\"+(j+1)).slice(-2)+\" / \"+(\"0\"+n).slice(-2);\n        details += '<section class=\"uni-detail\" data-i=\"'+j+'\">'\n          + '<div class=\"ud-viz\"><div class=\"iso\">'+isoScene2(parseIso2(detailSpec(u,c,j)))+'</div></div>'\n          + '<div class=\"ud-tx\"><div class=\"ud-num\">'+num+'</div>'\n          + '<div class=\"ud-t\">'+L(c.title)+'</div>'\n          + '<div class=\"ud-d\">'+L(c.desc)+'</div>'\n          + '<div class=\"ud-points\">'+pts_html+'</div>'\n          + '<div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\">'+L(UNI_META.old)+'</span><p>'+L(c.oldModel)+'</p></div>'\n          + '<div class=\"ug-col ug-new\"><span class=\"ug-k\">'+L(UNI_META.wd)+'</span><p>'+L(c.withData2)+'</p></div></div>'\n          + '<div class=\"ud-res\">'+res_html+'</div></div></section>';\n      }\n      var more = '<section class=\"uni-more\"><div class=\"glow\"></div>'\n        + '<h2>'+L(UNI_META.moreH)+'</h2><p>'+L(UNI_META.moreP)+'</p>'\n        + '<div style=\"display:flex;justify-content:center\"><a href=\"#\" class=\"btn\"><span>'+L(UNI_META.demo)+'</span></a></div></section>';\n      uniBody.innerHTML = hero + details + more;\n      if(__dio){ try{__dio.destroy();}catch(e){} __dio=null; }\n      var __glc = uniBody.querySelector(\".dioramaGL\");\n      if(__glc){ try{ __dio = mountDiorama(__glc, dioramaScene(u), {hue:u.hue}); }catch(e){ if(window.console)console.error('[diorama]',e); } }\n      uniBody.querySelectorAll(\".sysmap .comp\").forEach(function(cc){\n        cc.addEventListener(\"click\", function(){\n          var t=uniBody.querySelector('.uni-detail[data-i=\"'+cc.getAttribute(\"data-i\")+'\"]');\n          if(t && uniScroll) uniScroll.scrollTo({top:t.offsetTop-24, behavior:\"smooth\"});\n        });\n      });\n    }\n    function openUni(i){ if(!uni) return; renderUniverse(i); uni.classList.add(\"on\"); if(uniScroll) uniScroll.scrollTop=0; }\n    function closeUni(){ if(uni) uni.classList.remove(\"on\"); if(__dio){ try{__dio.destroy();}catch(e){} __dio=null; } }\n    gcards.forEach(function(g,i){ g.addEventListener(\"click\", function(){ openUni(i); }); });\n    var uclose = root.querySelector(\"#uniClose\"); if(uclose) uclose.addEventListener(\"click\", closeUni);\n    window.addEventListener(\"keydown\", function(e){ if(e.key===\"Escape\") closeUni(); });\n    window.__reRenderUni = function(){ if(uni && uni.classList.contains(\"on\") && currentUni>=0) renderUniverse(currentUni); };\n\n    applyLang(\"pt\");\n    renderProduct();\n  }\n}"}}}}}},"__d2PrevCode":{"code":"export default {\n  css: `\n:host,.d2site{\n  --worm:linear-gradient(90deg,#9b5cff,#5b86ff,#4ddfe6,#4de0a1,#84e05a,#e8e84d,#ff6a4d,#ff4d9e,#ff6a4d,#e8e84d,#84e05a,#4de0a1,#4ddfe6,#5b86ff,#9b5cff);\n  --worm-mesh:linear-gradient(125deg,#9b5cff,#5b86ff,#4ddfe6,#4de0a1,#84e05a,#e8e84d,#ff6a4d,#ff4d9e,#ff6a4d,#e8e84d,#84e05a,#4de0a1,#4ddfe6,#5b86ff,#9b5cff);\n  --tile:2400px;\n  --bg:#000; --panel:#0b0b0d; --panel2:#101013; --raise:#17171b;\n  --line:rgba(255,255,255,.09); --line2:rgba(255,255,255,.055);\n  --ink:#f2f2f5; --mut:#8a8a93; --faint:#55555e;\n  --blue:#3a7bff; --blue-soft:rgba(58,123,255,.16);\n  --ok:#4de0a1; --warn:#e8e84d; --bad:#ff6a4d;\n  --sans:\"Helvetica Neue\",Helvetica,Arial,\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",\"Noto Sans CJK SC\",\"Noto Sans SC\",system-ui,sans-serif;\n  --mono:ui-monospace,\"SF Mono\",Menlo,Consolas,monospace;\n  --out:cubic-bezier(.22,1,.36,1); --soft:cubic-bezier(.4,0,.2,1); --spring:cubic-bezier(.34,1.4,.5,1);\n  --hue:#5b86ff;\n}\n*{box-sizing:border-box;margin:0;padding:0}\n.d2site{position:relative;height:100%;overflow-y:auto;overflow-x:hidden;background:var(--bg);color:var(--ink);\n  font-family:var(--sans);-webkit-font-smoothing:antialiased;line-height:1.55;scroll-behavior:smooth;scroll-snap-type:y proximity;scroll-padding-top:66px}\n.d2site a{color:inherit;text-decoration:none}\n.d2site ::selection{background:var(--blue);color:#fff}\n@keyframes flow{to{background-position:var(--tile) 0}}\n@keyframes drift{0%{background-position:0% 30%}100%{background-position:100% 70%}}\n@keyframes spin{to{transform:rotate(360deg)}}\n@keyframes orbglow{0%,100%{box-shadow:0 0 14px currentColor,inset 0 2px 6px rgba(255,255,255,.32)}50%{box-shadow:0 0 30px currentColor,inset 0 2px 6px rgba(255,255,255,.44)}}\n.mark{font-weight:500;letter-spacing:-.015em;line-height:1;font-family:var(--sans);display:inline-flex;align-items:center}\n.logo{display:block;width:auto;height:24px}\n.logo use{fill:#fff}\n.mark sup{font-size:.46em;font-weight:500;vertical-align:super;margin-left:.5px}\nheader.nav{position:sticky;top:0;z-index:50;display:flex;align-items:center;justify-content:space-between;\n  padding:20px 40px;transition:background .4s var(--soft),backdrop-filter .4s,border-color .4s;border-bottom:1px solid transparent}\nheader.nav.scrolled{background:rgba(6,6,8,.72);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-bottom:1px solid var(--line)}\nheader.nav .mark{font-size:26px}\n.navlinks{display:flex;align-items:center;gap:28px;font-size:14px}\n.navlinks a{color:rgba(255,255,255,.82);transition:color .2s}\n.navlinks a:hover{color:#fff}\n.navctl{display:flex;align-items:center;gap:14px}\n.lang{display:inline-flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;font-family:var(--mono);font-size:11px}\n.lang button{background:none;border:0;color:var(--mut);cursor:pointer;padding:6px 11px;font:inherit;letter-spacing:.06em;transition:.25s var(--soft)}\n.lang button.on{background:var(--blue);color:#fff}\n.signin{border:1px solid var(--line);border-radius:999px;padding:8px 18px;font-size:13px;color:#fff;transition:.3s var(--out)}\n.signin:hover{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}\n.burger{display:none;background:none;border:0;cursor:pointer;flex-direction:column;gap:5px;padding:6px}\n.burger span{width:22px;height:2px;background:#fff;border-radius:2px}\n.btn{position:relative;display:inline-flex;align-items:center;gap:9px;overflow:hidden;border:0;cursor:pointer;font:inherit;font-weight:600;color:#08080a;padding:15px 30px;border-radius:999px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 20s linear infinite;box-shadow:inset 0 1.5px 0 rgba(255,255,255,.5),inset 0 -4px 9px rgba(0,0,0,.16),0 8px 26px rgba(0,0,0,.45);transition:transform .42s var(--spring),box-shadow .3s var(--soft),filter .4s}\n.btn:hover{transform:translateY(-2px);filter:saturate(1.06) brightness(1.03);box-shadow:inset 0 1.5px 0 rgba(255,255,255,.55),inset 0 -4px 9px rgba(0,0,0,.16),0 16px 40px rgba(155,92,255,.32)}\n.btn:active{transform:translateY(0) scale(.96)}\n.btn.ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--line);animation:none}\n.btn.ghost:hover{box-shadow:inset 0 0 0 1.5px var(--blue),0 0 0 3px var(--blue-soft);filter:none}\nsection{position:relative;padding:clamp(80px,11vh,150px) 40px;min-height:100vh;display:flex;flex-direction:column;justify-content:center}\n#essence,#levers,#deliver{background:rgba(255,255,255,.014)}\n.wrap{width:100%;max-width:1200px;margin:0 auto}\n.sec-t{font-size:clamp(30px,4.6vw,58px);font-weight:800;letter-spacing:-.02em;line-height:1.04;margin-top:14px;text-wrap:balance}\n.sec-sub{color:var(--mut);font-size:17px;line-height:1.55;margin-top:16px;max-width:60ch}\n.eyebrow{font-family:var(--mono);font-size:12px;letter-spacing:.24em;text-transform:uppercase;color:var(--faint)}\n.reveal{opacity:0;transform:translateY(24px);transition:opacity .8s var(--out),transform .8s var(--out)}\n.reveal.in{opacity:1;transform:none}\n#hero{padding:0;min-height:calc(100vh - 66px);overflow:hidden;scroll-snap-align:start;background:#000}\n#hero .herofx{position:absolute;inset:0;width:100%;height:100%;z-index:0;display:block}\n#hero .corner{position:absolute;inset:0;pointer-events:none;background:radial-gradient(46% 42% at -2% -4%,rgba(255,90,210,.55),transparent 62%)}\n#hero .vig{position:absolute;inset:0;pointer-events:none;background:radial-gradient(140% 110% at 50% 20%,transparent 38%,rgba(4,8,7,.72) 100%)}\n#hero .inner{position:relative;z-index:2;min-height:calc(100vh - 66px);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:80px 40px 90px}\n.h1{font-size:clamp(44px,8.6vw,124px);line-height:.9;font-weight:800;letter-spacing:-.02em;text-transform:uppercase;text-wrap:balance;text-shadow:0 2px 40px rgba(0,0,0,.22)}\n.hero-kicker{font-family:var(--mono);font-size:clamp(11px,1.25vw,13px);letter-spacing:.22em;text-transform:uppercase;color:rgba(255,255,255,.62);margin-bottom:26px;font-weight:500}\n#hero .sub{margin-top:30px;max-width:640px;font-size:clamp(16px,2vw,21px);line-height:1.5;color:rgba(255,255,255,.94);font-weight:400;text-wrap:balance}\n#hero .cta{margin-top:44px;display:flex;gap:14px;flex-wrap:wrap;justify-content:center;align-items:center}\n#hero .cta .btn{color:#0a0a0c}\n#hero .cta .btn:not(.ghost){padding:17px 36px;font-size:16px;font-weight:700}\n#hero .cta .btn.ghost{padding:14px 26px;opacity:.9}\n#hero .cta .btn.ghost{color:#fff;box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.5)}\n#hero .cta .btn.ghost:hover{box-shadow:inset 0 0 0 1.5px #fff}\n.herostrip{margin-top:52px;display:flex;flex-direction:column;align-items:center;gap:16px;width:100%;max-width:820px}\n.hs-clients{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 14px;font-size:14px}\n.hs-clients .hs-lead{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}\n.hs-clients .hs-logos{font-weight:600;color:rgba(255,255,255,.72)}\n.hs-steps{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px 16px;font-size:13px;color:var(--mut)}\n.hs-step b{color:#fff;font-weight:700}\n.hs-arrow{color:var(--blue)}\n@media(max-width:600px){.herostrip{margin-top:34px}.hs-steps{font-size:12px}}\n.credit{position:absolute;right:40px;bottom:34px;z-index:2;width:280px;text-align:right;background:rgba(6,10,9,.5);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:12px 15px}\n.credit b{font-size:10px;font-weight:700;display:block;margin-bottom:4px;letter-spacing:.02em}\n.credit p{font-size:10px;line-height:1.5;color:rgba(255,255,255,.72)}\n.scrollcue{position:absolute;left:50%;bottom:30px;z-index:2;transform:translateX(-50%);font-family:var(--mono);font-size:10px;letter-spacing:.22em;color:rgba(255,255,255,.7);text-transform:uppercase;display:flex;flex-direction:column;align-items:center;gap:8px}\n.scrollcue i{width:1px;height:34px;background:linear-gradient(rgba(255,255,255,.8),transparent);display:block}\n#essence{border-bottom:1px solid var(--line)}\n.triad{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:46px}\n.tri{border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:32px 30px;display:flex;flex-direction:column;transition:transform .45s var(--spring),box-shadow .4s,border-color .4s}\n.tri:hover{transform:translateY(-3px);box-shadow:0 22px 60px rgba(0,0,0,.5);border-color:rgba(255,255,255,.16)}\n.tri .accent{height:6px;width:56px;border-radius:999px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 15s linear infinite;margin-bottom:22px}\n.tri .q{font-family:var(--mono);font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);margin-bottom:12px}\n.tri h3{font-size:clamp(21px,2.3vw,28px);font-weight:800;letter-spacing:-.01em;line-height:1.08;margin-bottom:14px;text-wrap:balance}\n.tri p{color:var(--mut);font-size:15.5px;line-height:1.55}\n.tri em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n.tri .foot{margin-top:auto;padding-top:22px}\n.tri .foot .prod-row{gap:8px}\n.tri .foot .chip{padding:5px 10px;font-size:10.5px}\n.tri .inames{display:flex;flex-wrap:wrap;gap:8px 12px;margin-top:auto;padding-top:22px;font-size:14px;color:var(--ink);font-weight:500}\n.baband{display:grid;grid-template-columns:1fr auto 1fr;gap:28px;align-items:center;margin-top:22px;border:1px solid var(--line);border-radius:20px;background:var(--panel2);padding:26px 32px}\n.baband .k{font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);margin-bottom:8px}\n.baband .before p{color:var(--faint);text-decoration:line-through;text-decoration-color:rgba(255,106,77,.5);font-size:15px}\n.baband .arrow{color:var(--blue);font-size:26px;line-height:1}\n.baband .after p{color:var(--ink);font-size:15px}\n#glance{border-bottom:1px solid var(--line);min-height:auto}\n.glance-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:42px}\n.gcard{position:relative;border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:22px;display:flex;flex-direction:column;gap:12px;transition:transform .4s var(--spring),border-color .4s,background .4s;overflow:hidden}\n.gcard:hover{transform:translateY(-3px);border-color:color-mix(in srgb,var(--hue) 55%,var(--line));background:var(--panel2)}\n.gcard .num{position:absolute;top:16px;right:18px;font-family:var(--mono);font-size:11px;color:var(--faint)}\n.gicon{width:42px;height:42px;display:flex;align-items:center;justify-content:center;border-radius:11px;background:color-mix(in srgb,var(--hue) 15%,transparent)}\n.gsvg{width:24px;height:24px;stroke:var(--hue);stroke-width:2.2;fill:none;stroke-linecap:round;stroke-linejoin:round;overflow:visible}\n.gsvg *{transform-box:fill-box;transform-origin:center}\n.gsvg .dot{fill:var(--hue);stroke:none;animation:gdot 2.6s var(--soft) infinite}\n@keyframes gdot{0%{transform:translateX(0);opacity:0}12%{opacity:1}88%{opacity:1}100%{transform:translateX(24px);opacity:0}}\n.gsvg .b2{animation:gpulse 2.2s ease-in-out infinite}\n@keyframes gpulse{0%,100%{opacity:.4}50%{opacity:1}}\n.gsvg .bar{transform-origin:bottom center;animation:gbar 1.9s ease-in-out infinite}\n.gsvg .bar2{animation-delay:.22s}.gsvg .bar3{animation-delay:.44s}\n@keyframes gbar{0%,100%{transform:scaleY(.55)}50%{transform:scaleY(1)}}\n.gsvg .bx{animation:gbox 2.4s var(--spring) infinite}\n@keyframes gbox{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}\n.gname{font-size:16px;font-weight:700;letter-spacing:-.01em}\n.gval{font-size:13px;color:var(--mut);line-height:1.42}\n.clients-row{display:flex;flex-wrap:wrap;align-items:center;gap:14px 40px;margin-top:36px;padding-top:30px;border-top:1px solid var(--line)}\n.clients-row .cl-lead{width:100%;font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-bottom:2px}\n.clients-row .cl{font-size:19px;font-weight:600;color:rgba(255,255,255,.58);filter:grayscale(1);transition:color .3s,opacity .3s;opacity:.85}\n.clients-row .cl:hover{color:#fff;opacity:1}\n@media(max-width:900px){.glance-grid{grid-template-columns:1fr 1fr}}\n@media(max-width:600px){.glance-grid{grid-template-columns:1fr}}\n#proof{min-height:auto;padding:70px 40px;border-bottom:1px solid var(--line)}\n#proof .lead{text-align:center;color:var(--mut);font-size:13px;font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase;margin-bottom:34px}\n.logos{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:14px 54px}\n.logos .lg{font-size:23px;font-weight:600;letter-spacing:.01em;color:rgba(255,255,255,.62);filter:grayscale(1);transition:color .3s,filter .3s,opacity .3s;opacity:.85}\n.logos .lg:hover{color:#fff;opacity:1}\n.prod-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n.prod-row .lbl{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-right:4px}\n.chip{font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--ink);border:1px solid var(--line);border-radius:999px;padding:6px 12px;background:var(--panel2)}\n#industries{padding:0;min-height:auto}\n.ind-head{padding:110px 40px 40px;max-width:1180px;margin:0 auto}\n.ind-head h2{font-size:clamp(30px,5vw,62px);font-weight:800;letter-spacing:-.02em;line-height:1;text-wrap:balance}\n.ind-head p{color:var(--mut);font-size:18px;margin-top:18px;max-width:52ch}\n.industry{position:relative;min-height:100vh;display:flex;align-items:center;padding:110px 40px;overflow:hidden;border-top:1px solid var(--line);scroll-snap-align:start}\n.industry .glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(60% 70% at 82% 30%,color-mix(in srgb,var(--hue) 42%,transparent),transparent 66%)}\n.industry .glow2{position:absolute;inset:0;pointer-events:none;background:radial-gradient(50% 60% at 10% 90%,color-mix(in srgb,var(--hue) 20%,transparent),transparent 60%)}\n.industry .flow{position:absolute;inset:0;z-index:1;width:100%;height:100%;pointer-events:none;mix-blend-mode:screen}\n.industry .inner{position:relative;z-index:2;max-width:1180px;margin:0 auto;width:100%;display:grid;grid-template-columns:1.05fr .95fr;gap:64px;align-items:center}\n.ix-num{font-family:var(--mono);font-size:13px;letter-spacing:.2em;color:var(--hue);margin-bottom:20px}\n.ix-num span{color:var(--faint)}\n.ix-name{font-size:clamp(34px,5.6vw,74px);font-weight:800;line-height:.96;letter-spacing:-.02em;text-wrap:balance}\n.ix-poss{margin-top:26px;font-size:clamp(19px,2.3vw,27px);line-height:1.28;font-weight:500;color:#fff;text-wrap:balance;max-width:22ch}\n.ix-poss b{color:var(--hue);font-weight:700}\n.ix-side{display:flex;flex-direction:column;gap:22px}\n.caps{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:16px;background:rgba(12,12,15,.55);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);overflow:hidden}\n.caps .cap{display:flex;align-items:center;gap:14px;padding:15px 20px;border-bottom:1px solid var(--line2);font-size:15px}\n.caps .cap:last-child{border-bottom:0}\n.caps .cap .dot{width:8px;height:8px;border-radius:50%;background:var(--hue);flex:none;box-shadow:0 0 10px var(--hue)}\n.ix-proof{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--mut)}\n.ix-proof .who{color:#fff;font-weight:600;filter:grayscale(1);opacity:.9}\n.industry{display:none}\n.indacc{display:none}\n#industries{display:none}\n.gcard{cursor:pointer}\n.gcard::after{content:\"↗\";position:absolute;bottom:16px;right:18px;color:var(--faint);font-size:14px;transition:color .3s,transform .3s}\n.gcard:hover::after{color:var(--hue);transform:translate(2px,-2px)}\n.uni-overlay{position:fixed;inset:0;z-index:300;background:#05060a;visibility:hidden;opacity:0;transition:opacity .5s var(--out),visibility .5s;--hue:#4ddfe6}\n.uni-overlay.on{visibility:visible;opacity:1}\n.uni-scroll{position:absolute;inset:0;overflow-y:auto;scroll-behavior:smooth}\n.uni-top{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;padding:20px 40px;background:linear-gradient(180deg,rgba(5,6,10,.92),rgba(5,6,10,0));pointer-events:none}\n.uni-top .mark{font-size:22px;pointer-events:auto;color:#fff}\n.uni-close{pointer-events:auto;width:44px;height:44px;border-radius:999px;border:1px solid var(--line);background:rgba(12,12,15,.7);color:#fff;font-size:15px;cursor:pointer;transition:.3s;backdrop-filter:blur(8px)}\n.uni-close:hover{border-color:var(--hue);box-shadow:0 0 0 3px color-mix(in srgb,var(--hue) 20%,transparent)}\n.uni-hero{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:90px 40px 60px;position:relative;margin-top:-64px}\n.uni-hero .glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(58% 55% at 50% 42%,color-mix(in srgb,var(--hue) 22%,transparent),transparent 70%)}\n.uni-eyebrow{font-family:var(--mono);font-size:12px;letter-spacing:.24em;text-transform:uppercase;color:var(--hue);position:relative}\n.uni-hero h1{font-size:clamp(34px,6vw,74px);font-weight:800;letter-spacing:-.02em;line-height:.98;margin-top:16px;text-transform:uppercase;position:relative;text-wrap:balance}\n.uni-hero .lead{color:var(--mut);font-size:clamp(16px,2vw,20px);max-width:52ch;margin-top:18px;position:relative}\n.sysmap{position:relative;width:100%;max-width:860px;margin:34px auto 0}\n.sysmap.gl{aspect-ratio:16/9;border-radius:16px;overflow:hidden;border:1px solid var(--line);box-shadow:0 30px 90px rgba(0,0,0,.55)}\n.sysmap.gl canvas.dioramaGL{display:block;width:100%;height:100%}\n.sysmap svg{width:100%;height:auto;overflow:visible;filter:drop-shadow(0 0 2px color-mix(in srgb,var(--hue) 40%,transparent))}\n.sysmap .wire{fill:none;stroke:color-mix(in srgb,var(--hue) 45%,transparent);stroke-width:1.5;stroke-dasharray:5 7;animation:wireflow 1.5s linear infinite}\n@keyframes wireflow{to{stroke-dashoffset:-24}}\n.sysmap .flowdot{fill:var(--hue);filter:drop-shadow(0 0 5px var(--hue))}\n.sysmap .comp{cursor:pointer;transition:filter .3s}\n.sysmap .comp .f{fill:color-mix(in srgb,var(--hue) 18%,transparent)}\n.sysmap .comp .s{fill:none;stroke:var(--hue);stroke-width:2;stroke-linejoin:round;stroke-linecap:round}\n.sysmap .comp .dot{fill:var(--hue)}\n.sysmap .comp:hover{filter:drop-shadow(0 0 8px var(--hue))}\n.sysmap .comp:hover .f{fill:color-mix(in srgb,var(--hue) 36%,transparent)}\n.sysmap .clabel{fill:#fff;font-family:var(--sans);font-size:12px;font-weight:600;text-anchor:middle;opacity:.82}\n.sysmap .comp:hover .clabel{opacity:1}\n.sys-hint{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-top:28px;position:relative}\n.uni-overlay{--fct:color-mix(in srgb,var(--hue) 36%,transparent);--fcl:color-mix(in srgb,var(--hue) 18%,transparent);--fcr:color-mix(in srgb,var(--hue) 7%,transparent)}\n.sysmap .comp:hover{--fct:color-mix(in srgb,var(--hue) 52%,transparent);--fcl:color-mix(in srgb,var(--hue) 30%,transparent)}\n.iso svg,.sysmap svg{overflow:visible}\n.iso svg use,.sysmap svg use{--x:0}\n.iso-svg{width:100%;height:100%;overflow:visible;filter:drop-shadow(0 0 2px rgba(255,255,255,.04))}\n.iso-svg .ft{fill:color-mix(in srgb,var(--h) 34%,transparent);stroke:var(--h);stroke-width:1.5;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .fl{fill:color-mix(in srgb,var(--h) 17%,transparent);stroke:var(--h);stroke-width:1.5;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .fr{fill:color-mix(in srgb,var(--h) 8%,transparent);stroke:var(--h);stroke-width:1.5;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .seam{stroke:var(--h);opacity:.45;stroke-width:1;vector-effect:non-scaling-stroke}\n.iso-svg .det{stroke:var(--h);opacity:.7;stroke-width:1.3;vector-effect:non-scaling-stroke;fill:none}\n.iso-svg .iso-lbl{fill:#fff;font-family:var(--sans);font-size:12px;font-weight:600;text-anchor:middle;opacity:.9}\n.iso-svg .iso-wire{fill:none;stroke:color-mix(in srgb,var(--h) 55%,transparent);stroke-width:1.5;stroke-dasharray:5 7;animation:isowire 1.5s linear infinite}\n@keyframes isowire{to{stroke-dashoffset:-24}}\n.iso-svg .iso-flow{fill:var(--h);filter:drop-shadow(0 0 5px var(--h))}\n.iso-blk{transform-box:fill-box;transform-origin:center}\n.iso-float{animation:isofloat 3s ease-in-out infinite}\n@keyframes isofloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}\n.iso-bob{animation:isobob 3.4s ease-in-out infinite}\n@keyframes isobob{0%,100%{transform:translateY(0)}50%{transform:translateY(5px)}}\n.iso-pulse{animation:isopulse 2.4s ease-in-out infinite}\n@keyframes isopulse{0%,100%{opacity:.68}50%{opacity:1}}\n.iso-svg .face{stroke:none}\n.iso-svg .glow2{fill:none;stroke:var(--h);stroke-width:11;opacity:.05;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .glow1{fill:none;stroke:var(--h);stroke-width:5.5;opacity:.13;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .edge{fill:none;stroke:var(--h);stroke-width:1.6;opacity:.95;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .core{fill:none;stroke:#fff;stroke-width:.7;opacity:.7;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}\n.iso-svg .contact{pointer-events:none}\n.iso-svg .floor-glow{pointer-events:none}\n.iso-svg .grid{fill:none;stroke:color-mix(in srgb,var(--h) 24%,transparent);stroke-width:.8;opacity:.13;vector-effect:non-scaling-stroke}\n.iso-svg .ghost{opacity:.22}\n.iso-svg .gface{stroke:none;fill:color-mix(in srgb,var(--h) 8%,#070810)}\n.iso-svg .gedge{fill:none;stroke:color-mix(in srgb,var(--h) 34%,#0a0b12);stroke-width:1;opacity:.7;vector-effect:non-scaling-stroke}\n.iso-svg .dust{fill:#cdd8f7;animation-name:dustf;animation-timing-function:linear;animation-iteration-count:infinite}\n@keyframes dustf{0%{opacity:0;transform:translateY(6px)}25%{opacity:.5}75%{opacity:.38}100%{opacity:0;transform:translateY(-10px)}}\n.iso-svg .ic{fill:none;stroke:var(--h);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}\n.iso-svg .lbl-bg{fill:rgba(6,7,10,.72);stroke:rgba(255,255,255,.06);stroke-width:1;vector-effect:non-scaling-stroke}\n.iso-svg .det{stroke:var(--h);opacity:.22;stroke-width:1;vector-effect:non-scaling-stroke;fill:none}\n.iso-svg .iso-lbl{fill:#fff;font-family:var(--sans);font-weight:600;text-anchor:middle;dominant-baseline:central;opacity:.96;letter-spacing:.01em}\n.sysmap,.ud-viz .iso{position:relative}\n.sysmap::after,.ud-viz .iso::after{content:\"\";position:absolute;inset:0;pointer-events:none;mix-blend-mode:overlay;opacity:.06;border-radius:inherit;background:url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"140\" height=\"140\"><filter id=\"n\"><feTurbulence type=\"fractalNoise\" baseFrequency=\"0.85\" numOctaves=\"2\" stitchTiles=\"stitch\"/><feColorMatrix type=\"saturate\" values=\"0\"/></filter><rect width=\"140\" height=\"140\" filter=\"url(%23n)\"/></svg>')}\n.sysmap .iso-blk.comp{cursor:pointer;transition:filter .3s}\n.sysmap .iso-blk.comp:hover{filter:drop-shadow(0 0 9px var(--h)) brightness(1.14)}\n.sysmap .iso-blk.comp:hover .iso-lbl{opacity:1}\n.uni-detail{min-height:100vh;max-width:1080px;margin:0 auto;padding:100px 40px;display:grid;grid-template-columns:.78fr 1.22fr;gap:56px;align-items:center;border-top:1px solid var(--line)}\n.ud-gain{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:24px}\n.ug-col{border:1px solid var(--line);border-radius:12px;padding:16px 18px;background:var(--panel)}\n.ug-k{font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;display:block;margin-bottom:8px}\n.ug-old .ug-k{color:var(--bad)}\n.ug-new .ug-k{color:var(--hue)}\n.ug-col p{font-size:13.5px;line-height:1.45;color:var(--mut)}\n.ug-new p{color:var(--ink)}\n@media(max-width:640px){.ud-gain{grid-template-columns:1fr}}\n.uni-detail:nth-child(odd) .ud-viz{order:2}\n.ud-viz{display:flex;align-items:center;justify-content:center}\n.ud-viz .iso{width:230px;height:210px}\n.ud-num{font-family:var(--mono);font-size:13px;color:var(--hue);letter-spacing:.2em}\n.ud-t{font-size:clamp(24px,3vw,38px);font-weight:800;letter-spacing:-.02em;margin:10px 0 14px;text-wrap:balance}\n.ud-d{color:var(--mut);font-size:17px;line-height:1.5;max-width:46ch}\n.ud-res{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}\n.ud-res .r{border:1px solid var(--line);border-radius:10px;padding:10px 14px;font-size:13px;color:var(--ink);background:var(--panel)}\n.ud-res .r b{color:var(--hue);font-weight:800}\n.ud-points{display:flex;flex-direction:column;gap:9px;margin-top:20px}\n.ud-point{display:flex;align-items:flex-start;gap:10px;font-size:14.5px;color:var(--ink);line-height:1.42}\n.ud-point .pk{color:var(--hue);flex:none;margin-top:1px;font-weight:700}\n.uni-more{text-align:center;padding:96px 40px 120px;border-top:1px solid var(--line);position:relative}\n.uni-more .glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(50% 60% at 50% 50%,color-mix(in srgb,var(--hue) 16%,transparent),transparent 70%)}\n.uni-more h2{font-size:clamp(28px,4.4vw,52px);font-weight:800;letter-spacing:-.02em;text-wrap:balance;max-width:22ch;margin:0 auto;position:relative}\n.uni-more h2 em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n.uni-more p{color:var(--mut);font-size:18px;margin:18px auto 34px;max-width:48ch;position:relative}\n.uni-more .btn{position:relative;display:inline-flex;width:auto;max-width:max-content}\n@media(max-width:760px){.uni-detail{grid-template-columns:1fr;gap:22px}.uni-detail:nth-child(odd) .ud-viz{order:0}.ud-viz .iso{width:170px;height:160px}}\n.indacc{margin-top:44px;border:1px solid var(--line);border-radius:18px;overflow:hidden;background:var(--panel)}\n.acc-item{border-bottom:1px solid var(--line);--hue:#5b86ff}\n.acc-item:last-child{border-bottom:0}\n.acc-head{display:flex;align-items:center;gap:16px;padding:22px 26px;cursor:pointer;transition:background .3s}\n.acc-head:hover{background:var(--panel2)}\n.acc-item.open .acc-head{background:var(--panel2)}\n.acc-dot{width:10px;height:10px;border-radius:50%;background:var(--hue);box-shadow:0 0 12px var(--hue);flex:none}\n.acc-name{font-size:clamp(18px,2.2vw,24px);font-weight:700;letter-spacing:-.01em}\n.acc-val{color:var(--mut);font-size:14px;margin-left:auto;text-align:right}\n.acc-chev{flex:none;color:var(--faint);transition:transform .35s var(--spring),color .3s;font-size:20px;line-height:1;margin-left:14px}\n.acc-item.open .acc-chev{transform:rotate(90deg);color:var(--hue)}\n.acc-body{max-height:0;overflow:hidden;transition:max-height .5s var(--out)}\n.acc-item.open .acc-body{max-height:1200px}\n.universe{max-height:640px;overflow-y:auto;padding:6px 26px 30px 52px}\n.uni-head{margin-bottom:22px}\n.uni-head h3{font-size:clamp(20px,2.4vw,28px);font-weight:800;letter-spacing:-.01em}\n.uni-head p{color:var(--mut);font-size:15px;margin-top:6px;max-width:60ch}\n.uni-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}\n.deliv{border:1px solid var(--line);border-radius:14px;background:rgba(12,12,15,.5);padding:18px;display:flex;gap:16px;align-items:flex-start;transition:border-color .3s,transform .3s}\n.deliv:hover{border-color:color-mix(in srgb,var(--hue) 50%,var(--line));transform:translateY(-2px)}\n.iso{width:84px;height:78px;flex:none;display:flex;align-items:center;justify-content:center}\n.iso svg{width:100%;height:100%;overflow:visible;filter:drop-shadow(0 0 3px var(--hue)) drop-shadow(0 0 9px color-mix(in srgb,var(--hue) 55%,transparent))}\n.iso svg .f{fill:color-mix(in srgb,var(--hue) 16%,transparent)}\n.iso svg .s{fill:none;stroke:var(--hue);stroke-width:2;stroke-linejoin:round;stroke-linecap:round}\n.iso svg .dot{fill:var(--hue)}\n.deliv-tx{display:flex;flex-direction:column;gap:5px}\n.deliv-t{font-size:15px;font-weight:700;letter-spacing:-.01em}\n.deliv-d{font-size:13px;color:var(--mut);line-height:1.45}\n.uni-prods{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px;align-items:center}\n.uni-prods .lbl{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);margin-right:4px}\n@media(max-width:640px){.uni-grid{grid-template-columns:1fr}.universe{padding-left:26px}}\n.acc-inner{padding:2px 26px 28px 52px;display:flex;flex-wrap:wrap;gap:22px 44px;align-items:flex-start}\n.acc-caps{display:flex;flex-direction:column;gap:10px;flex:1;min-width:260px}\n.acc-cap{display:flex;align-items:center;gap:10px;font-size:14px;color:var(--ink)}\n.acc-cap .d{width:6px;height:6px;border-radius:50%;background:var(--hue);flex:none}\n.acc-prods{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-start;max-width:300px}\n@media(max-width:640px){.acc-val{display:none}.acc-inner{padding-left:26px}}\n#threads{border-top:1px solid var(--line);min-height:auto;padding:90px 40px}\n.threads-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;margin-top:40px}\n.thread{background:var(--panel);padding:30px 26px;transition:background .4s}\n.thread:hover{background:var(--panel2)}\n.thread .t{font-size:18px;font-weight:600;margin-bottom:8px}\n.thread .d{color:var(--mut);font-size:14px}\n.thread .n{font-family:var(--mono);font-size:11px;color:var(--faint);letter-spacing:.16em}\n#levers{border-top:1px solid var(--line);min-height:auto}\n.levers-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;margin-top:40px}\n.lever{background:var(--panel);padding:28px 24px;display:flex;flex-direction:column;gap:9px;transition:background .4s}\n.lever:hover{background:var(--panel2)}\n.lever .lv-cap{font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}\n.lever .lv-num{font-size:clamp(30px,3.6vw,44px);font-weight:800;letter-spacing:-.02em;line-height:1;color:#fff}\n.lever .lv-num b{background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 16s linear infinite;font-weight:800}\n.lever .lv-txt{font-size:13.5px;color:var(--mut);line-height:1.42}\n@media(max-width:900px){.levers-grid{grid-template-columns:1fr 1fr}}\n@media(max-width:560px){.levers-grid{grid-template-columns:1fr}}\n#platform{border-top:1px solid var(--line)}\n.plat-sub{color:var(--mut);font-size:18px;margin-top:18px;max-width:60ch}\n.flow-strip{position:relative;display:flex;flex-wrap:wrap;margin-top:40px;border:1px solid var(--line);border-radius:16px;overflow:hidden;background:var(--panel)}\n.flow-strip::before{content:\"\";position:absolute;top:0;left:0;right:0;height:3px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 12s linear infinite;z-index:1}\n.fnode{flex:1;min-width:130px;padding:26px 16px;text-align:center;border-right:1px solid var(--line)}\n.fnode:last-child{border-right:0}\n.fn-code{font-family:var(--mono);font-size:13px;letter-spacing:.1em;font-weight:600;color:var(--ink)}\n.fn-lbl{font-size:12.5px;color:var(--mut);margin-top:7px}\n.eng-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;margin-top:26px}\n.eng-row .eng-lead{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}\n.eng-chip{font-family:var(--mono);font-size:11px;color:var(--mut);border:1px solid var(--line);border-radius:8px;padding:6px 11px}\n@media(max-width:600px){.fnode{flex:1 0 50%;border-bottom:1px solid var(--line)}}\n#alternatives{border-top:1px solid var(--line)}\n.alt-pills{display:flex;flex-wrap:wrap;gap:10px;margin-top:34px}\n.alt-pill{font-family:var(--mono);font-size:12px;letter-spacing:.06em;border:1px solid var(--line);border-radius:999px;padding:9px 16px;color:var(--mut);text-decoration:line-through;text-decoration-color:rgba(255,106,77,.5)}\n.alt-verdict{margin-top:24px;font-size:clamp(20px,3.2vw,34px);font-weight:800;letter-spacing:-.01em;text-wrap:balance}\n.alt-nos{display:flex;flex-wrap:wrap;gap:14px 22px;margin-top:22px}\n.alt-no{display:flex;align-items:center;gap:9px;font-size:15px;color:var(--mut)}\n.alt-no .x{color:var(--bad);font-weight:800;font-family:var(--mono)}\n.alt-counter{margin-top:32px;padding-top:26px;border-top:1px solid var(--line);font-size:clamp(18px,2.4vw,26px);font-weight:700;letter-spacing:-.01em}\n.alt-counter em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n#products{border-top:1px solid var(--line)}\n.prod-wrap{display:grid;grid-template-columns:minmax(340px,440px) 1fr;gap:70px;align-items:center;margin-top:20px}\n.ring{position:relative;width:100%;aspect-ratio:1;max-width:440px;margin:0 auto}\n.ring .orb{position:absolute;width:15.5%;aspect-ratio:1;border-radius:50%;transform:translate(-50%,-50%);cursor:pointer;box-shadow:0 0 20px currentColor,inset 0 2px 6px rgba(255,255,255,.35);animation:orbglow 4.5s ease-in-out infinite;transition:transform .4s var(--spring),filter .3s}\n.ring .orb:hover,.ring .orb.on{transform:translate(-50%,-50%) scale(1.22);filter:brightness(1.12)}\n.ring .orb::after{content:attr(data-code);position:absolute;left:50%;top:118%;transform:translateX(-50%);font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--mut);white-space:nowrap}\n.ring .center{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center}\n.ring .center .mark{font-size:40px;color:#fff}\n.ring .center small{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.2em;color:var(--faint);margin-top:6px;text-transform:uppercase}\n.prod-detail .code{font-family:var(--mono);font-size:13px;letter-spacing:.18em;color:var(--pc,#fff)}\n.prod-detail h3{font-size:clamp(26px,3.4vw,40px);font-weight:800;letter-spacing:-.01em;margin:8px 0 14px;text-wrap:balance}\n.prod-detail p{color:var(--mut);font-size:18px;max-width:40ch}\n.prod-detail .what{color:var(--faint);font-family:var(--mono);font-size:12px;letter-spacing:.06em;margin-top:16px;text-transform:uppercase}\n.prod-detail .soon{display:inline-block;margin-left:8px;font-family:var(--mono);font-size:10px;color:#08080a;background:var(--warn);border-radius:999px;padding:2px 8px;letter-spacing:.1em}\n.prod-showcase{display:flex;flex-direction:column;align-items:center;gap:6px}\n.prod-showcase .ring{margin:16px auto 6px}\n.pgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:34px;width:100%}\n.pcard{border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:18px 18px 20px;display:flex;flex-direction:column;gap:7px;transition:transform .4s var(--spring),border-color .4s,background .4s}\n.pcard:hover{transform:translateY(-3px);border-color:color-mix(in srgb,var(--pc) 55%,var(--line));background:var(--panel2)}\n.pcard .ptop{display:flex;align-items:center;gap:9px}\n.pcard .pcdot{width:10px;height:10px;border-radius:50%;background:var(--pc);box-shadow:0 0 12px var(--pc);flex:none}\n.pcard .pccode{font-family:var(--mono);font-size:12px;letter-spacing:.14em;color:var(--pc)}\n.pcard .pcname{font-size:16px;font-weight:700;letter-spacing:-.01em}\n.pcard .pctag{font-size:13px;color:var(--mut);line-height:1.45}\n.pcard .soon{margin-left:auto;font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:#08080a;background:var(--warn);border-radius:999px;padding:2px 7px}\n@media(max-width:900px){.pgrid{grid-template-columns:1fr 1fr}}\n@media(max-width:560px){.pgrid{grid-template-columns:1fr}}\n#deliver{border-top:1px solid var(--line)}\n.deliver-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:44px}\n.card{border:1px solid var(--line);border-radius:18px;background:var(--panel);padding:34px;position:relative;overflow:hidden;transition:transform .45s var(--spring),box-shadow .4s,border-color .4s}\n.card:hover{transform:translateY(-3px);box-shadow:0 22px 60px rgba(0,0,0,.5);border-color:rgba(255,255,255,.16)}\n.card .accent{height:6px;border-radius:999px;background:var(--worm);background-size:var(--tile) 100%;animation:flow 15s linear infinite;margin-bottom:22px;width:64px}\n.card h3{font-size:26px;font-weight:700;letter-spacing:-.01em;margin-bottom:10px}\n.card>p{color:var(--mut);font-size:16px;margin-bottom:20px;max-width:42ch}\n.flavors{display:flex;gap:10px;flex-wrap:wrap}\n.flavor{font-family:var(--mono);font-size:12px;letter-spacing:.08em;border:1px solid var(--line);border-radius:10px;padding:9px 14px;color:var(--ink)}\n.card .own{font-size:clamp(28px,3.6vw,44px);font-weight:800;letter-spacing:-.02em;line-height:1;margin-bottom:14px}\n.card .own em{font-style:normal;background:var(--worm);background-size:var(--tile) 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:flow 15s linear infinite}\n.fde-band{margin-top:26px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;border:1px solid var(--line);border-radius:16px;background:var(--panel2);padding:22px 28px}\n.fde-flow{display:flex;flex-wrap:wrap;align-items:center;gap:12px;font-size:clamp(16px,2vw,22px);font-weight:700;letter-spacing:-.01em}\n.fde-flow i{color:var(--blue);font-style:normal;font-weight:400}\n.fde-pay{font-family:var(--mono);font-size:13px;letter-spacing:.06em;color:var(--mut)}\n.cta-kicker{font-family:var(--mono);font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--faint);margin-bottom:20px}\n#cta .cta-row{display:flex;gap:14px;flex-wrap:wrap;justify-content:center}\n#cta{border-top:1px solid var(--line);text-align:center;align-items:center}\n#cta .big{font-size:clamp(34px,6vw,84px);font-weight:800;letter-spacing:-.02em;line-height:.95;text-transform:uppercase;text-wrap:balance}\n#cta .sub{color:var(--mut);font-size:19px;margin:22px auto 40px;max-width:44ch}\nfooter{padding:60px 40px 50px;border-top:1px solid var(--line);background:var(--panel)}\n.foot{max-width:1180px;margin:0 auto;display:flex;justify-content:space-between;align-items:flex-start;gap:40px;flex-wrap:wrap}\n.foot .mark{font-size:30px}\n.foot .cols{display:flex;gap:60px;flex-wrap:wrap}\n.foot .fc h5{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin-bottom:14px}\n.foot .fc a{display:block;color:var(--mut);font-size:14px;margin-bottom:9px;transition:color .2s}\n.foot .fc a:hover{color:#fff}\n.foot .fine{width:100%;border-top:1px solid var(--line);margin-top:36px;padding-top:22px;display:flex;justify-content:space-between;color:var(--faint);font-size:12px;font-family:var(--mono);letter-spacing:.04em;flex-wrap:wrap;gap:10px}\n.rail{position:absolute;right:22px;transform:translateY(-50%);z-index:40;display:flex;flex-direction:column;gap:12px}\n.rail a{width:9px;height:9px;border-radius:50%;border:1.4px solid rgba(255,255,255,.4);transition:.3s var(--spring)}\n.rail a.on{background:#fff;border-color:#fff;transform:scale(1.15)}\n.rail a:hover{border-color:#fff}\n@media(max-width:900px){\n  .navlinks{display:none}\n  .burger{display:flex}\n  header.nav.open .navlinks{display:flex;position:absolute;top:100%;left:0;right:0;flex-direction:column;gap:0;background:rgba(6,6,8,.96);backdrop-filter:blur(16px);padding:10px 40px 24px;border-bottom:1px solid var(--line)}\n  header.nav.open .navlinks a{padding:12px 0;border-bottom:1px solid var(--line2)}\n  section{padding:90px 24px}\n  .industry .inner{grid-template-columns:1fr;gap:34px}\n  .threads-grid{grid-template-columns:1fr}\n  .prod-wrap{grid-template-columns:1fr;gap:40px}\n  .deliver-grid{grid-template-columns:1fr}\n  .triad{grid-template-columns:1fr}\n  .baband{grid-template-columns:1fr;gap:12px}\n  .baband .arrow{transform:rotate(90deg)}\n  .rail{display:none}\n  .credit{display:none}\n}\n`,\n  render(d2){\n    return `<div class=\"d2site\" id=\"site\">\n<svg width=\"0\" height=\"0\" aria-hidden=\"true\" style=\"position:absolute;width:0;height:0;overflow:hidden\"><symbol id=\"d2wm\" viewBox=\"0 0 459.554 148.471\"><g transform=\"translate(-678.859 -300.605)\"><path d=\"M14.359-122.138H75.428a148.024,148.024,0,0,1,16.175.865,49.592,49.592,0,0,1,16.349,5.017,50.6,50.6,0,0,1,14.445,10.38,58.331,58.331,0,0,1,9.774,13.58,61.26,61.26,0,0,1,5.536,15.483,77.146,77.146,0,0,1,1.73,16.089q0,17.819-6.92,30.708A54.761,54.761,0,0,1,114.7-9.861a51.9,51.9,0,0,1-11.072,5.45,68.767,68.767,0,0,1-11.5,2.941,98.6,98.6,0,0,1-11.5,1.211Q74.909,0,69.719,0H14.359ZM26.469-10.207H65.394q6.055,0,12.369-.173a73.177,73.177,0,0,0,12.37-1.384A64.307,64.307,0,0,0,101.9-15.311a37.089,37.089,0,0,0,10.726-6.834,39.087,39.087,0,0,0,11.245-17.473,68.5,68.5,0,0,0,3.114-20.414,67.7,67.7,0,0,0-2.6-18.857,47.079,47.079,0,0,0-8.131-16.089,39.361,39.361,0,0,0-10.553-9.688,48.312,48.312,0,0,0-11.245-5.1,45.376,45.376,0,0,0-10.553-1.9q-5.017-.259-8.3-.259H26.469ZM263.133-.173q-2.595.346-5.1.519t-5.277.173q-7.266,0-10.207-3.114t-3.979-10.034q-2.595,1.9-6.4,4.411a59.467,59.467,0,0,1-9.256,4.844,68.866,68.866,0,0,1-12.8,3.893,82.923,82.923,0,0,1-17.04,1.557q-11.764,0-17.387-1.9a56.36,56.36,0,0,1-7.525-2.941,28.342,28.342,0,0,1-9.6-9.255A24.591,24.591,0,0,1,154.835-25.6a24.907,24.907,0,0,1,3.027-12.456,25.929,25.929,0,0,1,7.353-8.477,36.879,36.879,0,0,1,11.937-5.19,103.75,103.75,0,0,1,16.694-2.768q9.429-.865,20.76-1.125t23.788-.433a48.376,48.376,0,0,0-.605-7.612,12.089,12.089,0,0,0-3.893-6.92Q230.609-73.7,223.43-75.6T203.1-77.5a85.006,85.006,0,0,0-16.521,1.3,30.566,30.566,0,0,0-10.034,3.633,16.669,16.669,0,0,0-5.622,5.536,33.568,33.568,0,0,0-3.114,7.006l-11.937-.519a40.255,40.255,0,0,1,1.557-5.277,28.9,28.9,0,0,1,2.941-5.8,30.014,30.014,0,0,1,8.217-8.391,39.385,39.385,0,0,1,10.294-4.93,58.16,58.16,0,0,1,11.591-2.335q6.055-.606,12.11-.606,4.152,0,8.736.259a85.752,85.752,0,0,1,9.256,1.038,90.48,90.48,0,0,1,9.082,1.99,31.348,31.348,0,0,1,7.872,3.287,19.89,19.89,0,0,1,6.4,5.622,25.409,25.409,0,0,1,3.374,6.574,27.817,27.817,0,0,1,1.384,6.4q.259,3.028.259,4.757v36.5a29.841,29.841,0,0,0,.519,5.968,8.188,8.188,0,0,0,1.99,4.066,8.512,8.512,0,0,0,4.238,2.249,24.406,24.406,0,0,0,7.439.346ZM238.567-46.364q-9.688,0-19.549.173t-18.511.951a108,108,0,0,0-15.484,2.422,30.135,30.135,0,0,0-10.639,4.411,16.457,16.457,0,0,0-5.622,6.142,15.459,15.459,0,0,0-1.643,6.833q0,5.882,3.2,9.342a20.362,20.362,0,0,0,7.612,5.19,35.483,35.483,0,0,0,9,2.249,69.488,69.488,0,0,0,7.525.519,66.684,66.684,0,0,0,12.369-1.125A73.708,73.708,0,0,0,217.893-12.2a41.312,41.312,0,0,0,8.91-4.325,34.318,34.318,0,0,0,6.228-5.1,20.75,20.75,0,0,0,4.844-10.726A86.815,86.815,0,0,0,238.567-46.364Zm53.8-73.7v34.6h24.22v9H292.37v40.655q0,6.228.259,11.332a26.276,26.276,0,0,0,1.816,8.823,11.668,11.668,0,0,0,4.931,5.709q3.373,1.989,9.6,1.99a58.913,58.913,0,0,0,7.612-.519V.692q-2.941.519-5.622.865a45.4,45.4,0,0,1-5.8.346,33.2,33.2,0,0,1-11.937-1.99A16.222,16.222,0,0,1,285.1-6.747a25.125,25.125,0,0,1-3.547-11.245q-.605-6.574-.605-15.743V-76.466H264.69v-9h16.262v-29.064ZM432.522-.188c-1.73.231-3.28.419-4.952.534s-3.431.173-5.276.173q-7.266,0-10.207-3.114t-3.979-10.034q-2.595,1.9-6.4,4.411a59.465,59.465,0,0,1-9.256,4.844,68.865,68.865,0,0,1-12.8,3.893,82.922,82.922,0,0,1-17.04,1.557q-11.764,0-17.386-1.9A56.359,56.359,0,0,1,337.7-2.768a28.342,28.342,0,0,1-9.6-9.255,24.591,24.591,0,0,1-3.72-13.581A24.907,24.907,0,0,1,327.4-38.06a25.929,25.929,0,0,1,7.352-8.477,36.879,36.879,0,0,1,11.937-5.19,103.749,103.749,0,0,1,16.694-2.768q9.429-.865,20.76-1.125t23.788-.433a48.378,48.378,0,0,0-.605-7.612,12.089,12.089,0,0,0-3.893-6.92Q400.149-73.7,392.97-75.6t-20.327-1.9a85.006,85.006,0,0,0-16.522,1.3,30.566,30.566,0,0,0-10.034,3.633,16.669,16.669,0,0,0-5.622,5.536,33.567,33.567,0,0,0-3.114,7.006l-11.937-.519a40.254,40.254,0,0,1,1.557-5.277,28.9,28.9,0,0,1,2.941-5.8,30.014,30.014,0,0,1,8.217-8.391,39.385,39.385,0,0,1,10.294-4.93,58.159,58.159,0,0,1,11.591-2.335q6.055-.606,12.11-.606,4.152,0,8.736.259a85.751,85.751,0,0,1,9.256,1.038A90.482,90.482,0,0,1,399.2-84.6a31.348,31.348,0,0,1,7.872,3.287,19.891,19.891,0,0,1,6.4,5.622,25.409,25.409,0,0,1,3.374,6.574,27.818,27.818,0,0,1,1.384,6.4q.26,3.028.259,4.757v36.5a29.841,29.841,0,0,0,.519,5.968A8.189,8.189,0,0,0,421-11.418a8.512,8.512,0,0,0,4.238,2.249,23.452,23.452,0,0,0,7.288.331ZM408.107-46.364q-9.688,0-19.549.173t-18.511.951a108,108,0,0,0-15.483,2.422,30.135,30.135,0,0,0-10.639,4.411,16.457,16.457,0,0,0-5.622,6.142,15.459,15.459,0,0,0-1.643,6.833q0,5.882,3.2,9.342a20.362,20.362,0,0,0,7.612,5.19,35.483,35.483,0,0,0,9,2.249,69.488,69.488,0,0,0,7.525.519,66.684,66.684,0,0,0,12.37-1.125A73.707,73.707,0,0,0,387.434-12.2a41.312,41.312,0,0,0,8.91-4.325,34.318,34.318,0,0,0,6.228-5.1,20.749,20.749,0,0,0,4.844-10.726A86.812,86.812,0,0,0,408.107-46.364Z\" transform=\"translate(664.5 447)\" fill=\"#fff\"/><path d=\"M.512-37.631C.512-44,2.263-49.153,5.339-53.064a33.374,33.374,0,0,1,11.47-9.294q9.822-4.878,12.755-7.251A7.727,7.727,0,0,0,32.5-75.937a9.882,9.882,0,0,0-2.439-6.987q-2.439-2.637-7.778-2.637T14.832-82.2a15.491,15.491,0,0,0-2.175,8.174H2.307q0-9.888,5.636-15.128t14.667-5.24q9.163,0,14.733,4.417t5.57,12.92q0,7.844-4.054,11.865t-12.821,8.24q-11.272,5.076-13.25,10.085H42.913v9.229Z\" transform=\"translate(1095.5 395)\" fill=\"#fff\"/></g></symbol></svg>\n<header class=\"nav\" id=\"nav\">\n  <a href=\"#hero\" class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:22px\"><use href=\"#d2wm\"></use></svg></a>\n  <nav class=\"navlinks\">\n    <a href=\"#industries\" data-pt=\"Indústrias\" data-en=\"Industries\">Indústrias</a>\n    <a href=\"#products\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</a>\n    <a href=\"#deliver\" data-pt=\"Como entregamos\" data-en=\"How we deliver\">Como entregamos</a>\n    <a href=\"#proof\" data-pt=\"Clientes\" data-en=\"Customers\">Clientes</a>\n    <a href=\"#cta\" data-pt=\"Demo\" data-en=\"Demo\">Demo</a>\n  </nav>\n  <div class=\"navctl\">\n    <div class=\"lang\" id=\"lang\"><button data-l=\"pt\" class=\"on\">PT</button><button data-l=\"en\">EN</button><button data-l=\"zh\">中文</button></div>\n    <a href=\"#\" class=\"signin\" data-pt=\"Entrar\" data-en=\"Sign in\">Entrar</a>\n    <button class=\"burger\" id=\"burger\" aria-label=\"menu\"><span></span><span></span><span></span></button>\n  </div>\n</header>\n<div class=\"rail\" id=\"rail\"></div>\n<section id=\"hero\">    <canvas class=\"herofx\"></canvas>\n  <div class=\"inner\">\n    <div class=\"hero-kicker reveal\" data-pt=\"Tudo em um só lugar: soluções que habilitam escala enterprise\" data-en=\"One-stop-shop for enterprise-scale enabling solutions\" data-zh=\"一站式企业级赋能解决方案\">One-stop-shop for enterprise-scale enabling solutions</div>\n    <h1 class=\"h1\" data-pt=\"EXPRESSE-SE<br>EM ESCALA.\" data-en=\"EXPRESS YOURSELF<br>AT SCALE.\">EXPRESSE-SE<br>EM ESCALA.</h1>\n    <p class=\"sub\" data-pt=\"Do problema de negócio ao software em produção. A Data² é a suíte que transforma qualquer time no time que entrega.\" data-en=\"From a business problem to software in production. Data² is the suite that turns any team into the team that ships.\">Do problema de negócio ao software em produção.</p>\n    <div class=\"cta\">\n      <a href=\"#industries\" class=\"btn\"><span data-pt=\"Ver o que é possível\" data-en=\"See what's possible\">Ver o que é possível</span></a>\n      <a href=\"#cta\" class=\"btn ghost\"><span data-pt=\"Agendar demo\" data-en=\"Book a demo\">Agendar demo</span></a>\n    </div>\n    <div class=\"herostrip reveal\">\n      <div class=\"hs-clients\"><span class=\"hs-lead\" data-pt=\"Já em produção com\" data-en=\"Already in production with\">Já em produção com</span><span class=\"hs-logos\">Natura · XP · Americanas · Whirlpool · Arcadis · Raízen</span></div>\n      <div class=\"hs-steps\"><span class=\"hs-step\"><b>30 min</b> <span data-pt=\"mapeamos onde dói\" data-en=\"we map where it hurts\">mapeamos onde dói</span></span><span class=\"hs-arrow\">→</span><span class=\"hs-step\"><b data-pt=\"2–4 semanas\" data-en=\"2–4 weeks\">2–4 semanas</b> <span data-pt=\"sprint com engenheiro embarcado\" data-en=\"sprint with an embedded engineer\">sprint com engenheiro embarcado</span></span><span class=\"hs-arrow\">→</span><span class=\"hs-step\"><b data-pt=\"Em produção\" data-en=\"In production\">Em produção</b> <span data-pt=\"seu time é dono\" data-en=\"your team owns it\">seu time é dono</span></span></div>\n    </div>\n  </div>\n  <div class=\"credit\">\n    <b data-pt=\"Imagens do Projeto Synthesys da Data².\" data-en=\"Imagery from the Data² Synthesys Project.\">Imagens do Projeto Synthesys da Data².</b>\n    <p data-pt=\"Synthesys é um conceito criado e capturado por Lívia Elektra, representando o poder de expressão e liberdade que a Data² proporciona.\" data-en=\"Synthesys is a concept created and captured by Lívia Elektra, representing the power of expression and freedom that Data² provides.\">.</p>\n  </div>\n  <div class=\"scrollcue\"><span data-pt=\"ROLE\" data-en=\"SCROLL\">ROLE</span><i></i></div>\n</section>\n<section id=\"essence\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"A Data² em uma tela\" data-en=\"Data² in one screen\">A Data² em uma tela</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"O que vemos, o que fazemos e para quem.\" data-en=\"What we see, what we do, and who for.\">O que vemos, o que fazemos e para quem.</h2>\n    <div class=\"triad\">\n      <div class=\"tri reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"q\" data-pt=\"O que vemos\" data-en=\"What we see\">O que vemos</div>\n        <h3 data-pt=\"Toda área tem um <em>software esperando pra existir</em>.\" data-en=\"Every area has <em>software waiting to exist</em>.\">.</h3>\n        <p data-pt=\"A tecnologia já permite construir quase tudo. O que faltava era a ponte direta entre quem conhece o problema e a solução rodando em produção.\" data-en=\"Technology already lets us build almost anything. What was missing is the direct bridge between the people who know the problem and the solution running in production.\">.</p>\n      </div>\n      <div class=\"tri reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"q\" data-pt=\"O que fazemos\" data-en=\"What we do\">O que fazemos</div>\n        <h3 data-pt=\"Uma suíte que vira <em>software de verdade</em>.\" data-en=\"A suite that becomes <em>real software</em>.\">.</h3>\n        <p data-pt=\"8 produtos com AI, omnichannel, dados reais, automação e dashboards — montados no builder visual e publicados em produção. Sem código.\" data-en=\"8 products with AI, omnichannel, real data, automation and dashboards — assembled in the visual builder and shipped to production. No code.\">.</p>\n        <div class=\"foot\"><div class=\"prod-row\"><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">MEDIA</span><span class=\"chip\">ID</span><span class=\"chip\">CONNECT</span><span class=\"chip\">DOMAIN</span><span class=\"chip\">RUSH</span><span class=\"chip\">CASHIER</span></div></div>\n      </div>\n      <div class=\"tri reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"q\" data-pt=\"Para quem\" data-en=\"Who for\">Para quem</div>\n        <h3 data-pt=\"Para a área que <em>tem o problema</em>.\" data-en=\"For the area that <em>owns the problem</em>.\">.</h3>\n        <p data-pt=\"Times de negócio de grandes empresas que não querem mais esperar. Nós somos os enablers entre a ideia e a produção.\" data-en=\"Business teams at large companies that won't wait anymore. We are the enablers between the idea and production.\">.</p>\n        <div class=\"inames\" data-pt=\"RH · Supply · Financeiro · CX · Varejo · Vendas · BI · Seguros · Compras\" data-en=\"HR · Supply · Financial · CX · Retail · Sales · BI · Insurance · Procurement\">RH · Supply · Financeiro · CX · Varejo · Vendas · BI · Seguros · Compras</div>\n      </div>\n    </div>\n    <div class=\"baband reveal\">\n      <div class=\"before\"><div class=\"k\" data-pt=\"Antes\" data-en=\"Before\">Antes</div><p data-pt=\"Da ideia à entrega: muitas mãos, muitas traduções, muito tempo.\" data-en=\"From idea to delivery: many hands, many translations, a lot of time.\">.</p></div>\n      <div class=\"arrow\">→</div>\n      <div class=\"after\"><div class=\"k\" data-pt=\"Com a Data²\" data-en=\"With Data²\">Com a Data²</div><p data-pt=\"A própria área desenha, conecta o dado real, publica e opera. Em produção.\" data-en=\"The business area itself designs, connects the real data, ships and operates. In production.\">.</p></div>\n    </div>\n  </div>\n</section>\n<section id=\"glance\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Panorama\" data-en=\"At a glance\" data-zh=\"概览\">Panorama</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"As frentes onde já entregamos\" data-en=\"Where we already deliver\" data-zh=\"我们已交付的领域\">As frentes onde já entregamos</h2>\n    <div class=\"glance-grid\">\n      <div class=\"gcard reveal\" style=\"--hue:#5b86ff\"><span class=\"num\">01</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"5\" y=\"8\" width=\"20\" height=\"14\" rx=\"4\"></rect><rect class=\"b2\" x=\"17\" y=\"19\" width=\"18\" height=\"13\" rx=\"4\"></rect></svg></span><span class=\"gname\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\" data-zh=\"人力资源\">RH & Pessoas</span><span class=\"gval\" data-pt=\"Atendimento ao colaborador com AI\" data-en=\"AI employee support\" data-zh=\"AI 员工服务\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#4de0a1\"><span class=\"num\">02</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"9\" y=\"23\" width=\"22\" height=\"9\" rx=\"2\"></rect><rect class=\"bx\" x=\"14\" y=\"9\" width=\"12\" height=\"10\" rx=\"2\"></rect></svg></span><span class=\"gname\" data-pt=\"Supply & Operações\" data-en=\"Supply & Operations\" data-zh=\"供应与运营\">Supply & Operações</span><span class=\"gval\" data-pt=\"Cenários que viram plano de produção\" data-en=\"Scenarios into production plans\" data-zh=\"情景转化为生产计划\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#e8b84d\"><span class=\"num\">03</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><circle cx=\"8\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"20\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"32\" cy=\"20\" r=\"3.2\"></circle><path d=\"M11.5 20h5.5M23 20h5.5\"></path><circle class=\"dot\" cx=\"8\" cy=\"20\" r=\"2.4\"></circle></svg></span><span class=\"gname\" data-pt=\"Serviços Financeiros\" data-en=\"Financial Services\" data-zh=\"金融服务\">Serviços Financeiros</span><span class=\"gval\" data-pt=\"Prospecção 1-a-1 personalizada por AI\" data-en=\"AI-personalized outreach\" data-zh=\"AI 个性化触达\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#4ddfe6\"><span class=\"num\">04</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"5\" y=\"8\" width=\"20\" height=\"14\" rx=\"4\"></rect><rect class=\"b2\" x=\"17\" y=\"19\" width=\"18\" height=\"13\" rx=\"4\"></rect></svg></span><span class=\"gname\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\" data-zh=\"客户体验\">CX & Contact Center</span><span class=\"gval\" data-pt=\"Um contact center numa plataforma\" data-en=\"A contact center on one platform\" data-zh=\"一体化呼叫中心\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#ff4d9e\"><span class=\"num\">05</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"9\" y=\"23\" width=\"22\" height=\"9\" rx=\"2\"></rect><rect class=\"bx\" x=\"14\" y=\"9\" width=\"12\" height=\"10\" rx=\"2\"></rect></svg></span><span class=\"gname\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\" data-zh=\"零售电商\">Varejo & E-commerce</span><span class=\"gval\" data-pt=\"Da vitrine ao ERP\" data-en=\"From storefront to ERP\" data-zh=\"从门店到 ERP\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#9b5cff\"><span class=\"num\">06</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><circle cx=\"8\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"20\" cy=\"20\" r=\"3.2\"></circle><circle cx=\"32\" cy=\"20\" r=\"3.2\"></circle><path d=\"M11.5 20h5.5M23 20h5.5\"></path><circle class=\"dot\" cx=\"8\" cy=\"20\" r=\"2.4\"></circle></svg></span><span class=\"gname\" data-pt=\"Força de Vendas\" data-en=\"Sales Enablement\" data-zh=\"销售赋能\">Força de Vendas</span><span class=\"gval\" data-pt=\"Copiloto de vendas para a força\" data-en=\"A sales copilot for the field\" data-zh=\"一线销售副驾\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#84e05a\"><span class=\"num\">07</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect class=\"bar bar1\" x=\"8\" y=\"12\" width=\"6\" height=\"20\" rx=\"1.5\"></rect><rect class=\"bar bar2\" x=\"17\" y=\"12\" width=\"6\" height=\"20\" rx=\"1.5\"></rect><rect class=\"bar bar3\" x=\"26\" y=\"12\" width=\"6\" height=\"20\" rx=\"1.5\"></rect></svg></span><span class=\"gname\" data-pt=\"BI & Analytics\" data-en=\"BI & Analytics\" data-zh=\"数据分析\">BI & Analytics</span><span class=\"gval\" data-pt=\"Do dado vivo ao plano de ação\" data-en=\"Live data to action plan\" data-zh=\"从实时数据到行动计划\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#ff6a4d\"><span class=\"num\">08</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"5\" y=\"8\" width=\"20\" height=\"14\" rx=\"4\"></rect><rect class=\"b2\" x=\"17\" y=\"19\" width=\"18\" height=\"13\" rx=\"4\"></rect></svg></span><span class=\"gname\" data-pt=\"Seguros & CX\" data-en=\"Insurance & CX\" data-zh=\"保险\">Seguros & CX</span><span class=\"gval\" data-pt=\"Conhecimento com busca semântica\" data-en=\"Semantic knowledge base\" data-zh=\"语义知识库\">.</span></div>\n      <div class=\"gcard reveal\" style=\"--hue:#e8e84d\"><span class=\"num\">09</span><span class=\"gicon\"><svg class=\"gsvg\" viewBox=\"0 0 40 40\"><rect x=\"9\" y=\"23\" width=\"22\" height=\"9\" rx=\"2\"></rect><rect class=\"bx\" x=\"14\" y=\"9\" width=\"12\" height=\"10\" rx=\"2\"></rect></svg></span><span class=\"gname\" data-pt=\"Compras & Procurement\" data-en=\"Procurement\" data-zh=\"采购\">Compras & Procurement</span><span class=\"gval\" data-pt=\"Modelagem e planejamento de compras\" data-en=\"Sourcing modeling & planning\" data-zh=\"采购建模与规划\">.</span></div>\n    </div>\n    \n  </div>\n</section>\n\n<section id=\"cases\" style=\"padding:0;position:relative;background:#04050a\">${d2.render('www@nUYyYfWeNHEK6YeaD5kcd',{},{style:'display:block;width:100%;height:86vh'})}</section>\n\n<section id=\"proof\">\n  <p class=\"lead\" data-pt=\"Times de negócio já constroem na Data²\" data-en=\"Business teams already build on Data²\">Times de negócio já constroem na Data²</p>\n  <div class=\"logos\">\n    <span class=\"lg\">Natura</span><span class=\"lg\">XP</span><span class=\"lg\">Americanas</span><span class=\"lg\">Vivara</span><span class=\"lg\">Avon</span><span class=\"lg\">Justos</span>\n  </div>\n</section>\n<section id=\"industries\">\n  <div class=\"ind-head\">\n    <p class=\"eyebrow reveal\" data-pt=\"O que é possível\" data-en=\"What's possible\">O que é possível</p>\n    <h2 class=\"reveal\" style=\"margin-top:16px\" data-pt=\"Uma plataforma. Toda indústria.\" data-en=\"One platform. Every industry.\">Uma plataforma. Toda indústria.</h2>\n    <p class=\"reveal\" data-pt=\"Não vendemos slides. Cada frente abaixo é software real, em produção, construído pela própria área de negócio.\" data-en=\"We don't sell slides. Each frontier below is real software, in production, built by the business area itself.\">.</p>\n  </div>\n  <div class=\"indacc reveal\" id=\"indacc\">\n  <div class=\"acc-item\" style=\"--hue:#5b86ff\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\">RH & Pessoas</span><span class=\"acc-val\" data-pt=\"Atendimento ao colaborador com AI\" data-en=\"AI employee support\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Assistente de AI para o colaborador\" data-en=\"AI assistant for employees\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Transbordo para atendimento humano\" data-en=\"Handoff to human agents\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Leitura de documentos (OCR)\" data-en=\"Document reading (OCR)\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Respostas e regras configuráveis pela área\" data-en=\"Answers & rules configured by the team\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Analytics e CSAT\" data-en=\"Analytics & CSAT\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#4de0a1\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Supply & Operações\" data-en=\"Supply & Operations\">Supply & Operações</span><span class=\"acc-val\" data-pt=\"Cenários que viram plano de produção\" data-en=\"Scenarios into production plans\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Simulação de cenários de produção\" data-en=\"Production scenario simulation\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Explosão de estrutura (BOM)\" data-en=\"Bill-of-materials explosion\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Score de economia e viabilidade\" data-en=\"Savings & feasibility scoring\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"SQL self-service sobre o data lake\" data-en=\"Self-service SQL over the data lake\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Exportação para planilha\" data-en=\"Export to spreadsheet\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#e8b84d\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Serviços Financeiros\" data-en=\"Financial Services\">Serviços Financeiros</span><span class=\"acc-val\" data-pt=\"Prospecção 1-a-1 personalizada por AI\" data-en=\"AI-personalized outreach\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"CRM + automação de outreach\" data-en=\"CRM + outreach automation\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Ondas de mensagens omnichannel\" data-en=\"Omnichannel message waves\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Copy gerada por AI no tom do lead\" data-en=\"AI-written copy in the lead's tone\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Modelagem de proposta e ROI\" data-en=\"Offer & ROI modeling\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"SSO corporativo\" data-en=\"Corporate SSO\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#4ddfe6\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</span><span class=\"acc-val\" data-pt=\"Um contact center numa plataforma\" data-en=\"A contact center on one platform\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"universe\"><div class=\"uni-head\"><h3 data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</h3><p data-pt=\"Um contact center inteiro numa plataforma — cada peça, um módulo Data².\" data-en=\"An entire contact center on one platform — each piece, a Data² module.\" data-zh=\"一体化呼叫中心 —— 每个环节都是一个 Data² 模块。\">.</p></div><div class=\"uni-grid\"><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m0\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Webchat omnichannel\" data-en=\"Omnichannel webchat\">.</div><div class=\"deliv-d\" data-pt=\"Widget no site + WhatsApp, voz e e-mail no mesmo fluxo.\" data-en=\"On-site widget + WhatsApp, voice and email in one flow.\" data-zh=\"网站挂件 + WhatsApp、语音与邮件，统一流程。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m1\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Bot de triagem com AI\" data-en=\"AI triage bot\">.</div><div class=\"deliv-d\" data-pt=\"A AI entende a intenção, resolve o simples e classifica o resto.\" data-en=\"AI reads intent, resolves the simple, routes the rest.\" data-zh=\"AI 理解意图，解决简单问题，分流其余。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m2\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Transbordo bot → humano\" data-en=\"Bot → human handoff\">.</div><div class=\"deliv-d\" data-pt=\"Passagem fluida do bot pro atendente, com todo o contexto.\" data-en=\"Seamless bot-to-human handoff, with full context.\" data-zh=\"从机器人到人工的无缝转接，携带完整上下文。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m3\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Console de agente + supervisor\" data-en=\"Agent workspace + supervisor console\">.</div><div class=\"deliv-d\" data-pt=\"Fila, transferências, status e supervisão num painel só.\" data-en=\"Queue, transfers, status and supervision in one console.\" data-zh=\"队列、转接、状态与督导，集于一个控制台。\">.</div></div></div><div class=\"deliv\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m4\" width=\"100\" height=\"100\"></use></svg></div><div class=\"deliv-tx\"><div class=\"deliv-t\" data-pt=\"Automação de filas e CSAT\" data-en=\"Queue automation & CSAT\">.</div><div class=\"deliv-d\" data-pt=\"Filas que se auto-gerenciam, detecção de abandono e pesquisa de satisfação.\" data-en=\"Self-managing queues, abandonment detection and CSAT surveys.\" data-zh=\"自我管理的队列、弃单检测与满意度调查。\">.</div></div></div></div><div class=\"uni-prods\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">UI</span><span class=\"chip\">MEDIA</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#ff4d9e\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\">Varejo & E-commerce</span><span class=\"acc-val\" data-pt=\"Da vitrine ao ERP\" data-en=\"From storefront to ERP\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Experiências de catálogo e produto\" data-en=\"Catalog & product experiences\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Integração VTEX / GraphQL\" data-en=\"VTEX / GraphQL integration\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Estúdio de foto com AI\" data-en=\"AI photo studio\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"ERP e operações de loja\" data-en=\"ERP & store operations\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">MEDIA</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#9b5cff\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Força de Vendas\" data-en=\"Sales Enablement\">Força de Vendas</span><span class=\"acc-val\" data-pt=\"Copiloto de vendas para a força\" data-en=\"A sales copilot for the field\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Copiloto de vendas em linguagem natural\" data-en=\"Sales copilot in natural language\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Recomendação de próxima melhor ação\" data-en=\"Next-best-action recommendation\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Busca de clientes e segmentos com AI\" data-en=\"AI search over customers & segments\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Painéis de performance da carteira\" data-en=\"Portfolio performance dashboards\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">REGISTRY</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#84e05a\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"BI & Analytics\" data-en=\"BI & Analytics\">BI & Analytics</span><span class=\"acc-val\" data-pt=\"Do dado vivo ao plano de ação\" data-en=\"Live data to action plan\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Painéis executivos sobre dado vivo\" data-en=\"Executive dashboards on live data\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Ingestão diária automatizada\" data-en=\"Automated daily ingestion\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Metas e plano de ação acompanhados\" data-en=\"Targets & action plan tracked\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Alertas e monitoramento\" data-en=\"Alerts & monitoring\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#ff6a4d\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Seguros & CX\" data-en=\"Insurance & CX\">Seguros & CX</span><span class=\"acc-val\" data-pt=\"Conhecimento com busca semântica\" data-en=\"Semantic knowledge base\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Base de conhecimento com busca semântica\" data-en=\"Semantic-search knowledge base\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Triagem e atendimento com AI\" data-en=\"AI triage & support\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Respostas ancoradas na fonte\" data-en=\"Answers grounded in the source\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Analytics de atendimento\" data-en=\"Support analytics\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">A.I.</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">UI</span></div></div></div></div>\n  <div class=\"acc-item\" style=\"--hue:#e8e84d\"><div class=\"acc-head\"><span class=\"acc-dot\"></span><span class=\"acc-name\" data-pt=\"Compras & Procurement\" data-en=\"Procurement\">Compras & Procurement</span><span class=\"acc-val\" data-pt=\"Modelagem e planejamento de compras\" data-en=\"Sourcing modeling & planning\">.</span><span class=\"acc-chev\">›</span></div><div class=\"acc-body\"><div class=\"acc-inner\"><div class=\"acc-caps\"><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Planejamento de fornecimento\" data-en=\"Supply planning\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Modelagem financeira de cenários\" data-en=\"Financial scenario modeling\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Simuladores e croquis de decisão\" data-en=\"Decision simulators & builders\">.</span></div><div class=\"acc-cap\"><span class=\"d\"></span><span data-pt=\"Compras orientadas a dado\" data-en=\"Data-driven sourcing\">.</span></div></div><div class=\"acc-prods\"><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div></div></div></div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#5b86ff\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">01 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\">RH & Pessoas</div>\n        <div class=\"ix-poss\" data-pt=\"Um RH que responde <b>milhares de colaboradores</b>, em vários idiomas — na hora.\" data-en=\"An HR that answers <b>thousands of employees</b>, in multiple languages — instantly.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Assistente de AI para o colaborador\" data-en=\"AI assistant for employees\">Assistente de AI para o colaborador</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Transbordo para atendimento humano\" data-en=\"Handoff to human agents\">Transbordo para atendimento humano</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Leitura de documentos (OCR)\" data-en=\"Document reading (OCR)\">Leitura de documentos (OCR)</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Respostas e regras configuráveis pela área\" data-en=\"Answers & rules configured by the team\">Respostas e regras configuráveis pela área</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Analytics e CSAT\" data-en=\"Analytics & CSAT\">Analytics e CSAT</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#4de0a1\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">02 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Supply & Operações\" data-en=\"Supply & Operations\">Supply & Operações</div>\n        <div class=\"ix-poss\" data-pt=\"Transformar <b>sobra de estoque em plano de produção</b> priorizado — em minutos, não semanas.\" data-en=\"Turn <b>leftover stock into a prioritized production plan</b> — in minutes, not weeks.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Simulação de cenários de produção\" data-en=\"Production scenario simulation\">Simulação de cenários de produção</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Explosão de estrutura (BOM)\" data-en=\"Bill-of-materials explosion\">Explosão de estrutura (BOM)</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Score de economia e viabilidade\" data-en=\"Savings & feasibility scoring\">Score de economia e viabilidade</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"SQL self-service sobre o data lake\" data-en=\"Self-service SQL over the data lake\">SQL self-service sobre o data lake</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Exportação para planilha\" data-en=\"Export to spreadsheet\">Exportação para planilha</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#e8b84d\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">03 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Serviços Financeiros\" data-en=\"Financial Services\">Serviços Financeiros</div>\n        <div class=\"ix-poss\" data-pt=\"Prospecção <b>1-a-1 personalizada por AI</b>, em escala de milhares — operada pelo próprio time comercial.\" data-en=\"<b>AI-personalized 1-to-1 outreach</b> at a scale of thousands — run by the commercial team itself.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"CRM + automação de outreach\" data-en=\"CRM + outreach automation\">CRM + automação de outreach</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Ondas de mensagens omnichannel\" data-en=\"Omnichannel message waves\">Ondas de mensagens omnichannel</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Copy gerada por AI no tom do lead\" data-en=\"AI-written copy in the lead's tone\">Copy gerada por AI no tom do lead</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Modelagem de proposta e ROI\" data-en=\"Offer & ROI modeling\">Modelagem de proposta e ROI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"SSO corporativo\" data-en=\"Corporate SSO\">SSO corporativo</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span><span class=\"chip\">ID</span><span class=\"chip\">A.I.</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#4ddfe6\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">04 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</div>\n        <div class=\"ix-poss\" data-pt=\"Um <b>contact center inteiro</b> — do widget no site à automação de fila — numa plataforma só.\" data-en=\"An <b>entire contact center</b> — from the on-site widget to queue automation — on a single platform.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Webchat omnichannel\" data-en=\"Omnichannel webchat\">Webchat omnichannel</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Bot de triagem com AI\" data-en=\"AI triage bot\">Bot de triagem com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Transbordo bot → humano\" data-en=\"Bot → human handoff\">Transbordo bot → humano</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Workspace de agente + console de supervisor\" data-en=\"Agent workspace + supervisor console\">Workspace de agente + console de supervisor</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Automação de filas e CSAT\" data-en=\"Queue automation & CSAT\">Automação de filas e CSAT</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">UI</span><span class=\"chip\">MEDIA</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#ff4d9e\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">05 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\">Varejo & E-commerce</div>\n        <div class=\"ix-poss\" data-pt=\"Da <b>vitrine ao ERP</b>: experiências de compra sob medida, com os dados reais do seu e-commerce.\" data-en=\"From <b>storefront to ERP</b>: tailor-made buying experiences, with your e-commerce's real data.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Experiências de catálogo e produto\" data-en=\"Catalog & product experiences\">Experiências de catálogo e produto</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Integração VTEX / GraphQL\" data-en=\"VTEX / GraphQL integration\">Integração VTEX / GraphQL</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Estúdio de foto com AI\" data-en=\"AI photo studio\">Estúdio de foto com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"ERP e operações de loja\" data-en=\"ERP & store operations\">ERP e operações de loja</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">MEDIA</span></div>\n        \n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#9b5cff\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">06 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Força de Vendas\" data-en=\"Sales Enablement\">Força de Vendas</div>\n        <div class=\"ix-poss\" data-pt=\"Um <b>copiloto de vendas</b> que diz a cada vendedor a próxima melhor ação — em linguagem natural.\" data-en=\"A <b>sales copilot</b> that tells each rep the next best action — in natural language.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Copiloto de vendas em linguagem natural\" data-en=\"Sales copilot in natural language\">Copiloto de vendas em linguagem natural</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Recomendação de próxima melhor ação\" data-en=\"Next-best-action recommendation\">Recomendação de próxima melhor ação</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Busca de clientes e segmentos com AI\" data-en=\"AI search over customers & segments\">Busca de clientes e segmentos com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Painéis de performance da carteira\" data-en=\"Portfolio performance dashboards\">Painéis de performance da carteira</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Geração de conteúdo e imagem com AI\" data-en=\"AI content & image generation\">Geração de conteúdo e imagem com AI</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">A.I.</span><span class=\"chip\">REGISTRY</span></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#84e05a\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">07 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"BI & Analytics\" data-en=\"BI & Analytics\">BI & Analytics</div>\n        <div class=\"ix-poss\" data-pt=\"Do <b>dado vivo ao plano de ação</b> — painéis que a área lê e age, sem exportar pra planilha.\" data-en=\"From <b>live data to an action plan</b> — dashboards the team reads and acts on, no spreadsheet export.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Painéis executivos sobre dado vivo\" data-en=\"Executive dashboards on live data\">Painéis executivos sobre dado vivo</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Ingestão diária automatizada\" data-en=\"Automated daily ingestion\">Ingestão diária automatizada</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Metas e plano de ação acompanhados\" data-en=\"Targets & action plan tracked\">Metas e plano de ação acompanhados</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Alertas e monitoramento\" data-en=\"Alerts & monitoring\">Alertas e monitoramento</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span><span class=\"chip\">UI</span></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#ff6a4d\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">08 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Seguros & CX\" data-en=\"Insurance & CX\">Seguros & CX</div>\n        <div class=\"ix-poss\" data-pt=\"Atendimento que <b>responde na fonte certa</b> — base de conhecimento com busca semântica e triagem por AI.\" data-en=\"Support that <b>answers from the right source</b> — a semantic knowledge base with AI triage.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Base de conhecimento com busca semântica\" data-en=\"Semantic-search knowledge base\">Base de conhecimento com busca semântica</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Triagem e atendimento com AI\" data-en=\"AI triage & support\">Triagem e atendimento com AI</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Respostas ancoradas na fonte\" data-en=\"Answers grounded in the source\">Respostas ancoradas na fonte</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Analytics de atendimento\" data-en=\"Support analytics\">Analytics de atendimento</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">A.I.</span><span class=\"chip\">CONNECT</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">UI</span></div>\n      </div>\n    </div>\n  </div>\n  <div class=\"industry\" style=\"--hue:#e8e84d\">\n    <div class=\"glow\"></div><div class=\"glow2\"></div><canvas class=\"flow\"></canvas>\n    <div class=\"inner\">\n      <div class=\"reveal\">\n        <div class=\"ix-num\">09 <span>— 09</span></div>\n        <div class=\"ix-name\" data-pt=\"Compras & Procurement\" data-en=\"Procurement\">Compras & Procurement</div>\n        <div class=\"ix-poss\" data-pt=\"<b>Excelência em compras</b>: modelagem financeira e planejamento de fornecimento, simulados em minutos.\" data-en=\"<b>Procurement excellence</b>: financial modeling and supply planning, simulated in minutes.\">.</div>\n      </div>\n      <div class=\"ix-side reveal\">\n        <div class=\"caps\">\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Planejamento de fornecimento\" data-en=\"Supply planning\">Planejamento de fornecimento</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Modelagem financeira de cenários\" data-en=\"Financial scenario modeling\">Modelagem financeira de cenários</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Simuladores e croquis de decisão\" data-en=\"Decision simulators & builders\">Simuladores e croquis de decisão</span></div>\n          <div class=\"cap\"><span class=\"dot\"></span><span data-pt=\"Compras orientadas a dado\" data-en=\"Data-driven sourcing\">Compras orientadas a dado</span></div>\n        </div>\n        <div class=\"prod-row\"><span class=\"lbl\" data-pt=\"Produtos\" data-en=\"Products\">Produtos</span><span class=\"chip\">UI</span><span class=\"chip\">REGISTRY</span><span class=\"chip\">CONNECT</span><span class=\"chip\">RUSH</span></div>\n      </div>\n    </div>\n  </div>\n</section>\n<section id=\"threads\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Em toda indústria\" data-en=\"Across every industry\">Em toda indústria</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"O mesmo motor, seja qual for o problema\" data-en=\"The same engine, whatever the problem\">O mesmo motor, seja qual for o problema</h2>\n    <div class=\"threads-grid reveal\">\n      <div class=\"thread\"><div class=\"n\">A.I.</div><div class=\"t\" data-pt=\"AI embutida\" data-en=\"AI built in\">AI embutida</div><div class=\"d\" data-pt=\"Detecção, classificação, geração e visão — em linguagem natural.\" data-en=\"Detection, classification, generation and vision — in natural language.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">OMNI</div><div class=\"t\" data-pt=\"Omnichannel\" data-en=\"Omnichannel\">Omnichannel</div><div class=\"d\" data-pt=\"WhatsApp, voz, webchat e e-mail no mesmo fluxo.\" data-en=\"WhatsApp, voice, webchat and email in one flow.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">DATA</div><div class=\"t\" data-pt=\"Dados reais + integrações\" data-en=\"Real data + integrations\">Dados reais + integrações</div><div class=\"d\" data-pt=\"Databricks, VTEX, CRMs, SSO — conectados de verdade.\" data-en=\"Databricks, VTEX, CRMs, SSO — genuinely connected.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">AUTO</div><div class=\"t\" data-pt=\"Automação\" data-en=\"Automation\">Automação</div><div class=\"d\" data-pt=\"Eventos, webhooks e agendadores reagindo em tempo real.\" data-en=\"Events, webhooks and schedulers reacting in real time.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">VIEW</div><div class=\"t\" data-pt=\"Dashboards\" data-en=\"Dashboards\">Dashboards</div><div class=\"d\" data-pt=\"Painéis e analytics sobre o dado vivo da operação.\" data-en=\"Panels and analytics over the operation's live data.\">.</div></div>\n      <div class=\"thread\"><div class=\"n\">NOCODE</div><div class=\"t\" data-pt=\"Sem código\" data-en=\"No code\">Sem código</div><div class=\"d\" data-pt=\"Tudo montado no builder visual — pela própria área.\" data-en=\"All assembled in the visual builder — by the business team itself.\">.</div></div>\n    </div>\n  </div>\n</section>\n<section id=\"levers\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Resultados\" data-en=\"Results\" data-zh=\"成果\">Resultados</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"No fim do dia, movemos KPIs.\" data-en=\"At the end of the day, we move KPIs.\" data-zh=\"归根结底，我们撬动 KPI。\">No fim do dia, movemos KPIs.</h2>\n    <p class=\"sec-sub reveal\" data-pt=\"As alavancas que a Data² move na operação dos nossos clientes — o que realmente importa no fim do dia.\" data-en=\"The levers Data² moves in our customers' operations — what actually matters at the end of the day.\" data-zh=\"Data² 在客户运营中撬动的杠杆 —— 归根结底真正重要的东西。\">.</p>\n    <div class=\"levers-grid\">\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Contact Center\" data-en=\"Contact Center\" data-zh=\"呼叫中心\">Contact Center</span><span class=\"lv-num\" data-pt=\"até <b>90%</b>\" data-en=\"up to <b>90%</b>\" data-zh=\"高达 <b>90%</b>\">.</span><span class=\"lv-txt\" data-pt=\"dos contatos resolvidos — com mais satisfação\" data-en=\"of contacts resolved — with higher satisfaction\" data-zh=\"的联系得到解决 —— 满意度更高\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\">NPS</span><span class=\"lv-num\" data-pt=\"<b>+26</b> pts\" data-en=\"<b>+26</b> pts\" data-zh=\"<b>+26</b> 分\">.</span><span class=\"lv-txt\" data-pt=\"de NPS no atendimento ao cliente\" data-en=\"in customer-support NPS\" data-zh=\"客户服务 NPS 提升\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Conversão\" data-en=\"Conversion\" data-zh=\"转化\">Conversão</span><span class=\"lv-num\" data-pt=\"<b>+20%</b>\" data-en=\"<b>+20%</b>\" data-zh=\"<b>+20%</b>\">.</span><span class=\"lv-txt\" data-pt=\"de conversão na jornada de compra\" data-en=\"conversion in the buying journey\" data-zh=\"购买旅程转化率\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Operações\" data-en=\"Operations\" data-zh=\"运营\">Operações</span><span class=\"lv-num\" data-pt=\"<b>−85%</b>\" data-en=\"<b>−85%</b>\" data-zh=\"<b>−85%</b>\">.</span><span class=\"lv-txt\" data-pt=\"de chamados na operação\" data-en=\"tickets in the operation\" data-zh=\"运营工单\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Compras\" data-en=\"Procurement\" data-zh=\"采购\">Compras</span><span class=\"lv-num\" data-pt=\"<b>milhões</b>\" data-en=\"<b>millions</b>\" data-zh=\"<b>数百万</b>\">.</span><span class=\"lv-txt\" data-pt=\"economizados por mês em procurement\" data-en=\"saved per month in procurement\" data-zh=\"每月采购节省\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Time-to-market\" data-en=\"Time-to-market\" data-zh=\"上线周期\">Time-to-market</span><span class=\"lv-num\" data-pt=\"<b>30</b> dias\" data-en=\"<b>30</b> days\" data-zh=\"<b>30</b> 天\">.</span><span class=\"lv-txt\" data-pt=\"da ideia à produção\" data-en=\"from idea to production\" data-zh=\"从创意到上线\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Escala\" data-en=\"Scale\" data-zh=\"规模\">Escala</span><span class=\"lv-num\" data-pt=\"<b>100k+</b>/dia\" data-en=\"<b>100k+</b>/day\" data-zh=\"每日 <b>10万+</b>\">.</span><span class=\"lv-txt\" data-pt=\"atendimentos automatizados\" data-en=\"interactions automated\" data-zh=\"自动化服务\">.</span></div>\n      <div class=\"lever reveal\"><span class=\"lv-cap\" data-pt=\"Retenção\" data-en=\"Retention\" data-zh=\"客户留存\">Retenção</span><span class=\"lv-num\" data-pt=\"<b>85%</b>\" data-en=\"<b>85%</b>\" data-zh=\"<b>85%</b>\">.</span><span class=\"lv-txt\" data-pt=\"de retenção de clientes\" data-en=\"customer retention\" data-zh=\"客户留存率\">.</span></div>\n    </div>\n  </div>\n</section>\n\n<section id=\"products\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"A Suíte\" data-en=\"The Suite\">A Suíte</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"Oito produtos. Um só sistema.\" data-en=\"Eight products. One system.\">Oito produtos. Um só sistema.</h2>\n    <div class=\"prod-showcase\">\n      <div class=\"ring reveal\" id=\"ring\"><div class=\"center\"><div class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:26px\"><use href=\"#d2wm\"></use></svg></div><small data-pt=\"8 produtos · 1 sistema\" data-en=\"8 products · 1 system\">8 produtos · 1 sistema</small></div></div>\n      <div class=\"pgrid reveal\">\n        <div class=\"pcard\" style=\"--pc:#5b86ff\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">UI</span></div><div class=\"pcname\" data-pt=\"Interface\" data-en=\"Interface\">Interface</div><div class=\"pctag\" data-pt=\"Desenhe o app, não uma foto dele.\" data-en=\"Design the app, not a picture of it.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#ff5a4d\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">REGISTRY</span></div><div class=\"pcname\" data-pt=\"Dados\" data-en=\"Data\">Dados</div><div class=\"pctag\" data-pt=\"Modele, armazene e analise em escala. Adeus, Lorem Ipsum.\" data-en=\"Model, store and analyze at scale. Goodbye Lorem Ipsum.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#e8e84d\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">MEDIA</span></div><div class=\"pcname\" data-pt=\"Mídia\" data-en=\"Media\">Mídia</div><div class=\"pctag\" data-pt=\"Otimize e distribua arquivos, na nuvem.\" data-en=\"Optimize and distribute files, in the cloud.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#4de0a1\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">ID</span></div><div class=\"pcname\" data-pt=\"Identidade\" data-en=\"Identity\">Identidade</div><div class=\"pctag\" data-pt=\"Ciclos completos, do onboarding ao reset de senha.\" data-en=\"Full lifecycles, from onboarding to password reset.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#4ddfe6\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">CONNECT</span></div><div class=\"pcname\" data-pt=\"Integrações\" data-en=\"Integrations\">Integrações</div><div class=\"pctag\" data-pt=\"Conecte-se a qualquer serviço externo.\" data-en=\"Connect to any external service.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#ff4d9e\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">DOMAIN</span></div><div class=\"pcname\" data-pt=\"Domínio · AI\" data-en=\"Domain · AI\">Domínio · AI</div><div class=\"pctag\" data-pt=\"Seu modelo, nunca escondido em código. AI multimodal.\" data-en=\"Your model, never hidden in code. Multimodal AI.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#9b5cff\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">RUSH</span></div><div class=\"pcname\" data-pt=\"Automação\" data-en=\"Automation\">Automação</div><div class=\"pctag\" data-pt=\"Reaja a eventos em tempo real. Webhooks e agendadores.\" data-en=\"React to events in real time. Webhooks and schedulers.\">.</div></div>\n        <div class=\"pcard\" style=\"--pc:#84e05a\"><div class=\"ptop\"><span class=\"pcdot\"></span><span class=\"pccode\">CASHIER</span><span class=\"soon\">SOON</span></div><div class=\"pcname\" data-pt=\"Pagamentos\" data-en=\"Payments\">Pagamentos</div><div class=\"pctag\" data-pt=\"Cobre e receba — qualquer transação de valor.\" data-en=\"Charge and get paid — any value transaction.\">.</div></div>\n      </div>\n    </div>\n  </div>\n</section>\n<section id=\"platform\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"A plataforma\" data-en=\"The platform\" data-zh=\"平台\">A plataforma</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"Escrita desde 2020. Não embrulhada.\" data-en=\"Written since 2020. Not wrapped.\" data-zh=\"自 2020 年自研，而非套壳。\">Escrita desde 2020. Não embrulhada.</h2>\n    <p class=\"plat-sub reveal\" data-pt=\"Agent-native de verdade: o builder É um servidor MCP. Agentes compõem os mesmos primitivos governados que um engenheiro — validados antes de entrar no ar.\" data-en=\"Truly agent-native: the builder IS an MCP server. Agents compose the same governed primitives an engineer would — validated before they ship.\" data-zh=\"真正的 agent-native：构建器本身就是一个 MCP 服务器。智能体与工程师使用同一套受治理的原语进行组装 —— 上线前即经校验。\">.</p>\n    <div class=\"flow-strip reveal\">\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:var(--faint)\">EVENTO</div><div class=\"fn-lbl\" data-pt=\"entra\" data-en=\"comes in\" data-zh=\"进入\">entra</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#9b5cff\">RUSH</div><div class=\"fn-lbl\" data-pt=\"decide\" data-en=\"decides\" data-zh=\"决策\">decide</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#4ddfe6\">CONNECT · DOMAIN</div><div class=\"fn-lbl\" data-pt=\"AI + integrações\" data-en=\"AI + integrations\" data-zh=\"AI + 集成\">AI + integrações</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#ff5a4d\">REGISTRY</div><div class=\"fn-lbl\" data-pt=\"dados\" data-en=\"data\" data-zh=\"数据\">dados</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#5b86ff\">DATASET</div><div class=\"fn-lbl\" data-pt=\"reativo\" data-en=\"reactive\" data-zh=\"响应式\">reativo</div></div>\n      <div class=\"fnode\"><div class=\"fn-code\" style=\"color:#e8e84d\">UI</div><div class=\"fn-lbl\" data-pt=\"em tela\" data-en=\"on screen\" data-zh=\"呈现\">em tela</div></div>\n    </div>\n    <div class=\"eng-row reveal\">\n      <span class=\"eng-lead\" data-pt=\"Nível de engenharia\" data-en=\"Engineering-grade\" data-zh=\"工程级\">Nível de engenharia</span>\n      <span class=\"eng-chip\">Auth &amp; SSO</span><span class=\"eng-chip\">Key Vaults</span><span class=\"eng-chip\">SSR</span><span class=\"eng-chip\">Cron</span><span class=\"eng-chip\">WebSockets</span><span class=\"eng-chip\">Logs</span><span class=\"eng-chip\" data-pt=\"Semantic Search\" data-en=\"Semantic Search\" data-zh=\"语义搜索\">Semantic Search</span><span class=\"eng-chip\">Staging → Publish</span>\n    </div>\n  </div>\n</section>\n\n<section id=\"deliver\">\n  <div class=\"wrap\">\n    <p class=\"eyebrow reveal\" data-pt=\"Como entregamos\" data-en=\"How we deliver\">Como entregamos</p>\n    <h2 class=\"sec-t reveal\" data-pt=\"Nossa stack. Nossos serviços.\" data-en=\"Our stack. Our services.\">Nossa stack. Nossos serviços.</h2>\n    <div class=\"deliver-grid\">\n      <div class=\"card reveal\">\n        <div class=\"accent\"></div>\n        <h3 data-pt=\"Sprints\" data-en=\"Sprints\">Sprints</h3>\n        <p data-pt=\"Nossos Forward Deployed Engineers entram junto da sua área: entendem a dor, prototipam e constroem com você — do primeiro passo à produção.\" data-en=\"Our Forward Deployed Engineers embed with your area: they learn the pain, prototype and build with you — from first step to production.\" data-zh=\"我们的前署工程师与您的业务团队并肩作战：洞察痛点、快速原型、与您共同构建 — 从第一步到上线。\">.</p>\n        <div class=\"flavors\"><span class=\"flavor\">Forward Deployed Engineers</span><span class=\"flavor\" data-pt=\"Ideação\" data-en=\"Ideation\">Ideação</span><span class=\"flavor\">Design</span><span class=\"flavor\" data-pt=\"Protótipo\" data-en=\"Prototype\">Protótipo</span></div>\n      </div>\n      <div class=\"card reveal\">\n        <div class=\"accent\"></div>\n        <div class=\"own\" data-pt=\"<em>Seus dados</em> são seus.\" data-en=\"<em>Own</em> your data.\">.</div>\n        <p data-pt=\"O Data Framework mantém seu modelo e sua infraestrutura sob seu domínio — nunca escondidos em código, nunca reféns de um fornecedor.\" data-en=\"The Data Framework keeps your model and infrastructure under your control — never hidden in code, never hostage to a vendor.\">.</p>\n        <div class=\"flavors\"><span class=\"flavor\" data-pt=\"Domain-Driven\" data-en=\"Domain-Driven\">Domain-Driven</span><span class=\"flavor\" data-pt=\"Linguagem única de dados\" data-en=\"Single Data Language\">Linguagem única de dados</span></div>\n      </div>\n    </div>\n    <div class=\"fde-band reveal\">\n      <div class=\"fde-flow\"><span data-pt=\"Seu time aprende\" data-en=\"Your team learns\" data-zh=\"你的团队学习\">Seu time aprende</span><i>→</i><span data-pt=\"é dono\" data-en=\"owns it\" data-zh=\"拥有它\">é dono</span><i>→</i><span data-pt=\"evolui\" data-en=\"evolves\" data-zh=\"持续进化\">evolui</span></div>\n      <div class=\"fde-pay\" data-pt=\"Pague por entrega, não por hora.\" data-en=\"Pay by delivery, not by hours.\" data-zh=\"按交付付费，而非按工时。\">Pague por entrega, não por hora.</div>\n    </div>\n  </div>\n</section>\n<section id=\"cta\">\n  <div class=\"wrap\">\n    <p class=\"cta-kicker reveal\" data-pt=\"Pronto pra começar?\" data-en=\"Ready to build?\" data-zh=\"准备好开始了吗？\">Pronto pra começar?</p>\n    <h2 class=\"big reveal\" data-pt=\"Do problema<br>à produção.\" data-en=\"From problem<br>to production.\">Do problema<br>à produção.</h2>\n    <p class=\"sub reveal\" data-pt=\"Traga o desafio da sua área. A gente transforma em software — em produção.\" data-en=\"Bring your area's challenge. We turn it into software — in production.\">.</p>\n    <div class=\"cta-row reveal\"><a href=\"#\" class=\"btn\"><span data-pt=\"Agendar uma demo\" data-en=\"Book a demo\">Agendar uma demo</span></a><a href=\"#\" class=\"btn ghost\"><span data-pt=\"Falar com a gente\" data-en=\"Talk to us\" data-zh=\"联系我们\">Falar com a gente</span></a></div>\n  </div>\n</section>\n<footer>\n  <div class=\"foot\">\n    <div>\n      <div class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:26px\"><use href=\"#d2wm\"></use></svg></div>\n      <p style=\"color:var(--faint);font-size:13px;margin-top:12px;max-width:26ch\" data-pt=\"A Digital Expression Suite. Do problema à produção.\" data-en=\"The Digital Expression Suite. From problem to production.\">.</p>\n    </div>\n    <div class=\"cols\">\n      <div class=\"fc\"><h5 data-pt=\"Produto\" data-en=\"Product\">Produto</h5><a href=\"#products\" data-pt=\"A Suíte\" data-en=\"The Suite\">A Suíte</a><a href=\"#industries\" data-pt=\"Indústrias\" data-en=\"Industries\">Indústrias</a><a href=\"#deliver\">Sprints</a><a href=\"#\" data-pt=\"Integrações\" data-en=\"Integrations\">Integrações</a></div>\n      <div class=\"fc\"><h5 data-pt=\"Empresa\" data-en=\"Company\">Empresa</h5><a href=\"#\" data-pt=\"Sobre\" data-en=\"About\">Sobre</a><a href=\"#proof\" data-pt=\"Clientes\" data-en=\"Customers\">Clientes</a><a href=\"#\" data-pt=\"Pessoas\" data-en=\"People\">Pessoas</a><a href=\"#\" data-pt=\"Contato\" data-en=\"Contact\">Contato</a></div>\n      <div class=\"fc\"><h5 data-pt=\"Indústrias\" data-en=\"Industries\" data-zh=\"行业\">Indústrias</h5><a href=\"#glance\" data-pt=\"RH & Pessoas\" data-en=\"HR & People\">RH & Pessoas</a><a href=\"#glance\" data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</a><a href=\"#glance\" data-pt=\"Varejo & E-commerce\" data-en=\"Retail & E-commerce\">Varejo & E-commerce</a><a href=\"#glance\" data-pt=\"Ver todas\" data-en=\"See all\" data-zh=\"查看全部\">Ver todas</a></div>\n      <div class=\"fc\"><h5 data-pt=\"Recursos\" data-en=\"Resources\" data-zh=\"资源\">Recursos</h5><a href=\"#platform\" data-pt=\"A plataforma\" data-en=\"The platform\">A plataforma</a><a href=\"#deliver\">Sprints</a><a href=\"#levers\" data-pt=\"Resultados\" data-en=\"Results\">Resultados</a><a href=\"#\" data-pt=\"Contato\" data-en=\"Contact\">Demo</a></div>\n    </div>\n    <div class=\"fine\"><span>© 2026 Data² · www.data2.app</span><span data-pt=\"Feito na Data². Sem uma linha de código.\" data-en=\"Made on Data². Without a single line of code.\">Feito na Data². Sem uma linha de código.</span></div>\n  </div>\n</footer>\n<div class=\"uni-overlay\" id=\"uni\" style=\"--hue:#4ddfe6\">\n  <div class=\"uni-scroll\">\n    <svg width=\"0\" height=\"0\" style=\"position:absolute;width:0;height:0\" aria-hidden=\"true\"><defs>\n      <symbol id=\"isocube\" viewBox=\"0 0 100 100\"><polygon points=\"50,4 96,29 50,54 4,29\" fill=\"var(--fct)\" stroke=\"var(--hue)\" stroke-width=\"1.5\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"></polygon><polygon points=\"4,29 50,54 50,98 4,73\" fill=\"var(--fcl)\" stroke=\"var(--hue)\" stroke-width=\"1.5\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"></polygon><polygon points=\"96,29 50,54 50,98 96,73\" fill=\"var(--fcr)\" stroke=\"var(--hue)\" stroke-width=\"1.5\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"></polygon></symbol>\n      <symbol id=\"m0\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"4\" y=\"6\" width=\"56\" height=\"56\"></use><use href=\"#isocube\" x=\"46\" y=\"40\" width=\"46\" height=\"46\"></use></symbol>\n      <symbol id=\"m1\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"1\" y=\"24\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"31\" y=\"42\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"61\" y=\"24\" width=\"38\" height=\"38\"></use></symbol>\n      <symbol id=\"m2\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"2\" y=\"10\" width=\"44\" height=\"44\"></use><use href=\"#isocube\" x=\"54\" y=\"46\" width=\"44\" height=\"44\"></use></symbol>\n      <symbol id=\"m3\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"2\" y=\"34\" width=\"96\" height=\"60\"></use><use href=\"#isocube\" x=\"24\" y=\"8\" width=\"28\" height=\"28\"></use><use href=\"#isocube\" x=\"50\" y=\"16\" width=\"26\" height=\"26\"></use></symbol>\n      <symbol id=\"m4\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"26\" y=\"46\" width=\"48\" height=\"48\"></use><use href=\"#isocube\" x=\"26\" y=\"28\" width=\"48\" height=\"48\"></use><use href=\"#isocube\" x=\"26\" y=\"10\" width=\"48\" height=\"48\"></use></symbol>\n      <symbol id=\"m5\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"30\" y=\"44\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"30\" y=\"18\" width=\"40\" height=\"40\"></use></symbol>\n      <symbol id=\"m6\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"30\" y=\"6\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"8\" y=\"26\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"52\" y=\"26\" width=\"40\" height=\"40\"></use><use href=\"#isocube\" x=\"30\" y=\"46\" width=\"40\" height=\"40\"></use></symbol>\n      <symbol id=\"m7\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"2\" y=\"40\" width=\"96\" height=\"54\"></use><use href=\"#isocube\" x=\"35\" y=\"22\" width=\"30\" height=\"30\"></use></symbol>\n      <symbol id=\"m8\" viewBox=\"0 0 100 100\"><use href=\"#isocube\" x=\"8\" y=\"52\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"34\" y=\"35\" width=\"38\" height=\"38\"></use><use href=\"#isocube\" x=\"60\" y=\"18\" width=\"38\" height=\"38\"></use></symbol>\n    </defs></svg>\n    <div class=\"uni-top\"><span class=\"mark\"><svg class=\"logo\" viewBox=\"0 0 459.554 148.471\" style=\"height:22px\"><use href=\"#d2wm\"></use></svg></span><button class=\"uni-close\" id=\"uniClose\" aria-label=\"close\">✕</button></div>\n    <div class=\"uni-body\" id=\"uniBody\">\n    <section class=\"uni-hero\"><div class=\"glow\"></div>\n      <div class=\"uni-eyebrow\" data-pt=\"Universo\" data-en=\"Universe\" data-zh=\"宇宙\">Universo</div>\n      <h1 data-pt=\"CX & Contact Center\" data-en=\"CX & Contact Center\">CX & Contact Center</h1>\n      <p class=\"lead\" data-pt=\"Um contact center inteiro, funcionando como um sistema vivo — cada componente é um módulo Data². Passe o mouse. Role para os detalhes.\" data-en=\"An entire contact center, running as a living system — each component is a Data² module. Hover. Scroll for the details.\" data-zh=\"一个完整的呼叫中心，如同一个活的系统在运行 —— 每个组件都是一个 Data² 模块。悬停查看，下滚了解详情。\">.</p>\n      <div class=\"sysmap\"><svg viewBox=\"0 0 820 400\">\n        <path class=\"wire\" d=\"M150,150 L360,110\"></path><path class=\"wire\" d=\"M390,140 L400,275\"></path><path class=\"wire\" d=\"M430,110 L620,150\"></path><path class=\"wire\" d=\"M440,285 L630,175\"></path><path class=\"wire\" d=\"M660,185 L600,300\"></path>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"2.6s\" repeatCount=\"indefinite\" path=\"M150,150 L360,110\"></animateMotion></circle>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"3s\" repeatCount=\"indefinite\" path=\"M430,110 L620,150\"></animateMotion></circle>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"2.4s\" repeatCount=\"indefinite\" path=\"M660,185 L600,300\"></animateMotion></circle>\n        <circle class=\"flowdot\" r=\"3.5\"><animateMotion dur=\"3.2s\" repeatCount=\"indefinite\" path=\"M390,140 L400,275\"></animateMotion></circle>\n        <g class=\"comp\" data-i=\"0\" transform=\"translate(108,86)\"><use href=\"#m0\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"116\" data-pt=\"Webchat\" data-en=\"Webchat\" data-zh=\"网页聊天\">Webchat</text></g>\n        <g class=\"comp\" data-i=\"1\" transform=\"translate(345,38)\"><use href=\"#m1\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"112\" data-pt=\"Bot de triagem\" data-en=\"Triage bot\" data-zh=\"分流机器人\">Bot de triagem</text></g>\n        <g class=\"comp\" data-i=\"2\" transform=\"translate(355,236)\"><use href=\"#m2\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"112\" data-pt=\"Transbordo\" data-en=\"Handoff\" data-zh=\"转接\">Transbordo</text></g>\n        <g class=\"comp\" data-i=\"3\" transform=\"translate(612,84)\"><use href=\"#m3\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"114\" data-pt=\"Console\" data-en=\"Console\" data-zh=\"控制台\">Console</text></g>\n        <g class=\"comp\" data-i=\"4\" transform=\"translate(556,246)\"><use href=\"#m4\" width=\"100\" height=\"100\"></use><text class=\"clabel\" x=\"50\" y=\"118\" data-pt=\"Filas & CSAT\" data-en=\"Queues & CSAT\" data-zh=\"队列与 CSAT\">Filas & CSAT</text></g>\n      </svg></div>\n      <div class=\"sys-hint\" data-pt=\"Passe o mouse · clique um componente · role\" data-en=\"Hover · click a component · scroll\" data-zh=\"悬停 · 点击组件 · 下滚\">Passe o mouse · clique um componente · role</div>\n    </section>\n    <section class=\"uni-detail\" data-i=\"0\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m0\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">01 / 05</div><div class=\"ud-t\" data-pt=\"Webchat omnichannel\" data-en=\"Omnichannel webchat\">.</div><div class=\"ud-d\" data-pt=\"Um widget no seu site conversa no mesmo fluxo que WhatsApp, voz e e-mail. O cliente começa onde quiser e a conversa nunca se perde.\" data-en=\"A widget on your site talks in the same flow as WhatsApp, voice and email. Customers start anywhere and the conversation is never lost.\" data-zh=\"网站挂件与 WhatsApp、语音和邮件处于同一流程。客户可从任何渠道开始，对话永不丢失。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Widget embutido via iframe + websockets\" data-en=\"Embedded widget via iframe + websockets\" data-zh=\"通过 iframe + websockets 嵌入挂件\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Ponte com provedor de mensageria e voz (CPaaS)\" data-en=\"Bridge to a messaging/voice provider (CPaaS)\" data-zh=\"对接消息/语音服务商（CPaaS）\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Sessões, mensagens e transferências unificadas por cliente\" data-en=\"Sessions, messages and transfers unified per customer\" data-zh=\"按客户统一会话、消息与转接\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Continuidade de contexto ao trocar de canal\" data-en=\"Context continuity across channels\" data-zh=\"跨渠道保持上下文连续\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Canais soltos, sem histórico compartilhado. O cliente repete tudo a cada troca; o atendente trabalha às cegas.\" data-en=\"Disconnected channels, no shared history. Customers repeat everything on each switch; agents work blind.\" data-zh=\"渠道割裂、无共享历史。客户每次切换都要重复，坐席只能盲目应对。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"Um só fluxo, um só histórico. Menos repetição, respostas mais rápidas, e o cliente começa onde for mais fácil.\" data-en=\"One flow, one history. Less repetition, faster answers, and customers start wherever is easiest.\" data-zh=\"统一流程、统一历史。更少重复、更快响应，客户从最方便的渠道开始。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>100k+</b> <span data-pt=\"atendimentos/dia\" data-en=\"interactions/day\" data-zh=\"次服务/天\">atendimentos/dia</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"1\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m1\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">02 / 05</div><div class=\"ud-t\" data-pt=\"Bot de triagem com AI\" data-en=\"AI triage bot\">.</div><div class=\"ud-d\" data-pt=\"A AI entende a intenção, resolve na hora o que é simples e classifica o resto para a fila certa — antes de qualquer humano tocar.\" data-en=\"AI reads intent, instantly resolves the simple, and routes the rest to the right queue — before any human touches it.\" data-zh=\"AI 理解意图，即时解决简单问题，并将其余分流到正确队列 —— 无需任何人工介入。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Detecção de caso de uso por AI\" data-en=\"AI use-case detection\" data-zh=\"AI 用例识别\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Fluxos guiados: cancelamento, troca, reembolso, atraso\" data-en=\"Guided flows: cancel, exchange, refund, delay\" data-zh=\"引导式流程：取消、换货、退款、延迟\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Leitura de imagem e classificação de texto livre\" data-en=\"Image reading and free-text classification\" data-zh=\"图像识别与自由文本分类\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Abertura de ticket no CRM externo\" data-en=\"Ticket creation in the external CRM\" data-zh=\"在外部 CRM 中创建工单\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Todo contato cai na fila humana, até os triviais. A fila cresce e o custo por contato dispara.\" data-en=\"Every contact hits the human queue, even trivial ones. The queue grows and cost-per-contact soars.\" data-zh=\"所有联系都进入人工队列，连琐事也是。队列膨胀，单次联系成本飪升。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"A AI resolve o repetitivo na hora e só encaminha o que precisa de gente — menos fila, menos custo, 24/7.\" data-en=\"AI resolves the repetitive instantly and only routes what needs a human — less queue, less cost, 24/7.\" data-zh=\"AI 即时解决重复问题，只转交需人工的部分 —— 更短队列、更低成本、7×24。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>−50%</b> <span data-pt=\"tempo de resolução\" data-en=\"resolution time\" data-zh=\"解决时间\">tempo de resolução</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"2\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m2\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">03 / 05</div><div class=\"ud-t\" data-pt=\"Transbordo bot → humano\" data-en=\"Bot → human handoff\">.</div><div class=\"ud-d\" data-pt=\"Quando o humano precisa entrar, entra com todo o histórico e o contexto na mão. Zero ‘reconte tudo de novo’.\" data-en=\"When a human is needed, they step in with the full history and context in hand. Zero ‘tell me everything again’.\" data-zh=\"当需要人工时，坐席携带完整历史与上下文接手。无需‘重新说一遍’。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Handoff com histórico e contexto completos\" data-en=\"Handoff with full history and context\" data-zh=\"携带完整历史与上下文的转接\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Transferência entre filas e times\" data-en=\"Transfer across queues and teams\" data-zh=\"跨队列与团队转接\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Detecção de inatividade e abandono\" data-en=\"Inactivity and abandonment detection\" data-zh=\"闲置与弃单检测\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Respostas prontas + atalhos do atendente\" data-en=\"Canned replies + agent shortcuts\" data-zh=\"预设回复 + 坐席快捷方式\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"A passagem pro humano perde o contexto. ‘Me conta tudo de novo’ vira regra e a satisfação despenca.\" data-en=\"The handoff loses context. ‘Tell me everything again’ becomes the rule and satisfaction drops.\" data-zh=\"转人工时丢失上下文。‘请再说一遍’成常态，满意度骤降。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"O atendente entra com histórico e contexto completos. Transição invisível pro cliente.\" data-en=\"The agent steps in with full history and context. An invisible transition for the customer.\" data-zh=\"坐席携带完整历史与上下文接手。对客户而言，转接无感。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>100%</b> <span data-pt=\"do contexto preservado\" data-en=\"context preserved\" data-zh=\"上下文保留\">do contexto preservado</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"3\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m3\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">04 / 05</div><div class=\"ud-t\" data-pt=\"Console de agente + supervisor\" data-en=\"Agent workspace + supervisor console\">.</div><div class=\"ud-d\" data-pt=\"Fila, transferências, status dos agentes e supervisão ao vivo — tudo num painel só, sobre o dado real da operação.\" data-en=\"Queue, transfers, agent status and live supervision — all in one console, over the operation’s real data.\" data-zh=\"队列、转接、坐席状态与实时督导 —— 全部集于一个控制台，基于运营真实数据。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Workspace do agente: status, presets, chatrooms\" data-en=\"Agent workspace: status, presets, chatrooms\" data-zh=\"坐席工作台：状态、预设、聊天室\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Console do supervisor: fila e métricas ao vivo\" data-en=\"Supervisor console: live queue and metrics\" data-zh=\"主管控制台：实时队列与指标\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Classificação de transferências\" data-en=\"Transfer classification\" data-zh=\"转接分类\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Fechamentos mensais e sync de metadados\" data-en=\"Monthly closings and metadata sync\" data-zh=\"月度结算与元数据同步\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Supervisão por planilha e telas espalhadas. Ninguém enxerga a operação ao vivo; decisão no achismo.\" data-en=\"Supervision by spreadsheet and scattered screens. No one sees the live operation; decisions by guesswork.\" data-zh=\"靠表格与零散界面督导。无人实时掌控，决策靠猜。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"Uma tela com fila, status, transferências e métricas ao vivo — decisão sobre o dado real.\" data-en=\"One screen with live queue, status, transfers and metrics — decisions on real data.\" data-zh=\"一屏掌握实时队列、状态、转接与指标 —— 基于真实数据决策。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>1</b> <span data-pt=\"tela para toda a operação\" data-en=\"screen for the whole operation\" data-zh=\"一屏掌控全局\">tela para toda a operação</span></span></div></div></section>\n    <section class=\"uni-detail\" data-i=\"4\"><div class=\"ud-viz\"><div class=\"iso\"><svg viewBox=\"0 0 100 100\"><use href=\"#m4\" width=\"100\" height=\"100\"></use></svg></div></div><div class=\"ud-tx\"><div class=\"ud-num\">05 / 05</div><div class=\"ud-t\" data-pt=\"Automação de filas & CSAT\" data-en=\"Queue automation & CSAT\">.</div><div class=\"ud-d\" data-pt=\"Filas que se auto-gerenciam: detecção de abandono, repriorização e pesquisa de satisfação disparada na hora certa.\" data-en=\"Self-managing queues: abandonment detection, re-prioritization and CSAT surveys fired at the right moment.\" data-zh=\"自我管理的队列：弃单检测、重新优先级排序，并在恰当时机发起满意度调查。\">.</div><div class=\"ud-points\"><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Agendadores (Rush) mantêm a fila saudável\" data-en=\"Schedulers (Rush) keep the queue healthy\" data-zh=\"调度器（Rush）维持队列健康\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Detecção de abandono + auto-cura da fila\" data-en=\"Abandonment detection + queue self-healing\" data-zh=\"弃单检测 + 队列自愈\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"CSAT disparado no momento certo\" data-en=\"CSAT fired at the right moment\" data-zh=\"在恰当时机发起 CSAT\">.</span></div><div class=\"ud-point\"><span class=\"pk\">▸</span><span data-pt=\"Analytics de custo por caso de uso + export\" data-en=\"Cost analytics by use-case + export\" data-zh=\"按用例的成本分析 + 导出\">.</span></div></div><div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\" data-pt=\"O modelo não digitalizado\" data-en=\"The non-digitized model\" data-zh=\"未数字化的模式\">.</span><p data-pt=\"Filas travadas por transferências esquecidas e abandono não detectado. Satisfação medida tarde ou nunca.\" data-en=\"Queues stuck by forgotten transfers and undetected abandonment. Satisfaction measured late, or never.\" data-zh=\"队列被遗忘的转接与未检测的弃单拖垮。满意度测得太晚，甚至从不测。\">.</p></div><div class=\"ug-col ug-new\"><span class=\"ug-k\" data-pt=\"Com Data²\" data-en=\"With Data²\">.</span><p data-pt=\"Rush mantém a fila saudável sozinho e dispara o CSAT na hora certa — melhoria contínua com dado.\" data-en=\"Rush keeps the queue healthy on its own and fires CSAT at the right time — continuous improvement, data-driven.\" data-zh=\"Rush 自动维持队列健康，并在恰当时机发起 CSAT —— 数据驱动的持续改进。\">.</p></div></div><div class=\"ud-res\"><span class=\"r\"><b>85%</b> <span data-pt=\"retenção\" data-en=\"retention\" data-zh=\"留存率\">retenção</span></span><span class=\"r\"><b>+26</b> <span data-pt=\"NPS\" data-en=\"NPS\" data-zh=\"NPS\">NPS</span></span></div></div></section>\n    <section class=\"uni-more\"><div class=\"glow\"></div><h2 data-pt=\"E isso é só o começo. <em>Qualquer coisa</em> pode ser construída.\" data-en=\"And this is just the start. <em>Anything</em> can be built.\" data-zh=\"而这只是开始。<em>任何东西</em>都能被构建。\">.</h2><p data-pt=\"Cada componente aqui é um módulo Data². Precisa de algo que ainda não existe? A gente constrói — no mesmo sistema, com o mesmo dado.\" data-en=\"Every component here is a Data² module. Need something that doesn’t exist yet? We build it — same system, same data.\" data-zh=\"这里的每个组件都是一个 Data² 模块。需要尚不存在的东西？我们构建它 —— 同一系统，同一数据。\">.</p><a href=\"#\" class=\"btn\"><span data-pt=\"Agendar uma demo\" data-en=\"Book a demo\">Agendar uma demo</span></a></section>\n    </div>\n  </div>\n</div>\n</div>`;\n  },\n  mounted(d2, root){\n    var mq = window.matchMedia && window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n    var reduce = mq ? mq.matches : false;\n    var sc = root.querySelector(\".d2site\");\n    if(!sc) return;\n    var lang = \"pt\";\n    var ZH = {\n  \"Industries\": \"行业方案\",\n  \"Products\": \"产品\",\n  \"How we deliver\": \"交付方式\",\n  \"Customers\": \"客户\",\n  \"Demo\": \"演示\",\n  \"Sign in\": \"登录\",\n  \"EXPRESS YOURSELF<br>AT SCALE.\": \"尽情表达，<br>规模无限。\",\n  \"From a business problem to software in production. Data² is the suite that turns any team into the team that ships.\": \"从业务难题到上线软件。Data² 让每一个团队都成为能交付的团队。\",\n  \"See what's possible\": \"看看能实现什么\",\n  \"Book a demo\": \"预约演示\",\n  \"Imagery from the Data² Synthesys Project.\": \"图像来自 Data² Synthesys 项目。\",\n  \"Synthesys is a concept created and captured by Lívia Elektra, representing the power of expression and freedom that Data² provides.\": \"Synthesys 是 Lívia Elektra 创作并捕捉的概念，象征 Data² 所带来的表达力与自由。\",\n  \"SCROLL\": \"向下滚动\",\n  \"Data² in one screen\": \"一屏读懂 Data²\",\n  \"What we see, what we do, and who for.\": \"我们看见什么、我们做什么、为谁而做。\",\n  \"What we see\": \"我们看见什么\",\n  \"Every area has <em>software waiting to exist</em>.\": \"每个业务部门，都有<em>一款等待诞生的软件</em>。\",\n  \"Technology already lets us build almost anything. What was missing is the direct bridge between the people who know the problem and the solution running in production.\": \"技术早已能构建几乎一切。所缺的，是让懂问题的人与上线运行的方案之间，直接搭起的那座桥。\",\n  \"What we do\": \"我们做什么\",\n  \"A suite that becomes <em>real software</em>.\": \"一套真正<em>变成软件</em>的套件。\",\n  \"8 products with AI, omnichannel, real data, automation and dashboards — assembled in the visual builder and shipped to production. No code.\": \"8 款产品，涵盖 AI、全渠道、真实数据、自动化与仪表盘 —— 在可视化构建器中组装，直接上线生产。无需代码。\",\n  \"Who for\": \"为谁而做\",\n  \"For the area that <em>owns the problem</em>.\": \"为<em>真正面对问题</em>的那个部门。\",\n  \"Business teams at large companies that won't wait anymore. We are the enablers between the idea and production.\": \"为不愿再等待的大型企业业务团队。我们，是连接创意与生产的赋能者。\",\n  \"HR · Supply · Financial · CX · Retail · Sales · BI · Insurance · Procurement\": \"人力 · 供应 · 财务 · 客户体验 · 零售 · 销售 · 商业智能 · 保险 · 采购\",\n  \"Before\": \"过去\",\n  \"From idea to delivery: many hands, many translations, a lot of time.\": \"从创意到交付：经手无数、层层转译、耗时漫长。\",\n  \"With Data²\": \"有了 Data²\",\n  \"The business area itself designs, connects the real data, ships and operates. In production.\": \"业务部门亲手设计、接入真实数据、发布并运营。直接在生产环境。\",\n  \"At a glance\": \"概览\",\n  \"Where we already deliver\": \"我们已交付的领域\",\n  \"HR & People\": \"人力资源与员工\",\n  \"AI employee support\": \"AI 员工服务\",\n  \"Supply & Operations\": \"供应链与运营\",\n  \"Scenarios into production plans\": \"情景转化为生产计划\",\n  \"Financial Services\": \"金融服务\",\n  \"AI-personalized outreach\": \"AI 个性化触达\",\n  \"CX & Contact Center\": \"客户体验与呼叫中心\",\n  \"A contact center on one platform\": \"一体化呼叫中心\",\n  \"Retail & E-commerce\": \"零售与电商\",\n  \"From storefront to ERP\": \"从门店到 ERP\",\n  \"Sales Enablement\": \"销售赋能\",\n  \"A sales copilot for the field\": \"一线销售副驾\",\n  \"BI & Analytics\": \"商业智能与分析\",\n  \"Live data to action plan\": \"从实时数据到行动计划\",\n  \"Insurance & CX\": \"保险与客户体验\",\n  \"Semantic knowledge base\": \"语义知识库\",\n  \"Procurement\": \"采购\",\n  \"Sourcing modeling & planning\": \"采购建模与规划\",\n  \"Built on Data² by\": \"他们在 Data² 上构建\",\n  \"Business teams already build on Data²\": \"业务团队已在 Data² 上构建\",\n  \"What's possible\": \"无限可能\",\n  \"One platform. Every industry.\": \"一个平台，服务每个行业。\",\n  \"We don't sell slides. Each frontier below is real software, in production, built by the business area itself.\": \"我们不卖幻灯片。以下每一个领域，都是真实、上线、由业务部门亲手构建的软件。\",\n  \"An HR that answers <b>thousands of employees</b>, in multiple languages — instantly.\": \"一个能<b>即时回应数千名员工</b>、支持多语言的人力资源。\",\n  \"AI assistant for employees\": \"面向员工的 AI 助手\",\n  \"Handoff to human agents\": \"转接人工客服\",\n  \"Document reading (OCR)\": \"文档识别（OCR）\",\n  \"Answers & rules configured by the team\": \"答案与规则由业务团队配置\",\n  \"Analytics & CSAT\": \"分析与满意度（CSAT）\",\n  \"Turn <b>leftover stock into a prioritized production plan</b> — in minutes, not weeks.\": \"把<b>过剩库存变成有优先级的生产计划</b> —— 只需几分钟，而非数周。\",\n  \"Production scenario simulation\": \"生产情景模拟\",\n  \"Bill-of-materials explosion\": \"物料清单（BOM）展开\",\n  \"Savings & feasibility scoring\": \"节省与可行性评分\",\n  \"Self-service SQL over the data lake\": \"面向数据湖的自助 SQL\",\n  \"Export to spreadsheet\": \"导出到表格\",\n  \"<b>AI-personalized 1-to-1 outreach</b> at a scale of thousands — run by the commercial team itself.\": \"<b>AI 一对一个性化触达</b>，规模可达数千 —— 由商务团队自己操盘。\",\n  \"CRM + outreach automation\": \"CRM + 触达自动化\",\n  \"Omnichannel message waves\": \"全渠道消息波次\",\n  \"AI-written copy in the lead's tone\": \"以客户口吻由 AI 撜写文案\",\n  \"Offer & ROI modeling\": \"方案与 ROI 建模\",\n  \"Corporate SSO\": \"企业单点登录（SSO）\",\n  \"An <b>entire contact center</b> — from the on-site widget to queue automation — on a single platform.\": \"一个<b>完整的呼叫中心</b> —— 从网站挂件到队列自动化 —— 全在一个平台上。\",\n  \"Omnichannel webchat\": \"全渠道网页聊天\",\n  \"AI triage bot\": \"AI 分流机器人\",\n  \"Bot → human handoff\": \"机器人 → 人工转接\",\n  \"Agent workspace + supervisor console\": \"坐席工作台 + 主管控制台\",\n  \"Queue automation & CSAT\": \"队列自动化与满意度（CSAT）\",\n  \"From <b>storefront to ERP</b>: tailor-made buying experiences, with your e-commerce's real data.\": \"从<b>门店到 ERP</b>：量身定制的购物体验，用你电商的真实数据驱动。\",\n  \"Catalog & product experiences\": \"目录与商品体验\",\n  \"VTEX / GraphQL integration\": \"VTEX / GraphQL 集成\",\n  \"AI photo studio\": \"AI 影像工作室\",\n  \"ERP & store operations\": \"ERP 与门店运营\",\n  \"A <b>sales copilot</b> that tells each rep the next best action — in natural language.\": \"一个<b>销售副驾</b>，用自然语言告诉每位销售下一步的最佳行动。\",\n  \"Sales copilot in natural language\": \"自然语言销售副驾\",\n  \"Next-best-action recommendation\": \"下一最佳行动推荐\",\n  \"AI search over customers & segments\": \"面向客户与细分的 AI 搜索\",\n  \"Portfolio performance dashboards\": \"客户组合业绩仪表盘\",\n  \"AI content & image generation\": \"AI 内容与图像生成\",\n  \"From <b>live data to an action plan</b> — dashboards the team reads and acts on, no spreadsheet export.\": \"从<b>实时数据到行动计划</b> —— 业务团队看得懂、能行动的仪表盘，无需导出表格。\",\n  \"Executive dashboards on live data\": \"基于实时数据的高管仪表盘\",\n  \"Automated daily ingestion\": \"每日自动数据接入\",\n  \"Targets & action plan tracked\": \"目标与行动计划全程追踪\",\n  \"Alerts & monitoring\": \"告警与监控\",\n  \"Support that <b>answers from the right source</b> — a semantic knowledge base with AI triage.\": \"从<b>正确来源作答</b>的客服 —— 配备语义知识库与 AI 分流。\",\n  \"Semantic-search knowledge base\": \"语义搜索知识库\",\n  \"AI triage & support\": \"AI 分流与客服\",\n  \"Answers grounded in the source\": \"答案有据可依，源自原文\",\n  \"Support analytics\": \"客服分析\",\n  \"<b>Procurement excellence</b>: financial modeling and supply planning, simulated in minutes.\": \"<b>采购卓越</b>：财务建模与供应规划，几分钟即可模拟完成。\",\n  \"Supply planning\": \"供应规划\",\n  \"Financial scenario modeling\": \"财务情景建模\",\n  \"Decision simulators & builders\": \"决策模拟器与构建器\",\n  \"Data-driven sourcing\": \"数据驱动的采购\",\n  \"Across every industry\": \"贯穿每个行业\",\n  \"The same engine, whatever the problem\": \"无论什么问题，都是同一套引擎\",\n  \"AI built in\": \"内置 AI\",\n  \"Detection, classification, generation and vision — in natural language.\": \"检测、分类、生成与视觉 —— 皆以自然语言驱动。\",\n  \"Omnichannel\": \"全渠道\",\n  \"WhatsApp, voice, webchat and email in one flow.\": \"WhatsApp、语音、网页聊天与邮件，统一于一条流程。\",\n  \"Real data + integrations\": \"真实数据 + 集成\",\n  \"Databricks, VTEX, CRMs, SSO — genuinely connected.\": \"Databricks、VTEX、各类 CRM、SSO —— 真正打通连接。\",\n  \"Automation\": \"自动化\",\n  \"Events, webhooks and schedulers reacting in real time.\": \"事件、Webhook 与定时任务，实时响应。\",\n  \"Dashboards\": \"仪表盘\",\n  \"Panels and analytics over the operation's live data.\": \"基于业务实时数据的面板与分析。\",\n  \"No code\": \"无需代码\",\n  \"All assembled in the visual builder — by the business team itself.\": \"全部在可视化构建器中组装 —— 由业务团队亲手完成。\",\n  \"The Suite\": \"套件\",\n  \"Eight products. One system.\": \"八款产品，同一个系统。\",\n  \"8 products · 1 system\": \"8 款产品 · 1 个系统\",\n  \"Interface\": \"界面\",\n  \"Design the app, not a picture of it.\": \"设计真正的应用，而非它的一张图。\",\n  \"Data\": \"数据\",\n  \"Model, store and analyze at scale. Goodbye Lorem Ipsum.\": \"大规模建模、存储与分析。告别占位假数据。\",\n  \"Media\": \"媒体\",\n  \"Optimize and distribute files, in the cloud.\": \"在云端优化与分发文件。\",\n  \"Identity\": \"身份\",\n  \"Full lifecycles, from onboarding to password reset.\": \"完整的生命周期，从注册入门到密码重置。\",\n  \"Integrations\": \"集成\",\n  \"Connect to any external service.\": \"连接任何外部服务。\",\n  \"Domain · AI\": \"领域 · AI\",\n  \"Your model, never hidden in code. Multimodal AI.\": \"你的模型，绝不藏在代码里。多模态 AI。\",\n  \"Automation\": \"自动化\",\n  \"React to events in real time. Webhooks and schedulers.\": \"实时响应事件。Webhook 与定时任务。\",\n  \"Payments\": \"支付\",\n  \"Charge and get paid — any value transaction.\": \"收款与入账 —— 任何价值交易。\",\n  \"Our stack. Our services.\": \"我们的技术栈。我们的服务。\",\n  \"Our Forward Deployed Engineers embed with your area: they learn the pain, prototype and build with you — from first step to production.\": \"我们的前置部署工程师入驻你的部门：读懂痛点，与你一起做原型、共同构建 —— 从第一步到生产上线。\",\n  \"Ideation\": \"创意构思\",\n  \"Prototype\": \"原型\",\n  \"<em>Own</em> your data.\": \"<em>掌控</em>你的数据。\",\n  \"The Data Framework keeps your model and infrastructure under your control — never hidden in code, never hostage to a vendor.\": \"数据框架让你的模型与基础设施始终在你掌控之中 —— 绝不藏于代码，绝不受制于供应商。\",\n  \"Domain-Driven\": \"领域驱动\",\n  \"Single Data Language\": \"统一数据语言\",\n  \"From problem<br>to production.\": \"从问题<br>到生产。\",\n  \"Bring your area's challenge. We turn it into software — in production.\": \"带来你部门的挑战，我们把它变成软件 —— 直接上线生产。\",\n  \"The Digital Expression Suite. From problem to production.\": \"数字表达套件。从问题到生产。\",\n  \"Product\": \"产品\",\n  \"Company\": \"公司\",\n  \"About\": \"关于我们\",\n  \"People\": \"团队\",\n  \"Contact\": \"联系我们\",\n  \"Made on Data². Without a single line of code.\": \"在 Data² 上打造。未写一行代码。\",\n  \"Already in production with\": \"已上线客户\",\n  \"we map where it hurts\": \"我们找出痛点所在\",\n  \"2–4 weeks\": \"2–4 周\",\n  \"sprint with an embedded engineer\": \"工程师入驻的冲刺\",\n  \"In production\": \"上线生产\",\n  \"your team owns it\": \"你的团队主导\"\n};\n    function unesc(s){ return String(s).replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&amp;/g,\"&\"); }\n    var ZH2 = {}; for(var zk in ZH){ ZH2[unesc(zk)] = unesc(ZH[zk]); }\n    var nodes = root.querySelectorAll(\"[data-pt],[data-en]\");\n    function applyLang(l){\n      lang = l;\n      nodes.forEach(function(n){ var v; if(l===\"zh\"){ v=n.getAttribute(\"data-zh\")||ZH2[n.getAttribute(\"data-en\")]||n.getAttribute(\"data-en\"); } else { v=n.getAttribute(\"data-\"+l)||n.getAttribute(\"data-en\"); } if(v!=null) n.innerHTML=v; });\n      root.querySelectorAll(\"#lang button\").forEach(function(b){ b.classList.toggle(\"on\", b.dataset.l===l); });\n    }\n    root.querySelectorAll(\"#lang button\").forEach(function(b){\n      b.addEventListener(\"click\", function(){ applyLang(b.dataset.l); renderProduct(); if(window.__reRenderUni) window.__reRenderUni(); });\n    });\n\n    var nav = root.querySelector(\"#nav\");\n    var burger = root.querySelector(\"#burger\");\n    if(burger) burger.addEventListener(\"click\", function(){ nav.classList.toggle(\"open\"); });\n\n    sc.addEventListener(\"click\", function(e){\n      var a = e.target.closest ? e.target.closest('a[href^=\"#\"]') : null;\n      if(!a) return;\n      var id = a.getAttribute(\"href\").slice(1);\n      if(!id){ e.preventDefault(); return; }\n      var t = root.getElementById ? root.getElementById(id) : root.querySelector(\"#\"+id);\n      if(t){ e.preventDefault(); if(nav) nav.classList.remove(\"open\");\n        sc.scrollTo({ top: Math.max(0, t.offsetTop - 66), behavior: reduce ? \"auto\" : \"smooth\" }); }\n    });\n\n    var secs = [\"hero\",\"essence\",\"glance\",\"proof\",\"levers\",\"products\",\"platform\",\"deliver\",\"cta\"];\n    var rail = root.querySelector(\"#rail\");\n    secs.forEach(function(id){ var a=document.createElement(\"a\"); a.href=\"#\"+id; rail.appendChild(a); });\n    var railDots = rail.querySelectorAll(\"a\");\n    function placeRail(){ rail.style.top = (sc.scrollTop + sc.clientHeight/2) + \"px\"; }\n    sc.addEventListener(\"scroll\", function(){ if(nav) nav.classList.toggle(\"scrolled\", sc.scrollTop>40); placeRail(); }, {passive:true});\n    placeRail();\n\n    if(\"IntersectionObserver\" in window && !reduce){\n      var io = new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add(\"in\"); io.unobserve(e.target); } }); }, {root:sc, threshold:.18});\n      root.querySelectorAll(\".reveal\").forEach(function(el){ io.observe(el); });\n    } else {\n      root.querySelectorAll(\".reveal\").forEach(function(el){ el.classList.add(\"in\"); });\n    }\n    if(\"IntersectionObserver\" in window){\n      var io2 = new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting){ var i=secs.indexOf(e.target.id); railDots.forEach(function(d2n,di){ d2n.classList.toggle(\"on\", di===i); }); } }); }, {root:sc, threshold:.5});\n      secs.forEach(function(id){ var el=root.querySelector(\"#\"+id); if(el) io2.observe(el); });\n    }\n\n    var PRODUCTS = [\n      {code:\"UI\", color:\"#5b86ff\", what_pt:\"Interface do usuário\", what_en:\"User Interface\", t_pt:\"Design the app, not a picture of it.\", t_en:\"Design the app, not a picture of it.\", d_pt:\"Interface de verdade, com dados reais — não um mockup estático.\", d_en:\"A real interface, with real data — not a static mockup.\"},\n      {code:\"REGISTRY\", color:\"#ff5a4d\", what_pt:\"Seu banco de dados\", what_en:\"Your database\", t_pt:\"Adeus, Lorem Ipsum.\", t_en:\"Say goodbye to Lorem Ipsum.\", d_pt:\"Modele, armazene e analise dados em escala, com uma linguagem única.\", d_en:\"Model, store and analyze data at scale, with a single data language.\"},\n      {code:\"MEDIA\", color:\"#e8e84d\", what_pt:\"Seu storage, na nuvem\", what_en:\"Your storage, in the cloud\", t_pt:\"Arquivos, distribuídos.\", t_en:\"Files, distributed.\", d_pt:\"Todas as ferramentas pra otimizar e distribuir arquivos em escala.\", d_en:\"Every tool you need to optimize and distribute files at scale.\"},\n      {code:\"ID\", color:\"#4de0a1\", what_pt:\"Segurança, identidade e privacidade\", what_en:\"Security, identity & privacy\", t_pt:\"Ciclos de identidade completos.\", t_en:\"Full identity lifecycles.\", d_pt:\"Do onboarding ao reset de senha — em pouquíssimo tempo.\", d_en:\"From onboarding to password reset — in no time.\"},\n      {code:\"CONNECT\", color:\"#4ddfe6\", what_pt:\"APIs e serviços externos\", what_en:\"APIs & external services\", t_pt:\"Conecte-se a qualquer coisa.\", t_en:\"Connect to anything.\", d_pt:\"O framework de aplicação da Data² — seus servidores de back-end.\", d_en:\"Data²'s application framework — your back-end servers.\"},\n      {code:\"DOMAIN\", color:\"#ff4d9e\", what_pt:\"O coração do seu sistema\", what_en:\"The heart of your system\", t_pt:\"Seu modelo, nunca escondido em código.\", t_en:\"Your model, never hidden in code.\", d_pt:\"AI multimodal out-of-the-box, ajustada em linguagem natural. Domain-Driven.\", d_en:\"Multimodal AI out of the box, tuned in natural language. Domain-Driven.\"},\n      {code:\"RUSH\", color:\"#9b5cff\", what_pt:\"Webhooks, requisições, eventos\", what_en:\"Webhooks, requests, events\", t_pt:\"Reaja a eventos em tempo real.\", t_en:\"React to events in real time.\", d_pt:\"Agende, receba e automatize. Automação e monitoramento embutidos.\", d_en:\"Schedule, receive and automate. Automation and monitoring built in.\"},\n      {code:\"CASHIER\", color:\"#84e05a\", what_pt:\"Transações de valor\", what_en:\"Value transactions\", soon:true, t_pt:\"Just charge.\", t_en:\"Just charge.\", d_pt:\"Compre e venda qualquer coisa que dinheiro possa pagar.\", d_en:\"Buy and sell anything money can buy.\"}\n    ];\n    var ring = root.querySelector(\"#ring\");\n    var current = 0;\n    PRODUCTS.forEach(function(p,i){\n      var o = document.createElement(\"div\");\n      o.className = \"orb\"; o.style.color = p.color; o.style.background = p.color;\n      o.setAttribute(\"data-code\", p.code);\n      o.style.animationDelay = (-i*0.5) + \"s\";\n      var ang = (i/PRODUCTS.length)*Math.PI*2 - Math.PI/2, R = 42;\n      o.style.left = (50 + Math.cos(ang)*R) + \"%\";\n      o.style.top  = (50 + Math.sin(ang)*R) + \"%\";\n      o.addEventListener(\"mouseenter\", function(){ current=i; renderProduct(); });\n      o.addEventListener(\"click\", function(){ current=i; renderProduct(); });\n      ring.appendChild(o);\n    });\n    var orbs = ring.querySelectorAll(\".orb\");\n    function renderProduct(){\n      orbs.forEach(function(o,i){ o.classList.toggle(\"on\", i===current); });\n    }\n\n    function initFlow(canvas){\n      var ctx = canvas.getContext && canvas.getContext(\"2d\");\n      if(!ctx) return;\n      var hue = (getComputedStyle(canvas.parentElement).getPropertyValue(\"--hue\")||\"#5b86ff\").trim();\n      var w=0, h=0, dpr = Math.min(window.devicePixelRatio||1, 2);\n      function size(){ w=canvas.clientWidth; h=canvas.clientHeight; if(!w||!h) return; canvas.width=w*dpr; canvas.height=h*dpr; ctx.setTransform(dpr,0,0,dpr,0,0); }\n      size();\n      window.addEventListener(\"resize\", size);\n      var lines = 3;\n      function draw(t){\n        if(!w||!h){ size(); if(!w||!h) return; }\n        ctx.clearRect(0,0,w,h);\n        for(var i=0;i<lines;i++){\n          var yb=h*(0.32+i*0.16), amp=h*0.10+i*8, ph=t*0.00016*(1+i*0.35)+i*1.7;\n          ctx.beginPath();\n          for(var x=0;x<=w;x+=14){ var y=yb+Math.sin(x*0.0045+ph)*amp+Math.sin(x*0.0011-ph*0.7)*amp*0.5; if(x===0) ctx.moveTo(x,y); else ctx.lineTo(x,y); }\n          ctx.strokeStyle=hue; ctx.globalAlpha=0.16-i*0.03; ctx.lineWidth=1.4; ctx.stroke();\n        }\n        ctx.globalAlpha=1;\n      }\n      var raf=null;\n      function loop(t){ draw(t||0); raf=requestAnimationFrame(loop); }\n      if(reduce){ draw(0); }\n      else if(\"IntersectionObserver\" in window){\n        new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting && !raf){ raf=requestAnimationFrame(loop); } else if(!e.isIntersecting && raf){ cancelAnimationFrame(raf); raf=null; } }); }, {root:sc, threshold:.02}).observe(canvas);\n      } else { loop(0); }\n    }\n    root.querySelectorAll(\"canvas.flow\").forEach(initFlow);\n\n    root.querySelectorAll(\".acc-head\").forEach(function(h){\n      h.addEventListener(\"click\", function(){\n        var item=h.parentElement, willOpen=!item.classList.contains(\"open\");\n        root.querySelectorAll(\".acc-item\").forEach(function(it){ it.classList.remove(\"open\"); });\n        if(willOpen) item.classList.add(\"open\");\n      });\n    });\n\n    var hero = root.querySelector(\"#hero\");\n    var hfx = root.querySelector(\".herofx\");\n    if(hfx && hfx.getContext){\n      var hctx = hfx.getContext(\"2d\");\n      var HSTOPS=[[155,92,255],[91,134,255],[77,223,230],[77,224,161],[132,224,90],[232,232,77],[255,106,77],[255,77,158]];\n      var hw=0,hh=0,hdpr=Math.min(window.devicePixelRatio||1,2);\n      var mx=0.5,my=0.42,tx=0.5,ty=0.42,idle=999;\n      function hsize(){ hw=hfx.clientWidth; hh=hfx.clientHeight; if(!hw||!hh)return; hfx.width=hw*hdpr; hfx.height=hh*hdpr; hctx.setTransform(hdpr,0,0,hdpr,0,0); }\n      hsize(); window.addEventListener(\"resize\", hsize);\n      if(hero) hero.addEventListener(\"pointermove\", function(e){ var r=hero.getBoundingClientRect(); tx=(e.clientX-r.left)/r.width; ty=(e.clientY-r.top)/r.height; idle=0; });\n      function wrgb(t){ var p=((t*0.00003)%1)*8; var i=Math.floor(p), f=p-i; var a=HSTOPS[i%8], b=HSTOPS[(i+1)%8]; return [Math.round(a[0]+(b[0]-a[0])*f),Math.round(a[1]+(b[1]-a[1])*f),Math.round(a[2]+(b[2]-a[2])*f)]; }\n      function hdraw(t){\n        if(!hw||!hh){ hsize(); if(!hw||!hh) return; }\n        idle++;\n        if(reduce){ tx=0.5; ty=0.42; }\n        else if(idle>110){ tx=0.5+Math.cos(t*0.00015)*0.18; ty=0.42+Math.sin(t*0.0002)*0.12; }\n        mx+=(tx-mx)*0.045; my+=(ty-my)*0.045;\n        hctx.clearRect(0,0,hw,hh);\n        var c=wrgb(t), gx=mx*hw, gy=my*hh, R=Math.max(hw,hh)*0.55;\n        var g=hctx.createRadialGradient(gx,gy,0,gx,gy,R);\n        g.addColorStop(0,\"rgba(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\",0.11)\");\n        g.addColorStop(0.5,\"rgba(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\",0.04)\");\n        g.addColorStop(1,\"rgba(\"+c[0]+\",\"+c[1]+\",\"+c[2]+\",0)\");\n        hctx.fillStyle=g; hctx.fillRect(0,0,hw,hh);\n        for(var i=0;i<3;i++){ var yb=hh*(0.3+i*0.2), amp=hh*0.07+i*10, ph=t*0.00011*(1+i*0.3)+i*2; hctx.beginPath();\n          for(var x=0;x<=hw;x+=16){ var y=yb+Math.sin(x*0.004+ph)*amp+Math.sin(x*0.0012-ph*0.6)*amp*0.5; if(x===0)hctx.moveTo(x,y); else hctx.lineTo(x,y);} \n          hctx.strokeStyle=\"rgba(255,255,255,\"+(0.05-i*0.012)+\")\"; hctx.lineWidth=1.2; hctx.stroke(); }\n      }\n      if(reduce){ hdraw(0); } else { (function hloop(t){ hdraw(t||0); requestAnimationFrame(hloop); })(0); }\n    }\n\n    var UNIS = [\n  {hue:\"#5b86ff\", name:{pt:\"RH & Pessoas\",en:\"HR & People\",zh:\"人力资源与员工\"}, tagline:{pt:\"Um RH que responde milhares de colaboradores, em vários idiomas — na hora. Cada peça, um módulo Data².\",en:\"An HR that answers thousands of employees, in many languages — instantly. Each piece, a Data² module.\",zh:\"一个能即时回应数千名员工、支持多语言的人力资源 —— 每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m0\", label:{pt:\"Assistente de AI\",en:\"AI assistant\",zh:\"AI 助手\"}, title:{pt:\"Assistente de AI ao colaborador\",en:\"AI assistant for employees\",zh:\"面向员工的 AI 助手\"}, desc:{pt:\"Um assistente que responde dúvidas de RH — benefícios, férias, políticas — em linguagem natural e em vários idiomas, 24/7.\",en:\"An assistant that answers HR questions — benefits, vacation, policies — in natural language and many languages, 24/7.\",zh:\"一个用自然语言、多语言全天候回答人力资源问题（福利、休假、政策）的助手。\"}, points:[{pt:\"Chat com AI treinada nas políticas da empresa\",en:\"Chat with AI trained on company policy\",zh:\"基于公司政策训练的 AI 聊天\"},{pt:\"Respostas ancoradas em documentos internos\",en:\"Answers grounded in internal documents\",zh:\"答案有据可依，源自内部文档\"},{pt:\"Multi-idioma para operações globais\",en:\"Multi-language for global operations\",zh:\"面向全球运营的多语言支持\"},{pt:\"Disponível no portal, WhatsApp e Teams\",en:\"Available on portal, WhatsApp and Teams\",zh:\"支持门户、WhatsApp 与 Teams\"}], oldModel:{pt:\"Colaborador espera dias por uma resposta de RH; o time se afoga em perguntas repetidas.\",en:\"Employees wait days for an HR reply; the team drowns in repeated questions.\",zh:\"员工等待数日才得到人力资源回复；团队被重复问题淹没。\"}, withData2:{pt:\"Resposta na hora, a qualquer hora — e o time de RH foca no que é humano.\",en:\"Instant answers, any time — and the HR team focuses on what's human.\",zh:\"随时即时作答 —— 人力资源团队专注于真正需要人的事。\"}, kpis:[{num:\"24/7\",cap:{pt:\"disponibilidade\",en:\"availability\",zh:\"全天候可用\"}},{num:\"−70%\",cap:{pt:\"perguntas repetidas\",en:\"repeat questions\",zh:\"重复提问\"}}]},\n    {motif:\"m2\", label:{pt:\"Transbordo\",en:\"Handoff\",zh:\"转接\"}, title:{pt:\"Transbordo para atendimento humano\",en:\"Handoff to a human agent\",zh:\"转接人工客服\"}, desc:{pt:\"Quando o caso é sensível, a conversa passa para o analista de RH certo — com todo o histórico.\",en:\"When a case is sensitive, the conversation moves to the right HR analyst — with the full history.\",zh:\"遇到敏感事项时，对话转交给合适的人力资源分析师 —— 携带完整历史。\"}, points:[{pt:\"Escalonamento por assunto e sensibilidade\",en:\"Escalation by topic and sensitivity\",zh:\"按主题与敏感度升级\"},{pt:\"Contexto completo entregue ao analista\",en:\"Full context handed to the analyst\",zh:\"向分析师交付完整上下文\"},{pt:\"Fila e status de atendimento\",en:\"Queue and handling status\",zh:\"队列与处理状态\"},{pt:\"Confidencialidade por perfil de acesso\",en:\"Confidentiality by access profile\",zh:\"按访问权限保密\"}], oldModel:{pt:\"Casos delicados se perdem em e-mails; ninguém sabe quem está tratando o quê.\",en:\"Delicate cases get lost in email; no one knows who is handling what.\",zh:\"敏感事项淹没在邮件里；无人知晓谁在处理什么。\"}, withData2:{pt:\"Cada caso vai para a pessoa certa, com contexto e rastreabilidade.\",en:\"Each case reaches the right person, with context and traceability.\",zh:\"每个事项都送达对的人，带上下文与可追溯。\"}, kpis:[{num:\"100%\",cap:{pt:\"contexto preservado\",en:\"context preserved\",zh:\"上下文保留\"}}]},\n    {motif:\"m3\", label:{pt:\"Leitura de docs\",en:\"Doc reading\",zh:\"文档识别\"}, title:{pt:\"Leitura de documentos (OCR)\",en:\"Document reading (OCR)\",zh:\"文档识别（OCR）\"}, desc:{pt:\"Atestados, comprovantes e formulários lidos automaticamente pela AI — sem digitação manual.\",en:\"Certificates, receipts and forms read automatically by AI — no manual typing.\",zh:\"证明、凭证与表单由 AI 自动识别 —— 无需人工录入。\"}, points:[{pt:\"Extração de dados de imagens e PDFs\",en:\"Data extraction from images and PDFs\",zh:\"从图像与 PDF 中提取数据\"},{pt:\"Validação automática de campos\",en:\"Automatic field validation\",zh:\"字段自动校验\"},{pt:\"Classificação do tipo de documento\",en:\"Document-type classification\",zh:\"文档类型分类\"},{pt:\"Arquivo seguro no storage da empresa\",en:\"Secure filing in company storage\",zh:\"安全归档至公司存储\"}], oldModel:{pt:\"Alguém relê cada atestado e redigita à mão — lento e sujeito a erro.\",en:\"Someone rereads each certificate and retypes it by hand — slow and error-prone.\",zh:\"有人逐一重读证明并手动录入 —— 缓慢且易错。\"}, withData2:{pt:\"A AI lê, valida e arquiva em segundos.\",en:\"AI reads, validates and files in seconds.\",zh:\"AI 数秒内完成识别、校验与归档。\"}, kpis:[{num:\"−90%\",cap:{pt:\"tempo de digitação\",en:\"data-entry time\",zh:\"录入时间\"}}]},\n    {motif:\"m1\", label:{pt:\"Regras\",en:\"Rules\",zh:\"规则\"}, title:{pt:\"Respostas e regras configuráveis pela área\",en:\"Answers & rules configured by the team\",zh:\"答案与规则由业务团队配置\"}, desc:{pt:\"O próprio RH ajusta respostas, fluxos e políticas — sem depender de TI ou de código.\",en:\"HR itself adjusts answers, flows and policies — with no dependency on IT or code.\",zh:\"人力资源团队自行调整答案、流程与政策 —— 无需依赖 IT 或代码。\"}, points:[{pt:\"Editor de respostas e fluxos sem código\",en:\"No-code answer and flow editor\",zh:\"无代码的答案与流程编辑器\"},{pt:\"Regras por país, área e cargo\",en:\"Rules by country, area and role\",zh:\"按国家、部门与岗位设置规则\"},{pt:\"Versões e publicação controladas\",en:\"Versioning and controlled publishing\",zh:\"版本管理与受控发布\"},{pt:\"Testes antes de ir ao ar\",en:\"Tested before going live\",zh:\"上线前测试\"}], oldModel:{pt:\"Cada mudança de política vira um chamado de TI que demora semanas.\",en:\"Every policy change becomes an IT ticket that takes weeks.\",zh:\"每次政策变更都变成耗时数周的 IT 工单。\"}, withData2:{pt:\"A área muda a regra e publica no mesmo dia.\",en:\"The team changes the rule and ships the same day.\",zh:\"业务团队当天即可修改规则并发布。\"}, kpis:[{num:\"0\",cap:{pt:\"dependência de código\",en:\"code dependency\",zh:\"代码依赖\"}}]},\n    {motif:\"m4\", label:{pt:\"Analytics & CSAT\",en:\"Analytics & CSAT\",zh:\"分析与 CSAT\"}, title:{pt:\"Analytics e CSAT\",en:\"Analytics & CSAT\",zh:\"分析与满意度（CSAT）\"}, desc:{pt:\"Painéis mostram volume, temas, tempo de resposta e satisfação — para melhorar continuamente.\",en:\"Dashboards show volume, topics, response time and satisfaction — to improve continuously.\",zh:\"仪表盘呈现工单量、主题、响应时间与满意度 —— 持续改进。\"}, points:[{pt:\"Métricas de volume e tempo de resposta\",en:\"Volume and response-time metrics\",zh:\"工单量与响应时间指标\"},{pt:\"Temas mais perguntados\",en:\"Most-asked topics\",zh:\"最常被问的主题\"},{pt:\"Pesquisa de satisfação (CSAT)\",en:\"Satisfaction survey (CSAT)\",zh:\"满意度调查（CSAT）\"},{pt:\"Alertas de picos e gargalos\",en:\"Alerts for spikes and bottlenecks\",zh:\"峰值与瓶颈告警\"}], oldModel:{pt:\"Ninguém sabe o que mais consome o RH; decisão no achismo.\",en:\"No one knows what consumes HR most; decisions by guesswork.\",zh:\"无人知晓什么最耗费人力资源精力；决策靠猜。\"}, withData2:{pt:\"Dados mostram onde agir — e a experiência do colaborador melhora.\",en:\"Data shows where to act — and the employee experience improves.\",zh:\"数据指明行动方向 —— 员工体验随之提升。\"}, kpis:[{num:\"+CSAT\",cap:{pt:\"satisfação medida\",en:\"satisfaction measured\",zh:\"满意度可量\"}}]}\n  ]},\n  {hue:\"#4de0a1\", name:{pt:\"Supply & Operações\",en:\"Supply & Operations\",zh:\"供应链与运营\"}, tagline:{pt:\"Transformar sobra de estoque em plano de produção priorizado — em minutos, não semanas. Cada peça, um módulo Data².\",en:\"Turn leftover stock into a prioritized production plan — in minutes, not weeks. Each piece, a Data² module.\",zh:\"把过剩库存变成有优先级的生产计划 —— 只需几分钟，而非数周。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m6\", label:{pt:\"Cenários\",en:\"Scenarios\",zh:\"情景\"}, title:{pt:\"Simulação de cenários de produção\",en:\"Production scenario simulation\",zh:\"生产情景模拟\"}, desc:{pt:\"Rode dezenas de cenários 'e se' sobre o dado real de estoque e demanda — e compare resultados lado a lado.\",en:\"Run dozens of 'what-if' scenarios over real stock and demand data — and compare results side by side.\",zh:\"基于真实库存与需求数据运行数十种'假设'情景 —— 并逐一对比结果。\"}, points:[{pt:\"Parâmetros ajustáveis pela área\",en:\"Parameters adjustable by the team\",zh:\"参数由业务团队调整\"},{pt:\"Cálculo sobre dado vivo do data lake\",en:\"Computed over live data-lake data\",zh:\"基于数据湖实时数据计算\"},{pt:\"Comparação de cenários lado a lado\",en:\"Side-by-side scenario comparison\",zh:\"情景并排对比\"},{pt:\"Do cenário ao plano em um clique\",en:\"From scenario to plan in one click\",zh:\"一键从情景到计划\"}], oldModel:{pt:\"Cada simulação é uma planilha nova, feita à mão — e ninguém confia no número.\",en:\"Each simulation is a new hand-made spreadsheet — and no one trusts the number.\",zh:\"每次模拟都是一张新的手工表格 —— 没人信得过那个数字。\"}, withData2:{pt:\"Cenários em minutos sobre o dado real, comparáveis e auditáveis.\",en:\"Scenarios in minutes over real data, comparable and auditable.\",zh:\"几分钟内基于真实数据生成情景，可对比、可审计。\"}, kpis:[{num:\"5min\",cap:{pt:\"por cenário\",en:\"per scenario\",zh:\"每个情景\"}}]},\n    {motif:\"m3\", label:{pt:\"Estrutura (BOM)\",en:\"BOM\",zh:\"物料清单\"}, title:{pt:\"Explosão de estrutura (BOM)\",en:\"Bill-of-materials explosion\",zh:\"物料清单（BOM）展开\"}, desc:{pt:\"A partir de um produto, o Rush explode toda a árvore de componentes — recursivamente, com quantidades.\",en:\"From a product, Rush explodes the whole component tree — recursively, with quantities.\",zh:\"从一个成品出发，Rush 递归展开整棵组件树 —— 带数量。\"}, points:[{pt:\"Explosão recursiva multi-nível\",en:\"Recursive multi-level explosion\",zh:\"多层级递归展开\"},{pt:\"Quantidades e perdas por etapa\",en:\"Quantities and losses per step\",zh:\"每步的用量与损耗\"},{pt:\"Disponibilidade cruzada com estoque\",en:\"Cross-checked with stock availability\",zh:\"与库存可用量交叉核对\"},{pt:\"Reprocessamento em tempo real\",en:\"Real-time recomputation\",zh:\"实时重算\"}], oldModel:{pt:\"Explodir uma BOM à mão leva dias e erra — e some quando o engenheiro sai.\",en:\"Exploding a BOM by hand takes days and errs — and vanishes when the engineer leaves.\",zh:\"手工展开 BOM 耗时数天且易错 —— 工程师一走就没了。\"}, withData2:{pt:\"A estrutura explode sozinha, com quantidades e disponibilidade, em segundos.\",en:\"The structure explodes itself, with quantities and availability, in seconds.\",zh:\"结构自动展开，带数量与可用量，只需数秒。\"}, kpis:[{num:\"−95%\",cap:{pt:\"tempo de cálculo\",en:\"calc time\",zh:\"计算时间\"}}]},\n    {motif:\"m1\", label:{pt:\"Score\",en:\"Score\",zh:\"评分\"}, title:{pt:\"Score de economia e viabilidade\",en:\"Savings & feasibility scoring\",zh:\"节省与可行性评分\"}, desc:{pt:\"Cada plano recebe um score de economia potencial e de viabilidade — para priorizar o que vale a pena.\",en:\"Each plan gets a score for potential savings and feasibility — to prioritize what's worth it.\",zh:\"每个计划都获得潜在节省与可行性评分 —— 优先执行最值得的方案。\"}, points:[{pt:\"Score de economia por cenário\",en:\"Savings score per scenario\",zh:\"每情景节省评分\"},{pt:\"Viabilidade por restrição de capacidade\",en:\"Feasibility by capacity constraints\",zh:\"按产能约束评估可行性\"},{pt:\"Ranking automático de prioridade\",en:\"Automatic priority ranking\",zh:\"自动优先级排序\"},{pt:\"Regras de negócio configuráveis\",en:\"Configurable business rules\",zh:\"可配置业务规则\"}], oldModel:{pt:\"Prioridade definida por intuição; oportunidades de economia passam batido.\",en:\"Priority set by intuition; savings opportunities slip by.\",zh:\"优先级靠直觉；节省机会白白溜走。\"}, withData2:{pt:\"O sistema ranqueia por economia e viabilidade — a área age no que rende mais.\",en:\"The system ranks by savings and feasibility — the team acts on what pays most.\",zh:\"系统按节省与可行性排序 —— 团队优先处理最有回报的。\"}, kpis:[{num:\"×10\",cap:{pt:\"oportunidades vistas\",en:\"opportunities surfaced\",zh:\"发现的机会\"}}]},\n    {motif:\"m2\", label:{pt:\"SQL self-service\",en:\"Self-service SQL\",zh:\"自助 SQL\"}, title:{pt:\"SQL self-service sobre o data lake\",en:\"Self-service SQL over the data lake\",zh:\"面向数据湖的自助 SQL\"}, desc:{pt:\"A área consulta o data lake direto — em SQL ou em linguagem natural — sem abrir chamado para o time de dados.\",en:\"The team queries the data lake directly — in SQL or natural language — with no ticket to the data team.\",zh:\"业务团队直接查询数据湖 —— 用 SQL 或自然语言 —— 无需向数据团队开工单。\"}, points:[{pt:\"Conexão governada ao data lake (Databricks)\",en:\"Governed connection to the data lake (Databricks)\",zh:\"受治理地连接数据湖（Databricks）\"},{pt:\"Consulta em SQL ou linguagem natural\",en:\"Query in SQL or natural language\",zh:\"用 SQL 或自然语言查询\"},{pt:\"Resultados em tabela e gráfico\",en:\"Results as table and chart\",zh:\"结果以表格与图表呈现\"},{pt:\"Permissões por perfil de acesso\",en:\"Permissions by access profile\",zh:\"按访问权限授权\"}], oldModel:{pt:\"Toda pergunta vira chamado para o time de dados; a resposta chega dias depois.\",en:\"Every question becomes a ticket to the data team; the answer arrives days later.\",zh:\"每个问题都变成给数据团队的工单；答案数天后才到。\"}, withData2:{pt:\"A própria área pergunta e recebe na hora — sem fila, com governança.\",en:\"The team asks and gets it instantly — no queue, with governance.\",zh:\"业务团队自行提问即时得到结果 —— 无排队、有治理。\"}, kpis:[{num:\"0\",cap:{pt:\"chamados ao time de dados\",en:\"tickets to the data team\",zh:\"给数据团队的工单\"}}]},\n    {motif:\"m7\", label:{pt:\"Exportação\",en:\"Export\",zh:\"导出\"}, title:{pt:\"Exportação para planilha\",en:\"Export to spreadsheet\",zh:\"导出到表格\"}, desc:{pt:\"Qualquer plano ou consulta vira planilha ou relatório com um clique — para compartilhar com quem ainda vive no Excel.\",en:\"Any plan or query becomes a spreadsheet or report in one click — to share with whoever still lives in Excel.\",zh:\"任何计划或查询一键变成表格或报表 —— 分享给仍离不开 Excel 的人。\"}, points:[{pt:\"Export em um clique (XLSX/CSV)\",en:\"One-click export (XLSX/CSV)\",zh:\"一键导出（XLSX/CSV）\"},{pt:\"Relatórios formatados prontos\",en:\"Ready formatted reports\",zh:\"格式化报表即取即用\"},{pt:\"Agendamento de envios recorrentes\",en:\"Scheduled recurring sends\",zh:\"定时循环发送\"},{pt:\"Histórico de versões exportadas\",en:\"Version history of exports\",zh:\"导出版本历史\"}], oldModel:{pt:\"Copiar e colar entre sistemas e planilhas — retrabalho e erro garantidos.\",en:\"Copy-paste between systems and spreadsheets — guaranteed rework and error.\",zh:\"在系统与表格间复制粘贴 —— 返工与错误在所难免。\"}, withData2:{pt:\"Um clique gera a planilha certa, sempre atualizada.\",en:\"One click generates the right spreadsheet, always up to date.\",zh:\"一键生成正确的表格，始终最新。\"}, kpis:[{num:\"1\",cap:{pt:\"clique para exportar\",en:\"click to export\",zh:\"点击即导出\"}}]}\n  ]},\n  {hue:\"#e8b84d\", name:{pt:\"Serviços Financeiros\",en:\"Financial Services\",zh:\"金融服务\"}, tagline:{pt:\"Prospecção 1-a-1 personalizada por AI, em escala de milhares — operada pelo próprio time comercial. Cada peça, um módulo Data².\",en:\"AI-personalized 1-to-1 outreach at a scale of thousands — run by the commercial team itself. Each piece, a Data² module.\",zh:\"AI 一对一个性化触达，规模可达数千 —— 由商务团队自己操盘。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m3\", label:{pt:\"CRM + outreach\",en:\"CRM + outreach\",zh:\"CRM + 触达\"}, title:{pt:\"CRM + automação de outreach\",en:\"CRM + outreach automation\",zh:\"CRM + 触达自动化\"}, desc:{pt:\"Um CRM próprio da área com automação de prospecção — leads, estágios e cadências, tudo num sistema só.\",en:\"The team's own CRM with outreach automation — leads, stages and cadences, all in one system.\",zh:\"业务团队自有的 CRM，内置触达自动化 —— 线索、阶段与节奏，尽在一个系统。\"}, points:[{pt:\"Base de leads com estágios e dono\",en:\"Lead base with stages and owner\",zh:\"含阶段与负责人的线索库\"},{pt:\"Cadências de contato automatizadas\",en:\"Automated contact cadences\",zh:\"自动化联系节奏\"},{pt:\"Regras de disparo por evento (Rush)\",en:\"Event-triggered sending (Rush)\",zh:\"按事件触发发送（Rush）\"},{pt:\"Histórico completo por lead\",en:\"Full history per lead\",zh:\"每条线索完整历史\"}], oldModel:{pt:\"Prospecção em planilha + envio manual — sem escala e sem rastreio.\",en:\"Outreach in a spreadsheet + manual sending — no scale, no tracking.\",zh:\"用表格做触达 + 手动发送 —— 无规模、无追踪。\"}, withData2:{pt:\"O CRM dispara a cadência certa sozinho e registra tudo.\",en:\"The CRM fires the right cadence on its own and logs everything.\",zh:\"CRM 自动触发正确节奏并记录一切。\"}, kpis:[{num:\"1000s\",cap:{pt:\"leads em cadência\",en:\"leads in cadence\",zh:\"进入节奏的线索\"}}]},\n    {motif:\"m1\", label:{pt:\"Ondas omnichannel\",en:\"Omnichannel waves\",zh:\"全渠道波次\"}, title:{pt:\"Ondas de mensagens omnichannel\",en:\"Omnichannel message waves\",zh:\"全渠道消息波次\"}, desc:{pt:\"Campanhas em ondas por e-mail, WhatsApp e SMS — com controle de volume, horário e resposta.\",en:\"Wave campaigns over email, WhatsApp and SMS — with control of volume, timing and reply.\",zh:\"通过邮件、WhatsApp 与短信分波次投放 —— 掌控数量、时机与回复。\"}, points:[{pt:\"Disparo em ondas com controle de volume\",en:\"Wave sending with volume control\",zh:\"分波次发送并控制数量\"},{pt:\"E-mail, WhatsApp e SMS no mesmo fluxo\",en:\"Email, WhatsApp and SMS in one flow\",zh:\"邮件、WhatsApp 与短信统一流程\"},{pt:\"Janela de horário e frequência\",en:\"Time window and frequency\",zh:\"时间窗口与频次\"},{pt:\"Captura de respostas de volta ao CRM\",en:\"Replies captured back into the CRM\",zh:\"回复自动回流至 CRM\"}], oldModel:{pt:\"Disparo em massa único, sem ritmo — vira spam e queima a base.\",en:\"A single mass blast, no rhythm — becomes spam and burns the base.\",zh:\"一次性群发、毫无节奏 —— 沦为垃圾信息并烧毁客户池。\"}, withData2:{pt:\"Ondas ritmadas e multicanal — mais entrega, menos queima.\",en:\"Paced, multichannel waves — more delivery, less burn.\",zh:\"有节奏的多渠道波次 —— 送达更高、损耗更低。\"}, kpis:[{num:\"3\",cap:{pt:\"canais num fluxo\",en:\"channels in one flow\",zh:\"渠道合一\"}}]},\n    {motif:\"m5\", label:{pt:\"Copy por AI\",en:\"AI copy\",zh:\"AI 文案\"}, title:{pt:\"Copy gerada por AI no tom do lead\",en:\"AI-written copy in the lead's tone\",zh:\"以客户口吻由 AI 撰写文案\"}, desc:{pt:\"A AI escreve cada mensagem no tom e no contexto de cada lead — personalização real, não 'Olá [NOME]'.\",en:\"AI writes each message in each lead's tone and context — real personalization, not 'Hi [NAME]'.\",zh:\"AI 依据每位客户的语气与情境撰写每条消息 —— 真正的个性化，而非'你好 [姓名]'。\"}, points:[{pt:\"Geração de copy por AI multimodal\",en:\"Copy generation via multimodal AI\",zh:\"多模态 AI 生成文案\"},{pt:\"Personalização por perfil e histórico\",en:\"Personalization by profile and history\",zh:\"按画像与历史个性化\"},{pt:\"Tom e idioma ajustáveis\",en:\"Adjustable tone and language\",zh:\"可调语气与语言\"},{pt:\"Aprovação humana antes do envio\",en:\"Human approval before sending\",zh:\"发送前人工审批\"}], oldModel:{pt:\"Template único para todos — genérico, ignorado, baixa resposta.\",en:\"One template for everyone — generic, ignored, low reply.\",zh:\"所有人一个模板 —— 千篇一律、被无视、回复率低。\"}, withData2:{pt:\"Cada lead recebe uma mensagem que parece escrita só para ele.\",en:\"Each lead gets a message that feels written just for them.\",zh:\"每位客户收到的消息，仿佛专为他而写。\"}, kpis:[{num:\"+2×\",cap:{pt:\"taxa de resposta\",en:\"reply rate\",zh:\"回复率\"}}]},\n    {motif:\"m6\", label:{pt:\"Proposta & ROI\",en:\"Offer & ROI\",zh:\"方案与 ROI\"}, title:{pt:\"Modelagem de proposta e ROI\",en:\"Offer & ROI modeling\",zh:\"方案与 ROI 建模\"}, desc:{pt:\"Simule propostas e mostre o ROI para o cliente na hora — números que fecham negócio.\",en:\"Simulate offers and show the client the ROI on the spot — numbers that close deals.\",zh:\"即时模拟方案并向客户展示 ROI —— 用数字促成交易。\"}, points:[{pt:\"Simulador de proposta com parâmetros\",en:\"Offer simulator with parameters\",zh:\"带参数的方案模拟器\"},{pt:\"Cálculo de ROI e payback\",en:\"ROI and payback calculation\",zh:\"ROI 与回收期计算\"},{pt:\"Comparação de opções para o cliente\",en:\"Option comparison for the client\",zh:\"为客户对比多种选项\"},{pt:\"Proposta exportável em PDF\",en:\"Offer exportable to PDF\",zh:\"方案可导出 PDF\"}], oldModel:{pt:\"Proposta feita à mão depois da reunião — o timing passa e o lead esfria.\",en:\"Offer built by hand after the meeting — the timing passes and the lead cools.\",zh:\"会后手工制作方案 —— 时机已过，客户变冷。\"}, withData2:{pt:\"Proposta e ROI na hora, dentro da conversa — o lead decide quente.\",en:\"Offer and ROI on the spot, inside the conversation — the lead decides while hot.\",zh:\"对话中即时给出方案与 ROI —— 趁热促成决策。\"}, kpis:[{num:\"1\",cap:{pt:\"reunião para fechar\",en:\"meeting to close\",zh:\"一次会议成交\"}}]},\n    {motif:\"m2\", label:{pt:\"SSO\",en:\"SSO\",zh:\"单点登录\"}, title:{pt:\"SSO corporativo\",en:\"Corporate SSO\",zh:\"企业单点登录（SSO）\"}, desc:{pt:\"Login integrado ao provedor de identidade da empresa — seguro, auditável e sem senha nova.\",en:\"Login integrated with the company's identity provider — secure, auditable, no new password.\",zh:\"与企业身份提供商集成的登录 —— 安全、可审计、无需新密码。\"}, points:[{pt:\"Integração com IdP corporativo (SSO/SAML/OAuth)\",en:\"Corporate IdP integration (SSO/SAML/OAuth)\",zh:\"对接企业 IdP（SSO/SAML/OAuth）\"},{pt:\"Perfis e permissões por papel\",en:\"Roles and permissions by profile\",zh:\"按角色的权限配置\"},{pt:\"Trilhas de auditoria de acesso\",en:\"Access audit trails\",zh:\"访问审计日志\"},{pt:\"Provisionamento e revogação central\",en:\"Central provisioning and revocation\",zh:\"集中开通与撤销\"}], oldModel:{pt:\"Mais um sistema, mais uma senha — e um buraco de segurança e compliance.\",en:\"One more system, one more password — and a security and compliance hole.\",zh:\"又一个系统、又一个密码 —— 还多一个安全与合规漏洞。\"}, withData2:{pt:\"Entra com a identidade da empresa — seguro e auditável desde o primeiro dia.\",en:\"Sign in with the company identity — secure and auditable from day one.\",zh:\"用企业身份登录 —— 从第一天起即安全可审计。\"}, kpis:[{num:\"SSO\",cap:{pt:\"sem senha nova\",en:\"no new password\",zh:\"无需新密码\"}}]}\n  ]},\n  {hue:\"#4ddfe6\", name:{pt:\"CX & Contact Center\",en:\"CX & Contact Center\",zh:\"客户体验与呼叫中心\"}, tagline:{pt:\"Um contact center inteiro, funcionando como um sistema vivo — cada componente é um módulo Data². Passe o mouse. Role para os detalhes.\",en:\"An entire contact center, running as a living system — each component is a Data² module. Hover. Scroll for the details.\",zh:\"一个完整的呼叫中心，如同一个活的系统在运行 —— 每个组件都是一个 Data² 模块。悬停查看，下滚了解详情。\"}, layout:[[108,86],[345,38],[355,236],[612,84],[556,246]], comps:[\n    {motif:\"m0\", label:{pt:\"Webchat\",en:\"Webchat\",zh:\"网页聊天\"}, title:{pt:\"Webchat omnichannel\",en:\"Omnichannel webchat\",zh:\"全渠道网页聊天\"}, desc:{pt:\"Um widget no seu site conversa no mesmo fluxo que WhatsApp, voz e e-mail. O cliente começa onde quiser e a conversa nunca se perde.\",en:\"A widget on your site talks in the same flow as WhatsApp, voice and email. Customers start anywhere and the conversation is never lost.\",zh:\"网站挂件与 WhatsApp、语音和邮件处于同一流程。客户可从任何渠道开始，对话永不丢失。\"}, points:[{pt:\"Widget embutido via iframe + websockets\",en:\"Embedded widget via iframe + websockets\",zh:\"通过 iframe + websockets 嵌入挂件\"},{pt:\"Ponte com provedor de mensageria e voz (CPaaS)\",en:\"Bridge to a messaging/voice provider (CPaaS)\",zh:\"对接消息/语音服务商（CPaaS）\"},{pt:\"Sessões, mensagens e transferências unificadas por cliente\",en:\"Sessions, messages and transfers unified per customer\",zh:\"按客户统一会话、消息与转接\"},{pt:\"Continuidade de contexto ao trocar de canal\",en:\"Context continuity across channels\",zh:\"跨渠道保持上下文连续\"}], oldModel:{pt:\"Canais soltos, sem histórico compartilhado. O cliente repete tudo a cada troca; o atendente trabalha às cegas.\",en:\"Disconnected channels, no shared history. Customers repeat everything on each switch; agents work blind.\",zh:\"渠道割裂、无共享历史。客户每次切换都要重复，坐席只能盲目应对。\"}, withData2:{pt:\"Um só fluxo, um só histórico. Menos repetição, respostas mais rápidas, e o cliente começa onde for mais fácil.\",en:\"One flow, one history. Less repetition, faster answers, and customers start wherever is easiest.\",zh:\"统一流程、统一历史。更少重复、更快响应，客户从最方便的渠道开始。\"}, kpis:[{num:\"100k+\",cap:{pt:\"atendimentos/dia\",en:\"interactions/day\",zh:\"次服务/天\"}}]},\n    {motif:\"m1\", label:{pt:\"Bot de triagem\",en:\"Triage bot\",zh:\"分流机器人\"}, title:{pt:\"Bot de triagem com AI\",en:\"AI triage bot\",zh:\"AI 分流机器人\"}, desc:{pt:\"A AI entende a intenção, resolve na hora o que é simples e classifica o resto para a fila certa — antes de qualquer humano tocar.\",en:\"AI reads intent, instantly resolves the simple, and routes the rest to the right queue — before any human touches it.\",zh:\"AI 理解意图，即时解决简单问题，并将其余分流到正确队列 —— 无需任何人工介入。\"}, points:[{pt:\"Detecção de caso de uso por AI\",en:\"AI use-case detection\",zh:\"AI 用例识别\"},{pt:\"Fluxos guiados: cancelamento, troca, reembolso, atraso\",en:\"Guided flows: cancel, exchange, refund, delay\",zh:\"引导式流程：取消、换货、退款、延迟\"},{pt:\"Leitura de imagem e classificação de texto livre\",en:\"Image reading and free-text classification\",zh:\"图像识别与自由文本分类\"},{pt:\"Abertura de ticket no CRM externo\",en:\"Ticket creation in the external CRM\",zh:\"在外部 CRM 中创建工单\"}], oldModel:{pt:\"Todo contato cai na fila humana, até os triviais. A fila cresce e o custo por contato dispara.\",en:\"Every contact hits the human queue, even trivial ones. The queue grows and cost-per-contact soars.\",zh:\"所有联系都进入人工队列，连琐事也是。队列膨胀，单次联系成本飙升。\"}, withData2:{pt:\"A AI resolve o repetitivo na hora e só encaminha o que precisa de gente — menos fila, menos custo, 24/7.\",en:\"AI resolves the repetitive instantly and only routes what needs a human — less queue, less cost, 24/7.\",zh:\"AI 即时解决重复问题，只转交需人工的部分 —— 更短队列、更低成本、7×24。\"}, kpis:[{num:\"−50%\",cap:{pt:\"tempo de resolução\",en:\"resolution time\",zh:\"解决时间\"}}]},\n    {motif:\"m2\", label:{pt:\"Transbordo\",en:\"Handoff\",zh:\"转接\"}, title:{pt:\"Transbordo bot → humano\",en:\"Bot → human handoff\",zh:\"机器人 → 人工转接\"}, desc:{pt:\"Quando o humano precisa entrar, entra com todo o histórico e o contexto na mão. Zero 'reconte tudo de novo'.\",en:\"When a human is needed, they step in with the full history and context in hand. Zero 'tell me everything again'.\",zh:\"当需要人工时，坐席携带完整历史与上下文接手。无需'重新说一遍'。\"}, points:[{pt:\"Handoff com histórico e contexto completos\",en:\"Handoff with full history and context\",zh:\"携带完整历史与上下文的转接\"},{pt:\"Transferência entre filas e times\",en:\"Transfer across queues and teams\",zh:\"跨队列与团队转接\"},{pt:\"Detecção de inatividade e abandono\",en:\"Inactivity and abandonment detection\",zh:\"闲置与弃单检测\"},{pt:\"Respostas prontas + atalhos do atendente\",en:\"Canned replies + agent shortcuts\",zh:\"预设回复 + 坐席快捷方式\"}], oldModel:{pt:\"A passagem pro humano perde o contexto. 'Me conta tudo de novo' vira regra e a satisfação despenca.\",en:\"The handoff loses context. 'Tell me everything again' becomes the rule and satisfaction drops.\",zh:\"转人工时丢失上下文。'请再说一遍'成常态，满意度骤降。\"}, withData2:{pt:\"O atendente entra com histórico e contexto completos. Transição invisível pro cliente.\",en:\"The agent steps in with full history and context. An invisible transition for the customer.\",zh:\"坐席携带完整历史与上下文接手。对客户而言，转接无感。\"}, kpis:[{num:\"100%\",cap:{pt:\"do contexto preservado\",en:\"context preserved\",zh:\"上下文保留\"}}]},\n    {motif:\"m3\", label:{pt:\"Console\",en:\"Console\",zh:\"控制台\"}, title:{pt:\"Console de agente + supervisor\",en:\"Agent workspace + supervisor console\",zh:\"坐席工作台 + 主管控制台\"}, desc:{pt:\"Fila, transferências, status dos agentes e supervisão ao vivo — tudo num painel só, sobre o dado real da operação.\",en:\"Queue, transfers, agent status and live supervision — all in one console, over the operation's real data.\",zh:\"队列、转接、坐席状态与实时督导 —— 全部集于一个控制台，基于运营真实数据。\"}, points:[{pt:\"Workspace do agente: status, presets, chatrooms\",en:\"Agent workspace: status, presets, chatrooms\",zh:\"坐席工作台：状态、预设、聊天室\"},{pt:\"Console do supervisor: fila e métricas ao vivo\",en:\"Supervisor console: live queue and metrics\",zh:\"主管控制台：实时队列与指标\"},{pt:\"Classificação de transferências\",en:\"Transfer classification\",zh:\"转接分类\"},{pt:\"Fechamentos mensais e sync de metadados\",en:\"Monthly closings and metadata sync\",zh:\"月度结算与元数据同步\"}], oldModel:{pt:\"Supervisão por planilha e telas espalhadas. Ninguém enxerga a operação ao vivo; decisão no achismo.\",en:\"Supervision by spreadsheet and scattered screens. No one sees the live operation; decisions by guesswork.\",zh:\"靠表格与零散界面督导。无人实时掌控，决策靠猜。\"}, withData2:{pt:\"Uma tela com fila, status, transferências e métricas ao vivo — decisão sobre o dado real.\",en:\"One screen with live queue, status, transfers and metrics — decisions on real data.\",zh:\"一屏掌握实时队列、状态、转接与指标 —— 基于真实数据决策。\"}, kpis:[{num:\"1\",cap:{pt:\"tela para toda a operação\",en:\"screen for the whole operation\",zh:\"一屏掌控全局\"}}]},\n    {motif:\"m4\", label:{pt:\"Filas & CSAT\",en:\"Queues & CSAT\",zh:\"队列与 CSAT\"}, title:{pt:\"Automação de filas & CSAT\",en:\"Queue automation & CSAT\",zh:\"队列自动化与满意度（CSAT）\"}, desc:{pt:\"Filas que se auto-gerenciam: detecção de abandono, repriorização e pesquisa de satisfação disparada na hora certa.\",en:\"Self-managing queues: abandonment detection, re-prioritization and CSAT surveys fired at the right moment.\",zh:\"自我管理的队列：弃单检测、重新优先级排序，并在恰当时机发起满意度调查。\"}, points:[{pt:\"Agendadores (Rush) mantêm a fila saudável\",en:\"Schedulers (Rush) keep the queue healthy\",zh:\"调度器（Rush）维持队列健康\"},{pt:\"Detecção de abandono + auto-cura da fila\",en:\"Abandonment detection + queue self-healing\",zh:\"弃单检测 + 队列自愈\"},{pt:\"CSAT disparado no momento certo\",en:\"CSAT fired at the right moment\",zh:\"在恰当时机发起 CSAT\"},{pt:\"Analytics de custo por caso de uso + export\",en:\"Cost analytics by use-case + export\",zh:\"按用例的成本分析 + 导出\"}], oldModel:{pt:\"Filas travadas por transferências esquecidas e abandono não detectado. Satisfação medida tarde ou nunca.\",en:\"Queues stuck by forgotten transfers and undetected abandonment. Satisfaction measured late, or never.\",zh:\"队列被遗忘的转接与未检测的弃单拖垮。满意度测得太晚，甚至从不测。\"}, withData2:{pt:\"Rush mantém a fila saudável sozinho e dispara o CSAT na hora certa — melhoria contínua com dado.\",en:\"Rush keeps the queue healthy on its own and fires CSAT at the right time — continuous improvement, data-driven.\",zh:\"Rush 自动维持队列健康，并在恰当时机发起 CSAT —— 数据驱动的持续改进。\"}, kpis:[{num:\"85%\",cap:{pt:\"retenção\",en:\"retention\",zh:\"留存率\"}},{num:\"+26\",cap:{pt:\"NPS\",en:\"NPS\",zh:\"NPS\"}}]}\n  ]},\n  {hue:\"#ff4d9e\", name:{pt:\"Varejo & E-commerce\",en:\"Retail & E-commerce\",zh:\"零售与电商\"}, tagline:{pt:\"Da vitrine ao ERP: experiências de compra sob medida, com os dados reais do seu e-commerce. Cada peça, um módulo Data².\",en:\"From storefront to ERP: tailor-made buying experiences, with your e-commerce's real data. Each piece, a Data² module.\",zh:\"从门店到 ERP：量身定制的购物体验，用你电商的真实数据驱动。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m6\", label:{pt:\"Catálogo\",en:\"Catalog\",zh:\"目录\"}, title:{pt:\"Experiências de catálogo e produto\",en:\"Catalog & product experiences\",zh:\"目录与商品体验\"}, desc:{pt:\"Vitrines, páginas de produto e coleções montadas pela área — com o catálogo real, sempre sincronizado.\",en:\"Storefronts, product pages and collections built by the team — with the real catalog, always in sync.\",zh:\"由业务团队搭建的门店、商品页与专题 —— 使用真实目录，始终同步。\"}, points:[{pt:\"Páginas de produto sobre catálogo real\",en:\"Product pages over the real catalog\",zh:\"基于真实目录的商品页\"},{pt:\"Coleções e curadoria pela área\",en:\"Collections and curation by the team\",zh:\"由团队策划专题与选品\"},{pt:\"Busca e filtros configuráveis\",en:\"Configurable search and filters\",zh:\"可配置搜索与筛选\"},{pt:\"Publicação sem depender de TI\",en:\"Publish without depending on IT\",zh:\"发布无需依赖 IT\"}], oldModel:{pt:\"Cada campanha depende da fila de TI; a vitrine nunca acompanha o momento.\",en:\"Every campaign waits in the IT queue; the storefront never keeps up with the moment.\",zh:\"每次活动都要排 IT 队列；门店永远跟不上节奏。\"}, withData2:{pt:\"A área publica a vitrine que quiser, na hora, com o dado real.\",en:\"The team publishes any storefront it wants, instantly, with real data.\",zh:\"团队即时发布想要的门店，用真实数据。\"}, kpis:[{num:\"live\",cap:{pt:\"catálogo sincronizado\",en:\"catalog in sync\",zh:\"目录实时同步\"}}]},\n    {motif:\"m1\", label:{pt:\"VTEX / GraphQL\",en:\"VTEX / GraphQL\",zh:\"VTEX / GraphQL\"}, title:{pt:\"Integração VTEX / GraphQL\",en:\"VTEX / GraphQL integration\",zh:\"VTEX / GraphQL 集成\"}, desc:{pt:\"Conexão direta com a plataforma de e-commerce — produtos, preços e estoque ao vivo via GraphQL.\",en:\"Direct connection to the e-commerce platform — live products, prices and stock via GraphQL.\",zh:\"与电商平台直连 —— 通过 GraphQL 获取实时商品、价格与库存。\"}, points:[{pt:\"Cliente HTTP para VTEX / GraphQL\",en:\"HTTP client for VTEX / GraphQL\",zh:\"面向 VTEX / GraphQL 的 HTTP 客户端\"},{pt:\"Produtos, preços e estoque ao vivo\",en:\"Live products, prices and stock\",zh:\"实时商品、价格与库存\"},{pt:\"Parametrização de queries por variável\",en:\"Query parametrization by variable\",zh:\"按变量参数化查询\"},{pt:\"Cache e resiliência a falhas\",en:\"Caching and failure resilience\",zh:\"缓存与容错\"}], oldModel:{pt:\"Dados de produto colados à mão ou defasados — preço errado, venda perdida.\",en:\"Product data pasted by hand or stale — wrong price, lost sale.\",zh:\"商品数据靠手工粘贴或已过期 —— 价格出错、错失销售。\"}, withData2:{pt:\"Tudo ao vivo, direto da fonte — preço e estoque sempre certos.\",en:\"Everything live, straight from the source — price and stock always right.\",zh:\"一切实时、直取源头 —— 价格与库存始终准确。\"}, kpis:[{num:\"real-time\",cap:{pt:\"preço & estoque\",en:\"price & stock\",zh:\"价格与库存\"}}]},\n    {motif:\"m5\", label:{pt:\"Estúdio de foto\",en:\"Photo studio\",zh:\"影像工作室\"}, title:{pt:\"Estúdio de foto com AI\",en:\"AI photo studio\",zh:\"AI 影像工作室\"}, desc:{pt:\"Gere fotos de produto e cenas com AI — try-on, ângulos e catálogo, sem estúdio físico.\",en:\"Generate product photos and scenes with AI — try-on, angles and catalog, no physical studio.\",zh:\"用 AI 生成商品照片与场景 —— 试穿、角度与目录，无需实体影棚。\"}, points:[{pt:\"Geração de imagem por AI (multimodal)\",en:\"Image generation via AI (multimodal)\",zh:\"多模态 AI 图像生成\"},{pt:\"Try-on e cenas configuráveis\",en:\"Try-on and configurable scenes\",zh:\"试穿与可配置场景\"},{pt:\"Múltiplos ângulos a partir de uma foto\",en:\"Multiple angles from one photo\",zh:\"由一张照片生成多角度\"},{pt:\"Storage e distribuição de mídia (MEDIA)\",en:\"Media storage and distribution (MEDIA)\",zh:\"媒体存储与分发（MEDIA）\"}], oldModel:{pt:\"Cada foto exige estúdio, modelo e dias de produção — caro e lento.\",en:\"Every photo needs a studio, a model and days of production — costly and slow.\",zh:\"每张照片都需影棚、模特与数天制作 —— 昂贵又缓慢。\"}, withData2:{pt:\"Fotos de qualidade em minutos, a um custo marginal.\",en:\"Quality photos in minutes, at a marginal cost.\",zh:\"几分钟出高质量照片，成本极低。\"}, kpis:[{num:\"−90%\",cap:{pt:\"custo de produção\",en:\"production cost\",zh:\"制作成本\"}}]},\n    {motif:\"m3\", label:{pt:\"ERP & loja\",en:\"ERP & store\",zh:\"ERP 与门店\"}, title:{pt:\"ERP e operações de loja\",en:\"ERP & store operations\",zh:\"ERP 与门店运营\"}, desc:{pt:\"Estoque, pedidos, recebimento e produção — o ERP da operação de loja, feito sob medida.\",en:\"Stock, orders, receiving and production — the store operation's ERP, tailor-made.\",zh:\"库存、订单、收货与生产 —— 量身定制的门店运营 ERP。\"}, points:[{pt:\"Estoque e movimentações por local\",en:\"Stock and movements per location\",zh:\"按地点的库存与出入库\"},{pt:\"Pedidos de compra e recebimento\",en:\"Purchase orders and receiving\",zh:\"采购订单与收货\"},{pt:\"Ordens de produção e BOM\",en:\"Production orders and BOM\",zh:\"生产订单与 BOM\"},{pt:\"Fluxos e status configuráveis\",en:\"Configurable flows and statuses\",zh:\"可配置流程与状态\"}], oldModel:{pt:\"ERP genérico que não encaixa na operação — gambiarra em planilha por fora.\",en:\"A generic ERP that doesn't fit the operation — spreadsheet workarounds on the side.\",zh:\"通用 ERP 无法贴合运营 —— 只能在表格里打补丁。\"}, withData2:{pt:\"Um ERP que encaixa exatamente na sua operação — e evolui com ela.\",en:\"An ERP that fits your operation exactly — and evolves with it.\",zh:\"完全贴合你运营的 ERP —— 并随之进化。\"}, kpis:[{num:\"1\",cap:{pt:\"sistema da vitrine ao estoque\",en:\"system from storefront to stock\",zh:\"从门店到库存一体\"}}]}\n  ]},\n  {hue:\"#9b5cff\", name:{pt:\"Força de Vendas\",en:\"Sales Enablement\",zh:\"销售赋能\"}, tagline:{pt:\"Um copiloto de vendas que diz a cada vendedor a próxima melhor ação — em linguagem natural. Cada peça, um módulo Data².\",en:\"A sales copilot that tells each rep the next best action — in natural language. Each piece, a Data² module.\",zh:\"一个销售副驾，用自然语言告诉每位销售下一步的最佳行动。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m1\", label:{pt:\"Copiloto\",en:\"Copilot\",zh:\"副驾\"}, title:{pt:\"Copiloto de vendas em linguagem natural\",en:\"Sales copilot in natural language\",zh:\"自然语言销售副驾\"}, desc:{pt:\"O vendedor pergunta em português e o copiloto responde sobre carteira, clientes e metas — sobre o dado real.\",en:\"The rep asks in plain language and the copilot answers about portfolio, customers and targets — over real data.\",zh:\"销售用自然语言提问，副驾基于真实数据回答客户组合、客户与目标相关问题。\"}, points:[{pt:\"Chat sobre dado vivo da carteira\",en:\"Chat over the portfolio's live data\",zh:\"基于客户组合实时数据的聊天\"},{pt:\"Respostas com números e fontes\",en:\"Answers with numbers and sources\",zh:\"答案带数字与来源\"},{pt:\"Entende perguntas de negócio\",en:\"Understands business questions\",zh:\"理解业务问题\"},{pt:\"No celular, em campo\",en:\"On mobile, in the field\",zh:\"手机端、可在一线使用\"}], oldModel:{pt:\"O vendedor não acha o dado; ou espera BI, ou decide no escuro.\",en:\"The rep can't find the data; either waits for BI, or decides in the dark.\",zh:\"销售找不到数据；要么等 BI，要么摸黑决策。\"}, withData2:{pt:\"Pergunta e recebe na hora, em campo — decisão com base em dado.\",en:\"Ask and get it instantly, in the field — decisions based on data.\",zh:\"在一线即时提问即时得到答案 —— 基于数据决策。\"}, kpis:[{num:\"NL\",cap:{pt:\"pergunta em linguagem natural\",en:\"ask in natural language\",zh:\"自然语言提问\"}}]},\n    {motif:\"m6\", label:{pt:\"Próxima ação\",en:\"Next action\",zh:\"下一步\"}, title:{pt:\"Recomendação de próxima melhor ação\",en:\"Next-best-action recommendation\",zh:\"下一最佳行动推荐\"}, desc:{pt:\"O sistema aponta, por cliente, a próxima ação de maior retorno — quem visitar, o que oferecer, quando.\",en:\"The system points out, per customer, the next highest-return action — who to visit, what to offer, when.\",zh:\"系统针对每位客户指出回报最高的下一步行动 —— 拜访谁、推什么、何时。\"}, points:[{pt:\"Recomendação por cliente e momento\",en:\"Recommendation by customer and timing\",zh:\"按客户与时机推荐\"},{pt:\"Priorização por retorno esperado\",en:\"Prioritization by expected return\",zh:\"按预期回报排序\"},{pt:\"Regras e modelos configuráveis\",en:\"Configurable rules and models\",zh:\"可配置规则与模型\"},{pt:\"Ação a um clique do copiloto\",en:\"Action one click from the copilot\",zh:\"从副驾一键行动\"}], oldModel:{pt:\"Todo cliente tratado igual; o vendedor gasta tempo onde não rende.\",en:\"Every customer treated the same; the rep spends time where it doesn't pay.\",zh:\"所有客户一视同仁；销售把时间花在不出成果的地方。\"}, withData2:{pt:\"Cada visita mira o cliente e a oferta de maior retorno.\",en:\"Every visit targets the customer and offer with the highest return.\",zh:\"每次拜访都瞄准回报最高的客户与方案。\"}, kpis:[{num:\"+20%\",cap:{pt:\"conversão\",en:\"conversion\",zh:\"转化率\"}}]},\n    {motif:\"m2\", label:{pt:\"Busca com AI\",en:\"AI search\",zh:\"AI 搜索\"}, title:{pt:\"Busca de clientes e segmentos com AI\",en:\"AI search over customers & segments\",zh:\"面向客户与细分的 AI 搜索\"}, desc:{pt:\"'Me mostre clientes que compraram X e sumiram' — a AI monta o segmento na hora, sem SQL.\",en:\"'Show me customers who bought X and vanished' — AI builds the segment instantly, no SQL.\",zh:\"'找出买过 X 后消失的客户' —— AI 即时生成细分，无需 SQL。\"}, points:[{pt:\"Segmentação por linguagem natural\",en:\"Segmentation by natural language\",zh:\"自然语言细分\"},{pt:\"Busca semântica sobre a base\",en:\"Semantic search over the base\",zh:\"对客户库的语义搜索\"},{pt:\"Salva e reusa segmentos\",en:\"Save and reuse segments\",zh:\"保存并复用细分\"},{pt:\"Aciona ondas de contato a partir do segmento\",en:\"Trigger contact waves from a segment\",zh:\"从细分触发联系波次\"}], oldModel:{pt:\"Segmentar exige o time de dados e um SQL — dias para uma lista.\",en:\"Segmenting needs the data team and SQL — days for a list.\",zh:\"细分需要数据团队与 SQL —— 一张名单要等数天。\"}, withData2:{pt:\"A força monta o segmento em segundos, com uma frase.\",en:\"The field builds the segment in seconds, with one sentence.\",zh:\"一线用一句话数秒生成细分。\"}, kpis:[{num:\"0\",cap:{pt:\"SQL necessário\",en:\"SQL required\",zh:\"无需 SQL\"}}]},\n    {motif:\"m4\", label:{pt:\"Performance\",en:\"Performance\",zh:\"业绩\"}, title:{pt:\"Painéis de performance da carteira\",en:\"Portfolio performance dashboards\",zh:\"客户组合业绩仪表盘\"}, desc:{pt:\"Metas, ranking e evolução da carteira ao vivo — para o vendedor e para o gestor, na mesma fonte.\",en:\"Targets, ranking and portfolio evolution live — for the rep and the manager, from the same source.\",zh:\"目标、排名与客户组合演变实时呈现 —— 销售与管理者共用同一数据源。\"}, points:[{pt:\"Metas e realizado por vendedor\",en:\"Target vs actual per rep\",zh:\"每位销售目标 vs 实际\"},{pt:\"Ranking e evolução no tempo\",en:\"Ranking and evolution over time\",zh:\"排名与时间演变\"},{pt:\"Drill-down por cliente e produto\",en:\"Drill-down by customer and product\",zh:\"按客户与商品下钻\"},{pt:\"Mesmo dado para campo e gestão\",en:\"Same data for field and management\",zh:\"一线与管理同源数据\"}], oldModel:{pt:\"Cada um com sua planilha; gestor e vendedor discutem número, não cliente.\",en:\"Everyone with their own spreadsheet; manager and rep argue over numbers, not customers.\",zh:\"各持一张表格；管理者与销售争论数字，而非客户。\"}, withData2:{pt:\"Uma fonte só, ao vivo — a conversa vira sobre o cliente.\",en:\"One live source — the conversation shifts to the customer.\",zh:\"唯一实时数据源 —— 对话回归客户本身。\"}, kpis:[{num:\"1\",cap:{pt:\"fonte de verdade\",en:\"source of truth\",zh:\"唯一真相源\"}}]},\n    {motif:\"m5\", label:{pt:\"Conteúdo com AI\",en:\"AI content\",zh:\"AI 内容\"}, title:{pt:\"Geração de conteúdo e imagem com AI\",en:\"AI content & image generation\",zh:\"AI 内容与图像生成\"}, desc:{pt:\"O vendedor gera o material de vendas — texto e imagem — no tom da marca, na hora do contato.\",en:\"The rep generates sales material — text and image — in the brand's tone, at the moment of contact.\",zh:\"销售即时生成销售素材 —— 文本与图像 —— 契合品牌语气。\"}, points:[{pt:\"Geração de texto e imagem por AI\",en:\"AI text and image generation\",zh:\"AI 文本与图像生成\"},{pt:\"No tom e na identidade da marca\",en:\"In the brand's tone and identity\",zh:\"契合品牌语气与识别\"},{pt:\"Personalizado por cliente\",en:\"Personalized per customer\",zh:\"按客户个性化\"},{pt:\"Pronto para enviar em qualquer canal\",en:\"Ready to send on any channel\",zh:\"随时可在任一渠道发送\"}], oldModel:{pt:\"Material genérico do marketing, desatualizado — o vendedor improvisa.\",en:\"Generic, outdated marketing material — the rep improvises.\",zh:\"市场部的通用素材已过时 —— 销售只能临场发挥。\"}, withData2:{pt:\"Conteúdo sob medida na hora, sempre na marca.\",en:\"Tailored content on the spot, always on brand.\",zh:\"即时定制内容，始终契合品牌。\"}, kpis:[{num:\"1\",cap:{pt:\"clique para o material\",en:\"click to material\",zh:\"一键出素材\"}}]}\n  ]},\n  {hue:\"#84e05a\", name:{pt:\"BI & Analytics\",en:\"BI & Analytics\",zh:\"商业智能与分析\"}, tagline:{pt:\"Do dado vivo ao plano de ação — painéis que a área lê e age, sem exportar pra planilha. Cada peça, um módulo Data².\",en:\"From live data to an action plan — dashboards the team reads and acts on, no spreadsheet export. Each piece, a Data² module.\",zh:\"从实时数据到行动计划 —— 业务团队看得懂、能行动的仪表盘，无需导出表格。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m4\", label:{pt:\"Painéis\",en:\"Dashboards\",zh:\"仪表盘\"}, title:{pt:\"Painéis executivos sobre dado vivo\",en:\"Executive dashboards on live data\",zh:\"基于实时数据的高管仪表盘\"}, desc:{pt:\"KPIs, tendências e drill-down sobre o dado vivo da operação — não um print de ontem.\",en:\"KPIs, trends and drill-down over the operation's live data — not a screenshot from yesterday.\",zh:\"基于运营实时数据的 KPI、趋势与下钻 —— 而非昨天的截图。\"}, points:[{pt:\"KPIs e tendências ao vivo\",en:\"Live KPIs and trends\",zh:\"实时 KPI 与趋势\"},{pt:\"Drill-down por dimensão\",en:\"Drill-down by dimension\",zh:\"按维度下钻\"},{pt:\"Painéis por perfil de usuário\",en:\"Dashboards by user profile\",zh:\"按用户画像定制仪表盘\"},{pt:\"Renderização no servidor (SSR), rápida\",en:\"Server-side rendering (SSR), fast\",zh:\"服务端渲染（SSR），快速\"}], oldModel:{pt:\"Relatório em PDF que nasce velho; decisão sobre foto do passado.\",en:\"A PDF report born stale; decisions on a photo of the past.\",zh:\"生来就过时的 PDF 报表；对着过去的快照做决策。\"}, withData2:{pt:\"Painel vivo, sempre atual — decisão sobre o agora.\",en:\"A live panel, always current — decisions on the now.\",zh:\"实时面板、始终最新 —— 对着当下做决策。\"}, kpis:[{num:\"live\",cap:{pt:\"dado sempre atual\",en:\"always-current data\",zh:\"数据始终最新\"}}]},\n    {motif:\"m1\", label:{pt:\"Ingestão\",en:\"Ingestion\",zh:\"数据接入\"}, title:{pt:\"Ingestão diária automatizada\",en:\"Automated daily ingestion\",zh:\"每日自动数据接入\"}, desc:{pt:\"O Rush puxa e consolida os dados todo dia — de Databricks, APIs e planilhas — sem ninguém apertar botão.\",en:\"Rush pulls and consolidates the data every day — from Databricks, APIs and spreadsheets — with no one pressing a button.\",zh:\"Rush 每天自动拉取并整合数据 —— 来自 Databricks、API 与表格 —— 无需任何人点按钮。\"}, points:[{pt:\"Agendadores (Rush) diários\",en:\"Daily schedulers (Rush)\",zh:\"每日调度器（Rush）\"},{pt:\"Fontes: Databricks, APIs, planilhas\",en:\"Sources: Databricks, APIs, spreadsheets\",zh:\"数据源：Databricks、API、表格\"},{pt:\"Consolidação e limpeza automática\",en:\"Automatic consolidation and cleanup\",zh:\"自动整合与清洗\"},{pt:\"Logs e reprocessamento de falhas\",en:\"Logs and failure reprocessing\",zh:\"日志与失败重跑\"}], oldModel:{pt:\"Alguém baixa, junta e corrige planilhas toda manhã — e às vezes esquece.\",en:\"Someone downloads, merges and fixes spreadsheets every morning — and sometimes forgets.\",zh:\"每天早上有人下载、合并并修正表格 —— 有时还会忘。\"}, withData2:{pt:\"Os dados chegam prontos todo dia, sozinhos.\",en:\"The data arrives ready every day, on its own.\",zh:\"数据每天自动就绪。\"}, kpis:[{num:\"0\",cap:{pt:\"trabalho manual diário\",en:\"daily manual work\",zh:\"每日手工\"}}]},\n    {motif:\"m3\", label:{pt:\"Metas & plano\",en:\"Targets & plan\",zh:\"目标与计划\"}, title:{pt:\"Metas e plano de ação acompanhados\",en:\"Targets & action plan tracked\",zh:\"目标与行动计划全程追踪\"}, desc:{pt:\"Metas por área e um plano de ação vivo — cada iniciativa com dono, prazo e status, sobre o mesmo dado.\",en:\"Targets per area and a live action plan — each initiative with owner, deadline and status, over the same data.\",zh:\"按部门设定目标 + 实时行动计划 —— 每项举措都有负责人、期限与状态，同源数据。\"}, points:[{pt:\"Metas por área e período\",en:\"Targets by area and period\",zh:\"按部门与周期设目标\"},{pt:\"Plano de ação com dono e prazo\",en:\"Action plan with owner and deadline\",zh:\"含负责人与期限的行动计划\"},{pt:\"Status e progresso ao vivo\",en:\"Live status and progress\",zh:\"实时状态与进度\"},{pt:\"Ligação direta metas ↔ dado\",en:\"Direct link targets ↔ data\",zh:\"目标与数据直接挂钩\"}], oldModel:{pt:\"Metas numa apresentação e plano num e-mail — ninguém acompanha até o fim do tri.\",en:\"Targets in a slide and plan in an email — no one tracks until quarter-end.\",zh:\"目标在幻灯片、计划在邮件 —— 无人跟进，直到季度末。\"}, withData2:{pt:\"Meta, plano e dado num lugar só — acompanhamento contínuo.\",en:\"Target, plan and data in one place — continuous tracking.\",zh:\"目标、计划与数据合一 —— 持续跟进。\"}, kpis:[{num:\"1\",cap:{pt:\"lugar para meta e ação\",en:\"place for target and action\",zh:\"目标与行动一处\"}}]},\n    {motif:\"m8\", label:{pt:\"Alertas\",en:\"Alerts\",zh:\"告警\"}, title:{pt:\"Alertas e monitoramento\",en:\"Alerts & monitoring\",zh:\"告警与监控\"}, desc:{pt:\"Regras que vigiam o dado e avisam na hora — por WhatsApp, e-mail ou no painel — quando algo sai do trilho.\",en:\"Rules that watch the data and warn instantly — via WhatsApp, email or in the panel — when something goes off track.\",zh:\"规则守护数据并即时预警 —— 通过 WhatsApp、邮件或面板 —— 一旦偏离轨道即刻通知。\"}, points:[{pt:\"Regras de alerta por limite/variação\",en:\"Alert rules by threshold/variation\",zh:\"按阈值/波动的告警规则\"},{pt:\"Notificação em WhatsApp, e-mail, painel\",en:\"Notification via WhatsApp, email, panel\",zh:\"WhatsApp、邮件、面板通知\"},{pt:\"Detecção de anomalia\",en:\"Anomaly detection\",zh:\"异常检测\"},{pt:\"Histórico e reconhecimento de alertas\",en:\"Alert history and acknowledgment\",zh:\"告警历史与确认\"}], oldModel:{pt:\"O problema só aparece no relatório do mês seguinte — tarde demais.\",en:\"The problem only shows up in next month's report — too late.\",zh:\"问题直到下月报表才浮现 —— 为时已晚。\"}, withData2:{pt:\"O sistema avisa na hora — a área age antes de virar prejuízo.\",en:\"The system warns instantly — the team acts before it becomes a loss.\",zh:\"系统即时预警 —— 团队在其造成损失前行动。\"}, kpis:[{num:\"real-time\",cap:{pt:\"alerta na hora\",en:\"instant alert\",zh:\"即时告警\"}}]}\n  ]},\n  {hue:\"#ff6a4d\", name:{pt:\"Seguros & CX\",en:\"Insurance & CX\",zh:\"保险与客户体验\"}, tagline:{pt:\"Atendimento que responde na fonte certa — base de conhecimento com busca semântica e triagem por AI. Cada peça, um módulo Data².\",en:\"Support that answers from the right source — a semantic knowledge base with AI triage. Each piece, a Data² module.\",zh:\"从正确来源作答的客服 —— 配备语义知识库与 AI 分流。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m2\", label:{pt:\"Base semântica\",en:\"Semantic KB\",zh:\"语义知识库\"}, title:{pt:\"Base de conhecimento com busca semântica\",en:\"Semantic-search knowledge base\",zh:\"语义搜索知识库\"}, desc:{pt:\"Apólices, cláusulas e FAQs indexadas por significado — encontra a resposta certa mesmo sem a palavra exata.\",en:\"Policies, clauses and FAQs indexed by meaning — finds the right answer even without the exact word.\",zh:\"保单、条款与 FAQ 按语义索引 —— 即使措辞不同也能找到正确答案。\"}, points:[{pt:\"Indexação por embeddings (semantic search)\",en:\"Embedding indexing (semantic search)\",zh:\"向量索引（语义搜索）\"},{pt:\"Busca por significado, não palavra-chave\",en:\"Search by meaning, not keyword\",zh:\"按语义而非关键词搜索\"},{pt:\"Fontes versionadas e atualizáveis\",en:\"Versioned, updatable sources\",zh:\"可版本化、可更新的来源\"},{pt:\"Cobertura multilíngue\",en:\"Multilingual coverage\",zh:\"多语言覆盖\"}], oldModel:{pt:\"O atendente caça em PDFs e intranet — resposta lenta e às vezes errada.\",en:\"The agent hunts through PDFs and the intranet — slow answers, sometimes wrong.\",zh:\"坐席在 PDF 与内网里翻找 —— 回答缓慢，有时出错。\"}, withData2:{pt:\"A resposta certa aparece na hora, ancorada na fonte oficial.\",en:\"The right answer appears instantly, grounded in the official source.\",zh:\"正确答案即时呈现，源自官方来源。\"}, kpis:[{num:\"semantic\",cap:{pt:\"busca por significado\",en:\"search by meaning\",zh:\"按语义搜索\"}}]},\n    {motif:\"m1\", label:{pt:\"Triagem\",en:\"Triage\",zh:\"分流\"}, title:{pt:\"Triagem e atendimento com AI\",en:\"AI triage & support\",zh:\"AI 分流与客服\"}, desc:{pt:\"A AI entende o pedido — sinistro, dúvida, 2ª via — resolve o simples e encaminha o resto com contexto.\",en:\"AI understands the request — claim, question, reissue — resolves the simple and routes the rest with context.\",zh:\"AI 理解诉求 —— 理赔、咨询、补发 —— 解决简单问题，其余带上下文分流。\"}, points:[{pt:\"Detecção de intenção e caso de uso\",en:\"Intent and use-case detection\",zh:\"意图与用例识别\"},{pt:\"Resolução automática do simples\",en:\"Automatic resolution of the simple\",zh:\"简单诉求自动解决\"},{pt:\"Roteamento com contexto para o humano\",en:\"Context-rich routing to a human\",zh:\"带上下文转人工\"},{pt:\"Leitura de documentos do segurado\",en:\"Reading the insured's documents\",zh:\"识别投保人文档\"}], oldModel:{pt:\"Todo pedido vira fila humana; o segurado espera por qualquer coisa.\",en:\"Every request becomes a human queue; the insured waits for anything.\",zh:\"所有诉求都进人工队列；投保人事事都要等。\"}, withData2:{pt:\"A AI resolve na hora o que dá e prioriza o que precisa de gente.\",en:\"AI instantly resolves what it can and prioritizes what needs a human.\",zh:\"AI 能解决的即时解决，需人工的优先处理。\"}, kpis:[{num:\"−50%\",cap:{pt:\"tempo de resposta\",en:\"response time\",zh:\"响应时间\"}}]},\n    {motif:\"m3\", label:{pt:\"Ancorada na fonte\",en:\"Grounded\",zh:\"源自原文\"}, title:{pt:\"Respostas ancoradas na fonte\",en:\"Answers grounded in the source\",zh:\"答案有据可依，源自原文\"}, desc:{pt:\"Toda resposta cita a cláusula ou o documento de origem — nada de 'a AI inventou'.\",en:\"Every answer cites the source clause or document — no 'the AI made it up'.\",zh:\"每个答案都引用来源条款或文档 —— 杜绝'AI 编造'。\"}, points:[{pt:\"Citação da fonte em cada resposta\",en:\"Source citation in every answer\",zh:\"每个答案标注来源\"},{pt:\"Rastreabilidade cláusula → resposta\",en:\"Traceability clause → answer\",zh:\"条款→答案可追溯\"},{pt:\"Redução de alucinação (grounding)\",en:\"Hallucination reduction (grounding)\",zh:\"降低幻觉（grounding）\"},{pt:\"Conformidade e auditoria\",en:\"Compliance and audit\",zh:\"合规与审计\"}], oldModel:{pt:\"Resposta sem lastro vira risco jurídico e retrabalho.\",en:\"An unsupported answer becomes legal risk and rework.\",zh:\"无依据的回答带来法律风险与返工。\"}, withData2:{pt:\"Cada resposta é rastreável à fonte — confiável e auditável.\",en:\"Every answer is traceable to the source — trustworthy and auditable.\",zh:\"每个答案都可追溯到来源 —— 可信、可审计。\"}, kpis:[{num:\"100%\",cap:{pt:\"respostas com fonte\",en:\"answers with a source\",zh:\"答案均有来源\"}}]},\n    {motif:\"m7\", label:{pt:\"Analytics\",en:\"Analytics\",zh:\"分析\"}, title:{pt:\"Analytics de atendimento\",en:\"Support analytics\",zh:\"客服分析\"}, desc:{pt:\"Volume, temas, resolução e satisfação — para melhorar a base e o atendimento continuamente.\",en:\"Volume, topics, resolution and satisfaction — to continuously improve the base and the service.\",zh:\"工单量、主题、解决率与满意度 —— 持续改进知识库与服务。\"}, points:[{pt:\"Métricas de volume e resolução\",en:\"Volume and resolution metrics\",zh:\"工单量与解决率指标\"},{pt:\"Lacunas na base de conhecimento\",en:\"Knowledge-base gaps\",zh:\"知识库缺口\"},{pt:\"Satisfação (CSAT) por tema\",en:\"Satisfaction (CSAT) by topic\",zh:\"按主题的满意度（CSAT）\"},{pt:\"Alertas de pico e degradação\",en:\"Spike and degradation alerts\",zh:\"峰值与劣化告警\"}], oldModel:{pt:\"Não se sabe o que a base não cobre; os mesmos erros se repetem.\",en:\"No one knows what the base doesn't cover; the same errors repeat.\",zh:\"无人知晓知识库遗漏了什么；同样的错误反复出现。\"}, withData2:{pt:\"Os dados mostram as lacunas — a base melhora sozinha, com curadoria.\",en:\"The data shows the gaps — the base improves with curation.\",zh:\"数据揭示缺口 —— 知识库在策展中持续改善。\"}, kpis:[{num:\"+CSAT\",cap:{pt:\"satisfação medida\",en:\"satisfaction measured\",zh:\"满意度可量\"}}]}\n  ]},\n  {hue:\"#e8e84d\", name:{pt:\"Compras & Procurement\",en:\"Procurement\",zh:\"采购\"}, tagline:{pt:\"Excelência em compras: modelagem financeira e planejamento de fornecimento, simulados em minutos. Cada peça, um módulo Data².\",en:\"Procurement excellence: financial modeling and supply planning, simulated in minutes. Each piece, a Data² module.\",zh:\"采购卓越：财务建模与供应规划，几分钟即可模拟完成。每个环节都是一个 Data² 模块。\"}, comps:[\n    {motif:\"m3\", label:{pt:\"Planejamento\",en:\"Planning\",zh:\"规划\"}, title:{pt:\"Planejamento de fornecimento\",en:\"Supply planning\",zh:\"供应规划\"}, desc:{pt:\"Consolida demanda, contratos e capacidade de fornecedores num plano de fornecimento — sobre o dado real.\",en:\"Consolidates demand, contracts and supplier capacity into a supply plan — over real data.\",zh:\"将需求、合同与供应商产能整合成供应计划 —— 基于真实数据。\"}, points:[{pt:\"Demanda e contratos consolidados\",en:\"Consolidated demand and contracts\",zh:\"整合需求与合同\"},{pt:\"Capacidade e lead time por fornecedor\",en:\"Capacity and lead time per supplier\",zh:\"每供应商产能与交期\"},{pt:\"Plano de fornecimento priorizado\",en:\"Prioritized supply plan\",zh:\"有优先级的供应计划\"},{pt:\"Sobre o dado real (data lake)\",en:\"Over real data (data lake)\",zh:\"基于真实数据（数据湖）\"}], oldModel:{pt:\"Plano em planilha que não fala com contrato nem com estoque real.\",en:\"A spreadsheet plan that talks to neither the contract nor the real stock.\",zh:\"表格里的计划既不对接合同也不对接真实库存。\"}, withData2:{pt:\"Um plano vivo, ligado a contrato, demanda e capacidade.\",en:\"A live plan, linked to contract, demand and capacity.\",zh:\"一份实时计划，联通合同、需求与产能。\"}, kpis:[{num:\"1\",cap:{pt:\"plano sobre dado real\",en:\"plan on real data\",zh:\"基于真实数据的计划\"}}]},\n    {motif:\"m8\", label:{pt:\"Modelagem\",en:\"Modeling\",zh:\"建模\"}, title:{pt:\"Modelagem financeira de cenários\",en:\"Financial scenario modeling\",zh:\"财务情景建模\"}, desc:{pt:\"Modele o impacto financeiro de cada decisão de compra — preço, câmbio, volume — antes de assinar.\",en:\"Model the financial impact of each purchasing decision — price, FX, volume — before signing.\",zh:\"在签约前对每项采购决策的财务影响建模 —— 价格、汇率、数量。\"}, points:[{pt:\"Modelo financeiro por cenário\",en:\"Financial model per scenario\",zh:\"按情景的财务模型\"},{pt:\"Sensibilidade a preço, câmbio e volume\",en:\"Sensitivity to price, FX and volume\",zh:\"对价格、汇率、数量的敏感性\"},{pt:\"Comparação de fornecedores e prazos\",en:\"Comparison of suppliers and terms\",zh:\"供应商与条款对比\"},{pt:\"Números auditáveis\",en:\"Auditable numbers\",zh:\"可审计的数字\"}], oldModel:{pt:\"Modelo financeiro numa planilha frágil que só uma pessoa entende.\",en:\"A financial model in a fragile spreadsheet only one person understands.\",zh:\"脆弱表格里的财务模型，只有一个人看得懂。\"}, withData2:{pt:\"Modelo robusto e auditável — qualquer cenário em minutos.\",en:\"A robust, auditable model — any scenario in minutes.\",zh:\"稳健可审计的模型 —— 任何情景几分钟出结果。\"}, kpis:[{num:\"MM\",cap:{pt:\"economizados por mês\",en:\"saved per month\",zh:\"每月节省\"}}]},\n    {motif:\"m5\", label:{pt:\"Simuladores\",en:\"Simulators\",zh:\"模拟器\"}, title:{pt:\"Simuladores e croquis de decisão\",en:\"Decision simulators & builders\",zh:\"决策模拟器与构建器\"}, desc:{pt:\"A área monta seus próprios simuladores de decisão — sem código — e testa alternativas na hora.\",en:\"The team builds its own decision simulators — no code — and tests alternatives on the spot.\",zh:\"业务团队无代码搭建自己的决策模拟器 —— 即时测试各种方案。\"}, points:[{pt:\"Simuladores montados pela área (no-code)\",en:\"Simulators built by the team (no-code)\",zh:\"由团队搭建的模拟器（无代码）\"},{pt:\"Parâmetros e regras ajustáveis\",en:\"Adjustable parameters and rules\",zh:\"可调参数与规则\"},{pt:\"Resultado visual imediato\",en:\"Immediate visual result\",zh:\"即时可视化结果\"},{pt:\"Compartilháveis com stakeholders\",en:\"Shareable with stakeholders\",zh:\"可与相关方共享\"}], oldModel:{pt:\"Cada análise depende de um especialista e de uma planilha nova.\",en:\"Every analysis depends on a specialist and a new spreadsheet.\",zh:\"每次分析都依赖一位专家与一张新表格。\"}, withData2:{pt:\"A área simula sozinha e decide na hora, com confiança.\",en:\"The team simulates on its own and decides on the spot, with confidence.\",zh:\"团队自主模拟、即时决策，充满信心。\"}, kpis:[{num:\"0\",cap:{pt:\"código para simular\",en:\"code to simulate\",zh:\"模拟无需代码\"}}]},\n    {motif:\"m1\", label:{pt:\"Orientado a dado\",en:\"Data-driven\",zh:\"数据驱动\"}, title:{pt:\"Compras orientadas a dado\",en:\"Data-driven sourcing\",zh:\"数据驱动的采购\"}, desc:{pt:\"Cada decisão de compra apoiada em dado — histórico, mercado e performance de fornecedor.\",en:\"Every purchasing decision backed by data — history, market and supplier performance.\",zh:\"每项采购决策都有数据支撑 —— 历史、市场与供应商表现。\"}, points:[{pt:\"Histórico de compras e preços\",en:\"Purchase and price history\",zh:\"采购与价格历史\"},{pt:\"Performance e risco de fornecedor\",en:\"Supplier performance and risk\",zh:\"供应商表现与风险\"},{pt:\"Recomendação de melhor opção\",en:\"Best-option recommendation\",zh:\"最优选项推荐\"},{pt:\"Trilha de decisão auditável\",en:\"Auditable decision trail\",zh:\"可审计的决策链路\"}], oldModel:{pt:\"Decisão de compra no relacionamento e no achismo — dinheiro na mesa.\",en:\"Purchasing by relationship and gut feel — money left on the table.\",zh:\"凭关系与直觉采购 —— 白白流失利润。\"}, withData2:{pt:\"Decisão com dado — melhor preço, melhor fornecedor, rastreável.\",en:\"Decisions with data — best price, best supplier, traceable.\",zh:\"用数据决策 —— 最优价格、最优供应商、可追溯。\"}, kpis:[{num:\"−%\",cap:{pt:\"custo de aquisição\",en:\"acquisition cost\",zh:\"采购成本\"}}]}\n  ]}\n];\n    var uni = root.querySelector(\"#uni\");\n    var uniScroll = uni ? uni.querySelector(\".uni-scroll\") : null;\n    var uniBody = root.querySelector(\"#uniBody\");\n    var gcards = root.querySelectorAll(\".gcard\");\n    var currentUni = -1;\n    function L(o){ if(!o) return \"\"; return lang===\"zh\" ? (o.zh||o.en||o.pt||\"\") : (o[lang]||o.en||o.pt||\"\"); }\n    var UNI_META = {\n      eyebrow:{pt:\"Universo\",en:\"Universe\",zh:\"宇宙\"},\n      hint:{pt:\"Passe o mouse · clique um componente · role\",en:\"Hover · click a component · scroll\",zh:\"悬停 · 点击组件 · 下滚\"},\n      old:{pt:\"O modelo não digitalizado\",en:\"The non-digitized model\",zh:\"未数字化的模式\"},\n      wd:{pt:\"Com Data²\",en:\"With Data²\",zh:\"有了 Data²\"},\n      moreH:{pt:\"E isso é só o começo. <em>Qualquer coisa</em> pode ser construída.\",en:\"And this is just the start. <em>Anything</em> can be built.\",zh:\"而这只是开始。<em>任何东西</em>都能被构建。\"},\n      moreP:{pt:\"Cada componente aqui é um módulo Data². Precisa de algo que ainda não existe? A gente constrói — no mesmo sistema, com o mesmo dado.\",en:\"Every component here is a Data² module. Need something that doesn't exist yet? We build it — same system, same data.\",zh:\"这里的每个组件都是一个 Data² 模块。需要尚不存在的东西？我们构建它 —— 同一系统，同一数据。\"},\n      demo:{pt:\"Agendar uma demo\",en:\"Book a demo\",zh:\"预约演示\"}\n    };\n    function uniLayout(u){\n      if(u.layout) return u.layout;\n      var n=u.comps.length, pts=[], pad=40, spanX=(820-100)-pad*2;\n      for(var i=0;i<n;i++){ var fx=n>1?i/(n-1):0.5; pts.push([Math.round(pad+fx*spanX), i%2===0?60:210]); }\n      return pts;\n    }\n    function esc(s){ return String(s); }\n    function parseIso(text){\n      var spec={cell:50,hue:\"#4ddfe6\",blocks:[],wires:[]};\n      (text||\"\").split(\"\\n\").forEach(function(ln){\n        ln=ln.trim(); if(!ln||ln.charAt(0)===\"#\") return;\n        if(ln.indexOf(\"hue \")===0){ spec.hue=ln.slice(4).trim(); return; }\n        if(ln.indexOf(\"cell \")===0){ spec.cell=+ln.slice(5)||50; return; }\n        var w=ln.match(/^([\\w-]+)\\s*->\\s*([\\w-]+)(.*)$/);\n        if(w){ var wi={from:w[1],to:w[2],flow:/\\bflow\\b/.test(w[3])}; var du=w[3].match(/dur:([\\d.]+)/); if(du)wi.dur=+du[1]; var wh=w[3].match(/#([0-9a-fA-F]{3,8})/); if(wh)wi.hue=\"#\"+wh[1]; spec.wires.push(wi); return; }\n        var m=ln.match(/^([\\w-]+)\\s+@(-?\\d+),(-?\\d+)(.*)$/);\n        if(m){ var b={id:m[1],at:[+m[2],+m[3]]}; var rest=m[4]||\"\";\n          var hh=rest.match(/\\bh(\\d+)/); b.h=hh?+hh[1]:1;\n          var an=rest.match(/\\b(float|pulse|bob)\\b/); if(an)b.anim=an[1];\n          var lb=rest.match(/\"([^\"]*)\"/); if(lb)b.label=lb[1];\n          var hu=rest.match(/#([0-9a-fA-F]{3,8})/); if(hu)b.hue=\"#\"+hu[1];\n          if(/\\bwin\\b/.test(rest)) b.detail=\"win\";\n          spec.blocks.push(b);\n        }\n      });\n      return spec;\n    }\n    function isoScene(spec){\n      var s=spec.cell||50, hw=s/2, q=s/4, fh=s*0.5;\n      var minX=1e9,maxX=-1e9,minY=1e9,maxY=-1e9, anchors={}, blocks=[];\n      spec.blocks.forEach(function(b,i){\n        var c=b.at[0], r=b.at[1], h=b.h||1;\n        var X=(c-r)*hw, Ybase=(c+r)*q, topY=Ybase-h*fh, hue=b.hue||spec.hue;\n        anchors[b.id!=null?b.id:i]={x:X,y:topY};\n        blocks.push({b:b,X:X,Ybase:Ybase,topY:topY,h:h,hue:hue,i:i});\n        if(X-hw<minX)minX=X-hw; if(X+hw>maxX)maxX=X+hw;\n        if(topY-q<minY)minY=topY-q; if(Ybase+q+22>maxY)maxY=Ybase+q+22;\n      });\n      var out=\"\";\n      (spec.wires||[]).forEach(function(w){\n        var a=anchors[w.from], z=anchors[w.to]; if(!a||!z) return;\n        var d=\"M\"+a.x.toFixed(1)+\",\"+a.y.toFixed(1)+\" L\"+z.x.toFixed(1)+\",\"+z.y.toFixed(1);\n        out+='<path class=\"iso-wire\" d=\"'+d+'\" style=\"--h:'+(w.hue||spec.hue)+'\"></path>';\n        if(w.flow) out+='<circle class=\"iso-flow\" r=\"3.2\" style=\"--h:'+(w.hue||spec.hue)+'\"><animateMotion dur=\"'+(w.dur||2.6)+'s\" repeatCount=\"indefinite\" path=\"'+d+'\"></animateMotion></circle>';\n      });\n      blocks.sort(function(p,q2){return p.Ybase-q2.Ybase});\n      blocks.forEach(function(bl){\n        var X=bl.X,topY=bl.topY,h=bl.h,hue=bl.hue,b=bl.b;\n        var top=[X+\",\"+(topY-q),(X+hw)+\",\"+topY,X+\",\"+(topY+q),(X-hw)+\",\"+topY].join(\" \");\n        var left=[(X-hw)+\",\"+topY,X+\",\"+(topY+q),X+\",\"+(topY+q+h*fh),(X-hw)+\",\"+(topY+h*fh)].join(\" \");\n        var right=[(X+hw)+\",\"+topY,X+\",\"+(topY+q),X+\",\"+(topY+q+h*fh),(X+hw)+\",\"+(topY+h*fh)].join(\" \");\n        var cls=\"iso-blk\"+(b.anim?(\" iso-\"+b.anim):\"\")+(b.dataI!=null?\" comp\":\"\");\n        var di=(b.dataI!=null?' data-i=\"'+b.dataI+'\"':'');\n        var g='<g class=\"'+cls+'\"'+di+' style=\"--h:'+hue+';animation-delay:'+(-bl.i*0.4).toFixed(2)+'s\">';\n        g+='<polygon class=\"fl\" points=\"'+left+'\"></polygon><polygon class=\"fr\" points=\"'+right+'\"></polygon><polygon class=\"ft\" points=\"'+top+'\"></polygon>';\n        for(var k=1;k<h;k++){ var yy=topY+k*fh; g+='<line class=\"seam\" x1=\"'+(X-hw)+'\" y1=\"'+yy+'\" x2=\"'+X+'\" y2=\"'+(yy+q)+'\"></line><line class=\"seam\" x1=\"'+X+'\" y1=\"'+(yy+q)+'\" x2=\"'+(X+hw)+'\" y2=\"'+yy+'\"></line>'; }\n        if(b.detail===\"win\"){ g+='<line class=\"det\" x1=\"'+(X-hw*0.5)+'\" y1=\"'+(topY-q*0.1)+'\" x2=\"'+(X+hw*0.1)+'\" y2=\"'+(topY+q*0.4)+'\"></line><line class=\"det\" x1=\"'+(X-hw*0.15)+'\" y1=\"'+(topY-q*0.4)+'\" x2=\"'+(X+hw*0.5)+'\" y2=\"'+(topY+q*0.1)+'\"></line>'; }\n        g+='</g>';\n        out+=g;\n        if(b.label) out+='<text class=\"iso-lbl\" x=\"'+X.toFixed(1)+'\" y=\"'+(bl.Ybase+q+18).toFixed(1)+'\">'+b.label+'</text>';\n      });\n      var pad=34, vbx=(minX-pad), vby=(minY-pad), vbw=(maxX-minX)+pad*2, vbh=(maxY-minY)+pad*2;\n      if(!isFinite(vbw)||vbw<=0) return '<svg class=\"iso-svg\" viewBox=\"0 0 100 100\"></svg>';\n      return '<svg class=\"iso-svg\" viewBox=\"'+vbx.toFixed(1)+\" \"+vby.toFixed(1)+\" \"+vbw.toFixed(1)+\" \"+vbh.toFixed(1)+'\" preserveAspectRatio=\"xMidYMid meet\">'+out+'</svg>';\n    }\n    function sceneFor(u){\n      if(u.scene) return u.scene;\n      var n=u.comps.length, anims=[\"float\",\"pulse\",\"bob\"], heights=[2,3,1,2,4,2], lines=[\"hue \"+u.hue,\"cell 52\"];\n      for(var i=0;i<n;i++){ var col=i*2, row=(i%2===0)?0:2, h=heights[i%heights.length], anim=anims[i%3], win=(i%2===0)?\" win\":\"\"; lines.push(i+\" @\"+col+\",\"+row+\" h\"+h+\" \"+anim+win); }\n      for(var jj=1;jj<n;jj++){ lines.push((jj-1)+\" -> \"+jj+\" flow\"); }\n      return lines.join(\"\\n\");\n    }\n    function isoMini(u,j){\n      var a=[\"float\",\"pulse\",\"bob\"][j%3], b2=[\"pulse\",\"bob\",\"float\"][j%3];\n      var dsl=\"hue \"+u.hue+\"\\ncell 44\\na @0,0 h2 \"+a+\" win\\nb @2,1 h1 \"+b2+\"\\na -> b flow\";\n      return isoScene(parseIso(dsl));\n    }\n    // === isolab neon renderer (ported verbatim, namespaced *2) ===\n    var ICONS2={\n      chat:'<path class=\"ic\" d=\"M4 6a2 2 0 012-2h12a2 2 0 012 2v6a2 2 0 01-2 2H9l-4 3v-3H6a2 2 0 01-2-2z\"></path>',\n      ai:'<path class=\"ic\" d=\"M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z\"></path>',\n      user:'<circle class=\"ic\" cx=\"12\" cy=\"8\" r=\"3.2\"></circle><path class=\"ic\" d=\"M5.5 20c0-3.6 3-6 6.5-6s6.5 2.4 6.5 6\"></path>',\n      screen:'<rect class=\"ic\" x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\"></rect><path class=\"ic\" d=\"M8 20h8M12 16v4\"></path>',\n      gear:'<circle class=\"ic\" cx=\"12\" cy=\"12\" r=\"3\"></circle><path class=\"ic\" d=\"M12 3.5v3M12 17.5v3M3.5 12h3M17.5 12h3M6 6l2 2M16 16l2 2M18 6l-2 2M8 16l-2 2\"></path>',\n      bolt:'<path class=\"ic\" d=\"M13 3L5 13h6l-1 8 8-11h-6z\"></path>',\n      plug:'<path class=\"ic\" d=\"M9 3v4M15 3v4M7 7h10v2a5 5 0 01-10 0zM12 16v5\"></path>',\n      db:'<ellipse class=\"ic\" cx=\"12\" cy=\"6\" rx=\"7\" ry=\"2.6\"></ellipse><path class=\"ic\" d=\"M5 6v12c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6V6\"></path><path class=\"ic\" d=\"M5 12c0 1.4 3.1 2.6 7 2.6s7-1.2 7-2.6\"></path>',\n      chart:'<path class=\"ic\" d=\"M4 20h16M7 20v-6M12 20V8M17 20v-9\"></path>',\n      doc:'<path class=\"ic\" d=\"M7 3h7l4 4v14H7z\"></path><path class=\"ic\" d=\"M14 3v4h4M10 12h5M10 16h5\"></path>',\n      shield:'<path class=\"ic\" d=\"M12 3l7 3v6c0 4.8-3.4 7.8-7 9-3.6-1.2-7-4.2-7-9V6z\"></path>',\n      cart:'<circle class=\"ic\" cx=\"9.5\" cy=\"20\" r=\"1.3\"></circle><circle class=\"ic\" cx=\"17\" cy=\"20\" r=\"1.3\"></circle><path class=\"ic\" d=\"M3 4h2.5l2.2 11h9.8l1.8-8H7\"></path>',\n      node:'<circle class=\"ic\" cx=\"5\" cy=\"12\" r=\"2\"></circle><circle class=\"ic\" cx=\"19\" cy=\"6\" r=\"2\"></circle><circle class=\"ic\" cx=\"19\" cy=\"18\" r=\"2\"></circle><path class=\"ic\" d=\"M6.8 11l10.4-4M6.8 13l10.4 4\"></path>'\n    };\n    function parseIso2(text){\n      var spec={cell:50,hue:\"#4ddfe6\",blocks:[],wires:[],context:false};\n      (text||\"\").split(\"\\n\").forEach(function(ln){\n        ln=ln.trim(); if(!ln||ln.charAt(0)===\"#\") return;\n        if(ln.indexOf(\"hue \")===0){ spec.hue=ln.slice(4).trim(); return; }\n        if(ln.indexOf(\"cell \")===0){ spec.cell=+ln.slice(5)||50; return; }\n        if(ln===\"context\"||ln.indexOf(\"context \")===0){ spec.context=true; return; }\n        var w=ln.match(/^([\\w-]+)\\s*->\\s*([\\w-]+)(.*)$/);\n        if(w){ var wi={from:w[1],to:w[2],flow:/\\bflow\\b/.test(w[3])}; var du=w[3].match(/dur:([\\d.]+)/); if(du)wi.dur=+du[1]; var wh=w[3].match(/#([0-9a-fA-F]{3,8})/); if(wh)wi.hue=\"#\"+wh[1]; spec.wires.push(wi); return; }\n        var m=ln.match(/^([\\w-]+)\\s+@(-?\\d+),(-?\\d+)(.*)$/);\n        if(m){ var b={id:m[1],at:[+m[2],+m[3]]}; var rest=m[4]||\"\";\n          var hh=rest.match(/\\bh(\\d+)/); b.h=hh?+hh[1]:1;\n          var an=rest.match(/\\b(float|pulse|bob)\\b/); if(an)b.anim=an[1];\n          var lb=rest.match(/\"([^\"]*)\"/); if(lb)b.label=lb[1];\n          var hu=rest.match(/#([0-9a-fA-F]{3,8})/); if(hu)b.hue=\"#\"+hu[1];\n          if(/\\bwin\\b/.test(rest)) b.detail=\"win\";\n          var sh=rest.match(/\\bshape:(\\w+)/); if(sh)b.shape=sh[1];\n          var ic=rest.match(/\\bicon:([a-z]+)/); if(ic)b.icon=ic[1];\n          var cp=rest.match(/\\bcomp:(\\d+)/); if(cp)b.dataI=+cp[1];\n          spec.blocks.push(b);\n        }\n      });\n      return spec;\n    }\n    function poly2(a){ return a.map(function(p){return p[0].toFixed(1)+\",\"+p[1].toFixed(1)}).join(\" \"); }\n    function shapeGeo2(shape,X,topY,Ybase,hw,q,H){\n      var g={faces:[],edges:\"\",topC:[X,topY],floor:[X,Ybase,hw*1.3,q*1.25],contact:[X,Ybase,hw*0.95,q*0.85]};\n      function seg(a,b){ return \"M\"+a[0].toFixed(1)+\",\"+a[1].toFixed(1)+\" L\"+b[0].toFixed(1)+\",\"+b[1].toFixed(1)+\" \"; }\n      if(shape===\"cyl\"){\n        var bot=topY+H;\n        var body=\"M\"+(X-hw)+\",\"+topY+\" L\"+(X-hw)+\",\"+bot+\" A\"+hw+\",\"+q+\" 0 0 0 \"+(X+hw)+\",\"+bot+\" L\"+(X+hw)+\",\"+topY+\" A\"+hw+\",\"+q+\" 0 0 1 \"+(X-hw)+\",\"+topY+\" Z\";\n        var topE=\"M\"+(X-hw)+\",\"+topY+\" A\"+hw+\",\"+q+\" 0 1 0 \"+(X+hw)+\",\"+topY+\" A\"+hw+\",\"+q+\" 0 1 0 \"+(X-hw)+\",\"+topY+\" Z\";\n        g.faces.push({cls:\"fl\",d:body});\n        g.faces.push({cls:\"ft\",d:topE});\n        g.edges=topE+\" M\"+(X-hw)+\",\"+topY+\" L\"+(X-hw)+\",\"+bot+\" M\"+(X+hw)+\",\"+topY+\" L\"+(X+hw)+\",\"+bot+\" M\"+(X-hw)+\",\"+bot+\" A\"+hw+\",\"+q+\" 0 0 0 \"+(X+hw)+\",\"+bot;\n        g.floor=[X,bot,hw*1.2,q*1.15]; g.contact=[X,bot,hw*0.9,q*0.78];\n        return g;\n      }\n      if(shape===\"pyr\"){\n        var apex=[X,topY],pl=[X-hw,Ybase],pf=[X,Ybase+q],pr=[X+hw,Ybase];\n        g.faces.push({cls:\"fl\",pts:[apex,pl,pf]});\n        g.faces.push({cls:\"fr\",pts:[apex,pf,pr]});\n        g.edges=seg(apex,pl)+seg(apex,pf)+seg(apex,pr)+seg(pl,pf)+seg(pf,pr);\n        g.topC=[X,topY+(Ybase-topY)*0.42];\n        g.floor=[X,Ybase+q*0.2,hw*1.15,q*1.1]; g.contact=[X,Ybase+q*0.12,hw*0.8,q*0.7];\n        return g;\n      }\n      if(shape===\"hex\"){\n        var bt=topY+H;\n        var R=[X+hw,topY],TR=[X+hw*0.5,topY-q],TL=[X-hw*0.5,topY-q],L=[X-hw,topY],BL=[X-hw*0.5,topY+q],BR=[X+hw*0.5,topY+q];\n        var Ld=[X-hw,bt],BLd=[X-hw*0.5,bt+q],BRd=[X+hw*0.5,bt+q],Rd=[X+hw,bt];\n        g.faces.push({cls:\"ft\",pts:[R,TR,TL,L,BL,BR]});\n        g.faces.push({cls:\"fl\",pts:[L,BL,BLd,Ld]});\n        g.faces.push({cls:\"fm\",pts:[BL,BR,BRd,BLd]});\n        g.faces.push({cls:\"fr\",pts:[BR,R,Rd,BRd]});\n        g.edges=seg(R,TR)+seg(TR,TL)+seg(TL,L)+seg(L,BL)+seg(BL,BR)+seg(BR,R)+seg(L,Ld)+seg(BL,BLd)+seg(BR,BRd)+seg(R,Rd)+seg(Ld,BLd)+seg(BLd,BRd)+seg(BRd,Rd);\n        g.floor=[X,bt,hw*1.25,q*1.2]; g.contact=[X,bt,hw*0.95,q*0.82];\n        return g;\n      }\n      var T=[X,topY-q],Rr=[X+hw,topY],B=[X,topY+q],Ll=[X-hw,topY],fb=[X,topY+q+H],lb=[X-hw,topY+H],rb=[X+hw,topY+H];\n      g.faces.push({cls:\"ft\",pts:[T,Rr,B,Ll]});\n      g.faces.push({cls:\"fl\",pts:[Ll,B,fb,lb]});\n      g.faces.push({cls:\"fr\",pts:[Rr,B,fb,rb]});\n      g.edges=seg(T,Rr)+seg(Rr,B)+seg(B,Ll)+seg(Ll,T)+seg(Ll,lb)+seg(B,fb)+seg(Rr,rb)+seg(lb,fb)+seg(fb,rb);\n      g.floor=[X,topY+q+H,hw*1.3,q*1.25]; g.contact=[X,topY+q+H,hw*0.95,q*0.82];\n      return g;\n    }\n    function isoScene2(spec){\n      var s=spec.cell||50, hw=s/2, q=s/4, fh=s*0.5;\n      var minX=1e9,maxX=-1e9,minY=1e9,maxY=-1e9, anchors={}, blocks=[];\n      spec.blocks.forEach(function(b,i){\n        var c=b.at[0], r=b.at[1], h=b.h||1;\n        var X=(c-r)*hw, Ybase=(c+r)*q, topY=Ybase-h*fh, hue=b.hue||spec.hue;\n        anchors[b.id!=null?b.id:i]={x:X,y:topY};\n        blocks.push({b:b,X:X,Ybase:Ybase,topY:topY,h:h,hue:hue,i:i});\n        if(X-hw*1.3<minX)minX=X-hw*1.3; if(X+hw*1.3>maxX)maxX=X+hw*1.3;\n        if(topY-q<minY)minY=topY-q; if(Ybase+q+s*0.62+16>maxY)maxY=Ybase+q+s*0.62+16;\n      });\n      var minYb=1e9,maxYb=-1e9;\n      blocks.forEach(function(bl){ if(bl.Ybase<minYb)minYb=bl.Ybase; if(bl.Ybase>maxYb)maxYb=bl.Ybase; });\n      var GRID=\"\",GHOSTS=\"\";\n      if(blocks.length){\n        var _cs=spec.blocks.map(function(b){return b.at[0]}),_rs=spec.blocks.map(function(b){return b.at[1]});\n        var minC=Math.min.apply(null,_cs),maxC=Math.max.apply(null,_cs),minR=Math.min.apply(null,_rs),maxR=Math.max.apply(null,_rs);\n        var g0=minC-1,g1=maxC+1,r0=minR-1,r1=maxR+1;\n        var occ={}; spec.blocks.forEach(function(b){occ[b.at[0]+\"_\"+b.at[1]]=1;});\n        var maxCR=Math.max.apply(null,spec.blocks.map(function(b){return b.at[0]+b.at[1]}));\n        var sd=9176,rand=function(){ sd=(sd*1103515245+12345)&0x7fffffff; return sd/0x7fffffff; };\n        var gl=\"\";\n        for(var gc=g0;gc<=g1;gc++){ gl+=\"M\"+((gc-r0)*hw).toFixed(1)+\",\"+((gc+r0)*q).toFixed(1)+\" L\"+((gc-r1)*hw).toFixed(1)+\",\"+((gc+r1)*q).toFixed(1)+\" \"; }\n        for(var gr=r0;gr<=r1;gr++){ gl+=\"M\"+((g0-gr)*hw).toFixed(1)+\",\"+((g0+gr)*q).toFixed(1)+\" L\"+((g1-gr)*hw).toFixed(1)+\",\"+((g1+gr)*q).toFixed(1)+\" \"; }\n        GRID='<path class=\"grid\" style=\"--h:'+spec.hue+'\" d=\"'+gl+'\"></path>';\n        if(spec.context){\n          var gh=[];\n          for(var cc=g0;cc<=g1;cc++){ for(var rr=r0;rr<=r1;rr++){ if(occ[cc+\"_\"+rr]) continue; if(cc+rr>maxCR) continue; if(rand()>0.36) continue; gh.push({c:cc,r:rr,h:1+Math.floor(rand()*3)}); } }\n          gh.sort(function(a,b){return (a.c+a.r)-(b.c+b.r)});\n          gh.forEach(function(o){ var X=(o.c-o.r)*hw,Ybase=(o.c+o.r)*q,topY=Ybase-o.h*fh,H=o.h*fh; var geo=shapeGeo2(\"cube\",X,topY,Ybase,hw,q,H); var gg='<g class=\"ghost\" style=\"--h:'+spec.hue+'\">'; geo.faces.forEach(function(f){ gg+='<polygon class=\"gface\" points=\"'+poly2(f.pts)+'\"></polygon>'; }); gg+='<path class=\"gedge\" d=\"'+geo.edges+'\"></path></g>'; GHOSTS+=gg; if(X-hw<minX)minX=X-hw; if(X+hw>maxX)maxX=X+hw; if(topY-q<minY)minY=topY-q; if(Ybase+q>maxY)maxY=Ybase+q; });\n        }\n        var _xs=[(g0-r0)*hw,(g0-r1)*hw,(g1-r0)*hw,(g1-r1)*hw];\n        minX=Math.min(minX,Math.min.apply(null,_xs)); maxX=Math.max(maxX,Math.max.apply(null,_xs));\n        minY=Math.min(minY,(g0+r0)*q-q); maxY=Math.max(maxY,(g1+r1)*q+q);\n      }\n      var DEFS='<defs><radialGradient id=\"shG\"><stop offset=\"0\" stop-color=\"#000\" stop-opacity=\".55\"/><stop offset=\".72\" stop-color=\"#000\" stop-opacity=\".16\"/><stop offset=\"1\" stop-color=\"#000\" stop-opacity=\"0\"/></radialGradient></defs>';\n      var out=GRID+GHOSTS;\n      (spec.wires||[]).forEach(function(w){\n        var a=anchors[w.from], z=anchors[w.to]; if(!a||!z) return;\n        var d=\"M\"+a.x.toFixed(1)+\",\"+a.y.toFixed(1)+\" L\"+z.x.toFixed(1)+\",\"+z.y.toFixed(1);\n        out+='<path class=\"iso-wire\" style=\"--h:'+(w.hue||spec.hue)+'\" d=\"'+d+'\"></path>';\n        if(w.flow) out+='<circle class=\"iso-flow\" r=\"3.4\" style=\"--h:'+(w.hue||spec.hue)+'\"><animateMotion dur=\"'+(w.dur||2.6)+'s\" repeatCount=\"indefinite\" path=\"'+d+'\"></animateMotion></circle>';\n      });\n      blocks.sort(function(p,q2){return p.Ybase-q2.Ybase});\n      blocks.forEach(function(bl){\n        var X=bl.X,topY=bl.topY,Ybase=bl.Ybase,h=bl.h,hue=bl.hue,b=bl.b,H=h*fh,i=bl.i;\n        var shape=b.shape||\"cube\";\n        var geo=shapeGeo2(shape,X,topY,Ybase,hw,q,H);\n        var dep=maxYb>minYb?(Ybase-minYb)/(maxYb-minYb):1, op=(0.78+0.22*dep).toFixed(3);\n        var mix=function(p,base){ return \"color-mix(in srgb,\"+hue+\" \"+p+\"%,\"+base+\")\"; };\n        var gd='<defs><linearGradient id=\"ftg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(42,\"#0d0e15\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(20,\"#08090f\")+'\"/></linearGradient><linearGradient id=\"flg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(24,\"#0a0b12\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(9,\"#050609\")+'\"/></linearGradient><linearGradient id=\"frg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(13,\"#08080e\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(4,\"#040406\")+'\"/></linearGradient><linearGradient id=\"fmg'+i+'\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"'+mix(30,\"#0b0c13\")+'\"/><stop offset=\"1\" stop-color=\"'+mix(12,\"#060710\")+'\"/></linearGradient><radialGradient id=\"glowG'+i+'\"><stop offset=\"0\" stop-color=\"'+hue+'\" stop-opacity=\".36\"/><stop offset=\"1\" stop-color=\"'+hue+'\" stop-opacity=\"0\"/></radialGradient></defs>';\n        var cls=\"iso-blk\"+(b.anim?(\" iso-\"+b.anim):\"\")+(b.dataI!=null?\" comp\":\"\");\n        var di=(b.dataI!=null?' data-i=\"'+b.dataI+'\"':'');\n        var g='<g class=\"'+cls+'\"'+di+' style=\"--h:'+hue+';opacity:'+op+';animation-delay:'+(-i*0.4).toFixed(2)+'s\">'+gd;\n        g+='<ellipse class=\"contact\" fill=\"url(#shG)\" cx=\"'+geo.contact[0].toFixed(1)+'\" cy=\"'+geo.contact[1].toFixed(1)+'\" rx=\"'+geo.contact[2].toFixed(1)+'\" ry=\"'+geo.contact[3].toFixed(1)+'\"></ellipse>';\n        g+='<ellipse class=\"floor-glow\" fill=\"url(#glowG'+i+')\" cx=\"'+geo.floor[0].toFixed(1)+'\" cy=\"'+geo.floor[1].toFixed(1)+'\" rx=\"'+geo.floor[2].toFixed(1)+'\" ry=\"'+geo.floor[3].toFixed(1)+'\"></ellipse>';\n        geo.faces.forEach(function(f){ var fill=\"url(#\"+f.cls+\"g\"+i+\")\"; if(f.d) g+='<path class=\"face\" fill=\"'+fill+'\" d=\"'+f.d+'\"></path>'; else g+='<polygon class=\"face\" fill=\"'+fill+'\" points=\"'+poly2(f.pts)+'\"></polygon>'; });\n        if(shape===\"cube\"&&h>1){ for(var k=1;k<h;k++){ var yy=topY+k*fh; g+='<line class=\"det\" x1=\"'+(X-hw)+'\" y1=\"'+yy+'\" x2=\"'+X+'\" y2=\"'+(yy+q)+'\"></line><line class=\"det\" x1=\"'+X+'\" y1=\"'+(yy+q)+'\" x2=\"'+(X+hw)+'\" y2=\"'+yy+'\"></line>'; } }\n        if(b.detail===\"win\"&&shape===\"cube\"){\n          for(var o2=fh*0.5;o2<H;o2+=fh){ g+='<line class=\"det\" x1=\"'+(X-hw)+'\" y1=\"'+(topY+o2)+'\" x2=\"'+X+'\" y2=\"'+(topY+q+o2)+'\"></line><line class=\"det\" x1=\"'+X+'\" y1=\"'+(topY+q+o2)+'\" x2=\"'+(X+hw)+'\" y2=\"'+(topY+o2)+'\"></line>'; }\n          g+='<line class=\"det\" x1=\"'+(X-hw*0.5)+'\" y1=\"'+(topY+q*0.5)+'\" x2=\"'+(X-hw*0.5)+'\" y2=\"'+(topY+q*0.5+H)+'\"></line><line class=\"det\" x1=\"'+(X+hw*0.5)+'\" y1=\"'+(topY+q*0.5)+'\" x2=\"'+(X+hw*0.5)+'\" y2=\"'+(topY+q*0.5+H)+'\"></line>';\n        }\n        g+='<path class=\"glow2\" d=\"'+geo.edges+'\"></path><path class=\"glow1\" d=\"'+geo.edges+'\"></path><path class=\"edge\" d=\"'+geo.edges+'\"></path><path class=\"core\" d=\"'+geo.edges+'\"></path>';\n        if(b.icon&&ICONS2[b.icon]){ var isc=(hw/30).toFixed(3); g+='<g class=\"iso-ic\" transform=\"translate('+geo.topC[0].toFixed(1)+','+geo.topC[1].toFixed(1)+') scale('+isc+') matrix(1,0.5,-1,0.5,0,0) translate(-12,-12)\">'+ICONS2[b.icon]+'</g>'; }\n        g+='</g>';\n        out+=g;\n        if(b.label){ var lf=Math.max(10,Math.round(s*0.26)); var lw=(b.label.length*lf*0.6+18); var ly=(Ybase+q+lf+12); out+='<rect class=\"lbl-bg\" x=\"'+(X-lw/2).toFixed(1)+'\" y=\"'+(ly-lf*0.85).toFixed(1)+'\" width=\"'+lw.toFixed(1)+'\" height=\"'+(lf*1.7).toFixed(1)+'\" rx=\"'+(lf*0.85).toFixed(1)+'\"></rect><text class=\"iso-lbl\" x=\"'+X.toFixed(1)+'\" y=\"'+ly.toFixed(1)+'\" style=\"font-size:'+lf+'px\">'+b.label+'</text>'; }\n      });\n      var pad=42, vbx=(minX-pad), vby=(minY-pad), vbw=(maxX-minX)+pad*2, vbh=(maxY-minY)+pad*2;\n      var sd2=4231,rnd=function(){ sd2=(sd2*1103515245+12345)&0x7fffffff; return sd2/0x7fffffff; };\n      for(var di2=0;di2<14;di2++){ out+='<circle class=\"dust\" cx=\"'+(vbx+rnd()*vbw).toFixed(1)+'\" cy=\"'+(vby+rnd()*vbh).toFixed(1)+'\" r=\"'+(0.6+rnd()*1.5).toFixed(2)+'\" style=\"animation-delay:-'+(rnd()*6).toFixed(2)+'s;animation-duration:'+(5+rnd()*6).toFixed(2)+'s\"></circle>'; }\n      if(!isFinite(vbw)||vbw<=0) return '<svg class=\"iso-svg\" viewBox=\"0 0 100 100\"></svg>';\n      return '<svg class=\"iso-svg\" viewBox=\"'+vbx.toFixed(1)+\" \"+vby.toFixed(1)+\" \"+vbw.toFixed(1)+\" \"+vbh.toFixed(1)+'\" preserveAspectRatio=\"xMidYMid meet\">'+DEFS+out+'</svg>';\n    }\n    var ICON_MAP2=[\n      [/webchat|widget/i,\"chat\"],\n      [/transbordo|handoff|humano|human|\\bsso\\b|identidade|onboard|colaborador|segurad/i,\"user\"],\n      [/\\bbot\\b|triag|copilot|copiloto|assistent|\\bai\\b|recomenda|next-best|semantic|semânt|busca|search/i,\"ai\"],\n      [/console|workspace|supervis|vitrine|storefront|catalog|catálogo|experiência/i,\"screen\"],\n      [/alerta|alert|evento|gatilho|monitor|anomal/i,\"bolt\"],\n      [/integr|vtex|graphql|connect|\\bapi\\b|outreach|ondas|waves|\\bcrm\\b/i,\"plug\"],\n      [/\\bsql\\b|data lake|knowledge|conhecimento|registry|banco|\\bbom\\b|estrutura|planejamento|supply|fornec/i,\"db\"],\n      [/score|analytics|performance|\\bbi\\b|painéis|painel|dashboard|metas|targets|modelagem|modeling|roi|financ|simulad|scenario|cenário/i,\"chart\"],\n      [/fila|queue|csat|automa|\\brush\\b|agendad|scheduler|regras|rules|fluxo|ingest/i,\"gear\"],\n      [/\\bocr\\b|leitura|documento|\\bdoc\\b|proposta|relatóri|export|planilha/i,\"doc\"],\n      [/segment|\\bnode\\b|\\bkb\\b/i,\"node\"],\n      [/foto|photo|imagem|image|estúdio|studio|conteúdo|content|mídia|media/i,\"screen\"],\n      [/erp|loja|store|compra|procurement|sourcing/i,\"cart\"]\n    ];\n    function pickIcon2(comp){\n      var s=((comp.title&&comp.title.en)||\"\")+\" \"+((comp.label&&comp.label.en)||\"\");\n      for(var i=0;i<ICON_MAP2.length;i++){ if(ICON_MAP2[i][0].test(s)) return ICON_MAP2[i][1]; }\n      return \"gear\";\n    }\n    function pickShape2(ic){\n      if(ic===\"db\") return \"cyl\";\n      if(ic===\"plug\"||ic===\"node\") return \"hex\";\n      if(ic===\"bolt\") return \"pyr\";\n      if(ic===\"gear\") return \"hex\";\n      return \"cube\";\n    }\n    var SYS_POS=[[-2,6],[2,6],[2,2],[6,2],[6,-2],[10,-2]];\n    var SYS_H=[2,3,1,2,3,2], SYS_AN=[\"float\",\"pulse\",\"bob\",\"float\",\"pulse\",\"bob\"];\n    function sysmapSpec(u){\n      var n=u.comps.length, lines=[\"hue \"+u.hue,\"cell 58\",\"context\"];\n      for(var i=0;i<n;i++){\n        var c=u.comps[i], ic=pickIcon2(c), sh=pickShape2(ic), p=SYS_POS[i%SYS_POS.length];\n        var lbl=String(L(c.label)||\"\").replace(/\"/g,\"\");\n        lines.push(\"c\"+i+\" @\"+p[0]+\",\"+p[1]+\" h\"+SYS_H[i%SYS_H.length]+\" \"+SYS_AN[i%SYS_AN.length]+\" shape:\"+sh+\" icon:\"+ic+\" comp:\"+i+' \"'+lbl+'\"');\n      }\n      for(var j=1;j<n;j++){ lines.push(\"c\"+(j-1)+\" -> c\"+j+\" flow\"); }\n      return lines.join(\"\\n\");\n    }\n    function detailSpec(u,c,j){\n      var ic=pickIcon2(c), sh=pickShape2(ic);\n      var a=[\"float\",\"pulse\",\"bob\"][j%3], b2=[\"pulse\",\"bob\",\"float\"][j%3];\n      var sh2=[\"hex\",\"cyl\",\"cube\",\"pyr\"][j%4], h1=[2,3,2][j%3];\n      var lines=[\"hue \"+u.hue,\"cell 48\"];\n      lines.push(\"m @0,0 h\"+h1+\" \"+a+\" shape:\"+sh+\" icon:\"+ic);\n      lines.push(\"s @2,1 h1 \"+b2+\" shape:\"+sh2);\n      lines.push(\"m -> s flow\");\n      return lines.join(\"\\n\");\n    }\n    var __dio = null;\n    function hxRgb(h){ h=(h||'#888888').replace('#',''); if(h.length===3) h=h[0]+h[0]+h[1]+h[1]+h[2]+h[2]; return [parseInt(h.substr(0,2),16)/255,parseInt(h.substr(2,2),16)/255,parseInt(h.substr(4,2),16)/255]; }\n    function rgbHsl(r,g,b){ var mx=Math.max(r,g,b),mn=Math.min(r,g,b),h,s,l=(mx+mn)/2; if(mx===mn){h=0;s=0;} else { var d=mx-mn; s=l>0.5?d/(2-mx-mn):d/(mx+mn); h=(mx===r)?((g-b)/d+(g<b?6:0)):(mx===g)?((b-r)/d+2):((r-g)/d+4); h/=6; } return [h,s,l]; }\n    function hslRgb(h,s,l){ function f(p,q,t){ if(t<0)t+=1; if(t>1)t-=1; if(t<1/6)return p+(q-p)*6*t; if(t<1/2)return q; if(t<2/3)return p+(q-p)*(2/3-t)*6; return p; } if(s===0)return [l,l,l]; var q=l<0.5?l*(1+s):l+s-l*s,p=2*l-q; return [f(p,q,h+1/3),f(p,q,h),f(p,q,h-1/3)]; }\n    function neon(rgb,rotDeg,li){ var hsl=rgbHsl(rgb[0],rgb[1],rgb[2]); var h=(hsl[0]+(rotDeg||0)/360+1)%1; var s=Math.max(hsl[1],0.85); return hslRgb(h,s,li||0.6); }\n    function kanjiFor(c,i){ var key=((((c&&c.label&&c.label.en)||'')+' '+((c&&c.label&&c.label.pt)||'')).toLowerCase()); var MAP=[[['webchat','chat','conversa'],'会話'],[['triage','triagem','bot'],'分流'],[['handoff','transbordo'],'引継'],[['console'],'制御'],[['queue','fila'],'待列'],[['csat','satisf'],'満足'],[['analytic','analy','painel','dashboard','painéis'],'分析'],[['copilot','copiloto','assist','ai '],'知能'],[['search','busca'],'検索'],[['crm','outreach','cadência','lead'],'顧客'],[['sql','query'],'問合'],[['export','planilha','spreadsheet'],'出力'],[['rush','ingest'],'取込'],[['store','record','erp','estoque'],'記録'],[['rule','regra','score'],'規則'],[['bom','estrutura'],'展開'],[['photo','foto','image','imagem','conteúdo','content'],'生成'],[['catalog','catálogo','produto','product'],'商品'],[['vtex','graphql','integr'],'接続'],[['sso','auth','login'],'認証'],[['alert','monitor'],'警報'],[['target','meta','plan'],'目標'],[['scenario','cenário','simul','model'],'模擬'],[['omnichannel','onda','wave','canal'],'波信'],[['semant','semânt','conhecimento','ground','ancorada','fonte','kb'],'知識'],[['next','próxima','ação','action','performance'],'行動'],[['supply','fornecimento','planejamento'],'供給']]; for(var m=0;m<MAP.length;m++){ for(var w=0;w<MAP[m][0].length;w++){ if(key.indexOf(MAP[m][0][w])>=0) return MAP[m][1]; } } var pool=['都','光','夜','街','電','網','機','塔']; return pool[(i||0)%pool.length]; }\n\n    // ---- data-driven scene: each component => one neon building, tinted in the universe hue ----\n    function dioramaScene(u){\n      var boxes=[], sg=[], lamps=[], beacons=[];\n      var ground=[.11,.12,.15], roofC=[.15,.15,.19];\n      function bx(p,s,c,seed){ return {p:p,s:s,c:c,win:0,g:0,seed:seed||0}; }\n      function em(p,s,c){ return {p:p,s:s,c:c,win:2,g:0,seed:0}; }\n      function bld(p,s,tint,seed){ var t=tint||1.0; return {p:p,s:s,c:[0.26*t,0.25*t,0.31*t],win:1,g:0,seed:seed||0}; }\n      function grd(p,s){ return {p:p,s:s,c:ground,win:0,g:1,seed:0}; }\n      function roof(b,seed){ var ty=b.p[1]+b.s[1]/2; boxes.push(bx([b.p[0]-b.s[0]*0.18,ty+0.32,b.p[2]+b.s[2]*0.16],[b.s[0]*0.34,0.64,b.s[2]*0.34],roofC,seed)); boxes.push(bx([b.p[0]+b.s[0]*0.26,ty+0.75,b.p[2]-b.s[2]*0.2],[0.05,1.5,0.05],[.09,.09,.12],seed)); boxes.push(bx([b.p[0]+b.s[0]*0.12,ty+0.16,b.p[2]+b.s[2]*0.3],[b.s[0]*0.3,0.3,b.s[2]*0.22],roofC,seed)); beacons.push([b.p[0]+b.s[0]*0.26,ty+1.55,b.p[2]-b.s[2]*0.2]); }\n      function detail(b,seed){ var fz=b.p[2]+b.s[2]/2, base=b.p[1]-b.s[1]/2, cx=b.p[0]; boxes.push(em([cx,base+0.42,fz+0.04],[b.s[0]*0.66,0.52,0.04],[1.0,0.72,0.36])); boxes.push({p:[cx,base+0.66,fz+0.28],s:[b.s[0]*0.72,0.09,0.5],c:(seed>0.5?[.5,.12,.14]:[.12,.32,.18]),win:0,g:0,seed:0}); boxes.push(bx([cx-b.s[0]/2-0.11,base+b.s[1]*0.58,b.p[2]+0.35],[0.22,0.3,0.36],[.1,.1,.13],0)); boxes.push(bx([cx-b.s[0]/2-0.11,base+b.s[1]*0.34,b.p[2]-0.35],[0.2,0.26,0.32],[.1,.1,.13],0)); }\n      function lamp(x,zz){ boxes.push(bx([x,0.9,zz],[0.06,1.8,0.06],[.08,.08,.10],0)); boxes.push(bx([x-0.13,1.78,zz],[0.28,0.06,0.1],[.08,.08,.10],0)); boxes.push(em([x-0.24,1.72,zz],[0.14,0.1,0.14],[1.0,0.72,0.34])); lamps.push([x-0.2,1.45,zz]); }\n      function road(cx,cz,sx,sz){ boxes.push({p:[cx,0.02,cz],s:[sx,0.06,sz],c:[.05,.055,.075],win:0,g:0,seed:0}); }\n      function paint(cx,cz,sx,sz){ boxes.push({p:[cx,0.055,cz],s:[sx,0.02,sz],c:[.3,.31,.34],win:2,g:0,seed:0}); }\n      function vending(x,z,col){ boxes.push(bx([x,0.45,z],[0.5,0.9,0.42],[.08,.08,.1],0)); boxes.push(em([x,0.52,z+0.22],[0.36,0.64,0.03],col)); }\n      function figure(x,z){ boxes.push(bx([x,0.27,z],[0.16,0.42,0.14],[.05,.05,.07],0)); boxes.push(bx([x,0.55,z],[0.12,0.13,0.12],[.06,.06,.08],0)); }\n      function lanternWire(x1,x2,z,y,n,col){ boxes.push(bx([(x1+x2)*0.5,y+0.04,z],[Math.abs(x2-x1),0.02,0.02],[.06,.06,.07],0)); for(var i=0;i<n;i++){ var f=(i+0.5)/n; boxes.push(em([x1+(x2-x1)*f,y-Math.sin(f*3.14159)*0.3,z],[0.11,0.16,0.11],col)); } }\n      function onZ(b,hy,k,n,c,sc){ sc=sc||1; return {p:[b.p[0],b.p[1]-b.s[1]/2+hy*b.s[1],b.p[2]+b.s[2]/2+0.05],w:1.5*sc,h:1.0*sc,axis:'z',k:k,n:n,c:c,port:false}; }\n      function bladeZ(b,hy,k,n,c,sc){ sc=sc||1; return {p:[b.p[0]-b.s[0]*0.22,b.p[1]-b.s[1]/2+hy*b.s[1],b.p[2]+b.s[2]/2+0.5*sc],w:1.0*sc,h:2.0*sc,axis:'x',k:k,n:n,c:c,port:true}; }\n      // street framework (roads, curbs, crosswalk, lamps, L traffic-light pole) — matches engine coords so the animated heads align\n      boxes.push(grd([0,-0.3,1.0],[19,0.6,15]));\n      boxes.push({p:[0,0.06,1.0],s:[11,0.12,7],c:[.15,.16,.2],win:0,g:1,seed:0});\n      road(0,5.5,17,1.9); road(0,-3.5,17,1.9); road(-6.6,1.0,1.9,11); road(6.6,1.0,1.9,11);\n      boxes.push({p:[0,0.14,4.5],s:[11.2,0.06,0.16],c:[.22,.23,.28],win:0,g:0,seed:0});\n      boxes.push({p:[0,0.14,-2.5],s:[11.2,0.06,0.16],c:[.22,.23,.28],win:0,g:0,seed:0});\n      boxes.push({p:[-5.5,0.14,1.0],s:[0.16,0.06,7.2],c:[.22,.23,.28],win:0,g:0,seed:0});\n      boxes.push({p:[5.5,0.14,1.0],s:[0.16,0.06,7.2],c:[.22,.23,.28],win:0,g:0,seed:0});\n      for(var dx=-7.5;dx<=7.5;dx+=1.5){ paint(dx,5.5,0.6,0.08); paint(dx,-3.5,0.6,0.08); }\n      for(var dz=-3.5;dz<=5.5;dz+=1.5){ paint(-6.6,dz,0.08,0.6); paint(6.6,dz,0.08,0.6); }\n      for(var cz2=4.6;cz2<=6.4;cz2+=0.42) paint(-2.0,cz2,0.9,0.16);\n      lamp(-5.3,4.3); lamp(5.3,4.3); lamp(-5.3,-2.3); lamp(5.3,-2.3);\n      boxes.push(bx([-3.0,1.5,4.4],[0.1,3.0,0.1],[.06,.06,.08],0)); boxes.push(bx([-3.0,2.85,5.02],[0.1,0.1,1.3],[.05,.05,.07],0)); boxes.push(bx([-3.0,2.7,5.62],[0.2,0.44,0.16],[.04,.04,.06],0));\n      // buildings from components\n      var main=neon(hxRgb(u.hue),0,0.6), acc1=neon(hxRgb(u.hue),34,0.62), acc2=neon(hxRgb(u.hue),-30,0.6);\n      var accents=[main,main,acc1,main,acc2,acc1,main,acc2];\n      var slots=[[-3.5,0.4],[-1.1,1.7],[1.3,0.2],[3.6,1.5],[0.2,2.3],[-3.5,2.2],[2.0,2.6],[3.7,-0.5]];\n      var comps=u.comps||[];\n      function hash(i){ var xx=Math.sin(i*12.9898+4.7)*43758.5453; return xx-Math.floor(xx); }\n      for(var i=0;i<comps.length && i<slots.length;i++){\n        var c=comps[i], h1=hash(i), h2=hash(i+9.3);\n        var hgt=2.7+h1*2.1, w=1.55+h2*0.5;\n        var b=bld([slots[i][0], hgt/2, slots[i][1]],[w,hgt,w],(i%2?1.06:0.9), i*0.31);\n        boxes.push(b); roof(b, i*0.31); detail(b,(i%2)?1:0);\n        var lab=L(c.label)||(('0'+(i+1)).slice(-2)), kj=kanjiFor(c,i), col=accents[i%accents.length];\n        if(lab.length<=8 && hgt>3.4) sg.push(bladeZ(b,0.6,kj,lab,col,1.0));\n        else sg.push(onZ(b,0.62,kj,lab,col,0.98));\n      }\n      lanternWire(-5.2,5.2,4.35,2.5,7,[1.0,0.52,0.2]);\n      vending(-4.9,3.7,main); vending(4.7,-1.4,acc1);\n      figure(-2.2,3.95); figure(0.9,4.05);\n      return {boxes:boxes,signs:sg,lamps:lamps,beacons:beacons};\n    }\n\n    // ---- render core: inlined VERBATIM from the isoshader engine (lab UI stripped) ----\n    function mountDiorama(canvas, scene, opts){\n      opts=opts||{};\n      var gl=canvas.getContext('webgl2',{antialias:true,alpha:false,premultipliedAlpha:false});\n      if(!gl){ if(window.console)console.warn('[diorama] WebGL2 indisponivel'); return {destroy:function(){}}; }\n      var CJK='\"Hiragino Sans\",\"Hiragino Kaku Gothic ProN\",\"PingFang SC\",\"Noto Sans CJK JP\",\"Yu Gothic\",sans-serif';\n      var CUBE=[]; (function(){\n        var F=[\n          [[.5,-.5,-.5],[.5,.5,-.5],[.5,.5,.5],[.5,-.5,.5],[1,0,0]],\n          [[-.5,-.5,.5],[-.5,.5,.5],[-.5,.5,-.5],[-.5,-.5,-.5],[-1,0,0]],\n          [[-.5,.5,-.5],[-.5,.5,.5],[.5,.5,.5],[.5,.5,-.5],[0,1,0]],\n          [[-.5,-.5,.5],[-.5,-.5,-.5],[.5,-.5,-.5],[.5,-.5,.5],[0,-1,0]],\n          [[-.5,-.5,.5],[.5,-.5,.5],[.5,.5,.5],[-.5,.5,.5],[0,0,1]],\n          [[.5,-.5,-.5],[-.5,-.5,-.5],[-.5,.5,-.5],[.5,.5,-.5],[0,0,-1]]\n        ];\n        F.forEach(function(f){ [f[0],f[1],f[2],f[0],f[2],f[3]].forEach(function(v){ CUBE.push(v[0],v[1],v[2],f[4][0],f[4][1],f[4][2]); }); });\n      })();\n      function bx(p,s,c,seed){ return {p:p,s:s,c:c,win:0,g:0,seed:seed||0}; }\n      function em(p,s,c){ return {p:p,s:s,c:c,win:2,g:0,seed:0}; }\n      function car(boxes,x,zz,col,ax,dir){ ax=ax||'x'; dir=dir||1;\n        boxes.push(em([x,0.066,zz],[ax==='x'?1.4:0.86,0.02,ax==='x'?0.86:1.4],[.009,.009,.013]));\n        if(ax==='x'){\n          boxes.push(bx([x,0.26,zz],[1.0,0.26,0.52],col,0)); boxes.push(bx([x,0.48,zz],[0.52,0.22,0.48],[col[0]*0.55,col[1]*0.55,col[2]*0.6],0));\n          boxes.push(em([x+dir*0.47,0.28,zz],[0.06,0.12,0.44],[1.,0.95,0.72])); boxes.push(em([x-dir*0.47,0.28,zz],[0.06,0.1,0.44],[1.,0.18,0.12]));\n          boxes.push(bx([x-0.32,0.12,zz-0.29],[0.18,0.18,0.09],[.04,.04,.05],0)); boxes.push(bx([x-0.32,0.12,zz+0.29],[0.18,0.18,0.09],[.04,.04,.05],0)); boxes.push(bx([x+0.32,0.12,zz-0.29],[0.18,0.18,0.09],[.04,.04,.05],0)); boxes.push(bx([x+0.32,0.12,zz+0.29],[0.18,0.18,0.09],[.04,.04,.05],0));\n        } else {\n          boxes.push(bx([x,0.26,zz],[0.52,0.26,1.0],col,0)); boxes.push(bx([x,0.48,zz],[0.48,0.22,0.52],[col[0]*0.55,col[1]*0.55,col[2]*0.6],0));\n          boxes.push(em([x,0.28,zz+dir*0.47],[0.44,0.12,0.06],[1.,0.95,0.72])); boxes.push(em([x,0.28,zz-dir*0.47],[0.44,0.1,0.06],[1.,0.18,0.12]));\n          boxes.push(bx([x-0.29,0.12,zz-0.32],[0.09,0.18,0.18],[.04,.04,.05],0)); boxes.push(bx([x-0.29,0.12,zz+0.32],[0.09,0.18,0.18],[.04,.04,.05],0)); boxes.push(bx([x+0.29,0.12,zz-0.32],[0.09,0.18,0.18],[.04,.04,.05],0)); boxes.push(bx([x+0.29,0.12,zz+0.32],[0.09,0.18,0.18],[.04,.04,.05],0));\n        }\n      }\n      var RA=-6.6,RB=6.6,RF=5.5,RK=-3.5,L0=RB-RA,L1=RF-RK,L2=RB-RA,L3=RF-RK,RP=L0+L1+L2+L3;\n      function ringPos(d){ d=((d%RP)+RP)%RP;\n        if(d<L0) return [RA+d,RF,'x',1];\n        d-=L0; if(d<L1) return [RB,RF-d,'z',-1];\n        d-=L1; if(d<L2) return [RB-d,RK,'x',-1];\n        d-=L2; return [RA,RK+d,'z',1]; }\n\n      function sh(t,s){ var o=gl.createShader(t); gl.shaderSource(o,s); gl.compileShader(o); if(!gl.getShaderParameter(o,gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(o)); return o; }\n      function prog(vs,fs){ var p=gl.createProgram(); gl.attachShader(p,sh(gl.VERTEX_SHADER,vs)); gl.attachShader(p,sh(gl.FRAGMENT_SHADER,fs)); gl.linkProgram(p); if(!gl.getProgramParameter(p,gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(p)); return p; }\n      var VS=`#version 300 es\nlayout(location=0) in vec3 aPos; layout(location=1) in vec3 aNormal;\nlayout(location=2) in vec3 iPos; layout(location=3) in vec3 iSize; layout(location=4) in vec3 iCol; layout(location=5) in float iWin; layout(location=6) in float iSeed;\nuniform mat4 uVP;\nout vec3 vN; out vec3 vObj; out vec3 vCol; out float vWin; out vec3 vW; out float vSeed;\nvoid main(){ vec3 p=aPos*iSize+iPos; gl_Position=uVP*vec4(p,1.0); vN=aNormal; vObj=aPos*iSize; vCol=iCol; vWin=iWin; vW=p; vSeed=iSeed; }`;\n      var FS=`#version 300 es\nprecision highp float;\nin vec3 vN; in vec3 vObj; in vec3 vCol; in float vWin; in vec3 vW; in float vSeed;\nuniform float uWinI; uniform int uNL; uniform vec3 uLP[16]; uniform vec3 uLC[16];\nuniform sampler2D uShadow; uniform mat4 uLVP; uniform float uShAmt; uniform vec3 uLDir; uniform vec3 uEye;\nout vec4 O;\nfloat hash(vec2 p){ p=fract(p*vec2(123.34,456.21)); p+=dot(p,p+45.32); return fract(p.x*p.y); }\nfloat shadow(vec3 w){\n  vec4 lp=uLVP*vec4(w,1.0); vec3 c=lp.xyz/lp.w*0.5+0.5;\n  if(c.x<0.0||c.x>1.0||c.y<0.0||c.y>1.0||c.z>1.0) return 1.0;\n  float bias=0.0025, s=0.0, tx=1.0/1024.0;\n  for(int i=-1;i<=1;i++)for(int j=-1;j<=1;j++){ float d=texture(uShadow,c.xy+vec2(float(i),float(j))*tx).r; s+=(c.z-bias>d)?0.0:1.0; }\n  return s/9.0;\n}\nvoid main(){\n  if(vWin>1.5){ O=vec4(vCol*3.2,1.0); return; }\n  vec3 n=normalize(vN); vec3 an=abs(n);\n  float up=n.y*0.5+0.5;\n  vec3 amb=mix(vec3(0.018,0.022,0.038),vec3(0.08,0.11,0.19),up);\n  float face=(an.y>=an.x&&an.y>=an.z)?1.0:((an.x>an.z)?(n.x>0.0?0.92:0.72):(n.z>0.0?0.84:0.66));\n  float shf=mix(1.0-uShAmt,1.0,shadow(vW));\n  float ndl=max(dot(n,uLDir),0.0);\n  vec3 col=vCol*(amb*face + vec3(0.55,0.62,0.82)*ndl*shf)*1.3;\n  if(vWin>0.5) col*=0.82+0.18*smoothstep(0.0,4.0,vW.y);\n  if(vWin>0.5 && an.y<0.5){\n    vec2 uv=(an.x>0.5)? vObj.zy : vObj.xy;\n    vec2 cell=floor(uv/0.5); vec2 f=fract(uv/0.5);\n    float box=step(0.2,f.x)*step(f.x,0.8)*step(0.28,f.y)*step(f.y,0.86);\n    float h=hash(cell+vSeed*17.0+7.3);\n    float on=step(0.30+0.22*fract(vSeed*5.3),h);\n    float br=0.4+1.0*hash(cell+vSeed*9.0+3.1);\n    vec3 wc=mix(vec3(1.0,0.78,0.44),vec3(1.0,0.94,0.8),hash(cell+9.9));\n    col+=wc*box*on*br*uWinI;\n  }\n  for(int i=0;i<16;i++){ if(i>=uNL) break; vec3 dl=uLP[i]-vW; float d=length(dl); vec3 ld=dl/max(d,0.001); float at=1.0/(1.0+d*d*3.4); col+=uLC[i]*at*(0.28+0.72*max(dot(n,ld),0.0)); }\n  col=mix(col, vec3(0.02,0.028,0.055), (1.0-exp(-max(length(vW-uEye)-22.0,0.0)*0.03))*0.72);\n  O=vec4(col,1.0);\n}`;\n      var DVS=`#version 300 es\nlayout(location=0) in vec3 aPos; layout(location=2) in vec3 iPos; layout(location=3) in vec3 iSize;\nuniform mat4 uLVP;\nvoid main(){ gl_Position=uLVP*vec4(aPos*iSize+iPos,1.0); }`;\n      var DFS=`#version 300 es\nprecision highp float; void main(){}`;\n      var SVS=`#version 300 es\nlayout(location=0) in vec2 aPos; layout(location=1) in vec2 aUv;\nuniform mat4 uVP; uniform mat4 uModel; out vec2 vUv;\nvoid main(){ vUv=aUv; gl_Position=uVP*uModel*vec4(aPos,0.0,1.0); }`;\n      var SFS=`#version 300 es\nprecision highp float;\nin vec2 vUv; out vec4 O; uniform sampler2D uTex; uniform float uGlow;\nvoid main(){ vec4 t=texture(uTex,vUv); if(t.a<0.02) discard; O=vec4(t.rgb*uGlow, t.a); }`;\n      var PVS=`#version 300 es\nlayout(location=0) in vec2 aP; out vec2 vUv; void main(){ vUv=aP*0.5+0.5; gl_Position=vec4(aP,0.,1.); }`;\n      var BLURFS=`#version 300 es\nprecision highp float; in vec2 vUv; out vec4 O; uniform sampler2D uTex; uniform vec2 uDir; uniform float uBright;\nvoid main(){ float w[5]=float[5](0.227,0.194,0.121,0.054,0.016); vec3 c=texture(uTex,vUv).rgb*w[0];\n  for(int i=1;i<5;i++){ c+=texture(uTex,vUv+uDir*float(i)).rgb*w[i]; c+=texture(uTex,vUv-uDir*float(i)).rgb*w[i]; }\n  if(uBright>0.5){ float l=max(c.r,max(c.g,c.b)); c*=smoothstep(0.55,1.0,l); } O=vec4(c,1.); }`;\n      var COMPFS=`#version 300 es\nprecision highp float; in vec2 vUv; out vec4 O; uniform sampler2D uScene; uniform sampler2D uBloom; uniform float uBloomI,uExp,uSat;\nvec3 aces(vec3 x){ return clamp((x*(2.51*x+0.03))/(x*(2.43*x+0.59)+0.14),0.,1.); }\nfloat hash(vec2 p){ p=fract(p*vec2(123.34,456.21)); p+=dot(p,p+45.32); return fract(p.x*p.y); }\nvoid main(){\n  float ca=0.0016; vec3 s=vec3(texture(uScene,vUv+vec2(ca,0.)).r,texture(uScene,vUv).g,texture(uScene,vUv-vec2(ca,0.)).b), b=texture(uBloom,vUv).rgb;\n  vec3 col=aces((s+b*uBloomI)*uExp);\n  float lu=dot(col,vec3(.299,.587,.114));\n  col=mix(col*vec3(0.88,0.96,1.12), col*vec3(1.08,1.0,0.9), smoothstep(0.2,0.7,lu));\n  col=clamp((col-0.5)*1.12+0.5,0.0,1.0);\n  col=mix(vec3(lu),col,uSat); col+=vec3(0.006,0.011,0.02)*(1.0-col);\n  col+=vec3(0.4,0.5,0.72)*exp(-length((vUv-vec2(0.74,0.8))*vec2(1.0,1.25))*3.2)*0.13;\n  vec2 vg=vUv; col*=0.40+0.60*pow(16.0*vg.x*vg.y*(1.0-vg.x)*(1.0-vg.y),0.28);\n  col+=(hash(vUv*vec2(1600.,900.))-0.5)*0.012;\n  col=pow(max(col,0.),vec3(0.4545));\n  O=vec4(col,1.);\n}`;\n      var mainP, depthP, signP, blurP, compP;\n      try{ mainP=prog(VS,FS); depthP=prog(DVS,DFS); signP=prog(SVS,SFS); blurP=prog(PVS,BLURFS); compP=prog(PVS,COMPFS); }\n      catch(err){ if(window.console)console.error('[diorama] shader',(err&&err.message)||String(err)); return {destroy:function(){}}; }\n\n      var cubeVBO=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,cubeVBO); gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(CUBE),gl.STATIC_DRAW);\n      function instData(list){ var a=[]; list.forEach(function(o){ a.push(o.p[0],o.p[1],o.p[2],o.s[0],o.s[1],o.s[2],o.c[0],o.c[1],o.c[2],o.win,o.seed||0); }); return new Float32Array(a); }\n      function buildVAO(list){\n        var vao=gl.createVertexArray(); gl.bindVertexArray(vao);\n        gl.bindBuffer(gl.ARRAY_BUFFER,cubeVBO);\n        gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,3,gl.FLOAT,false,24,0);\n        gl.enableVertexAttribArray(1); gl.vertexAttribPointer(1,3,gl.FLOAT,false,24,12);\n        var ib=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,ib); gl.bufferData(gl.ARRAY_BUFFER,instData(list),gl.STATIC_DRAW);\n        var S=44;\n        gl.enableVertexAttribArray(2); gl.vertexAttribPointer(2,3,gl.FLOAT,false,S,0);  gl.vertexAttribDivisor(2,1);\n        gl.enableVertexAttribArray(3); gl.vertexAttribPointer(3,3,gl.FLOAT,false,S,12); gl.vertexAttribDivisor(3,1);\n        gl.enableVertexAttribArray(4); gl.vertexAttribPointer(4,3,gl.FLOAT,false,S,24); gl.vertexAttribDivisor(4,1);\n        gl.enableVertexAttribArray(5); gl.vertexAttribPointer(5,1,gl.FLOAT,false,S,36); gl.vertexAttribDivisor(5,1);\n        gl.enableVertexAttribArray(6); gl.vertexAttribPointer(6,1,gl.FLOAT,false,S,40); gl.vertexAttribDivisor(6,1);\n        gl.bindVertexArray(null);\n        return {vao:vao,n:list.length};\n      }\n      var SQ=new Float32Array([-.5,-.5,0,1, .5,-.5,1,1, .5,.5,1,0, -.5,-.5,0,1, .5,.5,1,0, -.5,.5,0,0]);\n      var sqVBO=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,sqVBO); gl.bufferData(gl.ARRAY_BUFFER,SQ,gl.STATIC_DRAW);\n      var sqVAO=gl.createVertexArray(); gl.bindVertexArray(sqVAO); gl.bindBuffer(gl.ARRAY_BUFFER,sqVBO); gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,2,gl.FLOAT,false,16,0); gl.enableVertexAttribArray(1); gl.vertexAttribPointer(1,2,gl.FLOAT,false,16,8); gl.bindVertexArray(null);\n      var quadVBO=gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER,quadVBO); gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),gl.STATIC_DRAW);\n      var quadVAO=gl.createVertexArray(); gl.bindVertexArray(quadVAO); gl.bindBuffer(gl.ARRAY_BUFFER,quadVBO); gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,2,gl.FLOAT,false,0,0); gl.bindVertexArray(null);\n      var carIB=gl.createBuffer();\n      var carVAO=gl.createVertexArray(); gl.bindVertexArray(carVAO);\n      gl.bindBuffer(gl.ARRAY_BUFFER,cubeVBO); gl.enableVertexAttribArray(0); gl.vertexAttribPointer(0,3,gl.FLOAT,false,24,0); gl.enableVertexAttribArray(1); gl.vertexAttribPointer(1,3,gl.FLOAT,false,24,12);\n      gl.bindBuffer(gl.ARRAY_BUFFER,carIB); var CS=44;\n      gl.enableVertexAttribArray(2); gl.vertexAttribPointer(2,3,gl.FLOAT,false,CS,0); gl.vertexAttribDivisor(2,1);\n      gl.enableVertexAttribArray(3); gl.vertexAttribPointer(3,3,gl.FLOAT,false,CS,12); gl.vertexAttribDivisor(3,1);\n      gl.enableVertexAttribArray(4); gl.vertexAttribPointer(4,3,gl.FLOAT,false,CS,24); gl.vertexAttribDivisor(4,1);\n      gl.enableVertexAttribArray(5); gl.vertexAttribPointer(5,1,gl.FLOAT,false,CS,36); gl.vertexAttribDivisor(5,1);\n      gl.enableVertexAttribArray(6); gl.vertexAttribPointer(6,1,gl.FLOAT,false,CS,40); gl.vertexAttribDivisor(6,1);\n      gl.bindVertexArray(null);\n\n      function signTex(s){\n        var W=s.port?230:400, H=s.port?432:270;\n        var cv=document.createElement('canvas'); cv.width=W; cv.height=H; var x=cv.getContext('2d');\n        var col='rgb('+Math.round(s.c[0]*255)+','+Math.round(s.c[1]*255)+','+Math.round(s.c[2]*255)+')';\n        var m=24, rr=26;\n        function rrect(){ x.beginPath(); x.moveTo(m+rr,m); x.arcTo(W-m,m,W-m,H-m,rr); x.arcTo(W-m,H-m,m,H-m,rr); x.arcTo(m,H-m,m,m,rr); x.arcTo(m,m,W-m,m,rr); x.closePath(); }\n        rrect(); x.fillStyle='rgba(9,10,14,0.74)'; x.fill();\n        x.shadowColor=col; x.strokeStyle=col; x.shadowBlur=22; x.lineWidth=9; rrect(); x.stroke(); rrect(); x.stroke();\n        x.shadowBlur=3; x.strokeStyle='rgba(255,255,255,0.85)'; x.lineWidth=2.4; rrect(); x.stroke(); x.shadowBlur=0;\n        x.textAlign='center'; x.textBaseline='middle';\n        function glow(txt,px,py,fs){ x.font='600 '+fs+'px '+CJK; x.shadowColor=col; x.fillStyle=col; x.shadowBlur=fs*0.55; x.fillText(txt,px,py); x.fillText(txt,px,py); x.shadowBlur=fs*0.1; x.fillStyle='#ffffff'; x.fillText(txt,px,py); }\n        function fitFs(txt,fs,maxw){ x.font='600 '+fs+'px '+CJK; var tw=x.measureText(txt||'').width; if(tw>maxw) return Math.max(12,Math.floor(fs*maxw/tw)); return fs; }\n        if(s.port){ var ch=(s.k||'').split(''), n=Math.max(1,ch.length), step=Math.min(74,(H-150)/n);\n          for(var i=0;i<n;i++) glow(ch[i], W/2, 66+step*(i+0.5), Math.round(step*0.78)); glow(s.n, W/2, H-46, fitFs(s.n,24,W-46));\n        } else { glow(s.k, W/2, H*0.38, 92); glow(s.n, W/2, H*0.76, fitFs(s.n,36,W-70)); }\n        var t=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,t); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,false);\n        gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,cv);\n        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE); return t;\n      }\n      function signModel(s){ var px=s.p[0],py=s.p[1],pz=s.p[2],w=s.w,h=s.h;\n        if(s.axis==='z') return new Float32Array([w,0,0,0, 0,h,0,0, 0,0,1,0, px,py,pz,1]);\n        return new Float32Array([0,0,-w,0, 0,h,0,0, 1,0,0,0, px,py,pz,1]); }\n      function signBack(s){ if(s.axis==='z') return {p:[s.p[0],s.p[1],s.p[2]-0.07],s:[s.w*1.04,s.h*1.04,0.12],c:[.05,.05,.07],win:0,g:0,seed:0};\n        return {p:[s.p[0]-0.07,s.p[1],s.p[2]],s:[0.12,s.h*1.04,s.w*1.04],c:[.05,.05,.07],win:0,g:0,seed:0}; }\n\n      var boxGeo, signList=[], lampList=[], carState=[], lastT=0, beaconList=[];\n      function loadScene(sc){ var boxes=sc.boxes.slice(); sc.signs.forEach(function(s){ boxes.push(signBack(s)); }); boxGeo=buildVAO(boxes);\n        signList=sc.signs.map(function(s){ return {model:signModel(s), tex:signTex(s), p:s.p, c:s.c}; }); lampList=sc.lamps||[];\n        carState=[{d:0,spd:2.6,c:[.2,.36,.72]},{d:11,spd:2.1,c:[.62,.15,.22]},{d:22,spd:2.8,c:[.78,.62,.2]},{d:33,spd:2.3,c:[.75,.3,.55]}]; beaconList=sc.beacons||[]; }\n      loadScene(scene);\n\n      var SM=1024, shDepth=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,shDepth);\n      gl.texImage2D(gl.TEXTURE_2D,0,gl.DEPTH_COMPONENT24,SM,SM,0,gl.DEPTH_COMPONENT,gl.UNSIGNED_INT,null);\n      gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);\n      var shColorRB=gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER,shColorRB); gl.renderbufferStorage(gl.RENDERBUFFER,gl.RGBA8,SM,SM);\n      var shFBO=gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER,shFBO); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.DEPTH_ATTACHMENT,gl.TEXTURE_2D,shDepth,0); gl.framebufferRenderbuffer(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.RENDERBUFFER,shColorRB); gl.bindFramebuffer(gl.FRAMEBUFFER,null);\n\n      var sceneFBO,sceneTex,sceneRB,bloomFBO=[],bloomTex=[],fbw=0,fbh=0,bw=0,bh=0;\n      function mktex(w,h){ var t=gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D,t); gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,w,h,0,gl.RGBA,gl.UNSIGNED_BYTE,null); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE); return t; }\n      function allocFBO(w,h){ fbw=Math.floor(w*1.35); fbh=Math.floor(h*1.35); bw=Math.max(1,fbw>>1); bh=Math.max(1,fbh>>1);\n        sceneTex=mktex(fbw,fbh); sceneRB=gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER,sceneRB); gl.renderbufferStorage(gl.RENDERBUFFER,gl.DEPTH_COMPONENT16,fbw,fbh);\n        sceneFBO=gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER,sceneFBO); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,sceneTex,0); gl.framebufferRenderbuffer(gl.FRAMEBUFFER,gl.DEPTH_ATTACHMENT,gl.RENDERBUFFER,sceneRB);\n        bloomTex=[mktex(bw,bh),mktex(bw,bh)]; bloomFBO=[gl.createFramebuffer(),gl.createFramebuffer()];\n        for(var i=0;i<2;i++){ gl.bindFramebuffer(gl.FRAMEBUFFER,bloomFBO[i]); gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,bloomTex[i],0); }\n        gl.bindFramebuffer(gl.FRAMEBUFFER,null); }\n\n      function mul(a,b){ var o=new Float32Array(16); for(var c=0;c<4;c++)for(var r=0;r<4;r++){ var s=0; for(var k=0;k<4;k++)s+=a[k*4+r]*b[c*4+k]; o[c*4+r]=s; } return o; }\n      function ortho(l,r,b,t,n,f){ return new Float32Array([2/(r-l),0,0,0, 0,2/(t-b),0,0, 0,0,-2/(f-n),0, -(r+l)/(r-l),-(t+b)/(t-b),-(f+n)/(f-n),1]); }\n      function lookAt(e,c,u){ var z=[e[0]-c[0],e[1]-c[1],e[2]-c[2]]; var zl=Math.hypot(z[0],z[1],z[2]); z=[z[0]/zl,z[1]/zl,z[2]/zl];\n        var x=[u[1]*z[2]-u[2]*z[1],u[2]*z[0]-u[0]*z[2],u[0]*z[1]-u[1]*z[0]]; var xl=Math.hypot(x[0],x[1],x[2])||1; x=[x[0]/xl,x[1]/xl,x[2]/xl];\n        var y=[z[1]*x[2]-z[2]*x[1],z[2]*x[0]-z[0]*x[2],z[0]*x[1]-z[1]*x[0]];\n        return new Float32Array([x[0],y[0],z[0],0, x[1],y[1],z[1],0, x[2],y[2],z[2],0, -(x[0]*e[0]+x[1]*e[1]+x[2]*e[2]),-(y[0]*e[0]+y[1]*e[1]+y[2]*e[2]),-(z[0]*e[0]+z[1]*e[1]+z[2]*e[2]),1]); }\n      var LVP=mul(ortho(-12,12,-12,12,1,64), lookAt([-13,26,-11],[0,2.8,0],[0,1,0]));\n\n      var P={exp:1.12,sat:1.08,rot:0,zoom:5.6,glow:1.15,bloom:0.9,win:1,plc:1,shad:0.78};\n\n      var uVP=gl.getUniformLocation(mainP,'uVP'), uWinI=gl.getUniformLocation(mainP,'uWinI'), uNL=gl.getUniformLocation(mainP,'uNL'), uLP=gl.getUniformLocation(mainP,'uLP'), uLC=gl.getUniformLocation(mainP,'uLC'), uSh=gl.getUniformLocation(mainP,'uShadow'), uLVPm=gl.getUniformLocation(mainP,'uLVP'), uShAmt=gl.getUniformLocation(mainP,'uShAmt'), uLDir=gl.getUniformLocation(mainP,'uLDir'), uEye=gl.getUniformLocation(mainP,'uEye');\n      var dLVP=gl.getUniformLocation(depthP,'uLVP');\n      var sVP=gl.getUniformLocation(signP,'uVP'), sModel=gl.getUniformLocation(signP,'uModel'), sTex=gl.getUniformLocation(signP,'uTex'), sGlow=gl.getUniformLocation(signP,'uGlow');\n      var bTex=gl.getUniformLocation(blurP,'uTex'), bDir=gl.getUniformLocation(blurP,'uDir'), bBr=gl.getUniformLocation(blurP,'uBright');\n      var cSc=gl.getUniformLocation(compP,'uScene'), cBl=gl.getUniformLocation(compP,'uBloom'), cBi=gl.getUniformLocation(compP,'uBloomI'), cEx=gl.getUniformLocation(compP,'uExp'), cSa=gl.getUniformLocation(compP,'uSat');\n      function flick(tt,i){ var b=0.84+0.16*Math.sin(tt*6.0+i*1.7); var s=Math.sin(tt*41.0+i*3.1)*Math.sin(tt*11.0+i*0.7); return b*((s>0.985)?0.35:1.0); }\n\n      var t0=0, alive=true, raf=0, cw=0, ch=0;\n      function resize(){ var dpr=Math.min(window.devicePixelRatio||1,1.25); var w=Math.max(2,Math.floor(canvas.clientWidth*dpr)), h=Math.max(2,Math.floor(canvas.clientHeight*dpr)); if(canvas.width!==w||canvas.height!==h){ canvas.width=w; canvas.height=h; cw=w; ch=h; allocFBO(w,h); } }\n      function frame(ts){\n        if(!alive||!canvas.isConnected){ alive=false; if(raf)cancelAnimationFrame(raf); return; }\n        if(!t0)t0=ts; var t=(ts-t0)/1000; resize();\n        var dt=Math.min(0.05,Math.max(0,t-lastT)); lastT=t;\n        var tcyc=t%12.0, tRed=(tcyc>=7.5), tYel=(tcyc>=6.0&&tcyc<7.5);\n        var cb=[];\n        for(var ci=0;ci<carState.length;ci++){ var cc=carState[ci]; var stop=false; var dd=((cc.d%RP)+RP)%RP;\n          if((tRed||tYel) && dd>3.3 && dd<4.7) stop=true;\n          for(var cj=0;cj<carState.length;cj++){ if(cj!==ci){ var g2=((carState[cj].d-cc.d)%RP+RP)%RP; if(g2>0.01 && g2<2.3) stop=true; } }\n          if(!stop) cc.d+=cc.spd*dt;\n          var rp=ringPos(cc.d); car(cb,rp[0],rp[1],cc.c,rp[2],rp[3]); }\n        var toff=[.02,.02,.03];\n        cb.push(em([-3.0,2.82,5.62],[0.14,0.14,0.06],tRed?[1.,.16,.12]:toff));\n        cb.push(em([-3.0,2.68,5.62],[0.14,0.14,0.06],tYel?[1.,.78,.16]:toff));\n        cb.push(em([-3.0,2.54,5.62],[0.14,0.14,0.06],(!tRed&&!tYel)?[.2,1.,.32]:toff));\n        var bon=(t%1.4)<0.55;\n        for(var bi=0;bi<beaconList.length;bi++){ var bp=beaconList[bi]; cb.push(em([bp[0],bp[1],bp[2]],[0.1,0.1,0.1], bon?[1.,.09,.06]:[.03,.006,.006])); }\n        gl.bindBuffer(gl.ARRAY_BUFFER,carIB); gl.bufferData(gl.ARRAY_BUFFER,instData(cb),gl.DYNAMIC_DRAW); var carN=cb.length;\n        var W=cw,H=ch, asp=W/H, z=P.zoom;\n        var ang=0.72+Math.sin(t*0.12*P.rot)*0.28;\n        var dist=40, eye=[Math.sin(ang)*dist,dist*0.72,Math.cos(ang)*dist], ctr=[0,2.6,0];\n        var VP=mul(ortho(-asp*z,asp*z,-z,z,0.1,160), lookAt(eye,ctr,[0,1,0]));\n\n        gl.bindFramebuffer(gl.FRAMEBUFFER,shFBO); gl.viewport(0,0,SM,SM); gl.clear(gl.DEPTH_BUFFER_BIT|gl.COLOR_BUFFER_BIT);\n        gl.useProgram(depthP); gl.uniformMatrix4fv(dLVP,false,LVP); gl.disable(gl.CULL_FACE); gl.enable(gl.DEPTH_TEST); gl.depthMask(true); gl.disable(gl.BLEND);\n        gl.bindVertexArray(boxGeo.vao); gl.drawArraysInstanced(gl.TRIANGLES,0,36,boxGeo.n); if(carN){ gl.bindVertexArray(carVAO); gl.drawArraysInstanced(gl.TRIANGLES,0,36,carN); }\n\n        gl.bindFramebuffer(gl.FRAMEBUFFER,sceneFBO); gl.viewport(0,0,fbw,fbh);\n        gl.clearColor(0.012,0.016,0.032,1); gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);\n        gl.useProgram(mainP); gl.uniformMatrix4fv(uVP,false,VP); gl.uniform1f(uWinI,P.win); gl.uniformMatrix4fv(uLVPm,false,LVP); gl.uniform1f(uShAmt,P.shad); gl.uniform3f(uLDir,-0.4515,0.8088,-0.3762); gl.uniform3f(uEye,eye[0],eye[1],eye[2]);\n        gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D,shDepth); gl.uniform1i(uSh,1);\n        var sigN=Math.min(signList.length,8), FK=[], LPa=new Float32Array(48), LCa=new Float32Array(48), NLt=0;\n        if(P.plc) for(var li=0;li<sigN;li++){ var sgl=signList[li]; var fk=flick(t,li); FK[li]=fk; var g=P.glow*fk*0.95; LPa[NLt*3]=sgl.p[0];LPa[NLt*3+1]=sgl.p[1];LPa[NLt*3+2]=sgl.p[2]; LCa[NLt*3]=sgl.c[0]*g;LCa[NLt*3+1]=sgl.c[1]*g;LCa[NLt*3+2]=sgl.c[2]*g; NLt++; }\n        for(var la=0; la<lampList.length && NLt<16; la++){ var lpp=lampList[la]; LPa[NLt*3]=lpp[0];LPa[NLt*3+1]=lpp[1];LPa[NLt*3+2]=lpp[2]; LCa[NLt*3]=1.15;LCa[NLt*3+1]=0.78;LCa[NLt*3+2]=0.38; NLt++; }\n        gl.uniform1i(uNL,NLt); gl.uniform3fv(uLP,LPa); gl.uniform3fv(uLC,LCa);\n        gl.enable(gl.DEPTH_TEST); gl.depthMask(true); gl.disable(gl.BLEND); gl.disable(gl.CULL_FACE);\n        gl.bindVertexArray(boxGeo.vao); gl.drawArraysInstanced(gl.TRIANGLES,0,36,boxGeo.n); if(carN){ gl.bindVertexArray(carVAO); gl.drawArraysInstanced(gl.TRIANGLES,0,36,carN); }\n        if(P.plc && signList.length){\n          gl.useProgram(signP); gl.uniformMatrix4fv(sVP,false,VP);\n          gl.enable(gl.BLEND); gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); gl.depthMask(false); gl.bindVertexArray(sqVAO);\n          for(var i=0;i<signList.length;i++){ gl.uniform1f(sGlow,P.glow*(FK[i]||1.0)); gl.uniformMatrix4fv(sModel,false,signList[i].model); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,signList[i].tex); gl.uniform1i(sTex,0); gl.drawArrays(gl.TRIANGLES,0,6); }\n          gl.depthMask(true); gl.disable(gl.BLEND);\n        }\n\n        gl.disable(gl.DEPTH_TEST); gl.bindVertexArray(quadVAO); gl.useProgram(blurP);\n        var src=sceneTex, spread=2.0;\n        for(var it=0;it<3;it++){\n          gl.bindFramebuffer(gl.FRAMEBUFFER,bloomFBO[0]); gl.viewport(0,0,bw,bh); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,src); gl.uniform1i(bTex,0); gl.uniform2f(bDir,spread/bw,0); gl.uniform1f(bBr,it===0?1.0:0.0); gl.drawArrays(gl.TRIANGLES,0,3);\n          gl.bindFramebuffer(gl.FRAMEBUFFER,bloomFBO[1]); gl.viewport(0,0,bw,bh); gl.bindTexture(gl.TEXTURE_2D,bloomTex[0]); gl.uniform2f(bDir,0,spread/bh); gl.uniform1f(bBr,0.0); gl.drawArrays(gl.TRIANGLES,0,3); src=bloomTex[1];\n        }\n\n        gl.bindFramebuffer(gl.FRAMEBUFFER,null); gl.viewport(0,0,W,H); gl.useProgram(compP);\n        gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D,sceneTex); gl.uniform1i(cSc,0);\n        gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D,bloomTex[1]); gl.uniform1i(cBl,1);\n        gl.uniform1f(cBi,P.bloom); gl.uniform1f(cEx,P.exp); gl.uniform1f(cSa,P.sat); gl.drawArrays(gl.TRIANGLES,0,3);\n        gl.bindVertexArray(null);\n        raf=requestAnimationFrame(frame);\n      }\n      function destroy(){ alive=false; if(raf) cancelAnimationFrame(raf); try{ var lc=gl.getExtension('WEBGL_lose_context'); if(lc) lc.loseContext(); }catch(e){} }\n      raf=requestAnimationFrame(frame);\n      return { destroy: destroy };\n    }\n\n    function renderUniverse(idx){\n      if(!uniBody || !UNIS[idx]) return;\n      currentUni = idx;\n      var u = UNIS[idx];\n      if(uni) uni.style.setProperty(\"--hue\", u.hue);\n      var n = u.comps.length;\n      var hero = '<section class=\"uni-hero\"><div class=\"glow\"></div>'\n        + '<div class=\"uni-eyebrow\">'+L(UNI_META.eyebrow)+'</div>'\n        + '<h1>'+L(u.name)+'</h1>'\n        + '<p class=\"lead\">'+L(u.tagline)+'</p>'\n        + '<div class=\"sysmap gl\"><canvas class=\"dioramaGL\"></canvas></div>'\n        + '<div class=\"sys-hint\">'+L(UNI_META.hint)+'</div></section>';\n      var details=\"\";\n      for(var j=0;j<n;j++){\n        var c=u.comps[j];\n        var pts_html=\"\";\n        for(var p=0;p<c.points.length;p++){ pts_html += '<div class=\"ud-point\"><span class=\"pk\">▸</span><span>'+L(c.points[p])+'</span></div>'; }\n        var res_html=\"\";\n        for(var k=0;k<c.kpis.length;k++){ res_html += '<span class=\"r\"><b>'+esc(c.kpis[k].num)+'</b> <span>'+L(c.kpis[k].cap)+'</span></span>'; }\n        var num = (\"0\"+(j+1)).slice(-2)+\" / \"+(\"0\"+n).slice(-2);\n        details += '<section class=\"uni-detail\" data-i=\"'+j+'\">'\n          + '<div class=\"ud-viz\"><div class=\"iso\">'+isoScene2(parseIso2(detailSpec(u,c,j)))+'</div></div>'\n          + '<div class=\"ud-tx\"><div class=\"ud-num\">'+num+'</div>'\n          + '<div class=\"ud-t\">'+L(c.title)+'</div>'\n          + '<div class=\"ud-d\">'+L(c.desc)+'</div>'\n          + '<div class=\"ud-points\">'+pts_html+'</div>'\n          + '<div class=\"ud-gain\"><div class=\"ug-col ug-old\"><span class=\"ug-k\">'+L(UNI_META.old)+'</span><p>'+L(c.oldModel)+'</p></div>'\n          + '<div class=\"ug-col ug-new\"><span class=\"ug-k\">'+L(UNI_META.wd)+'</span><p>'+L(c.withData2)+'</p></div></div>'\n          + '<div class=\"ud-res\">'+res_html+'</div></div></section>';\n      }\n      var more = '<section class=\"uni-more\"><div class=\"glow\"></div>'\n        + '<h2>'+L(UNI_META.moreH)+'</h2><p>'+L(UNI_META.moreP)+'</p>'\n        + '<div style=\"display:flex;justify-content:center\"><a href=\"#\" class=\"btn\"><span>'+L(UNI_META.demo)+'</span></a></div></section>';\n      uniBody.innerHTML = hero + details + more;\n      if(__dio){ try{__dio.destroy();}catch(e){} __dio=null; }\n      var __glc = uniBody.querySelector(\".dioramaGL\");\n      if(__glc){ try{ __dio = mountDiorama(__glc, dioramaScene(u), {hue:u.hue}); }catch(e){ if(window.console)console.error('[diorama]',e); } }\n      uniBody.querySelectorAll(\".sysmap .comp\").forEach(function(cc){\n        cc.addEventListener(\"click\", function(){\n          var t=uniBody.querySelector('.uni-detail[data-i=\"'+cc.getAttribute(\"data-i\")+'\"]');\n          if(t && uniScroll) uniScroll.scrollTo({top:t.offsetTop-24, behavior:\"smooth\"});\n        });\n      });\n    }\n    function openUni(i){ if(!uni) return; renderUniverse(i); uni.classList.add(\"on\"); if(uniScroll) uniScroll.scrollTop=0; }\n    function closeUni(){ if(uni) uni.classList.remove(\"on\"); if(__dio){ try{__dio.destroy();}catch(e){} __dio=null; } }\n    gcards.forEach(function(g,i){ g.addEventListener(\"click\", function(){ openUni(i); }); });\n    var uclose = root.querySelector(\"#uniClose\"); if(uclose) uclose.addEventListener(\"click\", closeUni);\n    window.addEventListener(\"keydown\", function(e){ if(e.key===\"Escape\") closeUni(); });\n    window.__reRenderUni = function(){ if(uni && uni.classList.contains(\"on\") && currentUni>=0) renderUniverse(currentUni); };\n\n    applyLang(\"pt\");\n    renderProduct();\n  }\n}","at":"2026-08-04T17:39:56.317Z"}}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a62f79d0d98113faa410c03","component":"data2-core-primitives@Artboard","system":"618d6a444e43970b360badd6","displayName":"Home v2","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Home v2"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":-1265,"y":-527,"exactX":-1264.96,"exactY":-526.86}}},"reference":"9P_hjdNlTG0Kcd1dl_koD"},{"_id":"c0ace8c12ff311e51870eb0f","parent":"6a62f79d0d98113faa410c03","component":"www@d2sitev2","system":"618d6a444e43970b360badd6","displayName":"d2sitev2","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"Pe0_x4pK9LlwptBzey4iT"}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a62fccefd7945abd1edc3c6","displayName":"Data² — new-www","reference":"y3FQHC1STcNLFsGXpm6IV","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"Data² — new-www"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"Data² — new-www"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"new-www"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"9P_hjdNlTG0Kcd1dl_koD"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"618d6a444e43970b360badd6","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}