Carola Wenk

126 papers A* 6A 8B 14C 2Journal 66Unranked 25
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Hossein Amiri, Joon-Seok Kim, Hamdi Kavak, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2025 A conf
GD
Oswin Aichholzer, Robert Ganian, Phillip Keldenich, Maarten Löffler, Gert G. T. Meijer, Alexandra Weinberger, Carola Wenk
2025 conf
SIGSPATIAL/GIS
Hossein Amiri, Richard Yang, Shiyang Ruan, Joon-Seok Kim, Hamdi Kavak, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2025 C conf
IWOCA
Omrit Filtser, Majid Mirzanezhad, Carola Wenk
2025 ed.
GeoAnomalies@SIGSPATIAL
Yao-Yi Chiang, Jack Cooper, Carola Wenk, Andreas Züfle, Joon-Seok Kim, Enrico Mattei, Khurram Shafique
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Yu Qin, Brittany Terese Fasy, Carola Wenk, Brian Summa
2025 J jnl
Comput. Geom.
Hugo A. Akitaya, Maike Buchin, Majid Mirzanezhad, Leonie Ryvkin, Carola Wenk
2025 J jnl
Comput. Geosci.
Kevin Buchin, Maike Buchin, Joachim Gudmundsson, Jorren Hendriks, Erfan Hosseini Sereshgi, Rodrigo I. Silveira, Jorrick Sleijster, Frank Staals, Carola Wenk
2025 conf
GeoAnomalies@SIGSPATIAL
Erfan Hosseini Sereshgi, Mauryan Uppalapati, Yueyang Liu, Lance Kennedy, Andreas Züfle, Carola Wenk
2025 conf
CCCG
Elizabeth Munch, Elena Xinyi Wang, Carola Wenk
2025 J jnl
CoRR
Elizabeth Munch, Elena Xinyi Wang, Carola Wenk
2024 J jnl
Comput. Geom.
Sushovan Majhi, Jeffrey Vitter, Carola Wenk
2024 A* conf
SoCG
Marjolein Haagsman, Maarten Löffler, Carola Wenk
2024 J jnl
Comput. Geom.
Sushovan Majhi, Carola Wenk
2024 J jnl
ACM SIGSPATIAL Special
Yao-Yi Chiang, Joon-Seok Kim, Cory Krause, Enrico Mattei, Khurram Shafique, Carola Wenk, Andreas Züfle
2024 J jnl
ACM Trans. Spatial Algorithms Syst.
Jordi Aguilar, Kevin Buchin, Maike Buchin, Erfan Hosseini Sereshgi, Rodrigo I. Silveira, Carola Wenk
2024 J jnl
ACM Trans. Spatial Algorithms Syst.
Andreas Züfle, Dieter Pfoser, Carola Wenk, Andrew T. Crooks, Hamdi Kavak, Taylor Anderson, Joon-Seok Kim, Nathan Holt, Andrew Diantonio
2024 conf
GeoIndstry@SIGSPATIAL
Erfan Hosseini Sereshgi, Carola Wenk
2024 J jnl
ACM Trans. Spatial Algorithms Syst.
Mohamed F. Mokbel, Mahmoud Attia Sakr, Li Xiong, Andreas Züfle, Jussara M. Almeida, Taylor Anderson, Walid G. Aref, Gennady L. Andrienko, Natalia V. Andrienko, Yang Cao, Sanjay Chawla, Reynold Cheng, Panos K. Chrysanthis, Xiqi Fei, Gabriel Ghinita, Anita Graser, Dimitrios Gunopulos, Christian S. Jensen, Joon-Seok Kim, Kyoung-Sook Kim, Peer Kröger, John Krumm, Johannes Lauer, Amr Magdy, Mario A. Nascimento, Siva Ravada, Matthias Renz, Dimitris Sacharidis, Flora D. Salim, Mohamed Sarwat, Maxime Schoemans, Cyrus Shahabi, Bettina Speckmann, Egemen Tanin, Xu Teng, Yannis Theodoridis, Kristian Torp, Goce Trajcevski, Marc J. van Kreveld, Carola Wenk, Martin Werner, Raymond Chi-Wing Wong, Song Wu, Jianqiu Xu, Moustafa Youssef, Demetris Zeinalipour, Mengxuan Zhang, Esteban Zimányi
2024 J jnl
CoRR
Yu Qin, Brittany Terese Fasy, Carola Wenk, Brian Summa
2024 conf
SIGSPATIAL/GIS
Hossein Amiri, Will Kohn, Shiyang Ruan, Joon-Seok Kim, Hamdi Kavak, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2024 J jnl
CoRR
Hossein Amiri, Will Kohn, Shiyang Ruan, Joon-Seok Kim, Hamdi Kavak, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2023 J jnl
Discret. Comput. Geom.
Parker Evans, Carola Wenk
2023 B conf
WADS
Hsien-Chih Chang, Brittany Terese Fasy, Bradley McCoy, David L. Millman, Carola Wenk
2023 J jnl
CoRR
Hsien-Chih Chang, Brittany Terese Fasy, Bradley McCoy, David L. Millman, Carola Wenk
2023 conf
SIGSPATIAL/GIS
Hossein Amiri, Shiyang Ruan, Joon-Seok Kim, Hyunjee Jin, Hamdi Kavak, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2023 J jnl
CoRR
Erin W. Chambers, Brittany Terese Fasy, Benjamin Holmgren, Sushovan Majhi, Carola Wenk
2023 conf
CCCG
Erin W. Chambers, Benjamin Holmgren, Brittany Terese Fasy, Sushovan Majhi, Carola Wenk
2023 B conf
WADS
Kevin Buchin, Brittany Terese Fasy, Erfan Hosseini Sereshgi, Carola Wenk
2023 B conf
ISAAC
Hugo A. Akitaya, Maike Buchin, Majid Mirzanezhad, Leonie Ryvkin, Carola Wenk
2023 J jnl
CoRR
Hugo A. Akitaya, Maike Buchin, Majid Mirzanezhad, Leonie Ryvkin, Carola Wenk
2023 J jnl
CoRR
Mohamed F. Mokbel, Mahmoud Attia Sakr, Li Xiong, Andreas Züfle, Jussara M. Almeida, Taylor Anderson, Walid G. Aref, Gennady L. Andrienko, Natalia V. Andrienko, Yang Cao, Sanjay Chawla, Reynold Cheng, Panos K. Chrysanthis, Xiqi Fei, Gabriel Ghinita, Anita Graser, Dimitrios Gunopulos, Christian S. Jensen, Joon-Seok Kim, Kyoung-Sook Kim, Peer Kröger, John Krumm, Johannes Lauer, Amr Magdy, Mario A. Nascimento, Siva Ravada, Matthias Renz, Dimitris Sacharidis, Cyrus Shahabi, Flora D. Salim, Mohamed Sarwat, Maxime Schoemans, Bettina Speckmann, Egemen Tanin, Xu Teng, Yannis Theodoridis, Kristian Torp, Goce Trajcevski, Marc J. van Kreveld, Carola Wenk, Martin Werner, Raymond Chi-Wing Wong, Song Wu, Jianqiu Xu, Moustafa Youssef, Demetris Zeinalipour, Mengxuan Zhang, Esteban Zimányi
2023 J jnl
Comput. Math. Organ. Theory
Andreas Züfle, Carola Wenk, Dieter Pfoser, Andrew T. Crooks, Joon-Seok Kim, Hamdi Kavak, Umar Manzoor, Hyunjee Jin
2023 J jnl
CoRR
Yu Qin, Brittany Terese Fasy, Carola Wenk, Brian Summa
2022 J jnl
IEEE Trans. Vis. Comput. Graph.
Yu Qin, Brittany Terese Fasy, Carola Wenk, Brian Summa
2022 J jnl
CoRR
Sushovan Majhi, Carola Wenk
2022 J jnl
Dagstuhl Reports
Mohamed F. Mokbel, Mahmoud Attia Sakr, Li Xiong, Andreas Züfle, Jussara M. Almeida, Taylor Anderson, Walid G. Aref, Gennady L. Andrienko, Natalia V. Andrienko, Yang Cao, Sanjay Chawla, Reynold Cheng, Panos K. Chrysanthis, Xiqi Fei, Gabriel Ghinita, Anita Graser, Dimitrios Gunopulos, Christian S. Jensen, Joon-Seok Kim, Kyoung-Sook Kim, Peer Kröger, John Krumm, Johannes Lauer, Amr Magdy, Mario A. Nascimento, Siva Ravada, Matthias Renz, Dimitris Sacharidis, Cyrus Shahabi, Flora D. Salim, Mohamed Sarwat, Maxime Schoemans, Bettina Speckmann, Egemen Tanin, Yannis Theodoridis, Kristian Torp, Goce Trajcevski, Marc J. van Kreveld, Carola Wenk, Martin Werner, Raymond Chi-Wing Wong, Song Wu, Jianqiu Xu, Moustafa Youssef, Demetris Zeinalipour, Mengxuan Zhang, Esteban Zimányi
2022 J jnl
Int. J. Comput. Geom. Appl.
Brittany Terese Fasy, Rafal Komendarczyk, Sushovan Majhi, Carola Wenk
2022 ch.
Spatial Gems (1) (1)
Joon-Seok Kim, Carola Wenk
2021 J jnl
CoRR
Yu Qin, Brittany Terese Fasy, Carola Wenk, Brian Summa
2021 J jnl
Comput. Geom.
Hugo A. Akitaya, Maike Buchin, Bernhard Kilgus, Stef Sijben, Carola Wenk
2021 J jnl
CoRR
Omrit Filtser, Majid Mirzanezhad, Carola Wenk
2020 A* conf
SoCG
Parker Evans, Brittany Terese Fasy, Carola Wenk
2020 J jnl
CoRR
Parker Evans, Carola Wenk
2020 conf
LocalRec@SIGSPATIAL
Kevin Buchin, Maike Buchin, Joachim Gudmundsson, Jorren Hendriks, Erfan Hosseini Sereshgi, Vera Sacristán, Rodrigo I. Silveira, Jorrick Sleijster, Frank Staals, Carola Wenk
2020 J jnl
J. Spatial Inf. Sci.
Maike Buchin, Carola Wenk
2020 B conf
MDM
Joon-Seok Kim, Hyunjee Jin, Hamdi Kavak, Ovi Chris Rouly, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2020 J jnl
ACM Trans. Spatial Algorithms Syst.
Erin W. Chambers, Brittany Terese Fasy, Yusu Wang, Carola Wenk
2020 J jnl
Comput. Geom.
Hee-Kap Ahn, Helmut Alt, Maike Buchin, Eunjin Oh, Ludmila Scharf, Carola Wenk
2020 J jnl
CoRR
Joon-Seok Kim, Carola Wenk
2019 J jnl
CoRR
Sushovan Majhi, Jeffrey Vitter, Carola Wenk
2019 B conf
ISAAC
Hugo A. Akitaya, Maike Buchin, Bernhard Kilgus, Stef Sijben, Carola Wenk
2019 J jnl
Int. J. Comput. Geom. Appl.
Joachim Gudmundsson, Majid Mirzanezhad, Ali Mohades, Carola Wenk
2019 J jnl
ACM SIGSPATIAL Special
Joon-Seok Kim, Hamdi Kavak, Dieter Pfoser, Andrew T. Crooks, Carola Wenk, Sarah Wise
2019 A conf
ESA
Mees van de Kerkhof, Irina Kostitsyna, Maarten Löffler, Majid Mirzanezhad, Carola Wenk
2019 B conf
SSTD
Hamdi Kavak, Joon-Seok Kim, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2019 conf
IWCTS@SIGSPATIAL
Dan Cheng, Olga Gkountouna, Andreas Züfle, Dieter Pfoser, Carola Wenk
2019 conf
SIGSPATIAL/GIS
Joon-Seok Kim, Hamdi Kavak, Umar Manzoor, Andrew T. Crooks, Dieter Pfoser, Carola Wenk, Andreas Züfle
2019 J jnl
CoRR
Brittany Terese Fasy, Sushovan Majhi, Carola Wenk
2019 J jnl
CoRR
Brittany Terese Fasy, Rafal Komendarczyk, Sushovan Majhi, Carola Wenk
2018 J jnl
CoRR
Hugo A. Akitaya, Maike Buchin, Bernhard Kilgus, Stef Sijben, Carola Wenk
2018 conf
IWISC
Joachim Gudmundsson, Majid Mirzanezhad, Ali Mohades, Carola Wenk
2018 conf
IWISC
Erin W. Chambers, Brittany Terese Fasy, Yusu Wang, Carola Wenk
2018 conf
CCCG
Carola Wenk
2018 J jnl
CoRR
Mees van de Kerkhof, Irina Kostitsyna, Maarten Löffler, Majid Mirzanezhad, Carola Wenk
2017 B conf
SSTD
Olga Gkountouna, Dieter Pfoser, Carola Wenk, Andreas Züfle
2017 J jnl
Dagstuhl Reports
Benjamin A. Burton, Maarten Löffler, Carola Wenk, Erin Wolf Chambers
2017 conf
SIGSPATIAL/GIS
Kevin Buchin, Maike Buchin, David Duran, Brittany Terese Fasy, Roel Jacobs, Vera Sacristán, Rodrigo I. Silveira, Frank Staals, Carola Wenk
2017 J jnl
CoRR
Joachim Gudmundsson, Majid Mirzanezhad, Ali Mohades, Carola Wenk
2016 B conf
LATIN
Hee-Kap Ahn, Helmut Alt, Maike Buchin, Eunjin Oh, Ludmila Scharf, Carola Wenk
2015 J jnl
ACM Trans. Spatial Algorithms Syst.
Mahmuda Ahmed, Brittany Terese Fasy, Kyle S. Hickmann, Carola Wenk
2015 J jnl
GeoInformatica
Mahmuda Ahmed, Sophia Karagiorgou, Dieter Pfoser, Carola Wenk
2015 conf
SIGSPATIAL/GIS
Mahmuda Ahmed, Brittany Terese Fasy, Matt Gibson, Carola Wenk
2015 J jnl
Comput. Geom.
Atlas F. Cook IV, Anne Driemel, Jessica Sherette, Carola Wenk
2015 J jnl
CoRR
Boris Aronov, Sariel Har-Peled, Christian Knauer, Yusu Wang, Carola Wenk
2015 book
Mahmuda Ahmed, Sophia Karagiorgou, Dieter Pfoser, Carola Wenk
2014 J jnl
CoRR
Mahmuda Ahmed, Sophia Karagiorgou, Dieter Pfoser, Carola Wenk
2014 conf
SIGSPATIAL/GIS
Mahmuda Ahmed, Brittany Terese Fasy, Carola Wenk
2014 ed.
GEOGROWD
Rolf A. de By, Carola Wenk
2014 J jnl
Algorithmica
Atlas F. Cook IV, Carola Wenk
2013 J jnl
Algorithmica
Kevin Buchin, Maike Buchin, Marc J. van Kreveld, Maarten Löffler, Rodrigo I. Silveira, Carola Wenk, Lionov Wiratma
2013 J jnl
CoRR
Mahmuda Ahmed, Kyle S. Hickmann, Carola Wenk
2013 J jnl
CoRR
Jessica Sherette, Carola Wenk
2012 J jnl
Discret. Comput. Geom.
Anne Driemel, Sariel Har-Peled, Carola Wenk
2012 A conf
ESA
Mahmuda Ahmed, Carola Wenk
2012 conf
SWAT
Jessica Sherette, Carola Wenk
2011 A conf
ALENEX
Daniel Chen, Anne Driemel, Leonidas J. Guibas, Andy Nguyen, Carola Wenk
2011 J jnl
CoRR
Atlas F. Cook, Anne Driemel, Sariel Har-Peled, Jessica Sherette, Carola Wenk
2011 B conf
WADS
Atlas F. Cook, Anne Driemel, Sariel Har-Peled, Jessica Sherette, Carola Wenk
2011 J jnl
Comput. Geom.
Atlas F. Cook, Carola Wenk
2010 J jnl
CoRR
Anne Driemel, Sariel Har-Peled, Carola Wenk
2010 conf
SCG
Anne Driemel, Sariel Har-Peled, Carola Wenk
2010 J jnl
ACM Trans. Algorithms
Atlas F. Cook, Carola Wenk
2010 J jnl
Comput. Geom.
Carola Wenk, Afra Zomorodian
2010 conf
ESA (1)
Kevin Buchin, Maike Buchin, Marc J. van Kreveld, Maarten Löffler, Rodrigo I. Silveira, Carola Wenk, Lionov Wiratma
2010 B conf
LATIN
Steven Bitner, Yam Ki Cheung, Atlas F. Cook, Ovidiu Daescu, Anastasia Kurdia, Carola Wenk
2009 conf
GIS
Dieter Pfoser, Alexandros Efentakis, Agnès Voisard, Carola Wenk
2009 C conf
AAIM
Atlas F. Cook, Carola Wenk
2009 A* conf
Computational Geometry
Carola Wenk, Atlas F. Cook
2009 B conf
WADS
Atlas F. Cook, Carola Wenk
2008 J jnl
Comput. Geom.
Kevin Buchin, Maike Buchin, Carola Wenk
2008 J jnl
CoRR
Atlas F. Cook, Carola Wenk
2008 A conf
STACS
Atlas F. Cook, Carola Wenk
2006 B conf
SSDBM
Carola Wenk, Randall Salas, Dieter Pfoser
2006 conf
SCG
Kevin Buchin, Maike Buchin, Carola Wenk
2006 J jnl
Int. J. Found. Comput. Sci.
Christian A. Duncan, Alon Efrat, Stephen G. Kobourov, Carola Wenk
2006 A conf
ESA
Boris Aronov, Sariel Har-Peled, Christian Knauer, Yusu Wang, Carola Wenk
2005 J jnl
Algorithmica
Vladlen Koltun, Carola Wenk
2005 A* conf
VLDB
Sotiris Brakatsoulas, Dieter Pfoser, Randall Salas, Carola Wenk
2004 J jnl
Algorithmica
Helmut Alt, Christian Knauer, Carola Wenk
2004 J jnl
Algorithmica
Alon Efrat, Frank Hoffmann, Christian Knauer, Klaus Kriegel, Günter Rote, Carola Wenk
2004 conf
SWAT
Vladlen Koltun, Carola Wenk
2003 J jnl
J. Discrete Algorithms
Carola Wenk
2003 conf
SCG
Carola Wenk, Helmut Alt, Alon Efrat, Lingeshwaran Palaniappan, Günter Rote
2003 A* conf
SODA
Helmut Alt, Alon Efrat, Günter Rote, Carola Wenk
2003 J jnl
J. Algorithms
Helmut Alt, Alon Efrat, Günter Rote, Carola Wenk
2003
Carola Wenk
2002 A* conf
SODA
Alon Efrat, Frank Hoffmann, Christian Knauer, Klaus Kriegel, Günter Rote, Carola Wenk
2002 J jnl
J. Comput. Biol.
Alon Efrat, Frank Hoffmann, Klaus Kriegel, Christof Schultz, Carola Wenk
2002 conf
SCG
Alon Efrat, Stephen G. Kobourov, Michael Stepp, Carola Wenk
2001 A conf
GD
Christian A. Duncan, Alon Efrat, Stephen G. Kobourov, Carola Wenk
2001 B conf
RECOMB
Alon Efrat, Frank Hoffmann, Klaus Kriegel, Christof Schultz, Carola Wenk
2001 A conf
STACS
Helmut Alt, Christian Knauer, Carola Wenk
1999 J jnl
Discret. Appl. Math.
Frank Hoffmann, Klaus Kriegel, Carola Wenk
1999 B conf
CPM
Carola Wenk
1998 conf
SCG
Frank Hoffmann, Klaus Kriegel, Carola Wenk
redb/extractors/capa.py
← Index redb/extractors/capa.py python
from dataclasses import asdict
import inspect
import json
import subprocess
import magic
from magika import Magika
from typing import Any, Dict, List, Tuple
from datetime import datetime, timezone

