Esempio n. 1
0
    def on_ui_setup(self, ui):
        if ui.is_waveshare_v2():
            h_pos = (180, 80)
            v_pos = (180, 61)
        elif ui.is_inky():
            h_pos = (140, 68)
            v_pos = (165, 54)
        else:
            h_pos = (155, 76)
            v_pos = (180, 61)

        if self.options['orientation'] == "horizontal":
            ui.add_element(
                'memtemp',
                LabeledValue(color=BLACK,
                             label='',
                             value='mem cpu temp\n - -  -',
                             position=h_pos,
                             label_font=fonts.Small,
                             text_font=fonts.Small))
        elif self.options['orientation'] == "vertical":
            ui.add_element(
                'memtemp',
                LabeledValue(color=BLACK,
                             label='',
                             value=' mem:-\n cpu:-\ntemp:-',
                             position=v_pos,
                             label_font=fonts.Small,
                             text_font=fonts.Small))
    def on_ui_setup(self, ui):
        if ui.is_waveshare_v2():
            h_pos = (0, 95)
            v_pos = (180, 61)
        elif ui.is_waveshare_v1():
            h_pos = (0, 95)
            v_pos = (170, 61)
        elif ui.is_waveshare144lcd():
            h_pos = (0, 92)
            v_pos = (78, 67)
        elif ui.is_inky():
            h_pos = (0, 83)
            v_pos = (165, 54)
        elif ui.is_waveshare27inch():
            h_pos = (0, 153)
            v_pos = (216, 122)
        else:
            h_pos = (0, 91)
            v_pos = (180, 61)

        if self.options['orientation'] == "vertical":
            ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='',
                                                   position=v_pos,
                                                   label_font=fonts.Bold, text_font=fonts.Small))
        else:
            # default to horizontal
            ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='',
                                                   position=h_pos,
                                                   label_font=fonts.Bold, text_font=fonts.Small))
Esempio n. 3
0
    def on_ui_setup(self, ui):
        # add coordinates for other displays
        if ui.is_waveshare_v2():
            lat_pos = (127, 75)
            lon_pos = (122, 84)
            alt_pos = (127, 94)
        elif ui.is_inky():
            # guessed values, add tested ones if you can
            lat_pos = (112, 30)
            lon_pos = (112, 49)
            alt_pos = (87, 63)
        elif ui.is_waveshare144lcd():
            # guessed values, add tested ones if you can
            lat_pos = (67, 73)
            lon_pos = (62, 83)
            alt_pos = (67, 93)
        else:
            # guessed values, add tested ones if you can
            lat_pos = (127, 51)
            lon_pos = (127, 56)
            alt_pos = (102, 71)

        label_spacing = 0

        ui.add_element(
            "latitude",
            LabeledValue(
                color=BLACK,
                label="lat:",
                value="-",
                position=lat_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=label_spacing,
            ),
        )
        ui.add_element(
            "longitude",
            LabeledValue(
                color=BLACK,
                label="long:",
                value="-",
                position=lon_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=label_spacing,
            ),
        )
        ui.add_element(
            "altitude",
            LabeledValue(
                color=BLACK,
                label="alt:",
                value="-",
                position=alt_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=label_spacing,
            ),
        )
Esempio n. 4
0
 def on_ui_setup(self, ui):
     ui.add_element(
         "bat",
         LabeledValue(
             color=BLACK,
             label="BAT",
             value="0%",
             position=(ui.width() / 2 + 15, 0),
             label_font=fonts.Bold,
             text_font=fonts.Medium,
         ),
     )
     # display charging status
     if self.is_new_model:
         ui.add_element(
             "chg",
             LabeledValue(
                 color=BLACK,
                 label="",
                 value="",
                 position=(ui.width() / 2 - 12, 0),
                 label_font=fonts.Bold,
                 text_font=fonts.Bold,
             ),
         )
