{"context":{"domain":"granado-app"},"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":"6a62e4640613f70fa449ff5d","name":"app","domain":"granado-app","visibility":"public","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-10-15T19:50:34.779Z","createdAt":"2026-07-24T04:04:52.993Z"}]}},{"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":"6a91bc369c836b9b0a986c27","component":"data2-core-types@Component","system":"6a62e4640613f70fa449ff5d","params":{"extends":"data2-core-primitives@Block","component":"granado-troca-ideal","package":"granado-app","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600;9..144,700&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;600&display=swap');\n:host{display:block;position:relative;width:100%;height:100%}\n*{box-sizing:border-box;margin:0;padding:0}\n.app{position:absolute;inset:0;display:grid;grid-template-rows:auto auto auto 1fr;background:#f4efe3;color:#20261f;font-family:'IBM Plex Sans',system-ui,sans-serif;overflow:hidden}\n.serif{font-family:'Fraunces',Georgia,serif}\nheader{padding:16px 28px 12px;border-bottom:1px solid #e2ddd0;background:#f7f4ec}\nheader h1{font-family:'Fraunces',Georgia,serif;font-size:20px;font-weight:600;color:#1e4d38}\nheader .sub{font-size:11.5px;color:#7a857c;margin-top:3px}\nheader .sub b{color:#a87f1f;font-weight:600}\n.kpis{display:flex;gap:26px;padding:10px 28px;background:#f7f4ec;border-bottom:1px solid #e2ddd0}\n.kpi b{display:block;font-family:'Fraunces',Georgia,serif;font-size:20px;font-weight:600;color:#1e4d38;line-height:1.1;font-variant-numeric:tabular-nums}\n.kpi.warn b{color:#a63a2b}\n.kpi span{font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:#7a857c;font-weight:600}\n.tabs{display:flex;gap:8px;padding:9px 28px;background:#f4efe3;border-bottom:1px solid #e2ddd0;align-items:center}\n.tab{background:#fffdf8;border:1px solid #e2ddd0;color:#4a564d;border-radius:99px;padding:6px 18px;font-size:12.5px;font-weight:600;cursor:pointer;font-family:inherit}\n.tab.hot{background:#1e4d38;border-color:#1e4d38;color:#f4efe3}\n.b-export{margin-left:auto;background:#a87f1f;border:none;color:#fffdf8;border-radius:99px;padding:6px 16px;font-size:12px;font-weight:700;cursor:pointer;font-family:inherit}\n.b-export:hover{background:#8f6b17}\n.body{min-height:0;overflow:hidden}\n.torre{display:grid;grid-template-columns:380px 1fr;height:100%}\n.entrada{display:grid;grid-template-columns:1fr 430px;height:100%}\n.col{overflow-y:auto;padding:16px 20px}\n.col.left{border-right:1px solid #e2ddd0}\n.ccard{background:#fffdf8;border:1px solid #e2ddd0;border-radius:12px;padding:12px 14px;margin-bottom:10px;cursor:pointer;position:relative}\n.ccard:hover{border-color:#b9c4ba}\n.ccard.sel{border-color:#1e4d38;box-shadow:0 0 0 1px #1e4d38}\n.chead{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:3px}\n.cid{font-family:'IBM Plex Mono',monospace;font-size:10px;color:#a87f1f;font-weight:600}\n.cwhen{font-size:10px;color:#9aa39b}\n.b-delcase{background:none;border:none;color:#cfc9b8;font-size:11px;cursor:pointer;padding:0 3px}\n.b-delcase:hover{color:#a63a2b}\n.cname{font-size:13.5px;font-weight:700;margin-bottom:2px}\n.cmeta{font-size:10.5px;color:#7a857c;margin-bottom:8px}\n.chips{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:8px}\n.chip{font-size:9px;font-weight:700;border-radius:99px;padding:2px 9px;background:#eef0e9;color:#4a564d}\n.chip.ok{background:#e2efe7;color:#2d6a4f}\n.chip.crit{background:#f7e4df;color:#a63a2b}\n.chip.gold{background:#f4ead2;color:#a87f1f}\n.chip.org{background:#1e4d38;color:#f4efe3}\n.bars{display:grid;gap:4px}\n.bar{display:grid;grid-template-columns:54px 1fr auto;gap:8px;align-items:center;font-size:8.5px}\n.bar .bl{font-weight:700;letter-spacing:.06em;text-transform:uppercase}\n.bar.p .bl{color:#1e4d38}.bar.d .bl{color:#a87f1f}\n.bt{height:5px;border-radius:99px;background:#ece8db;overflow:hidden}\n.bf{height:100%;border-radius:99px}\n.bar.p .bf{background:#1e4d38}.bar.d .bf{background:#a87f1f}\n.bar .bn{font-family:'IBM Plex Mono',monospace;font-size:8.5px;color:#9aa39b}\n.dhead{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}\n.dhead h2{font-family:'Fraunces',Georgia,serif;font-size:21px;font-weight:600}\n.dhr{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n.did{font-family:'IBM Plex Mono',monospace;font-size:11px;color:#a87f1f;font-weight:600}\n.b-walk{background:#1e4d38;border:none;color:#f4efe3;border-radius:8px;font-size:11px;font-weight:700;padding:6px 13px;cursor:pointer;font-family:inherit}\n.b-walk:hover{background:#2d6a4f}\n.b-restore{background:none;border:1px solid #e2ddd0;border-radius:8px;color:#9aa39b;font-size:10px;padding:5px 9px;cursor:pointer;font-family:inherit}\n.b-restore:hover{color:#a63a2b;border-color:#e6c2ba}\n.dmeta{font-size:11.5px;color:#7a857c;margin:4px 0 12px}\n.dmeta b{color:#1e4d38}\n.walkbar{background:#1e4d38;color:#f4efe3;border-radius:10px;padding:10px 15px;margin-bottom:14px;display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}\n.walkbar .wt{font-size:12px;font-weight:700}\n.walkbar .wp{font-family:'IBM Plex Mono',monospace;font-size:11px;opacity:.85}\n.promessa{background:#f4ead2;border:1px solid #e6d5a8;border-radius:10px;padding:10px 15px;font-size:12px;color:#6b5413;margin-bottom:16px}\n.promessa b{color:#a87f1f}\n.tls{display:grid;grid-template-columns:1fr 1fr;gap:20px}\n@media(max-width:1100px){.tls{grid-template-columns:1fr}}\n.tlbox{background:#fffdf8;border:1px solid #e2ddd0;border-radius:12px;padding:16px 16px 12px}\n.tlbox h3{font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;margin-bottom:14px;display:flex;align-items:center;gap:7px}\n.tlbox.p h3{color:#1e4d38}.tlbox.d h3{color:#a87f1f}\n.tlbox h3 i{width:9px;height:9px;border-radius:50%;font-style:normal}\n.tlbox.p h3 i{background:#1e4d38}.tlbox.d h3 i{background:#a87f1f}\n.tlbox.p{--tc:#1e4d38}.tlbox.d{--tc:#a87f1f}\n.vstep{position:relative;padding:0 0 16px 24px}\n.vstep::before{content:'';position:absolute;left:5px;top:14px;bottom:0;width:2px;background:#ece8db}\n.vstep:last-of-type::before{display:none}\n.vstep::after{content:'';position:absolute;left:0;top:3px;width:12px;height:12px;border-radius:50%;border:2px solid #cfc9b8;background:#fffdf8}\n.vstep.done::after{border-color:var(--tc);background:var(--tc)}\n.vstep.done::before{background:var(--tc)}\n.vstep.now::after{border-color:#1e4d38;box-shadow:0 0 0 3px #e2efe7}\n.vstep.now.br::after{border-color:#a63a2b;box-shadow:0 0 0 3px #f7e4df}\n.vstep.walkhl{background:#f7f4ec;border-radius:10px;padding:8px 8px 12px 24px;margin-left:-8px}\n.vtop{display:flex;justify-content:space-between;gap:8px;align-items:baseline}\n.vn{font-size:12.5px;font-weight:700;line-height:1.3}\n.vbtns{display:flex;gap:2px;align-items:center;flex-shrink:0}\n.ebtn,.mbtn{background:none;border:none;color:#b9c4ba;font-size:12px;cursor:pointer;padding:0 2px;line-height:1;font-family:inherit}\n.ebtn:hover{color:#1e4d38}\n.mbtn{font-size:11px;font-weight:700}\n.mbtn:hover{color:#a87f1f}\n.mbtn[disabled]{opacity:.25;cursor:default}\n.vo{font-size:10.5px;color:#4a564d;margin-top:2px}\n.vo b{color:#1e4d38}\n.vmora{font-size:10px;color:#4a564d;margin-top:3px}\n.vmora b{color:#6b5413;font-weight:600}\n.hbadge{display:inline-block;font-size:8.5px;font-weight:700;border-radius:99px;padding:1.5px 8px;margin-left:6px;vertical-align:1px}\n.hbadge.manual{background:#f7e4df;color:#a63a2b}\n.hbadge.parcial{background:#f4ead2;color:#a87f1f}\n.hbadge.auto{background:#e2efe7;color:#2d6a4f}\n.hbadge.inexistente{background:#e8e4d8;color:#7a857c}\n.vw{font-family:'IBM Plex Mono',monospace;font-size:9.5px;color:#9aa39b;margin-top:2px}\n.vw.done{color:#2d6a4f}\n.vw.br{color:#a63a2b;font-weight:600}\n.vfonte{font-size:10px;color:#7a857c;margin-top:5px;line-height:1.45}\n.vfonte b{color:#4a564d;font-weight:600}\n.vdores{font-size:10px;color:#a63a2b;margin-top:3px;line-height:1.5;background:#fbf1ee;border-radius:6px;padding:5px 8px;white-space:pre-line}\n.vdores b{font-weight:700}\n.b-add{width:100%;background:none;border:1px dashed #cfc9b8;border-radius:8px;color:#9aa39b;font-size:11px;font-weight:600;padding:7px;cursor:pointer;font-family:inherit;margin-top:2px}\n.b-add:hover{color:#1e4d38;border-color:#1e4d38}\n.eform{background:#f7f4ec;border:1px solid #e2ddd0;border-radius:10px;padding:12px;margin-top:4px}\n.eform .fl{font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:#7a857c;font-weight:700;margin:8px 0 3px}\n.eform .fl:first-child{margin-top:0}\n.eform input,.eform textarea,.eform select{width:100%;background:#fffdf8;border:1px solid #e2ddd0;border-radius:7px;padding:6px 9px;font-size:12px;color:#20261f;font-family:inherit;resize:vertical}\n.eform input:focus,.eform textarea:focus,.eform select:focus{outline:none;border-color:#1e4d38}\n.ebtns{display:flex;gap:7px;margin-top:12px;flex-wrap:wrap}\n.b-save{flex:1;background:#1e4d38;border:none;color:#f4efe3;border-radius:7px;padding:7px;font-size:12px;font-weight:700;cursor:pointer;font-family:inherit}\n.b-cancel{background:none;border:1px solid #e2ddd0;color:#7a857c;border-radius:7px;padding:7px 12px;font-size:12px;cursor:pointer;font-family:inherit}\n.b-del{background:none;border:1px solid #e6c2ba;color:#a63a2b;border-radius:7px;padding:7px 12px;font-size:12px;cursor:pointer;font-family:inherit}\n.b-wprev,.b-wnext{background:#a87f1f;border:none;color:#fffdf8;border-radius:7px;padding:7px 14px;font-size:12px;font-weight:700;cursor:pointer;font-family:inherit}\n.b-wnext{flex:1}\n.b-wprev[disabled]{opacity:.4;cursor:default}\n.logbox{margin-top:18px}\n.logbox h3{font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:#7a857c;font-weight:700;margin-bottom:8px}\n.lrow{display:grid;grid-template-columns:44px 1fr;gap:10px;padding:6px 0;border-bottom:1px solid #ece8db;font-size:11.5px}\n.lrow:last-child{border-bottom:none}\n.lt{font-family:'IBM Plex Mono',monospace;font-size:10px;color:#9aa39b;padding-top:2px}\n.lm{color:#4a564d}\n.lm .auto{font-size:8.5px;font-weight:700;background:#e2efe7;color:#2d6a4f;border-radius:99px;padding:1px 7px;margin-right:6px;vertical-align:1px}\n.na{color:#9aa39b;font-size:12px;font-style:italic;padding:24px 0;text-align:center}\n.cover{background:#fffdf8;border:1px solid #e2ddd0;border-radius:12px;padding:16px 18px;margin-bottom:14px}\n.cover h4{font-family:'Fraunces',Georgia,serif;font-size:14px;font-weight:600;color:#1e4d38;margin-bottom:10px}\n.crow{display:grid;grid-template-columns:1fr auto;gap:10px;padding:6px 0;border-bottom:1px solid #ece8db;font-size:11.5px;color:#4a564d;align-items:center}\n.crow:last-child{border-bottom:none}\n.cyes{color:#2d6a4f;font-weight:700;font-size:10.5px}\n.cno{color:#a63a2b;font-weight:700;font-size:10.5px}\n.fitem{background:#fffdf8;border:1px solid #e2ddd0;border-radius:12px;padding:14px 16px;margin-bottom:11px}\n.ftop{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px}\n.fraw{font-size:12px;color:#4a564d;font-style:italic;border-left:3px solid #e2ddd0;padding-left:11px;margin-bottom:10px;line-height:1.5}\n.farrow{font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;color:#a87f1f;font-weight:700;margin-bottom:7px}\n.fchips{display:flex;gap:5px;flex-wrap:wrap}\n.fchip{font-family:'IBM Plex Mono',monospace;font-size:10px;background:#eef0e9;border-radius:6px;padding:2px 8px;color:#4a564d}\n.fcase{font-family:'IBM Plex Mono',monospace;font-size:10px;color:#2d6a4f;font-weight:600;margin-top:9px}\n.form{background:#fffdf8;border:1px solid #e2ddd0;border-radius:14px;padding:20px 20px 16px}\n.form h3{font-family:'Fraunces',Georgia,serif;font-size:16px;font-weight:600;color:#1e4d38;margin-bottom:4px}\n.form .fs{font-size:11px;color:#7a857c;margin-bottom:14px}\n.form .fl{font-size:9.5px;letter-spacing:.07em;text-transform:uppercase;color:#7a857c;font-weight:700;margin:10px 0 4px}\n.fi{width:100%;background:#f7f4ec;border:1px solid #e2ddd0;border-radius:8px;padding:8px 11px;font-size:12.5px;color:#20261f;font-family:inherit}\n.fi:focus{outline:none;border-color:#1e4d38}\n.fbtn{width:100%;margin-top:16px;background:#1e4d38;border:none;color:#f4efe3;border-radius:9px;padding:10px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit}\n.fbtn:hover{background:#2d6a4f}\n.fnote{font-size:10px;color:#9aa39b;margin-top:9px;line-height:1.5}\n.toast{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);background:#1e4d38;color:#f4efe3;border-radius:99px;padding:9px 22px;font-size:12.5px;font-weight:700;z-index:50;opacity:0;transition:opacity .3s;pointer-events:none}\n.toast.show{opacity:1}\n`,\n  render(d2){\n    return `<div class=\"app\">\n      <header>\n        <h1>Torre de Controle de Trocas — Mundo Ideal</h1>\n        <div class=\"sub\">Casos reais mapeados na discovery. Em cada etapa: <b>dono</b>, <b>onde mora hoje</b> e as dores. Os casos marcados <b>A MAPEAR</b> (expressa via loja física) são os buracos — use <b>▶ percorrer</b> pra preenchê-los e <b>📋 copiar respostas</b> no fim.</div>\n      </header>\n      <div class=\"kpis\" data-d2-static>\n        <div class=\"kpi\"><b class=\"k-ativos\">0</b><span>casos</span></div>\n        <div class=\"kpi warn\"><b class=\"k-manual\">0</b><span>etapas manuais / inexistentes</span></div>\n        <div class=\"kpi\"><b class=\"k-auto\">0</b><span>etapas já automáticas</span></div>\n        <div class=\"kpi\"><b class=\"k-resp\">0%</b><span>etapas respondidas</span></div>\n      </div>\n      <div class=\"tabs\" data-d2-static>\n        <button class=\"tab hot\" data-v=\"torre\">🗼 Torre de Controle</button>\n        <button class=\"tab\" data-v=\"entrada\">📥 Canal de Entrada</button>\n        <button class=\"b-export\">📋 copiar respostas</button>\n      </div>\n      <div class=\"body\" data-d2-static></div>\n      <div class=\"toast\" data-d2-static></div>\n    </div>`\n  },\n  mounted(d2){\n    const bodyEl=d2.$('.body'); if(!bodyEl)return\n    const NOW=Date.now()\n    const D=n=>new Date(NOW+n*864e5).toISOString()\n    const fdm=t=>{if(!t)return'';const x=new Date(t);return String(x.getDate()).padStart(2,'0')+'/'+String(x.getMonth()+1).padStart(2,'0')}\n    const esc=s=>String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')\n    const ORIGENS={cd:'📦 CD',dark:'⚡ Darkstore',loja:'🏬 Loja'}\n    const HOJE={manual:'hoje: manual',parcial:'hoje: parcial',auto:'hoje: automático',inexistente:'hoje: não existe'}\n    const KEY='gideal_v4'\n    const AD='a definir na sessão'\n    function mk(o){return Object.assign({n:'',dono:AD,mora:AD,sla:'—',state:'next',when:null,fonte:'',dores:'',hoje:'manual',note:'',br:false},o)}\n    const DEFAULTS=[\n      {id:'TR-1042',cliente:'Marina Duarte',origem:'cd',entrega:'entrega normal',marca:'Granado',tipo:'Arrependimento',pagto:'Crédito · Adyen',valor:186,risco:'baixo',when:D(-2),canal:'TroqueCommerce',\n       status:{t:'Fluxo CD — mapeado ✔',cls:'ok'},\n       promessa:'Fluxo real mapeado: entrada pelo <b>TroqueCommerce já é automática</b>. Os gargalos são a autorização da logística (<b>hoje 5–10 dias, ideal 1 dia</b> — confirmado com o Jefferson) e a cadeia planilha OMNI+SAC → Adyen um a um.',\n       produto:[\n        mk({n:'Solicitação',dono:'Digital / SAC',mora:'TroqueCommerce',hoje:'auto',state:'done',when:D(-2),fonte:'TroqueCommerce',dores:'Cliente pode não encontrar o TroqueCommerce — origens diferentes exigem canais diferentes de contestação (pode chegar via atalhos: WhatsApp, template Boxlink).\\nCobertura: entrega normal (CD) e expressa via Darkstore SIM · expressa via LOJA não.\\n[CASO CD] cliente solicita no TroqueCommerce e recebe a etiqueta para postar nos Correios.'}),\n        mk({n:'Postagem pelo cliente',dono:'Cliente / Troque',mora:'Troque.app.br',hoje:'parcial',state:'done',when:D(-1),fonte:'Integração Troque (etiqueta emitida no caso)',dores:'até a postagem do cliente, o processo fica em HOLD'}),\n        mk({n:'Autorização de reembolso — CD [Jeferson]',dono:'Jeferson · Logística',mora:'Logística — processo manual',hoje:'manual',sla:'ideal 1d · hoje 5–10d',state:'now',note:'fila de validação manual',fonte:'Autorização automática por política; exceção manual só p/ histórico fraudulento',dores:'validação manual das evidências de troca · validação dos itens devolvidos a partir do Troque.\\nMundo ideal: dispensar a etapa p/ cliente SEM histórico fraudulento; rever a política de autorização com base no recebimento.\\nEscala: aprovação nível 1 por PESO (pedidos multi-itens) · nível 2 completa facilitada com balança + bipper.'})],\n       dinheiro:[\n        mk({n:'Logística autoriza reembolso',dono:'Logística',mora:'Magento (cancelamento manual) + SAP (cancela nota, concilia estoque) + planilha OMNI+SAC 2026.xlsx',hoje:'manual',state:'now',note:'aguardando autorização',fonte:'Autorização dispara o caso automaticamente',dores:'o reembolso NÃO inicia até a logística autorizar.\\nProcesso: pedido cancelado manualmente no Magento → SAP cancela nota e concilia estoque → dados extraídos do Magento digitados na planilha OMNI+SAC 2026.xlsx'}),\n        mk({n:'Financeiro processa reembolso',dono:'Financeiro',mora:'Planilha + painel Adyen (um a um)',hoje:'manual',sla:'ideal imediato · hoje até 24h',state:'next',when:D(2),fonte:'API Adyen disparada pelo caso',dores:'dependendo do horário da autorização, leva até 24h.\\nCartão de crédito: cada reembolso da planilha é liberado na Adyen manualmente, um a um.'})],\n       log:[{t:D(-2),a:1,m:'Solicitação criada no TroqueCommerce — etiqueta emitida'},{t:D(-1),a:1,m:'Cliente postou nos Correios — HOLD liberado'}]},\n      {id:'TR-1038',cliente:'Paulo Mendes',origem:'cd',entrega:'entrega normal',marca:'Granado',tipo:'Arrependimento',pagto:'Crédito · Adyen',valor:318,risco:'médio',when:D(-9),canal:'SAC',\n       status:{t:'Variante: cliente caiu no SAC',cls:'gold'},\n       promessa:'Mesmo fluxo do CD, mas o cliente <b>não encontrou o TroqueCommerce</b> e caiu no SAC — o caso vira troca de e-mails antes de entrar no trilho.',\n       produto:[\n        mk({n:'Solicitação',dono:'SAC',mora:'Sistema do SAC (vira e-mail)',hoje:'manual',state:'done',when:D(-9),fonte:'SAC registra direto no caso',dores:'cliente não encontrou o TroqueCommerce e caiu no SAC — caso vira troca de e-mails.\\nPERGUNTA: o SAC consegue abrir o caso no TroqueCommerce em nome do cliente?'}),\n        mk({n:'Postagem pelo cliente',dono:'Cliente / Troque',mora:'Troque.app.br',hoje:'parcial',state:'done',when:D(-8),fonte:'Troque',dores:'até a postagem, processo em HOLD'}),\n        mk({n:'Autorização de reembolso — CD [Jeferson]',dono:'Jeferson · Logística',mora:'Logística — processo manual',hoje:'manual',sla:'ideal 1d · hoje 5–10d',state:'now',note:'na fila há 8 dias',br:true,fonte:'Autorização automática por política + score',dores:'mesma fila manual — este caso está parado há 8 dias (faixa real: 5–10d)'})],\n       dinheiro:[\n        mk({n:'Logística autoriza reembolso',dono:'Logística',mora:'Magento manual + SAP + planilha OMNI+SAC 2026.xlsx',hoje:'manual',state:'next',when:D(3),fonte:'Autorização dispara o caso',dores:'não inicia até a logística autorizar'}),\n        mk({n:'Financeiro processa reembolso',dono:'Financeiro',mora:'Planilha + painel Adyen (um a um)',hoje:'manual',sla:'ideal imediato · hoje até 24h',state:'next',when:D(4),fonte:'API Adyen',dores:'um a um na Adyen'})],\n       log:[{t:D(-9),a:0,m:'Cliente abriu por e-mail no SAC — registrado manualmente'},{t:D(0),a:1,m:'Alerta: autorização parada há 8 dias (SLA ideal: 1d)'}]},\n      {id:'TR-1041',cliente:'Renata Alves',origem:'cd',entrega:'entrega normal',marca:'Care',tipo:'Defeito',pagto:'PIX parcelado · PagBrasil',valor:212,risco:'médio',when:D(-4),canal:'Shopify / SAC',\n       status:{t:'Pior caminho: Care + PagBrasil',cls:'gold'},\n       promessa:'Care (Shopify) + PIX parcelado (PagBrasil) — hoje o caminho com <b>zero automação</b> nas duas pontas.',\n       produto:[\n        mk({n:'Solicitação',dono:'Digital',mora:'Shopify (Care, separado de tudo)',hoje:'manual',state:'done',when:D(-4),fonte:'Portal pós-venda (mesmo fluxo pras 3 marcas)',dores:'Care roda no Shopify; conexão OMS↔Shopify quebrada — recusa nem aparece pro cliente.\\nPERGUNTA: o TroqueCommerce cobre Care?'}),\n        mk({n:'Autorização',dono:'Digital',mora:'Shopify + OMS (manual)',hoje:'manual',sla:'4h',state:'done',when:D(-4),fonte:'Política codificada por marca',dores:'pra Care, tudo manual — zero automação mesmo em recusa da loja'}),\n        mk({n:'Coleta agendada',dono:'Logística reversa',mora:'não existe — cliente vai ao correio',hoje:'inexistente',sla:'48h',state:'done',when:D(-3),fonte:'Agendamento automático no caso',dores:'cada item que chega exige descobrir \"de qual pedido é\"'}),\n        mk({n:'Recebimento CD',dono:'CD',mora:'Recebimento físico sem identificação',hoje:'manual',state:'now',note:'previsto hoje',fonte:'Bipagem vinculada ao caso',dores:'chega sem identificação — investigação manual por item'}),\n        mk({n:'Conferência',dono:'CD',mora:'CD + planilha do CD',hoje:'manual',sla:'3d úteis',state:'next',when:D(2),fonte:'Fila com checklist + foto',dores:'fila de meses, 1 pessoa'}),\n        mk({n:'Destino: análise Qualidade',dono:'Qualidade',mora:'não existe — itens acumulam em armários',hoje:'inexistente',state:'next',when:D(2),fonte:'Matriz devolver-vs-descartar',dores:'descarte não acontece — 2 armários lotados de devoluções'})],\n       dinheiro:[\n        mk({n:'Elegibilidade',dono:'Digital',mora:'OMS + política no papel',hoje:'manual',sla:'imediata',state:'done',when:D(-4),fonte:'Política + pedido'}),\n        mk({n:'Decisão',dono:'Financeiro',mora:'Caso a caso com a PagBrasil',hoje:'manual',sla:'24h',state:'next',when:D(3),fonte:'Resultado da conferência',dores:'pra PagBrasil, alguém resolve direto com a processadora'}),\n        mk({n:'Execução',dono:'Financeiro',mora:'Contato manual com PagBrasil',hoje:'manual',sla:'2h',state:'next',when:D(3),fonte:'API da processadora',dores:'PIX parcelado não tem automação pra NENHUMA marca'}),\n        mk({n:'Na fatura',dono:'Processadora',mora:'Fatura do cliente',hoje:'inexistente',state:'next',when:D(4),fonte:'Webhook'})],\n       log:[{t:D(-4),a:0,m:'Caso Care registrado manualmente'},{t:D(-4),a:1,m:'Cliente notificada com a previsão das duas trilhas'}]},\n      {id:'TR-1044',cliente:'Cláudia Nunes',origem:'dark',entrega:'expressa',marca:'Phebo',tipo:'Defeito (produto vazando)',pagto:'Crédito · Adyen',valor:42,risco:'baixo',when:D(-1),canal:'TroqueCommerce',\n       status:{t:'Fluxo Darkstore — mapeado ✔ (4 perguntas abertas)',cls:'gold'},\n       promessa:'Troca por defeito via Darkstore: entrada <b>✅ TroqueCommerce</b> (validado em Loyalty e EComm). O [Processo Jeferson] valida e <b>refaz o pedido no Magento na mão</b>. Quatro perguntas abertas na etapa 2.',\n       produto:[\n        mk({n:'Solicitação — defeito (produto vazando)',dono:'Digital',mora:'TroqueCommerce',hoje:'auto',state:'done',when:D(-1),fonte:'TroqueCommerce',dores:'template é enviado sempre mandando o cliente pro Troque (validado em Loyalty e EComm — ambos Darkstore)'}),\n        mk({n:'[Processo Jeferson] — validação',dono:'Jeferson · Logística',mora:'Logística — manual',hoje:'manual',sla:'ideal 1h · hoje ~30d',state:'now',note:'fila de validação',fonte:'Validação automática por foto + matriz Qualidade',dores:'validação mecânica do produto devolvido.\\nPERGUNTAS ABERTAS:\\n· no Troque dá pra escolher os produtos a substituir? se não, como isso é feito?\\n· motivos diferentes (devolução/cancelamento/defeito) recebem tratativas diferentes?\\n· quais são (e quais deveriam ser) os critérios pra abrir contestação no Troque?\\n· quais canais o Troque atende hoje?'}),\n        mk({n:'Criação do novo pedido [refazer pedido]',dono:'Logística',mora:'Magento — manual',hoje:'manual',state:'next',when:D(2),fonte:'Pedido de troca gerado automaticamente pelo caso',dores:'novo pedido criado manualmente no Magento'})],\n       dinheiro:[\n        mk({n:'Elegibilidade',dono:'Digital',mora:'OMS',hoje:'manual',sla:'imediata',state:'done',when:D(-1),fonte:'Política + foto'}),\n        mk({n:'Decisão: estorno imediato',dono:'automático (score)',mora:'não existe',hoje:'inexistente',sla:'imediata',state:'done',when:D(-1),fonte:'Score antifraude'}),\n        mk({n:'Execução',dono:'Financeiro',mora:'Painel Adyen (manual)',hoje:'manual',sla:'2h',state:'done',when:D(-1),fonte:'API'}),\n        mk({n:'Na fatura',dono:'Processadora',mora:'Fatura do cliente',hoje:'inexistente',state:'done',when:D(0),fonte:'Webhook'})],\n       log:[{t:D(-1),a:1,m:'Solicitação criada no TroqueCommerce com foto do defeito'},{t:D(0),a:0,m:'Aguardando validação do [Processo Jeferson]'}]},\n      {id:'TR-1046',cliente:'Bruna Costa',origem:'loja',entrega:'expressa',marca:'Granado',tipo:'Arrependimento',pagto:'Crédito · Adyen',valor:154,risco:'baixo',when:D(0),canal:'❓ a mapear',\n       status:{t:'A MAPEAR — expressa via loja',cls:'crit'},\n       promessa:'<b>Entrega expressa que saiu de LOJA FÍSICA.</b> Esse é o buraco do mapa — o TroqueCommerce <b>não cobre</b> esse caso. Como o cliente contesta? Pra onde volta o produto? Quem autoriza? Percorra e preencha.',\n       produto:[\n        mk({n:'Solicitação',hoje:'manual',state:'now',note:'caminho desconhecido',dores:'TroqueCommerce NÃO disponível pra entrega por loja — por onde esse cliente entra hoje? Template Boxlink? WhatsApp? SAC?'}),\n        mk({n:'Devolução do produto',hoje:'manual',dores:'o produto volta pra onde: a loja que enviou, o CD ou a darkstore? quem emite a etiqueta/coleta?'}),\n        mk({n:'Conferência',hoje:'manual',dores:'quem valida a devolução quando a origem é loja? a loja tem processo e gente pra isso? passa pelo [Processo Jeferson] do CD?'}),\n        mk({n:'Estoque',hoje:'manual',dores:'o estoque volta pra loja no SAP? mesmo risco de estoque fantasma da devolução via escritório?'})],\n       dinheiro:[\n        mk({n:'Autorização de reembolso',hoje:'manual',dores:'quem autoriza quando a origem é loja — também o Jeferson (CD)? a própria loja? o digital?'}),\n        mk({n:'Execução',mora:'Painel Adyen (manual)?',hoje:'manual',dores:'a RECUSA da loja tem estorno automático (Adyen, Granado/Phebo) — e o arrependimento pós-entrega, tem?'}),\n        mk({n:'Na fatura',dono:'Processadora',mora:'Fatura do cliente',hoje:'inexistente',fonte:'Webhook'})],\n       log:[{t:D(0),a:0,m:'Caso criado na discovery pra mapear o caminho expressa-via-loja'}]},\n      {id:'TR-1047',cliente:'Eduardo Reis',origem:'loja',entrega:'expressa',marca:'Granado',tipo:'Expressa atrasada / frete',pagto:'Crédito · Adyen',valor:210,risco:'—',when:D(0),canal:'❓ a mapear',\n       status:{t:'A MAPEAR — expressa via loja',cls:'crit'},\n       promessa:'Caso real conhecido: cliente pagou <b>R$ 20 de frete expresso (promessa de 2 dias)</b>, pedido ficou 5 dias sem faturar, coleta só no 6º dia. Quem detecta, quem devolve o frete, e o cancelamento segue qual fluxo?',\n       produto:[\n        mk({n:'Pedido travado sem faturar',dono:'Fiscal',mora:'SAP + e-mail diário no Teams',hoje:'parcial',state:'done',when:D(-1),fonte:'Detecção automática de pedido pago sem nota',dores:'expressa só coleta DEPOIS de faturar; caso real: 5 dias parado, nota forçada na mão, coleta no 6º dia'}),\n        mk({n:'Detecção do atraso',mora:'hoje: a reclamação do cliente',hoje:'inexistente',state:'now',note:'cliente reclamou',dores:'ninguém detecta a expressa órfã — CEP fora de abrangência também deixa pedido sem dono e sem alerta. Quem deveria ser o dono desse alarme?'}),\n        mk({n:'Coleta e entrega',dono:'EuEntrego / loja',mora:'planilha manual de CEPs por unidade',hoje:'manual',dores:'a cobertura por raio mora numa planilha manual por loja — desalinhada do checkout'})],\n       dinheiro:[\n        mk({n:'Reembolso do frete',hoje:'manual',dores:'cliente pagou R$ 20 pela promessa de 2 dias — quem decide e quem executa o reembolso do frete?'}),\n        mk({n:'Cancelamento (se o cliente desistir)',hoje:'manual',dores:'cancelamento de expressa de loja segue qual fluxo? recusa-da-loja tem Adyen automático — e o cancelamento por atraso?'})],\n       log:[{t:D(0),a:0,m:'Caso criado na discovery a partir do caso real relatado em reunião'}]},\n      {id:'TR-1039',cliente:'Jorge Lima',origem:'loja',entrega:'retirada',marca:'Phebo',tipo:'Não retirado',pagto:'PIX · Adyen',valor:74,risco:'—',when:D(-12),canal:'—',\n       status:{t:'Resolução automática agendada',cls:'gold'},\n       promessa:'Retirada não realizada. Aviso automático no 7º dia; se não retirar até <b>'+fdm(D(18))+'</b>, o caso <b>cancela e estorna sozinho</b> — sem depender de favor.',\n       produto:[\n        mk({n:'Pedido pronto na loja',dono:'Loja',mora:'OMS + SAP',hoje:'manual',state:'done',when:D(-12),fonte:'OMS + faturamento SAP',dores:'pedido pode travar dias no SAP sem faturar; loja sabe mas não pode liberar — às vezes entrega SEM NOTA (risco chargeback)'}),\n        mk({n:'Aviso automático · 7 dias',dono:'automático',mora:'Régua de e-mail (já implementada)',hoje:'auto',state:'done',when:D(-5),fonte:'Régua do caso (WhatsApp + e-mail)',dores:'só o aviso existe — o \"cancelamento automático em 7 dias\" é mito'}),\n        mk({n:'Prazo final · 30 dias',dono:'automático',mora:'Memória da gerente da darkstore (favor informal)',hoje:'manual',state:'now',note:'resolução automática em '+fdm(D(18)),fonte:'Gatilho de tempo do caso',dores:'depende de a gerente \"quebrar um galho\" e avisar o digital; daí tudo manual: SAP + planilha do financeiro'})],\n       dinheiro:[\n        mk({n:'Elegibilidade condicional',dono:'automático',mora:'ninguém enxerga até alguém reclamar',hoje:'inexistente',state:'next',when:D(18),fonte:'Ativada pelo gatilho dos 30 dias'}),\n        mk({n:'Estorno automático',dono:'automático',mora:'Painel Adyen (manual)',hoje:'manual',sla:'2h',state:'next',when:D(18),fonte:'API'}),\n        mk({n:'Na fatura',dono:'Processadora',mora:'Fatura do cliente',hoje:'inexistente',state:'next',when:D(19),fonte:'Webhook'})],\n       log:[{t:D(-5),a:1,m:'Aviso dos 7 dias disparado automaticamente'}]},\n      {id:'TR-1040',cliente:'Balcão Barra Shopping',origem:'loja',entrega:'balcão',marca:'Granado',tipo:'Troca no balcão',pagto:'Voucher na hora',valor:59,risco:'—',when:D(0),canal:'Loja',\n       status:{t:'Resolvido na loja · 11min',cls:'ok'},\n       promessa:'A loja resolveu <b>no balcão</b>, pelo fluxo que já existe no sistema da loja — sem mandar o cliente pra casa abrir SAC.',\n       produto:[\n        mk({n:'Registro pela loja',dono:'Loja',mora:'Sistema da loja (fluxo existe, não é usado)',hoje:'inexistente',state:'done',when:D(0),fonte:'Sistema da loja (fluxo de troca que JÁ existe)',dores:'o fluxo existe mas não é usado — a loja manda o cliente voltar pra casa e abrir SAC'}),\n        mk({n:'Troca efetuada',dono:'Loja',mora:'Balcão',hoje:'manual',sla:'15min',state:'done',when:D(0),fonte:'Balcão'}),\n        mk({n:'Estoque ajustado',dono:'automático',mora:'SAP (ajuste manual, quando acontece)',hoje:'manual',state:'done',when:D(0),fonte:'Sistema da loja → SAP'})],\n       dinheiro:[\n        mk({n:'Voucher emitido na hora',dono:'Loja',mora:'Sistema da loja',hoje:'manual',sla:'imediato',state:'done',when:D(0),fonte:'Sistema da loja',dores:'estorno parcial (ex.: cartão-presente) depende de UMA pessoa específica — conhecimento tribal'})],\n       log:[{t:D(0),a:1,m:'Fluxo de balcão ativado — cliente saiu com a troca feita'}]}\n    ]\n    const COVER=[\n      {r:'📦 CD · entrega normal',ok:true,n:'cliente recebe etiqueta e posta nos Correios'},\n      {r:'⚡ Darkstore · expressa',ok:true,n:'validado em Loyalty e EComm'},\n      {r:'🏬 Loja · expressa (SFS)',ok:false,n:'A MAPEAR — casos TR-1046 / TR-1047'},\n      {r:'🏬 Loja · retirada',ok:false,n:'fluxo próprio: aviso 7d + resolução manual ~30d'},\n      {r:'🏬 Loja · balcão',ok:false,n:'sistema da loja tem o fluxo, mas não é usado'}\n    ]\n    const FEED=[\n      {canal:'TroqueCommerce',when:D(-1),raw:'Cliente abre contestação de defeito com foto — origem Darkstore identificada',out:['motivo: defeito','origem: Darkstore · expressa','etiqueta: emitida'],caso:'TR-1044 · entrada já automática hoje'},\n      {canal:'TroqueCommerce',when:D(-2),raw:'Arrependimento — pedido de entrega normal localizado pelo CPF',out:['motivo: arrependimento','origem: CD · normal','status: HOLD até postagem'],caso:'TR-1042 · entrada já automática hoje'},\n      {canal:'SAC',when:D(-9),raw:'\"quero devolver meu pedido\" — cliente não encontrou o TroqueCommerce',out:['motivo: arrependimento','origem: CD','entrada: e-mail manual'],caso:'TR-1038 · variante a corrigir'},\n      {canal:'❓ a mapear',when:D(0),raw:'Cliente de expressa entregue por LOJA quer devolver — TroqueCommerce não cobre',out:['origem: Loja · expressa','canal de entrada: ???'],caso:'TR-1046 · o buraco do mapa'}\n    ]\n    let SAVED={edits:{},created:[]}\n    try{const raw=localStorage.getItem(KEY); if(raw)SAVED=JSON.parse(raw)||SAVED}catch(e){}\n    function persist(){try{localStorage.setItem(KEY,JSON.stringify(SAVED))}catch(e){}}\n    const clone=o=>JSON.parse(JSON.stringify(o))\n    const CASES=(SAVED.created||[]).map(clone).concat(DEFAULTS.map(c=>{\n      const cc=clone(c), ed=SAVED.edits[c.id]\n      if(ed){ if(ed.produto)cc.produto=ed.produto; if(ed.dinheiro)cc.dinheiro=ed.dinheiro }\n      return cc\n    }))\n    const isCreated=id=>(SAVED.created||[]).some(x=>x.id===id)\n    function persistCase(c){\n      if(isCreated(c.id)){SAVED.created=SAVED.created.map(x=>x.id===c.id?clone(c):x)}\n      else{SAVED.edits[c.id]={produto:c.produto,dinheiro:c.dinheiro}}\n      persist()\n    }\n    const S={view:'torre',sel:CASES[0]?CASES[0].id:null,seq:1048+(SAVED.created||[]).length,edit:null,walk:null}\n    const byId=id=>CASES.find(x=>x.id===id)\n    function toast(msg){const t=d2.$('.toast');if(!t)return;t.textContent=msg;t.classList.add('show');setTimeout(()=>t.classList.remove('show'),2200)}\n    function allSteps(c){return c.produto.map((s,i)=>({track:'produto',idx:i})).concat(c.dinheiro.map((s,i)=>({track:'dinheiro',idx:i})))}\n    function prog(steps){const t=steps.length||1,d=steps.filter(s=>s.state==='done').length;return{d,t,p:Math.round(d/t*100)}}\n    function answered(s){return s.dono!==AD&&s.mora!==AD&&s.dono&&s.mora}\n    function orgLabel(c){return (ORIGENS[c.origem]||c.origem)+(c.entrega?' · '+c.entrega:'')}\n    function renderKpis(){\n      let manual=0,auto=0,tot=0,resp=0\n      CASES.forEach(c=>[...c.produto,...c.dinheiro].forEach(s=>{tot++;if(s.hoje==='manual'||s.hoje==='inexistente')manual++;if(s.hoje==='auto')auto++;if(answered(s))resp++}))\n      const e1=d2.$('.k-ativos'),e2=d2.$('.k-manual'),e3=d2.$('.k-auto'),e4=d2.$('.k-resp')\n      if(e1)e1.textContent=CASES.length\n      if(e2)e2.textContent=manual\n      if(e3)e3.textContent=auto\n      if(e4)e4.textContent=tot?Math.round(resp/tot*100)+'%':'0%'\n    }\n    function caseCard(c){\n      const pp=prog(c.produto),pd=prog(c.dinheiro)\n      return '<div class=\"ccard'+(S.sel===c.id?' sel':'')+'\" data-id=\"'+c.id+'\">'\n        +'<div class=\"chead\"><span class=\"cid\">'+c.id+'</span><span>'\n        +(isCreated(c.id)?'<button class=\"b-delcase\" data-id=\"'+c.id+'\" title=\"excluir caso criado\">🗑</button>':'')\n        +'<span class=\"cwhen\">'+fdm(c.when)+'</span></span></div>'\n        +'<div class=\"cname\">'+esc(c.cliente)+'</div>'\n        +'<div class=\"cmeta\">'+esc(c.tipo)+' · '+esc(c.marca)+(c.valor?' · R$ '+c.valor:'')+'</div>'\n        +'<div class=\"chips\"><span class=\"chip org\">'+orgLabel(c)+'</span><span class=\"chip '+c.status.cls+'\">'+esc(c.status.t)+'</span></div>'\n        +'<div class=\"bars\">'\n        +'<div class=\"bar p\"><span class=\"bl\">produto</span><span class=\"bt\"><span class=\"bf\" style=\"width:'+pp.p+'%\"></span></span><span class=\"bn\">'+pp.d+'/'+pp.t+'</span></div>'\n        +'<div class=\"bar d\"><span class=\"bl\">dinheiro</span><span class=\"bt\"><span class=\"bf\" style=\"width:'+pd.p+'%\"></span></span><span class=\"bn\">'+pd.d+'/'+pd.t+'</span></div>'\n        +'</div></div>'\n    }\n    function isEditing(track,idx){return S.edit&&S.edit.track===track&&S.edit.idx===idx}\n    function stepHtml(s,track,idx,len){\n      if(isEditing(track,idx)){\n        const walkBtns=S.walk\n          ?'<div class=\"ebtns\"><button class=\"b-wprev\"'+(S.walk.pos===0?' disabled':'')+'>← anterior</button><button class=\"b-wnext\">'+(S.walk.pos>=S.walk.list.length-1?'salvar e concluir ✓':'salvar e próxima →')+'</button><button class=\"b-cancel b-wexit\">sair</button></div>'\n          :'<div class=\"ebtns\"><button class=\"b-save\">Salvar</button><button class=\"b-cancel\">Cancelar</button><button class=\"b-del\">Remover</button></div>'\n        return '<div class=\"vstep '+s.state+' walkhl\"><div class=\"eform\" data-track=\"'+track+'\" data-idx=\"'+idx+'\">'\n          +'<div class=\"fl\">Etapa</div><input class=\"e-n\" value=\"'+esc(s.n)+'\"/>'\n          +'<div class=\"fl\">Dono (quem responde)</div><input class=\"e-dono\" value=\"'+esc(s.dono)+'\"/>'\n          +'<div class=\"fl\">Onde mora hoje (sistema · planilha · pessoa)</div><input class=\"e-mora\" value=\"'+esc(s.mora)+'\"/>'\n          +'<div class=\"fl\">Como é hoje</div><select class=\"e-hoje\">'\n            +'<option value=\"manual\"'+(s.hoje==='manual'?' selected':'')+'>manual</option>'\n            +'<option value=\"parcial\"'+(s.hoje==='parcial'?' selected':'')+'>parcial</option>'\n            +'<option value=\"auto\"'+(s.hoje==='auto'?' selected':'')+'>automático</option>'\n            +'<option value=\"inexistente\"'+(s.hoje==='inexistente'?' selected':'')+'>não existe</option></select>'\n          +'<div class=\"fl\">SLA (ideal · hoje)</div><input class=\"e-sla\" value=\"'+esc(s.sla)+'\"/>'\n          +'<div class=\"fl\">Fonte de informação (mundo ideal)</div><textarea class=\"e-fonte\" rows=\"2\">'+esc(s.fonte)+'</textarea>'\n          +'<div class=\"fl\">Dores / perguntas abertas</div><textarea class=\"e-dores\" rows=\"4\">'+esc(s.dores)+'</textarea>'\n          +walkBtns\n          +'</div></div>'\n      }\n      let when=''\n      if(s.state==='done')when='<div class=\"vw done\">✓ '+fdm(s.when)+'</div>'\n      else if(s.state==='now')when='<div class=\"vw'+(s.br?' br':'')+'\">'+(s.br?'⚠ ':'● ')+esc(s.note||'em andamento')+'</div>'\n      else when='<div class=\"vw\">'+(s.when?'previsto '+fdm(s.when):'previsto')+'</div>'\n      return '<div class=\"vstep '+s.state+(s.br?' br':'')+'\">'\n        +'<div class=\"vtop\"><div class=\"vn\">'+esc(s.n)+'<span class=\"hbadge '+s.hoje+'\">'+HOJE[s.hoje]+'</span></div><div class=\"vbtns\">'\n        +'<button class=\"mbtn\" data-track=\"'+track+'\" data-idx=\"'+idx+'\" data-dir=\"-1\" title=\"mover pra cima\"'+(idx===0?' disabled':'')+'>▲</button>'\n        +'<button class=\"mbtn\" data-track=\"'+track+'\" data-idx=\"'+idx+'\" data-dir=\"1\" title=\"mover pra baixo\"'+(idx===len-1?' disabled':'')+'>▼</button>'\n        +'<button class=\"ebtn\" data-track=\"'+track+'\" data-idx=\"'+idx+'\" title=\"editar etapa\">✏️</button></div></div>'\n        +'<div class=\"vo\">Dono: <b>'+esc(s.dono)+'</b>'+(s.sla&&s.sla!=='—'?' · SLA '+esc(s.sla):'')+'</div>'\n        +'<div class=\"vmora\">🏠 Mora em: <b>'+esc(s.mora)+'</b></div>'\n        +when\n        +(s.fonte&&s.fonte!=='—'?'<div class=\"vfonte\"><b>Fonte (ideal):</b> '+esc(s.fonte)+'</div>':'')\n        +(s.dores&&s.dores!=='—'?'<div class=\"vdores\"><b>Dores hoje:</b> '+esc(s.dores)+'</div>':'')\n        +'</div>'\n    }\n    function detail(c){\n      const walkbar=S.walk\n        ?'<div class=\"walkbar\"><span class=\"wt\">▶ Percorrendo as etapas — preencha dono e onde mora</span><span class=\"wp\">etapa '+(S.walk.pos+1)+' de '+S.walk.list.length+'</span></div>'\n        :''\n      return '<div class=\"dhead\"><h2 class=\"serif\">'+esc(c.cliente)+'</h2><div class=\"dhr\"><span class=\"did\">'+c.id+'</span>'\n        +(S.walk?'':'<button class=\"b-walk\">▶ percorrer etapas</button>')\n        +'<button class=\"b-restore\" title=\"descarta as edições deste caso\">↺ restaurar</button></div></div>'\n        +'<div class=\"dmeta\">Origem: <b>'+orgLabel(c)+'</b> · '+esc(c.tipo)+' · '+esc(c.marca)+(c.valor?' · R$ '+c.valor:'')+(c.pagto&&c.pagto!=='—'?' · '+esc(c.pagto):'')+' · entrada: '+esc(c.canal||'—')+'</div>'\n        +walkbar\n        +'<div class=\"promessa\">'+c.promessa+'</div>'\n        +'<div class=\"tls\">'\n        +'<div class=\"tlbox p\"><h3><i></i>Trilha do produto</h3>'+c.produto.map((s,i,a)=>stepHtml(s,'produto',i,a.length)).join('')+'<button class=\"b-add\" data-track=\"produto\">+ adicionar etapa</button></div>'\n        +'<div class=\"tlbox d\"><h3><i></i>Trilha do dinheiro</h3>'+c.dinheiro.map((s,i,a)=>stepHtml(s,'dinheiro',i,a.length)).join('')+'<button class=\"b-add\" data-track=\"dinheiro\">+ adicionar etapa</button></div>'\n        +'</div>'\n        +'<div class=\"logbox\"><h3>Linha de eventos</h3>'\n        +(c.log||[]).map(l=>'<div class=\"lrow\"><span class=\"lt\">'+fdm(l.t)+'</span><span class=\"lm\">'+(l.a?'<span class=\"auto\">auto</span>':'')+esc(l.m)+'</span></div>').join('')\n        +'</div>'\n    }\n    function renderTorre(){\n      const c=byId(S.sel)||CASES[0]\n      bodyEl.innerHTML='<div class=\"torre\">'\n        +'<div class=\"col left\">'+CASES.map(caseCard).join('')+'</div>'\n        +'<div class=\"col\">'+(c?detail(c):'<div class=\"na\">Selecione um caso.</div>')+'</div>'\n        +'</div>'\n      const hl=bodyEl.querySelector('.walkhl')\n      if(hl&&hl.scrollIntoView)hl.scrollIntoView({block:'center'})\n    }\n    function renderEntrada(){\n      bodyEl.innerHTML='<div class=\"entrada\">'\n        +'<div class=\"col left\">'\n        +'<div class=\"cover\"><h4>Cobertura do TroqueCommerce por origem · entrega</h4>'\n        +COVER.map(r=>'<div class=\"crow\"><span>'+r.r+' <span style=\"color:#9aa39b\">— '+esc(r.n)+'</span></span><span class=\"'+(r.ok?'cyes':'cno')+'\">'+(r.ok?'✅ coberto':'❌ não coberto')+'</span></div>').join('')\n        +'</div>'\n        +'<div class=\"na\" style=\"text-align:left;padding:0 0 14px;font-style:normal;color:#7a857c\">Como as contestações chegam hoje:</div>'\n        +FEED.map(f=>'<div class=\"fitem\"><div class=\"ftop\"><span class=\"chip\">'+esc(f.canal)+'</span><span class=\"cwhen\">'+fdm(f.when)+'</span></div>'\n          +'<div class=\"fraw\">'+esc(f.raw)+'</div>'\n          +'<div class=\"farrow\">↓ extraído</div>'\n          +'<div class=\"fchips\">'+f.out.map(o=>'<span class=\"fchip\">'+esc(o)+'</span>').join('')+'</div>'\n          +'<div class=\"fcase\">→ '+esc(f.caso)+'</div></div>').join('')\n        +'</div>'\n        +'<div class=\"col\"><div class=\"form\">'\n        +'<h3>Nova contestação</h3><div class=\"fs\">Simule uma entrada e veja o caso nascer com as duas trilhas. Casos criados ficam salvos neste navegador (🗑 no card pra excluir).</div>'\n        +'<div class=\"fl\">Nome do cliente</div><input class=\"fi f-nome\" value=\"Cliente da sessão\"/>'\n        +'<div class=\"fl\">Origem · entrega</div><select class=\"fi f-origem\"><option value=\"cd|entrega normal\">📦 CD · entrega normal</option><option value=\"dark|expressa\">⚡ Darkstore · expressa</option><option value=\"loja|expressa\">🏬 Loja · expressa</option><option value=\"loja|retirada\">🏬 Loja · retirada</option><option value=\"loja|balcão\">🏬 Loja · balcão</option></select>'\n        +'<div class=\"fl\">Marca</div><select class=\"fi f-marca\"><option>Granado</option><option>Phebo</option><option>Care</option></select>'\n        +'<div class=\"fl\">Motivo</div><select class=\"fi f-tipo\"><option>Arrependimento</option><option>Defeito</option><option>Não retirado</option><option>Troca no balcão</option></select>'\n        +'<div class=\"fl\">Pagamento</div><select class=\"fi f-pagto\"><option>Crédito · Adyen</option><option>PIX · Adyen</option><option>PIX parcelado · PagBrasil</option></select>'\n        +'<div class=\"fl\">Valor (R$)</div><input class=\"fi f-valor\" type=\"number\" value=\"129\"/>'\n        +'<div class=\"fl\">Score de risco</div><select class=\"fi f-risco\"><option>baixo</option><option>médio</option><option>alto</option></select>'\n        +'<button class=\"fbtn\">Registrar contestação</button>'\n        +'<div class=\"fnote\">Baixo risco → no mundo ideal o dinheiro volta <b>antes</b> de o produto voltar.</div>'\n        +'</div></div></div>'\n    }\n    function genCase(f){\n      const id='TR-'+(S.seq++)\n      const low=f.risco==='baixo'\n      const api=f.pagto.indexOf('PagBrasil')>=0?'API PagBrasil':'API Adyen'\n      let produto,dinheiro,promessa,status\n      if(f.tipo==='Troca no balcão'){\n        produto=[mk({n:'Registro pela loja',dono:'Loja',mora:'Sistema da loja',state:'done',when:D(0)}),mk({n:'Troca efetuada',dono:'Loja',sla:'15min',state:'done',when:D(0)}),mk({n:'Estoque ajustado',dono:'automático',mora:'SAP',state:'done',when:D(0)})]\n        dinheiro=[mk({n:'Voucher emitido na hora',dono:'Loja',mora:'Sistema da loja',sla:'imediato',state:'done',when:D(0)})]\n        promessa='Resolvido no balcão — cliente saiu da loja com a troca feita.'\n        status={t:'Resolvido na loja',cls:'ok'}\n      }else if(f.tipo==='Não retirado'){\n        produto=[mk({n:'Pedido pronto na loja',dono:'Loja',mora:'OMS + SAP',state:'done',when:D(0)}),mk({n:'Aviso automático · 7 dias',dono:'automático',mora:'Régua de comunicação',hoje:'auto',state:'next',when:D(7)}),mk({n:'Prazo final · 30 dias',dono:'automático',mora:'Gatilho do caso',state:'next',when:D(30)})]\n        dinheiro=[mk({n:'Elegibilidade condicional',dono:'automático',state:'next',when:D(30)}),mk({n:'Estorno automático',dono:'automático',mora:api,sla:'2h',state:'next',when:D(30)}),mk({n:'Na fatura',dono:'Processadora',state:'next',when:D(31)})]\n        promessa='Se não houver retirada até <b>'+fdm(D(30))+'</b>, o caso cancela e estorna sozinho.'\n        status={t:'Resolução automática agendada',cls:'gold'}\n      }else{\n        const viaTroque=(f.origem==='cd'||f.origem==='dark')\n        produto=[\n          mk({n:'Solicitação',dono:viaTroque?'TroqueCommerce':'❓ canal a mapear',mora:viaTroque?'TroqueCommerce':AD,hoje:viaTroque?'auto':'manual',state:'done',when:D(0),dores:viaTroque?'':'TroqueCommerce não cobre expressa via loja — canal de entrada a definir'}),\n          mk({n:'Devolução do produto',dono:viaTroque?'Cliente / Troque':AD,mora:viaTroque?'Troque.app.br':AD,hoje:viaTroque?'parcial':'manual',state:'next',when:D(2)}),\n          mk({n:'Autorização de reembolso [Jeferson]',dono:'Jeferson · Logística',mora:'Logística — manual',sla:'ideal 1d · hoje 5–10d',state:'next',when:D(4)}),\n          mk({n:'Destino final',dono:'CD · Qualidade',state:'next',when:D(5)})]\n        if(low){\n          dinheiro=[mk({n:'Decisão: estorno imediato',dono:'score baixo risco',sla:'imediata',state:'done',when:D(0),note:'sem aguardar devolução'}),mk({n:'Execução',dono:api,sla:'2h',state:'now',note:'em execução · previsto hoje'}),mk({n:'Na fatura',dono:'Processadora',state:'next',when:D(1)})]\n          promessa='Score de baixo risco: reembolso <b>hoje</b>, antes de o produto voltar.'\n        }else{\n          dinheiro=[mk({n:'Logística autoriza reembolso',dono:'Logística',mora:'Magento + SAP + planilha OMNI+SAC',state:'next',when:D(5)}),mk({n:'Financeiro processa reembolso',dono:'Financeiro',mora:'Planilha + Adyen um a um',sla:'ideal imediato · hoje 24h',state:'next',when:D(6)}),mk({n:'Na fatura',dono:'Processadora',state:'next',when:D(7)})]\n          promessa='Risco '+f.risco+': o dinheiro volta após a autorização — previsão <b>'+fdm(D(6))+'</b>, já comunicada ao cliente.'\n        }\n        status={t:'No prazo · recém-criado',cls:'ok'}\n      }\n      return {id,cliente:f.nome||'Cliente da sessão',origem:f.origem,entrega:f.entrega,canal:'Simulador',marca:f.marca,tipo:f.tipo,pagto:f.pagto,valor:f.valor,risco:f.risco,when:D(0),status,promessa,produto,dinheiro,\n        log:[{t:D(0),a:1,m:'Caso criado estruturado · origem '+(ORIGENS[f.origem]||f.origem)+' · '+f.entrega}]}\n    }\n    function exportText(){\n      const L=[]\n      L.push('# Discovery Troca — respostas ('+fdm(new Date().toISOString())+')')\n      L.push('')\n      let cm=0,cp=0,ca=0,ci=0\n      CASES.forEach(c=>{\n        L.push('## '+c.id+' · '+c.cliente+' · '+orgLabel(c).replace(/[📦⚡🏬] /,'')+' · '+c.tipo+' · '+c.marca)\n        ;['produto','dinheiro'].forEach(track=>{\n          L.push('### Trilha do '+track)\n          c[track].forEach((s,i)=>{\n            if(s.hoje==='manual')cm++;else if(s.hoje==='parcial')cp++;else if(s.hoje==='auto')ca++;else ci++\n            L.push((i+1)+'. '+s.n+' — dono: '+s.dono+' | mora em: '+s.mora+' | '+HOJE[s.hoje]+(s.sla&&s.sla!=='—'?' | SLA: '+s.sla:''))\n            if(s.fonte&&s.fonte!=='—'&&s.fonte)L.push('   fonte (ideal): '+s.fonte)\n            if(s.dores&&s.dores!=='—'&&s.dores)L.push('   dores: '+s.dores.replace(/\\n/g,' / '))\n          })\n        })\n        L.push('')\n      })\n      L.push('---')\n      L.push('Resumo: '+cm+' etapas manuais · '+cp+' parciais · '+ci+' inexistentes · '+ca+' automáticas')\n      L.push('Etapas ainda sem resposta (dono/mora \"'+AD+'\"): '+CASES.reduce((n,c)=>n+[...c.produto,...c.dinheiro].filter(s=>!answered(s)).length,0))\n      return L.join('\\n')\n    }\n    function copyText(txt){\n      if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(txt).then(()=>toast('📋 Respostas copiadas — cola no chat!'),()=>toast('não consegui copiar'))}\n      else{toast('clipboard indisponível')}\n    }\n    function saveEditForm(f){\n      const c=byId(S.sel); if(!c||!S.edit)return null\n      const s=c[S.edit.track][S.edit.idx]; if(!s)return null\n      const gv=cl=>{const el=f.querySelector(cl);return el?el.value:''}\n      s.n=gv('.e-n'); s.dono=gv('.e-dono'); s.mora=gv('.e-mora'); s.sla=gv('.e-sla')||'—'\n      s.hoje=gv('.e-hoje')||s.hoje; s.fonte=gv('.e-fonte'); s.dores=gv('.e-dores')\n      persistCase(c); return s\n    }\n    function walkGo(pos){\n      const c=byId(S.sel); if(!c||!S.walk)return\n      if(pos>=S.walk.list.length){S.walk=null;S.edit=null;toast('✔ Percurso concluído — agora é só 📋 copiar respostas');renderTorre();renderKpis();return}\n      if(pos<0)pos=0\n      S.walk.pos=pos\n      const t=S.walk.list[pos]\n      S.edit={track:t.track,idx:t.idx}\n      renderTorre()\n    }\n    function renderView(){ if(S.view==='torre')renderTorre(); else renderEntrada(); renderKpis() }\n    d2.on('.tab','click',e=>{\n      const b=e.target.closest('.tab'); if(!b)return\n      S.view=b.getAttribute('data-v'); S.edit=null; S.walk=null\n      d2.$$('.tab').forEach(x=>x.classList.toggle('hot',x===b))\n      renderView()\n    })\n    d2.on('.b-export','click',()=>{copyText(exportText())})\n    d2.on('.b-delcase','click',e=>{\n      const b=e.target.closest('.b-delcase'); if(!b)return\n      e.stopPropagation()\n      const id=b.getAttribute('data-id')\n      SAVED.created=(SAVED.created||[]).filter(x=>x.id!==id); persist()\n      const i=CASES.findIndex(x=>x.id===id); if(i>=0)CASES.splice(i,1)\n      if(S.sel===id)S.sel=CASES[0]?CASES[0].id:null\n      S.edit=null; S.walk=null; renderTorre(); renderKpis()\n    })\n    d2.on('.ccard','click',e=>{\n      if(e.target.closest('.b-delcase'))return\n      const c=e.target.closest('.ccard'); if(!c)return\n      S.sel=c.getAttribute('data-id'); S.edit=null; S.walk=null; renderTorre()\n    })\n    d2.on('.b-walk','click',()=>{\n      const c=byId(S.sel); if(!c)return\n      S.walk={list:allSteps(c),pos:0}\n      walkGo(0)\n    })\n    d2.on('.b-wnext','click',e=>{\n      const f=e.target.closest('.eform'); if(!f)return\n      saveEditForm(f); renderKpis()\n      walkGo(S.walk?S.walk.pos+1:0)\n    })\n    d2.on('.b-wprev','click',e=>{\n      const b=e.target.closest('.b-wprev'); if(!b||b.disabled)return\n      const f=e.target.closest('.eform'); if(f)saveEditForm(f)\n      walkGo(S.walk?S.walk.pos-1:0)\n    })\n    d2.on('.b-wexit','click',()=>{S.walk=null;S.edit=null;renderTorre()})\n    d2.on('.ebtn','click',e=>{\n      const b=e.target.closest('.ebtn'); if(!b)return\n      S.walk=null\n      S.edit={track:b.getAttribute('data-track'),idx:Number(b.getAttribute('data-idx'))}\n      renderTorre()\n    })\n    d2.on('.mbtn','click',e=>{\n      const b=e.target.closest('.mbtn'); if(!b||b.disabled)return\n      const c=byId(S.sel); if(!c)return\n      const track=b.getAttribute('data-track'), idx=Number(b.getAttribute('data-idx')), dir=Number(b.getAttribute('data-dir'))\n      const arr=c[track], j=idx+dir\n      if(j<0||j>=arr.length)return\n      const tmp=arr[idx]; arr[idx]=arr[j]; arr[j]=tmp\n      S.edit=null; S.walk=null; persistCase(c); renderTorre()\n    })\n    d2.on('.b-add','click',e=>{\n      const b=e.target.closest('.b-add'); if(!b)return\n      const c=byId(S.sel); if(!c)return\n      const track=b.getAttribute('data-track')\n      c[track].push(mk({n:'Nova etapa',fonte:AD,dores:AD}))\n      S.walk=null; S.edit={track,idx:c[track].length-1}\n      persistCase(c); renderTorre()\n    })\n    d2.on('.b-save','click',e=>{\n      const f=e.target.closest('.eform'); if(!f)return\n      saveEditForm(f)\n      S.edit=null; renderTorre(); renderKpis()\n    })\n    d2.on('.b-cancel','click',e=>{\n      if(e.target.closest('.b-wexit'))return\n      S.edit=null; renderTorre()\n    })\n    d2.on('.b-del','click',()=>{\n      const c=byId(S.sel); if(!c||!S.edit)return\n      c[S.edit.track].splice(S.edit.idx,1)\n      S.edit=null; S.walk=null; persistCase(c); renderTorre(); renderKpis()\n    })\n    d2.on('.b-restore','click',()=>{\n      const c=byId(S.sel); if(!c)return\n      const def=DEFAULTS.find(x=>x.id===c.id)\n      if(def){ delete SAVED.edits[c.id]; persist(); c.produto=clone(def.produto); c.dinheiro=clone(def.dinheiro) }\n      S.edit=null; S.walk=null; renderTorre(); renderKpis()\n    })\n    d2.on('.fbtn','click',()=>{\n      const v=s=>{const el=d2.$(s);return el?el.value:''}\n      const og=(v('.f-origem')||'cd|entrega normal').split('|')\n      const novo=genCase({nome:v('.f-nome'),origem:og[0],entrega:og[1],marca:v('.f-marca'),tipo:v('.f-tipo'),pagto:v('.f-pagto'),valor:Number(v('.f-valor'))||0,risco:v('.f-risco')})\n      CASES.unshift(novo)\n      SAVED.created=SAVED.created||[]; SAVED.created.unshift(clone(novo)); persist()\n      S.sel=novo.id; S.view='torre'; S.edit=null; S.walk=null\n      d2.$$('.tab').forEach(x=>x.classList.toggle('hot',x.getAttribute('data-v')==='torre'))\n      renderView()\n    })\n    renderView()\n  }\n}"}}}}}}}}]}},{"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":{"component":"data2-core-types@Getter","displayName":"isData2User","params":{"module":{"component":"data2-core-functions@Match","params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"@data2\\.app$","flags":"i"}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}},"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":{"component":"data2-core-flow@If","displayName":"management exception never picks the system","params":{"compare":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}}}]}},"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"d2_app":"management"}}},"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-10-29T19:05:43.007Z","updateMetadata":{"updatedBy":{"user":"5f1609be1ca96def427e1559"}}},{"_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"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_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}},"policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Explicit so data2 can go private, 2026-11-05. Access is decided by the drive/file gate (applyFileTableGates, docs/drive-file-access.md), which runs after this policy; same behavior as today."}}]},"reference":"FileComponentInstancesDataSet","updatedAt":"2026-11-05T17:23:34.217Z","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"},"policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Explicit so data2 can go private, 2026-11-05. Access is decided by the drive/file gate (applyFileTableGates, docs/drive-file-access.md), which runs after this policy; same behavior as today."}}]},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2026-11-05T17:23:34.254Z","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}},"policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Explicit so data2 can go private, 2026-11-05. Access is decided by the drive/file gate (applyFileTableGates, docs/drive-file-access.md), which runs after this policy; same behavior as today."}}]},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2026-11-05T17:23:34.347Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a91bdefe388bf7aa9a2e80d","component":"data2-core-primitives@Artboard","system":"6a62e4640613f70fa449ff5d","displayName":"Troca — Mundo Ideal (Discovery)","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Troca — Mundo Ideal (Discovery)"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"aZmXmsBTkfTp6tB_u7thw"},{"_id":"994bf9de1abd93bec4415652","parent":"6a91bdefe388bf7aa9a2e80d","component":"granado-app@granado-troca-ideal","system":"6a62e4640613f70fa449ff5d","displayName":"TrocaIdeal","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"HYvSEwLj3NqQ8RY31MIx8"}]}},{"_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":"6a91bdfe9c836b9b0a987037","displayName":"Troca Mundo Ideal","reference":"Pm5M92tjuNboVVvyasnji","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"troca-ideal"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"aZmXmsBTkfTp6tB_u7thw"}}},"system":"6a62e4640613f70fa449ff5d","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}