from redb.extractors.enum import Tag
from redb.models.dataclasses import CAPA
from redb.extractors.extractor import Extractor
from dotenv import load_dotenv
import os

load_dotenv(override=True)

class CAPAExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
    ):
        super().__init__(
            filepath, 
            log, 
            exporters,
            index_prefix, 
            elastic_index, 
            known_benign, 
            known_malicious
        )
        self.capa = None
        self.elastic_index = self.index_prefix + "-capa"

    def _replace_empty_keys(self, dictionary, replacement="default_empty_key"):
        """
        Replace empty keys in a dictionary with a specified replacement.

        Args:
        dictionary (dict): The input dictionary
        replacement (str): The replacement for empty keys (default: 'empty_key')

        Returns:
        dict: A new dictionary with empty keys replaced
        """
        # tmp_dict = {}
        # for k, v in dictionary.items():
        #     if k == '':
        #         tmp_dict[replacement] = dictionary[k]
        #     else:
        #         tmp_dict[k] = dictionary[k]
        # return tmp_dict
        return {(replacement if k == "" else k): v for k, v in dictionary.items()}

    def _extract_capa(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        TIMEOUT = int(os.getenv("CAPA_TIMEOUT")) # 5 minutes in seconds
        capa_command = [os.getenv("CAPA_PATH"), "-j", self.filepath] # COMMENT FOR TESTING ON MAC

        import signal

        # try:
        #     result = subprocess.run(
        #         capa_command, capture_output=True, text=True, check=True, timeout=TIMEOUT
        #     )
        # except subprocess.TimeoutExpired:
        #     self.log.error(f"The capa command timed out after {TIMEOUT} seconds")
        #     return {}
        # except subprocess.CalledProcessError as e:
        #     self.log.error(f"Error running capa: {e}")
        #     return {}

        # try:
        #     capa_output = json.loads(result.stdout)
        # except json.JSONDecodeError as e:
        #     self.log.error("Error parsing capa output: {e}")
        #     return {}

        # Create a process group for easier termination of all child processes
        try:
            # Start the process in a new process group
            process = subprocess.Popen(
                capa_command,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid  # Use os.setsid() to create a new process group
            )
            
            # Implement timeout handling manually
            try:
                stdout, stderr = process.communicate(timeout=TIMEOUT)
                # Process completed within timeout
                if process.returncode != 0:
                    self.log.error(f"Error running capa, return code: {process.returncode}, stderr: {stderr}")
                    return {}
            except subprocess.TimeoutExpired:
                # Kill the entire process group on timeout
                self.log.warning(f"The capa command timed out after {TIMEOUT} seconds, terminating process group")
                
                try:
                    # Send SIGTERM to the entire process group
                    os.killpg(process.pid, signal.SIGTERM)
                    
                    # Give it a moment to terminate gracefully
                    try:
                        process.wait(timeout=3)
                    except subprocess.TimeoutExpired:
                        # If it's still running after 3 seconds, send SIGKILL
                        self.log.warning("Process didn't terminate with SIGTERM, sending SIGKILL")
                        os.killpg(process.pid, signal.SIGKILL)
                        
                    process.wait()  # Make sure process resources are fully cleaned up
                except (ProcessLookupError, OSError) as e:
                    self.log.warning(f"Error while killing process: {e}")
                    
                return {}
                
            try:
                capa_output = json.loads(stdout)
            except json.JSONDecodeError as e:
                self.log.error(f"Error parsing capa output: {e}")
                return {}

            capa_dump = {}  # dictionalry of capabilities
            capabilities = set()  # list of capabilities
            namespaces = set()  # list of namespaces
            attack_dump = {}  # dictionary of tuples [tactic](technique, technique_id)
            tactics = set()  # list of tactics
            techniques = set()  # list of techniques
            techniques_id = set()  # list of techniques_id
            mbc_dump = {}  # dictionary of tuples [objective](behavior, behavior_id)
            mbc_objectives = set()  # list of objectives
            mbc_behaviors = set()  # list of behaviors
            mbc_behaviors_id = set()  # list of behaviors_id

            if isinstance(capa_output, dict) and "rules" in capa_output:
                rules = capa_output["rules"]
                if isinstance(rules, dict):
                    for rule_name, rule_data in rules.items():
                        if isinstance(rule_data, dict) and "meta" in rule_data:
                            meta = rule_data["meta"]
                            if isinstance(meta, dict):
                                # Process capabilities
                                namespace = meta.get("namespace", "").lower()
                                # if namespace != 'lib':
                                if namespace not in capa_dump:
                                    capa_dump[namespace] = []
                                    namespaces.add(namespace)
                                capa_dump[namespace].append(rule_name)
                                capabilities.add(rule_name)

                                # Process ATTACK information
                                if "attack" in meta:
                                    for attack_entry in meta["attack"]:
                                        tactic = attack_entry.get("tactic", "")
                                        technique = attack_entry.get("technique", "")
                                        id = attack_entry.get("id", "")
                                        if tactic and technique:
                                            if tactic in attack_dump:
                                                attack_dump[tactic].append((technique, id))
                                            else:
                                                attack_dump[tactic] = [(technique, id)]
                                            tactics.add(tactic)
                                            techniques.add(technique)
                                            techniques_id.add(id)

                                # Process MBC information
                                if "mbc" in meta:
                                    for mbc_entry in meta["mbc"]:
                                        objective = mbc_entry.get("objective", "")
                                        behavior = mbc_entry.get("behavior", "")
                                        id = mbc_entry.get("id", "")
                                        if objective and behavior:
                                            if objective in mbc_dump:
                                                mbc_dump[objective].append((behavior, id))
                                            else:
                                                mbc_dump[objective] = [(behavior, id)]
                                            mbc_objectives.add(objective)
                                            mbc_behaviors.add(behavior)
                                            mbc_behaviors_id.add(id)

            # return {
            #     'capabilities_all': json.dumps(capabilities_all, indent=2),
            #     'capabilities': list(capabilities),
            #     'namespaces': list(namespaces),
            #     'attack': json.dumps(attack, indent=2),
            #     'tactics': list(tactics),
            #     'techniques': list(techniques),
            #     'techniques_id': list(techniques_id),
            #     'mbc': json.dumps(mbc, indent=2),
            #     'mbc_objectives': list(mbc_objectives),
            #     'mbc_behaviors': list(mbc_behaviors),
            #     'mbc_behaviors_id': list(mbc_behaviors_id)
            # }

            capa_dump = self._replace_empty_keys(capa_dump)
            attack_dump = self._replace_empty_keys(attack_dump)
            mbc_dump = self._replace_empty_keys(mbc_dump)
            self.capa = CAPA(
                json.dumps(capa_dump, indent=2),
                list(capabilities),
                list(namespaces),
                json.dumps(attack_dump, indent=2),
                list(tactics),
                list(techniques),
                list(techniques_id),
                json.dumps(mbc_dump, indent=2),
                list(mbc_objectives),
                list(mbc_behaviors),
                list(mbc_behaviors_id),
            )
            self.log.debug(f"CAPA dump: {self.capa})")
            
        except Exception as e:
            self.log.error(f"Unexpected error in CAPA extraction: {str(e)}")
            # Try to clean up any process if possible
            if 'process' in locals() and process.poll() is None:
                try:
                    os.killpg(process.pid, signal.SIGKILL)
                    process.wait()
                except:
                    pass
            return {}

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.capa
        elif exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)
            
            # Prepare data for multiple tables
            tables_data = {
                'multi_table': True,  # Flag for multi-table export
                
                # Raw data table
                'raw': {
                    'table': 'redb_capa',
                    'data': [[
                        self.sha256,
                        self.md5,
                        self.sha1,
                        current_time,
                        self.capa.capa_dump,  # capa_dump
                        self.capa.attack_dump,            # attack_dump
                        self.capa.mbc_dump                # mbc_dump
                    ]],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'capa_dump', 'attack_dump', 'mbc_dump'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'JSON', 'JSON', 'JSON'
                    ]
                },
                
                # Capabilities table
                'capabilities': {
                    'table': 'redb_capa_capabilities',
                    'data': [
                        [self.sha256, self.md5, self.sha1, current_time, namespace, capability]
                        for namespace, capabilities in json.loads(self.capa.capa_dump).items()
                        for capability in capabilities
                    ],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'namespace', 'capability'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'LowCardinality(String)', 'LowCardinality(String)'
                    ]
                },
                
                # MITRE ATT&CK table
                'attack': {
                    'table': 'redb_capa_attack',
                    'data': [
                        [self.sha256, self.md5, self.sha1, current_time, 
                         tactic, technique[0], technique[1]]  # technique[0] is the name, technique[1] is the ID
                        for tactic, techniques in json.loads(self.capa.attack_dump).items()
                        for technique in techniques
                    ],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'tactic', 'technique', 'technique_id'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'LowCardinality(String)', 'LowCardinality(String)', 
                        'LowCardinality(String)'
                    ]
                },
                
                # MBC table
                'mbc': {
                    'table': 'redb_capa_mbc',
                    'data': [
                        [self.sha256, self.md5, self.sha1, current_time,
                         objective, behavior[0], behavior[1]]  # behavior[0] is the name, behavior[1] is the ID
                        for objective, behaviors in json.loads(self.capa.mbc_dump).items()
                        for behavior in behaviors
                    ],
                    'column_names': [
                        'sha256', 'md5', 'sha1', 'analysis_date',
                        'objective', 'behavior', 'behavior_id'
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                        'DateTime64(3, \'UTC\')',
                        'LowCardinality(String)', 'LowCardinality(String)',
                        'LowCardinality(String)'
                    ]
                }
            }
            
            return tables_data

    def get_clickhouse_table(self) -> str:
        return "redb_capa"  # Return the main table name

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_capa()
            return self.capa  # Return the extracted data instead of exporting directly
        except Exception as e:
            self.log.error(f"Error extracting CAPA: {e}")
            return None

    def tag(self):
        return Tag.CAPA.value