Esempio n. 5
0
    def on_ui_setup(self, ui):
        memenable = False
        config_is_toml = True if os.path.exists(
            '/etc/pwnagotchi/config.toml') else False
        config_path = '/etc/pwnagotchi/config.toml' if config_is_toml else '/etc/pwnagotchi/config.yml'
        with open(config_path) as f:
            data = toml.load(f) if config_is_toml else yaml.load(
                f, Loader=yaml.FullLoader)

            if 'memtemp' in data["main"]["plugins"]:
                if 'enabled' in data["main"]["plugins"]["memtemp"]:
                    if data["main"]["plugins"]["memtemp"]["enabled"]:
                        memenable = True
                        logging.info("Wardrive: memtemp is enabled")
        if ui.is_waveshare_v2():
            pos = (130, 85) if memenable else (200, 85)
            pos2 = (70, 70) if memenable else (195, 70)
            ui.add_element(
                'clock',
                LabeledValue(color=BLACK,
                             label='',
                             value='-/-/-\n-:--',
                             position=pos,
                             label_font=fonts.Small,
                             text_font=fonts.Small))
            ui.add_element(
                'wardriver',
                LabeledValue(color=BLACK,
                             label='',
                             value='WARDRIV\'N',
                             position=pos2,
                             label_font=fonts.Small,
                             text_font=fonts.Small))
