this repo has no description

init appview bits

Akshay 0ac4c840 a86e8e3e

Changed files
+264
appview
auth
db
state
cmd
appview
+105
appview/auth/auth.go
··· 1 + package auth 2 + 3 + import ( 4 + "context" 5 + "fmt" 6 + "net/http" 7 + "time" 8 + 9 + comatproto "github.com/bluesky-social/indigo/api/atproto" 10 + "github.com/bluesky-social/indigo/atproto/identity" 11 + "github.com/bluesky-social/indigo/atproto/syntax" 12 + "github.com/bluesky-social/indigo/xrpc" 13 + "github.com/gorilla/sessions" 14 + "github.com/whyrusleeping/go-did" 15 + ) 16 + 17 + type Auth struct { 18 + store sessions.Store 19 + } 20 + 21 + type AtSessionCreate struct { 22 + comatproto.ServerCreateSession_Output 23 + PDSEndpoint string 24 + } 25 + 26 + type AtSessionRefresh struct { 27 + comatproto.ServerRefreshSession_Output 28 + PDSEndpoint string 29 + } 30 + 31 + func Make() (*Auth, error) { 32 + store := sessions.NewCookieStore([]byte("TODO_CHANGE_ME")) 33 + return &Auth{store}, nil 34 + } 35 + 36 + func ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) { 37 + id, err := syntax.ParseAtIdentifier(arg) 38 + if err != nil { 39 + return nil, err 40 + } 41 + 42 + dir := identity.DefaultDirectory() 43 + return dir.Lookup(ctx, *id) 44 + } 45 + 46 + func (a *Auth) CreateInitialSession(ctx context.Context, username, appPassword string) (*comatproto.ServerCreateSession_Output, error) { 47 + resolved, err := ResolveIdent(ctx, username) 48 + if err != nil { 49 + return nil, fmt.Errorf("invalid handle: %s", err) 50 + } 51 + 52 + pdsUrl := resolved.PDSEndpoint() 53 + client := xrpc.Client{ 54 + Host: pdsUrl, 55 + } 56 + 57 + atSession, err := comatproto.ServerCreateSession(ctx, &client, &comatproto.ServerCreateSession_Input{ 58 + Identifier: resolved.DID.String(), 59 + Password: appPassword, 60 + }) 61 + if err != nil { 62 + return nil, fmt.Errorf("invalid app password") 63 + } 64 + 65 + return atSession, nil 66 + } 67 + 68 + func (a *Auth) StoreSession(r *http.Request, w http.ResponseWriter, atSession *comatproto.ServerCreateSession_Output) error { 69 + didDoc, ok := (*atSession.DidDoc).(did.Document) 70 + if !ok { 71 + return fmt.Errorf("invalid did document for session") 72 + } 73 + 74 + pdsEndpoint := getPdsEndpoint(&didDoc) 75 + 76 + if pdsEndpoint == "" { 77 + return fmt.Errorf("no pds endpoint found") 78 + } 79 + 80 + clientSession, _ := a.store.Get(r, "appview-session") 81 + clientSession.Values["handle"] = atSession.Handle 82 + clientSession.Values["did"] = atSession.Did 83 + clientSession.Values["pds"] = pdsEndpoint 84 + clientSession.Values["accessJwt"] = atSession.AccessJwt 85 + clientSession.Values["refreshJwt"] = atSession.RefreshJwt 86 + clientSession.Values["expiry"] = time.Now().Add(time.Hour).String() 87 + clientSession.Values["authenticated"] = true 88 + 89 + return clientSession.Save(r, w) 90 + } 91 + 92 + func getPdsEndpoint(didDoc *did.Document) string { 93 + fullId := didDoc.ID.String() 94 + id := "#atproto_pds" 95 + type_ := "AtprotoPersonalDataServer" 96 + 97 + for _, service := range didDoc.Service { 98 + serviceId := service.ID.String() 99 + if serviceId == id || serviceId == fullId+id || service.Type == type_ { 100 + return service.ServiceEndpoint 101 + } 102 + } 103 + 104 + return "" 105 + }
+19
appview/db/db.go
··· 1 + package db 2 + 3 + import ( 4 + "database/sql" 5 + _ "github.com/mattn/go-sqlite3" 6 + ) 7 + 8 + type DB struct { 9 + db *sql.DB 10 + } 11 + 12 + func Make(dbPath string) (*DB, error) { 13 + db, err := sql.Open("sqlite3", dbPath) 14 + if err != nil { 15 + return nil, err 16 + } 17 + 18 + return &DB{db: db}, nil 19 + }
+66
appview/state/state.go
··· 1 + package state 2 + 3 + import ( 4 + "log" 5 + "net/http" 6 + 7 + "github.com/go-chi/chi/v5" 8 + "github.com/icyphox/bild/appview/auth" 9 + "github.com/icyphox/bild/appview/db" 10 + ) 11 + 12 + type State struct { 13 + Db *db.DB 14 + Auth *auth.Auth 15 + } 16 + 17 + func Make() (*State, error) { 18 + db, err := db.Make("appview.db") 19 + if err != nil { 20 + return nil, err 21 + } 22 + 23 + auth, err := auth.Make() 24 + if err != nil { 25 + return nil, err 26 + } 27 + 28 + return &State{db, auth}, nil 29 + } 30 + 31 + func (s *State) Login(w http.ResponseWriter, r *http.Request) { 32 + ctx := r.Context() 33 + 34 + switch r.Method { 35 + case http.MethodGet: 36 + log.Println("unimplemented") 37 + return 38 + case http.MethodPost: 39 + username := r.FormValue("username") 40 + appPassword := r.FormValue("password") 41 + 42 + atSession, err := s.Auth.CreateInitialSession(ctx, username, appPassword) 43 + if err != nil { 44 + log.Printf("creating initial session: %s", err) 45 + return 46 + } 47 + 48 + err = s.Auth.StoreSession(r, w, atSession) 49 + if err != nil { 50 + log.Printf("storing session: %s", err) 51 + return 52 + } 53 + 54 + log.Printf("successfully saved session for %s (%s)", atSession.Handle, atSession.Did) 55 + http.Redirect(w, r, "/", http.StatusSeeOther) 56 + return 57 + } 58 + } 59 + 60 + func (s *State) Router() http.Handler { 61 + r := chi.NewRouter() 62 + 63 + r.Post("/login", s.Login) 64 + 65 + return r 66 + }
+27
cmd/appview/main.go
··· 1 + package main 2 + 3 + import ( 4 + "fmt" 5 + "log" 6 + "log/slog" 7 + "net/http" 8 + "os" 9 + 10 + "github.com/icyphox/bild/appview/state" 11 + ) 12 + 13 + func main() { 14 + 15 + slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil))) 16 + 17 + state, err := state.Make() 18 + 19 + if err != nil { 20 + log.Fatal(err) 21 + } 22 + 23 + addr := fmt.Sprintf("%s:%d", "localhost", 3000) 24 + 25 + log.Println("starting server on", addr) 26 + log.Println(http.ListenAndServe(addr, state.Router())) 27 + }
+10
go.mod
··· 29 29 github.com/cloudflare/circl v1.4.0 // indirect 30 30 github.com/cyphar/filepath-securejoin v0.3.3 // indirect 31 31 github.com/davecgh/go-spew v1.1.1 // indirect 32 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect 32 33 github.com/dlclark/regexp2 v1.11.4 // indirect 33 34 github.com/emirpasic/gods v1.18.1 // indirect 34 35 github.com/felixge/httpsnoop v1.0.4 // indirect ··· 36 37 github.com/go-git/go-billy/v5 v5.5.0 // indirect 37 38 github.com/go-logr/logr v1.4.1 // indirect 38 39 github.com/go-logr/stdr v1.2.2 // indirect 40 + github.com/goccy/go-json v0.10.2 // indirect 39 41 github.com/gogo/protobuf v1.3.2 // indirect 40 42 github.com/google/go-cmp v0.6.0 // indirect 41 43 github.com/google/uuid v1.6.0 // indirect ··· 63 65 github.com/jbenet/goprocess v0.1.4 // indirect 64 66 github.com/kevinburke/ssh_config v1.2.0 // indirect 65 67 github.com/klauspost/cpuid/v2 v2.2.7 // indirect 68 + github.com/lestrrat-go/blackmagic v1.0.1 // indirect 69 + github.com/lestrrat-go/httpcc v1.0.1 // indirect 70 + github.com/lestrrat-go/httprc v1.0.4 // indirect 71 + github.com/lestrrat-go/iter v1.0.2 // indirect 72 + github.com/lestrrat-go/jwx/v2 v2.0.12 // indirect 73 + github.com/lestrrat-go/option v1.0.1 // indirect 66 74 github.com/mattn/go-isatty v0.0.20 // indirect 67 75 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect 68 76 github.com/minio/sha256-simd v1.0.1 // indirect ··· 80 88 github.com/prometheus/client_model v0.5.0 // indirect 81 89 github.com/prometheus/common v0.45.0 // indirect 82 90 github.com/prometheus/procfs v0.12.0 // indirect 91 + github.com/segmentio/asm v1.2.0 // indirect 83 92 github.com/sergi/go-diff v1.3.1 // indirect 84 93 github.com/skeema/knownhosts v1.3.0 // indirect 85 94 github.com/spaolacci/murmur3 v1.1.0 // indirect 86 95 github.com/stretchr/testify v1.9.0 // indirect 87 96 github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e // indirect 97 + github.com/whyrusleeping/go-did v0.0.0-20240828165449-bcaa7ae21371 // indirect 88 98 github.com/xanzy/ssh-agent v0.3.3 // indirect 89 99 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect 90 100 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect
+37
go.sum
··· 43 43 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 44 44 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 45 45 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 46 + github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= 47 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= 48 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 46 49 github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= 47 50 github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 48 51 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= ··· 72 75 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 73 76 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 74 77 github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= 78 + github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 79 + github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 75 80 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 76 81 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 77 82 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= ··· 149 154 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 150 155 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 151 156 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 157 + github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= 158 + github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= 159 + github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= 160 + github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= 161 + github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= 162 + github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= 163 + github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= 164 + github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= 165 + github.com/lestrrat-go/jwx/v2 v2.0.12 h1:3d589+5w/b9b7S3DneICPW16AqTyYXB7VRjgluSDWeA= 166 + github.com/lestrrat-go/jwx/v2 v2.0.12/go.mod h1:Mq4KN1mM7bp+5z/W5HS8aCNs5RKZ911G/0y2qUjAQuQ= 167 + github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= 168 + github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= 169 + github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= 152 170 github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= 153 171 github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= 154 172 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= ··· 203 221 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 204 222 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 205 223 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 224 + github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= 225 + github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= 206 226 github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= 207 227 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 208 228 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= ··· 215 235 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 216 236 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 217 237 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 238 + github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 239 + github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 218 240 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 219 241 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 220 242 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 243 + github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 221 244 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 245 + github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 246 + github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 247 + github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 222 248 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 223 249 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 224 250 github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 225 251 github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= 226 252 github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e h1:28X54ciEwwUxyHn9yrZfl5ojgF4CBNLWX7LR0rvBkf4= 227 253 github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= 254 + github.com/whyrusleeping/go-did v0.0.0-20240828165449-bcaa7ae21371 h1:W4jEGWdes35iuiiAYNZFOjx+dwzQOBh33kVpc0C0YiE= 255 + github.com/whyrusleeping/go-did v0.0.0-20240828165449-bcaa7ae21371/go.mod h1:39U9RRVr4CKbXpXYopWn+FSH5s+vWu6+RmguSPWAq5s= 228 256 github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= 229 257 github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= 230 258 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= ··· 270 298 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= 271 299 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= 272 300 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= 301 + golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 273 302 golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= 274 303 golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 275 304 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= ··· 295 324 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 296 325 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 297 326 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= 327 + golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 298 328 golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= 299 329 golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 300 330 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= ··· 317 347 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 318 348 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 319 349 golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 350 + golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 320 351 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 321 352 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 322 353 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= ··· 327 358 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 328 359 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 329 360 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 361 + golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 362 + golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 330 363 golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= 331 364 golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 332 365 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= ··· 336 369 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= 337 370 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 338 371 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 372 + golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 373 + golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= 339 374 golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= 340 375 golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 341 376 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= ··· 345 380 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 346 381 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 347 382 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 383 + golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 384 + golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 348 385 golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= 349 386 golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 350 387 golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=