Skip to content

Instantly share code, notes, and snippets.

@matclab
Created October 7, 2019 21:15
Show Gist options
  • Save matclab/3a36d46e16bee776d0739292bcacaa9b to your computer and use it in GitHub Desktop.
Save matclab/3a36d46e16bee776d0739292bcacaa9b to your computer and use it in GitHub Desktop.
Argos hamster plugin
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
##### Custommization
# Shall we use an icon instead of the current activity in the
USE_ICON=False
# Shall we add an "Add activity" link (for hamster 2+)
ADD_ACTIVITY=False
# How many days to look back in the past in order to get past activities
DAYS=14
MENU_COLOR="#919191"
MENU_SIZE=10
# scale factor for your DPI
SCALE = '1'
scale = float(SCALE)
iconHeight = str(int(24 * scale))
iconWidth = str(int(30 * scale))
import csv
import itertools
import functools
from subprocess import Popen, PIPE
from datetime import date, timedelta
from dataclasses import dataclass
def hamster(cmd, strip=True):
proc = Popen(f"LC_ALL=C hamster {cmd}", stdout=PIPE, shell=True)
res, _ = proc.communicate()
proc.wait()
res = res.decode('utf8')
if strip:
return res.strip()
else:
return res
def sort_uniq(sequence):
return (x[0] for x in itertools.groupby(sorted(sequence)))
def dec2sex(hd:int) -> str:
m, s = divmod(hd*3600, 60)
h, m = divmod(m, 60)
h = int(h)
m = int(m)
if m:
return f"{h}h{m}m"
else:
return f"{h}h"
@functools.lru_cache()
def recent_activities():
""" Return a sequence of (activity, category, description, tags)
corresponding to the last uniques activities seen DAYS before"""
now = date.today().isoformat()
before = (date.today() - timedelta(days=DAYS)).isoformat()
act = hamster(f"export tsv {before} {now}", strip=False).split("\n")[1:-2]
act = csv.reader(act, delimiter="\t")
act = map(lambda x: (x[0], x[4], x[5], x[6]), act )
act = sort_uniq(act)
return act
@dataclass
class Hamster():
current_full: str = ''
current_activity: str = ''
active: bool = False
def task_bar(self):
self.current_full = hamster("current")
self.current_activity = self.current_full
if self.current_activity != "No activity":
self.current_activity = self.current_full.split(',')[0].split()[2]
self.active = True
if USE_ICON:
print(f" |image={ICON} imageHeight={iconHeight} imageWidth={iconWidth}")
else:
print(self.current_activity)
print("---")
def header(self):
print(f"Current activity | size={MENU_SIZE} | color={MENU_COLOR}")
if self.active:
print(" ".join(self.current_full.split(',')[0].split()[2:]))
print("Stop Tracking | terminal=false refresh=true bash='hamster stop'")
else:
print(self.current_activity)
def recent(self):
print(f"Recent activities | size={MENU_SIZE} | color={MENU_COLOR}")
for a in recent_activities():
l = "#%s" % " #".join(a[3].split(',')) if a[3] else ""
print(f"-- {a[0]}@{a[1]}, {a[2]} {l} "
" | terminal=false refresh=true "
f"bash=\'hamster start \"{a[0]}@{a[1]}, {a[2]} {l}\"\'")
def footer(self ):
print("---")
print("Show Overview | "
"terminal=false refresh=true bash='hamster overview'")
if ADD_ACTIVITY:
print("Add Earlier Activity | "
"terminal=false refresh=true bash='hamster add'")
fulltotal = hamster("list").split("\n")[-1]
total = sum(map(
lambda x: float(x.split(':')[1][:-1]),
fulltotal.split(',')))
total = dec2sex(total)
print(f"<b>total</b>: {total} <small>({fulltotal})</small> | "
f"color={MENU_COLOR}")
def generate(self):
self.task_bar()
self.header()
self.recent()
self.footer()
# Hamster SVG icon
ICON="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+CjxzdmcgaWQ9InN2ZzIiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KIDxkZWZzIGlkPSJkZWZzNCI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY2MzAiPgogICA8c3RvcCBpZD0ic3RvcDY2MzIiIHN0b3AtY29sb3I9IiNhMmE1OWUiIG9mZnNldD0iMCIvPgogICA8c3RvcCBpZD0ic3RvcDY2MzQiIHN0b3AtY29sb3I9IiNjYWNjYzciIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDYxNTQiIHgxPSIxOC4wNjIiIHgyPSIxOC41IiB5MT0iNy44NzUiIHkyPSIxMC4zNzUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMiw0NCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3A2MTQ0IiBzdG9wLWNvbG9yPSIjM2I3NGJkIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A2MTQ2IiBzdG9wLWNvbG9yPSIjMmY1ODk0IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjYzMzkiIHg9Ii0uMTA3ODQiIHk9Ii0uNjU3MTQiIHdpZHRoPSIxLjIxNTciIGhlaWdodD0iMi4zMTQzIj4KICAgPGZlR2F1c3NpYW5CbHVyIGlkPSJmZUdhdXNzaWFuQmx1cjYzNDEiIHN0ZERldmlhdGlvbj0iMS4wOTUyMzQ1Ii8+CiAgPC9maWx0ZXI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDY0OTMiIHgxPSI0OC4wNDQiIHgyPSI1OC4wMDgiIHkxPSIxOS44ODgiIHkyPSI0NS42MzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk1Mjk4IDAgMCAuODM4NTEgLTI4LjY4OCAzLjU0OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3A1OTgxIiBzdG9wLWNvbG9yPSIjOTFiNWRhIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A1OTgzIiBzdG9wLWNvbG9yPSIjNTM4NWJkIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ2NDk1IiB4MT0iNTIuMzIiIHgyPSI2MS4wNzciIHkxPSIxMS43MjkiIHkyPSI0My40NzEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjk1Mjk4IDAgMCAuODM4NTMgLTI2Ljc4MiAzLjU0ODIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNjExNCIgc3RvcC1jb2xvcj0iIzNjNzViZSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNjExNiIgc3RvcC1jb2xvcj0iIzM0NjVhNCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NjUxNSIgeDE9IjE5LjI1IiB4Mj0iMTkuMTYyIiB5MT0iNDUuNjI1IiB5Mj0iMzciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiwtMikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3A2MzQ5IiBzdG9wLWNvbG9yPSIjYTlhY2E0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A2MzUxIiBzdG9wLWNvbG9yPSIjZTJlM2UxIiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxyYWRpYWxHcmFkaWVudCBpZD0icmFkaWFsR3JhZGllbnQ2NTgyIiBjeD0iMjIuMTI1IiBjeT0iMjIuMzc1IiByPSIxNy45OTYiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjAxMzg5MiAuOTM3NjkgLTEuMDAwMiAuMDE0ODIgNDYuMTk3IC0uNzAyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3A2NTkyIiBzdG9wLWNvbG9yPSIjMjA0YTg3IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A2NTk0IiBzdG9wLWNvbG9yPSIjMzQ2NWE0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A2NTk2IiBzdG9wLWNvbG9yPSIjNDM3M2FlIiBvZmZzZXQ9Ii40NDkwOSIvPgogICA8c3RvcCBpZD0ic3RvcDY1OTgiIHN0b3AtY29sb3I9IiMzNDY1YTQiIG9mZnNldD0iLjU5NTMxIi8+CiAgIDxzdG9wIGlkPSJzdG9wNjYwMCIgc3RvcC1jb2xvcj0iIzcyOWZjZiIgb2Zmc2V0PSIxIi8+CiAgPC9yYWRpYWxHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NjY4OCIgeDE9IjIxLjk3MiIgeDI9IjIxLjIyMyIgeTE9IjM5LjUiIHkyPSIyOS4yNjciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wMDE4IDAgMCAuOTUwODkgMS45OTIgLTEuMDQwNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgPHN0b3AgaWQ9InN0b3A2NDQ5IiBzdG9wLWNvbG9yPSIjYThhYmE0IiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3A2NDUxIiBzdG9wLWNvbG9yPSIjY2NjZGM5IiBvZmZzZXQ9IjEiLz4KICA8L2xpbmVhckdyYWRpZW50PgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ2NjkwIiB4MT0iMjAuNjIyIiB4Mj0iMjAuODc1IiB5MT0iMjYuODkxIiB5Mj0iMzguMDA0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEuMDAxOCAwIDAgLjk5ODM2IDEuOTkyIC0xLjk2NjIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgIDxzdG9wIGlkPSJzdG9wNjYwNiIgc3RvcC1jb2xvcj0iIzc2Nzk3NCIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wNjYwOCIgc3RvcC1jb2xvcj0iIzU1NTc1MyIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50NjY5MiIgeDE9IjM3LjgxMiIgeDI9IjM3Ljk1NiIgeTE9IjM5LjAzMSIgeTI9IjQwIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDIsLTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYzMCIvPgogIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ2Njk2IiB4MT0iMzcuODEyIiB4Mj0iMzcuOTU2IiB5MT0iMzkuMDMxIiB5Mj0iNDAiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgNDYuMTQgLTIpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjYzMCIvPgogIDxmaWx0ZXIgaWQ9ImZpbHRlcjcyMjAiIHg9Ii0uMDgyMTQyIiB5PSItLjYyOTc2IiB3aWR0aD0iMS4xNjQzIiBoZWlnaHQ9IjIuMjU5NSI+CiAgIDxmZUdhdXNzaWFuQmx1ciBpZD0iZmVHYXVzc2lhbkJsdXI3MjIyIiBzdGREZXZpYXRpb249IjEuNTc0Mzk0NSIvPgogIDwvZmlsdGVyPgogPC9kZWZzPgogPGcgaWQ9ImxheWVyMSI+CiAgPHJlY3QgaWQ9InJlY3Q3MjEwIiB0cmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAuODMzMzMgLTExMCAtNzAuNjY3KSIgeD0iMTExIiB5PSIxMzQiIHdpZHRoPSI0NiIgaGVpZ2h0PSI2IiByeD0iMi44NzUiIHJ5PSIzLjQ1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNmaWx0ZXI3MjIwKSIgb3BhY2l0eT0iLjMwNTI2Ii8+CiAgPHBhdGggaWQ9InBhdGg2MjIzIiBkPSJtNDMuNSAzNi42MjUgMyA1Ljc1YzAgMS4xNzcyLTAuOTQ3NzUgMi4xMjUtMi4xMjUgMi4xMjVoLTQwLjc1Yy0xLjE3NzIgMC0yLjEyNS0wLjk0Nzc1LTIuMTI1LTIuMTI1bDMtNS43NXoiIGZpbGw9IiM4ODhhODUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjNTU1NzUzIi8+CiAgPHBhdGggaWQ9InJlY3Q2MjIwIiBkPSJtNi42MjUgMzUuNWgzNC43NWMxLjE3NzIgMCAxLjgxMjUtMC4wNTIyNSAyLjEyNSAxLjEyNWwzIDMuNzVjMCAxLjE3NzItMC45NDc3NSAyLjEyNS0yLjEyNSAyLjEyNWgtNDAuNzVjLTEuMTc3MiAwLTIuMTI1LTAuOTQ3NzUtMi4xMjUtMi4xMjVsMy0zLjc1YzAuNTYyNS0xLjExNDggMC45NDc3NS0xLjEyNSAyLjEyNS0xLjEyNXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ2NTE1KSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiM1NTU3NTMiLz4KICA8cGF0aCBpZD0icGF0aDYxOTYiIGQ9Im0yNC4wMzEgMTguNTMxYy0wLjkzNTk2LTAuMDM1ODMtMS40NDAxIDAuOTM1OTYtMS40NDAxIDAuOTM1OTZsLTE2LjA5MSAxOC4wMDJoMi45NzQxbDEzLjQ5My0xNS4yNTZzMC4zOTMyOC0wLjc0NDg0IDEuMDY0NC0wLjcxNzU3YzAuNzAyODIgMC4wMjg1NyAxLjAzMzEgMC43MTc1NyAxLjAzMzEgMC43MTc1N2wxMy40NjIgMTUuMjg3aDIuOTc0MWwtMTYuMDI5LTE4LjAzM3MtMC40NTk5Mi0wLjg5ODQ1LTEuNDQwMS0wLjkzNTk2eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDY2ODgpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0idXJsKCNsaW5lYXJHcmFkaWVudDY2OTApIiBzdHJva2Utd2lkdGg9IjFweCIvPgogIDxlbGxpcHNlIGlkPSJwYXRoNjI2MSIgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMTI4IDAgMCAxIC00LjQ3MTggLTIuNSkiIGN4PSIyMS42ODgiIGN5PSI0MS41IiByeD0iMTIuMTg4IiByeT0iMiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWx0ZXI9InVybCgjZmlsdGVyNjMzOSkiIG9wYWNpdHk9Ii40OTgyNSIvPgogIDxwYXRoIGlkPSJyZWN0NjYxMiIgZD0ibTM4LjczNCAzN2gxLjYxNTVsMS4wNTcxIDFoLTEuNzE5OXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ2NjkyKSIgZmlsbC1ydWxlPSJldmVub2RkIi8+CiAgPHBhdGggaWQ9InBhdGg2MTUwIiBkPSJtMjMuNTYyIDMuNWMtMS4zNDE1LTAuMDAzNDI1LTIuNzEyOCAwLjI1MjM4LTQuMDYyNSAwLjgxMjVsMS42ODc1IDMuNWMtMS45NjQ3IDAuNDE3NzItMy43NjUyIDEuMjY2NC01LjMxMjUgMi40Mzc1bC0xLjMxMjUtMy44NzVjLTIuNzAwOSAxLjExNjYtNC41OTEgMy4wODg2LTUuNzE4OCA1LjU5MzhsNCAxLjQzNzVjLTEuMDk4NCAxLjYwOC0xLjgzNzcgMy40NjUtMi4xNTYyIDUuNDY4OGwtMy44NDM4LTEuODc1Yy0xLjEyMDIgMi42OTk0LTEuMDM2NSA1LjQzMTItMC4wNjI1IDhsMy45MDYyLTEuODQzOGMwLjMyMTM2IDEuOTkyMSAxLjA2MzQgMy44Mzc2IDIuMTU2MiA1LjQzNzVsLTMuOTY4OCAxLjM3NWMxLjExNjYgMi43MDA5IDMuMTE5OCA0LjU1OTggNS42MjUgNS42ODc1bDEuMzc1LTMuOTA2MmMxLjU0NzMgMS4xNzExIDMuMzQ3OCAyLjAxOTggNS4zMTI1IDIuNDM3NWwtMS42ODc1IDMuNWMyLjY5OTQgMS4xMjAyIDUuNDMxMiAxLjAzNjUgOCAwLjA2MjVsLTEuNTkzOC0zLjQwNjJjMS45NzYyLTAuMjgxMTEgMy44MDItMC45OTAzOSA1LjQwNjItMi4wMzEybDEuMjE4OCAzLjM0MzhjMi41MDUyLTEuMTI3NyA0LjUwODQtMi45ODY2IDUuNjI1LTUuNjg3NWwtMy4yMTg4LTEuMTI1YzEuMTE3My0xLjU1MzkgMS45MzctMy4zMzE3IDIuMzEyNS01LjI4MTJsMyAxLjQzNzVjMC45NzM5Ny0yLjU2ODggMS4wODktNS4zMDA2LTAuMDMxMjUtOGwtMyAxLjQ2ODhjLTAuMzc5MzQtMi4wMTgtMS4xMzE1LTMuODI1OC0yLjE4NzUtNS4zNzVsMy4xMjUtMS4wOTM4Yy0xLjEyNzctMi41MDUyLTIuOTg2Ni00LjUwODQtNS42ODc1LTUuNjI1bC0xLjA5MzggMy4xNTYyYy0xLjU5Mi0xLjAxLTMuNDQ5Mi0xLjY2MS01LjQ2ODgtMS45MDYybDEuNTkzOC0zLjM3NWMtMS4yODQ0LTAuNDg2OTktMi41OTYtMC43NDY1OC0zLjkzNzUtMC43NXptMC40Mzc1IDUuOTY4OGMzLjc0MjcgMCA2LjkyMTcgMS40MTUyIDkuMTI1IDQuMDkzOC02LjgwMzIgNC4wNDM4LTIwLjEwNCAxMS45MTktMTkuODEyIDExLjc1LTAuNTY3MzEtMS4zOTY0LTAuNzUtMi43MTEzLTAuNzUtNC4zMTI1IDAtNi42NDE3IDQuNzk1Ni0xMS41MzEgMTEuNDM4LTExLjUzMXptMTAuNTk0IDYuNjU2MmMwLjczMDM0IDEuNTUxOSAwLjkwNjI1IDMuMDQ0OSAwLjkwNjI1IDQuODc1IDAgNi42NDE3LTQuODU4MSAxMS41LTExLjUgMTEuNS0zLjk3MzUgMC03LjA5NC0xLjcxOTUtOS4yODEyLTQuNjg3NXoiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQ2NTgyKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjbGluZWFyR3JhZGllbnQ2MTU0KSIgc3Ryb2tlLXdpZHRoPSIxcHgiLz4KICA8cGF0aCBpZD0icGF0aDY0NjciIGQ9Im0yNC41IDIuNWMtMTAuNDg4IDAtMTkgOC4yODgtMTkgMTguNXM4LjUxMiAxOC41IDE5IDE4LjUgMTktOC4yODggMTktMTguNS04LjUxMi0xOC41LTE5LTE4LjV6bTAgM2M4LjgzMiAwIDE2IDYuOTQ0IDE2IDE1LjVzLTcuMTY4IDE1LjUtMTYgMTUuNWMtOC44MzIgMC0xNi02Ljk0NC0xNi0xNS41czcuMTY4LTE1LjUgMTYtMTUuNXoiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQ2NDkzKSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9InVybCgjbGluZWFyR3JhZGllbnQ2NDk1KSIvPgogIDxwYXRoIGlkPSJwYXRoNjUxMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMiwtMikiIGQ9Im0yMi41IDUuNTA3OGMtOS45NTcgMC0xNy45OTIgNy44NDAzLTE3Ljk5MiAxNy40OTJzOC4wMzUyIDE3LjQ5MiAxNy45OTIgMTcuNDkyYzkuOTU3IDAgMTcuOTkyLTcuODQwMyAxNy45OTItMTcuNDkycy04LjAzNTItMTcuNDkyLTE3Ljk5Mi0xNy40OTJ6IiBmaWxsPSJub25lIiBvcGFjaXR5PSIuMzc4OTUiIHN0cm9rZT0iI2ZmZiIvPgogIDxlbGxpcHNlIGlkPSJwYXRoNjE5MiIgdHJhbnNmb3JtPSJtYXRyaXgoNC40NDQ0IDAgMCAzLjgwOTUgLTc0Ljg4OSAtNjMuNjQzKSIgY3g9IjIyLjI1IiBjeT0iMjIuMjE5IiByeD0iLjU2MjUiIHJ5PSIuNjU2MjUiIGZpbGw9IiNiOWJiYjYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjNTU1NzUzIiBzdHJva2Utd2lkdGg9Ii4yNDMwMyIvPgogIDxlbGxpcHNlIGlkPSJwYXRoNjYwMiIgdHJhbnNmb3JtPSJtYXRyaXgoMS43Nzc4IDAgMCAxLjUyMzggLTE1LjU1NiAtMTIuODU3KSIgY3g9IjIyLjI1IiBjeT0iMjIuMjE5IiByeD0iLjU2MjUiIHJ5PSIuNjU2MjUiIGZpbGw9IiNlZWVlZWMiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPgogIDxwYXRoIGlkPSJwYXRoNjY5NCIgZD0ibTkuMjM0NCAzN2gtMS42MTU1bC0wLjk0Nzc2IDFoMS43MTk5eiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudDY2OTYpIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz4KIDwvZz4KPC9zdmc+Cg=="
Hamster().generate()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment