Compare commits
19 Commits
a956b1f090
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d53b0639b | ||
|
|
c8066d7b17 | ||
|
|
582e890dc4 | ||
|
|
1b4d33b7ce | ||
|
|
bac048a685 | ||
|
|
5101525607 | ||
|
|
cc74cc60f2 | ||
|
|
bcdfacc142 | ||
|
|
7f379e9d90 | ||
|
|
68f7ad68c6 | ||
|
|
ab4c577825 | ||
|
|
a05ee6de8f | ||
|
|
8fd7c0196d | ||
|
|
55a78add6f | ||
|
|
2662e056e0 | ||
|
|
4c5d4e805c | ||
|
|
ffdb643bef | ||
|
|
ca3c4d6607 | ||
|
|
d37b6e292f |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/turbomaps-er
|
||||||
20
.mise/tasks/search
Executable file
20
.mise/tasks/search
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
#MISE description="TODO"
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
cd "${MISE_PROJECT_ROOT}"
|
||||||
|
|
||||||
|
cities=()
|
||||||
|
for city in "$@"; do
|
||||||
|
cities+=("-t=$city")
|
||||||
|
done
|
||||||
|
searches=(
|
||||||
|
"-s=mobile home park=0.5"
|
||||||
|
"-s=schools=0.25"
|
||||||
|
"-s=water treatment facility=1.0"
|
||||||
|
"-s=landfill=1.5"
|
||||||
|
"-s=police department=0.1"
|
||||||
|
"-s=prison=2.5"
|
||||||
|
)
|
||||||
|
go run ./ "${searches[@]}" -d "${cities[@]}"
|
||||||
69
cmd/db.go
Normal file
69
cmd/db.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
_ "modernc.org/sqlite"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DB struct {
|
||||||
|
*sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
type Cache DB
|
||||||
|
|
||||||
|
var cacheAddr = "/tmp/turbomaps-er.db"
|
||||||
|
|
||||||
|
func NewCache(ctx context.Context) Cache {
|
||||||
|
ctx, can := context.WithTimeout(ctx, 5*time.Second)
|
||||||
|
defer can()
|
||||||
|
|
||||||
|
db, err := sql.Open("sqlite", cacheAddr)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := db.PingContext(ctx); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Cache(DB{DB: db})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db Cache) Get(ctx context.Context, k string) ([]byte, error) {
|
||||||
|
if err := db.init(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
row := db.QueryRowContext(ctx, `
|
||||||
|
SELECT v FROM cache WHERE k=$1
|
||||||
|
`, k)
|
||||||
|
|
||||||
|
var v []byte
|
||||||
|
if err := row.Scan(&v); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return v, row.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db Cache) Set(ctx context.Context, k string, v []byte) error {
|
||||||
|
if err := db.init(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := db.ExecContext(ctx, `
|
||||||
|
INSERT INTO cache (k, v) VALUES ($1, $2)
|
||||||
|
ON CONFLICT DO UPDATE SET v=$2 WHERE k=$1
|
||||||
|
`, k, v)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db Cache) init(ctx context.Context) error {
|
||||||
|
_, err := db.ExecContext(ctx, `
|
||||||
|
CREATE TABLE IF NOT EXISTS cache(k TEXT PRIMARY KEY, v TEXT)
|
||||||
|
`)
|
||||||
|
return err
|
||||||
|
}
|
||||||
26
cmd/db_test.go
Normal file
26
cmd/db_test.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"path"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCache(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
cacheAddr = path.Join(t.TempDir(), "test.db")
|
||||||
|
|
||||||
|
c := NewCache(ctx)
|
||||||
|
k := "k"
|
||||||
|
v := []byte("v")
|
||||||
|
if err := c.Set(ctx, k, v); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, err := c.Get(ctx, k); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else if !bytes.Equal(v, got) {
|
||||||
|
t.Fatalf("expected %q but got %q", v, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
71
cmd/main.go
71
cmd/main.go
@@ -1,71 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/time/rate"
|
|
||||||
"googlemaps.github.io/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Run(ctx context.Context) error {
|
|
||||||
rps := 2
|
|
||||||
limit := 200
|
|
||||||
|
|
||||||
limiter := rate.NewLimiter(rate.Limit(rps), 1)
|
|
||||||
|
|
||||||
c, err := maps.NewClient(maps.WithAPIKey(os.Getenv("GOOGLE_PLACES_API_KEY")))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := c.TextSearch(ctx, &maps.TextSearchRequest{
|
|
||||||
Query: os.Args[1],
|
|
||||||
Location: nil,
|
|
||||||
Radius: uint(0),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
} else if len(resp.Results) < 1 {
|
|
||||||
return fmt.Errorf("no results for %q", os.Args[1])
|
|
||||||
}
|
|
||||||
origin := resp.Results[0].Geometry.Location
|
|
||||||
|
|
||||||
type Result struct {
|
|
||||||
Name string
|
|
||||||
Lat float64
|
|
||||||
Lng float64
|
|
||||||
Address string
|
|
||||||
}
|
|
||||||
results := []Result{}
|
|
||||||
var nextToken string
|
|
||||||
for len(results) < limit {
|
|
||||||
limiter.Wait(ctx)
|
|
||||||
resp, err := c.TextSearch(ctx, &maps.TextSearchRequest{
|
|
||||||
Query: os.Args[2],
|
|
||||||
Location: &origin,
|
|
||||||
Radius: uint(50),
|
|
||||||
PageToken: nextToken,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
nextToken = resp.NextPageToken
|
|
||||||
for _, result := range resp.Results {
|
|
||||||
results = append(results, Result{
|
|
||||||
Name: result.Name,
|
|
||||||
Lat: result.Geometry.Location.Lat,
|
|
||||||
Lng: result.Geometry.Location.Lng,
|
|
||||||
Address: result.FormattedAddress,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
log.Printf("%d...", len(resp.Results))
|
|
||||||
}
|
|
||||||
b, _ := json.Marshal(results)
|
|
||||||
fmt.Printf("%s\n", b)
|
|
||||||
|
|
||||||
return ctx.Err()
|
|
||||||
}
|
|
||||||
135
cmd/maps.go
Normal file
135
cmd/maps.go
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"math"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
|
||||||
|
"golang.org/x/time/rate"
|
||||||
|
"googlemaps.github.io/maps"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Maps struct {
|
||||||
|
around Location
|
||||||
|
cache Cache
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMapsOf(ctx context.Context, town string) (*Maps, error) {
|
||||||
|
m := &Maps{
|
||||||
|
cache: NewCache(ctx),
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
m.around, err = m.textSearchOne(ctx, town)
|
||||||
|
return m, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var rps = 2
|
||||||
|
var mapsLimit = 200
|
||||||
|
var mapsLimiter = rate.NewLimiter(rate.Limit(rps), 1)
|
||||||
|
|
||||||
|
type Location struct {
|
||||||
|
Name string
|
||||||
|
Lat float64
|
||||||
|
Lng float64
|
||||||
|
Address string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Maps) textSearchOne(ctx context.Context, query string) (Location, error) {
|
||||||
|
results, err := m.Search(ctx, query, 1.0)
|
||||||
|
if err != nil {
|
||||||
|
return Location{}, err
|
||||||
|
} else if len(results) < 1 {
|
||||||
|
return Location{}, fmt.Errorf("no results for %q", query)
|
||||||
|
}
|
||||||
|
return results[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var convertToMiles = 69.0
|
||||||
|
|
||||||
|
func (m *Maps) Search(ctx context.Context, query string, radius_miles float64) ([]Location, error) {
|
||||||
|
results, err := m.search(ctx, query)
|
||||||
|
for i := len(results) - 1; i >= 0; i-- {
|
||||||
|
shouldKeep := true
|
||||||
|
if m.around != (Location{}) {
|
||||||
|
a := m.around.Lat - results[i].Lat
|
||||||
|
b := m.around.Lng - results[i].Lng
|
||||||
|
dist := math.Sqrt(a*a + b*b)
|
||||||
|
shouldKeep = dist*convertToMiles < radius_miles
|
||||||
|
}
|
||||||
|
if !shouldKeep {
|
||||||
|
results = append(results[:i], results[i+1:]...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Maps) search(ctx context.Context, query string) ([]Location, error) {
|
||||||
|
cacheK := path.Join(fmt.Sprint(m.around), query)
|
||||||
|
if b, err := m.cache.Get(ctx, cacheK); err == nil {
|
||||||
|
var locations []Location
|
||||||
|
log.Printf("cache hit for %q", cacheK)
|
||||||
|
if err := json.Unmarshal(b, &locations); err == nil {
|
||||||
|
return locations, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Printf("cache miss for %q", cacheK)
|
||||||
|
|
||||||
|
locations := []Location{}
|
||||||
|
nextToken := ""
|
||||||
|
for len(locations) < mapsLimit {
|
||||||
|
results, err := m._textSearch(ctx, query, nextToken)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for _, result := range results.Results {
|
||||||
|
locations = append(locations, Location{
|
||||||
|
Name: result.Name,
|
||||||
|
Lat: result.Geometry.Location.Lat,
|
||||||
|
Lng: result.Geometry.Location.Lng,
|
||||||
|
Address: result.FormattedAddress,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
nextToken = results.NextPageToken
|
||||||
|
if nextToken == "" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cacheV, _ := json.Marshal(locations)
|
||||||
|
m.cache.Set(ctx, cacheK, cacheV)
|
||||||
|
|
||||||
|
return locations, ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Maps) _textSearch(ctx context.Context, query string, nextToken string) (maps.PlacesSearchResponse, error) {
|
||||||
|
mapsLimiter.Wait(ctx)
|
||||||
|
|
||||||
|
var location *maps.LatLng
|
||||||
|
radius := uint(250)
|
||||||
|
if m.around != (Location{}) {
|
||||||
|
radius = 250
|
||||||
|
location = &maps.LatLng{
|
||||||
|
Lat: m.around.Lat,
|
||||||
|
Lng: m.around.Lng,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m.client().TextSearch(ctx, &maps.TextSearchRequest{
|
||||||
|
Query: query,
|
||||||
|
Location: location,
|
||||||
|
Radius: radius,
|
||||||
|
PageToken: nextToken,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Maps) client() *maps.Client {
|
||||||
|
c, err := maps.NewClient(maps.WithAPIKey(os.Getenv("GOOGLE_PLACES_API_KEY")))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
161
cmd/run.go
Normal file
161
cmd/run.go
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Run(ctx context.Context) error {
|
||||||
|
fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
|
||||||
|
searchRadius := fs.Float64("r", 5.0, "search radius in miles")
|
||||||
|
doArea := fs.Bool("d", false, "do result radius in miles")
|
||||||
|
var towns FlagStringArray
|
||||||
|
fs.Var(&towns, "t", "list of towns to search around")
|
||||||
|
searches := StringToFloat64{}
|
||||||
|
fs.Var(&searches, "s", "list of things to search for around each town")
|
||||||
|
if err := fs.Parse(os.Args[1:]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type geoJson struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Properties struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
} `json:"properties"`
|
||||||
|
Geometry struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Coordinates any `json:"coordinates"`
|
||||||
|
} `json:"geometry"`
|
||||||
|
}
|
||||||
|
type Area [1][5][2]float64
|
||||||
|
type Point [2]float64
|
||||||
|
geoJsons := []geoJson{}
|
||||||
|
for search, area := range searches {
|
||||||
|
results := []Location{}
|
||||||
|
for _, town := range towns {
|
||||||
|
m, err := NewMapsOf(ctx, town)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
more, err := m.Search(ctx, search, *searchRadius)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
results = append(results, more...)
|
||||||
|
}
|
||||||
|
|
||||||
|
slices.SortFunc(results, func(a, b Location) int {
|
||||||
|
return strings.Compare(a.Name, b.Name)
|
||||||
|
})
|
||||||
|
slices.CompactFunc(results, func(a, b Location) bool {
|
||||||
|
return a.Name == b.Name
|
||||||
|
})
|
||||||
|
radius := area / convertToMiles
|
||||||
|
radiusX := 2 * radius / 2
|
||||||
|
radiusY := 2 * radius / 3
|
||||||
|
|
||||||
|
for i := range results {
|
||||||
|
var a geoJson
|
||||||
|
a.Type = "Feature"
|
||||||
|
a.Properties.Name = path.Join(search, results[i].Name)
|
||||||
|
if strings.Contains(search, "school") {
|
||||||
|
a.Properties.Name = " "
|
||||||
|
}
|
||||||
|
a.Geometry.Type = "Point"
|
||||||
|
a.Geometry.Coordinates = Point{results[i].Lng, results[i].Lat}
|
||||||
|
if *doArea {
|
||||||
|
a.Geometry.Type = "Polygon"
|
||||||
|
x, y := results[i].Lng, results[i].Lat
|
||||||
|
a.Geometry.Coordinates = Area{{
|
||||||
|
[2]float64{x, y + radiusY}, // top
|
||||||
|
[2]float64{x + radiusX, y}, // right
|
||||||
|
[2]float64{x, y - radiusY}, // bot
|
||||||
|
[2]float64{x - radiusX, y}, // left
|
||||||
|
[2]float64{x, y + radiusY}, // top
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
geoJsons = append(geoJsons, a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Println(len(geoJsons))
|
||||||
|
slices.SortFunc(geoJsons, func(a, b geoJson) int {
|
||||||
|
return strings.Compare(fmt.Sprint(a.Geometry.Coordinates), fmt.Sprint(b.Geometry.Coordinates))
|
||||||
|
})
|
||||||
|
geoJsons = slices.CompactFunc(geoJsons, func(a, b geoJson) bool {
|
||||||
|
return fmt.Sprint(a.Geometry.Coordinates) == fmt.Sprint(b.Geometry.Coordinates)
|
||||||
|
})
|
||||||
|
if *doArea {
|
||||||
|
for i := range geoJsons {
|
||||||
|
areaI, ok := geoJsons[i].Geometry.Coordinates.(Area)
|
||||||
|
if ok {
|
||||||
|
areaI := areaI[0]
|
||||||
|
for j := i + 1; j < len(geoJsons); j++ {
|
||||||
|
areaJ, ok := geoJsons[j].Geometry.Coordinates.(Area)
|
||||||
|
if ok {
|
||||||
|
areaJ := areaJ[0]
|
||||||
|
// if diamond i contains j, then drop j
|
||||||
|
iAbove := areaI[0][1] > areaJ[0][1]
|
||||||
|
iRight := areaI[1][0] > areaJ[1][0]
|
||||||
|
iBelow := areaI[2][1] < areaJ[2][1]
|
||||||
|
iLeft := areaI[3][0] < areaJ[3][0]
|
||||||
|
if iAbove && iRight && iBelow && iLeft {
|
||||||
|
geoJsons[j].Geometry.Type = "Point"
|
||||||
|
geoJsons[j].Geometry.Coordinates = Point{
|
||||||
|
(areaJ[1][0] + areaJ[3][0]) / 2.0,
|
||||||
|
(areaJ[0][1] + areaJ[2][1]) / 2.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Println("COMPACTED", len(geoJsons))
|
||||||
|
b, _ := json.Marshal(map[string]any{
|
||||||
|
"features": geoJsons,
|
||||||
|
"type": "FeatureCollection",
|
||||||
|
})
|
||||||
|
fmt.Printf("%s\n", b)
|
||||||
|
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
type FlagStringArray []string
|
||||||
|
|
||||||
|
func (array *FlagStringArray) String() string {
|
||||||
|
return strings.Join(*array, ", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (array *FlagStringArray) Set(s string) error {
|
||||||
|
*array = append(*array, s)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type StringToFloat64 map[string]float64
|
||||||
|
|
||||||
|
func (array *StringToFloat64) String() string {
|
||||||
|
return fmt.Sprintf("%+v", (*map[string]float64)(array))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (array *StringToFloat64) Set(s string) error {
|
||||||
|
idx := strings.Index(s, "=")
|
||||||
|
if idx < 0 {
|
||||||
|
return fmt.Errorf("should be formatted as k=v")
|
||||||
|
}
|
||||||
|
k := s[:idx]
|
||||||
|
v := s[idx+1:]
|
||||||
|
var n float64
|
||||||
|
if err := json.Unmarshal([]byte(v), &n); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
(*array)[k] = n
|
||||||
|
return nil
|
||||||
|
}
|
||||||
18
go.mod
18
go.mod
@@ -2,10 +2,22 @@ module turbomaps-er
|
|||||||
|
|
||||||
go 1.24.2
|
go 1.24.2
|
||||||
|
|
||||||
require googlemaps.github.io/maps v1.7.0
|
require (
|
||||||
|
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1
|
||||||
|
googlemaps.github.io/maps v1.7.0
|
||||||
|
modernc.org/sqlite v1.46.1
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/google/uuid v1.1.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/ncruces/go-strftime v1.0.0 // indirect
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||||
go.opencensus.io v0.22.3 // indirect
|
go.opencensus.io v0.22.3 // indirect
|
||||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
|
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect
|
||||||
|
golang.org/x/sys v0.37.0 // indirect
|
||||||
|
modernc.org/libc v1.67.6 // indirect
|
||||||
|
modernc.org/mathutil v1.7.1 // indirect
|
||||||
|
modernc.org/memory v1.11.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
57
go.sum
57
go.sum
@@ -4,22 +4,36 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||||
|
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
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.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
|
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
|
||||||
|
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
|
||||||
|
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
|
||||||
|
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||||
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
||||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
@@ -30,9 +44,13 @@ go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
|||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY=
|
||||||
|
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
|
||||||
|
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
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-20180826012351-8a410e7b638d/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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -42,9 +60,14 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG
|
|||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
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-20181108010431-42b317875d0f/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-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||||
|
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190215142949-d0b11bdaac8a/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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||||
|
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/text v0.3.0/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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI=
|
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI=
|
||||||
@@ -53,6 +76,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
|
|||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/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-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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
|
||||||
|
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
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.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
@@ -68,3 +93,31 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis=
|
||||||
|
modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
|
||||||
|
modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc=
|
||||||
|
modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM=
|
||||||
|
modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA=
|
||||||
|
modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
|
||||||
|
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
|
||||||
|
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
|
||||||
|
modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE=
|
||||||
|
modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
|
||||||
|
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
|
||||||
|
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
|
||||||
|
modernc.org/libc v1.67.6 h1:eVOQvpModVLKOdT+LvBPjdQqfrZq+pC39BygcT+E7OI=
|
||||||
|
modernc.org/libc v1.67.6/go.mod h1:JAhxUVlolfYDErnwiqaLvUqc8nfb2r6S6slAgZOnaiE=
|
||||||
|
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
||||||
|
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
|
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
|
||||||
|
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
|
||||||
|
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
|
||||||
|
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
|
||||||
|
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
|
||||||
|
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
|
||||||
|
modernc.org/sqlite v1.46.1 h1:eFJ2ShBLIEnUWlLy12raN0Z1plqmFX9Qe3rjQTKt6sU=
|
||||||
|
modernc.org/sqlite v1.46.1/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA=
|
||||||
|
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
|
||||||
|
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
|
||||||
|
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
||||||
|
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
||||||
|
|||||||
16
mise.toml
16
mise.toml
@@ -1,2 +1,18 @@
|
|||||||
[env]
|
[env]
|
||||||
GOOGLE_PLACES_API_KEY = "AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg"
|
GOOGLE_PLACES_API_KEY = "AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg"
|
||||||
|
CATEGORIES = "schools,dump,prison,water treatment,police department,college,trailer park,coffee roaster,board game store,costco,organic grocery store"
|
||||||
|
|
||||||
|
[tasks.sammy]
|
||||||
|
run = "mise run search -- {sammamish,duvall,'cottage lake',issaquah,snohomish}', wa'"
|
||||||
|
|
||||||
|
[tasks.olympia]
|
||||||
|
run = "mise run search -- {olympia,lacey,tumwater}', wa'"
|
||||||
|
|
||||||
|
[tasks.bend]
|
||||||
|
run = "mise run search -- 'bend, or'"
|
||||||
|
|
||||||
|
[tasks.ridgefield]
|
||||||
|
run = "mise run search -- {ridgefield,vancouver,'mt vista','hazel dell',felida,'brush prarie','battle ground'}', or'"
|
||||||
|
|
||||||
|
[tasks.bellingham]
|
||||||
|
run = "mise run search -- {burlington,sedro-wooley,'mt vernon',bellingham,ferndale}', wa'"
|
||||||
|
|||||||
Reference in New Issue
Block a user