Esempio n. 6
0
    def on_ui_setup(self, ui):
        try:
            # Configure line_spacing
            line_spacing = int(self.options['linespacing'])
        except Exception:
            # Set default value
            line_spacing = self.LINE_SPACING

        try:
            # Configure position
            pos = self.options['position'].split(',')
            pos = [int(x.strip()) for x in pos]
        except Exception:
            # Set position based on screen type
            if ui.is_waveshare_v2():
                pos = (122, 70)
            else:
                pos = (122, 50)

        ui.add_element(
            'gps_lat',
            LabeledValue(
                color=BLACK,
                label='lat:',
                value='-',
                position=(pos[0] + 5, pos[1]),
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=self.LABEL_SPACING,
            ),
        )
        ui.add_element(
            'gps_long',
            LabeledValue(
                color=BLACK,
                label='long:',
                value='-',
                position=(pos[0], pos[1] + line_spacing),
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=self.LABEL_SPACING,
            ),
        )
        ui.add_element(
            'gps_alt',
            LabeledValue(
                color=BLACK,
                label='alt:',
                value='-',
                position=(pos[0] + 5, pos[1] + (2 * line_spacing)),
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=self.LABEL_SPACING,
            ),
        )
 def on_ui_setup(self, ui):
     ui.add_element(
         'Lv',
         LabeledValue(color=BLACK,
                      label='Lv',
                      value=0,
                      position=(ui.width() / 2 - 125, 95),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
     ui.add_element(
         'Exp',
         LabeledValue(color=BLACK,
                      label='Exp',
                      value=0,
                      position=(ui.width() / 2 - 85, 95),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
Esempio n. 8
0
def on_ui_setup(ui):
    ui.add_element(
        'memtemp',
        LabeledValue(color=BLACK,
                     label='',
                     value='\nT:-  U:-\nF:- -',
                     position=(ui.width() / 2 + 17, ui.height() / 2),
                     label_font=fonts.Bold,
                     text_font=fonts.Medium))
Esempio n. 9
0
 def on_ui_setup(self, ui):
     ui.add_element(
         'pivoyager',
         LabeledValue(color=BLACK,
                      label=' ',
                      value=' ',
                      position=(192, 84),
                      label_font=fonts.Small,
                      text_font=fonts.Small))
Esempio n. 10
0
 def on_ui_setup(self, ui):
     ui.add_element(
         'pisugar',
         LabeledValue(color=BLACK,
                      label='BAT',
                      value='0%',
                      position=(ui.width() / 2 + 10, 0),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
Esempio n. 11
0
 def on_ui_setup(self, ui):
     ui.add_element(
         'bluetooth',
         LabeledValue(color=BLACK,
                      label='BT',
                      value='-',
                      position=(ui.width() / 2 - 15, 0),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
 def on_ui_setup(self, ui):
     # add custom UI elements
     ui.add_element(
         'deauth',
         LabeledValue(color=BLACK,
                      label='Deauths ',
                      value=str(self.deauth_counter),
                      position=(ui.width() / 2 + 50, ui.height() - 25),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
     ui.add_element(
         'hand',
         LabeledValue(color=BLACK,
                      label='Handshakes ',
                      value=str(self.handshake_counter),
                      position=(ui.width() / 2 + 50, ui.height() - 35),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
Esempio n. 13
0
 def on_ui_setup(self, ui):
     # add custom UI elements
     ui.add_element(
         'deauth',
         LabeledValue(color=BLACK,
                      label='Deauths ',
                      value=str(self.deauth_counter),
                      position=(ui.width() / 2 - 125, 95),
                      label_font=fonts.Medium,
                      text_font=fonts.Small))
     ui.add_element(
         'hand',
         LabeledValue(color=BLACK,
                      label='Handshakes ',
                      value=str(self.handshake_counter),
                      position=(ui.width() / 2 - 125, 85),
                      label_font=fonts.Medium,
                      text_font=fonts.Small))
 def on_ui_setup(self, ui):
     ui.add_element(
         'ups',
         LabeledValue(color=BLACK,
                      label='UPS',
                      value='0%/0V',
                      position=(ui.width() / 2 + 15, 0),
                      label_font=fonts.Bold,
                      text_font=fonts.Medium))
Esempio n. 15
0
def on_ui_setup(ui):
    if OPTIONS['orientation'] == "horizontal":
        ui.add_element(
            'memtemp',
            LabeledValue(color=BLACK,
                         label='',
                         value='mem cpu temp\n - -  -',
                         position=(ui.width() / 2 + 30, ui.height() / 2 + 15),
                         label_font=fonts.Small,
                         text_font=fonts.Small))
    elif OPTIONS['orientation'] == "vertical":
        ui.add_element(
            'memtemp',
            LabeledValue(color=BLACK,
                         label='',
                         value=' mem:-\n cpu:-\ntemp:-',
                         position=(ui.width() / 2 + 55, ui.height() / 2),
                         label_font=fonts.Small,
                         text_font=fonts.Small))
Esempio n. 16
0
 def on_ui_setup(self, ui):
     memenable = False
     if self.config['main']['plugins']['memtemp']['enabled'] is True:
         memenable = True
         logging.info("[clock] Memtemp is enabled.")
     if ui.is_waveshare_v2():
         pos = (120, 80) if memenable else (200, 80)
         ui.add_element('clock', LabeledValue(color=BLACK, label='', value='-/-/-\n-:--',
                                              position=pos,
                                              label_font=fonts.Small, text_font=fonts.Small))
 def on_ui_setup(self, ui):
     with ui._lock:
         ui.add_element(
             'apfake',
             LabeledValue(color=BLACK,
                          label='F',
                          value='-',
                          position=(ui.width() / 2 + 20, 0),
                          label_font=fonts.Bold,
                          text_font=fonts.Medium))
Esempio n. 18
0
 def on_ui_setup(self, ui):
     # add custom UI elements
     ui.add_element(
         'clk',
         LabeledValue(color=BLACK,
                      label='',
                      value='-/--:--',
                      position=(175, 110),
                      label_font=fonts.Small,
                      text_font=fonts.Small))
Esempio n. 19
0
    def on_ui_setup(self, ui):
        pos = (1, 76)
        ui.add_element(
            'pn_status',
            LabeledValue(color=BLACK,
                         label='',
                         value='PN: Active',
                         position=pos,
                         label_font=fonts.Small,
                         text_font=fonts.Small))

        pos = (122, 94)
        ui.add_element(
            'pn_count',
            LabeledValue(color=BLACK,
                         label='',
                         value='PN: Active',
                         position=pos,
                         label_font=fonts.Small,
                         text_font=fonts.Small))
Esempio n. 20
0
    def on_ui_setup(self, ui):
        if ui.is_waveshare_v2():
            h_pos = (170, 80)
            v_pos = (180, 61)
        elif ui.is_waveshare_v1():
            h_pos = (170, 80)
            v_pos = (170, 61)
        elif ui.is_waveshare144lcd():
            h_pos = (53, 77)
            v_pos = (78, 67)
        elif ui.is_inky():
            h_pos = (130, 68)
            v_pos = (165, 54)
        elif ui.is_waveshare27inch():
            h_pos = (192, 138)
            v_pos = (216, 122)
        else:
            h_pos = (145, 76)
            v_pos = (180, 61)

        if self.options['orientation'] == "vertical":
            ui.add_element(
                'memtemp',
                LabeledValue(color=BLACK,
                             label='',
                             value=' mem:-\n cpu:-\ntemp:-',
                             position=v_pos,
                             label_font=fonts.Small,
                             text_font=fonts.Small))
        else:
            # default to horizontal
            ui.add_element(
                'memtemp',
                LabeledValue(color=BLACK,
                             label='',
                             value='mem cpu temp\n - -  -',
                             position=h_pos,
                             label_font=fonts.Small,
                             text_font=fonts.Small))
Esempio n. 21
0
def on_ui_update(ui):
    new_value = ' %d (%d)' % (UNREAD_MESSAGES, TOTAL_MESSAGES)
    if not ui.has_element('mailbox'):
        logging.debug("add mailbox")
        ui.add_element(
            'mailbox',
            LabeledValue(color=BLACK,
                         label='MSG',
                         value=new_value,
                         position=(100, 0),
                         label_font=fonts.Bold,
                         text_font=fonts.Medium))
    ui.set('mailbox', new_value)
Esempio n. 22
0
    def on_ui_setup(self, ui):
        memenable = False
        with open('/etc/pwnagotchi/config.yml') as f:
            data = yaml.load(f, Loader=yaml.FullLoader)

            if 'memtemp' in data["main"]["plugins"]:
                if 'enabled' in data["main"]["plugins"]["memtemp"]:
                    if data["main"]["plugins"]["memtemp"]["enabled"]:
                        memenable = True
                        logging.info("[christmas] memtemp is enabled")
        if ui.is_waveshare_v2():
            pos = (130, 80) if memenable else (200, 80)
            ui.add_element('christmas', LabeledValue(color=BLACK, label='', value='christmas\n',
                                                     position=pos,
                                                     label_font=fonts.Small, text_font=fonts.Small))
Esempio n. 23
0
    def on_ui_setup(self, ui):
        emenable = False
        
        with open('/etc/pwnagotchi/config.toml', 'r') as f:
            config = f.read().splitlines()

        if "main.plugins.memtemp.enabled = true" in config:
            memenable = True
            logging.info(
                "Birth Day Counter Plugin: memtemp is enabled")
                
        if ui.is_waveshare_v2():
            pos = (160, 95) if memenable else (160, 95)
            ui.add_element('birthday', LabeledValue(color=BLACK, label='', value='birthday\n',
                                                     position=pos,
                                                     label_font=fonts.Small, text_font=fonts.Small))
Esempio n. 24
0
    def on_ui_setup(self, ui):
        emenable = False

        with open('/etc/pwnagotchi/config.toml', 'r') as f:
            config = f.read().splitlines()

        if "main.plugins.memtemp.enabled = true" in config:
            memenable = True
            logging.info(
                "Pwnagotchi Clock Plugin: memtemp is enabled")

        if ui.is_waveshare_v2():
            pos = (130, 80) if memenable else (200, 80)
            ui.add_element('clock', LabeledValue(color=BLACK, label='', value='-/-/-\n-:--',
                                                 position=pos,
                                                 label_font=fonts.Small, text_font=fonts.Small))
Esempio n. 25
0
def on_ui_update(ui):
    new_value = ' %d (%d)' % (UNREAD_MESSAGES, TOTAL_MESSAGES)
    if not ui.has_element('mailbox') and UNREAD_MESSAGES > 0:
        if ui.is_inky():
            pos = (80, 0)
        else:
            pos = (100, 0)
        ui.add_element(
            'mailbox',
            LabeledValue(color=BLACK,
                         label='MSG',
                         value=new_value,
                         position=pos,
                         label_font=fonts.Bold,
                         text_font=fonts.Medium))
    ui.set('mailbox', new_value)
Esempio n. 26
0
    def on_ui_setup(self, ui):
        if ui.is_waveshare_v2():
            h_pos = (180, 80)
        elif ui.is_waveshare_v1():
            h_pos = (170, 80)
        elif ui.is_waveshare144lcd():
            h_pos = (53, 77)
        elif ui.is_inky():
            h_pos = (140, 68)
        elif ui.is_waveshare27inch():
            h_pos = (192, 138)
        else:
            h_pos = (155, 76)

        ui.add_element(
            'bitcoin',
            LabeledValue(color=BLACK,
                         label='',
                         value=' BTC/USD: \n $ ',
                         position=h_pos,
                         label_font=fonts.Small,
                         text_font=fonts.Small))
Esempio n. 27
0
    def on_ui_setup(self, ui):
        try:
            # Configure field list
            self.fields = self.options['fields'].split(',')
            self.fields = [
                x.strip() for x in self.fields
                if x.strip() in self.ALLOWED_FIELDS.keys()
            ]
            self.fields = self.fields[:3]  # limit to the first 3 fields
        except Exception:
            # Set default value
            self.fields = self.DEFAULT_FIELDS

        try:
            # Configure line_spacing
            line_spacing = int(self.options['linespacing'])
        except Exception:
            # Set default value
            line_spacing = self.LINE_SPACING

        try:
            # Configure position
            pos = self.options['position'].split(',')
            pos = [int(x.strip()) for x in pos]
            if self.options['orientation'] == "vertical":
                v_pos = (pos[0], pos[1])
            else:
                h_pos = (pos[0], pos[1])
        except Exception:
            # Set default position based on screen type
            if ui.is_waveshare_v2():
                h_pos = (115, 74)
                v_pos = (115, 64)
            elif ui.is_waveshare_v1():
                h_pos = (170, 80)
                v_pos = (165, 61)
            elif ui.is_waveshare144lcd():
                h_pos = (53, 77)
                v_pos = (73, 67)
            elif ui.is_inky():
                h_pos = (140, 68)
                v_pos = (160, 54)
            elif ui.is_waveshare27inch():
                h_pos = (192, 138)
                v_pos = (211, 122)
            else:
                h_pos = (155, 76)
                v_pos = (175, 61)

        if self.options['orientation'] == "vertical":
            # Dynamically create the required LabeledValue objects
            for idx, field in enumerate(self.fields):
                v_pos_x = v_pos[0]
                v_pos_y = v_pos[1] + (
                    (len(self.fields) - 3) * -1 * line_spacing)
                ui.add_element(
                    f"memtemp_{field}",
                    LabeledValue(
                        color=BLACK,
                        label=f"{self.pad_text(field)}:",
                        value="-",
                        position=(v_pos_x, v_pos_y + (idx * line_spacing)),
                        label_font=fonts.Small,
                        text_font=fonts.Small,
                        label_spacing=self.LABEL_SPACING,
                    ))
        else:
            # default to horizontal
            h_pos_x = h_pos[0] + ((len(self.fields) - 3) * -1 * 25)
            h_pos_y = h_pos[1]
            ui.add_element(
                'memtemp_header',
                Text(
                    color=BLACK,
                    value=" ".join([self.pad_text(x) for x in self.fields]),
                    position=(h_pos_x, h_pos_y),
                    font=fonts.Small,
                ))
            ui.add_element(
                'memtemp_data',
                Text(
                    color=BLACK,
                    value=" ".join([self.pad_text("-") for x in self.fields]),
                    position=(h_pos_x, h_pos_y + line_spacing),
                    font=fonts.Small,
                ))
Esempio n. 28
0
def on_ui_setup(ui):
    ui.add_element('memtemp', LabeledValue(color=BLACK, label='SYS', value='tm:0 um:0 fm:0 0.0C', position=(0, ui.height()-28),
                                       label_font=fonts.Bold, text_font=fonts.Medium))
Esempio n. 29
0
    def on_ui_setup(self, ui):
        try:
            # Configure line_spacing
            line_spacing = int(self.options['linespacing'])
        except Exception:
            # Set default value
            line_spacing = self.LINE_SPACING

        try:
            # Configure position
            pos = self.options['position'].split(',')
            pos = [int(x.strip()) for x in pos]
            lat_pos = (pos[0] + 5, pos[1])
            lon_pos = (pos[0], pos[1] + line_spacing)
            alt_pos = (pos[0] + 5, pos[1] + (2 * line_spacing))
        except Exception:
            # Set default value based on display type
            if ui.is_waveshare_v2():
                lat_pos = (127, 74)
                lon_pos = (122, 84)
                alt_pos = (127, 94)
            elif ui.is_waveshare_v1():
                lat_pos = (130, 70)
                lon_pos = (125, 80)
                alt_pos = (130, 90)
            elif ui.is_inky():
                lat_pos = (127, 60)
                lon_pos = (122, 70)
                alt_pos = (127, 80)
            elif ui.is_waveshare144lcd():
                # guessed values, add tested ones if you can
                lat_pos = (67, 73)
                lon_pos = (62, 83)
                alt_pos = (67, 93)
            elif ui.is_dfrobot_v2():
                lat_pos = (127, 74)
                lon_pos = (122, 84)
                alt_pos = (127, 94)
            elif ui.is_waveshare27inch():
                lat_pos = (6, 120)
                lon_pos = (1, 135)
                alt_pos = (6, 150)
            else:
                # guessed values, add tested ones if you can
                lat_pos = (127, 51)
                lon_pos = (122, 61)
                alt_pos = (127, 71)

        ui.add_element(
            "latitude",
            LabeledValue(
                color=BLACK,
                label="lat:",
                value="-",
                position=lat_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=self.LABEL_SPACING,
            ),
        )
        ui.add_element(
            "longitude",
            LabeledValue(
                color=BLACK,
                label="long:",
                value="-",
                position=lon_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=self.LABEL_SPACING,
            ),
        )
        ui.add_element(
            "altitude",
            LabeledValue(
                color=BLACK,
                label="alt:",
                value="-",
                position=alt_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=self.LABEL_SPACING,
            ),
        )
    def on_ui_setup(self, ui):
        # add coordinates for other displays
        if ui.is_waveshare_v2():
            lat_pos = (132, 67)
            lon_pos = (127, 77)
            alt_pos = (132, 87)
        elif ui.is_waveshare_v1():
            lat_pos = (130, 70)
            lon_pos = (125, 80)
            alt_pos = (130, 90)
        elif ui.is_inky():
            lat_pos = (127, 60)
            lon_pos = (127, 70)
            alt_pos = (127, 80)
        elif ui.is_waveshare144lcd():
            # guessed values, add tested ones if you can
            lat_pos = (67, 73)
            lon_pos = (62, 83)
            alt_pos = (67, 93)
        elif ui.is_dfrobot_v2:
            lat_pos = (127, 75)
            lon_pos = (122, 84)
            alt_pos = (127, 94)
        elif ui.is_waveshare27inch():
            lat_pos = (6, 120)
            lon_pos = (1, 135)
            alt_pos = (6, 150)
        else:
            # guessed values, add tested ones if you can
            lat_pos = (127, 51)
            lon_pos = (127, 56)
            alt_pos = (102, 71)

        label_spacing = 0

        ui.add_element(
            "latitude",
            LabeledValue(
                color=BLACK,
                label="lat:",
                value="-",
                position=lat_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=label_spacing,
            ),
        )
        ui.add_element(
            "longitude",
            LabeledValue(
                color=BLACK,
                label="long:",
                value="-",
                position=lon_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=label_spacing,
            ),
        )
        ui.add_element(
            "altitude",
            LabeledValue(
                color=BLACK,
                label="alt:",
                value="-",
                position=alt_pos,
                label_font=fonts.Small,
                text_font=fonts.Small,
                label_spacing=label_spacing,
            ),
        )