├── cue.gif ├── cue.txt ├── input.go ├── model.go ├── styles.go ├── README.md ├── go.mod ├── main.go └── go.sum /cue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maaslalani/cue/HEAD/cue.gif -------------------------------------------------------------------------------- /cue.txt: -------------------------------------------------------------------------------- 1 | Press Spacebar: You can flip a card by pressing spacebar. Navigate with arrow keys or hl. 2 | Usage: Give `cue` a list of terms and definitions together separated by a colon. 3 | Cue: Study for your next exam on the command-line with **cue < cards.txt**. 4 | Markdown Support: *You* can even write in **markdown**. 5 | -------------------------------------------------------------------------------- /input.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "io/ioutil" 6 | "os" 7 | ) 8 | 9 | func readStdin() (string, error) { 10 | stat, err := os.Stdin.Stat() 11 | if err != nil { 12 | return "", err 13 | } 14 | 15 | if stat.Mode()&os.ModeNamedPipe == 0 && stat.Size() == 0 { 16 | return "", errors.New("no cards provided") 17 | } 18 | 19 | b, err := ioutil.ReadAll(os.Stdin) 20 | if err != nil { 21 | return "", err 22 | } 23 | 24 | return string(b), nil 25 | } 26 | -------------------------------------------------------------------------------- /model.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/charmbracelet/bubbles/paginator" 5 | "github.com/charmbracelet/lipgloss" 6 | ) 7 | 8 | func initialModel(cards []string) model { 9 | p := paginator.NewModel() 10 | p.Type = paginator.Dots 11 | p.PerPage = 1 12 | p.ActiveDot = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "235", Dark: "252"}).Render("•") 13 | p.InactiveDot = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "250", Dark: "238"}).Render("•") 14 | p.SetTotalPages(len(cards)) 15 | 16 | return model{ 17 | paginator: p, 18 | cards: cards, 19 | flipped: false, 20 | } 21 | } 22 | 23 | type model struct { 24 | cards []string 25 | paginator paginator.Model 26 | flipped bool 27 | } 28 | -------------------------------------------------------------------------------- /styles.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/charmbracelet/glamour" 5 | "github.com/charmbracelet/lipgloss" 6 | ) 7 | 8 | const minHeight = 12 9 | const width = 50 10 | const verticalPadding = minHeight/2 - 1 11 | const horizontalPadding = 2 12 | 13 | var renderer, _ = glamour.NewTermRenderer( 14 | glamour.WithAutoStyle(), 15 | glamour.WithWordWrap(width-horizontalPadding*2), 16 | ) 17 | 18 | var termStyle = lipgloss.NewStyle(). 19 | Border(lipgloss.RoundedBorder(), true). 20 | Align(lipgloss.Center). 21 | Height(minHeight). 22 | Width(width). 23 | Padding(verticalPadding, horizontalPadding) 24 | 25 | var definitionStyle = lipgloss.NewStyle(). 26 | Border(lipgloss.RoundedBorder(), true). 27 | Height(minHeight). 28 | Width(width). 29 | Padding(0, horizontalPadding) 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cue 2 | 3 | Cue cards in your terminal. 4 | 5 |

6 | Cue cards 7 |

