├── 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 |
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 |
--------------------------------------------------------------------------------