From 093a5632c7ae2dd76e2312e957bfd76159c36b7b Mon Sep 17 00:00:00 2001 From: Arsen Musayelyan Date: Thu, 5 May 2022 14:00:49 -0700 Subject: [PATCH] Rewrite itgui and add new screenshots --- cmd/itgui/error.go | 10 +- cmd/itgui/firmware.go | 163 ++++++++++ cmd/itgui/fs.go | 360 +++++++++++++++++++++ cmd/itgui/info.go | 138 +++----- cmd/itgui/loading.go | 21 ++ cmd/itgui/main.go | 60 ++-- cmd/itgui/motion.go | 138 +++----- cmd/itgui/notify.go | 29 +- cmd/itgui/progress.go | 50 +++ cmd/itgui/screenshots/firmware.png | Bin 0 -> 14879 bytes cmd/itgui/screenshots/fs.png | Bin 0 -> 18022 bytes cmd/itgui/screenshots/info.png | Bin 0 -> 30683 bytes cmd/itgui/screenshots/mkdir.png | Bin 0 -> 26193 bytes cmd/itgui/screenshots/motion.png | Bin 0 -> 20384 bytes cmd/itgui/screenshots/notify.png | Bin 0 -> 11912 bytes cmd/itgui/screenshots/progress.png | Bin 0 -> 16096 bytes cmd/itgui/screenshots/time.png | Bin 0 -> 16201 bytes cmd/itgui/time.go | 70 ++-- cmd/itgui/titledText.go | 35 ++ cmd/itgui/upgrade.go | 181 ----------- go.mod | 27 +- go.sum | 500 +++++++++++++++++++++++++++-- 22 files changed, 1307 insertions(+), 475 deletions(-) create mode 100644 cmd/itgui/firmware.go create mode 100644 cmd/itgui/fs.go create mode 100644 cmd/itgui/loading.go create mode 100644 cmd/itgui/progress.go create mode 100644 cmd/itgui/screenshots/firmware.png create mode 100644 cmd/itgui/screenshots/fs.png create mode 100644 cmd/itgui/screenshots/info.png create mode 100644 cmd/itgui/screenshots/mkdir.png create mode 100644 cmd/itgui/screenshots/motion.png create mode 100644 cmd/itgui/screenshots/notify.png create mode 100644 cmd/itgui/screenshots/progress.png create mode 100644 cmd/itgui/screenshots/time.png create mode 100644 cmd/itgui/titledText.go delete mode 100644 cmd/itgui/upgrade.go diff --git a/cmd/itgui/error.go b/cmd/itgui/error.go index 8cdd4db..4d70a4b 100644 --- a/cmd/itgui/error.go +++ b/cmd/itgui/error.go @@ -28,10 +28,15 @@ func guiErr(err error, msg string, fatal bool, parent fyne.Window) { ) if err != nil { // Create new label containing error text - errLbl := widget.NewLabel(err.Error()) + errEntry := widget.NewEntry() + errEntry.SetText(err.Error()) + // If text changed, change it back + errEntry.OnChanged = func(string) { + errEntry.SetText(err.Error()) + } // Create new dropdown containing error label content.Add(widget.NewAccordion( - widget.NewAccordionItem("More Details", errLbl), + widget.NewAccordionItem("More Details", errEntry), )) } if fatal { @@ -49,5 +54,4 @@ func guiErr(err error, msg string, fatal bool, parent fyne.Window) { // Show error dialog dialog.NewCustom("Error", "Ok", content, parent).Show() } - } diff --git a/cmd/itgui/firmware.go b/cmd/itgui/firmware.go new file mode 100644 index 0000000..b3f9ff1 --- /dev/null +++ b/cmd/itgui/firmware.go @@ -0,0 +1,163 @@ +package main + +import ( + "context" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/dialog" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/widget" + "go.arsenm.dev/itd/api" +) + +func firmwareTab(ctx context.Context, client *api.Client, w fyne.Window) fyne.CanvasObject { + // Create select to chose between archive and files upgrade + typeSelect := widget.NewSelect([]string{"Archive", "Files"}, nil) + typeSelect.PlaceHolder = "Upgrade Type" + + // Create map to store files + files := map[string]string{} + + // Create and disable start button + startBtn := widget.NewButton("Start", nil) + startBtn.Disable() + + // Create new file open dialog for archive + archiveDlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) { + if err != nil || uc == nil { + return + } + defer uc.Close() + // Set archive path in map + files[".zip"] = uc.URI().Path() + // Enable start button + startBtn.Enable() + }, w) + // Only allow .zip files + archiveDlg.SetFilter(storage.NewExtensionFileFilter([]string{".zip"})) + // Create button to show dialog + archiveBtn := widget.NewButton("Select Archive (.zip)", archiveDlg.Show) + + // Create new file open dialog for firmware image + imageDlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) { + if err != nil || uc == nil { + return + } + defer uc.Close() + + // Set firmware image path in map + files[".bin"] = uc.URI().Path() + + // If the init packet was already selected + _, datOk := files[".dat"] + if datOk { + // Enable start button + startBtn.Enable() + } + }, w) + // Only allow .bin files + imageDlg.SetFilter(storage.NewExtensionFileFilter([]string{".bin"})) + // Create button to show dialog + imageBtn := widget.NewButton("Select Firmware (.bin)", imageDlg.Show) + + // Create new file open dialog for init packet + initDlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) { + if err != nil || uc == nil { + return + } + defer uc.Close() + + // Set init packet path in map + files[".dat"] = uc.URI().Path() + + // If the firmware image was already selected + _, binOk := files[".bin"] + if binOk { + // Enable start button + startBtn.Enable() + } + }, w) + // Only allow .dat files + initDlg.SetFilter(storage.NewExtensionFileFilter([]string{".dat"})) + // Create button to show dialog + initBtn := widget.NewButton("Select Init Packet (.dat)", initDlg.Show) + + var upgType api.UpgradeType = 255 + // When upgrade type changes + typeSelect.OnChanged = func(s string) { + // Delete all files from map + delete(files, ".bin") + delete(files, ".dat") + delete(files, ".zip") + // Hide all dialog buttons + imageBtn.Hide() + initBtn.Hide() + archiveBtn.Hide() + // Disable start button + startBtn.Disable() + + switch s { + case "Files": + // Set file upgrade type + upgType = api.UpgradeTypeFiles + // Show firmware image and init packet buttons + imageBtn.Show() + initBtn.Show() + case "Archive": + // Set archive upgrade type + upgType = api.UpgradeTypeArchive + // Show archive button + archiveBtn.Show() + } + } + // Select archive by default + typeSelect.SetSelectedIndex(0) + + // When start button pressed + startBtn.OnTapped = func() { + var args []string + // Append the appropriate files for upgrade type + switch upgType { + case api.UpgradeTypeArchive: + args = append(args, files[".zip"]) + case api.UpgradeTypeFiles: + args = append(args, files[".dat"], files[".bin"]) + } + + // If args are nil (invalid upgrade type) + if args == nil { + return + } + + // Create new progress dialog + progress := newProgress(w) + // Start firmware upgrade + progressCh, err := client.FirmwareUpgrade(ctx, upgType, args...) + if err != nil { + guiErr(err, "Error performing firmware upgrade", false, w) + return + } + // Show progress dialog + progress.Show() + // For every progress event + for progressEvt := range progressCh { + // Set progress bar values + progress.SetTotal(float64(progressEvt.Total)) + progress.SetValue(float64(progressEvt.Sent)) + } + // Hide progress dialog + progress.Hide() + } + + return container.NewVBox( + layout.NewSpacer(), + typeSelect, + archiveBtn, + imageBtn, + initBtn, + startBtn, + layout.NewSpacer(), + ) +} diff --git a/cmd/itgui/fs.go b/cmd/itgui/fs.go new file mode 100644 index 0000000..d24da5a --- /dev/null +++ b/cmd/itgui/fs.go @@ -0,0 +1,360 @@ +package main + +import ( + "context" + "path/filepath" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/data/binding" + "fyne.io/fyne/v2/dialog" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" + "go.arsenm.dev/itd/api" +) + +func fsTab(ctx context.Context, client *api.Client, w fyne.Window, opened chan struct{}) fyne.CanvasObject { + c := container.NewVBox() + + // Create new binding to store current directory + cwdData := binding.NewString() + cwdData.Set("/") + + // Create new list binding to store fs listing entries + lsData := binding.NewUntypedList() + + // This goroutine waits until the fs tab is opened to + // request the listing from the watch + go func() { + // Wait for opened signal + <-opened + + // Show loading pop up + loading := newLoadingPopUp(w) + loading.Show() + + // Read root directory + ls, err := client.ReadDir(ctx, "/") + if err != nil { + guiErr(err, "Error reading directory", false, w) + return + } + // Set ls binding + lsData.Set(lsToAny(ls)) + + // Hide loading pop up + loading.Hide() + }() + + toolbar := widget.NewToolbar( + widget.NewToolbarAction( + theme.ViewRefreshIcon(), + func() { + refresh(ctx, cwdData, lsData, client, w, c) + }, + ), + widget.NewToolbarAction( + theme.UploadIcon(), + func() { + // Create open dialog for file that will be uploaded + dlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) { + if err != nil || uc == nil { + return + } + // Get filepath and close + localPath := uc.URI().Path() + uc.Close() + + // Create new entry to store filepath + filenameEntry := widget.NewEntry() + // Set entry text to the file name of the selected file + filenameEntry.SetText(filepath.Base(localPath)) + // Create new dialog asking for the filename of the file to be stored on the watch + uploadDlg := dialog.NewForm("Upload", "Upload", "Cancel", []*widget.FormItem{ + widget.NewFormItem("Filename", filenameEntry), + }, func(ok bool) { + if !ok { + return + } + + // Get current directory + cwd, _ := cwdData.Get() + // Get remote path by joining current directory with filename + remotePath := filepath.Join(cwd, filenameEntry.Text) + + // Create new progress dialog + progressDlg := newProgress(w) + progressDlg.Show() + + // Upload file + progressCh, err := client.Upload(ctx, remotePath, localPath) + if err != nil { + guiErr(err, "Error uploading file", false, w) + return + } + + for progressEvt := range progressCh { + progressDlg.SetTotal(float64(progressEvt.Total)) + progressDlg.SetValue(float64(progressEvt.Sent)) + if progressEvt.Sent == progressEvt.Total { + break + } + } + + // Close progress dialog + progressDlg.Hide() + + // Add file to listing (avoids full refresh) + lsData.Append(api.FileInfo{ + IsDir: false, + Name: filepath.Base(remotePath), + }) + }, w) + uploadDlg.Show() + }, w) + dlg.Show() + + }, + ), + widget.NewToolbarAction( + theme.FolderNewIcon(), + func() { + // Create new entry for filename + filenameEntry := widget.NewEntry() + // Create new dialog to ask for the filename + mkdirDialog := dialog.NewForm("Make Directory", "Create", "Cancel", []*widget.FormItem{ + widget.NewFormItem("Filename", filenameEntry), + }, func(ok bool) { + if !ok { + return + } + + // Get current directory + cwd, _ := cwdData.Get() + // Get remote path by joining current directory and filename + remotePath := filepath.Join(cwd, filenameEntry.Text) + + // Make directory + err := client.Mkdir(ctx, remotePath) + if err != nil { + guiErr(err, "Error creating directory", false, w) + return + } + + // Add directory to listing (avoids full refresh) + lsData.Append(api.FileInfo{ + IsDir: true, + Name: filepath.Base(remotePath), + }) + }, w) + mkdirDialog.Show() + }, + ), + ) + + // Add listener to listing data to create the new items on the GUI + // whenever the listing changes + lsData.AddListener(binding.NewDataListener(func() { + c.Objects = makeItems(ctx, client, lsData, cwdData, w, c) + c.Refresh() + })) + + return container.NewBorder( + nil, + toolbar, + nil, + nil, + container.NewVScroll(c), + ) +} + +// makeItems creates GUI objects from listing data +func makeItems( + ctx context.Context, + client *api.Client, + lsData binding.UntypedList, + cwdData binding.String, + w fyne.Window, + c *fyne.Container, +) []fyne.CanvasObject { + // Get listing data + ls, _ := lsData.Get() + + // Create output slice with dame length as listing + out := make([]fyne.CanvasObject, len(ls)) + for index, val := range ls { + // Assert value as file info + item := val.(api.FileInfo) + + var icon fyne.Resource + // Decide which icon to use + if item.IsDir { + if item.Name == ".." { + icon = theme.NavigateBackIcon() + } else { + icon = theme.FolderIcon() + } + } else { + icon = theme.FileIcon() + } + + // Create new button with the decided icon and the item name + btn := widget.NewButtonWithIcon(item.Name, icon, nil) + // Align left + btn.Alignment = widget.ButtonAlignLeading + // Decide which callback function to use + if item.IsDir { + btn.OnTapped = func() { + // Get current directory + cwd, _ := cwdData.Get() + // Join current directory with item name + cwd = filepath.Join(cwd, item.Name) + // Set new current directory + cwdData.Set(cwd) + // Refresh GUI to display new directory + refresh(ctx, cwdData, lsData, client, w, c) + } + } else { + btn.OnTapped = func() { + // Get current directory + cwd, _ := cwdData.Get() + // Join current directory with item name + remotePath := filepath.Join(cwd, item.Name) + // Create new save dialog + dlg := dialog.NewFileSave(func(uc fyne.URIWriteCloser, err error) { + if err != nil || uc == nil { + return + } + // Get path of selected file + localPath := uc.URI().Path() + // Close WriteCloser (it's not needed) + uc.Close() + + // Create new progress dialog + progressDlg := newProgress(w) + progressDlg.Show() + + // Download file + progressCh, err := client.Download(ctx, localPath, remotePath) + if err != nil { + guiErr(err, "Error downloading file", false, w) + return + } + + // For every progress event + for progressEvt := range progressCh { + progressDlg.SetTotal(float64(progressEvt.Total)) + progressDlg.SetValue(float64(progressEvt.Sent)) + } + + // Close progress dialog + progressDlg.Hide() + }, w) + // Set filename to the item name + dlg.SetFileName(item.Name) + dlg.Show() + } + } + + if item.Name == ".." { + out[index] = btn + continue + } + + moveBtn := widget.NewButtonWithIcon("", theme.NavigateNextIcon(), func() { + moveEntry := widget.NewEntry() + dlg := dialog.NewForm("Move", "Move", "Cancel", []*widget.FormItem{ + widget.NewFormItem("New Path", moveEntry), + }, func(ok bool) { + if !ok { + return + } + + // Get current directory + cwd, _ := cwdData.Get() + // Join current directory with item name + oldPath := filepath.Join(cwd, item.Name) + + // Rename file + err := client.Rename(ctx, oldPath, moveEntry.Text) + if err != nil { + guiErr(err, "Error renaming file", false, w) + return + } + + // Refresh GUI + refresh(ctx, cwdData, lsData, client, w, c) + }, w) + dlg.Show() + }) + + removeBtn := widget.NewButtonWithIcon("", theme.DeleteIcon(), func() { + // Get current directory + cwd, _ := cwdData.Get() + // Join current directory with item name + path := filepath.Join(cwd, item.Name) + + // Remove file + err := client.Remove(ctx, path) + if err != nil { + guiErr(err, "Error removing file", false, w) + return + } + + // Refresh GUI + refresh(ctx, cwdData, lsData, client, w, c) + }) + + // Add button to GUI component list + out[index] = container.NewBorder( + nil, + nil, + nil, + container.NewHBox(moveBtn, removeBtn), + btn, + ) + } + return out +} + +func refresh( + ctx context.Context, + cwdData binding.String, + lsData binding.UntypedList, + client *api.Client, + w fyne.Window, + c *fyne.Container, +) { + // Create and show new loading pop up + loading := newLoadingPopUp(w) + loading.Show() + // Close pop up at the end of the function + defer loading.Hide() + + // Get current directory + cwd, _ := cwdData.Get() + // Read directory + ls, err := client.ReadDir(ctx, cwd) + if err != nil { + guiErr(err, "Error reading directory", false, w) + return + } + // Set new listing data + lsData.Set(lsToAny(ls)) + // Create new GUI objects + c.Objects = makeItems(ctx, client, lsData, cwdData, w, c) + // Refresh GUI + c.Refresh() +} + +func lsToAny(ls []api.FileInfo) []interface{} { + out := make([]interface{}, len(ls)-1) + for i, e := range ls { + // Skip first element as it is always "." + if i == 0 { + continue + } + out[i-1] = e + } + return out +} diff --git a/cmd/itgui/info.go b/cmd/itgui/info.go index 9c89f7e..ab92528 100644 --- a/cmd/itgui/info.go +++ b/cmd/itgui/info.go @@ -3,122 +3,84 @@ package main import ( "context" "fmt" - "image/color" "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" "go.arsenm.dev/itd/api" ) -func infoTab(parent fyne.Window, client *api.Client) *fyne.Container { - infoLayout := container.NewVBox( - // Add rectangle for a bit of padding - canvas.NewRectangle(color.Transparent), - ) - - // Create label for heart rate - heartRateLbl := newText("0 BPM", 24) - // Creae container to store heart rate section - heartRateSect := container.NewVBox( - newText("Heart Rate", 12), - heartRateLbl, - canvas.NewLine(theme.ShadowColor()), - ) - infoLayout.Add(heartRateSect) - - ctx, cancel := context.WithCancel(context.Background()) - onClose = append(onClose, cancel) +func infoTab(ctx context.Context, client *api.Client, w fyne.Window) fyne.CanvasObject { + c := container.NewVBox() + // Create titled text for heart rate + heartRateText := newTitledText("Heart Rate", "0 BPM") + c.Add(heartRateText) + // Watch heart rate heartRateCh, err := client.WatchHeartRate(ctx) if err != nil { - guiErr(err, "Error getting heart rate channel", true, parent) + guiErr(err, "Error watching heart rate", true, w) } go func() { + // For every heart rate sample for heartRate := range heartRateCh { - // Change text of heart rate label - heartRateLbl.Text = fmt.Sprintf("%d BPM", heartRate) - // Refresh label - heartRateLbl.Refresh() + // Set body of titled text + heartRateText.SetBody(fmt.Sprintf("%d BPM", heartRate)) } }() - // Create label for heart rate - stepCountLbl := newText("0 Steps", 24) - // Creae container to store heart rate section - stepCountSect := container.NewVBox( - newText("Step Count", 12), - stepCountLbl, - canvas.NewLine(theme.ShadowColor()), - ) - infoLayout.Add(stepCountSect) - - stepCountCh, err := client.WatchStepCount(ctx) - if err != nil { - guiErr(err, "Error getting step count channel", true, parent) - } - go func() { - for stepCount := range stepCountCh { - // Change text of heart rate label - stepCountLbl.Text = fmt.Sprintf("%d Steps", stepCount) - // Refresh label - stepCountLbl.Refresh() - } - }() - - // Create label for battery level - battLevelLbl := newText("0%", 24) - // Create container to store battery level section - battLevel := container.NewVBox( - newText("Battery Level", 12), - battLevelLbl, - canvas.NewLine(theme.ShadowColor()), - ) - infoLayout.Add(battLevel) - + // Create titled text for battery level + battLevelText := newTitledText("Battery Level", "0%") + c.Add(battLevelText) + // Watch battery level battLevelCh, err := client.WatchBatteryLevel(ctx) if err != nil { - guiErr(err, "Error getting battery level channel", true, parent) + guiErr(err, "Error watching battery level", true, w) } go func() { + // For every battery level sample for battLevel := range battLevelCh { - // Change text of battery level label - battLevelLbl.Text = fmt.Sprintf("%d%%", battLevel) - // Refresh label - battLevelLbl.Refresh() + // Set body of titled text + battLevelText.SetBody(fmt.Sprintf("%d%%", battLevel)) } }() - fwVerString, err := client.Version(context.Background()) + // Create titled text for step count + stepCountText := newTitledText("Step Count", "0 Steps") + c.Add(stepCountText) + // Watch step count + stepCountCh, err := client.WatchStepCount(ctx) if err != nil { - guiErr(err, "Error getting firmware string", true, parent) + guiErr(err, "Error watching step count", true, w) } + go func() { + // For every step count sample + for stepCount := range stepCountCh { + // Set body of titled text + stepCountText.SetBody(fmt.Sprintf("%d Steps", stepCount)) + } + }() - fwVer := container.NewVBox( - newText("Firmware Version", 12), - newText(fwVerString, 24), - canvas.NewLine(theme.ShadowColor()), - ) - infoLayout.Add(fwVer) - - btAddrString, err := client.Address(context.Background()) + // Create new titled text for address + addressText := newTitledText("Address", "") + c.Add(addressText) + // Get address + address, err := client.Address(ctx) if err != nil { - panic(err) + guiErr(err, "Error getting address", true, w) } + // Set body of titled text + addressText.SetBody(address) - btAddr := container.NewVBox( - newText("Bluetooth Address", 12), - newText(btAddrString, 24), - canvas.NewLine(theme.ShadowColor()), - ) - infoLayout.Add(btAddr) + // Create new titled text for version + versionText := newTitledText("Version", "") + c.Add(versionText) + // Get version + version, err := client.Version(ctx) + if err != nil { + guiErr(err, "Error getting version", true, w) + } + // Set body of titled text + versionText.SetBody(version) - return infoLayout -} - -func newText(t string, size float32) *canvas.Text { - text := canvas.NewText(t, theme.ForegroundColor()) - text.TextSize = size - return text + return container.NewVScroll(c) } diff --git a/cmd/itgui/loading.go b/cmd/itgui/loading.go new file mode 100644 index 0000000..3b0836f --- /dev/null +++ b/cmd/itgui/loading.go @@ -0,0 +1,21 @@ +package main + +import ( + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" +) + +func newLoadingPopUp(w fyne.Window) *widget.PopUp { + pb := widget.NewProgressBarInfinite() + rect := canvas.NewRectangle(color.Transparent) + rect.SetMinSize(fyne.NewSize(200, 0)) + + return widget.NewModalPopUp( + container.NewMax(rect, pb), + w.Canvas(), + ) +} diff --git a/cmd/itgui/main.go b/cmd/itgui/main.go index 914a3b1..265e76a 100644 --- a/cmd/itgui/main.go +++ b/cmd/itgui/main.go @@ -1,43 +1,55 @@ package main import ( + "context" + "sync" + "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "go.arsenm.dev/itd/api" ) -var onClose []func() - func main() { - // Create new app a := app.New() - // Create new window with title "itgui" - window := a.NewWindow("itgui") - window.SetOnClosed(func() { - for _, closeFn := range onClose { - closeFn() - } - }) + w := a.NewWindow("itgui") + // Create new context for use with the API client + ctx, cancel := context.WithCancel(context.Background()) + + // Connect to ITD API client, err := api.New(api.DefaultAddr) if err != nil { - guiErr(err, "Error connecting to itd", true, window) + guiErr(err, "Error connecting to ITD", true, w) } - onClose = append(onClose, func() { - client.Close() - }) - // Create new app tabs container + // Create channel to signal that the fs tab has been opened + fsOpened := make(chan struct{}) + fsOnce := &sync.Once{} + + // Create app tabs tabs := container.NewAppTabs( - container.NewTabItem("Info", infoTab(window, client)), - container.NewTabItem("Motion", motionTab(window, client)), - container.NewTabItem("Notify", notifyTab(window, client)), - container.NewTabItem("Set Time", timeTab(window, client)), - container.NewTabItem("Upgrade", upgradeTab(window, client)), + container.NewTabItem("Info", infoTab(ctx, client, w)), + container.NewTabItem("Motion", motionTab(ctx, client, w)), + container.NewTabItem("Notify", notifyTab(ctx, client, w)), + container.NewTabItem("FS", fsTab(ctx, client, w, fsOpened)), + container.NewTabItem("Time", timeTab(ctx, client, w)), + container.NewTabItem("Firmware", firmwareTab(ctx, client, w)), ) - // Set tabs as window content - window.SetContent(tabs) - // Show window and run app - window.ShowAndRun() + // When a tab is selected + tabs.OnSelected = func(ti *container.TabItem) { + // If the tab's name is FS + if ti.Text == "FS" { + // Signal fsOpened only once + fsOnce.Do(func() { + fsOpened <- struct{}{} + }) + } + } + + // Cancel context on close + w.SetOnClosed(cancel) + // Set content and show window + w.SetContent(tabs) + w.ShowAndRun() } diff --git a/cmd/itgui/motion.go b/cmd/itgui/motion.go index d175a06..ff1cd3d 100644 --- a/cmd/itgui/motion.go +++ b/cmd/itgui/motion.go @@ -2,109 +2,61 @@ package main import ( "context" - "image/color" - "strconv" + "fmt" "fyne.io/fyne/v2" - "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "go.arsenm.dev/itd/api" ) -func motionTab(parent fyne.Window, client *api.Client) *fyne.Container { - // Create label for heart rate - xCoordLbl := newText("0", 24) - // Creae container to store heart rate section - xCoordSect := container.NewVBox( - newText("X Coordinate", 12), - xCoordLbl, - canvas.NewLine(theme.ShadowColor()), - ) +func motionTab(ctx context.Context, client *api.Client, w fyne.Window) fyne.CanvasObject { + // Create titledText for each coordinate + xText := newTitledText("X Coordinate", "0") + yText := newTitledText("Y Coordinate", "0") + zText := newTitledText("Z Coordinate", "0") - // Create label for heart rate - yCoordLbl := newText("0", 24) - // Creae container to store heart rate section - yCoordSect := container.NewVBox( - newText("Y Coordinate", 12), - yCoordLbl, - canvas.NewLine(theme.ShadowColor()), - ) - // Create label for heart rate - zCoordLbl := newText("0", 24) - // Creae container to store heart rate section - zCoordSect := container.NewVBox( - newText("Z Coordinate", 12), - zCoordLbl, - canvas.NewLine(theme.ShadowColor()), - ) + var ctxCancel func() - // Create variable to keep track of whether motion started - started := false - - // Create button to stop motion - stopBtn := widget.NewButton("Stop", nil) - - ctx, cancel := context.WithCancel(context.Background()) - onClose = append(onClose, cancel) - - // Create button to start motion - startBtn := widget.NewButton("Start", func() { - // if motion is started - if started { - // Do nothing - return - } - // Set motion started - started = true - // Watch motion values - motionCh, err := client.WatchMotion(ctx) - if err != nil { - guiErr(err, "Error getting heart rate channel", true, parent) - } - // Create done channel - done := make(chan struct{}, 1) - go func() { - for { - select { - case <-done: - return - case motion := <-motionCh: - // Set labels to new values - xCoordLbl.Text = strconv.Itoa(int(motion.X)) - yCoordLbl.Text = strconv.Itoa(int(motion.Y)) - zCoordLbl.Text = strconv.Itoa(int(motion.Z)) - // Refresh labels to display new values - xCoordLbl.Refresh() - yCoordLbl.Refresh() - zCoordLbl.Refresh() - } + // Create start button + toggleBtn := widget.NewButton("Start", nil) + // Set button's on tapped callback + toggleBtn.OnTapped = func() { + switch toggleBtn.Text { + case "Start": + // Create new context for motion + motionCtx, cancel := context.WithCancel(ctx) + // Set ctxCancel to function so that stop button can run it + ctxCancel = cancel + // Watch motion + motionCh, err := client.WatchMotion(motionCtx) + if err != nil { + guiErr(err, "Error watching motion", false, w) + return } - }() - // Create stop function - stopBtn.OnTapped = func() { - done <- struct{}{} - started = false - cancel() + go func() { + // For every motion event + for motion := range motionCh { + // Set coordinates + xText.SetBody(fmt.Sprint(motion.X)) + yText.SetBody(fmt.Sprint(motion.Y)) + zText.SetBody(fmt.Sprint(motion.Z)) + } + }() + // Set button text to "Stop" + toggleBtn.SetText("Stop") + case "Stop": + // Cancel motion context + ctxCancel() + // Set button text to "Start" + toggleBtn.SetText("Start") } + } - }) - // Run stop button function on close if possible - onClose = append(onClose, func() { - if stopBtn.OnTapped != nil { - stopBtn.OnTapped() - } - }) - - // Return new container containing all elements - return container.NewVBox( - // Add rectangle for a bit of padding - canvas.NewRectangle(color.Transparent), - startBtn, - stopBtn, - xCoordSect, - yCoordSect, - zCoordSect, - ) + return container.NewVScroll(container.NewVBox( + toggleBtn, + xText, + yText, + zText, + )) } diff --git a/cmd/itgui/notify.go b/cmd/itgui/notify.go index d6dedba..f4b5d4b 100644 --- a/cmd/itgui/notify.go +++ b/cmd/itgui/notify.go @@ -10,30 +10,31 @@ import ( "go.arsenm.dev/itd/api" ) -func notifyTab(parent fyne.Window, client *api.Client) *fyne.Container { - // Create new entry for notification title +func notifyTab(ctx context.Context, client *api.Client, w fyne.Window) fyne.CanvasObject { + c := container.NewVBox() + c.Add(layout.NewSpacer()) + + // Create new entry for title titleEntry := widget.NewEntry() titleEntry.SetPlaceHolder("Title") + c.Add(titleEntry) - // Create multiline entry for notification body + // Create new multiline entry for body bodyEntry := widget.NewMultiLineEntry() bodyEntry.SetPlaceHolder("Body") + c.Add(bodyEntry) - // Create new button to send notification + // Create new send button sendBtn := widget.NewButton("Send", func() { - err := client.Notify(context.Background(), titleEntry.Text, bodyEntry.Text) + // Send notification + err := client.Notify(ctx, titleEntry.Text, bodyEntry.Text) if err != nil { - guiErr(err, "Error sending notification", false, parent) + guiErr(err, "Error sending notification", false, w) return } }) + c.Add(sendBtn) - // Return new container containing all elements - return container.NewVBox( - layout.NewSpacer(), - titleEntry, - bodyEntry, - sendBtn, - layout.NewSpacer(), - ) + c.Add(layout.NewSpacer()) + return container.NewVScroll(c) } diff --git a/cmd/itgui/progress.go b/cmd/itgui/progress.go new file mode 100644 index 0000000..c0261fd --- /dev/null +++ b/cmd/itgui/progress.go @@ -0,0 +1,50 @@ +package main + +import ( + "fmt" + "image/color" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" +) + +type progress struct { + lbl *widget.Label + pb *widget.ProgressBar + *widget.PopUp +} + +func newProgress(w fyne.Window) progress { + out := progress{} + + // Create label to show how many bytes transfered and center it + out.lbl = widget.NewLabel("0 / 0 B") + out.lbl.Alignment = fyne.TextAlignCenter + + // Create new progress bar + out.pb = widget.NewProgressBar() + + // Create new rectangle to set the size of the popup + sizeRect := canvas.NewRectangle(color.Transparent) + sizeRect.SetMinSize(fyne.NewSize(300, 50)) + + // Create vbox for label and progress bar + l := container.NewVBox(out.lbl, out.pb) + // Create popup + out.PopUp = widget.NewModalPopUp(container.NewMax(l, sizeRect), w.Canvas()) + + return out +} + +func (p progress) SetTotal(v float64) { + p.pb.Max = v + p.pb.Refresh() + p.lbl.SetText(fmt.Sprintf("%.0f / %.0f B", p.pb.Value, v)) +} + +func (p progress) SetValue(v float64) { + p.pb.SetValue(v) + p.lbl.SetText(fmt.Sprintf("%.0f / %.0f B", v, p.pb.Max)) +} diff --git a/cmd/itgui/screenshots/firmware.png b/cmd/itgui/screenshots/firmware.png new file mode 100644 index 0000000000000000000000000000000000000000..655922f2820b6abb0e747a3239717b252e599c9f GIT binary patch literal 14879 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 RgdG$Lt#$cgiRNE-{tFIr+zkK# literal 0 HcmV?d00001 diff --git a/cmd/itgui/screenshots/fs.png b/cmd/itgui/screenshots/fs.png new file mode 100644 index 0000000000000000000000000000000000000000..023d622d61b18706fe2a668ab4696786c23f7394 GIT binary patch literal 18022 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 Z|F&zZV?g=n0C{)HS@|=`r~bVD{{ZN34-EhS literal 0 HcmV?d00001 diff --git a/cmd/itgui/screenshots/info.png b/cmd/itgui/screenshots/info.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e6e39c87c2b3c850b31dcc119241a4892b51c4 GIT binary patch literal 30683 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é`jY+zFh23xwQrfK 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 literal 0 HcmV?d00001 diff --git a/cmd/itgui/screenshots/mkdir.png b/cmd/itgui/screenshots/mkdir.png new file mode 100644 index 0000000000000000000000000000000000000000..ae274a08ecdb6f975a2d2c58197f6cf3c5d9d1e7 GIT binary patch literal 26193 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 literal 0 HcmV?d00001 diff --git a/cmd/itgui/screenshots/motion.png b/cmd/itgui/screenshots/motion.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9b208b2c7e0b0395e4f1401b591104e670af0c GIT binary patch literal 20384 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 literal 0 HcmV?d00001 diff --git a/cmd/itgui/screenshots/notify.png b/cmd/itgui/screenshots/notify.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a2a1ec09f75b39c848bedc7c10272652a60cc0 GIT binary patch literal 11912 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 WH7H|6837Fj|Bda}#b2HO@qYm(q}tj5 literal 0 HcmV?d00001 diff --git a/cmd/itgui/screenshots/progress.png b/cmd/itgui/screenshots/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..15fcb544a53bd050b8007d6ffe6c01b7744c1314 GIT binary patch literal 16096 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 literal 0 HcmV?d00001 diff --git a/cmd/itgui/time.go b/cmd/itgui/time.go index 3d6c472..30c1836 100644 --- a/cmd/itgui/time.go +++ b/cmd/itgui/time.go @@ -11,51 +11,47 @@ import ( "go.arsenm.dev/itd/api" ) -func timeTab(parent fyne.Window, client *api.Client) *fyne.Container { - // Create new entry for time string +func timeTab(ctx context.Context, client *api.Client, w fyne.Window) fyne.CanvasObject { + c := container.NewVBox() + c.Add(layout.NewSpacer()) + + // Create entry for time string timeEntry := widget.NewEntry() - // Set text to current time formatter properly timeEntry.SetText(time.Now().Format(time.RFC1123)) + timeEntry.SetPlaceHolder("RFC1123") // Create button to set current time - currentBtn := widget.NewButton("Set Current", func() { - timeEntry.SetText(time.Now().Format(time.RFC1123)) - setTime(client, true) - }) - - // Create button to set time inside entry - timeBtn := widget.NewButton("Set", func() { - // Parse time as RFC1123 string - parsedTime, err := time.Parse(time.RFC1123, timeEntry.Text) + setCurrentBtn := widget.NewButton("Set current time", func() { + // Set current time + err := client.SetTime(ctx, time.Now()) if err != nil { - guiErr(err, "Error parsing time string", false, parent) + guiErr(err, "Error setting time", false, w) return } - // Set time to parsed time - setTime(client, false, parsedTime) + // Set time entry to current time + timeEntry.SetText(time.Now().Format(time.RFC1123)) }) - // Return new container with all elements centered - return container.NewVBox( - layout.NewSpacer(), - timeEntry, - currentBtn, - timeBtn, - layout.NewSpacer(), - ) -} + // Create button to set time from entry + setBtn := widget.NewButton("Set", func() { + // Parse RFC1123 time string in entry + newTime, err := time.Parse(time.RFC1123, timeEntry.Text) + if err != nil { + guiErr(err, "Error parsing time string", false, w) + return + } + // Set time from parsed string + err = client.SetTime(ctx, newTime) + if err != nil { + guiErr(err, "Error setting time", false, w) + return + } + }) -// setTime sets the first element in the variadic parameter -// if current is false, otherwise, it sets the current time. -func setTime(client *api.Client, current bool, t ...time.Time) error { - var err error - if current { - err = client.SetTime(context.Background(), time.Now()) - } else { - err = client.SetTime(context.Background(), t[0]) - } - if err != nil { - return err - } - return nil + c.Add(timeEntry) + c.Add(setBtn) + c.Add(setCurrentBtn) + + c.Add(layout.NewSpacer()) + return c } diff --git a/cmd/itgui/titledText.go b/cmd/itgui/titledText.go new file mode 100644 index 0000000..23b5960 --- /dev/null +++ b/cmd/itgui/titledText.go @@ -0,0 +1,35 @@ +package main + +import "fyne.io/fyne/v2/widget" + +type titledText struct { + *widget.RichText +} + +func newTitledText(title, text string) titledText { + titleStyle := widget.RichTextStyleHeading + titleStyle.TextStyle.Bold = false + return titledText{ + widget.NewRichText( + &widget.TextSegment{ + Style: widget.RichTextStyleParagraph, + Text: title, + }, + &widget.TextSegment{ + Style: titleStyle, + Text: text, + }, + &widget.SeparatorSegment{}, + ), + } +} + +func (t titledText) SetTitle(s string) { + t.RichText.Segments[0].(*widget.TextSegment).Text = s + t.Refresh() +} + +func (t titledText) SetBody(s string) { + t.RichText.Segments[1].(*widget.TextSegment).Text = s + t.Refresh() +} diff --git a/cmd/itgui/upgrade.go b/cmd/itgui/upgrade.go deleted file mode 100644 index a09159e..0000000 --- a/cmd/itgui/upgrade.go +++ /dev/null @@ -1,181 +0,0 @@ -package main - -import ( - "context" - "fmt" - "path/filepath" - - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/dialog" - "fyne.io/fyne/v2/layout" - "fyne.io/fyne/v2/storage" - "fyne.io/fyne/v2/widget" - "go.arsenm.dev/itd/api" -) - -func upgradeTab(parent fyne.Window, client *api.Client) *fyne.Container { - var ( - archivePath string - firmwarePath string - initPktPath string - ) - - var archiveBtn *widget.Button - // Create archive selection dialog - archiveDialog := dialog.NewFileOpen(func(uc fyne.URIReadCloser, e error) { - if e != nil || uc == nil { - return - } - uc.Close() - archivePath = uc.URI().Path() - archiveBtn.SetText(fmt.Sprintf("Select archive (.zip) [%s]", filepath.Base(archivePath))) - }, parent) - // Limit dialog to .zip files - archiveDialog.SetFilter(storage.NewExtensionFileFilter([]string{".zip"})) - // Create button to show dialog - archiveBtn = widget.NewButton("Select archive (.zip)", archiveDialog.Show) - - var firmwareBtn *widget.Button - // Create firmware selection dialog - firmwareDialog := dialog.NewFileOpen(func(uc fyne.URIReadCloser, e error) { - if e != nil || uc == nil { - return - } - uc.Close() - firmwarePath = uc.URI().Path() - firmwareBtn.SetText(fmt.Sprintf("Select firmware (.bin) [%s]", filepath.Base(firmwarePath))) - }, parent) - // Limit dialog to .bin files - firmwareDialog.SetFilter(storage.NewExtensionFileFilter([]string{".bin"})) - // Create button to show dialog - firmwareBtn = widget.NewButton("Select firmware (.bin)", firmwareDialog.Show) - - var initPktBtn *widget.Button - // Create init packet selection dialog - initPktDialog := dialog.NewFileOpen(func(uc fyne.URIReadCloser, e error) { - if e != nil || uc == nil { - return - } - uc.Close() - initPktPath = uc.URI().Path() - initPktBtn.SetText(fmt.Sprintf("Select init packet (.dat) [%s]", filepath.Base(initPktPath))) - }, parent) - // Limit dialog to .dat files - initPktDialog.SetFilter(storage.NewExtensionFileFilter([]string{".dat"})) - // Create button to show dialog - initPktBtn = widget.NewButton("Select init packet (.dat)", initPktDialog.Show) - - // Hide init packet and firmware buttons - initPktBtn.Hide() - firmwareBtn.Hide() - - // Create dropdown to select upgrade type - upgradeTypeSelect := widget.NewSelect([]string{ - "Archive", - "Files", - }, func(s string) { - // Hide all buttons - archiveBtn.Hide() - initPktBtn.Hide() - firmwareBtn.Hide() - // Unhide appropriate button(s) - switch s { - case "Archive": - archiveBtn.Show() - case "Files": - initPktBtn.Show() - firmwareBtn.Show() - } - }) - // Select first elemetn - upgradeTypeSelect.SetSelectedIndex(0) - - // Create new button to start DFU - startBtn := widget.NewButton("Start", func() { - // If archive path does not exist and both init packet and firmware paths - // also do not exist, return error - if archivePath == "" && (initPktPath == "" && firmwarePath == "") { - guiErr(nil, "Upgrade requires archive or files selected", false, parent) - return - } - - // Create new label for byte progress - progressLbl := widget.NewLabelWithStyle("0 / 0 B", fyne.TextAlignCenter, fyne.TextStyle{}) - // Create new progress bar - progressBar := widget.NewProgressBar() - // Create modal dialog containing label and progress bar - progressDlg := widget.NewModalPopUp(container.NewVBox( - layout.NewSpacer(), - progressLbl, - progressBar, - layout.NewSpacer(), - ), parent.Canvas()) - // Resize modal to 300x100 - progressDlg.Resize(fyne.NewSize(300, 100)) - - var fwUpgType api.UpgradeType - var files []string - // Get appropriate upgrade type and file paths - switch upgradeTypeSelect.Selected { - case "Archive": - fwUpgType = api.UpgradeTypeArchive - files = append(files, archivePath) - case "Files": - fwUpgType = api.UpgradeTypeFiles - files = append(files, initPktPath, firmwarePath) - } - - progress, err := client.FirmwareUpgrade(context.Background(), fwUpgType, files...) - if err != nil { - guiErr(err, "Error initiating DFU", false, parent) - return - } - - // Show progress dialog - progressDlg.Show() - - for event := range progress { - // Set label text to received / total B - progressLbl.SetText(fmt.Sprintf("%d / %d B", event.Received, event.Total)) - // Set progress bar values - progressBar.Max = float64(event.Total) - progressBar.Value = float64(event.Received) - // Refresh progress bar - progressBar.Refresh() - // If transfer finished, break - if int64(event.Sent) == event.Total { - break - } - } - - // Hide progress dialog after completion - progressDlg.Hide() - - // Reset screen to default - upgradeTypeSelect.SetSelectedIndex(0) - firmwareBtn.SetText("Select firmware (.bin)") - initPktBtn.SetText("Select init packet (.dat)") - archiveBtn.SetText("Select archive (.zip)") - firmwarePath = "" - initPktPath = "" - archivePath = "" - - dialog.NewInformation( - "Upgrade Complete", - "The firmware was transferred successfully.\nRemember to validate the firmware in InfiniTime settings.", - parent, - ).Show() - }) - - // Return container containing all elements - return container.NewVBox( - layout.NewSpacer(), - upgradeTypeSelect, - archiveBtn, - firmwareBtn, - initPktBtn, - startBtn, - layout.NewSpacer(), - ) -} diff --git a/go.mod b/go.mod index edd4c8d..0c5329a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module go.arsenm.dev/itd go 1.17 require ( - fyne.io/fyne/v2 v2.1.2 + fyne.io/fyne/v2 v2.1.4 github.com/cheggaaa/pb/v3 v3.0.8 github.com/gen2brain/dlgs v0.0.0-20211108104213-bade24837f0b github.com/godbus/dbus/v5 v5.0.6 @@ -19,39 +19,38 @@ require ( require ( github.com/VividCortex/ewma v1.1.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/fatih/color v1.10.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect - github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f // indirect - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be // indirect + github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211204153444-caad923f49f4 // indirect github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff // indirect - github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect + github.com/gopherjs/gopherjs v1.17.2 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-runewidth v0.0.12 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/muka/go-bluetooth v0.0.0-20220219050759-674a63b8741a // indirect - github.com/pelletier/go-toml v1.7.0 // indirect + github.com/pelletier/go-toml v1.9.3 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect - github.com/sirupsen/logrus v1.6.0 // indirect - github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 // indirect - github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/srwiley/oksvg v0.0.0-20211120171407-1837d6608d8c // indirect + github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 // indirect github.com/stretchr/testify v1.7.1 // indirect github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/yuin/goldmark v1.4.1 // indirect - golang.org/x/image v0.0.0-20200430140353-33d19683fad8 // indirect + github.com/yuin/goldmark v1.4.4 // indirect + golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index df719a7..3615a53 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,53 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -fyne.io/fyne/v2 v2.1.2 h1:avp9CvLAUdvE7fDMtH1tVKyjxEWHWcpow6aI6L7Kvvw= -fyne.io/fyne/v2 v2.1.2/go.mod h1:p+E/Dh+wPW8JwR2DVcsZ9iXgR9ZKde80+Y+40Is54AQ= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +fyne.io/fyne/v2 v2.1.4 h1:bt1+28++kAzRzPB0GM2EuSV4cnl8rXNX4cjfd8G06Rc= +fyne.io/fyne/v2 v2.1.4/go.mod h1:p+E/Dh+wPW8JwR2DVcsZ9iXgR9ZKde80+Y+40Is54AQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= @@ -21,19 +61,35 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+ github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8vlzI4mm59llRvNzrFg6/LAA= @@ -45,10 +101,17 @@ github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/gen2brain/dlgs v0.0.0-20211108104213-bade24837f0b h1:M0/hjawi9ur15zpqL/h66ga87jlYA7iAuZ4HC6ak08k= github.com/gen2brain/dlgs v0.0.0-20211108104213-bade24837f0b/go.mod h1:/eFcjDXaU2THSOOqLxOPETIbHETnamk8FA/hMjhg/gU= -github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f h1:s0O46d8fPwk9kU4k1jj76wBquMVETx7uveQD9MCIQoU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f/go.mod h1:wjpnOv6ONl2SuJSxqCPVaPZibGFdSci9HFocT9qtVYM= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be h1:Z28GdQBfKOL8tNHjvaDn3wHDO7AzTRkmAXvHvnopp98= +github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk= +github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211204153444-caad923f49f4 h1:KgfIc81yNEUKNAsF+Mt3C1Cl+iQqKF1r7nWEKzL0c2Y= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211204153444-caad923f49f4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -58,74 +121,157 @@ github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8= github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/knadh/koanf v1.4.0 h1:/k0Bh49SqLyLNfte9r6cvuZWrApOQhglOmhIU3L/zDw= github.com/knadh/koanf v1.4.0/go.mod h1:1cfH5223ZeZUOs8FU2UdTmaNfHpqgtjV0+NHjRO43gs= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b/go.mod h1:PRq09yoB+Q2OJReAmwzKivcYyremnibWGbK7WfftHzc= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -133,57 +279,86 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c= github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= github.com/muka/go-bluetooth v0.0.0-20220219050759-674a63b8741a h1:fnzS9RRQW8B5AgNCxkN0vJ/AoX+Xfqk3sAYon3iVrzA= github.com/muka/go-bluetooth v0.0.0-20220219050759-674a63b8741a/go.mod h1:dMCjicU6vRBk34dqOmIZm0aod6gUwZXOXzBROqGous0= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paypal/gatt v0.0.0-20151011220935-4ae819d591cf/go.mod h1:+AwQL2mK3Pd3S+TUwg0tYQjid0q1txyNUJuuSmz8Kdk= -github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 h1:HunZiaEKNGVdhTRQOVpMmj5MQnGnv+e8uZNu3xFLgyM= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= -github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCEzJNy71UkeF4XIx2EVmL9KLwDQdmM= +github.com/srwiley/oksvg v0.0.0-20211120171407-1837d6608d8c h1:+e9myEHblxwU1r2Jb5PKzepMcsuig7+NUz+K53lBNaQ= +github.com/srwiley/oksvg v0.0.0-20211120171407-1837d6608d8c/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= +github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 h1:oDMiXaTMyBEuZMU53atpxqYsSB3U1CHkeAu2zr6wTeY= +github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/suapapa/go_eddystone v1.3.1/go.mod h1:bXC11TfJOS+3g3q/Uzd7FKd5g62STQEfeEIhcKe4Qy8= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= @@ -192,63 +367,186 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1 h1:/vn0k+RBvwlxEmP5E7SZMqNxPhfMVFEJiykr15/0XKM= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.4 h1:zNWRjYUW32G9KirMXYHQHVNFkXvMI7LpgNW2AgYAoIs= +github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= go.arsenm.dev/infinitime v0.0.0-20220505193916-1533865e4c42 h1:t3gXRa6TEPZ7mOGxkccYke7afkVe5qL+DGHFPkHF+WI= go.arsenm.dev/infinitime v0.0.0-20220505193916-1533865e4c42/go.mod h1:1cBQ3fp6QlRbSqu9kEBAHsVThINj31FtqHIYVsQ7wgg= go.arsenm.dev/lrpc v0.0.0-20220504231535-b1e7ded874b9 h1:4sKkRjDDbgIvyk+RuPbkkOUQ9nLf7lzMOUbl/CqjKT0= go.arsenm.dev/lrpc v0.0.0-20220504231535-b1e7ded874b9/go.mod h1:3Apd8bykiyd+L+bR/ANzT/CbVn60a5vM6zsH9jSp59U= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -256,44 +554,196 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f h1:8w7RhxzTVgUzw/AH/9mUV5q0vMgy40SQRursCcfmkCw= golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -304,4 +754,12 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=