{"context":{"domain":"808"},"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":"5fc04081c8da12be8b503153","name":"808","domain":"808","visibility":"public","settings":{"defaultAccessPolicy":"public"},"updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"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":"6ac9d47978f3730f24d5d79a","component":"data2-core-types@Component","system":"5fc04081c8da12be8b503153","params":{"extends":"data2-core-primitives@Block","component":"kMotionEngine","package":"808","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// ─────────────────────────────────────────────────────────────────────────────\n// Motion Engine — data-driven motion video player (GSAP 3 + Three.js r160)\n// A video is a SPEC (JSON stored in a table): theme + channels + frames.\n// Each frame picks a STYLE (preset) from the registry, a BACKGROUND (3D scene\n// or media) and a TRANSITION into the next frame. The engine compiles the\n// spec into one GSAP master timeline (scrub-safe) and renders 3D with Three.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst GSAP_SPEC = { url: 'https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js', global: 'gsap' };\nconst THREE_SPEC = 'https://cdnjs.cloudflare.com/ajax/libs/three.js/0.160.0/three.module.min.js';\nconst SPEC_VERSION = '1.0';\n\n// ── Channel catalog (spec.channels picks keys; spec.channelDefs can add/override)\nconst CHANNELS = {\n  'youtube':          { name: 'YouTube · 16:9',        w: 1920, h: 1080, safe: { t: 60,  b: 60,  l: 80,  r: 80  }, maxDurationMs: 0,     loop: false },\n  'linkedin':         { name: 'LinkedIn · 1:1',        w: 1080, h: 1080, safe: { t: 60,  b: 60,  l: 60,  r: 60  }, maxDurationMs: 0,     loop: false },\n  'instagram-feed':   { name: 'Instagram feed · 4:5',  w: 1080, h: 1350, safe: { t: 80,  b: 80,  l: 60,  r: 60  }, maxDurationMs: 0,     loop: false },\n  'instagram-reels':  { name: 'Reels / Stories · 9:16',w: 1080, h: 1920, safe: { t: 220, b: 420, l: 60,  r: 60  }, maxDurationMs: 90000, loop: false },\n  'tiktok':           { name: 'TikTok · 9:16',         w: 1080, h: 1920, safe: { t: 200, b: 440, l: 60,  r: 120 }, maxDurationMs: 0,     loop: false },\n  'whatsapp-status':  { name: 'WhatsApp Status · 9:16',w: 1080, h: 1920, safe: { t: 200, b: 300, l: 60,  r: 60  }, maxDurationMs: 30000, loop: false },\n  'x-twitter':        { name: 'X · 16:9',              w: 1600, h: 900,  safe: { t: 50,  b: 50,  l: 70,  r: 70  }, maxDurationMs: 0,     loop: false },\n  'ooh-landscape':    { name: 'OOH painel · 16:9',     w: 1920, h: 1080, safe: { t: 80,  b: 80,  l: 100, r: 100 }, maxDurationMs: 10000, loop: true  },\n  'ooh-portrait':     { name: 'OOH totem · 9:16',      w: 1080, h: 1920, safe: { t: 120, b: 120, l: 80,  r: 80  }, maxDurationMs: 10000, loop: true  },\n  'email':            { name: 'E-mail · hero 16:9',    w: 1200, h: 675,  safe: { t: 40,  b: 40,  l: 60,  r: 60  }, maxDurationMs: 0,     loop: false, static: true }\n};\n\n// ── tiny DOM / math helpers\nconst H = {\n  el(tag, cls, html) { const e = document.createElement(tag); if (cls) e.className = cls; if (html != null) e.innerHTML = html; return e; },\n  esc(s) { return String(s == null ? '' : s).replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c])); },\n  // *emphasis* → <em>, \\n → <br>\n  rich(s) { return H.esc(s).replace(/\\*([^*]+)\\*/g, '<em>$1</em>').replace(/\\n/g, '<br>'); },\n  // split into word spans (keeps <em> and <br>)\n  words(s) {\n    const html = H.rich(s);\n    return html.split(/(<br>)/).map(seg => seg === '<br>' ? '<br>' :\n      seg.split(/(\\s+)/).filter(Boolean).map(w => /^\\s+$/.test(w) ? ' ' :\n        '<span class=\"w\"><span class=\"wi\">' + w + '</span></span>').join('')).join('');\n  },\n  chars(s) { return Array.from(String(s)).map(c => c === ' ' ? '<span class=\"c sp\">&nbsp;</span>' : '<span class=\"c\">' + H.esc(c) + '</span>').join(''); },\n  clamp(v, a, b) { return Math.max(a, Math.min(b, v)); },\n  lerp(a, b, t) { return a + (b - a) * t; },\n  rnd(a, b) { return a + Math.random() * (b - a); },\n  hex(c) { // css color → THREE int (accepts #rgb, #rrggbb, rgb(a))\n    if (typeof c === 'number') return c;\n    c = String(c || '#ffffff').trim();\n    if (c[0] === '#') { let h = c.slice(1); if (h.length === 3) h = h.split('').map(x => x + x).join(''); return parseInt(h.slice(0, 6), 16); }\n    const m = c.match(/(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/); if (m) return (+m[1] << 16) | (+m[2] << 8) | (+m[3]);\n    return 0xffffff;\n  },\n  fmtTime(s) { s = Math.max(0, s || 0); const m = Math.floor(s / 60), r = s - m * 60; return m + ':' + (r < 10 ? '0' : '') + r.toFixed(1); },\n  fontUrl(fonts) {\n    const fams = []; Object.keys(fonts || {}).forEach(k => { const f = fonts[k]; if (f && f.google !== false && f.family) { const ws = (f.weights || [f.weight || 400]); const axis = f.italic ? ':ital,wght@' + ws.map(w => '0,' + w).concat(ws.map(w => '1,' + w)).join(';') : ':wght@' + ws.join(';'); fams.push('family=' + encodeURIComponent(f.family).replace(/%20/g, '+') + axis); } });\n    return fams.length ? 'https://fonts.googleapis.com/css2?' + fams.join('&') + '&display=swap' : null;\n  },\n  ensureFonts(url) { // font-face must live in the document (not the shadow root) to register\n    if (!url || typeof document === 'undefined') return;\n    const id = 'me-fonts-' + url.replace(/\\W+/g, '').slice(-40);\n    if (!document.getElementById(id)) { const l = document.createElement('link'); l.id = id; l.rel = 'stylesheet'; l.href = url; document.head.appendChild(l); }\n  },\n  mediaType(m) { if (!m) return null; if (m.type) return m.type; const s = String(m.src || m); return /\\.(mp4|webm|mov|m4v)(\\?|$)/i.test(s) ? 'video' : 'image'; }\n};\n\n// ── Enter / exit animations (targets = element or NodeList/array). Durations in s.\nconst ANIM = {\n  in: {\n    fade:    (g, tl, t, o = {}, at) => tl.from(t, { opacity: 0, duration: o.d || .8, ease: o.ease || 'power2.out', stagger: o.stagger || 0 }, at),\n    rise:    (g, tl, t, o = {}, at) => tl.from(t, { yPercent: 110, opacity: 0, duration: o.d || .9, ease: o.ease || 'expo.out', stagger: o.stagger ?? .05 }, at),\n    fall:    (g, tl, t, o = {}, at) => tl.from(t, { yPercent: -110, opacity: 0, duration: o.d || .9, ease: o.ease || 'expo.out', stagger: o.stagger ?? .05 }, at),\n    slam:    (g, tl, t, o = {}, at) => tl.from(t, { scale: o.from || 2.6, opacity: 0, duration: o.d || .55, ease: o.ease || 'expo.out', stagger: o.stagger ?? .08, transformOrigin: '50% 50%' }, at),\n    pop:     (g, tl, t, o = {}, at) => tl.from(t, { scale: .4, opacity: 0, duration: o.d || .7, ease: o.ease || 'back.out(2.2)', stagger: o.stagger ?? .06 }, at),\n    zoom:    (g, tl, t, o = {}, at) => tl.from(t, { scale: o.from || .7, opacity: 0, duration: o.d || 1.1, ease: o.ease || 'expo.out', stagger: o.stagger || 0 }, at),\n    tracking:(g, tl, t, o = {}, at) => tl.from(t, { letterSpacing: o.from || '.6em', opacity: 0, duration: o.d || 1.2, ease: o.ease || 'expo.out' }, at),\n    flipX:   (g, tl, t, o = {}, at) => tl.from(t, { rotationX: o.deg || 90, opacity: 0, transformOrigin: '50% 100%', duration: o.d || .9, ease: o.ease || 'expo.out', stagger: o.stagger ?? .07 }, at),\n    flipY:   (g, tl, t, o = {}, at) => tl.from(t, { rotationY: o.deg || -70, opacity: 0, transformOrigin: '0% 50%', duration: o.d || 1, ease: o.ease || 'expo.out', stagger: o.stagger ?? .07 }, at),\n    mask:    (g, tl, t, o = {}, at) => tl.fromTo(t, { clipPath: o.dir === 'up' ? 'inset(100% 0 0 0)' : o.dir === 'down' ? 'inset(0 0 100% 0)' : 'inset(0 100% 0 0)' }, { clipPath: 'inset(0 0 0 0)', duration: o.d || 1, ease: o.ease || 'expo.inOut', stagger: o.stagger || 0 }, at),\n    slideL:  (g, tl, t, o = {}, at) => tl.from(t, { xPercent: -40, opacity: 0, duration: o.d || .9, ease: o.ease || 'expo.out', stagger: o.stagger || 0 }, at),\n    slideR:  (g, tl, t, o = {}, at) => tl.from(t, { xPercent: 40, opacity: 0, duration: o.d || .9, ease: o.ease || 'expo.out', stagger: o.stagger || 0 }, at),\n    draw:    (g, tl, t, o = {}, at) => tl.from(t, { scaleX: 0, transformOrigin: '0% 50%', duration: o.d || .9, ease: o.ease || 'expo.inOut', stagger: o.stagger || 0 }, at),\n    typewriter:(g, tl, t, o = {}, at) => tl.from(t, { opacity: 0, duration: .01, stagger: o.stagger ?? .035 }, at),\n    blurIn:  (g, tl, t, o = {}, at) => tl.from(t, { opacity: 0, filter: 'blur(18px)', scale: 1.08, duration: o.d || 1, ease: o.ease || 'power3.out', stagger: o.stagger || 0 }, at),\n    scramble:(g, tl, t, o = {}, at) => { // resolves random glyphs into the final text\n      const els = (t instanceof Element) ? [t] : Array.from(t);\n      els.forEach((el, i) => {\n        const final = el.textContent, glyphs = '#@%&*01XZK<>/'; const st = { p: 0 };\n        tl.to(st, { p: 1, duration: o.d || 1.1, ease: 'power2.out', onUpdate() { let out = ''; for (let k = 0; k < final.length; k++) { const ch = final[k]; out += ch === ' ' ? ' ' : (k / final.length < st.p ? ch : glyphs[(Math.random() * glyphs.length) | 0]); } el.textContent = out; }, onComplete() { el.textContent = final; } }, (at || 0) + i * (o.stagger ?? .12));\n      });\n      return tl;\n    },\n    countUp: (g, tl, t, o = {}, at) => { // data-to on each el\n      const els = (t instanceof Element) ? [t] : Array.from(t);\n      els.forEach((el, i) => { const to = +el.dataset.to || 0, dec = +(el.dataset.dec || 0), pre = el.dataset.pre || '', suf = el.dataset.suf || ''; const st = { v: 0 };\n        tl.to(st, { v: to, duration: o.d || 1.6, ease: o.ease || 'expo.out', onUpdate() { el.textContent = pre + st.v.toFixed(dec).replace('.', ',') + suf; } }, (at || 0) + i * (o.stagger ?? .15)); });\n      return tl;\n    }\n  },\n  out: {\n    fade:    (g, tl, t, o = {}, at) => tl.to(t, { opacity: 0, duration: o.d || .5, ease: o.ease || 'power2.in', stagger: o.stagger || 0 }, at),\n    drop:    (g, tl, t, o = {}, at) => tl.to(t, { yPercent: 60, opacity: 0, duration: o.d || .5, ease: o.ease || 'power3.in', stagger: o.stagger ?? .03 }, at),\n    lift:    (g, tl, t, o = {}, at) => tl.to(t, { yPercent: -60, opacity: 0, duration: o.d || .5, ease: o.ease || 'power3.in', stagger: o.stagger ?? .03 }, at),\n    shrink:  (g, tl, t, o = {}, at) => tl.to(t, { scale: .85, opacity: 0, duration: o.d || .5, ease: o.ease || 'power3.in', stagger: o.stagger || 0 }, at),\n    grow:    (g, tl, t, o = {}, at) => tl.to(t, { scale: 1.25, opacity: 0, duration: o.d || .5, ease: o.ease || 'power3.in', stagger: o.stagger || 0 }, at),\n    maskOut: (g, tl, t, o = {}, at) => tl.to(t, { clipPath: o.dir === 'up' ? 'inset(0 0 100% 0)' : 'inset(0 0 0 100%)', duration: o.d || .6, ease: o.ease || 'expo.in', stagger: o.stagger || 0 }, at),\n    flipOut: (g, tl, t, o = {}, at) => tl.to(t, { rotationX: -90, opacity: 0, transformOrigin: '50% 0%', duration: o.d || .6, ease: o.ease || 'power3.in', stagger: o.stagger ?? .04 }, at),\n    slideOutL:(g, tl, t, o = {}, at) => tl.to(t, { xPercent: -30, opacity: 0, duration: o.d || .5, ease: o.ease || 'power3.in', stagger: o.stagger || 0 }, at),\n    scatter: (g, tl, t, o = {}, at) => tl.to(t, { x: () => H.rnd(-220, 220), y: () => H.rnd(-160, 160), rotation: () => H.rnd(-40, 40), opacity: 0, duration: o.d || .6, ease: 'power3.in', stagger: { each: o.stagger ?? .02, from: 'random' } }, at)\n  }\n};\n\n// ── 3D background scenes (Three.js) — matte, studio-lit, slow. make(T, ctx, params) → { scene, camera, baseZ, baseFov, update(t,dt), dispose() }\nfunction mkCam(T, ctx, z, fov) { const c = new T.PerspectiveCamera(fov || 40, ctx.W / ctx.H, .1, 900); c.position.set(0, 0, z == null ? 60 : z); return c; }\nfunction studioLights(T, scene, ctx, k) {\n  k = k || 1;\n  scene.add(new T.AmbientLight(0xffffff, .22 * k));\n  const key = new T.DirectionalLight(0xffffff, 2.6 * k); key.position.set(18, 26, 30);\n  const fill = new T.DirectionalLight(0xffffff, .55 * k); fill.position.set(-30, 4, 18);\n  const rim = new T.DirectionalLight(ctx.col.accent, .5 * k); rim.position.set(-14, 10, -30);\n  scene.add(key, fill, rim); return { key, fill, rim };\n}\nfunction matte(T, ctx, tint) { return new T.MeshStandardMaterial({ color: tint == null ? 0xe8e4dc : tint, roughness: .58, metalness: .06 }); }\nfunction shadowDisc(T, r) { // soft contact shadow: radial gradient on a canvas texture\n  const c = document.createElement('canvas'); c.width = c.height = 256; const g = c.getContext('2d'); const grd = g.createRadialGradient(128, 128, 10, 128, 128, 128); grd.addColorStop(0, 'rgba(0,0,0,.55)'); grd.addColorStop(1, 'rgba(0,0,0,0)'); g.fillStyle = grd; g.fillRect(0, 0, 256, 256);\n  const tex = new T.CanvasTexture(c); const m = new T.Mesh(new T.PlaneGeometry(r * 2, r * 2), new T.MeshBasicMaterial({ map: tex, transparent: true, depthWrite: false })); m.rotation.x = -Math.PI / 2; return m;\n}\nfunction dotTex(T) { const c = document.createElement('canvas'); c.width = c.height = 64; const g = c.getContext('2d'); const grd = g.createRadialGradient(32, 32, 2, 32, 32, 30); grd.addColorStop(0, 'rgba(255,255,255,1)'); grd.addColorStop(.55, 'rgba(255,255,255,.55)'); grd.addColorStop(1, 'rgba(255,255,255,0)'); g.fillStyle = grd; g.fillRect(0, 0, 64, 64); return new T.CanvasTexture(c); }\nfunction disposeScene(scene) { scene.traverse(o => { if (o.geometry) o.geometry.dispose(); if (o.material) (Array.isArray(o.material) ? o.material : [o.material]).forEach(m => { if (m.map) m.map.dispose(); m.dispose(); }); }); }\nfunction digitsGroup(T, mat, text) {\n  const grp = new T.Group(); const cw = 22, gap = 5; const total = text.length * cw + (text.length - 1) * gap;\n  Array.from(text).forEach((ch, i) => { const g = new T.Group(); g.position.x = -total / 2 + cw / 2 + i * (cw + gap);\n    if (ch === '8') { const a = new T.Mesh(new T.TorusGeometry(5.6, 2.3, 40, 96), mat); a.position.y = 6.3; const b = new T.Mesh(new T.TorusGeometry(6.6, 2.5, 40, 96), mat); b.position.y = -7.1; g.add(a, b); }\n    else if (ch === '0' || ch === 'O') { const o = new T.Mesh(new T.TorusGeometry(7.6, 2.6, 40, 96), mat); o.scale.y = 1.55; g.add(o); }\n    else if (ch === '1' || ch === 'I') { g.add(new T.Mesh(new T.CylinderGeometry(2.4, 2.4, 22, 48), mat)); }\n    else { g.add(new T.Mesh(new T.BoxGeometry(12, 20, 5), mat)); }\n    grp.add(g); });\n  return grp;\n}\n\nconst SCENES = {\n  studio: { name: 'Estúdio', desc: 'Um objeto fosco sob luz de estúdio, girando devagar fora do centro (dígitos, esfera, placa ou anel)', params: { shape: 'digits', text: '808', x: 16, scale: 1 },\n    make(T, ctx, p) {\n      p = p || {}; const scene = new T.Scene(); scene.fog = new T.Fog(ctx.col.bg, 70, 160); const camera = mkCam(T, ctx, 78, 38); camera.position.y = 2; camera.lookAt(0, 0, 0);\n      studioLights(T, scene, ctx, 1); const mat = matte(T, ctx); let obj;\n      const shape = p.shape || 'digits';\n      if (shape === 'sphere') obj = new T.Mesh(new T.SphereGeometry(13, 96, 96), mat);\n      else if (shape === 'slab') obj = new T.Mesh(new T.BoxGeometry(14, 30, 2.4), mat);\n      else if (shape === 'ring') obj = new T.Mesh(new T.TorusGeometry(13, 1.4, 48, 160), mat);\n      else obj = digitsGroup(T, mat, String(p.text || '808'));\n      const grp = new T.Group(); grp.add(obj); const s = p.scale || 1; grp.scale.setScalar(s); const ox = (ctx.orient === 'landscape' ? (p.x != null ? p.x : 16) : 0), oy = ctx.orient === 'landscape' ? 0 : (p.y != null ? p.y : 10); grp.position.set(ox, oy, 0); scene.add(grp);\n      const sh = shadowDisc(T, 26 * s); sh.position.set(ox, -19 * s, 0); scene.add(sh);\n      return { scene, camera, baseZ: 78, baseFov: 38, update(t) { obj.rotation.y = t * .12; obj.rotation.x = Math.sin(t * .17) * .06; grp.position.y = oy + Math.sin(t * .35) * .5; }, dispose() { disposeScene(scene); } };\n    } },\n  dust: { name: 'Poeira', desc: 'Partículas finas e discretas em profundidade, deriva lenta', params: { count: 700 },\n    make(T, ctx, p) {\n      p = p || {}; const scene = new T.Scene(); scene.fog = new T.FogExp2(ctx.col.bg, .012); const camera = mkCam(T, ctx, 60, 40);\n      const n = p.count || 700, pos = new Float32Array(n * 3); for (let i = 0; i < n; i++) { pos[i * 3] = H.rnd(-80, 80); pos[i * 3 + 1] = H.rnd(-45, 45); pos[i * 3 + 2] = H.rnd(-90, 30); }\n      const g = new T.BufferGeometry(); g.setAttribute('position', new T.BufferAttribute(pos, 3));\n      const pts = new T.Points(g, new T.PointsMaterial({ color: ctx.col.ink, size: 1.1, map: dotTex(T), alphaTest: .02, transparent: true, opacity: .3, depthWrite: false, sizeAttenuation: true })); scene.add(pts);\n      return { scene, camera, baseZ: 60, baseFov: 40, update(t) { pts.rotation.y = t * .012; pts.position.y = Math.sin(t * .08) * 2; }, dispose() { disposeScene(scene); } };\n    } },\n  lines: { name: 'Linhas', desc: 'Grade arquitetônica de fios finos em perspectiva, quase imóvel', params: { opacity: .14 },\n    make(T, ctx, p) {\n      p = p || {}; const scene = new T.Scene(); scene.fog = new T.Fog(ctx.col.bg, 40, 260); const camera = mkCam(T, ctx, 40, 50); camera.position.y = 6; camera.lookAt(0, -6, -80);\n      const v = []; const S = 12; for (let x = -180; x <= 180; x += S) v.push(x, 0, -300, x, 0, 30); for (let z = -300; z <= 30; z += S) v.push(-180, 0, z, 180, 0, z);\n      const g = new T.BufferGeometry(); g.setAttribute('position', new T.Float32BufferAttribute(v, 3));\n      const grid = new T.LineSegments(g, new T.LineBasicMaterial({ color: ctx.col.ink, transparent: true, opacity: p.opacity != null ? p.opacity : .14 })); grid.position.y = -16; scene.add(grid);\n      return { scene, camera, baseZ: 40, baseFov: 50, update(t) { grid.position.z = (t * 1.2) % S; grid.rotation.z = Math.sin(t * .05) * .01; }, dispose() { disposeScene(scene); } };\n    } },\n  ribbon: { name: 'Película', desc: 'Uma fita fosca ondulando lentamente sob luz de estúdio', params: { amp: 1 },\n    make(T, ctx, p) {\n      p = p || {}; const scene = new T.Scene(); scene.fog = new T.Fog(ctx.col.bg, 60, 180); const camera = mkCam(T, ctx, 70, 38); camera.position.y = 4; camera.lookAt(0, -2, 0);\n      studioLights(T, scene, ctx, .9); const geo = new T.PlaneGeometry(150, 9, 240, 1); const orig = geo.attributes.position.array.slice();\n      const m = new T.Mesh(geo, new T.MeshStandardMaterial({ color: 0x6b6763, roughness: .66, metalness: .04, side: T.DoubleSide })); m.position.set(0, -24, -14); m.rotation.x = -.42; scene.add(m);\n      const pa = geo.attributes.position; const a = p.amp || 1;\n      return { scene, camera, baseZ: 70, baseFov: 38, update(t) { for (let i = 0; i < pa.count; i++) { const x = orig[i * 3]; pa.array[i * 3 + 1] = orig[i * 3 + 1] + Math.sin(x * .05 + t * .4) * 3 * a; pa.array[i * 3 + 2] = Math.cos(x * .035 - t * .25) * 5 * a; } pa.needsUpdate = true; geo.computeVertexNormals(); m.rotation.z = Math.sin(t * .1) * .05; }, dispose() { disposeScene(scene); } };\n    } },\n  orbit: { name: 'Órbitas', desc: 'Três anéis finos foscos girando como um giroscópio', params: {},\n    make(T, ctx) {\n      const scene = new T.Scene(); scene.fog = new T.Fog(ctx.col.bg, 60, 160); const camera = mkCam(T, ctx, 72, 38); studioLights(T, scene, ctx, .8);\n      const rings = [14, 19, 24].map((r, i) => { const m = new T.Mesh(new T.TorusGeometry(r, .09 + i * .02, 24, 200), matte(T, ctx)); m.rotation.set(H.rnd(0, 3), H.rnd(0, 3), 0); m.userData.sp = [.08 + i * .03, .05 + i * .02]; scene.add(m); return m; });\n      const grp = new T.Group(); rings.forEach(r => grp.add(r)); scene.add(grp); grp.position.x = ctx.orient === 'landscape' ? 14 : 0;\n      return { scene, camera, baseZ: 72, baseFov: 38, update(t, dt) { rings.forEach(r => { r.rotation.x += r.userData.sp[0] * dt; r.rotation.y += r.userData.sp[1] * dt; }); }, dispose() { disposeScene(scene); } };\n    } },\n  sculpt: { name: 'Escultura', desc: 'Poucos sólidos foscos grandes, quase parados, com sombra suave', params: { count: 7 },\n    make(T, ctx, p) {\n      p = p || {}; const scene = new T.Scene(); scene.fog = new T.Fog(ctx.col.bg, 60, 170); const camera = mkCam(T, ctx, 70, 38); camera.position.y = 3; studioLights(T, scene, ctx, 1);\n      const geos = [new T.IcosahedronGeometry(1, 1), new T.BoxGeometry(1, 1, 1), new T.OctahedronGeometry(1, 0), new T.CylinderGeometry(.8, .8, 1.6, 48), new T.SphereGeometry(1, 48, 48)];\n      const grp = new T.Group(); const n = p.count || 7;\n      for (let i = 0; i < n; i++) { const m = new T.Mesh(geos[i % geos.length], matte(T, ctx, 0xdedad2)); const s = H.rnd(5, 11); m.scale.setScalar(s); m.position.set(H.rnd(-36, 36), H.rnd(-14, 16), H.rnd(-40, 0)); m.rotation.set(H.rnd(0, 3), H.rnd(0, 3), 0); m.userData = { rs: [H.rnd(-.08, .08), H.rnd(-.08, .08)], ph: Math.random() * 6 }; grp.add(m); }\n      scene.add(grp);\n      return { scene, camera, baseZ: 70, baseFov: 38, update(t, dt) { grp.rotation.y = t * .02; grp.children.forEach(m => { m.rotation.x += m.userData.rs[0] * dt; m.rotation.y += m.userData.rs[1] * dt; m.position.y += Math.sin(t * .3 + m.userData.ph) * .004; }); }, dispose() { disposeScene(scene); } };\n    } },\n  // backwards-compatible aliases (old neon scenes map to their restrained equivalents)\n  particles: { name: 'Poeira (alias)', desc: 'Alias de dust', params: {}, make(T, ctx, p) { return SCENES.dust.make(T, ctx, p); } },\n  digits: { name: 'Estúdio · dígitos (alias)', desc: 'Alias de studio shape=digits', params: { text: '808' }, make(T, ctx, p) { return SCENES.studio.make(T, ctx, Object.assign({ shape: 'digits' }, p || {})); } },\n  shards: { name: 'Escultura (alias)', desc: 'Alias de sculpt', params: {}, make(T, ctx, p) { return SCENES.sculpt.make(T, ctx, p); } },\n  grid: { name: 'Linhas (alias)', desc: 'Alias de lines', params: {}, make(T, ctx, p) { return SCENES.lines.make(T, ctx, p); } },\n  tunnel: { name: 'Órbitas (alias)', desc: 'Alias de orbit', params: {}, make(T, ctx, p) { return SCENES.orbit.make(T, ctx, p); } },\n  ribbons: { name: 'Película (alias)', desc: 'Alias de ribbon', params: {}, make(T, ctx, p) { return SCENES.ribbon.make(T, ctx, p); } },\n  orbs: { name: 'Poeira (alias)', desc: 'Alias de dust', params: {}, make(T, ctx, p) { return SCENES.dust.make(T, ctx, p); } },\n  terrain: { name: 'Película (alias)', desc: 'Alias de ribbon', params: {}, make(T, ctx, p) { return SCENES.ribbon.make(T, ctx, p); } }\n};\n\n// ── Frame-style building blocks (editorial system: 12-col grid, hairlines, small caps, one accent)\nfunction lbl(ctx, text, cls) { const e = H.el('div', 'lbl ' + (cls || ''), H.esc(text)); e.style.fontSize = ctx.fs(1.15); return e; }\nfunction display(ctx, text, size, cls) { const e = H.el('h1', 'disp ' + (cls || ''), H.words(text)); e.style.fontSize = ctx.fs(size); return e; }\nfunction body(ctx, text, size, cls) { const e = H.el('p', 'body ' + (cls || ''), H.words(text)); e.style.fontSize = ctx.fs(size || 2); return e; }\nfunction serif(ctx, text, size, cls) { const e = H.el('p', 'serif ' + (cls || ''), H.words(text)); e.style.fontSize = ctx.fs(size || 3.4); return e; }\nfunction hair(ctx, cls) { return H.el('div', 'hair ' + (cls || '')); }\nfunction idx(ctx, n, total) { const e = H.el('div', 'lbl idx', H.esc(String(n).padStart(2, '0') + (total ? ' / ' + String(total).padStart(2, '0') : ''))); e.style.fontSize = ctx.fs(1.15); return e; }\nfunction grid12(ctx, cls) { const g = H.el('div', 'g12 ' + (cls || '')); return g; }\nfunction col(ctx, from, to, cls) { const c = H.el('div', 'col ' + (cls || '')); c.style.gridColumn = from + ' / ' + to; return c; }\nfunction mediaEl(ctx, m, opts) {\n  opts = opts || {}; const src = typeof m === 'string' ? m : (m && m.src); const type = H.mediaType(m);\n  let e; if (type === 'video') { e = document.createElement('video'); e.src = src; e.muted = true; e.loop = true; e.playsInline = true; e.setAttribute('playsinline', ''); e.setAttribute('muted', ''); e.preload = 'auto'; if (m && m.poster) e.poster = m.poster; e.dataset.media = '1'; e.dataset.start = (m && m.start) || 0; if (m && m.start) e.addEventListener('loadedmetadata', () => { try { if (!e._on) e.currentTime = +m.start; } catch (err) { } }, { once: true }); }\n  else { e = document.createElement('img'); e.src = src; e.alt = ''; e.decoding = 'async'; }\n  e.className = 'media ' + (opts.cls || ''); e.style.objectFit = opts.fit || 'cover'; e.style.objectPosition = (m && m.focus) || '50% 50%'; return e;\n}\nfunction logoImg(ctx, src, hUnits, white) { const i = document.createElement('img'); i.src = src; i.alt = ''; i.className = 'logo' + (white ? ' white' : ''); i.style.height = ctx.fs(hUnits || 3.4); return i; }\nfunction wiOf(el) { return el.querySelectorAll('.wi'); }\nfunction riseIn(ctx, tl, el, at, o) { return ANIM.in.rise(ctx.g, tl, wiOf(el).length ? wiOf(el) : el, Object.assign({ d: 1.1, stagger: .045, ease: 'expo.out' }, o || {}), at); }\nfunction fadeUp(ctx, tl, el, at, o) { return tl.from(el, Object.assign({ y: ctx.px(1.2), opacity: 0, duration: 1, ease: 'power3.out' }, o || {}), at); }\nfunction drawHair(ctx, tl, el, at, o) { return tl.from(el, Object.assign({ scaleX: 0, duration: 1.2, ease: 'expo.inOut', transformOrigin: '0 50%' }, o || {}), at); }\nfunction tagsLine(ctx, tags) { const e = H.el('div', 'lbl tags'); e.style.fontSize = ctx.fs(1.15); e.innerHTML = (tags || []).map(t => '<span>' + H.esc(t) + '</span>').join('<i></i>'); return e; }\n\n// ── Frame styles registry. build(ctx, frame, inner, tl) — tl is frame-local (0 = frame start)\nconst STYLES = {\n  'montage': { name: 'Montagem', desc: 'Sequência de clipes em tela cheia cortados no ritmo, cada um com cartela cliente · projeto e fio de progresso', fields: { clips: '[{src,start,dur,label,sub,poster,focus}]', cut: 'hard|dissolve', captions: 'boolean', kicker: 'string' }, defaults: { durationMs: 9600, bg: { type: 'color' }, transition: { type: 'cut', durationMs: 0 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const clips = (d.clips || []); const wrap = H.el('div', 'montage'); inner.parentNode.insertBefore(wrap, inner);\n      let t = 0; const dissolve = d.cut === 'dissolve';\n      clips.forEach((c, i) => {\n        const dur = (c.dur != null ? c.dur : 2.4); const el = H.el('div', 'clip'); const v = mediaEl(ctx, { src: c.src, type: 'video', poster: c.poster, start: c.start || 0, focus: c.focus }, { cls: 'clipv' }); v.dataset.clipstart = t.toFixed(3); v.dataset.clipend = (t + dur).toFixed(3); v.preload = 'auto'; el.appendChild(v);\n        if (d.captions !== false && (c.label || c.sub)) { const cap = H.el('div', 'cap'); const bar = hair(ctx); bar.classList.add('capbar'); cap.appendChild(bar); const row = H.el('div', 'row'); if (c.label) row.appendChild(lbl(ctx, c.label)); if (c.label && c.sub) row.appendChild(H.el('i', 'dot')); if (c.sub) row.appendChild(lbl(ctx, c.sub, 'muted')); cap.appendChild(row); el.appendChild(cap);\n          tl.from(row, { y: ctx.px(.8), opacity: 0, duration: .5, ease: 'power3.out' }, t + .15); tl.fromTo(bar, { scaleX: 0 }, { scaleX: 1, duration: Math.max(.2, dur - .15), ease: 'none', transformOrigin: '0 50%' }, t + .15); }\n        wrap.appendChild(el);\n        if (i === 0) { tl.set(el, { opacity: 1 }, 0); } else { tl.fromTo(el, { opacity: 0 }, { opacity: 1, duration: dissolve ? .5 : .01, ease: 'power1.inOut' }, t - (dissolve ? .25 : 0)); tl.set(wrap.children[i - 1], { opacity: 0 }, t + (dissolve ? .3 : .05)); }\n        tl.fromTo(v, { scale: 1.06 }, { scale: 1, duration: dur + .3, ease: 'power1.out' }, t);\n        t += dur;\n      });\n      if (d.kicker) { const g = grid12(ctx, 'vend'); inner.appendChild(g); const c = col(ctx, 1, 13, 'stack'); g.appendChild(c); const k = lbl(ctx, d.kicker); c.appendChild(k); fadeUp(ctx, tl, k, .2); }\n      inner.classList.add('over');\n    } },\n  'logo-reveal': { name: 'Abertura · logo', desc: 'Rótulo, fio, logo revelado por máscara e tagline, alinhados à grade; objeto 3D fosco fora do centro', fields: { logo: 'url', kicker: 'string', tagline: 'string', logoWidth: 'number' }, defaults: { durationMs: 5200, bg: { type: 'scene', scene: 'studio', params: { shape: 'digits', text: '808' } }, transition: { type: 'fade', durationMs: 900 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g); const c = col(ctx, 1, L ? 7 : 13, 'stack'); g.appendChild(c);\n      if (d.kicker) { const k = lbl(ctx, d.kicker); c.appendChild(k); fadeUp(ctx, tl, k, .2); }\n      const h = hair(ctx, 'acc'); h.style.width = ctx.fs(6); c.appendChild(h); drawHair(ctx, tl, h, .35);\n      if (d.logo) { const wrap = H.el('div', 'logowrap'); const img = document.createElement('img'); img.src = d.logo; img.alt = ''; img.className = 'biglogo'; img.style.width = ctx.fs(d.logoWidth || (L ? 30 : 56)); wrap.appendChild(img); c.appendChild(wrap);\n        tl.fromTo(wrap, { clipPath: 'inset(0 100% 0 0)' }, { clipPath: 'inset(0 0% 0 0)', duration: 1.5, ease: 'expo.inOut' }, .5); tl.from(img, { x: -ctx.px(2), duration: 1.5, ease: 'expo.out' }, .5); }\n      if (d.tagline) { const t = body(ctx, d.tagline, L ? 2.3 : 2.9, 'soft'); c.appendChild(t); riseIn(ctx, tl, t, 1.5); }\n    } },\n  'chapter': { name: 'Capítulo', desc: 'Índice fantasma gigante, fio e título', fields: { number: 'string', title: 'string', sub: 'string' }, defaults: { durationMs: 3600, bg: { type: 'color' }, transition: { type: 'dip', durationMs: 800 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vend'); inner.appendChild(g); const c = col(ctx, 1, L ? 10 : 13, 'stack'); g.appendChild(c);\n      const n = H.el('div', 'disp ghost', H.esc(d.number || '01')); n.style.fontSize = ctx.fs(L ? 26 : 30); c.appendChild(n); tl.from(n, { opacity: 0, x: -ctx.px(3), duration: 1.4, ease: 'expo.out' }, 0);\n      const h = hair(ctx, 'acc'); h.style.width = ctx.fs(6); c.appendChild(h); drawHair(ctx, tl, h, .3);\n      const t = display(ctx, d.title || f.name || '', L ? 8 : 10); c.appendChild(t); riseIn(ctx, tl, t, .45);\n      if (d.sub) { const s = body(ctx, d.sub, 2, 'soft'); c.appendChild(s); riseIn(ctx, tl, s, 1); }\n    } },\n  'statement': { name: 'Declaração', desc: 'Frase única em tipografia grande, alinhada à esquerda; *palavras* em destaque no acento', fields: { text: 'string', align: 'left|center', size: 'number', note: 'string' }, defaults: { durationMs: 4600, bg: { type: 'scene', scene: 'lines' }, transition: { type: 'dip', durationMs: 800 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g); const c = col(ctx, 1, L ? 11 : 13, 'stack'); g.appendChild(c);\n      if (d.note) { const k = lbl(ctx, d.note); c.appendChild(k); fadeUp(ctx, tl, k, .1); }\n      const t = display(ctx, d.text || '', d.size || (L ? 7.6 : 9.6)); if (d.align === 'center') { c.style.textAlign = 'center'; c.style.gridColumn = '2 / 12'; } c.appendChild(t); riseIn(ctx, tl, t, .2, { stagger: .05 });\n    } },\n  'title-kinetic': { name: 'Título em linhas', desc: 'Linhas grandes entrando por máscara, com recuo alternado', fields: { lines: 'string[]', kicker: 'string' }, defaults: { durationMs: 4200, bg: { type: 'color' }, transition: { type: 'push', durationMs: 900 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g); const c = col(ctx, 1, 13, 'stack tight'); g.appendChild(c);\n      if (d.kicker) { const k = lbl(ctx, d.kicker); c.appendChild(k); fadeUp(ctx, tl, k, .1); }\n      const lines = d.lines || [f.name || '']; const size = L ? Math.min(11, 30 / lines.length) : Math.min(13, 36 / lines.length);\n      lines.forEach((ln, i) => { const e = H.el('div', 'disp line', H.words(ln)); e.style.fontSize = ctx.fs(size); e.style.paddingLeft = (i % 2 ? ctx.fs(L ? 8 : 4) : 0); c.appendChild(e); riseIn(ctx, tl, e, .25 + i * .18, { stagger: .04 }); });\n    } },\n  'big-number': { name: 'Números', desc: 'Até três colunas com fio, número grande e rótulo em versalete', fields: { items: '[{value,prefix,suffix,label,decimals}]', title: 'string' }, defaults: { durationMs: 5000, bg: { type: 'scene', scene: 'dust' }, transition: { type: 'push', durationMs: 900 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g);\n      if (d.title) { const c0 = col(ctx, 1, 13); const k = lbl(ctx, d.title); c0.appendChild(k); c0.style.marginBottom = ctx.fs(4); g.appendChild(c0); fadeUp(ctx, tl, k, .1); }\n      const items = (d.items || []).slice(0, 3); const span = L ? Math.floor(12 / Math.max(1, items.length)) : 12;\n      items.forEach((it, i) => { const c = L ? col(ctx, 1 + i * span, 1 + (i + 1) * span, 'stack num') : col(ctx, 1, 13, 'stack num'); g.appendChild(c);\n        const h = hair(ctx); c.appendChild(h); const v = H.el('div', 'disp val'); v.style.fontSize = ctx.fs(L ? 12 : 13); v.dataset.to = it.value; v.dataset.dec = it.decimals || 0; v.dataset.pre = it.prefix || ''; v.dataset.suf = it.suffix || ''; v.textContent = (it.prefix || '') + '0' + (it.suffix || ''); c.appendChild(v);\n        const l = lbl(ctx, it.label || ''); c.appendChild(l); drawHair(ctx, tl, h, .2 + i * .15); fadeUp(ctx, tl, v, .35 + i * .15); fadeUp(ctx, tl, l, .5 + i * .15); });\n      ANIM.in.countUp(ctx.g, tl, g.querySelectorAll('.val'), { d: 2, stagger: .15, ease: 'expo.out' }, .4);\n    } },\n  'case-showcase': { name: 'Case', desc: 'Mídia em tela cheia com gradiente, logo do cliente, título e uma linha de texto no canto inferior', fields: { client: 'string', title: 'string', text: 'string', media: '{src,type,poster}', logo: 'url', logoWhite: 'boolean', tags: 'string[]', kicker: 'string' }, defaults: { durationMs: 6000, bg: { type: 'color' }, transition: { type: 'dip', durationMs: 800 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape';\n      if (d.media) { const hero = H.el('div', 'hero'); const m = mediaEl(ctx, d.media, { cls: 'herom' }); hero.appendChild(m); hero.appendChild(H.el('div', 'herograd ' + ctx.orient)); inner.parentNode.insertBefore(hero, inner); tl.fromTo(m, { scale: 1.08 }, { scale: 1, duration: ctx.hold, ease: 'power1.out' }, 0); tl.from(hero, { opacity: 0, duration: 1, ease: 'power2.out' }, 0); }\n      const g = grid12(ctx, 'vend'); inner.appendChild(g); const c = col(ctx, 1, L ? 7 : 13, 'stack'); g.appendChild(c);\n      const head = H.el('div', 'row'); if (d.logo) head.appendChild(logoImg(ctx, d.logo, L ? 2.8 : 3.2, d.logoWhite !== false)); head.appendChild(lbl(ctx, d.kicker || d.client || 'Case')); c.appendChild(head); fadeUp(ctx, tl, head, .4);\n      const t = display(ctx, d.title || '', L ? 6.4 : 8); c.appendChild(t); riseIn(ctx, tl, t, .55);\n      if (d.text) { const b = body(ctx, d.text, L ? 1.9 : 2.4, 'soft'); b.style.maxWidth = L ? '92%' : '100%'; c.appendChild(b); riseIn(ctx, tl, b, 1, { stagger: .02 }); }\n      if (d.tags && d.tags.length) { const h = hair(ctx); c.appendChild(h); const tg = tagsLine(ctx, d.tags); c.appendChild(tg); drawHair(ctx, tl, h, 1.2); fadeUp(ctx, tl, tg, 1.35); }\n    } },\n  'split-media': { name: 'Mídia + texto', desc: 'Mídia em metade da grade revelada por máscara; rótulo, título e texto na outra metade', fields: { kicker: 'string', title: 'string', text: 'string', media: '{src,type}', side: 'left|right' }, defaults: { durationMs: 5600, bg: { type: 'color' }, transition: { type: 'dip', durationMs: 800 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g);\n      const left = d.side === 'left'; const txt = L ? col(ctx, left ? 8 : 1, left ? 13 : 6, 'stack') : col(ctx, 1, 13, 'stack'); const pane = L ? col(ctx, left ? 1 : 7, left ? 7 : 13, 'pane') : col(ctx, 1, 13, 'pane');\n      if (L && left) { g.append(pane, txt); } else if (L) { g.append(txt, pane); } else { g.append(pane, txt); }\n      if (d.media) pane.appendChild(mediaEl(ctx, d.media)); pane.style.aspectRatio = L ? '4 / 3' : '4 / 3';\n      if (d.kicker) { const k = lbl(ctx, d.kicker); txt.appendChild(k); fadeUp(ctx, tl, k, .3); }\n      const h = hair(ctx, 'acc'); h.style.width = ctx.fs(6); txt.appendChild(h); drawHair(ctx, tl, h, .4);\n      const t = display(ctx, d.title || '', L ? 5.6 : 7.2); txt.appendChild(t); riseIn(ctx, tl, t, .5);\n      if (d.text) { const b = body(ctx, d.text, L ? 1.9 : 2.3, 'soft'); txt.appendChild(b); riseIn(ctx, tl, b, 1, { stagger: .02 }); }\n      tl.fromTo(pane, { clipPath: 'inset(100% 0 0 0)' }, { clipPath: 'inset(0 0 0 0)', duration: 1.4, ease: 'expo.inOut' }, .1); const m = pane.querySelector('.media'); if (m) tl.fromTo(m, { scale: 1.15 }, { scale: 1, duration: ctx.hold, ease: 'power1.out' }, 0);\n    } },\n  'mosaic': { name: 'Grade de trabalhos', desc: 'Grade editorial de imagens com legendas em versalete, entrada em cascata', fields: { title: 'string', items: '[{src,label}]' }, defaults: { durationMs: 6000, bg: { type: 'color' }, transition: { type: 'push', durationMs: 900 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const items = (d.items || []).slice(0, 12); const st = H.el('div', 'stack full'); inner.appendChild(st);\n      const head = H.el('div', 'row between'); if (d.title) head.appendChild(lbl(ctx, d.title)); head.appendChild(lbl(ctx, items.length + ' trabalhos')); st.appendChild(head); fadeUp(ctx, tl, head, .1);\n      const h = hair(ctx); st.appendChild(h); drawHair(ctx, tl, h, .2);\n      const cols = L ? 4 : (ctx.orient === 'square' ? 3 : 2); const wrap = H.el('div', 'mosaic'); wrap.style.gridTemplateColumns = 'repeat(' + cols + ',minmax(0,1fr))'; st.appendChild(wrap);\n      items.forEach(it => { const cell = H.el('div', 'cell'); const tile = H.el('div', 'tile'); tile.appendChild(mediaEl(ctx, it.src || it, {})); cell.appendChild(tile); if (it.label) { const c = lbl(ctx, it.label, 'cap'); cell.appendChild(c); } wrap.appendChild(cell); });\n      tl.from(wrap.children, { y: ctx.px(2), opacity: 0, duration: 1.1, ease: 'power3.out', stagger: { each: .06, from: 'start' } }, .35);\n      tl.fromTo(wrap.querySelectorAll('.media'), { scale: 1.08 }, { scale: 1, duration: ctx.hold, ease: 'power1.out', stagger: .02 }, 0);\n    } },\n  'quote': { name: 'Depoimento', desc: 'Citação em serifa itálica alinhada à esquerda, fio e autor em versalete', fields: { quote: 'string', author: 'string', role: 'string', company: 'string' }, defaults: { durationMs: 6000, bg: { type: 'scene', scene: 'ribbon' }, transition: { type: 'fade', durationMs: 900 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g); const c = col(ctx, 1, L ? 10 : 13, 'stack'); g.appendChild(c);\n      const h = hair(ctx, 'acc'); h.style.width = ctx.fs(6); c.appendChild(h); drawHair(ctx, tl, h, .1);\n      const q = serif(ctx, '“' + (d.quote || '') + '”', L ? 3.6 : 4.2); c.appendChild(q); riseIn(ctx, tl, q, .3, { stagger: .03 });\n      const by = H.el('div', 'row'); by.appendChild(lbl(ctx, d.author || '')); if (d.role || d.company) { by.appendChild(H.el('i', 'dot')); by.appendChild(lbl(ctx, [d.role, d.company].filter(Boolean).join(' · '), 'muted')); } c.appendChild(by); fadeUp(ctx, tl, by, 1.6);\n    } },\n  'list': { name: 'Lista', desc: 'Rótulo e título à esquerda; itens numerados com fio à direita (até 6)', fields: { title: 'string', kicker: 'string', items: '[{title,text}]' }, defaults: { durationMs: 5800, bg: { type: 'color' }, transition: { type: 'fade', durationMs: 900 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g); const head = L ? col(ctx, 1, 6, 'stack') : col(ctx, 1, 13, 'stack'); const list = L ? col(ctx, 7, 13, 'items') : col(ctx, 1, 13, 'items'); g.append(head, list);\n      if (d.kicker) { const k = lbl(ctx, d.kicker); head.appendChild(k); fadeUp(ctx, tl, k, .1); }\n      const t = display(ctx, d.title || '', L ? 6.4 : 7.5); head.appendChild(t); riseIn(ctx, tl, t, .2);\n      (d.items || []).slice(0, 6).forEach((it, i) => { const row = H.el('div', 'item'); const n = lbl(ctx, String(i + 1).padStart(2, '0'), 'n'); const c = H.el('div', 'itxt'); const tt = H.el('div', 'ititle', H.esc(it.title || it)); tt.style.fontSize = ctx.fs(L ? 2 : 2.3); c.appendChild(tt); if (it.text) { const tx = H.el('div', 'idesc', H.esc(it.text)); tx.style.fontSize = ctx.fs(L ? 1.3 : 1.5); c.appendChild(tx); } const hr = hair(ctx, 'irule'); row.append(n, c, hr); list.appendChild(row); tl.from(row, { y: ctx.px(1.5), opacity: 0, duration: .9, ease: 'power3.out' }, .35 + i * .1); drawHair(ctx, tl, hr, .45 + i * .1, { duration: 1 }); });\n    } },\n  'logos-wall': { name: 'Clientes', desc: 'Grade limpa de logos monocromáticos com rótulo e fio; entrada em cascata', fields: { title: 'string', logos: 'url[]', white: 'boolean', cols: 'number' }, defaults: { durationMs: 6000, bg: { type: 'color' }, transition: { type: 'wipe', durationMs: 900, dir: 'left' } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const st = H.el('div', 'stack full'); inner.appendChild(st);\n      const head = H.el('div', 'row between'); if (d.title) head.appendChild(lbl(ctx, d.title)); head.appendChild(lbl(ctx, (d.logos || []).length + ' marcas')); st.appendChild(head); fadeUp(ctx, tl, head, .1);\n      const h = hair(ctx); st.appendChild(h); drawHair(ctx, tl, h, .2);\n      const cols = d.cols || (L ? 6 : 3); const wall = H.el('div', 'wall'); wall.style.gridTemplateColumns = 'repeat(' + cols + ',minmax(0,1fr))'; st.appendChild(wall);\n      (d.logos || []).forEach(src => { const cell = H.el('div', 'wcell'); cell.appendChild(logoImg(ctx, src, L ? 3.2 : 3, d.white !== false)); wall.appendChild(cell); });\n      tl.from(wall.children, { opacity: 0, y: ctx.px(1), duration: .9, ease: 'power3.out', stagger: { each: .04, from: 'start' } }, .35);\n    } },\n  'cta': { name: 'Encerramento', desc: 'Chamada grande, endereço com fio e logo discreto', fields: { title: 'string', sub: 'string', url: 'string', logo: 'url' }, defaults: { durationMs: 5200, bg: { type: 'scene', scene: 'studio', params: { shape: 'ring' } }, transition: { type: 'fade', durationMs: 600 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}; const L = ctx.orient === 'landscape'; const g = grid12(ctx, 'vcenter'); inner.appendChild(g); const c = col(ctx, 1, L ? 9 : 13, 'stack'); g.appendChild(c);\n      if (d.sub) { const k = lbl(ctx, d.sub); c.appendChild(k); fadeUp(ctx, tl, k, .1); }\n      const t = display(ctx, d.title || '', L ? 10 : 12); c.appendChild(t); riseIn(ctx, tl, t, .25, { stagger: .07 });\n      if (d.url) { const u = H.el('div', 'url'); u.style.fontSize = ctx.fs(L ? 2 : 2.4); u.innerHTML = '<span>' + H.esc(d.url) + '</span>'; const h = hair(ctx, 'acc'); u.appendChild(h); c.appendChild(u); fadeUp(ctx, tl, u, 1); drawHair(ctx, tl, h, 1.2); }\n      if (d.logo) { const lg = document.createElement('img'); lg.src = d.logo; lg.alt = ''; lg.className = 'ctalogo'; lg.style.width = ctx.fs(L ? 9 : 16); c.appendChild(lg); fadeUp(ctx, tl, lg, 1.5); }\n    } },\n  'free': { name: 'Camadas livres', desc: 'Canvas livre estilo slide: camadas posicionadas em % com entrada/saída próprias (base do editor)', fields: { layers: '[{type:text|image|video|shape|logo, x,y,w,h (%), text,src, size, color, align, role, enter:{anim,delay,d,stagger}, exit:{anim,at,d}, style:{}}]' }, defaults: { durationMs: 4000, bg: { type: 'color' }, transition: { type: 'fade', durationMs: 700 } },\n    build(ctx, f, inner, tl) {\n      const d = f.data || {}, g = ctx.g; const cv = H.el('div', 'freecv'); inner.appendChild(cv);\n      (d.layers || []).forEach((ly, i) => {\n        const e = H.el('div', 'layer ' + (ly.type || 'text')); e.style.left = (ly.x || 0) + '%'; e.style.top = (ly.y || 0) + '%'; e.style.width = (ly.w || 50) + '%'; if (ly.h) e.style.height = ly.h + '%';\n        if (ly.type === 'image' || ly.type === 'video' || ly.type === 'logo') { e.appendChild(mediaEl(ctx, { src: ly.src, type: ly.type === 'video' ? 'video' : 'image' }, { fit: ly.fit || (ly.type === 'logo' ? 'contain' : 'cover') })); }\n        else if (ly.type === 'shape') { e.style.background = ly.color || 'var(--accent)'; e.style.borderRadius = ly.radius || 0; }\n        else { e.innerHTML = H.words(ly.text || ''); e.className += ' ' + (ly.role || 'disp'); e.style.fontSize = ctx.fs(ly.size || 6); e.style.textAlign = ly.align || 'left'; if (ly.color) e.style.color = ly.color; }\n        Object.assign(e.style, ly.style || {}); cv.appendChild(e);\n        const en = ly.enter || { anim: 'rise' }; const fn = ANIM.in[en.anim] || ANIM.in.fade; const tg = (ly.type === 'text' || !ly.type) ? (e.querySelectorAll('.wi').length ? e.querySelectorAll('.wi') : e) : e; fn(g, tl, tg, en, en.delay || i * .15);\n        if (ly.exit && ly.exit.anim) { const fo = ANIM.out[ly.exit.anim] || ANIM.out.fade; fo(g, tl, tg, ly.exit, ly.exit.at != null ? ly.exit.at : Math.max(0, ctx.hold - .6)); }\n      });\n    } }\n};\n\n// ── Transitions. fn(ctx, tl, A, B, d, at, opts) — A/B frame records {el, inner}; tl = master timeline; at = B.start\nfunction fxOverlay(ctx, cls) { const e = H.el('div', 'fxo ' + cls); ctx.fxt.appendChild(e); return e; }\nconst TRANSITIONS = {\n  'cut':   { name: 'Corte', desc: 'Troca seca', fn() {} },\n  'fade':  { name: 'Fusão', desc: 'Crossfade simples', fn(ctx, tl, A, B, d, at) { tl.fromTo(B.el, { opacity: 0 }, { opacity: 1, duration: d, ease: 'power2.inOut' }, at); tl.to(A.el, { opacity: 0, duration: d, ease: 'power2.inOut' }, at); } },\n  'dip':   { name: 'Mergulho', desc: 'Fecha no fundo e abre no próximo frame', fn(ctx, tl, A, B, d, at) { tl.to(A.el, { opacity: 0, duration: d * .45, ease: 'power2.in' }, at); tl.fromTo(B.el, { opacity: 0 }, { opacity: 1, duration: d * .55, ease: 'power2.out' }, at + d * .45); } },\n  'zoom-through': { name: 'Atravessar', desc: 'A câmera avança através do frame atual e chega no próximo', fn(ctx, tl, A, B, d, at) {\n    tl.set(A.el, { zIndex: 3 }, at); tl.to(A.inner, { scale: 1.14, opacity: 0, duration: d, ease: 'power2.in' }, at); tl.fromTo(B.inner, { scale: .96, opacity: 0 }, { scale: 1, opacity: 1, duration: d, ease: 'power2.out' }, at + d * .35);\n    tl.to(ctx.cam, { dz: -6, duration: d * .5, ease: 'power2.in' }, at).to(ctx.cam, { dz: 0, duration: d, ease: 'power2.out' }, at + d * .5); } },\n  'flip':  { name: 'Giro 3D', desc: 'O frame gira no eixo Y e revela o próximo atrás', fn(ctx, tl, A, B, d, at) {\n    tl.to(A.el, { rotationY: -100, transformOrigin: '50% 50%', opacity: 0, duration: d, ease: 'power3.in' }, at); tl.fromTo(B.el, { rotationY: 100, opacity: 0 }, { rotationY: 0, opacity: 1, duration: d, ease: 'power3.out' }, at + d * .5);\n    tl.to(ctx.cam, { roll: .08, duration: d * .5, ease: 'power2.in' }, at).to(ctx.cam, { roll: 0, duration: d * .6, ease: 'power2.out' }, at + d * .5); } },\n  'wipe':  { name: 'Cortina', desc: 'O próximo frame entra por máscara (cima/baixo/esquerda/direita)', fn(ctx, tl, A, B, d, at, o) {\n    const dir = (o && o.dir) || 'left'; const from = dir === 'up' ? 'inset(100% 0 0 0)' : dir === 'down' ? 'inset(0 0 100% 0)' : dir === 'right' ? 'inset(0 100% 0 0)' : 'inset(0 0 0 100%)';\n    tl.fromTo(B.el, { clipPath: from }, { clipPath: 'inset(0 0 0 0)', duration: d, ease: 'expo.inOut' }, at); tl.to(A.inner, { scale: .985, opacity: .5, duration: d, ease: 'power2.inOut' }, at);\n    const bar = fxOverlay(ctx, 'bar ' + (dir === 'up' || dir === 'down' ? 'h' : 'v')); const to = {};\n    if (dir === 'left') { bar.style.left = '100%'; to.x = -ctx.W * 1.07; } else if (dir === 'right') { bar.style.left = '-7%'; to.x = ctx.W * 1.07; } else if (dir === 'up') { bar.style.top = '100%'; to.y = -ctx.H * 1.07; } else { bar.style.top = '-7%'; to.y = ctx.H * 1.07; }\n    to.duration = d; to.ease = 'expo.inOut'; tl.fromTo(bar, { x: 0, y: 0, opacity: 1 }, to, at); tl.set(bar, { opacity: 0 }, at + d); } },\n  'circle': { name: 'Íris', desc: 'Abertura circular a partir do centro', fn(ctx, tl, A, B, d, at) { tl.fromTo(B.el, { clipPath: 'circle(0% at 50% 50%)' }, { clipPath: 'circle(80% at 50% 50%)', duration: d, ease: 'expo.inOut' }, at); tl.to(A.inner, { scale: 1.08, duration: d, ease: 'power2.in' }, at); } },\n  'slide': { name: 'Deslizar', desc: 'O próximo frame empurra o atual (esquerda/cima)', fn(ctx, tl, A, B, d, at, o) {\n    const up = o && o.dir === 'up'; const p = up ? 'yPercent' : 'xPercent'; const f0 = {}, f1 = {}, a1 = {}; f0[p] = 100; f1[p] = 0; a1[p] = -35; f1.duration = d; f1.ease = 'expo.inOut'; a1.duration = d; a1.ease = 'expo.inOut'; a1.opacity = .4;\n    a1[p] = -25; tl.fromTo(B.el, f0, f1, at); tl.to(A.el, a1, at); } },\n  'push':  { name: 'Empurrar', desc: 'O próximo frame entra da direita com paralaxe', fn(ctx, tl, A, B, d, at) { tl.fromTo(B.el, { xPercent: 100 }, { xPercent: 0, duration: d, ease: 'expo.inOut' }, at); tl.to(A.el, { xPercent: -28, opacity: .4, duration: d, ease: 'expo.inOut' }, at); } },\n  'glitch': { name: 'Glitch', desc: 'Tremor, aberração cromática e corte seco', fn(ctx, tl, A, B, d, at) {\n    const n = 6, s = d * .7 / n; tl.set(A.el, { attr: { 'data-g': 1 } }, at);\n    for (let i = 0; i < n; i++) tl.to(A.el, { x: (i % 2 ? -1 : 1) * ctx.px(1.2 + i * .3), skewX: (i % 2 ? -1 : 1) * 6, scaleY: 1 + (i % 3) * .02, duration: s, ease: 'none' }, at + i * s);\n    tl.set(A.el, { x: 0, skewX: 0, scaleY: 1, attr: { 'data-g': 0 }, opacity: 0 }, at + d * .7); tl.fromTo(B.el, { opacity: 0 }, { opacity: 1, duration: .02 }, at + d * .7);\n    tl.set(B.el, { attr: { 'data-g': 1 } }, at + d * .7); tl.fromTo(B.el, { x: -ctx.px(1.5), skewX: -5 }, { x: 0, skewX: 0, duration: d * .3, ease: 'steps(3)' }, at + d * .7); tl.set(B.el, { attr: { 'data-g': 0 } }, at + d); } },\n  'shutter': { name: 'Veneziana', desc: 'Barras cobrem a tela e revelam o próximo frame', fn(ctx, tl, A, B, d, at) {\n    const box = fxOverlay(ctx, 'shutter'); const bars = []; for (let i = 0; i < 6; i++) { const b = H.el('div', 'sb'); box.appendChild(b); bars.push(b); }\n    tl.fromTo(bars, { scaleY: 0, transformOrigin: '50% 0%' }, { scaleY: 1, duration: d * .5, ease: 'expo.in', stagger: .04 }, at); tl.set(A.el, { opacity: 0 }, at + d * .55); tl.set(B.el, { opacity: 1 }, at + d * .55);\n    tl.to(bars, { scaleY: 0, transformOrigin: '50% 100%', duration: d * .5, ease: 'expo.out', stagger: .04 }, at + d * .55); } },\n  'light-leak': { name: 'Vazamento de luz', desc: 'Um clarão varre a tela durante a fusão', fn(ctx, tl, A, B, d, at) {\n    const leak = fxOverlay(ctx, 'leak'); tl.fromTo(leak, { xPercent: -130, opacity: 0 }, { xPercent: 130, opacity: 1, duration: d, ease: 'power2.inOut' }, at); tl.set(leak, { opacity: 0 }, at + d);\n    tl.to(A.el, { opacity: 0, duration: d * .5, ease: 'power2.in' }, at + d * .3); tl.fromTo(B.el, { opacity: 0 }, { opacity: 1, duration: d * .5, ease: 'power2.out' }, at + d * .4); } }\n};\n\nfunction normalizeTheme(t) {\n  t = t || {};\n  const colors = Object.assign({ bg: '#0d0c0c', ink: '#f4f1ea', accent: '#ff009f', accent2: '#ff009f', muted: '#8f8a84' }, t.colors || {});\n  const fonts = Object.assign({ display: { family: 'Anton', weights: [400] }, text: { family: 'Instrument Sans', weights: [400, 500, 600] }, serif: { family: 'Instrument Serif', weights: [400], italic: true } }, t.fonts || {});\n  const fx = Object.assign({ grain: 0, vignette: 0, mark: false, index: true, letterbox: 0, grade: '' }, t.fx || {});\n  return { colors, fonts, fx, logo: t.logo || null };\n}\nfunction rgbaOf(hex, a) { const n = H.hex(hex); return 'rgba(' + ((n >> 16) & 255) + ',' + ((n >> 8) & 255) + ',' + (n & 255) + ',' + a + ')'; }\nfunction buildBackground(ctx, bg, el) {\n  bg = bg || { type: 'color' }; const out = { scene: null, el: null, kenburns: false };\n  if (bg.type === 'scene') { out.scene = { scene: bg.scene || 'particles', params: bg.params || {} }; }\n  else if (bg.type === 'media' || bg.type === 'media-dim') {\n    const m = bg.media || (bg.src ? { src: bg.src, type: bg.mediaType, poster: bg.poster } : null);\n    if (m) { const me = mediaEl(ctx, m, { cls: 'bgm' }); el.appendChild(me); out.el = me; out.kenburns = bg.kenburns !== false && H.mediaType(m) === 'image';\n      const dim = H.el('div', 'dim'); const b = ctx.theme.colors.bg; const a = bg.dim != null ? bg.dim : (bg.type === 'media-dim' ? 1 : 0);\n      if (bg.cover != null) dim.style.background = rgbaOf(b, bg.cover); else if (a) dim.style.background = ctx.orient === 'landscape' ? 'linear-gradient(90deg,' + rgbaOf(b, .94 * a) + ' 0%,' + rgbaOf(b, .72 * a) + ' 45%,' + rgbaOf(b, .25 * a) + ' 100%)' : 'linear-gradient(180deg,' + rgbaOf(b, .25 * a) + ' 0%,' + rgbaOf(b, .55 * a) + ' 45%,' + rgbaOf(b, .96 * a) + ' 100%)';\n      el.appendChild(dim); }\n    else el.style.background = bg.color || 'transparent';\n  }\n  else if (bg.type === 'gradient') { el.style.background = bg.value || ('radial-gradient(120% 90% at 70% 20%,' + rgbaOf(ctx.theme.colors.accent, .35) + ', transparent 60%), ' + ctx.theme.colors.bg); }\n  else if (bg.type === 'color') { if (bg.color) el.style.background = bg.color; }\n  return out;\n}\nfunction normalizeTransition(t, last) { if (last) return { type: 'cut', durationMs: 0 }; if (!t) return { type: 'fade', durationMs: 900 }; if (typeof t === 'string') return { type: t, durationMs: 800 }; return Object.assign({ durationMs: 800 }, t); }\nfunction qs(k) { try { return new URLSearchParams(location.search).get(k); } catch (e) { return null; } }\n\n// ── Engine instance (one per component instance)\nconst INST = new WeakMap();\nfunction inst(d2) { let E = INST.get(d2); if (!E) { E = createEngine(d2); INST.set(d2, E); } return E; }\n\nfunction createEngine(d2) {\n  const E = { d2, g: null, T: null, host: null, stage: null, canvas: null, framesEl: null, fxt: null, renderer: null, master: null, frames: [], scenes: {}, active: null, activeKey: null, cam: { dz: 0, roll: 0, fov: 0 }, spec: null, ch: null, chKey: null, channelKeys: [], W: 1920, H: 1080, playing: false, loop: false, static: false, warnings: [], key: '', ui: null, total: 0, curIdx: -1, ro: null, tickFn: null, ctx: null };\n\n  E.ensureDom = function (host) {\n    if (!E.stage) {\n      E.stage = H.el('div', 'stage'); E.canvas = document.createElement('canvas'); E.canvas.className = 'gl'; E.framesEl = H.el('div', 'frames'); E.fxt = H.el('div', 'fxt');\n      E.markEl = document.createElement('img'); E.markEl.className = 'brandmark'; E.markEl.alt = ''; E.idxEl = H.el('div', 'fidx lbl');\n      E.lbTop = H.el('div', 'lbox top'); E.lbBot = H.el('div', 'lbox bot');\n      E.stage.append(E.canvas, E.framesEl, E.fxt, H.el('div', 'grain'), H.el('div', 'vig'), E.lbTop, E.lbBot, E.markEl, E.idxEl);\n    }\n    if (E.host !== host) { E.host = host; host.appendChild(E.stage); if (E.ro) E.ro.disconnect(); if (typeof ResizeObserver !== 'undefined') { E.ro = new ResizeObserver(() => E.fit()); E.ro.observe(host); } E.fit(); }\n    else if (!host.contains(E.stage)) host.appendChild(E.stage);\n  };\n  E.fit = function () { if (!E.host || !E.stage) return; const r = E.host.getBoundingClientRect(); if (!r.width || !r.height) return; const s = Math.min(r.width / E.W, r.height / E.H); E.stage.style.transform = 'translate(-50%,-50%) scale(' + s + ')'; };\n\n  E.teardown = function () {\n    if (E.master) { E.master.kill(); E.master = null; }\n    if (E.framesEl) E.framesEl.innerHTML = ''; if (E.fxt) E.fxt.innerHTML = '';\n    Object.keys(E.scenes).forEach(k => { try { E.scenes[k].dispose(); } catch (e) { } }); E.scenes = {}; E.active = null; E.activeKey = null; E.cam.dz = 0; E.cam.roll = 0; E.cam.fov = 0;\n    E.frames = []; E.warnings = []; E.playing = false; E.curIdx = -1;\n  };\n  E.destroy = function () { E.teardown(); if (E.tickFn && E.g) E.g.ticker.remove(E.tickFn); E.tickFn = null; if (E.renderer) { E.renderer.dispose(); E.renderer = null; } if (E.ro) E.ro.disconnect(); E.ro = null; };\n\n  E.load = function (spec, chKey, opts) {\n    opts = opts || {}; E.teardown(); E.spec = spec;\n    const defs = Object.assign({}, CHANNELS, spec.channelDefs || {}); const keys = (spec.channels && spec.channels.length) ? spec.channels.filter(k => defs[k]) : Object.keys(CHANNELS);\n    E.channelKeys = keys; if (!keys.includes(chKey)) chKey = (spec.defaultChannel && keys.includes(spec.defaultChannel)) ? spec.defaultChannel : keys[0];\n    const ch = Object.assign({ key: chKey }, defs[chKey]); const ov = (spec.channelOverrides || {})[chKey] || {};\n    E.ch = ch; E.chKey = chKey; E.W = ch.w; E.H = ch.h; E.loop = !!(ov.loop != null ? ov.loop : (ch.loop != null ? ch.loop : (opts.loop || spec.loop))); E.static = !!(ov.static != null ? ov.static : ch.static);\n    const theme = normalizeTheme(spec.theme); H.ensureFonts(H.fontUrl(theme.fonts));\n    const st = E.stage.style; st.width = E.W + 'px'; st.height = E.H + 'px';\n    st.setProperty('--bg', theme.colors.bg); st.setProperty('--ink', theme.colors.ink); st.setProperty('--accent', theme.colors.accent); st.setProperty('--accent2', theme.colors.accent2); st.setProperty('--muted', theme.colors.muted);\n    st.setProperty('--font-display', '\"' + theme.fonts.display.family + '\", Impact, \"Arial Narrow\", sans-serif'); st.setProperty('--font-text', '\"' + theme.fonts.text.family + '\", system-ui, sans-serif');\n    st.setProperty('--font-serif', '\"' + ((theme.fonts.serif && theme.fonts.serif.family) || 'Georgia') + '\", Georgia, serif');\n    st.setProperty('--grain', theme.fx.grain); st.setProperty('--vignette', theme.fx.vignette); st.setProperty('--u', (E.W / 100) + 'px');\n    let frames = (spec.frames || []).slice(); if (ov.frames && ov.frames.length) frames = ov.frames.map(id => frames.find(f => f.id === id)).filter(Boolean);\n    frames = frames.filter(f => !(f.channels && f.channels.length && !f.channels.includes(chKey)) && !(f.exclude && f.exclude.includes(chKey)));\n    const u = E.W / 100, orient = E.W > E.H ? 'landscape' : (E.W === E.H ? 'square' : 'portrait'); const safe = Object.assign({ t: 60, b: 60, l: 60, r: 60 }, ch.safe || {}, ov.safe || {});\n    const lbRatio = orient === 'landscape' ? (+theme.fx.letterbox || 0) : 0; const lbH = lbRatio && (E.W / lbRatio) < E.H ? Math.round((E.H - E.W / lbRatio) / 2) : 0; E.lbTop.style.height = E.lbBot.style.height = lbH + 'px'; E.lbTop.style.display = E.lbBot.style.display = lbH ? 'block' : 'none'; if (lbH) { safe.t = Math.max(safe.t, lbH + u * 2.4); safe.b = Math.max(safe.b, lbH + u * 2.4); }\n    st.setProperty('--grade', theme.fx.grade || 'none'); st.setProperty('--safe-l', safe.l + 'px'); st.setProperty('--safe-r', safe.r + 'px'); st.setProperty('--safe-b', safe.b + 'px'); st.setProperty('--safe-t', safe.t + 'px');\n    const markW = u * (orient === 'landscape' ? 5 : 8), markH = markW * .25; E.markEl.style.cssText = 'left:' + safe.l + 'px;top:' + (lbH + Math.max(10, (safe.t - lbH - markH) / 2)) + 'px;width:' + markW + 'px'; E.markEl.src = theme.logo || ''; E.markEl.style.display = (theme.fx.mark && theme.logo) ? 'block' : 'none';\n    E.idxEl.style.cssText = 'right:' + safe.r + 'px;bottom:' + (lbH + Math.max(8, (safe.b - lbH - u * 1.4) / 2)) + 'px;font-size:' + (u * 1.15) + 'px'; E.idxEl.style.display = theme.fx.index === false ? 'none' : 'block'; E.idxEl.textContent = '';\n    const ctx = { g: E.g, T: E.T, W: E.W, H: E.H, u, orient, theme, col: { bg: H.hex(theme.colors.bg), ink: H.hex(theme.colors.ink), accent: H.hex(theme.colors.accent), accent2: H.hex(theme.colors.accent2) }, safe, fs: n => (n * u).toFixed(2) + 'px', px: n => n * u, cam: E.cam, fxt: E.fxt, h: H, anim: ANIM };\n    E.ctx = ctx;\n    // duration budget (OOH etc.): scale holds proportionally when the channel caps duration\n    let holds = frames.map(f => ((f.durationMs != null ? f.durationMs : ((STYLES[f.style] || STYLES.statement).defaults.durationMs)) || 4000) / 1000);\n    const maxS = (ov.maxDurationMs || ch.maxDurationMs || 0) / 1000; const sum = holds.reduce((a, b) => a + b, 0);\n    if (maxS && sum > maxS) { const k = maxS / sum; holds = holds.map(h => h * k); E.warnings.push('Duração reduzida para caber em ' + maxS + 's do canal ' + chKey); }\n    const master = E.g.timeline({ paused: true, repeat: E.loop ? -1 : 0, onUpdate: () => E._tick(), onComplete: () => { if (!E.loop) { E.playing = false; E._tick(); } } });\n    let t = 0; const recs = [];\n    frames.forEach((f, i) => {\n      const style = STYLES[f.style] || STYLES.statement; if (!STYLES[f.style]) E.warnings.push('Estilo desconhecido \"' + f.style + '\" no frame ' + (f.id || i) + ' — usando statement');\n      const hold = holds[i]; const last = i === frames.length - 1; const trans = normalizeTransition(f.transition != null ? f.transition : style.defaults.transition, last); const tdur = last ? 0 : Math.min(hold * .6, (trans.durationMs != null ? trans.durationMs : 700) / 1000);\n      const el = H.el('section', 'fr'); el.dataset.fid = f.id || ('f' + i); const bg = buildBackground(ctx, f.bg != null ? f.bg : style.defaults.bg, el);\n      const inner = H.el('div', 'inner'); inner.style.padding = safe.t + 'px ' + safe.r + 'px ' + safe.b + 'px ' + safe.l + 'px'; el.appendChild(inner); E.framesEl.appendChild(el);\n      const fctx = Object.assign({}, ctx, { hold, trans: tdur, index: i }); const ftl = E.g.timeline();\n      try { style.build(fctx, f, inner, ftl); } catch (e) { E.warnings.push('Frame ' + (f.id || i) + ': ' + (e && e.message)); inner.appendChild(display(fctx, f.name || f.id || 'frame', 8)); }\n      if (f.motion !== false) ftl.to(inner, { scale: 1.035, duration: hold, ease: 'none' }, 0);\n      if (bg.kenburns && bg.el) ftl.fromTo(bg.el, { scale: 1 }, { scale: 1.12, duration: hold, ease: 'none' }, 0);\n      master.set(el, { opacity: 1 }, t); master.add(ftl, t); if (theme.fx.mark && theme.logo) master.set(E.markEl, { opacity: f.mark === false ? 0 : 1 }, t);\n      recs.push({ f, el, inner, style, hold, trans, tdur, start: t, end: t + hold, bg, scene: bg.scene, i });\n      t += hold - tdur;\n    });\n    recs.forEach((R, i) => { if (i < recs.length - 1) { const B = recs[i + 1]; const tr = TRANSITIONS[R.trans.type] || TRANSITIONS.fade; if (!TRANSITIONS[R.trans.type]) E.warnings.push('Transição desconhecida \"' + R.trans.type + '\"'); try { tr.fn(ctx, master, R, B, R.tdur, B.start, R.trans); } catch (e) { E.warnings.push('Transição ' + R.trans.type + ': ' + e.message); } master.set(R.el, { opacity: 0, zIndex: 1 }, R.end); } });\n    E.frames = recs; E.master = master; E.total = master.duration() || 0.001;\n    E.setupGL(); E._syncScene(0, true); E.startLoop(); E.fit(); E._tick(true);\n    if (E.static) { master.progress(Math.min(1, Math.min(recs.length ? recs[0].hold : 1, 2.2) / E.total)); E.playing = false; E._tick(true); }\n    else if (opts.autoplay !== false) E.play();\n  };\n\n  E.setupGL = function () {\n    if (!E.renderer) { try { E.renderer = new E.T.WebGLRenderer({ canvas: E.canvas, antialias: true, alpha: true, powerPreference: 'high-performance' }); E.renderer.setClearColor(0x000000, 0); E.renderer.toneMapping = E.T.ACESFilmicToneMapping; E.renderer.toneMappingExposure = 1.15; } catch (e) { E.warnings.push('WebGL indisponível: ' + e.message); return; } }\n    const ratio = Math.min(1, 1600 / Math.max(E.W, E.H)); E.renderer.setPixelRatio(ratio); E.renderer.setSize(E.W, E.H, false);\n  };\n  E._syncScene = function (i, force) {\n    const R = E.frames[i]; const key = R && R.scene ? R.scene.scene + '|' + JSON.stringify(R.scene.params || {}) : null;\n    if (!force && key === E.activeKey) return;\n    if (!key) { E.g.killTweensOf(E.canvas); E.pendingSwap = null; E.activeKey = null; if (force) { E.active = null; E.canvas.style.opacity = 0; } else E.g.to(E.canvas, { opacity: 0, duration: .3, ease: 'power2.in', onComplete() { E.active = null; } }); return; }\n    if (!E.renderer) return;\n    let S = E.scenes[key]; if (!S) { const def = SCENES[R.scene.scene]; if (!def) { E.warnings.push('Cena desconhecida \"' + R.scene.scene + '\"'); E.active = null; E.activeKey = null; E.canvas.style.opacity = 0; return; } try { S = def.make(E.T, E.ctx, R.scene.params || {}); } catch (e) { E.warnings.push('Cena ' + R.scene.scene + ': ' + e.message); return; } E.scenes[key] = S; }\n    E.g.killTweensOf(E.canvas); if (E.pendingSwap) { E.pendingSwap(); E.pendingSwap = null; }\n    E.activeKey = key; const swapTo = () => { E.active = S; E.g.to(E.canvas, { opacity: 1, duration: .5, ease: 'power2.out' }); };\n    if (E.active && !force) { E.pendingSwap = swapTo; E.g.to(E.canvas, { opacity: 0, duration: .22, ease: 'power2.in', onComplete() { E.pendingSwap = null; swapTo(); } }); }\n    else { E.active = S; E.canvas.style.opacity = 1; }\n  };\n  E.startLoop = function () {\n    if (E.tickFn) return;\n    E.tickFn = function (time, deltaMs) { if (!E.active || !E.renderer || (typeof document !== 'undefined' && document.hidden)) return; const S = E.active; try { S.update(time, Math.min(deltaMs / 1000, .1)); const c = S.camera; c.position.z = S.baseZ + E.cam.dz; c.rotation.z = E.cam.roll; c.fov = S.baseFov + E.cam.fov; c.updateProjectionMatrix(); E.renderer.render(S.scene, c); } catch (e) { E.warnings.push('render: ' + e.message); E.active = null; } };\n    E.g.ticker.add(E.tickFn);\n  };\n  E._tick = function (force) {\n    if (!E.master) return; const time = E.master.time(); let idx = 0, sIdx = 0;\n    for (let i = 0; i < E.frames.length; i++) { const R = E.frames[i]; if (time >= R.start - 1e-4) idx = i; const prevT = i > 0 ? E.frames[i - 1].tdur : 0; if (time >= R.start + prevT * .5 - 1e-4) sIdx = i; }\n    E._syncScene(sIdx);\n    E.frames.forEach(R => { const vis = time >= R.start - 1e-3 && time < R.end + 1e-3; const lt = time - R.start; if (vis !== R.vis || force) { R.vis = vis; R.el.style.visibility = vis ? 'inherit' : 'hidden'; }\n      if (!R.vids) R.vids = Array.from(R.el.querySelectorAll('video'));\n      R.vids.forEach(v => { const cs = v.dataset.clipstart != null ? +v.dataset.clipstart : null; const on = vis && (cs == null || (lt >= cs - 1e-3 && lt < +v.dataset.clipend)); const local = cs == null ? lt : lt - cs;\n        if (on && (!v._on || force)) { v._on = true; try { v.currentTime = ((+v.dataset.start || 0) + Math.max(0, local)) % (v.duration || 1e9); } catch (e) { } }\n        if (!on && v._on) { v._on = false; v.pause(); }\n        if (on && E.playing) { if (v.paused) v.play().catch(() => { }); } else if (!v.paused) v.pause(); }); });\n    if (idx !== E.curIdx || force) { E.curIdx = idx; if (E.idxEl) E.idxEl.textContent = String(idx + 1).padStart(2, '0') + ' / ' + String(E.frames.length).padStart(2, '0'); }\n    if (E.onUpdate) E.onUpdate(time, E.total, idx);\n  };\n  E.play = function () { if (!E.master || E.static) return; if (E.master.progress() >= 1 && !E.loop) E.master.progress(0); E.playing = true; E.master.play(); E._tick(true); };\n  E.pause = function () { if (!E.master) return; E.playing = false; E.master.pause(); E._tick(true); };\n  E.toggle = function () { E.playing ? E.pause() : E.play(); };\n  E.restart = function () { if (!E.master) return; E.master.progress(0); E.play(); };\n  E.seekFrame = function (i) { const R = E.frames[i]; if (!R || !E.master) return; E.master.time(R.start + 0.001); E._tick(true); if (!E.playing && !E.static) E.play(); };\n  E.scrub = function (p) { if (!E.master) return; E.playing = false; E.master.pause(); E.master.progress(H.clamp(p, 0, .9999)); E._tick(true); };\n  E.step = function (dir) { if (!E.frames.length) return; const n = H.clamp(E.curIdx + dir, 0, E.frames.length - 1); E.seekFrame(n); };\n  return E;\n}\n\n// ── Tool chrome (player UI around the stage) — painted imperatively into data-d2-static containers\nfunction paintChrome(E, root, recs, rec, d2) {\n  const top = root.querySelector('[data-top]'), bar = root.querySelector('[data-bar]'), lib = root.querySelector('[data-lib]'); if (!top || !bar) return;\n  const ck = (rec ? rec._id : 'json') + '|' + E.chKey + '|' + E.frames.length + '|' + recs.length + '|' + (E.warnings.length);\n  if (E.chromeKey !== ck) {\n    E.chromeKey = ck; const spec = E.spec || {}; const chs = E.channelKeys || [];\n    const defs = Object.assign({}, CHANNELS, spec.channelDefs || {});\n    top.innerHTML = '<div class=\"ttl\"><b>' + H.esc(spec.title || (rec && rec.title) || 'Motion') + '</b><span>' + H.esc(E.W + '×' + E.H) + ' · ' + H.fmtTime(E.total) + (E.loop ? ' · loop' : '') + (E.static ? ' · estático' : '') + '</span></div>' +\n      '<div class=\"chs\">' + chs.map(k => '<button class=\"chp' + (k === E.chKey ? ' on' : '') + '\" data-chip=\"' + H.esc(k) + '\" title=\"' + H.esc(defs[k].w + '×' + defs[k].h) + '\">' + H.esc((defs[k].name || k).split(' · ')[0]) + '</button>').join('') + '</div>' +\n      '<div class=\"acts\"><button class=\"ib\" data-act=\"share\" title=\"Copiar link de reprodução\">Link</button><button class=\"ib\" data-act=\"spec\" title=\"Ver spec JSON\">Spec</button><button class=\"ib\" data-act=\"full\" title=\"Tela cheia\">⛶</button></div>';\n    bar.innerHTML = '<div class=\"transport\"><button class=\"pb\" data-act=\"toggle\" aria-label=\"play/pause\">' + (E.playing ? '❚❚' : '▶') + '</button><button class=\"ib\" data-act=\"restart\" title=\"Reiniciar\">↺</button><div class=\"scrub\"><div class=\"track\"><div class=\"fill\" data-fill></div></div>' +\n      E.frames.map(R => '<div class=\"mark\" style=\"left:' + (R.start / E.total * 100).toFixed(3) + '%\"></div>').join('') + '<input type=\"range\" min=\"0\" max=\"1000\" value=\"0\" data-scrub></div><div class=\"time\" data-time>0:00.0 / ' + H.fmtTime(E.total) + '</div></div>' +\n      '<div class=\"strip\">' + E.frames.map((R, i) => '<div class=\"fcard\" data-frame=\"' + i + '\"><b>' + H.esc(R.f.name || R.f.id || ('Frame ' + (i + 1))) + '</b>' + H.esc((STYLES[R.f.style] ? STYLES[R.f.style].name : R.f.style) + ' · ' + R.hold.toFixed(1) + 's' + (R.tdur ? ' · ' + ((TRANSITIONS[R.trans.type] || {}).name || R.trans.type) : '')) + '</div>').join('') + '</div>' +\n      (E.warnings.length ? '<div class=\"warn\">' + E.warnings.map(w => H.esc(w)).join(' · ') + '</div>' : '');\n    if (lib) lib.innerHTML = '<div class=\"libh\">Vídeos</div>' + recs.map(r => '<div class=\"vrow' + (rec && r._id === rec._id ? ' on' : '') + '\" data-vid=\"' + H.esc(r.slug) + '\"><b>' + H.esc(r.title || r.slug) + '</b><span>' + H.esc((r.status || 'rascunho') + ' · ' + ((r.channels || []).length || '—') + ' canais') + '</span></div>').join('');\n    E.ui = { fill: bar.querySelector('[data-fill]'), time: bar.querySelector('[data-time]'), scrub: bar.querySelector('[data-scrub]'), pb: bar.querySelector('[data-act=\"toggle\"]'), cards: Array.from(bar.querySelectorAll('[data-frame]')) };\n  }\n  E.onUpdate = function (time, total, idx) { const u = E.ui; if (!u) return; const p = total ? time / total : 0; if (u.fill) u.fill.style.width = (p * 100).toFixed(2) + '%'; if (u.time) u.time.textContent = H.fmtTime(time) + ' / ' + H.fmtTime(total); if (u.scrub && !E.dragging) u.scrub.value = Math.round(p * 1000); if (u.pb) u.pb.textContent = E.playing ? '❚❚' : '▶'; u.cards.forEach((c, i) => c.classList.toggle('on', i === idx)); };\n  E._tick(true);\n}\n\nfunction sync(d2, root) {\n  const gsap = d2.lib(GSAP_SPEC), THREE = d2.lib(THREE_SPEC); if (!gsap || !THREE) return;\n  const E = inst(d2); E.g = gsap; E.T = THREE;\n  const host = root.querySelector('[data-host]'); if (!host) return; E.ensureDom(host);\n  const ds = d2.data(); const recs = (ds ? ds.records() : []).filter(r => r && r.spec);\n  let spec = null, rec = null; const specJson = d2.param('specJson');\n  const want = E.wantSlug || d2.param('video') || qs('v');\n  if (recs.length) { rec = recs.find(r => r.slug === want) || recs[0]; spec = rec.spec; if (typeof spec === 'string') { try { spec = JSON.parse(spec); } catch (e) { spec = null; } } if (spec && !spec.title) spec.title = rec.title; }\n  else if (specJson) { try { spec = typeof specJson === 'string' ? JSON.parse(specJson) : specJson; } catch (e) { spec = null; } }\n  if (!spec) { return; }\n  const chWant = E.wantCh || d2.param('channel') || qs('c') || null;\n  const key = (rec ? rec._id + '|' + (rec.updatedAt || '') : 'json') + '|' + (chWant || '');\n  if (E.key !== key) { E.key = key; E.rec = rec; try { E.load(spec, chWant, { autoplay: d2.param('autoplay', true) !== false, loop: !!d2.param('loop', false) }); } catch (e) { E.warnings.push('load: ' + (e && e.message)); d2.log && d2.log('motion load error', e); } }\n  paintChrome(E, root, recs, rec, d2);\n}\n\nexport default {\n  meta: { version: SPEC_VERSION, channels: CHANNELS, styles: Object.fromEntries(Object.entries(STYLES).map(([k, v]) => [k, { name: v.name, desc: v.desc, fields: v.fields, defaults: v.defaults }])), scenes: Object.fromEntries(Object.entries(SCENES).map(([k, v]) => [k, { name: v.name, desc: v.desc, params: v.params }])), transitions: Object.fromEntries(Object.entries(TRANSITIONS).map(([k, v]) => [k, { name: v.name, desc: v.desc }])), anims: { in: Object.keys(ANIM.in), out: Object.keys(ANIM.out) } },\n  css: `\n:host{display:block;width:100%;height:100%}\n*{box-sizing:border-box}\n.me{position:relative;width:100%;height:100%;min-height:480px;display:grid;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,1fr);background:#f4f4f2;color:#141414;font-family:\"Instrument Sans\",Inter,system-ui,sans-serif;font-size:12px;overflow:hidden}\n.me.lib{grid-template-columns:240px minmax(0,1fr)}\n.me.lib .libp{grid-row:1;grid-column:1;border-right:1px solid #e2e2de;overflow:auto;padding:14px 12px;min-height:0;background:#fafaf8}\n.me.lib .main{grid-column:2}\n.main{grid-row:1;display:grid;grid-template-rows:auto minmax(0,1fr) auto;min-height:0;height:100%}\n.top{display:flex;align-items:center;gap:18px;padding:10px 16px;border-bottom:1px solid #e2e2de;background:#fafaf8}\n.ttl b{display:block;font-size:13px;font-weight:600;letter-spacing:-.01em}.ttl span{color:#77756f;font-size:11px;font-variant-numeric:tabular-nums}\n.chs{display:flex;gap:2px;flex-wrap:wrap;flex:1}\n.chp,.ib,.pb{font:inherit;font-size:11.5px;color:#55534e;background:transparent;border:1px solid transparent;border-radius:6px;padding:6px 10px;cursor:pointer;line-height:1}\n.chp.on{color:#111;background:#fff;border-color:#dcdcd7;box-shadow:0 1px 0 rgba(0,0,0,.04)}\n.chp:hover,.ib:hover{color:#111}\n.ib{border-color:#dcdcd7;background:#fff}\n.acts{display:flex;gap:6px}\n.pb{width:34px;height:34px;border-radius:50%;background:#111;color:#fff;border-color:#111;font-size:12px;padding:0}\n.host{position:relative;overflow:hidden;background:#0a0a0a;min-height:0}\n.bar{display:flex;flex-direction:column;gap:10px;padding:10px 16px 12px;border-top:1px solid #e2e2de;background:#fafaf8}\n.transport{display:flex;align-items:center;gap:12px}\n.scrub{position:relative;flex:1;height:28px}\n.scrub input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}\n.track{position:absolute;left:0;right:0;top:13px;height:2px;background:#d9d9d4}\n.fill{height:100%;width:0;background:#111}\n.mark{position:absolute;top:10px;width:1px;height:8px;background:#9a9892;pointer-events:none;z-index:1}\n.time{font-variant-numeric:tabular-nums;color:#55534e;min-width:96px;text-align:right;font-size:11px}\n.strip{display:flex;gap:6px;overflow-x:auto;padding-bottom:2px}\n.fcard{flex:0 0 auto;min-width:132px;max-width:200px;padding:7px 10px;border-radius:6px;border:1px solid #e2e2de;background:#fff;cursor:pointer;color:#77756f;font-size:10.5px;line-height:1.35}\n.fcard b{display:block;color:#111;font-size:11.5px;font-weight:600;margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.fcard.on{border-color:#111;color:#333}\n.warn{color:#9a5b00;font-size:11px}\n.libh{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:#77756f;margin:2px 0 10px}\n.vrow{padding:8px 10px;border-radius:6px;cursor:pointer;border:1px solid transparent}.vrow:hover{background:#f0f0ed}.vrow.on{border-color:#dcdcd7;background:#fff}\n.vrow b{display:block;font-size:12px;color:#111;font-weight:600}.vrow span{font-size:10.5px;color:#77756f}\n.status{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#f4f4f2;color:#77756f;font-size:13px;z-index:10}\n.specbox{position:absolute;inset:0;z-index:9;background:rgba(250,250,248,.98);overflow:auto;padding:16px}\n.specbox pre{margin:0;font:11px/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;color:#222;white-space:pre-wrap}\n.specbox .ib{position:sticky;top:0;float:right}\n/* ── stage */\n.stage{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:50% 50%;background:var(--bg,#000);overflow:hidden;perspective:1400px;color:var(--ink,#fff)}\n.gl{position:absolute;inset:0;width:100%;height:100%;opacity:0;z-index:0}\n.frames{position:absolute;inset:0;z-index:1;transform-style:preserve-3d}\n.fr{position:absolute;inset:0;visibility:hidden;opacity:0;z-index:1;overflow:hidden;backface-visibility:hidden;transform-style:preserve-3d}\n.fr>.inner{position:absolute;inset:0;display:flex;transform-origin:50% 50%;z-index:1}\n.fxt{position:absolute;inset:0;z-index:5;pointer-events:none}\n.fxo{position:absolute;inset:0}\n.fxo.bar.v{width:2px;background:var(--ink);opacity:.7}.fxo.bar.h{height:2px;background:var(--ink);opacity:.7}\n.fxo.shutter{display:flex;flex-direction:column}.fxo.shutter .sb{flex:1;background:var(--bg);transform:scaleY(0)}\n.fxo.leak{background:linear-gradient(100deg,transparent 30%,rgba(255,255,255,.35) 50%,transparent 70%);mix-blend-mode:screen;opacity:0}\n.grain{position:absolute;inset:-20%;z-index:6;pointer-events:none;opacity:var(--grain,0);background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .6 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>\");animation:gr .5s steps(4) infinite}\n@keyframes gr{0%{transform:translate(0,0)}25%{transform:translate(-4%,3%)}50%{transform:translate(3%,-5%)}75%{transform:translate(-2%,-2%)}100%{transform:translate(4%,4%)}}\n.vig{position:absolute;inset:0;z-index:7;pointer-events:none;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,var(--vignette,0)) 100%)}\n.brandmark{position:absolute;z-index:8;pointer-events:none;height:auto;display:none}\n.fidx{position:absolute;z-index:8;pointer-events:none;opacity:.55}\n.bgm{position:absolute;inset:0;width:100%;height:100%;z-index:0;transform-origin:50% 50%;filter:var(--grade,none)}\n.lbox{position:absolute;left:0;right:0;height:0;background:#000;z-index:7;pointer-events:none;display:none}.lbox.top{top:0}.lbox.bot{bottom:0}\n.montage{position:absolute;inset:0;z-index:0;background:#000}\n.clip{position:absolute;inset:0;opacity:0;z-index:0}\n.clipv{position:absolute;inset:0;width:100%;height:100%;transform-origin:50% 50%;filter:var(--grade,none)}\n.cap{position:absolute;left:var(--safe-l);right:var(--safe-r);bottom:var(--safe-b);display:flex;flex-direction:column;gap:calc(var(--u)*.9);z-index:2}\n.cap .capbar{width:calc(var(--u)*14);opacity:.9}\n.fr>.inner.over{pointer-events:none}\n.dim{position:absolute;inset:0;z-index:0}\n.fr[data-g=\"1\"] .inner{text-shadow:.02em 0 var(--accent)}\n/* ── typography */\n.disp{font-family:var(--font-display);font-weight:400;text-transform:uppercase;line-height:.9;letter-spacing:-.004em;margin:0;color:var(--ink);text-wrap:balance}\n.disp em,.body em,.serif em{font-style:inherit;color:var(--accent)}\n.disp.ghost{opacity:.14;line-height:.8}\n.lbl{font-family:var(--font-text);font-weight:500;letter-spacing:.18em;text-transform:uppercase;color:var(--ink);opacity:.78;line-height:1.2}\n.lbl.muted{opacity:.5}\n.body{font-family:var(--font-text);font-weight:400;line-height:1.35;color:var(--ink);margin:0}\n.body.soft{opacity:.82}\n.serif{font-family:var(--font-serif);font-style:italic;font-weight:400;line-height:1.12;color:var(--ink);margin:0;letter-spacing:-.005em;text-wrap:balance}\n.hair{height:max(1px,calc(var(--u)*.07));width:100%;background:var(--ink);opacity:.28;transform-origin:0 50%;flex:none}\n.hair.acc{background:var(--accent);opacity:1}\n.w{display:inline-block;overflow:hidden;vertical-align:bottom;padding:.14em .02em .08em 0;margin:-.14em 0 -.08em}\n.wi{display:inline-block;will-change:transform}\n/* ── layout primitives */\n.g12{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));column-gap:calc(var(--u)*2);width:100%;height:100%;align-content:center}\n.g12.vcenter{align-content:center}.g12.vend{align-content:end}\n.col{min-width:0}\n.stack{display:flex;flex-direction:column;gap:calc(var(--u)*1.8);min-width:0}\n.stack.tight{gap:calc(var(--u)*.6)}\n.stack.full{width:100%;height:100%;justify-content:flex-start}\n.row{display:flex;align-items:center;gap:calc(var(--u)*1.4);min-width:0}\n.row.between{justify-content:space-between}\n.dot{width:calc(var(--u)*.35);height:calc(var(--u)*.35);border-radius:50%;background:var(--accent);display:inline-block}\n.logowrap{display:inline-block;max-width:100%}\n.biglogo{display:block;width:100%;height:auto}\n.logo{width:auto;max-width:calc(var(--u)*18);object-fit:contain;display:block}\n.logo.white{filter:brightness(0) invert(1)}\n.tags{display:flex;flex-wrap:wrap;align-items:center;gap:calc(var(--u)*.9);opacity:.72}\n.tags i{width:calc(var(--u)*.3);height:calc(var(--u)*.3);border-radius:50%;background:var(--ink);opacity:.5}\n.hero{position:absolute;inset:0;z-index:0;overflow:hidden}\n.herom{position:absolute;inset:0;width:100%;height:100%;transform-origin:50% 50%;filter:var(--grade,none)}\n.herograd{position:absolute;inset:0}\n.herograd.landscape{background:linear-gradient(90deg,color-mix(in srgb,var(--bg) 96%,transparent) 0%,color-mix(in srgb,var(--bg) 78%,transparent) 36%,color-mix(in srgb,var(--bg) 30%,transparent) 62%,transparent 88%),linear-gradient(0deg,color-mix(in srgb,var(--bg) 92%,transparent) 0%,color-mix(in srgb,var(--bg) 40%,transparent) 38%,transparent 60%)}\n.herograd.portrait,.herograd.square{background:linear-gradient(0deg,color-mix(in srgb,var(--bg) 96%,transparent) 0%,color-mix(in srgb,var(--bg) 60%,transparent) 45%,transparent 80%)}\n.pane{position:relative;overflow:hidden;width:100%}\n.pane .media{position:absolute;inset:0;width:100%;height:100%;transform-origin:50% 50%}\n.mosaic{display:grid;gap:calc(var(--u)*1.4) calc(var(--u)*1.4);width:100%;flex:1 1 auto;min-height:0;grid-auto-rows:minmax(0,1fr)}\n.mosaic .cell{display:flex;flex-direction:column;gap:calc(var(--u)*.6);min-width:0;min-height:0}\n.mosaic .tile{position:relative;overflow:hidden;flex:1 1 auto;min-height:0;background:#1a1a1a}\n.mosaic .tile .media{position:absolute;inset:0;width:100%;height:100%;transform-origin:50% 50%}\n.lbl.cap{opacity:.6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.items{display:flex;flex-direction:column;min-width:0}\n.item{position:relative;display:grid;grid-template-columns:calc(var(--u)*4) 1fr;column-gap:calc(var(--u)*1.2);align-items:baseline;padding:calc(var(--u)*.8) 0 calc(var(--u)*.9)}\n.item .n{opacity:.5}\n.ititle{font-family:var(--font-text);font-weight:500;line-height:1.1;letter-spacing:-.01em}\n.idesc{font-family:var(--font-text);color:var(--muted);margin-top:.35em;line-height:1.3}\n.irule{grid-column:1/-1;margin-top:calc(var(--u)*.9)}\n.wall{display:grid;gap:calc(var(--u)*3) calc(var(--u)*2.5);width:100%;align-items:center;align-content:center;flex:1 1 auto;min-height:0}\n.wcell{display:flex;align-items:center;justify-content:flex-start;min-width:0;opacity:.92}\n.wcell .logo{max-width:100%}\n.url{display:inline-flex;flex-direction:column;gap:calc(var(--u)*.5);font-family:var(--font-text);font-weight:500;letter-spacing:.06em;align-self:flex-start}\n.url .hair{width:100%}\n.ctalogo{opacity:.9;height:auto;margin-top:calc(var(--u)*1.5)}\n.line{line-height:.9}\n.freecv{position:relative;width:100%;height:100%}\n.layer{position:absolute}.layer .media{width:100%;height:100%;display:block}\n`,\n  render(d2) {\n    const gsap = d2.lib(GSAP_SPEC), THREE = d2.lib(THREE_SPEC);\n    const ds = d2.data(); const recs = ds ? ds.records() : []; const loading = ds ? ds.loading : false; const lib = !!d2.param('library', false);\n    const eG = d2.lib.state(GSAP_SPEC) === 'error', eT = d2.lib.state(THREE_SPEC) === 'error';\n    let status = ''; if (eG || eT) status = 'Falha ao carregar bibliotecas: ' + (d2.lib.error(GSAP_SPEC) || d2.lib.error(THREE_SPEC)); else if (!gsap || !THREE) status = 'Carregando motor de animação…'; else if (loading && !recs.length) status = 'Carregando vídeos…'; else if (!recs.length && !d2.param('specJson')) status = 'Nenhum vídeo com spec na tabela.';\n    return '<div class=\"me' + (lib ? ' lib' : '') + '\">' + (lib ? '<aside class=\"libp\" data-d2-static data-lib></aside>' : '') +\n      '<div class=\"main\"><div class=\"top\" data-d2-static data-top></div><div class=\"host\" data-d2-static data-host></div><div class=\"bar\" data-d2-static data-bar></div></div>' +\n      (status ? '<div class=\"status\">' + H.esc(status) + '</div>' : '') + '</div>';\n  },\n  mounted(d2, root) {\n    const E = inst(d2);\n    d2.on('[data-act]', 'click', (e, el) => { const a = el.dataset.act; if (a === 'toggle') E.toggle(); else if (a === 'restart') E.restart(); else if (a === 'full') { const h = root.querySelector('[data-host]'); if (h && h.requestFullscreen) h.requestFullscreen().catch(() => { }); } else if (a === 'share') { const slug = E.rec ? E.rec.slug : ''; const url = location.origin + '/play?v=' + encodeURIComponent(slug) + '&c=' + encodeURIComponent(E.chKey || ''); const done = () => { el.textContent = 'Copiado'; setTimeout(() => { el.textContent = 'Link'; }, 1400); }; if (navigator.clipboard) navigator.clipboard.writeText(url).then(done, done); else done(); } else if (a === 'spec') { const me = root.querySelector('.me'); let box = me.querySelector('.specbox'); if (box) { box.remove(); return; } box = H.el('div', 'specbox'); box.setAttribute('data-d2-static', ''); box.innerHTML = '<button class=\"ib\" data-act=\"spec\">Fechar</button><pre>' + H.esc(JSON.stringify(E.spec || {}, null, 2)) + '</pre>'; me.appendChild(box); } });\n    d2.on('[data-chip]', 'click', (e, el) => { E.wantCh = el.dataset.chip; sync(d2, root); });\n    d2.on('[data-frame]', 'click', (e, el) => { E.seekFrame(+el.dataset.frame); });\n    d2.on('[data-vid]', 'click', (e, el) => { E.wantSlug = el.dataset.vid; E.wantCh = null; sync(d2, root); });\n    d2.on('[data-scrub]', 'input', (e, el) => { E.dragging = true; E.scrub(+el.value / 1000); });\n    d2.on('[data-scrub]', 'change', (e, el) => { E.dragging = false; E.scrub(+el.value / 1000); if (!E.static) E.play(); });\n    d2.on(window, 'keydown', (e) => { const t = e.target; if (t && (/^(input|textarea|select)$/i.test(t.tagName) || t.isContentEditable)) return; if (e.key === ' ') { e.preventDefault(); E.toggle(); } else if (e.key === 'ArrowRight') E.step(1); else if (e.key === 'ArrowLeft') E.step(-1); else if (e.key === 'f' || e.key === 'F') { const h = root.querySelector('[data-host]'); if (h && h.requestFullscreen) h.requestFullscreen().catch(() => { }); } });\n    d2.onUnmount(() => { E.destroy(); INST.delete(d2); });\n    sync(d2, root);\n  },\n  updated(d2, root) { sync(d2, root); }\n};\n"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataset"}}}},"video":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"video"}}}},"channel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"channel"}}}},"autoplay":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoplay"}}}},"loop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"loop"}}}},"library":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"library"}}}},"specJson":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"specJson"}}}}}}}}}},{"_id":"5ecd05ded68ce41360f74b43","component":"data2-core-types@Component","params":{"extendable":{"placeholder":"children"},"component":"Block","package":"data2-core-primitives"}},{"_id":"5f6cb5c4a575399a456635b9","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@DynamicVideo","params":{"children":{"component":"html@source","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}}}},"muted":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}},{"component":"data2-core-types@Reference","params":{"reference":"muted"}}]}},"source":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}},"playsInline":{"component":"data2-core-types@Reference","params":{"reference":"playsInline"}},"chapters":{"component":"data2-core-types@Reference","params":{"reference":"chapters"}},"autoPlay":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":false,"else":{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}}}},"loop":{"component":"data2-core-types@Reference","params":{"reference":"loop"}},"controls":{"component":"data2-core-types@Reference","params":{"reference":"showControls"}},"poster":{"component":"data2-core-types@Reference","params":{"reference":"poster"}},"style":{"position":"absolute","width":"100%","height":{"params":{"components":[{"params":{"reference":"style.height"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"100%"}}]},"component":"data2-core-logical-operators@Or"},"border":"none","padding":"none","overflow":"hidden"}}}}},"component":"VideoBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}}]}},{"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":"600dfc71204a007407784abd","parent":"5fc04343dd3ffe7d27a8811c","component":"data2-blocks@VideoBlock","system":"5fc04081c8da12be8b503153","params":{"super":{"fill":{"component":"data2-core-types@Color","params":{"rgba":"#f2f2f2","opacity":1}},"border":{"component":"data2-core-types@Border","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#707070","opacity":1}},"radius":{"leftTop":0,"rightTop":0,"leftBottom":0,"rightBottom":0},"width":{"left":1,"top":1,"right":1,"bottom":1}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1067.91,"height":600}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":166.99,"y":176.48,"top":true}}},"videoFile":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"zK1puz_BfwZPDDEEeFhZe"}},"showControls":true,"playsInline":false,"loop":true,"muted":true,"autoPlay":true,"chapters":[{"component":"data2-core-media@Chapter","params":{"title":"intro","time":"","timeStart":0.05,"timeEnd":27}},{"component":"data2-core-media@Chapter","params":{"title":"MASP","time":"","onEnd":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"video"}},"prop":"goTo","args":["Intro"]},"component":"data2-core-types@Interaction"},"timeStart":88,"timeEnd":120}},{"component":"data2-core-media@Chapter","params":{"title":"Teatro","time":"","timeStart":135,"timeEnd":240}},{"component":"data2-core-media@Chapter","params":{"title":"Montanhas","time":"","timeStart":240,"timeEnd":294}},{"component":"data2-core-media@Chapter","params":{"title":"Autodromo","time":"","timeStart":294,"timeEnd":393}},{"component":"data2-core-media@Chapter","params":{"title":"Paulista","time":"","timeStart":393,"timeEnd":440}},{"component":"data2-core-media@Chapter","params":{"title":"Elevado","time":"","timeStart":440}}]},"reference":"video"},{"_id":"6834cbd773faf0a74dedd41a","component":"data2-core-primitives@Artboard","system":"5fc04081c8da12be8b503153","displayName":"Responsive Application","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":1366,"exactHeight":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"alternativeArtboards":{"params":{"mobile":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"cq9eo0wgLK6J4ZGThFNal"}},"tablet":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"cq9eo0wgLK6J4ZGThFNal"}}},"component":"data2-core-types@ResponsiveArtboards"}},"reference":"QEdd3IfqUsNirCjuwkyoR"},{"_id":"6834cbd773faf0a74dedd41b","parent":"6834cbd773faf0a74dedd41a","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","displayName":"container","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(59,59,59,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":30}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}},{"_id":"6834cbd773faf0a74dedd421","component":"data2-core-primitives@Artboard","system":"5fc04081c8da12be8b503153","displayName":" Responsive Application Mobile","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":414,"height":814,"exactWidth":414,"exactHeight":814.06}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"cq9eo0wgLK6J4ZGThFNal"},{"_id":"6834cbd773faf0a74dedd41c","parent":"6834cbd773faf0a74dedd41b","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#080808","radius":{},"width":{"left":"0","top":"0","right":"1","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(127,136,147,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":242,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"right":false,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"SIDEBAR"}},"textColor":{"disabled":true,"component":"data2-core-types@Color","params":{}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":45}}}},{"_id":"6834cbd773faf0a74dedd41d","parent":"6834cbd773faf0a74dedd41b","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#000000","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(218,221,224,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1123,"height":77,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":243,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"text":"HEADER","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}},{"_id":"6834cbd773faf0a74dedd41e","parent":"6834cbd773faf0a74dedd41b","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(218,221,224,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1123,"height":614,"exactWidth":1123,"exactHeight":614}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":243,"y":78,"left":true,"exactX":243,"exactY":78,"right":true,"growH":false,"top":true,"bottom":true,"growV":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"repeat":{"params":{"content":10},"component":"data2-core-primitives@Number"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"item"}},"childrenMode":"grid","scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true,"dragToScroll":true,"hideScrollBar":true}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Number","initialValue":{"component":"data2-core-primitives@Number","params":{"content":-1}}}}]}},{"_id":"6834cbd773faf0a74dedd420","parent":"6834cbd773faf0a74dedd41b","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#000000","radius":{},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(218,221,224,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1122,"height":75,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":243,"left":true,"exactX":false,"exactY":false,"bottom":true,"right":true,"growH":false,"y":693}},"text":"FOOTER","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}},{"_id":"6834cbd773faf0a74dedd422","parent":"6834cbd773faf0a74dedd421","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","displayName":"container","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(193,193,193,1)"},"disabled":false},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":415,"height":814,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-1,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(59,59,59,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":30}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}},{"_id":"6834cbd773faf0a74dedd41f","parent":"6834cbd773faf0a74dedd41e","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":185,"exactWidth":240.44,"exactHeight":185.23}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":31,"y":30,"fixed":false,"exactX":false,"exactY":false,"top":true,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"context"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":20}},"shadow":{"params":{"then":{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-5","blur":"15","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(115,111,111,0.83)"}},"offsetY":"8","offsetX":"0"}},"else":[{"component":"data2-core-types@Shadow","params":{"type":"outset","blur":"24","spread":"8","offsetY":"32","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.23)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"outset","blur":"12","offsetY":"19","spread":"-10"}},{"component":"data2-core-types@Shadow","params":{"type":"inset","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.17)"}},"blur":"32","offsetY":"40","spread":"-14","offsetX":"15"}}],"compare":[{"params":{"subject":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6834cbd773faf0a74dedd41e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"itemRepeaterIndex"}}}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-flow@If"},"onMouseEnter":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6834cbd773faf0a74dedd41e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"itemRepeaterIndex"}}}}}},"onMouseLeave":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6834cbd773faf0a74dedd41e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":-1},"component":"data2-core-primitives@Number"}}},"transitions":[{"component":"data2-core-types@Transition","params":{"easing":"cubic-bezier(0.5,0.010375000000000023,0.5,0.986375)","scope":"ALL","duration":"180"}}]}},{"_id":"6834cbd773faf0a74dedd423","parent":"6834cbd773faf0a74dedd422","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(193,193,193,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":415,"height":77,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false}},"text":"SIDEBAR","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}},{"_id":"6834cbd773faf0a74dedd424","parent":"6834cbd773faf0a74dedd422","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":415,"height":660,"exactWidth":415,"exactHeight":659.98}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":78,"left":true,"exactX":0,"exactY":78,"right":true,"growH":false,"top":true,"bottom":true,"growV":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"repeat":{"params":{"content":10},"component":"data2-core-primitives@Number"},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"item"}},"childrenMode":"grid","scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true,"dragToScroll":true,"hideScrollBar":true}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Number","initialValue":{"component":"data2-core-primitives@Number","params":{"content":-1}}}}]}},{"_id":"6834cbd773faf0a74dedd426","parent":"6834cbd773faf0a74dedd422","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(193,193,193,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":415,"height":75,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"left":true,"exactX":false,"exactY":false,"bottom":true,"right":true,"growH":false,"y":739}},"text":"FOOTER","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}},{"_id":"6834cbd773faf0a74dedd425","parent":"6834cbd773faf0a74dedd424","component":"data2-core-primitives@Block","system":"5fc04081c8da12be8b503153","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"9"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(111,146,177,0.41)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":185,"exactWidth":240.44,"exactHeight":185.23}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":88,"y":26,"fixed":false,"exactX":false,"exactY":false,"top":true,"left":true}},"text":{"component":"data2-core-primitives@String","params":{"content":"context"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":20}},"shadow":{"params":{"then":[{"component":"data2-core-types@Shadow","params":{"type":"outset","blur":"24","spread":"8","offsetY":"32","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.23)"}}}},{"component":"data2-core-types@Shadow","params":{"type":"outset","blur":"12","offsetY":"19","spread":"-10"}},{"component":"data2-core-types@Shadow","params":{"type":"inset","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.17)"}},"blur":"32","offsetY":"40","spread":"-14","offsetX":"15"}}],"else":{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"-5","blur":"15","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(115,111,111,0.83)"}},"offsetY":"8","offsetX":"0"}},"compare":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6834cbd773faf0a74dedd424"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"itemRepeaterIndex"}}}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-flow@If"},"onMouseEnter":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6834cbd773faf0a74dedd424"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"itemRepeaterIndex"}}}}}},"onMouseLeave":{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6834cbd773faf0a74dedd424"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":-1},"component":"data2-core-primitives@Number"}}},"transitions":[{"component":"data2-core-types@Transition","params":{"easing":"cubic-bezier(0.5,0.010375000000000023,0.5,0.986375)","scope":"ALL","duration":"180"}}]}}]}},{"_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":"6834cbd773faf0a74dedd419","displayName":"Responsive Application App","reference":"3BPY2Zng4JAqMe7uqvVkz","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"responsive-application"}},"entryPoint":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"QEdd3IfqUsNirCjuwkyoR"}}},"system":"5fc04081c8da12be8b503153","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}