          if any("?" in val for val in tqdm.values()):
              logger.trace("tqdm initializing. Skipping")
              return True
          processtime = "Elapsed: {}  Remaining: {}".format(tqdm["tme"].split("<")[0],
                                                            tqdm["tme"].split("<")[1])
          message = "{}{}  |  {}  |  {}  |  {}".format(description,
                                                       processtime,
                                                       tqdm["rte"],
                                                       tqdm["itm"],
 
</s> remove         message = "{}  |  {}  |  {}  |  {}".format(processtime,
                                                   tqdm["rte"],
                                                   tqdm["itm"],
                                                   tqdm["pct"])

        current, total = tqdm["itm"].split("/")
        position = int((float(current) / float(total)) * 1000)
 </s> add         message = "{}{}  |  {}  |  {}  |  {}".format(description,
                                                     processtime,
                                                     tqdm["rte"],
                                                     tqdm["itm"],
                                                     tqdm["pct"])

        position = tqdm["pct"].replace("%", "")
        position = int(position) if position.isdigit() else 0 </s> remove             msg = "No data to display. Not refreshing"
            logger.debug(msg)
            print(msg)
 </s> add             return False
        return True

    def check_valid_data(self):
        """ Check that the selections holds valid data to display
            NB: len-as-condition is used as data could be a list or a numpy array
        """
        logger.debug("Validating data. %s",
                     {key: len(val) for key, val in self.display_data.stats.items()})
        if any(len(val) == 0  # pylint:disable=len-as-condition
               for val in self.display_data.stats.values()): </s> remove             kwargs = {"values": values, "image": get_images().icons["graph"]}
 </s> add             kwargs = {"values": values}
            if self.check_valid_data(values):
                # Don't show graph icon for non-existent sessions
                kwargs["image"] = get_images().icons["graph"] </s> remove             var.set(True)
            var.trace("w", self.optbtn_reset)
 </s> add             if loss_key.startswith("loss"):
                var.set(True)
        description = tqdm["dsc"].strip()
        description = description if description == "" else "{}  |  ".format(description[:-1])
          if any("?" in val for val in tqdm.values()):
              logger.trace("tqdm initializing. Skipping")
              return True
        description = tqdm["dsc"].strip()
        description = description if description == "" else "{}  |  ".format(description[:-1])
          processtime = "Elapsed: {}  Remaining: {}".format(tqdm["tme"].split("<")[0],
                                                            tqdm["tme"].split("<")[1])
          message = "{}{}  |  {}  |  {}  |  {}".format(description,
                                                       processtime,
                                                       tqdm["rte"],
                                                       tqdm["itm"],
keep keep add keep keep keep keep keep keep
 GUI Fixups

- Analysis: Handle missing session Ids
- Analysis: Handle invalid data selections
- Analysis: Don't update graph on check box selection
- Analysis: Add cursor events to analysis tab
- Analysis: Change default graph view
- Training: Prevent GUI from attempting to close graphs which do not exist
- Extract/Convert: Make file extensions case-insensitive for preview
- Progress bar: Make compatible for downloads
- Progress bar: Add TQDM Description to progress bar stats text 
lib/gui/wrapper.py