8 | 9 | ### Usage 10 | 11 | Make some colon (`:`) separated cue cards in a plain text file. 12 | 13 | ``` 14 | Press Spacebar: You can flip a card by pressing spacebar. Navigate with arrow keys or hl. 15 | Usage: Give `cue` a list of terms and definitions together separated by a colon. 16 | Cue: Study for your next exam on the command-line with **cue < cards.txt**. 17 | Markdown Support: *You* can even write in **markdown**. 18 | ``` 19 | 20 | Then use `cue` to interact with your cue cards. 21 | 22 | ``` 23 | cue < cards.txt 24 | ``` 25 | 26 | ### Installation 27 | 28 | ``` 29 | go install github.com/maaslalani/cue@latest 30 | ``` 31 | 32 | ### Navigation 33 | 34 | Switch cue cards with: Right, Left, h, l. 35 | 36 | Use Space to toggle between the term and the definition. 37 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/maaslalani/cue 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/charmbracelet/bubbles v0.9.0 7 | github.com/charmbracelet/bubbletea v0.19.0 8 | github.com/charmbracelet/glamour v0.3.0 9 | github.com/charmbracelet/lipgloss v0.4.0 10 | ) 11 | 12 | require ( 13 | github.com/alecthomas/chroma v0.8.2 // indirect 14 | github.com/aymerick/douceur v0.2.0 // indirect 15 | github.com/containerd/console v1.0.2 // indirect 16 | github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect 17 | github.com/dlclark/regexp2 v1.2.0 // indirect 18 | github.com/gorilla/css v1.0.0 // indirect 19 | github.com/lucasb-eyer/go-colorful v1.2.0 // indirect 20 | github.com/mattn/go-isatty v0.0.13 // indirect 21 | github.com/mattn/go-runewidth v0.0.13 // indirect 22 | github.com/microcosm-cc/bluemonday v1.0.6 // indirect 23 | github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect 24 | github.com/muesli/reflow v0.3.0 // indirect 25 | github.com/muesli/termenv v0.9.0 // indirect 26 | github.com/olekukonko/tablewriter v0.0.5 // indirect 27 | github.com/pkg/errors v0.9.1 // indirect 28 | github.com/rivo/uniseg v0.2.0 // indirect 29 | github.com/yuin/goldmark v1.3.3 // indirect 30 | github.com/yuin/goldmark-emoji v1.0.1 // indirect 31 | golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c // indirect 32 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 // indirect 33 | golang.org/x/term v0.0.0-20210422114643-f5beecf764ed // indirect 34 | ) 35 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "strings" 7 | 8 | tea "github.com/charmbracelet/bubbletea" 9 | ) 10 | 11 | const delimiter = ":" 12 | 13 | // Init initializes the model 14 | func (m model) Init() tea.Cmd { return nil } 15 | 16 | // Update updates the model, mainly we update the pagination sub-model 17 | func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { 18 | var cmd tea.Cmd 19 | switch msg := msg.(type) { 20 | case tea.KeyMsg: 21 | switch msg.String() { 22 | case " ": 23 | m.flipped = !m.flipped 24 | case "q", "esc", "ctrl+c": 25 | return m, tea.Quit 26 | } 27 | } 28 | 29 | // Update the pagination sub-model. Keep track of the pages before and after 30 | // the update to see if the user changed pages 31 | oldPage := m.paginator.Page 32 | m.paginator, cmd = m.paginator.Update(msg) 33 | newPage := m.paginator.Page 34 | 35 | // If the user changed pages we want to unflip the cue card so that the 36 | // definition is not accidentally showing when they look at the next card 37 | if oldPage != newPage { 38 | m.flipped = false 39 | } 40 | 41 | return m, cmd 42 | } 43 | 44 | // View displays the cue cards based on the current state of the model 45 | func (m model) View() string { 46 | var b strings.Builder 47 | 48 | term, definition := m.parseCard() 49 | // Display the correct side of the cue card based on whether or not the user 50 | // has flipped the card 51 | if m.flipped { 52 | rendered, err := renderer.Render(definition) 53 | if err != nil { 54 | rendered = "Error: Could not render card definition for " + term 55 | } 56 | b.WriteString(definitionStyle.Render(rendered)) 57 | } else { 58 | b.WriteString(termStyle.Render(term)) 59 | } 60 | 61 | b.WriteString("\n\n") 62 | b.WriteString(" " + m.paginator.View()) 63 | return b.String() 64 | } 65 | 66 | func (m model) parseCard() (string, string) { 67 | raw := m.cards[m.paginator.Page] 68 | error_msg := fmt.Sprintf("Content of this card [%s] is invalid!", raw) 69 | const advice = "1. The card shouldn't be empty; 2. The card should have a ':'." 70 | if !strings.Contains(raw, ":") { 71 | return error_msg, advice 72 | } 73 | sides := strings.Split(raw, delimiter) 74 | term, definition := sides[0], sides[1] 75 | return term, definition 76 | } 77 | 78 | func main() { 79 | input, err := readStdin() 80 | if err != nil { 81 | log.Fatal(err) 82 | } 83 | 84 | cards := strings.Split(strings.TrimSuffix(input, "\n"), "\n") 85 | 86 | p := tea.NewProgram(initialModel(cards)) 87 | if err := p.Start(); err != nil { 88 | log.Fatal(err) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= 2 | github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= 3 | github.com/alecthomas/chroma v0.8.2 h1:x3zkuE2lUk/RIekyAJ3XRqSCP4zwWDfcw/YJCuCAACg= 4 | github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= 5 | github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= 6 | github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= 7 | github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= 8 | github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= 9 | github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= 10 | github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= 11 | github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= 12 | github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= 13 | github.com/charmbracelet/bubbles v0.9.0 h1:lqJ8FXwoLceQF2J0A+dWo1Cuu1dNyjbW4Opgdi2vkhw= 14 | github.com/charmbracelet/bubbles v0.9.0/go.mod h1:NWT/c+0rYEnYChz5qCyX4Lj6fDw9gGToh9EFJPajghU= 15 | github.com/charmbracelet/bubbletea v0.14.1/go.mod h1:b5lOf5mLjMg1tRn1HVla54guZB+jvsyV0yYAQja95zE= 16 | github.com/charmbracelet/bubbletea v0.19.0 h1:1gz4rbxl3qZik/oP8QW2vUtul2gO8RDDzmoLGERpTQc= 17 | github.com/charmbracelet/bubbletea v0.19.0/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFATM4Ckb/ql1rBl3KA= 18 | github.com/charmbracelet/glamour v0.3.0 h1:3H+ZrKlSg8s+WU6V7eF2eRVYt8lCueffbi7r2+ffGkc= 19 | github.com/charmbracelet/glamour v0.3.0/go.mod h1:TzF0koPZhqq0YVBNL100cPHznAAjVj7fksX2RInwjGw= 20 | github.com/charmbracelet/harmonica v0.1.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= 21 | github.com/charmbracelet/lipgloss v0.3.0/go.mod h1:VkhdBS2eNAmRkTwRKLJCFhCOVkjntMusBDxv7TXahuk= 22 | github.com/charmbracelet/lipgloss v0.4.0 h1:768h64EFkGUr8V5yAKV7/Ta0NiVceiPaV+PphaW1K9g= 23 | github.com/charmbracelet/lipgloss v0.4.0/go.mod h1:vmdkHvce7UzX6xkyf4cca8WlwdQ5RQr8fzta+xl7BOM= 24 | github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= 25 | github.com/containerd/console v1.0.2 h1:Pi6D+aZXM+oUw1czuKgH5IJ+y0jhYcwBJfx5/Ghn9dE= 26 | github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= 27 | github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= 28 | github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= 29 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 30 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 31 | github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= 32 | github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= 33 | github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= 34 | github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= 35 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 36 | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= 37 | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= 38 | github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 39 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 40 | github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= 41 | github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 42 | github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 43 | github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= 44 | github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= 45 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= 46 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 47 | github.com/microcosm-cc/bluemonday v1.0.6 h1:ZOvqHKtnx0fUpnbQm3m3zKFWE+DRC+XB1onh8JoEObE= 48 | github.com/microcosm-cc/bluemonday v1.0.6/go.mod h1:HOT/6NaBlR0f9XlxD3zolN6Z3N8Lp4pvhp+jLS5ihnI= 49 | github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= 50 | github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= 51 | github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= 52 | github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= 53 | github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= 54 | github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= 55 | github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= 56 | github.com/muesli/termenv v0.9.0 h1:wnbOaGz+LUR3jNT0zOzinPnyDaCZUQRZj9GxK8eRVl8= 57 | github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw= 58 | github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= 59 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 60 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 61 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 62 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 63 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 64 | github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 65 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= 66 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 67 | github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= 68 | github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= 69 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 70 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 71 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 72 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 73 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 74 | github.com/yuin/goldmark v1.3.3 h1:37BdQwPx8VOSic8eDSWee6QL9mRpZRm9VJp/QugNrW0= 75 | github.com/yuin/goldmark v1.3.3/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 76 | github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= 77 | github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= 78 | golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c h1:KHUzaHIpjWVlVVNh65G3hhuj3KB1HnjY6Cq5cTvRQT8= 79 | golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 80 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 81 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 82 | golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 83 | golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 84 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 85 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 86 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 87 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c= 88 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 89 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 90 | golang.org/x/term v0.0.0-20210422114643-f5beecf764ed h1:Ei4bQjjpYUsS4efOUz+5Nz++IVkHk87n2zBA0NxBWc0= 91 | golang.org/x/term v0.0.0-20210422114643-f5beecf764ed/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 92 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 93 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 94 | --------------------------------------------------------------------------------